diff --git a/js/bullet.js b/js/bullet.js index 49671c4..8047c00 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1887,7 +1887,13 @@ const b = { Composite.add(engine.world, bullet[me]); //add bullet to world }, missile(where, angle, speed, size = 1) { - if (tech.missileSize) size *= 1.5 + if (tech.isMissileBig) { + size *= 1.55 + if (tech.isMissileBiggest) { + size *= 2 + + } + } const me = bullet.length; bullet[me] = Bodies.rectangle(where.x, where.y, 30 * size, 4 * size, { angle: angle, @@ -1902,7 +1908,7 @@ const b = { }, minDmgSpeed: 10, lookFrequency: Math.floor(10 + Math.random() * 3), - explodeRad: 180 * (tech.missileSize ? 1.5 : 1) + 60 * Math.random(), + explodeRad: (tech.isMissileBig ? 230 : 180) + 60 * Math.random(), density: 0.02, //0.001 is normal beforeDmg() { Matter.Body.setDensity(this, 0.0001); //reduce density to normal @@ -1973,7 +1979,7 @@ const b = { ctx.fill(); }, }); - const thrust = 0.0066 * bullet[me].mass * (tech.missileSize ? 0.6 : 1); + const thrust = 0.0066 * bullet[me].mass * (tech.isMissileBig ? (tech.isMissileBiggest ? 0.15 : 0.7) : 1); Matter.Body.setVelocity(bullet[me], { x: m.Vx / 2 + speed * Math.cos(angle), y: m.Vy / 2 + speed * Math.sin(angle) @@ -2589,7 +2595,7 @@ const b = { }, worm(where, isFreeze = tech.isSporeFreeze) { //used with the tech upgrade in mob.death() const bIndex = bullet.length; - const wormSize = 6 + tech.wormSize * 7 * Math.random() + const wormSize = 6 + tech.wormSize * 6 * Math.random() if (bIndex < 500) { //can't make over 500 spores bullet[bIndex] = Bodies.polygon(where.x, where.y, 3, 3, { inertia: Infinity, @@ -2600,7 +2606,7 @@ const b = { frictionAir: 0.025, thrust: (tech.isFastSpores ? 0.001 : 0.0005) * (1 + 0.5 * (Math.random() - 0.5)), wormSize: wormSize, - wormTail: 1 + Math.max(4, wormSize - 2 * tech.wormSize), + wormTail: 1 + Math.max(4, Math.min(wormSize - 2 * tech.wormSize, 30)), dmg: (tech.isMutualism ? 7 : 2.9) * wormSize, //bonus damage from tech.isMutualism //2.5 is extra damage as worm lookFrequency: 100 + Math.floor(37 * Math.random()), classType: "bullet", @@ -2637,16 +2643,24 @@ const b = { m.displayHealth(); } }, + tailCycle: 6.28 * Math.random(), do() { + this.tailCycle += this.speed * 0.025 ctx.beginPath(); //draw nematode ctx.moveTo(this.position.x, this.position.y); - const dir = Vector.mult(Vector.normalise(this.velocity), -Math.min(100, this.wormTail * this.speed)) + // const dir = Vector.mult(Vector.normalise(this.velocity), -Math.min(100, this.wormTail * this.speed)) + const speed = Math.min(7, this.speed) + const dir = Vector.mult(Vector.normalise(this.velocity), -0.6 * this.wormTail * speed) const tail = Vector.add(this.position, dir) - ctx.lineTo(tail.x, tail.y); + const wiggle = Vector.add(Vector.add(tail, dir), Vector.rotate(dir, Math.sin(this.tailCycle))) + // const wiggle = Vector.add(tail, Vector.rotate(dir, Math.sin((m.cycle - this.endCycle) * 0.03 * this.speed))) + ctx.quadraticCurveTo(tail.x, tail.y, wiggle.x, wiggle.y) // ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, this.vertices[0].x, this.vertices[0].y) + // ctx.lineTo(tail.x, tail.y); ctx.lineWidth = this.wormSize; 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 { @@ -5744,69 +5758,95 @@ const b = { }, { name: "missiles", - description: "launch homing missiles that explode
crouch to rapidly launch smaller missiles", + description: "launch homing missiles that explode", ammo: 0, - ammoPack: 4, + ammoPack: 5, have: false, fireCycle: 0, do() {}, fire() { const countReduction = Math.pow(0.9, tech.missileCount) - if (input.down) { - m.fireCDcycle = m.cycle + 10 * b.fireCDscale / countReduction; // cool down - // for (let i = 0; i < tech.missileCount; i++) { - // b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction)) - // bullet[bullet.length - 1].force.x += 0.004 * countReduction * (i - (tech.missileCount - 1) / 2); - // } + // if (input.down) { + // m.fireCDcycle = m.cycle + tech.missileFireCD * b.fireCDscale / countReduction; // cool down + // // for (let i = 0; i < tech.missileCount; i++) { + // // b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction)) + // // bullet[bullet.length - 1].force.x += 0.004 * countReduction * (i - (tech.missileCount - 1) / 2); + // // } - if (tech.missileCount > 1) { - for (let i = 0; i < tech.missileCount; i++) { - setTimeout(() => { - const where = { 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)) - bullet[bullet.length - 1].force.x += 0.025 * countReduction * (i - (tech.missileCount - 1) / 2); - }, 20 * tech.missileCount * Math.random()); - } - } else { - const where = { - x: m.pos.x, - y: m.pos.y - 40 - } - b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5), -2) - } - } else { - m.fireCDcycle = m.cycle + 50 * b.fireCDscale / countReduction; // cool down - const direction = { - x: Math.cos(m.angle), - y: Math.sin(m.angle) - } - const push = Vector.mult(Vector.perp(direction), 0.08 * countReduction / Math.sqrt(tech.missileCount)) - if (tech.missileCount > 1) { - for (let i = 0; i < tech.missileCount; i++) { - setTimeout(() => { - const where = { - x: m.pos.x + 40 * direction.x, - y: m.pos.y + 40 * direction.y - } - b.missile(where, m.angle, 0, Math.sqrt(countReduction)) - 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 { - const where = { - x: m.pos.x + 40 * direction.x, - y: m.pos.y + 40 * direction.y - } - b.missile(where, m.angle, 0) - } + // if (tech.missileCount > 1) { + // for (let i = 0; i < tech.missileCount; i++) { + // setTimeout(() => { + // const where = { 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)) + // bullet[bullet.length - 1].force.x += 0.025 * countReduction * (i - (tech.missileCount - 1) / 2); + // }, 20 * tech.missileCount * Math.random()); + // } + // } else { + // const where = { + // x: m.pos.x, + // y: m.pos.y - 40 + // } + // b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5), -2) + // } + // } else { + m.fireCDcycle = m.cycle + tech.missileFireCD * b.fireCDscale / countReduction; // cool down + const direction = { + x: Math.cos(m.angle), + y: Math.sin(m.angle) + } + // const where = { + // x: m.pos.x + 30 * direction.x, + // y: m.pos.y + 30 * direction.y + // } + if (tech.missileCount > 1) { + const push = Vector.mult(Vector.perp(direction), 0.2 * countReduction / Math.sqrt(tech.missileCount)) + const sqrtCountReduction = Math.sqrt(countReduction) // for (let i = 0; i < tech.missileCount; i++) { // setTimeout(() => { - // b.missile(where, m.angle, 0, 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); - // }, i * 50); + // if (input.down) { + // b.missile(where, m.angle, 20, sqrtCountReduction) + // // bullet[bullet.length - 1].force.x += 0.7 * push.x * (i - (tech.missileCount - 1) / 2); + // // bullet[bullet.length - 1].force.y += 0.7 * push.y * (i - (tech.missileCount - 1) / 2); + // } else { + // b.missile(where, m.angle, -10, sqrtCountReduction) + // bullet[bullet.length - 1].force.x += push.x * (i - (tech.missileCount - 1) / 2); + // bullet[bullet.length - 1].force.y += 0.005 + push.y * (i - (tech.missileCount - 1) / 2); + // } + + // }, 1 + i * 10 * tech.missileCount); // } + const launchDelay = 4 + let count = 0 + const fireMissile = () => { + if (input.down) { + b.missile({ x: m.pos.x + 30 * direction.x, y: m.pos.y + 30 * direction.y }, m.angle, 20, sqrtCountReduction) + bullet[bullet.length - 1].force.x += 0.5 * push.x * (Math.random() - 0.5) + bullet[bullet.length - 1].force.y += 0.004 + 0.5 * push.y * (Math.random() - 0.5) + } else { + b.missile({ x: m.pos.x + 30 * direction.x, y: m.pos.y + 30 * direction.y }, m.angle, -15, sqrtCountReduction) + bullet[bullet.length - 1].force.x += push.x * (Math.random() - 0.5) + bullet[bullet.length - 1].force.y += 0.005 + push.y * (Math.random() - 0.5) + } + } + const cycle = () => { + if ((simulation.paused || m.isBodiesAsleep) && m.alive) { + requestAnimationFrame(cycle) + } else { + count++ + if (!(count % launchDelay)) { + fireMissile() + } + if (count < tech.missileCount * launchDelay && m.alive) requestAnimationFrame(cycle); + } + } + requestAnimationFrame(cycle); + } else { + if (input.down) { + b.missile({ x: m.pos.x + 40 * direction.x, y: m.pos.y + 40 * direction.y }, m.angle, 25) + } else { + b.missile({ x: m.pos.x + 40 * direction.x, y: m.pos.y + 40 * direction.y }, m.angle, -12) + bullet[bullet.length - 1].force.y += 0.04 * (Math.random() - 0.2) + } } } }, { diff --git a/js/level.js b/js/level.js index a6bef15..790b6cc 100644 --- a/js/level.js +++ b/js/level.js @@ -8,7 +8,7 @@ const level = { onLevel: -1, levelsCleared: 0, //see level.populateLevels: (intro, ... , reservoir, reactor, ... , gauntlet, final) added later - playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber"], //"pavilion" + playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion"], // playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"], communityLevels: ["stronghold", "basement", "crossfire", "vats", "run", "n-gon", "house", "perplex", "coliseum", "tunnel", "islands"], trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon"], @@ -17,15 +17,15 @@ const level = { if (level.levelsCleared === 0) { //this code only runs on the first level // simulation.isHorizontalFlipped = true // m.setField("metamaterial cloaking") - // b.giveGuns("drones") - // tech.giveTech("desublimated ammunition") - // tech.giveTech("smelting") - // tech.giveTech("smelting") - // tech.giveTech("616") + // b.giveGuns("missiles") + // tech.giveTech("nematodes") + // tech.giveTech("launch system") + // tech.giveTech("cruise missile") + // tech.giveTech("ICBM") // tech.giveTech("grappling hook") - // tech.giveTech("coyote") + // tech.giveTech("annelids") // for (let i = 0; i < 2; i++) powerUps.directSpawn(0, 0, "tech"); - // for (let i = 0; i < 2; i++) tech.giveTech("corona discharge") + // for (let i = 0; i < 9; i++) tech.giveTech("annelids") // for (let i = 10; i < tech.tech.length; i++) { tech.tech[i].isBanished = true } // powerUps.research.changeRerolls(100000) // for (let i = 0; i < 5; i++) tech.giveTech("corona discharge") @@ -2551,7 +2551,7 @@ const level = { spawn.mapRect(4850, -275, 50, 175); //??? - level.difficultyIncrease(15) //30 is near max on hard //60 is near max on why + level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why m.addHealth(Infinity) spawn.starter(1900, -500, 200) //big boy @@ -2690,11 +2690,11 @@ const level = { if (!isSpawnedBoss) { isSpawnedBoss = true if (Math.random() < 0.33) { - for (let i = 0, len = Math.min(simulation.difficulty / 20, 6); i < len; ++i) spawn.bounceBoss(1487 + 200 * i, -1525, 80, false); + for (let i = 0, len = Math.min(simulation.difficulty / 15, 7); i < len; ++i) spawn.bounceBoss(1487 + 200 * i, -1525, 80, false); } else if (Math.random() < 0.5) { - for (let i = 0, len = Math.min(simulation.difficulty / 9, 8); i < len; ++i) spawn.sprayBoss(2400 - 150 * i, -225, 30, false) + for (let i = 0, len = Math.min(simulation.difficulty / 8, 8); i < len; ++i) spawn.sprayBoss(2400 - 150 * i, -225, 30, false) } else { - for (let i = 0, len = Math.min(simulation.difficulty / 6, 10); i < len; ++i) spawn.mineBoss(1950, -250, 50, false); + for (let i = 0, len = Math.min(simulation.difficulty / 5, 11); i < len; ++i) spawn.mineBoss(1950, -250, 50, false); } // for (let i = 0, len = 3 + simulation.difficulty / 20; i < len; ++i) spawn.mantisBoss(1487 + 300 * i, -1525, 35, false) } diff --git a/js/player.js b/js/player.js index 3ebe9bd..ebe873d 100644 --- a/js/player.js +++ b/js/player.js @@ -3340,22 +3340,11 @@ const m = { body.splice(i, 1); m.fieldRange *= 0.8 if (tech.isWormholeEnergy) m.energy += 0.53 - if (tech.isWormholeSpores) { //pandimensional spermia - for (let i = 0, len = Math.ceil(2.5 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) { - if (tech.isSporeWorm) { - b.worm(Vector.add(m.hole.pos2, Vector.rotate({ - x: m.fieldRange * 0.4, - y: 0 - }, 2 * Math.PI * Math.random()))) - Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), -5)); - } else { - b.spore(Vector.add(m.hole.pos2, Vector.rotate({ - x: m.fieldRange * 0.4, - y: 0 - }, 2 * Math.PI * Math.random()))) - Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), -15)); - } - } + if (tech.isWormholeWorms) { //pandimensional spermia + b.worm(Vector.add(m.hole.pos2, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random()))) + Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), -10)); + // for (let i = 0, len = Math.ceil(1.25 * Math.random()); i < len; i++) { + // } } break } @@ -3374,22 +3363,11 @@ const m = { m.fieldRange *= 0.8 // if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2 if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.53 - if (tech.isWormholeSpores) { //pandimensional spermia - for (let i = 0, len = Math.ceil(2.5 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) { - if (tech.isSporeWorm) { - b.worm(Vector.add(m.hole.pos1, Vector.rotate({ - x: m.fieldRange * 0.4, - y: 0 - }, 2 * Math.PI * Math.random()))) - Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), 5)); - } else { - b.spore(Vector.add(m.hole.pos1, Vector.rotate({ - x: m.fieldRange * 0.4, - y: 0 - }, 2 * Math.PI * Math.random()))) - Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), 15)); - } - } + if (tech.isWormholeWorms) { //pandimensional spermia + b.worm(Vector.add(m.hole.pos1, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random()))) + Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), 5)); + // for (let i = 0, len = Math.ceil(1.25 * Math.random()); i < len; i++) { + // } } break } diff --git a/js/spawn.js b/js/spawn.js index 93b4150..8f2bfef 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -3532,16 +3532,16 @@ const spawn = { me.isBoss = true; me.inertia = Infinity; //no rotation // me.accelMag = 0.00008 + 0.00007 * simulation.accelScale; - me.burstFireFreq = 22 + Math.floor(22 * simulation.CDScale) + me.burstFireFreq = 18 + Math.floor(18 * simulation.CDScale) me.burstTotalPhases = 4 + Math.floor(2 / simulation.CDScale) - me.noFireTotalCycles = 390 + me.noFireTotalCycles = 360 me.frictionStatic = 0; me.friction = 0; me.frictionAir = 0; me.restitution = 1 spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random(), 1) Matter.Body.setDensity(me, 0.0022 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger - me.damageReduction = 0.12 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) + me.damageReduction = 0.09 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.onDeath = function() { if (isSpawnBossPowerUp) powerUps.spawnBossPowerUp(this.position.x, this.position.y) }; @@ -4104,7 +4104,7 @@ const spawn = { me.swordGrow = function() { this.laserSword(this.vertices[this.swordVertex], this.angle + this.laserAngle); this.swordRadius += this.swordRadiusGrowRate - if (this.swordRadius > this.swordRadiusMax) { + if (this.swordRadius > this.swordRadiusMax || this.isStunned) { this.sword = this.swordSlash this.spinCount = 0 } @@ -4113,7 +4113,7 @@ const spawn = { this.laserSword(this.vertices[this.swordVertex], this.angle + this.laserAngle); this.torque += this.torqueMagnitude; this.spinCount++ - if (this.spinCount > 60) { + if (this.spinCount > 60 || this.isStunned) { this.sword = this.swordWaiting this.swordRadius = 0 this.accelMag = 0.001 * simulation.accelScale; diff --git a/js/tech.js b/js/tech.js index e7eae40..666ce58 100644 --- a/js/tech.js +++ b/js/tech.js @@ -4494,21 +4494,78 @@ const tech = { }, { name: "cruise missile", - description: "missiles travel 63% slower,
but have a 50% larger explosive payload", + description: "missiles travel 50% slower,
but have a 100% larger explosive payload", isGunTech: true, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount + return (tech.haveGunCheck("missiles") && tech.missileFireCD === 45) || tech.isMissileField || tech.missileBotCount }, requires: "missiles", effect() { - tech.missileSize = true + tech.isMissileBig = true }, remove() { - tech.missileSize = false + tech.isMissileBig = false + } + }, + { + name: "ICBM", + description: "cruise missiles travel 66% slower,
but have a 100% larger explosive payload", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.haveGunCheck("missiles") && tech.isMissileBig //&& !tech.isSmartRadius && !tech.isImmuneExplosion + }, + requires: "missiles, cruse missile", //, not electric reactive armor, controlled explosions", + effect() { + tech.isMissileBiggest = true + }, + remove() { + tech.isMissileBiggest = false + } + }, + { + name: "launch system", + description: `reduce missile launch cooldown 500%
gain 20% more missile ammo per ${powerUps.orb.ammo(1)}`, + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.haveGunCheck("missiles") && !tech.isMissileBig + }, + requires: "missiles", + ammoBonus: 1.2, + effect() { + tech.missileFireCD = 10 + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "missiles") { + b.guns[i].ammoPack = this.ammoBonus; + b.guns[i].ammo = Math.ceil(b.guns[i].ammo * this.ammoBonus); + simulation.updateGunHUD(); + break + } + } + }, + remove() { + if (tech.missileFireCD !== 45) { + tech.missileFireCD = 45; + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "missiles") { + b.guns[i].ammoPack = 5; + b.guns[i].ammo = Math.ceil(b.guns[i].ammo / this.ammoBonus); + simulation.updateGunHUD(); + break + } + } + } } }, { @@ -4550,7 +4607,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - 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) + return tech.explosiveRadius === 1 && !tech.isSmallExplosion && (tech.haveGunCheck("missiles") || tech.missileBotCount || 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: () => { @@ -4721,7 +4778,7 @@ const tech = { }, { name: "MIRV", - description: "fire +1 missile and grenade
decrease explosion radius up to 10%", + description: "fire +1 missile and grenade per shot
decrease explosion radius up to 10%", isGunTech: true, maxCount: 9, count: 0, @@ -5070,7 +5127,7 @@ const tech = { frequency: 3, frequencyDefault: 3, allowed() { - return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormholeSpores || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot) + return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot) }, requires: "spore gun, spores", effect() { @@ -7161,9 +7218,9 @@ const tech = { } }, { - name: "transdimensional spores", - link: `transdimensional spores`, - description: "when blocks fall into a wormhole
higher dimension spores are summoned", + name: "transdimensional worms", + link: `transdimensional worms`, + description: "when blocks fall into a wormhole
higher dimension worms are summoned", isFieldTech: true, maxCount: 1, count: 0, @@ -7174,10 +7231,10 @@ const tech = { }, requires: "wormhole", effect() { - tech.isWormholeSpores = true + tech.isWormholeWorms = true }, remove() { - tech.isWormholeSpores = false + tech.isWormholeWorms = false } }, { @@ -9233,7 +9290,7 @@ const tech = { remove() {} }, { - name: "quantum black hole", + name: "black hole", description: `use your energy and ${powerUps.orb.research(4)} to spawn
inside the event horizon of a huge black hole`, maxCount: 1, count: 0, @@ -9297,7 +9354,7 @@ const tech = { setTimeout(() => { powerUps.spawn(m.pos.x + 50, m.pos.y - 50, "heal"); }, 750); setTimeout(() => { powerUps.spawn(m.pos.x - 50, m.pos.y, "tech"); }, 1000); setTimeout(() => { powerUps.spawn(m.pos.x - 50, m.pos.y - 50, "research"); }, 1250); - }, 1000 * 5); + }, 1000 * 5 * 60); }, remove() {} }, @@ -9589,7 +9646,7 @@ const tech = { isWormholeDamage: null, isNailCrit: null, isFlechetteExplode: null, - isWormholeSpores: null, + isWormholeWorms: null, isWormBullets: null, isWideLaser: null, wideLaser: null, @@ -9616,7 +9673,8 @@ const tech = { isRewindGrenade: null, isExtruder: null, isEndLevelPowerUp: null, - missileSize: null, + isMissileBig: null, + isMissileBiggest: null, isLaserMine: null, isAmmoFoamSize: null, isIceIX: null, @@ -9748,5 +9806,6 @@ const tech = { plasmaDischarge: null, isFlipFlopHealth: null, isRelayEnergy: null, - coyoteTime: null + coyoteTime: null, + missileFireCD: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index c23c0a6..5855d8f 100644 --- a/todo.txt +++ b/todo.txt @@ -1,27 +1,32 @@ ******************************************************** NEXT PATCH ************************************************** -added 2 more classic n-gon dates +nematodes now wiggle their tail. it's horrible +tech: transdimensional spores renamed transdimensional worms + spawns spores -> worms -plasma ball - does 10% more damage - moves 20% faster - targets mob bullets better +missiles: + 20% more ammo + no longer fire rapidly on crouch + instead crouch gives missile initial forward velocity + no crouch makes the missiles recoil back before they accelerate forward + tech: launch system - fire missiles 500% more rapidly, gives 25% ammo + doesn't work with cruse missile + tech: ICBM - cruse missile is even bigger and slower -standing wave has a 45/60->30/60 second cooldown after blocking a shielded mob - but, standing wave now also triggers it's CD on shields that protect groups of mobs +pavilion has been added back to the map rotation + this will make the game end at 13 again, and feel harder + let me know if it's absence resulted in less NaN game crashes -JUNK tech: Mech v4.48 removed -JUNK tech: cosmogonic myth - opens a random classic version of n-gon in a new tab, after 5 minutes close the tab and spawn 1 of every tech +reactor sprayBoss is now harder to kill bug fixes - ******************************************************** TODO ******************************************************** bugs: requirement text man discord messages + make sure guns are listed to work with gun tech randomization bring back: - missiles that fall back and down for a sec after they fire the old phase decoherence field make cloak only active on input.field down could be a tech @@ -33,6 +38,8 @@ bring back: but it does drain some energy tech pilot wave: Bose Einstein condensate - freeze mobs in superposition with pilot wave +tech: plasma drip + plasma ball graphics should look more like a real plasma ball gently scale damage with circleRadius