irradiated drones

irradiated drones
  new tech: beta radiation - double damage and half lifespan
  now don't clump as often, to make the graphics look better
  effective radius now includes edges of mobs, not just centers
    so they work better on large radius mobs
  do 50% more damage, but have a 10% smaller radius and last 3 second shorter time and 80% less ammo  (was 75%)
  irradiated drones can't get a slowing effect anymore
    it was just too annoying
  nano-scale can now unlock irradiated drone tech properly
  nano-scale now drains more energy per irradiated drone, to scale with the higher ammo costs

time dilation field is now just called "time dilation"
constraints under time dilation is less buggy, but still a bit buggy
This commit is contained in:
landgreen
2021-06-29 07:18:41 -07:00
parent f427f181a3
commit 5d4ef1994c
6 changed files with 136 additions and 148 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1041,10 +1041,10 @@ const b = {
} }
//aoe damage to mobs //aoe damage to mobs
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.damageRadius) { if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.damageRadius + mob[i].radius) {
let dmg = b.dmgScale * 0.09 let dmg = b.dmgScale * 0.09
if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way
if (mob[i].shield) dmg *= 4 //x5 to make up for the /5 that shields normally take if (mob[i].shield) dmg *= 3 //to make up for the /5 that shields normally take
mob[i].damage(dmg); mob[i].damage(dmg);
mob[i].locatePlayer(); mob[i].locatePlayer();
if (tech.isNeutronSlow) { if (tech.isNeutronSlow) {
@@ -2211,30 +2211,31 @@ const b = {
}, },
droneRadioactive(where = { x: m.pos.x + 30 * Math.cos(m.angle) + 20 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 20 * (Math.random() - 0.5) }, speed = 1) { droneRadioactive(where = { x: m.pos.x + 30 * Math.cos(m.angle) + 20 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 20 * (Math.random() - 0.5) }, speed = 1) {
const me = bullet.length; const me = bullet.length;
const THRUST = tech.isFastDrones ? 0.002 : 0.0012 const THRUST = tech.isFastDrones ? 0.002 : 0.0012 + 0.0004 * (Math.random() - 0.5)
const dir = m.angle + 0.4 * (Math.random() - 0.5); const dir = m.angle + 0.4 * (Math.random() - 0.5);
const RADIUS = (4 + 1 * Math.random()) const RADIUS = (4 + 1 * Math.random())
bullet[me] = Bodies.polygon(where.x, where.y, 8, RADIUS, { bullet[me] = Bodies.polygon(where.x, where.y, 8, RADIUS, {
angle: dir, angle: dir,
inertia: Infinity, inertia: Infinity,
friction: 0.05, friction: 0,
frictionAir: 0, frictionAir: 0,
restitution: 1, restitution: 0.8 + 0.199 * Math.random(),
dmg: 0.24, //damage done in addition to the damage from momentum dmg: 0.24, //damage done in addition to the damage from momentum
lookFrequency: 120 + Math.floor(23 * Math.random()), lookFrequency: 120 + Math.floor(23 * Math.random()),
endCycle: simulation.cycle + Math.floor((900 + 400 * Math.random()) * tech.isBulletsLastLonger) + 140 + RADIUS * 5, endCycle: simulation.cycle + Math.floor((900 + 120 * Math.random()) * tech.isBulletsLastLonger / tech.droneRadioDamage) + 140 + RADIUS * 5,
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
category: cat.bullet, category: cat.bullet,
mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield //self collide mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield //self collide
}, },
minDmgSpeed: 0, minDmgSpeed: 0,
speedCap: 5 + 2 * Math.random(), //6 is normal
lockedOn: null, lockedOn: null,
isFollowMouse: true, isFollowMouse: true,
deathCycles: 110 + RADIUS * 5, deathCycles: 110 + RADIUS * 5,
isImproved: false, isImproved: false,
radioRadius: 0, radioRadius: 0,
maxRadioRadius: 400 + Math.floor(75 * Math.random()) + 80 * tech.isNeutronSlow, maxRadioRadius: 365 + Math.floor(150 * Math.random()),
beforeDmg(who) { beforeDmg(who) {
const unit = Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), -20) //move away from target after hitting const unit = Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), -20) //move away from target after hitting
Matter.Body.setVelocity(this, { Matter.Body.setVelocity(this, {
@@ -2274,46 +2275,24 @@ const b = {
} }
//aoe damage to mobs //aoe damage to mobs
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.radioRadius) { if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.radioRadius + mob[i].radius) {
let dmg = b.dmgScale * 0.035 //neutron bombs dmg = 0.09 let dmg = b.dmgScale * 0.055 * tech.droneRadioDamage //neutron bombs dmg = 0.09
if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way
if (mob[i].shield) dmg *= 4 //x5 to make up for the /5 that shields normally take if (mob[i].shield) dmg *= 3 // to make up for the /5 that shields normally take
mob[i].damage(dmg); mob[i].damage(dmg);
mob[i].locatePlayer(); mob[i].locatePlayer();
if (tech.isNeutronSlow) {
Matter.Body.setVelocity(mob[i], {
x: mob[i].velocity.x * 0.97,
y: mob[i].velocity.y * 0.97
});
}
} }
} }
//draw //draw
ctx.beginPath(); ctx.beginPath();
ctx.arc(this.position.x, this.position.y, this.radioRadius, 0, 2 * Math.PI); ctx.arc(this.position.x, this.position.y, this.radioRadius, 0, 2 * Math.PI);
ctx.globalCompositeOperation = "lighter" ctx.globalCompositeOperation = "lighter"
ctx.fillStyle = `rgba(25,139,170,${0.1+0.05*Math.random()})`; // ctx.fillStyle = `rgba(25,139,170,${0.15+0.05*Math.random()})`;
// ctx.fillStyle = `rgba(36, 207, 255,${0.1+0.05*Math.random()})`;
ctx.fillStyle = `rgba(28, 175, 217,${0.13+0.07*Math.random()})`;
ctx.fill(); ctx.fill();
ctx.globalCompositeOperation = "source-over" ctx.globalCompositeOperation = "source-over"
if (tech.isNeutronSlow) {
const slow = (who, radius = this.radioRadius * 3.2) => {
for (i = 0, len = who.length; i < len; i++) {
const sub = Vector.sub(this.position, who[i].position);
const dist = Vector.magnitude(sub);
if (dist < radius) {
Matter.Body.setVelocity(who[i], {
x: who[i].velocity.x * 0.975,
y: who[i].velocity.y * 0.975
});
}
}
}
slow(body, this.radioRadius)
slow([player], this.radioRadius)
}
//normal drone actions //normal drone actions
if (simulation.cycle + this.deathCycles > this.endCycle) { //fall shrink and die if (simulation.cycle + this.deathCycles > this.endCycle) { //fall shrink and die
this.force.y += this.mass * 0.0012; this.force.y += this.mass * 0.0012;
@@ -2430,7 +2409,7 @@ const b = {
this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, simulation.mouseInGame)), -this.mass * THRUST) this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, simulation.mouseInGame)), -this.mass * THRUST)
} }
// speed cap instead of friction to give more agility // speed cap instead of friction to give more agility
if (this.speed > 6) { if (this.speed > this.speedCap) {
Matter.Body.setVelocity(this, { Matter.Body.setVelocity(this, {
x: this.velocity.x * 0.97, x: this.velocity.x * 0.97,
y: this.velocity.y * 0.97 y: this.velocity.y * 0.97
@@ -4383,10 +4362,10 @@ const b = {
if (tech.isDroneRadioactive) { if (tech.isDroneRadioactive) {
if (m.crouch) { if (m.crouch) {
b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 45) b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 45)
m.fireCDcycle = m.cycle + Math.floor(7 * 13 * b.fireCD); // cool down m.fireCDcycle = m.cycle + Math.floor(5 * 13 * b.fireCD); // cool down
} else { } else {
b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 10) b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 10)
m.fireCDcycle = m.cycle + Math.floor(7 * 6 * b.fireCD); // cool down m.fireCDcycle = m.cycle + Math.floor(5 * 6 * b.fireCD); // cool down
} }
} else { } else {
if (m.crouch) { if (m.crouch) {

View File

@@ -13,25 +13,14 @@ const level = {
start() { start() {
if (level.levelsCleared === 0) { //this code only runs on the first level if (level.levelsCleared === 0) { //this code only runs on the first level
// simulation.enableConstructMode() //used to build maps in testing mode // simulation.enableConstructMode() //used to build maps in testing mode
// simulation.difficulty = 20 // level.difficultyIncrease(30)
// simulation.isHorizontalFlipped = true // simulation.isHorizontalFlipped = true
// level.difficultyIncrease(99) // m.setField("time dilation")
// m.setField("nano-scale manufacturing")
// b.giveGuns("grenades") // b.giveGuns("grenades")
// tech.giveTech("neutron bomb") // tech.giveTech("neutron bomb")
// b.giveGuns("drones")
// tech.giveTech("radioactive drones")
// tech.isRadioactiveResistance = true
// for (let i = 0; i < 9; i++) tech.giveTech("spherical harmonics") // for (let i = 0; i < 9; i++) tech.giveTech("spherical harmonics")
// tech.isExplodeRadio = true
// tech.giveTech("vacuum permittivity")
// tech.giveTech("quenching")
// tech.giveTech("decoherence")
// tech.giveTech("supertemporal") // tech.giveTech("supertemporal")
// for (let i = 0; i < 3; i++) tech.giveTech("packet length") // for (let i = 0; i < 3; i++) tech.giveTech("packet length")
// for (let i = 0; i < 3; i++) tech.giveTech("propagation")
// for (let i = 0; i < 3; i++) tech.giveTech("bound state")
// for (let i = 0; i < 9; i++) tech.giveTech("WIMPs")
level.intro(); //starting level level.intro(); //starting level
// level.labs(); // level.labs();
@@ -969,7 +958,6 @@ const level = {
if (this.height > 0 && Matter.Query.region([player], this).length) { if (this.height > 0 && Matter.Query.region([player], this).length) {
const DRAIN = 0.003 * (tech.isRadioactiveResistance ? 0.25 : 1) + m.fieldRegen const DRAIN = 0.003 * (tech.isRadioactiveResistance ? 0.25 : 1) + m.fieldRegen
console.log(DRAIN)
if (m.energy > DRAIN) { if (m.energy > DRAIN) {
m.energy -= DRAIN m.energy -= DRAIN
} else { } else {
@@ -2091,7 +2079,7 @@ const level = {
// toggle.query(); // toggle.query();
}; };
level.setPosToSpawn(0, -750); //normal spawn level.setPosToSpawn(0, -450); //normal spawn
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
level.exit.x = 6500; level.exit.x = 6500;
level.exit.y = -230; level.exit.y = -230;
@@ -2110,8 +2098,8 @@ const level = {
spawn.mapRect(-950, 0, 8200, 800); //ground spawn.mapRect(-950, 0, 8200, 800); //ground
spawn.mapRect(-950, -1200, 800, 1400); //left wall spawn.mapRect(-950, -1200, 800, 1400); //left wall
spawn.mapRect(-950, -1800, 8200, 800); //roof spawn.mapRect(-950, -1800, 8200, 800); //roof
spawn.mapRect(-250, -700, 1000, 900); // shelf spawn.mapRect(-250, -400, 1000, 600); // shelf
spawn.mapRect(-250, -1200, 1000, 250); // shelf roof spawn.mapRect(-250, -1200, 1000, 550); // shelf roof
// powerUps.spawnStartingPowerUps(600, -800); // powerUps.spawnStartingPowerUps(600, -800);
// for (let i = 0; i < 50; ++i) powerUps.spawn(550, -800, "research", false); // for (let i = 0; i < 50; ++i) powerUps.spawn(550, -800, "research", false);
// powerUps.spawn(350, -800, "gun", false); // powerUps.spawn(350, -800, "gun", false);
@@ -2135,16 +2123,16 @@ const level = {
spawn.mapRect(6700, -1800, 800, 2600); //right wall spawn.mapRect(6700, -1800, 800, 2600); //right wall
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump 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.grower(1900, -500) // spawn.grower(1900, -500)
// spawn.pulsarBoss(1900, -500) // spawn.pulsarBoss(1900, -500)
// spawn.shooterBoss(1900, -500) // spawn.shooterBoss(1900, -500)
// spawn.historyBoss(1200, -500) // spawn.historyBoss(1200, -500)
// spawn.laserTargetingBoss(1600, -400) // spawn.laserTargetingBoss(1600, -400)
spawn.hopper(1600, -500) // spawn.hopper(1600, -500)
// spawn.laserTargetingBoss(1700, -120) // spawn.laserTargetingBoss(1700, -120)
// spawn.bomberBoss(1400, -500) // spawn.bomberBoss(1400, -500)
spawn.hopBoss(1800, -120) // spawn.hopBoss(1800, -120)
// spawn.streamBoss(1600, -500) // spawn.streamBoss(1600, -500)
// spawn.orbitalBoss(1600, -500) // spawn.orbitalBoss(1600, -500)
// spawn.cellBossCulture(1600, -500) // spawn.cellBossCulture(1600, -500)

View File

@@ -1683,7 +1683,7 @@ const m = {
m.energy -= 0.04; m.energy -= 0.04;
b.iceIX(1) b.iceIX(1)
} else if (tech.isDroneRadioactive) { } else if (tech.isDroneRadioactive) {
m.energy -= 1; m.energy -= 1.5; //almost 5x drain of normal drones
b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 25) b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 25)
} else { } else {
m.energy -= 0.45 * tech.droneEnergyReduction; m.energy -= 0.45 * tech.droneEnergyReduction;
@@ -1916,7 +1916,7 @@ const m = {
} }
}, },
{ {
name: "time dilation field", name: "time dilation",
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br><strong>move</strong> and <strong>fire</strong> while time is stopped<br>mobs still do <strong class='color-harm'>harm</strong> while time is stopped", description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br><strong>move</strong> and <strong>fire</strong> while time is stopped<br>mobs still do <strong class='color-harm'>harm</strong> while time is stopped",
effect: () => { effect: () => {
// m.fieldMeterColor = "#000" // m.fieldMeterColor = "#000"
@@ -1960,13 +1960,19 @@ const m = {
sleep(mob); sleep(mob);
sleep(body); sleep(body);
sleep(bullet); sleep(bullet);
// for (let i = 0, len = cons.length; i < len; i++) {
// Matter.Body.setVelocity(cons[i].bodyB, {
// x: 0,
// y: 0
// });
// }
//doesn't really work, just slows down constraints //doesn't really work, just slows down constraints
for (let i = 0, len = cons.length; i < len; i++) { // for (let i = 0, len = cons.length; i < len; i++) {
if (cons[i].stiffness !== 0) { // if (cons[i].stiffness !== 0) {
cons[i].storeStiffness = cons[i].stiffness; // cons[i].storeStiffness = cons[i].stiffness;
cons[i].stiffness = 0; // cons[i].stiffness = 0;
} // }
} // }
simulation.cycle--; //pause all functions that depend on game cycle increasing simulation.cycle--; //pause all functions that depend on game cycle increasing
if (tech.isTimeSkip) { if (tech.isTimeSkip) {

View File

@@ -843,7 +843,7 @@
allowed() { 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 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
}, },
requires: "super balls, shotgun, drones, not radioactive drones", requires: "super balls, shotgun, drones, not irradiated drones",
effect() { effect() {
tech.isIncendiary = true tech.isIncendiary = true
}, },
@@ -4067,9 +4067,9 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isNeutronBomb || tech.isDroneRadioactive return tech.isNeutronBomb || tech.isDroneRadioactive || tech.isExplodeRadio
}, },
requires: "neutron bomb or radioactive drones", requires: "neutron bomb or irradiated drones or iridium-192",
effect() { effect() {
tech.isRadioactiveResistance = true tech.isRadioactiveResistance = true
}, },
@@ -4086,9 +4086,9 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isNeutronBomb || tech.isDroneRadioactive return tech.isNeutronBomb
}, },
requires: "neutron bomb or radioactive drones", requires: "neutron bomb",
effect() { effect() {
tech.isNeutronSlow = true tech.isNeutronSlow = true
}, },
@@ -4271,35 +4271,32 @@
} }
}, },
{ {
name: "radioisotope generator", name: "reduced tolerances",
description: "<strong class='color-p'>irradiate</strong> <strong>drones</strong>, reduce <strong class='color-g'>ammo</strong> by <strong>75%</strong><br>does <strong class='color-d'>damage</strong>, <strong class='color-harm'>harm</strong>, and drains <strong class='color-f'>energy</strong>", description: "increase <strong>drone</strong> <strong class='color-g'>ammo</strong>/<strong class='color-f'>efficiency</strong> by <strong>66%</strong><br>reduce the average <strong>drone</strong> lifetime by <strong>40%</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 3,
count: 0, count: 0,
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("drones") && tech.droneCycleReduction === 1 && !tech.isIncendiary return !tech.isDroneRadioactive && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)))
}, },
requires: "drone gun, not reduced tolerances or incendiary", requires: "drones, not irradiated drones",
effect() { effect() {
tech.isDroneRadioactive = true tech.droneCycleReduction = Math.pow(0.6, 1 + this.count)
tech.droneEnergyReduction = Math.pow(0.333, 1 + this.count)
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "drones") { if (b.guns[i].name === "drones") {
b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * 0.25 const scale = Math.pow(3, this.count + 1)
b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 0.25) b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * scale
} }
} }
}, },
remove() { remove() {
if (tech.isDroneRadioactive) { tech.droneCycleReduction = 1
tech.isDroneRadioactive = false tech.droneEnergyReduction = 1
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "drones") { if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack
b.guns[i].ammoPack = b.guns[i].defaultAmmoPack
b.guns[i].ammo = b.guns[i].ammo * 4
}
}
} }
} }
}, },
@@ -4361,35 +4358,58 @@
} }
}, },
{ {
name: "reduced tolerances", name: "irradiated drones",
description: "increase <strong>drone</strong> <strong class='color-g'>ammo</strong>/<strong class='color-f'>efficiency</strong> by <strong>66%</strong><br>reduce the average <strong>drone</strong> lifetime by <strong>40%</strong>", description: "<strong class='color-p'>irradiate</strong> the space around your <strong>drones</strong><br>reduce <strong class='color-g'>ammo</strong>/<strong class='color-f'>efficiency</strong> by <strong>80%</strong>",
//<br>does <strong class='color-d'>damage</strong>, <strong class='color-harm'>harm</strong>, and drains <strong class='color-f'>energy</strong>
isGunTech: true, isGunTech: true,
maxCount: 3, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return !tech.isDroneRadioactive && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) return tech.droneCycleReduction === 1 && !tech.isIncendiary && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)))
}, },
requires: "drones", requires: "drone gun, not reduced tolerances or incendiary",
effect() { effect() {
tech.droneCycleReduction = Math.pow(0.6, 1 + this.count) tech.isDroneRadioactive = true
tech.droneEnergyReduction = Math.pow(0.333, 1 + this.count)
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "drones") { if (b.guns[i].name === "drones") {
const scale = Math.pow(3, this.count + 1) b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * 0.2
b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * scale b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 0.2)
} }
} }
}, },
remove() { remove() {
tech.droneCycleReduction = 1 if (tech.isDroneRadioactive) {
tech.droneEnergyReduction = 1 tech.isDroneRadioactive = false
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack if (b.guns[i].name === "drones") {
b.guns[i].ammoPack = b.guns[i].defaultAmmoPack
b.guns[i].ammo = b.guns[i].ammo * 5
}
}
} }
} }
}, },
{
name: "beta radiation", //"control rod ejection",
description: "reduce the average <strong>drone</strong> lifetime by <strong>50%</strong><br>increase <strong class='color-p'>radiation</strong> <strong class='color-d'>damage</strong> by <strong>100%</strong>",
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.isDroneRadioactive
},
requires: "irradiated drones",
effect() {
tech.droneRadioDamage = 2
},
remove() {
tech.droneRadioDamage = 1
}
},
{ {
name: "necrophoresis", name: "necrophoresis",
description: "<strong>foam</strong> bubbles grow and split into 3 <strong>copies</strong><br> when the mob they are stuck to <strong>dies</strong>", description: "<strong>foam</strong> bubbles grow and split into 3 <strong>copies</strong><br> when the mob they are stuck to <strong>dies</strong>",
@@ -5000,12 +5020,12 @@
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
allowed() { allowed() {
return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive)
}, },
requires: "nano-scale manufacturing, no other manufacturing", requires: "nano-scale manufacturing, no other manufacturing, no drone tech",
effect() { effect() {
if (!build.isExperimentSelection) { if (!build.isExperimentSelection) {
for (let i = 0; i < 3; i++) { for (let i = 0; i < 3; i++) {
@@ -5024,12 +5044,12 @@
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
allowed() { allowed() {
return (build.isExperimentSelection || powerUps.research.count > 2) && m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) return (build.isExperimentSelection || powerUps.research.count > 2) && m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive)
}, },
requires: "nano-scale manufacturing, no other manufacturing", requires: "nano-scale manufacturing, no other manufacturing, no drone tech",
effect() { effect() {
if (!build.isExperimentSelection) { if (!build.isExperimentSelection) {
for (let i = 0; i < 3; i++) { for (let i = 0; i < 3; i++) {
@@ -5048,12 +5068,12 @@
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
allowed() { allowed() {
return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab) return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive)
}, },
requires: "nano-scale manufacturing, no other manufacturing", requires: "nano-scale manufacturing, no other manufacturing, no drone tech",
effect() { effect() {
if (!build.isExperimentSelection) { if (!build.isExperimentSelection) {
for (let i = 0; i < 3; i++) { for (let i = 0; i < 3; i++) {
@@ -5152,9 +5172,9 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "time dilation field" return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "time dilation"
}, },
requires: "pilot wave, negative mass field, time dilation field", requires: "pilot wave, negative mass field, time dilation",
effect() { effect() {
tech.isFreezeMobs = true tech.isFreezeMobs = true
}, },
@@ -5269,9 +5289,9 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation field" return m.fieldUpgrades[m.fieldMode].name === "time dilation"
}, },
requires: "time dilation field", requires: "time dilation",
effect() { effect() {
tech.isTimeSkip = true; tech.isTimeSkip = true;
b.setFireCD(); b.setFireCD();
@@ -5290,9 +5310,9 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation field" return m.fieldUpgrades[m.fieldMode].name === "time dilation"
}, },
requires: "time dilation field", requires: "time dilation",
effect() { effect() {
tech.fastTime = 1.40; tech.fastTime = 1.40;
tech.fastTimeJump = 1.11; tech.fastTimeJump = 1.11;
@@ -5315,9 +5335,9 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "time dilation field") && tech.energyRegen !== 0 return (m.fieldUpgrades[m.fieldMode].name === "time dilation") && tech.energyRegen !== 0
}, },
requires: "time dilation field, not ground state", requires: "time dilation, not ground state",
effect: () => { effect: () => {
tech.energyRegen = 0.004; tech.energyRegen = 0.004;
m.fieldRegen = tech.energyRegen; m.fieldRegen = tech.energyRegen;
@@ -7246,5 +7266,6 @@
superBallDelay: null, superBallDelay: null,
isBlockExplode: null, isBlockExplode: null,
isOverHeal: null, isOverHeal: null,
isDroneRadioactive: null isDroneRadioactive: null,
droneRadioDamage: null
} }

View File

@@ -1,23 +1,21 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
tech - radioisotope generator - drones have the effect of neutron bomb, but you get less ammo irradiated drones
bug fix - reduced tolerances now properly gives extra ammo new tech: beta radiation - double damage and half lifespan
water shielding now protects you from all radioactivity, but only gives 75% protection now don't clump as often, to make the graphics look better
(drones, neutron bomb, radioactive explosions, and even slime) effective radius now includes edges of mobs, not just centers
so they work better on large radius mobs
do 50% more damage, but have a 10% smaller radius and last 3 second shorter time and 80% less ammo (was 75%)
irradiated drones can't get a slowing effect anymore
it was just too annoying
nano-scale can now unlock irradiated drone tech properly
nano-scale now drains more energy per irradiated drone, to scale with the higher ammo costs
final boss has more durability in it's final phase time dilation field is now just called "time dilation"
final boss no longers gets knocked around as much from explosions constraints under time dilation is less buggy, but still a bit buggy
level.warehouse predraw lighting for performance
bug fix on sewers where slime was doing too much harm
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
slime does extra damage on flipped levels?
using time dilatation breaks constraints
on map n-gon, toggles
player can become crouched while not touching the ground if they exit the ground while crouched player can become crouched while not touching the ground if they exit the ground while crouched
a couple times people have reported the final boss dropping extra bodies on death a couple times people have reported the final boss dropping extra bodies on death
@@ -40,10 +38,6 @@ is there a way to check if the player is stuck inside the map or block
******************************************************** LEVELS ******************************************************** ******************************************************** LEVELS ********************************************************
make a power up you can carry around like the heal power up when at full health
drop it on a map element to turn it on?
use it in combat?
labs - procedural generation labs - procedural generation
bugs bugs
mob spawns shouldn't be based on probability? mob spawns shouldn't be based on probability?
@@ -92,18 +86,11 @@ map: observatory
laser beam shoots out of telescope laser beam shoots out of telescope
button opens the dome button opens the dome
map: prison
doors linked to buttons
mobs inside the doors?
boss levels - small levels just a boss, and maybe a few mobs
boss level for timeSkipBoss because of game instability for boss on normal levels
this might not fix issues
******************************************************** MOBS ******************************************************** ******************************************************** MOBS ********************************************************
mob mechanics mob mechanics
use the force at a location effect, like the plasma field use the force at a location effect, like the plasma field
Matter.Body.applyForce(who, path[1], force)
mob - after taking damage mob - after taking damage
release seekers release seekers
@@ -153,6 +140,13 @@ level boss: fires a line intersection in a random direction every few seconds.
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
tech - shorter cloaking delay
irradiated drones, get annoying when they go after mobs near the player...
should they only follow mouse? or at least show a preference for targets near mouse, not near player
tech - 1/2 your drone ammo/efficiency double the damage?
tech foam teleports around, like a quantum wave function collapse tech foam teleports around, like a quantum wave function collapse
should ammo apply to all guns, or just one of your guns? should ammo apply to all guns, or just one of your guns?
@@ -174,7 +168,7 @@ have throw charge scale with fire delay
in testing mode console log the body you click on in testing mode console log the body you click on
throwing a block removes the block and rewinds time 10 seconds (including health and energy) throwing a block removes the block and rewinds time 10 seconds (including health and energy)
requires CPT, CPT gun, time dilation field? requires CPT, CPT gun, time dilation?
tech plasma : plasma length increases then decreases as you hold down the field button (like stabbing with a spear) tech plasma : plasma length increases then decreases as you hold down the field button (like stabbing with a spear)
grows to 1.5 longer after 0.3 seconds, then returns to normal length over 1 second, until field is pressed again grows to 1.5 longer after 0.3 seconds, then returns to normal length over 1 second, until field is pressed again