diff --git a/.DS_Store b/.DS_Store
index 37836ab..64a7d78 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index f4d8b2f..526a2ff 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -1117,6 +1117,7 @@ const b = {
}
},
missile(where, angle, speed, size = 1) {
+ if (tech.missileSize) size *= 1.5
const me = bullet.length;
bullet[me] = Bodies.rectangle(where.x, where.y, 30 * size, 4 * size, {
angle: angle,
@@ -1131,7 +1132,7 @@ const b = {
},
minDmgSpeed: 10,
lookFrequency: Math.floor(10 + Math.random() * 3),
- explodeRad: 180 + 60 * Math.random(),
+ explodeRad: 180 * (tech.missileSize ? 1.5 : 1) + 60 * Math.random(),
density: 0.02, //0.001 is normal
beforeDmg() {
Matter.Body.setDensity(this, 0.0001); //reduce density to normal
@@ -3106,7 +3107,7 @@ const b = {
restitution: 0.7,
dmg: 0, // 0.14 //damage done in addition to the damage from momentum
minDmgSpeed: 2,
- lookFrequency: 70,
+ lookFrequency: 27 + Math.ceil(6 * Math.random()),
cd: 0,
delay: 80,
range: 70 + 3 * b.totalBots(),
@@ -3135,7 +3136,25 @@ const b = {
// Matter.Body.setAngularVelocity(this, 0.025)
this.torque += this.inertia * 0.00004 * (Math.round(Math.random()) ? 1 : -1)
this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, mob[i].position)), this.mass * 0.02)
- b.missile(this.position, angle, -8, 0.7 * (tech.missileSize ? 1.5 : 1))
+
+ if (tech.missileCount > 1) {
+ const countReduction = Math.pow(0.93, tech.missileCount)
+ const size = 0.9 * Math.sqrt(countReduction)
+ const direction = {
+ x: Math.cos(angle),
+ y: Math.sin(angle)
+ }
+ const push = Vector.mult(Vector.perp(direction), 0.015 * countReduction / Math.sqrt(tech.missileCount))
+ for (let i = 0; i < tech.missileCount; i++) {
+ setTimeout(() => {
+ b.missile(this.position, angle, -8, size)
+ bullet[bullet.length - 1].force.x += push.x * (i - (tech.missileCount - 1) / 2);
+ bullet[bullet.length - 1].force.y += push.y * (i - (tech.missileCount - 1) / 2);
+ }, 40 * tech.missileCount * Math.random());
+ }
+ } else {
+ b.missile(this.position, angle, -8, 0.9)
+ }
break;
}
}
@@ -4466,7 +4485,7 @@ const b = {
x: m.pos.x,
y: m.pos.y - 40
}
- b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction))
+ b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction) * (tech.missileSize ? 1.5 : 1))
bullet[bullet.length - 1].force.x += 0.025 * countReduction * (i - (tech.missileCount - 1) / 2);
}, 20 * tech.missileCount * Math.random());
}
@@ -4846,7 +4865,7 @@ const b = {
name: "rail gun",
description: "use energy to launch a high-speed dense rod
hold left mouse to charge, release to fire",
ammo: 0,
- ammoPack: 5,
+ ammoPack: 4.1,
have: false,
do() {},
fire() {
@@ -4898,7 +4917,7 @@ const b = {
if (tech.isCapacitor) {
if ((m.energy > 0.16 || tech.isRailEnergyGain)) { //&& m.immuneCycle < m.cycle
- m.energy += 0.16 * (tech.isRailEnergyGain ? 4.5 : -1)
+ m.energy += 0.16 * (tech.isRailEnergyGain ? 2.5 : -1)
m.fireCDcycle = m.cycle + Math.floor(40 * b.fireCDscale);
const me = bullet.length;
bullet[me] = Bodies.rectangle(m.pos.x + 50 * Math.cos(m.angle), m.pos.y + 50 * Math.sin(m.angle), 60, 14, {
@@ -5070,13 +5089,9 @@ const b = {
m.fireCDcycle = Infinity //can't fire until mouse is released
const previousCharge = this.charge
- let smoothRate = (m.crouch ? 0.98 : 0.99) * (0.98 + 0.02 * b.fireCDscale) //small b.fireCDscale = faster shots, b.fireCDscale=1 = normal shot, big b.fireCDscale = slower chot
- this.charge = this.charge * smoothRate + 1 * (1 - smoothRate)
- if (tech.isRailEnergyGain) {
- m.energy += (this.charge - previousCharge) * 1.5 //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen
- } else {
- m.energy -= (this.charge - previousCharge) * 0.33 //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen
- }
+ let smoothRate = (m.crouch ? 0.98 : 0.985) * (0.98 + 0.02 * b.fireCDscale) //small b.fireCDscale = faster shots, b.fireCDscale=1 = normal shot, big b.fireCDscale = slower chot
+ this.charge = this.charge * smoothRate + 1 - smoothRate
+ m.energy -= (this.charge - previousCharge) * (tech.isRailEnergyGain ? 1 : 0.33) //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen
//draw targeting
let best;
let range = 3000
diff --git a/js/level.js b/js/level.js
index 8b20d91..bbb9477 100644
--- a/js/level.js
+++ b/js/level.js
@@ -18,10 +18,12 @@ const level = {
// tech.isFieldFree = true
// m.setField("time dilation")
// b.giveGuns("rail gun")
+ // tech.missileBotCount++;
+ // b.missileBot();
// tech.giveTech("half-wave rectifier")
- // b.giveGuns("wave beam")
+ // b.giveGuns("nail gun")
// tech.giveTech("Lenz's law")
- // for (let i = 0; i < 3; i++) tech.giveTech("packet length")
+ // for (let i = 0; i < 9; i++) tech.giveTech("MIRV")
// for (let i = 0; i < 4; i++) tech.giveTech()
level.intro(); //starting level
@@ -2286,8 +2288,8 @@ const level = {
// spawn.streamBoss(1600, -500)
// spawn.powerUpBoss(1600, -500)
// spawn.cellBossCulture(1600, -500)
- spawn.shieldingBoss(1600, -500)
- // spawn.grenadier(1200, -500)
+ // spawn.laserTargetingBoss(1600, -500)
+ spawn.grenadierBoss(1200, -500)
// spawn.shield(mob[mob.length - 1], 1800, -120, 1);
// spawn.nodeGroup(1200, -500, "grenadier")
diff --git a/js/mob.js b/js/mob.js
index 0e77675..079107d 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -1041,10 +1041,11 @@ const mobs = {
if (tech.isFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500
// if (this.shield) dmg *= 0.075
// if (this.isBoss) dmg *= 0.25
- if (this.damageReduction < 1) { //only used for bosses with this.armor() or shields
- this.damageReductionGoal += dmg * this.damageReductionScale //reduce damageReductionGoal
- dmg *= this.damageReduction
- }
+ // if (this.damageReduction < 1) { //only used for bosses with this.armor() or shields
+ // this.damageReductionGoal += dmg * this.damageReductionScale //reduce damageReductionGoal
+ // dmg *= this.damageReduction
+ // }
+ dmg *= this.damageReduction
//energy and heal drain should be calculated after damage boosts
if (tech.energySiphon && dmg !== Infinity && this.isDropPowerUp && m.immuneCycle < m.cycle) m.energy += Math.min(this.health, dmg) * tech.energySiphon
if (tech.healthDrain && dmg !== Infinity && this.isDropPowerUp) {
@@ -1069,19 +1070,32 @@ const mobs = {
// to use declare custom method in mob spawn
},
damageReduction: 1,
- damageReductionGoal: 0.001, //must add this to boss set up: me.damageReduction = me.damageReductionGoal
- damageReductionScale: 0.004, //for bosses in this.onDamage determines the impact of dmg on damageReductionGoal
- armor() { //slowly reduce damage reduction, for bosses
- if (this.seePlayer.recall) {
- if (this.damageReductionGoal > 0.24) {
- this.damageReductionGoal = 0.25
- } else {
- this.damageReductionGoal = this.damageReductionGoal * 0.999 + 0.001 * 0.25 //smooth the goal towards 0.25 damage reduction
- }
- this.damageReduction = this.damageReduction * 0.995 + 0.005 * this.damageReductionGoal //smooth damage reduction towards the goal
- // console.log(`damageReduction = ${this.damageReduction.toFixed(4)}`, `damageReductionGoal = ${this.damageReductionGoal.toFixed(4)}`)
- }
- },
+ // damageReductionGoal: 0.001, //must add this to boss set up: me.damageReduction = 0.25
+ // damageReductionScale: 0.004, //for bosses in this.onDamage determines the impact of dmg on damageReductionGoal
+ // armor() { //slowly reduce damage reduction, for bosses
+ // if (this.seePlayer.recall) {
+ // if (this.damageReductionGoal > 0.24) {
+ // this.damageReductionGoal = 0.25
+ // } else {
+ // this.damageReductionGoal = this.damageReductionGoal * 0.999 + 0.001 * 0.25 //smooth the goal towards 0.25 damage reduction
+ // }
+ // this.damageReduction = this.damageReduction * 0.995 + 0.005 * this.damageReductionGoal //smooth damage reduction towards the goal
+ // // console.log(`damageReduction = ${this.damageReduction.toFixed(4)}`, `damageReductionGoal = ${this.damageReductionGoal.toFixed(4)}`)
+ // }
+ // //draw armor
+ // //draw body
+ // ctx.beginPath();
+ // const vertices = this.vertices;
+ // ctx.moveTo(vertices[0].x, vertices[0].y);
+ // for (let j = 1, len = vertices.length; j < len; ++j) {
+ // ctx.lineTo(vertices[j].x, vertices[j].y);
+ // }
+ // ctx.lineTo(vertices[0].x, vertices[0].y);
+ // console.log(this.damageReduction, this.damageReductionGoal)
+ // ctx.lineWidth = 3 //60 * (0.25 - this.damageReductionGoal)
+ // ctx.strokeStyle = `rgba(255,255,255,${4.1*(0.25 - this.damageReductionGoal)})` //"rgba(150,150,225,0.5)";
+ // ctx.stroke();
+ // },
leaveBody: true,
isDropPowerUp: true,
death() {
diff --git a/js/player.js b/js/player.js
index 4422a9c..92491bb 100644
--- a/js/player.js
+++ b/js/player.js
@@ -1123,7 +1123,7 @@ const m = {
m.fieldCDcycle = m.cycle + 15;
m.isHolding = false;
- if (tech.isBlockExplosion && m.throwCharge > 5) { //remove the block body and pulse in the direction you are facing
+ if (tech.isTokamak && m.throwCharge > 5) { //remove the block body and pulse in the direction you are facing
//m.throwCharge > 5 seems to be when the field full colors in a block you are holding
m.throwCharge = 0;
m.throwCycle = m.cycle + 180 //used to detect if a block was thrown in the last 3 seconds
diff --git a/js/spawn.js b/js/spawn.js
index 60e75fc..dba630d 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -754,9 +754,9 @@ const spawn = {
me.onDamage = function(dmg) {
if (Math.random() < 0.33 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split();
}
- me.damageReduction = 0.25
+ me.damageReduction = 0.2 //me.damageReductionGoal
me.do = function() {
- // this.armor();
+ // // this.armor();
if (!m.isBodiesAsleep) {
this.seePlayerByDistOrLOS();
this.checkStatus();
@@ -1488,12 +1488,12 @@ const spawn = {
let targets = [] //track who is in the node boss, for shields
mobs.spawn(x, y, 6, radius, "#b386e8");
let me = mob[mob.length - 1];
- Matter.Body.setDensity(me, 0.0035); //extra dense //normal is 0.001 //makes effective life much larger
+ Matter.Body.setDensity(me, 0.0032); //extra dense //normal is 0.001 //makes effective life much larger
me.isBoss = true;
targets.push(me.id) //add to shield protection
me.friction = 0;
- me.frictionAir = 0.0065;
+ me.frictionAir = 0.0067;
me.lookTorque = 0.0000008; //controls spin while looking for player
me.g = 0.0002; //required if using 'gravity'
me.seePlayerFreq = Math.round((30 + 20 * Math.random()) * simulation.lookFreqScale);
@@ -1679,7 +1679,7 @@ const spawn = {
}
mobs.spawn(x, y, 0, radius, "transparent");
let me = mob[mob.length - 1];
- Matter.Body.setDensity(me, 0.20); //extra dense //normal is 0.001
+ Matter.Body.setDensity(me, 0.21); //extra dense //normal is 0.001
me.laserRange = 300;
me.seeAtDistance2 = 2000000;
me.isBoss = true;
@@ -1693,7 +1693,7 @@ const spawn = {
me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
};
- me.damageReduction = 0.25
+ me.damageReduction = 0.25 // me.damageReductionGoal
me.awake = function() {
// this.armor();
this.checkStatus();
@@ -3138,7 +3138,7 @@ const spawn = {
}
};
},
- launcherBoss(x, y, radius = 85) {
+ launcherBoss(x, y, radius = 90) {
mobs.spawn(x, y, 6, radius, "rgb(150,150,255)");
let me = mob[mob.length - 1];
me.isBoss = true;
@@ -3153,7 +3153,7 @@ const spawn = {
spawn.shield(me, x, y, 1);
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
- Matter.Body.setDensity(me, 0.002 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
+ Matter.Body.setDensity(me, 0.0022 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
// this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed
@@ -3925,7 +3925,7 @@ const spawn = {
let me = mob[mob.length - 1];
me.isBoss = true;
- Matter.Body.setDensity(me, 0.002 + 0.00025 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
+ Matter.Body.setDensity(me, 0.0017 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.stroke = "transparent"; //used for drawGhost
me.seeAtDistance2 = 2000000;
diff --git a/js/tech.js b/js/tech.js
index 73ab11d..08b993a 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -162,6 +162,9 @@
return b.inventory.length > 0 && b.guns[b.activeGun].name === name
}
},
+ hasExplosiveDamageCheck() {
+ return tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount > 0 || tech.boomBotCount > 1 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)
+ },
damageFromTech() {
let dmg = 1 //m.fieldDamage
if (tech.isCloakingDamage) dmg *= 1.35
@@ -658,24 +661,7 @@
b.setFireCD();
}
},
- // if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ...
- // {
- // name: "1-body problem",
- // description: "if there is exactly 1 active bullet
increase damage by 100%",
- // maxCount: 1,
- // count: 0,
- // frequency: 2,
- // allowed() {
- // return !tech.foamBotCount && !tech.nailBotCount && m.fieldUpgrades[m.fieldMode].name !== "nano-scale manufacturing" && ((tech.haveGunCheck("missiles") && tech.missileCount === 1) || tech.haveGunCheck("rail gun") || tech.haveGunCheck("grenades") || tech.isRivets || tech.isSlugShot || tech.oneSuperBall)
- // },
- // requires: "missiles, rail gun, grenades, rivets, slugs, super ball, no foam/nail bots, nano-scale",
- // effect() {
- // tech.isOneBullet = true
- // },
- // remove() {
- // tech.isOneBullet = false
- // }
- // },
+
{
name: "fracture analysis",
description: "bullet impacts do 400% damage
to stunned mobs",
@@ -775,7 +761,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return !tech.isBlockExplode && tech.explosiveRadius === 1 && !tech.isSmallExplosion && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion)
+ return tech.explosiveRadius === 1 && !tech.isSmallExplosion && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isTokamak)
},
requires: "an explosive damage source, not ammonium nitrate or nitroglycerin",
effect: () => {
@@ -793,7 +779,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion)
+ return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
},
requires: "an explosive damage source, not iridium-192",
effect: () => {
@@ -811,7 +797,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion)
+ return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
},
requires: "an explosive damage source, not iridium-192",
effect: () => {
@@ -829,9 +815,9 @@
frequency: 2,
isBadRandomOption: true,
allowed() {
- return !tech.isRewindGrenade && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.isBlockExplosion)
+ return tech.hasExplosiveDamageCheck()
},
- requires: "an explosive damage source, not causality bombs",
+ requires: "an explosive damage source",
effect: () => {
tech.isExplosionHarm = true;
},
@@ -848,7 +834,7 @@
frequency: 1,
frequencyDefault: 1,
allowed() {
- return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion)
+ return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
},
requires: "an explosive damage source, not iridium-192",
effect() {
@@ -867,7 +853,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isMissileField || tech.isExplodeMob || tech.isPulseLaser || tech.isBlockExplosion)
+ return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
},
requires: "an explosive damage source, not iridium-192",
effect: () => {
@@ -903,7 +889,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.haveGunCheck("rail gun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1
+ return (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.missileBotCount || tech.haveGunCheck("rail gun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1
},
requires: "grenades, missiles, rail gun, shotgun slugs, or mass driver",
effect() {
@@ -915,15 +901,15 @@
},
{
name: "thermal runaway",
- description: "mobs explode when they die
be careful",
+ description: "mobs explode when they die",
maxCount: 1,
count: 0,
- frequency: 2,
- frequencyDefault: 2,
+ frequency: 1,
+ frequencyDefault: 1,
allowed() {
- return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
+ return !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
- requires: "an explosive damage source, no other mob death tech",
+ requires: "no other mob death tech",
effect: () => {
tech.isExplodeMob = true;
},
@@ -936,8 +922,8 @@
description: "mobs release a nail when they die
nails target nearby mobs",
maxCount: 9,
count: 0,
- frequency: 2,
- frequencyDefault: 2,
+ frequency: 1,
+ frequencyDefault: 1,
allowed() {
return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
@@ -954,8 +940,8 @@
description: "mobs produce spores when they die
11% chance",
maxCount: 9,
count: 0,
- frequency: 2,
- frequencyDefault: 2,
+ frequency: 1,
+ frequencyDefault: 1,
allowed() {
return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
@@ -978,8 +964,8 @@
description: "mobs spawn with 11% less health",
maxCount: 3,
count: 0,
- frequency: 2,
- frequencyDefault: 2,
+ frequency: 1,
+ frequencyDefault: 1,
allowed() {
return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling || tech.iceIXOnDeath
},
@@ -1586,7 +1572,7 @@
frequency: 3,
frequencyDefault: 3,
allowed() {
- return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isBlockExplosion
+ return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isTokamak
},
requires: "mass driver, not pilot wave not tokamak",
effect() {
@@ -1604,7 +1590,7 @@
frequency: 3,
frequencyDefault: 3,
allowed() {
- return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isBlockExplosion
+ return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isTokamak
},
requires: "mass driver, not pilot wave not tokamak",
effect() {
@@ -1640,7 +1626,7 @@
// frequency: 2,
// frequencyDefault: 2,
// allowed() {
- // return (tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isBlockExplosion
+ // return (tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isTokamak
// },
// requires: "mass driver or pilot wave, not tokamak",
// effect() {
@@ -1676,7 +1662,7 @@
frequency: 3,
frequencyDefault: 3,
allowed() {
- return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isBlockExplosion
+ return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isTokamak
},
requires: "mass driver, not pilot wave not tokamak",
effect() {
@@ -2158,7 +2144,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isBlockExplosion) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth
+ return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isTokamak) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth
},
requires: "a way to regen extra energy, not time crystals",
effect: () => {
@@ -2387,7 +2373,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isRailEnergyGain || tech.isWormholeEnergy || tech.iceEnergy > 0 || tech.isMassEnergy || tech.isBlockExplosion
+ return tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isRailEnergyGain || tech.isWormholeEnergy || tech.iceEnergy > 0 || tech.isMassEnergy || tech.isTokamak
},
requires: "a source of overfilled energy",
effect() {
@@ -4240,7 +4226,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("missiles") || tech.isMissileField
+ return tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount
},
requires: "missiles",
effect() {
@@ -4259,7 +4245,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("missiles")
+ return tech.haveGunCheck("missiles") || tech.missileBotCount
},
requires: "missiles",
effect() {
@@ -4271,12 +4257,12 @@
},
{
name: "missile-bot",
- description: "a bot fires missiles at far away mobs",
+ description: "remove your missile gun
gain a bot that fires missiles at mobs",
isGunTech: true,
maxCount: 1,
count: 0,
- frequency: 2,
- frequencyDefault: 2,
+ frequency: 3,
+ frequencyDefault: 3,
isBot: true,
isBotTech: true,
allowed() {
@@ -4286,11 +4272,15 @@
effect() {
tech.missileBotCount++;
b.missileBot();
+ if (tech.haveGunCheck("missiles")) b.removeGun("missiles") //remove your last gun
},
remove() {
- tech.missileBotCount = 0;
- b.clearPermanentBots();
- b.respawnBots();
+ if (this.count) {
+ tech.missileBotCount = 0;
+ b.clearPermanentBots();
+ b.respawnBots();
+ if (!tech.haveGunCheck("missiles")) b.giveGuns("missiles")
+ }
}
},
{
@@ -5726,10 +5716,10 @@
},
requires: "plasma torch",
effect() {
- tech.isBlockExplosion = true;
+ tech.isTokamak = true;
},
remove() {
- tech.isBlockExplosion = false;
+ tech.isTokamak = false;
}
},
{
@@ -7773,7 +7763,7 @@
isFallingDamage: null,
harmonics: null,
isStandingWaveExpand: null,
- isBlockExplosion: null,
+ isTokamak: null,
superBallDelay: null,
isBlockExplode: null,
isOverHeal: null,
diff --git a/todo.txt b/todo.txt
index fa3ffa2..536361f 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,19 +1,11 @@
******************************************************** NEXT PATCH ********************************************************
-Matter.World has been replaced with Matter.Composite
- matter.js deprecated World
- could cause problems merging your old code
- (replace World with Composite in your code)
+missile-bot tech now removes your missile gun, but missile bot fires much faster
+ missile-bot now benefits from all missile tech
-tech: many worlds - now costs 1 research at the start of each level to activate
- a nerf, but also a buff because if you like a build you can freeze it by not getting research
-
-mine gun has 25% less ammo and 33% more damage
-
-railgun now gets 50% more ammo, but it fires slower
-fixed rail gun ammo drain on misfire bug
-
-fixed experiment gun display bug
+rail gun has a bit less ammo and fires a bit faster
+ in between how it is was in the last two patches
+rail gun gets less energy from half-wave rectifier
******************************************************** TODO ********************************************************
@@ -48,6 +40,7 @@ make non moving bosses not move after getting hit
shooter, shielding,
buff missiles?
+ do more with the missile bot
maybe they can release grenades after they explode, like CPT grenades?
make the crouch rapid fire a tech, and make the missiles fire faster, and use less ammo?
buff railgun