From c3b96f749ea3ba9a9d69b5099be14fbc9ac16e9b Mon Sep 17 00:00:00 2001 From: landgreen Date: Sat, 7 Aug 2021 06:42:48 -0700 Subject: [PATCH] missile-bot missile-bot tech now removes your missile gun, but missile bot fires much faster missile-bot now benefits from all missile tech 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 --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 41 ++++++++++++++------- js/level.js | 10 +++--- js/mob.js | 48 ++++++++++++++++--------- js/player.js | 2 +- js/spawn.js | 18 +++++----- js/tech.js | 98 +++++++++++++++++++++++---------------------------- todo.txt | 19 ++++------ 8 files changed, 125 insertions(+), 111 deletions(-) diff --git a/.DS_Store b/.DS_Store index 37836ab4f399e86b99e09fb0bbbcb611eba22edc..64a7d78d6ac70fb098fbd9d3d693511873ca62ea 100644 GIT binary patch delta 22 dcmZoMXffEJ#muz#&SV{CUnZ#uo2!{SMF3cn2WkKS delta 22 dcmZoMXffEJ#muzl$7CI5UnXgX&DG4EA^=zz2Q~lz 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