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