nematodes now wiggle their tail.  it's horrible
tech: transdimensional spores renamed transdimensional worms
  spawns spores -> worms

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

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

reactor sprayBoss is now harder to kill

bug fixes
This commit is contained in:
landgreen
2022-04-11 06:58:22 -07:00
parent 2a5a4781a9
commit 51f4489ae6
6 changed files with 221 additions and 137 deletions

View File

@@ -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 <strong>homing</strong> missiles that <strong class='color-e'>explode</strong><br>crouch to <strong>rapidly</strong> launch smaller missiles",
description: "launch <strong>homing</strong> missiles that <strong class='color-e'>explode</strong>",
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)
}
}
}
}, {

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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;

View File

@@ -4494,21 +4494,78 @@ const tech = {
},
{
name: "cruise missile",
description: "<strong>missiles</strong> travel <strong>63%</strong> slower,<br>but have a <strong>50%</strong> larger <strong class='color-e'>explosive</strong> payload",
description: "<strong>missiles</strong> travel <strong>50%</strong> slower,<br>but have a <strong>100%</strong> larger <strong class='color-e'>explosive</strong> 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 <strong>missiles</strong> travel <strong>66%</strong> slower,<br>but have a <strong>100%</strong> larger <strong class='color-e'>explosive</strong> 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 <strong>missile</strong> launch cooldown <strong>500%</strong><br>gain <strong>20%</strong> more missile <strong class='color-ammo'>ammo</strong> 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 <strong>+1</strong> <strong>missile</strong> and <strong>grenade</strong><br>decrease <strong class='color-e'>explosion</strong> <strong>radius</strong> up to <strong>10%</strong>",
description: "fire <strong>+1</strong> <strong>missile</strong> and <strong>grenade</strong> per shot<br>decrease <strong class='color-e'>explosion</strong> <strong>radius</strong> up to <strong>10%</strong>",
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: `<a target="_blank" href='https://en.wikipedia.org/wiki/Dimension' class="link">transdimensional spores</a>`,
description: "when <strong class='color-block'>blocks</strong> fall into a <strong class='color-worm'>wormhole</strong><br>higher dimension <strong class='color-p' style='letter-spacing: 2px;'>spores</strong> are summoned",
name: "transdimensional worms",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Dimension' class="link">transdimensional worms</a>`,
description: "when <strong class='color-block'>blocks</strong> fall into a <strong class='color-worm'>wormhole</strong><br>higher dimension <strong class='color-p' style='letter-spacing: 2px;'>worms</strong> 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 <strong class='color-f'>energy</strong> and ${powerUps.orb.research(4)} to <strong>spawn</strong><br>inside the event horizon of a huge <strong>black hole</strong>`,
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
}

View File

@@ -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