From d50cd540fa3444659321c40a351e236cea5eecd6 Mon Sep 17 00:00:00 2001 From: landgreen Date: Fri, 16 Jul 2021 07:06:05 -0700 Subject: [PATCH] worms spore tech - nematodes - replace spores with 1/2 as many worms that do 200% more damage worms are also a bit faster, last longer, have better reaction times a cool worm graphic, and a simple searching behavior if they haven't found a mob mycelial fragmentation - makes 6 extra spores during growth phase (was 4) historyBoss has less health, slower tracking, and more damage --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 131 +++++++++++++++++++++++++++++++++++++++++++++------ js/engine.js | 1 - js/level.js | 23 ++++----- js/mob.js | 9 +++- js/player.js | 32 +++++++++---- js/spawn.js | 11 +++-- js/tech.js | 86 +++++++++++++++++++++++---------- todo.txt | 14 +++--- 9 files changed, 234 insertions(+), 73 deletions(-) diff --git a/.DS_Store b/.DS_Store index 54ebfd6c5f025048cb8ca03733d81ba9bb3a2635..a2b006e35102ec9208e86a157d9d971a2a0f74c4 100644 GIT binary patch delta 21 ccmZoMXffEJ#mw~DX0i^mALED3)y$nD08j!4J^%m! delta 21 ccmZoMXffEJ#mscFd9n_(A7jAgYUWN608QKm!vFvP diff --git a/js/bullet.js b/js/bullet.js index 88b11fc..6ff89a6 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1830,10 +1830,106 @@ const b = { Matter.Body.setVelocity(bullet[bIndex], velocity); World.add(engine.world, bullet[bIndex]); //add bullet to world }, + worm(where, isFreeze = tech.isSporeFreeze) { //used with the tech upgrade in mob.death() + const bIndex = bullet.length; + const size = 3 + if (bIndex < 500) { //can't make over 500 spores + bullet[bIndex] = Bodies.polygon(where.x, where.y, size, size, { + inertia: Infinity, + isFreeze: isFreeze, + restitution: 0.5, + // angle: Math.random() * 2 * Math.PI, + friction: 0, + frictionAir: 0.025, + thrust: (tech.isFastSpores ? 0.001 : 0.0005) * (1 + 0.5 * (Math.random() - 0.5)), + dmg: (tech.isMutualism ? 16.8 : 7) * 3, //bonus damage from tech.isMutualism //3 is extra damage as worm + lookFrequency: 100 + Math.floor(37 * Math.random()), + classType: "bullet", + collisionFilter: { + category: cat.bullet, + mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body + }, + endCycle: simulation.cycle + Math.floor((600 + Math.floor(Math.random() * 420)) * tech.isBulletsLastLonger), + minDmgSpeed: 0, + playerOffPosition: { //used when moving towards player to keep spores separate + x: 100 * (Math.random() - 0.5), + y: 100 * (Math.random() - 0.5) + }, + beforeDmg(who) { + this.endCycle = 0; //bullet ends cycle after doing damage + if (this.isFreeze) mobs.statusSlow(who, 90) + }, + onEnd() { + if (tech.isMutualism && this.isMutualismActive && !tech.isEnergyHealth) { + m.health += 0.005 + if (m.health > m.maxHealth) m.health = m.maxHealth; + m.displayHealth(); + } + }, + do() { + ctx.beginPath(); //draw nematode + ctx.moveTo(this.position.x, this.position.y); + const dir = Vector.mult(Vector.normalise(this.velocity), -Math.min(80, 7 * this.speed)) + const tail = Vector.add(this.position, dir) + ctx.lineTo(tail.x, tail.y); + ctx.lineWidth = 6; + ctx.strokeStyle = "#000"; + ctx.stroke(); + + if (this.lockedOn && this.lockedOn.alive) { + this.force = Vector.mult(Vector.normalise(Vector.sub(this.lockedOn.position, this.position)), this.mass * this.thrust) + } else { + if (!(simulation.cycle % this.lookFrequency)) { //find mob targets + this.closestTarget = null; + this.lockedOn = null; + let closeDist = Infinity; + for (let i = 0, len = mob.length; i < len; ++i) { + if (!mob[i].isBadTarget && Matter.Query.ray(map, this.position, mob[i].position).length === 0) { + const targetVector = Vector.sub(this.position, mob[i].position) + const dist = Vector.magnitude(targetVector) * (Math.random() + 0.5); + if (dist < closeDist) { + this.closestTarget = mob[i].position; + closeDist = dist; + this.lockedOn = mob[i] + if (0.3 > Math.random()) break //doesn't always target the closest mob + } + } + } + } + if (tech.isSporeFollow && this.lockedOn === null) { //move towards player //checking for null means that the spores don't go after the player until it has looked and not found a target + const dx = this.position.x - m.pos.x; + const dy = this.position.y - m.pos.y; + if (dx * dx + dy * dy > 10000) { + this.force = Vector.mult(Vector.normalise(Vector.sub(m.pos, Vector.add(this.playerOffPosition, this.position))), this.mass * this.thrust) + } + } else { + const unit = Vector.normalise(this.velocity) + const force = Vector.mult(Vector.rotate(unit, 0.005 * this.playerOffPosition.x), 0.000003) + this.force.x += force.x + this.force.y += force.y + } + } + }, + }); + const SPEED = 2 + 1 * Math.random(); + const ANGLE = 2 * Math.PI * Math.random() + Matter.Body.setVelocity(bullet[bIndex], { + x: SPEED * Math.cos(ANGLE), + y: SPEED * Math.sin(ANGLE) + }); + World.add(engine.world, bullet[bIndex]); //add bullet to world + if (tech.isMutualism && m.health > 0.02) { + m.health -= 0.005 + m.displayHealth(); + bullet[bIndex].isMutualismActive = true + } + } + }, spore(where, isFreeze = tech.isSporeFreeze) { //used with the tech upgrade in mob.death() const bIndex = bullet.length; + const size = 4 if (bIndex < 500) { //can't make over 500 spores - bullet[bIndex] = Bodies.polygon(where.x, where.y, 4, 4, { + bullet[bIndex] = Bodies.polygon(where.x, where.y, size, size, { // density: 0.0015, //frictionAir: 0.01, inertia: Infinity, isFreeze: isFreeze, @@ -2055,7 +2151,7 @@ const b = { beforeDmg(who) { if (tech.isIncendiary && simulation.cycle + this.deathCycles < this.endCycle) { const max = Math.max(Math.min(this.endCycle - simulation.cycle - this.deathCycles, 1500), 0) - b.explosion(this.position, max * 0.08 + this.isImproved * 100 + 60 * Math.random()); //makes bullet do explosive damage at end + b.explosion(this.position, max * 0.09 + this.isImproved * 100 + 60 * Math.random()); //makes bullet do explosive damage at end this.endCycle -= max } else { //move away from target after hitting @@ -3749,7 +3845,7 @@ const b = { if (tech.isIncendiary) { bullet[me].endCycle = simulation.cycle + 60 bullet[me].onEnd = function() { - b.explosion(this.position, 300 + (Math.random() - 0.5) * 60); //makes bullet do explosive damage at end + b.explosion(this.position, 320 + (Math.random() - 0.5) * 60); //makes bullet do explosive damage at end } bullet[me].beforeDmg = function() { this.endCycle = 0; //bullet ends cycle after hitting a mob and triggers explosion @@ -3804,7 +3900,7 @@ const b = { y: speed * Math.sin(dirOff) }); bullet[me].onEnd = function() { - b.explosion(this.position, 135 * (tech.isShotgunReversed ? 1.6 : 1) + (Math.random() - 0.5) * 40); //makes bullet do explosive damage at end + b.explosion(this.position, 150 * (tech.isShotgunReversed ? 1.6 : 1) + (Math.random() - 0.5) * 40); //makes bullet do explosive damage at end } bullet[me].beforeDmg = function() { this.endCycle = 0; //bullet ends cycle after hitting a mob and triggers explosion @@ -3898,7 +3994,7 @@ const b = { bullet[me].beforeDmg = function(who) { mobs.statusStun(who, 180) // (2.3) * 2 / 14 ticks (2x damage over 7 seconds) if (tech.isIncendiary) { - b.explosion(this.position, this.mass * 285); //makes bullet do explosive damage at end + b.explosion(this.position, this.mass * 300); //makes bullet do explosive damage at end this.endCycle = 0 } }; @@ -3926,7 +4022,7 @@ const b = { }; bullet[me].beforeDmg = function() { if (tech.isIncendiary) { - b.explosion(this.position, this.mass * 350 + 60 * Math.random()); //makes bullet do explosive damage at end + b.explosion(this.position, this.mass * 355 + 70 * Math.random()); //makes bullet do explosive damage at end this.endCycle = 0 } }; @@ -3958,7 +4054,7 @@ const b = { }; bullet[me].beforeDmg = function() { if (tech.isIncendiary) { - b.explosion(this.position, this.mass * 350 + 60 * Math.random()); //makes bullet do explosive damage at end + b.explosion(this.position, this.mass * 355 + 70 * Math.random()); //makes bullet do explosive damage at end this.endCycle = 0 } }; @@ -4466,7 +4562,7 @@ const b = { bullet[me].maxRadius = 30; bullet[me].restitution = 0.3; bullet[me].minDmgSpeed = 0; - bullet[me].totalSpores = 8 + 2 * tech.isFastSpores + 2 * tech.isSporeFreeze + bullet[me].totalSpores = 8 + 2 * tech.isFastSpores + 2 * tech.isSporeFreeze * (tech.isSporeWorm ? 0.5 : 1) bullet[me].stuck = function() {}; bullet[me].beforeDmg = function() {}; bullet[me].do = function() { @@ -4544,11 +4640,15 @@ const b = { this.stuck(); //runs different code based on what the bullet is stuck to if (!m.isBodiesAsleep) { let scale = 1.01 - if (tech.isSporeGrowth && !(simulation.cycle % 60)) { //release a spore - b.spore(this.position) + if (tech.isSporeGrowth && !(simulation.cycle % 40)) { //release a spore + if (tech.isSporeWorm) { + if (!(simulation.cycle % 80)) b.worm(this.position) + } else { + b.spore(this.position) + } // this.totalSpores-- - scale = 0.94 - if (this.stuckTo && this.stuckTo.alive) scale = 0.88 + scale = 0.96 + if (this.stuckTo && this.stuckTo.alive) scale = 0.9 Matter.Body.scale(this, scale, scale); this.radius *= scale } else { @@ -4570,9 +4670,10 @@ const b = { //spawn bullets on end bullet[me].onEnd = function() { - const NUM = this.totalSpores - for (let i = 0; i < NUM; i++) { - b.spore(this.position) + if (tech.isSporeWorm) { + for (let i = 0, len = this.totalSpores * 0.5; i < len; i++) b.worm(this.position) + } else { + for (let i = 0; i < this.totalSpores; i++) b.spore(this.position) } } } diff --git a/js/engine.js b/js/engine.js index cd01a77..03c816d 100644 --- a/js/engine.js +++ b/js/engine.js @@ -176,7 +176,6 @@ function collisionChecks(event) { if (obj.classType === "bullet" && obj.speed > obj.minDmgSpeed) { obj.beforeDmg(mob[k]); //some bullets do actions when they hits things, like despawn //forces don't seem to work here let dmg = b.dmgScale * (obj.dmg + 0.15 * obj.mass * Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity))) - console.log(dmg) if (tech.isCrit && mob[k].isStunned) dmg *= 4 mob[k].foundPlayer(); mob[k].damage(dmg); diff --git a/js/level.js b/js/level.js index dc180e3..ecfaf3d 100644 --- a/js/level.js +++ b/js/level.js @@ -15,13 +15,14 @@ const level = { // level.difficultyIncrease(30) // simulation.isHorizontalFlipped = true // m.setField("wormhole") - // b.giveGuns("drones") + // b.giveGuns("spores") + // tech.isSporeWorm = true + // tech.giveTech("tinsellated flagella") // tech.giveTech("torque bursts") // b.giveGuns("wave beam") // tech.giveTech("phonon") // tech.giveTech("bound state") // tech.giveTech("bound state") - // tech.giveTech("bound state") // tech.giveTech("isotropic radiator") // for (let i = 0; i < 9; i++) tech.giveTech("spherical harmonics") // for (let i = 0; i < 3; i++) tech.giveTech("packet length") @@ -2253,7 +2254,7 @@ const level = { spawn.mapRect(6700, -1800, 800, 2600); //right wall spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump - // spawn.starter(1900, -500, 200) //big boy + spawn.starter(1900, -500, 200) //big boy // spawn.pulsarBoss(1900, -500) // spawn.shieldingBoss(1900, -500) // spawn.grenadierBoss(1900, -500) @@ -2269,7 +2270,7 @@ const level = { // spawn.orbitalBoss(1600, -500) // spawn.cellBossCulture(1600, -500) // spawn.shieldingBoss(1600, -500) - spawn.grenadier(1200, -500) + // spawn.grenadier(1200, -500) // spawn.shield(mob[mob.length - 1], 1800, -120, 1); // spawn.nodeGroup(1200, -500, "grenadier") @@ -6313,15 +6314,21 @@ const level = { // spawn.randomGroup(7700, -1100, 0.5); spawn.randomGroup(9800, -1100, 0.5); - if (simulation.difficulty > 10) spawn.randomLevelBoss(8600, -600, ["powerUpBoss", "bomberBoss", "snakeBoss", "spiderBoss", "historyBoss"]) + if (simulation.difficulty > 3) spawn.randomLevelBoss(8600, -600, ["powerUpBoss", "bomberBoss", "snakeBoss", "spiderBoss", "historyBoss"]) spawn.secondaryBossChance(7900, -400) //Boss Spawning if (simulation.difficulty > 10) { spawn.pulsarBoss(-400, -200); + powerUps.chooseRandomPowerUp(4006, 400); + powerUps.chooseRandomPowerUp(4407, 400); + powerUps.spawnStartingPowerUps(4400, 400); if (simulation.difficulty > 30) { + powerUps.chooseRandomPowerUp(4002, 400); + powerUps.chooseRandomPowerUp(4004, 400); spawn.pulsarBoss(3600, -400); if (simulation.difficulty > 60) { + powerUps.chooseRandomPowerUp(4409, 400); spawn.pulsarBoss(4200, 1000); if (simulation.difficulty > 80) { spawn.pulsarBoss(5800, -1200); @@ -6338,12 +6345,6 @@ const level = { //Powerup Spawning powerUps.spawnStartingPowerUps(4000, 400); - powerUps.spawnStartingPowerUps(4400, 400); - powerUps.chooseRandomPowerUp(4002, 400); - powerUps.chooseRandomPowerUp(4004, 400); - powerUps.chooseRandomPowerUp(4006, 400); - powerUps.chooseRandomPowerUp(4407, 400); - powerUps.chooseRandomPowerUp(4409, 400); powerUps.addResearchToLevel(); //needs to run after mobs are spawned //Block Spawning diff --git a/js/mob.js b/js/mob.js index 195f36a..1a81bf8 100644 --- a/js/mob.js +++ b/js/mob.js @@ -1066,8 +1066,13 @@ const mobs = { powerUps.spawnRandomPowerUp(this.position.x, this.position.y); m.lastKillCycle = m.cycle; //tracks the last time a kill was made, mostly used in simulation.checks() if (Math.random() < tech.sporesOnDeath) { - const len = Math.min(25, Math.floor(2 + this.mass * (0.5 + 0.5 * Math.random()))) - for (let i = 0; i < len; i++) b.spore(this.position) + if (tech.isSporeWorm) { + const len = Math.min(25, Math.floor(2 + this.mass * (0.5 + 0.5 * Math.random()))) / 2 + for (let i = 0; i < len; i++) b.worm(this.position) + } else { + const len = Math.min(25, Math.floor(2 + this.mass * (0.5 + 0.5 * Math.random()))) + for (let i = 0; i < len; i++) b.spore(this.position) + } } else if (tech.isExplodeMob) { b.explosion(this.position, Math.min(600, Math.sqrt(this.mass + 1.5) * (22 + 60 * Math.random()))) } else if (tech.nailsDeathMob) { diff --git a/js/player.js b/js/player.js index 9bf1480..d4ad8c1 100644 --- a/js/player.js +++ b/js/player.js @@ -1814,15 +1814,29 @@ const m = { m.hold = function() { if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 150 && (m.cycle % 2)) { if (tech.isSporeField) { - for (let i = 0, len = Math.random() * 20; i < len; i++) { - m.energy -= 0.08 - if (m.energy > 0) { - b.spore(m.pos) - } else { - m.energy = 0.001 - break; + if (tech.isSporeWorm) { + for (let i = 0, len = Math.random() * 20; i < len; i++) { + m.energy -= 0.15 + if (m.energy > 0) { + b.worm(m.pos) + } else { + m.energy = 0.001 + break; + } + } + } else { + for (let i = 0, len = Math.random() * 20; i < len; i++) { + m.energy -= 0.08 + if (m.energy > 0) { + b.spore(m.pos) + } else { + m.energy = 0.001 + break; + } } } + + } else if (tech.isMissileField) { m.energy -= 0.3; b.missile({ x: m.pos.x, y: m.pos.y - 40 }, -Math.PI / 2 + 0.5 * (Math.random() - 0.5), 0, 1) @@ -2588,7 +2602,7 @@ const m = { m.fieldRange *= 0.8 if (tech.isWormholeEnergy) m.energy += 0.63 if (tech.isWormSpores) { //pandimensionalspermia - for (let i = 0, len = Math.ceil(3 * Math.random()); i < len; i++) { + for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) { b.spore(Vector.add(m.hole.pos2, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 @@ -2614,7 +2628,7 @@ const m = { // if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2 if (tech.isWormholeEnergy) m.energy += 0.63 if (tech.isWormSpores) { //pandimensionalspermia - for (let i = 0, len = Math.ceil(3 * Math.random()); i < len; i++) { + for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) { b.spore(Vector.add(m.hole.pos1, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 diff --git a/js/spawn.js b/js/spawn.js index 3fa8e59..c2d3660 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -1582,7 +1582,7 @@ const spawn = { } mobs.spawn(x, y, 0, radius, "transparent"); let me = mob[mob.length - 1]; - Matter.Body.setDensity(me, 0.25); //extra dense //normal is 0.001 + Matter.Body.setDensity(me, 0.20); //extra dense //normal is 0.001 me.laserRange = 300; me.seeAtDistance2 = 2000000; me.isBoss = true; @@ -1621,8 +1621,11 @@ const spawn = { ctx.setLineDash([125 * Math.random(), 125 * Math.random()]); //the dashed effect is not set back to normal, because it looks neat for how the player is drawn // ctx.lineDashOffset = 6*(simulation.cycle % 215); if (this.distanceToPlayer() < this.laserRange) { - if (m.energy > 0.002) m.energy -= 0.0035 - if (m.immuneCycle < m.cycle) m.damage(0.00025 * simulation.dmgScale); + if (m.energy > 0.002) { + m.energy -= 0.0035 + } else if (m.immuneCycle < m.cycle) { + m.damage(0.0003 * simulation.dmgScale) + } ctx.beginPath(); ctx.moveTo(eye.x, eye.y); ctx.lineTo(m.pos.x, m.pos.y); @@ -1659,7 +1662,7 @@ const spawn = { // ctx.fillStyle = "rgba(150,0,255,0.03)"; // ctx.fill(); if (!m.isBodiesAsleep && !this.isStunned && !this.isSlowed) { - if (this.followDelay > this.delayLimit) this.followDelay -= 0.3; + if (this.followDelay > this.delayLimit) this.followDelay -= 0.2; let history = m.history[(m.cycle - Math.floor(this.followDelay)) % 600] Matter.Body.setPosition(this, { x: history.position.x, y: history.position.y - history.yOff + 24.2859 }) //bullets move with player } diff --git a/js/tech.js b/js/tech.js index 3f5d982..d2ca482 100644 --- a/js/tech.js +++ b/js/tech.js @@ -852,8 +852,8 @@ description: "shotgun, super balls, and drones
are loaded with explosives", maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { return ((m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isDroneRadioactive || tech.isSporeField || tech.isMissileField || tech.isIceField)) || (tech.haveGunCheck("drones") && !tech.isDroneRadioactive) || tech.haveGunCheck("super balls") || tech.haveGunCheck("shotgun")) && !tech.isNailShot }, @@ -932,8 +932,11 @@ requires: "no other mob death tech", effect() { tech.sporesOnDeath += 0.11; - for (let i = 0; i < 8; i++) { - b.spore(m.pos) + if (tech.isSporeWorm) { + for (let i = 0; i < 4; i++) b.worm(m.pos) + + } else { + for (let i = 0; i < 8; i++) b.spore(m.pos) } }, remove() { @@ -4257,7 +4260,7 @@ }, { name: "mycelial fragmentation", - description: "sporangium release an extra spore
once a second during their growth phase", + description: "sporangium release 6 extra spores
during their growth phase", isGunTech: true, maxCount: 1, count: 0, @@ -4332,6 +4335,25 @@ tech.isSporeFollow = false } }, + { + name: "nematodes", + description: "replace spores with 50% fewer worms
worms do 200% more damage", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 4, + frequencyDefault: 4, + allowed() { + return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField + }, + requires: "spores", + effect() { + tech.isSporeWorm = true + }, + remove() { + tech.isSporeWorm = false + } + }, { name: "mutualism", description: "increase spore damage by 150%
spores borrow 0.5 health until they die", @@ -5805,20 +5827,24 @@ maxCount: 1, count: 0, frequency: 0, - isNonRefundable: true, isBadRandomOption: true, isExperimentalMode: true, allowed() { return build.isExperimentSelection }, requires: "", + interval: undefined, effect() { - setInterval(() => { - m.switchWorlds() - simulation.trails() + this.interval = setInterval(() => { + if (!build.isExperimentSelection) { + m.switchWorlds() + simulation.trails() + } }, 20000); //every 20 seconds }, - remove() {} + remove() { + if (this.count > 0) clearTimeout(this.interval); + } }, { name: "-shields-", @@ -5826,7 +5852,6 @@ maxCount: 1, count: 0, frequency: 0, - isNonRefundable: true, isBadRandomOption: true, isExperimentalMode: true, allowed() { @@ -5834,13 +5859,18 @@ }, requires: "", effect() { - setInterval(() => { - for (let i = 0; i < mob.length; i++) { - if (!mob[i].isShielded && !mob[i].shield && mob[i].isDropPowerUp) spawn.shield(mob[i], mob[i].position.x, mob[i].position.y, 1, true); + this.interval = setInterval(() => { + if (!build.isExperimentSelection) { + for (let i = 0; i < mob.length; i++) { + if (!mob[i].isShielded && !mob[i].shield && mob[i].isDropPowerUp) spawn.shield(mob[i], mob[i].position.x, mob[i].position.y, 1, true); + } } }, 5000); //every 5 seconds }, - remove() {} + interval: undefined, + remove() { + if (this.count > 0) clearTimeout(this.interval); + } }, { name: "-Fourier analysis-", @@ -5848,7 +5878,6 @@ maxCount: 1, count: 0, frequency: 0, - isNonRefundable: true, isBadRandomOption: true, isExperimentalMode: true, allowed() { @@ -5865,7 +5894,9 @@ m.transY += (m.transSmoothY - m.transY) * 0.07; } }, - remove() {} + remove() { + if (this.count > 0) m.look = m.lookDefault() + } }, { name: "-panopticon-", @@ -5873,7 +5904,6 @@ maxCount: 1, count: 0, frequency: 0, - isNonRefundable: true, isBadRandomOption: true, isExperimentalMode: true, allowed() { @@ -5881,16 +5911,21 @@ }, requires: "", effect() { - setInterval(() => { - for (let i = 0; i < mob.length; i++) { - if (!mob[i].shield && mob[i].isDropPowerUp) { - mob[i].locatePlayer() - mob[i].seePlayer.yes = true; + this.interval = setInterval(() => { + if (!build.isExperimentSelection) { + for (let i = 0; i < mob.length; i++) { + if (!mob[i].shield && mob[i].isDropPowerUp) { + mob[i].locatePlayer() + mob[i].seePlayer.yes = true; + } } } }, 1000); //every 1 seconds }, - remove() {} + interval: undefined, + remove() { + if (this.count > 0) clearTimeout(this.interval); + } }, { name: "-decomposers-", @@ -7506,5 +7541,6 @@ harmonicEnergy: null, isFieldHarmReduction: null, isFastTime: null, - isDroneTeleport: null + isDroneTeleport: null, + isSporeWorm: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index 1055891..6faa6c1 100644 --- a/todo.txt +++ b/todo.txt @@ -1,15 +1,15 @@ ******************************************************** NEXT PATCH ******************************************************** +spore tech - nematodes - replace spores with 1/2 as many worms that do 200% more damage + worms are also a bit faster, last longer, have better reaction times + a cool worm graphic, and a simple searching behavior if they haven't found a mob +mycelial fragmentation - makes 6 extra spores during growth phase (was 4) + +historyBoss has less health, slower tracking, and more damage ******************************************************** TODO ******************************************************** -give drones or spores some mobs abilities - striker: teleport towards target - -drone tech: snakes - I haven't thought about this much, but I don't know make them look like snakes... - scrolling console history in pause menu? also make tech, guns scrolling? in testing mode console log the body you click on @@ -18,6 +18,8 @@ pause should at least show the last in game console message make the player get a buff after using wormhole while energy lasts: drain energy and give damage buff +Tech: "Induced Oscillation": When using phonon, if a block vibrates after it gets hit from a phonon, it has a chance of oscillating and creating an additional phonon coming from the block. The chance is higher the closer the block is to the source of the oscillation. + tech: quantized shields - harmonic standing wave field can only lose 33 energy per hit draw 1,2,3 levels of the field based on energy? the blocked value only scales up to 2x or 4x (33 energy) blocked