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:
55
js/bullet.js
55
js/bullet.js
@@ -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) {
|
||||||
|
|||||||
28
js/level.js
28
js/level.js
@@ -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)
|
||||||
|
|||||||
22
js/player.js
22
js/player.js
@@ -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) {
|
||||||
|
|||||||
131
js/tech.js
131
js/tech.js
@@ -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
|
||||||
}
|
}
|
||||||
48
todo.txt
48
todo.txt
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user