diff --git a/js/bullet.js b/js/bullet.js
index 70eb8b0..34bcc89 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -84,7 +84,7 @@ const b = {
},
fireCD: 1,
setFireCD() {
- b.fireCD = mod.fireRate * mod.slowFire / mod.fastTime
+ b.fireCD = mod.fireRate * mod.slowFire * mod.rerollHaste / mod.fastTime
},
fireAttributes(dir, rotate = true) {
if (rotate) {
@@ -458,7 +458,7 @@ const b = {
},
onEnd() {
if (this.isArmed) {
- b.targetedNail(this.position, 14)
+ b.targetedNail(this.position, 15)
}
if (isAmmoBack) { //get ammo back from mod.isMineAmmoBack
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
@@ -727,7 +727,7 @@ const b = {
}
}
}
- if (!this.lockedOn && !mod.isAmmoFromHealth) {
+ if (!this.lockedOn && !mod.isArmorFromPowerUps) {
//grab a power up if it is (ammo) or (a heal when player is low)
let closeDist = Infinity;
for (let i = 0, len = powerUp.length; i < len; ++i) {
@@ -965,6 +965,24 @@ const b = {
};
bullet[me].do = function () {};
},
+ randomBot(where = mech.pos, isKeep = true) {
+ if (Math.random() < 0.05) { //very low chance of plasma bot
+ b.plasmaBot(where)
+ if (isKeep) mod.plasmaBotCount++;
+ } else if (Math.random() < 0.25) {
+ b.nailBot(where)
+ if (isKeep) mod.nailBotCount++;
+ } else if (Math.random() < 0.33) {
+ b.laserBot(where)
+ if (isKeep) mod.laserBotCount++;
+ } else if (Math.random() < 0.5) {
+ b.foamBot(where)
+ if (isKeep) mod.foamBotCount++;
+ } else {
+ b.boomBot(where)
+ if (isKeep) mod.boomBotCount++;
+ }
+ },
nailBot(position = mech.pos) {
const me = bullet.length;
const dir = mech.angle;
@@ -1965,8 +1983,8 @@ const b = {
name: "flak",
description: "fire a cluster of short range projectiles
explodes on contact or after half a second",
ammo: 0,
- ammoPack: 9,
- defaultAmmoPack: 9, //use to revert ammoPack after mod changes drop rate
+ ammoPack: 7,
+ defaultAmmoPack: 7, //use to revert ammoPack after mod changes drop rate
have: false,
isEasyToAim: false,
fire() {
@@ -2361,7 +2379,7 @@ const b = {
x: speed * Math.cos(mech.angle),
y: speed * Math.sin(mech.angle)
}, 0, mod.isMineAmmoBack)
- mech.fireCDcycle = mech.cycle + Math.floor((mech.crouch ? 70 : 45) * b.fireCD); // cool down
+ mech.fireCDcycle = mech.cycle + Math.floor((mech.crouch ? 60 : 20) * b.fireCD); // cool down
}
},
{
@@ -2460,9 +2478,10 @@ const b = {
bullet[me].grow = function () {
this.stuck(); //runs different code based on what the bullet is stuck to
if (!mech.isBodiesAsleep) {
- const SCALE = 1.013
- Matter.Body.scale(this, SCALE, SCALE);
- this.radius *= SCALE
+ let scale = 1.01
+ if (this.stuckTo && this.stuckTo.alive) scale = 1.03
+ Matter.Body.scale(this, scale, scale);
+ this.radius *= scale
if (this.radius > this.maxRadius) this.endCycle = 0;
}
diff --git a/js/engine.js b/js/engine.js
index 6527b16..12ddd35 100644
--- a/js/engine.js
+++ b/js/engine.js
@@ -222,7 +222,7 @@ function collisionChecks(event) {
if (obj.classType === "body" && obj.speed > 6) {
const v = Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity));
if (v > 9) {
- let dmg = b.dmgScale * (v * obj.mass * 0.07) * mod.throwChargeRate;
+ let dmg = b.dmgScale * v * obj.mass * 0.065 * mod.throwChargeRate;
if (mod.isCrit && !mob[k].seePlayer.recall && !mob[k].shield) dmg *= 5
if (mob[k].isShielded) dmg *= 0.5
mob[k].damage(dmg, true);
diff --git a/js/level.js b/js/level.js
index 0ea1d44..5323108 100644
--- a/js/level.js
+++ b/js/level.js
@@ -11,15 +11,15 @@ const level = {
start() {
if (build.isURLBuild && level.levelsCleared === 0) build.onLoadPowerUps();
if (level.levelsCleared === 0) { //this code only runs on the first level
- // game.enableConstructMode() //used to build maps in testing mode
// level.difficultyIncrease(4)
+ // game.enableConstructMode() //used to build maps in testing mode
// mech.isStealth = true;
// mod.giveMod("superfluidity");
// b.giveGuns("ice IX")
// mech.setField("plasma torch")
level.intro(); //starting level
- // level.sewer()
+ // level.sewers();
// level.testing();
// level.template()
// level.bosses();
@@ -64,20 +64,26 @@ const level = {
mech.maxHealth += 0.05 * powerUps.totalPowerUps
if (powerUps.totalPowerUps) game.makeTextLog(" max health increased by " + (0.05 * powerUps.totalPowerUps * 100).toFixed(0) + "%", 300)
}
+ if (mod.isHealLowHealth && mech.health < mech.maxHealth * 0.5 * game.healScale) {
+ mech.health = mech.maxHealth * 0.5 * game.healScale
+ mech.displayHealth();
+ }
},
//******************************************************************************************************************
//******************************************************************************************************************
//******************************************************************************************************************
//******************************************************************************************************************
- rotor(x, y, rotate = 0, radius = 900, width = 50, density = 0.001) {
+ rotor(x, y, rotate = 0, radius = 900, width = 50, density = 0.0005) {
const rotor1 = Matter.Bodies.rectangle(x, y, width, radius, {
density: density,
- isNotSticky: true
+ isNotSticky: true,
+ isNotHoldable: true
});
const rotor2 = Matter.Bodies.rectangle(x, y, width, radius, {
angle: Math.PI / 2,
density: density,
- isNotSticky: true
+ isNotSticky: true,
+ isNotHoldable: true
});
rotor = Body.create({ //combine rotor1 and rotor2
parts: [rotor1, rotor2],
@@ -129,7 +135,6 @@ const level = {
},
button(x, y, width = 70, height = 20) {
spawn.mapVertex(x + 35, y + 27, "70 10 -70 10 -40 -10 40 -10");
- // map[map.length - 1].friction = 1;
return {
isUp: false,
min: {
@@ -174,7 +179,7 @@ const level = {
height: height,
maxHeight: height,
query() {
- if (this.height > 0 && Matter.Query.region([player], this).length) {
+ if (this.height > 0 && Matter.Query.region([player], this).length && !mech.isStealth) {
mech.damage(damage)
const drain = 0.005
if (mech.energy > drain) mech.energy -= drain
@@ -242,11 +247,11 @@ const level = {
color: "hsl(138, 10%, 80%)" //c4f4f4
});
- spawn.mapRect(-400, -500, 100, 600); //left entrance wall
- spawn.mapRect(-400, -500, 3550, 100); //ceiling
- spawn.mapRect(-400, 0, 3000, 100); //floor
- spawn.mapRect(300, -500, 100, 400); //right entrance wall
- spawn.bodyRect(340, -100, 25, 100);
+ spawn.mapRect(-500, -600, 200, 800); //left entrance wall
+ spawn.mapRect(-400, -600, 3550, 200); //ceiling
+ spawn.mapRect(-400, 0, 3000, 200); //floor
+ spawn.mapRect(300, -500, 50, 400); //right entrance wall
+ spawn.bodyRect(312, -100, 25, 100);
spawn.bodyRect(1450, -300, 150, 50);
const xPos = shuffle([600, 1250, 2000]);
@@ -257,9 +262,9 @@ const level = {
spawn.bodyRect(3100, 410, 75, 100);
spawn.bodyRect(2450, -25, 250, 25);
- spawn.mapRect(3050, -500, 100, 700); //right down tube wall
- spawn.mapRect(3050, 100, 1250, 100); //tube right exit ceiling
- spawn.mapRect(4200, 100, 100, 1800);
+ spawn.mapRect(3050, -600, 200, 800); //right down tube wall
+ spawn.mapRect(3100, 0, 1200, 200); //tube right exit ceiling
+ spawn.mapRect(4200, 0, 200, 1900);
spawn.mapRect(3000, 400, 1000, 1250);
spawn.mapRect(3000, 1925, 1000, 150);
@@ -268,21 +273,20 @@ const level = {
spawn.mapRect(3100, 350, 800, 100);
spawn.mapRect(3100, 2025, 800, 100);
- spawn.mapRect(2500, 0, 100, 1950); //left down tube wall
- spawn.mapRect(600, 2300, 3750, 100);
+ spawn.mapRect(2400, 0, 200, 1950); //left down tube wall
+ spawn.mapRect(600, 2300, 3750, 200);
spawn.bodyRect(3800, 275, 125, 125);
- spawn.mapRect(4200, 1800, 5000, 100);
- spawn.mapRect(4250, 2300, 100, 400);
- spawn.mapRect(4250, 2300, 100, 400);
+ spawn.mapRect(4200, 1700, 5000, 200);
+ spawn.mapRect(4150, 2300, 200, 400);
- spawn.mapRect(600, 1800, 2000, 100); //bottom left room ceiling
- spawn.mapRect(600, 1800, 100, 600); //left wall
+ spawn.mapRect(600, 1700, 2000, 200); //bottom left room ceiling
+ spawn.mapRect(500, 1700, 200, 800); //left wall
spawn.mapRect(1775, 2225, 550, 125);
spawn.mapRect(675, 1875, 325, 150);
- spawn.mapRect(4450, 2900, 4900, 100); //boss room floor
- spawn.mapRect(4250, 2600, 300, 400);
+ spawn.mapRect(4450, 2900, 4900, 200); //boss room floor
+ spawn.mapRect(4150, 2600, 400, 500);
spawn.mapRect(6250, 2675, 700, 325);
spawn.mapRect(8000, 2600, 600, 400);
spawn.bodyRect(5875, 2725, 200, 200);
@@ -293,30 +297,33 @@ const level = {
spawn.mapRect(6250, 1875, 700, 150);
spawn.mapRect(8000, 1875, 600, 150);
- spawn.mapRect(9100, 1800, 900, 400); //exit
- spawn.mapRect(9100, 2600, 900, 400);
- spawn.mapRect(9900, 2125, 100, 575); //back wall
+ spawn.mapRect(9100, 1700, 900, 500); //exit
+ spawn.mapRect(9100, 2600, 900, 500);
+ spawn.mapRect(9900, 1700, 200, 1400); //back wall
spawn.mapRect(9300, 2150, 50, 250);
spawn.mapRect(9300, 2590, 650, 25);
spawn.mapRect(9700, 2580, 100, 50);
- spawn.randomBoss(1300, 2100, 0.6);
- spawn.randomMob(8300, 2100, 0.3);
- spawn.randomSmallMob(2575, -75, 0.3); //entrance
- spawn.randomMob(8125, 2450, 0.3);
- spawn.randomSmallMob(3200, 250, 0.4);
- spawn.randomMob(2425, 2150, 0.4);
- spawn.randomSmallMob(3825, 300, 0.4);
- spawn.randomMob(3800, 2175, 0.5);
- spawn.randomSmallMob(1100, -300, 0.5); //entrance
- spawn.randomMob(4450, 2500, 0.6);
- spawn.randomMob(6350, 2525, 0.6);
- spawn.randomBoss(9200, 2400, 0.5);
- spawn.randomSmallMob(1900, -250, 0.7); //entrance
- spawn.randomMob(1500, 2100, 0.8);
- spawn.randomSmallMob(1700, -150, 0.8); //entrance
- spawn.randomMob(8800, 2725, 0.9);
- if (game.difficulty > 3) spawn.randomLevelBoss(6000, 2300, ["shooterBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss"]);
+ spawn.randomBoss(1300, 2100, 0.5);
+ spawn.randomMob(8300, 2100, 0.2);
+ spawn.randomSmallMob(2575, -75, 0.2); //entrance
+ spawn.randomMob(8125, 2450, 0.25);
+ spawn.randomSmallMob(3200, 250, 0.3);
+ spawn.randomMob(2425, 2150, 0.3);
+ spawn.randomSmallMob(3500, 250, 0.4);
+ spawn.randomMob(3800, 2175, 0.4);
+ spawn.randomSmallMob(1100, -300, 0.4); //entrance
+ spawn.randomMob(4450, 2500, 0.5);
+ spawn.randomMob(6350, 2525, 0.5);
+ spawn.randomBoss(9200, 2400, 0.6);
+ spawn.randomSmallMob(1900, -250, 0.6); //entrance
+ spawn.randomMob(1500, 2100, 0.7);
+ spawn.randomSmallMob(1700, -150, 0.7); //entrance
+ spawn.randomMob(8800, 2725, 0.8);
+ spawn.randomMob(7300, 2200, 0.8);
+ spawn.randomMob(2075, 2025, 0.8);
+ spawn.randomMob(3475, 2175, 0.8);
+ if (game.difficulty > 3) spawn.randomLevelBoss(6000, 2300, ["spiderBoss", "launcherBoss", "laserTargetingBoss"]);
},
template() {
level.custom = () => {
@@ -2167,10 +2174,6 @@ const level = {
level.difficultyIncrease(game.difficultyMode) //increase difficulty based on modes
if (game.isEasyMode && level.levelsCleared % 2) level.difficultyDecrease(1);
game.clearNow = true; //triggers in game.clearMap to remove all physics bodies and setup for new map
- if (mod.isHealLowHealth && mech.health < mech.maxHealth * 0.5) {
- mech.health = mech.maxHealth * 0.5
- mech.displayHealth();
- }
},
playerExitCheck() {
if (
diff --git a/js/mob.js b/js/mob.js
index d499709..a59da8e 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -1016,20 +1016,7 @@ const mobs = {
b.spore(this.position)
}
}
- if (Math.random() < mod.isBotSpawner) {
- if (Math.random() < 0.1) { //very low chance of plasma bot
- b.plasmaBot(this.position)
- } else if (Math.random() < 0.25) {
- b.nailBot(this.position)
- } else if (Math.random() < 0.33) {
- b.laserBot(this.position)
- } else if (Math.random() < 0.5) {
- b.foamBot(this.position)
- } else {
- b.boomBot(this.position)
- }
- // if (mech.energy > 0.33) mech.energy -= 0.33
- }
+ if (Math.random() < mod.isBotSpawner) b.randomBot(this.position, false)
if (mod.isExplodeMob) b.explosion(this.position, Math.min(450, Math.sqrt(this.mass + 3) * 80))
if (mod.nailsDeathMob) b.targetedNail(this.position, mod.nailsDeathMob)
} else if (mod.isShieldAmmo && this.shield) {
@@ -1039,7 +1026,7 @@ const mobs = {
} else if (Math.random() < 0.5 && !mod.isSuperDeterminism) {
type = "reroll"
}
- for (let i = 0; i < 3; i++) {
+ for (let i = 0, len = 1 + Math.ceil(2 * Math.random()); i < len; i++) {
powerUps.spawn(this.position.x, this.position.y, type);
if (Math.random() < mod.bayesian) powerUps.spawn(this.position.x, this.position.y, type);
}
diff --git a/js/mods.js b/js/mods.js
index ed03a48..ed49abb 100644
--- a/js/mods.js
+++ b/js/mods.js
@@ -78,9 +78,12 @@ const mod = {
if (mod.isRest && player.speed < 1) dmg *= 1.20;
if (mod.isEnergyDamage) dmg *= 1 + mech.energy / 5.5;
if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.006
- if (mod.isRerollDamage) dmg *= 1 + 0.06 * powerUps.reroll.rerolls
+ if (mod.isRerollDamage) dmg *= 1 + 0.05 * powerUps.reroll.rerolls
return dmg * mod.slowFire
},
+ totalBots() {
+ return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount + mod.boomBotCount + mod.plasmaBotCount
+ },
mods: [{
name: "capacitor",
// nameInfo: "",
@@ -131,22 +134,6 @@ const mod = {
mod.isRest = false;
}
},
- {
- name: "perturbation theory",
- description: "increase damage by 6%
for each reroll in your inventory",
- maxCount: 1,
- count: 0,
- allowed() {
- return powerUps.reroll.rerolls > 1 || build.isCustomSelection
- },
- requires: "at least 2 rerolls",
- effect() {
- mod.isRerollDamage = true;
- },
- remove() {
- mod.isRerollDamage = false;
- }
- },
{
name: "kinetic bombardment",
description: "increase damage by up to 33%
at a distance of 40 steps from the target",
@@ -227,6 +214,42 @@ const mod = {
mod.isHarmDamage = false;
}
},
+ {
+ name: "perturbation theory",
+ description: "increase damage by 5%
for each of your rerolls",
+ maxCount: 1,
+ count: 0,
+ allowed() {
+ return powerUps.reroll.rerolls > 3 || build.isCustomSelection
+ },
+ requires: "at least 4 rerolls",
+ effect() {
+ mod.isRerollDamage = true;
+ },
+ remove() {
+ mod.isRerollDamage = false;
+ }
+ },
+ {
+ name: "Ψ(t) collapse",
+ description: "33% decreased delay after firing
if you have no rerolls",
+ maxCount: 1,
+ count: 0,
+ allowed() {
+ return powerUps.reroll.rerolls === 0
+ },
+ requires: "no rerolls",
+ effect() {
+ mod.isRerollHaste = true;
+ mod.rerollHaste = 0.666;
+ b.setFireCD();
+ },
+ remove() {
+ mod.isRerollHaste = false;
+ mod.rerollHaste = 1;
+ b.setFireCD();
+ }
+ },
{
name: "electrostatic discharge",
description: "increase damage by 25%
25% increased delay after firing",
@@ -435,13 +458,29 @@ const mod = {
mod.plasmaBotCount = 0;
}
},
+ {
+ name: "bot fabrication",
+ description: "anytime you collect 3 rerolls
use them to build a random bot",
+ maxCount: 1,
+ count: 0,
+ allowed() {
+ return powerUps.reroll.rerolls > 2 || build.isCustomSelection
+ },
+ requires: "at least 3 rerolls",
+ effect() {
+ mob.isRerollBots = true;
+ },
+ remove() {
+ mob.isRerollBots = false;
+ }
+ },
{
name: "scrap bots",
description: "12% chance to build a bot after killing a mob
the bot only functions until the end of the level",
maxCount: 6,
count: 0,
allowed() {
- return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount + mod.boomBotCount + mod.plasmaBotCount > 0
+ return mod.totalBots() > 0
},
requires: "a bot",
effect() {
@@ -451,6 +490,22 @@ const mod = {
mod.isBotSpawner = 0;
}
},
+ {
+ name: "perimeter defense",
+ description: "reduce harm by 6%
for each of your permanent bots",
+ maxCount: 1,
+ count: 0,
+ allowed() {
+ return mod.totalBots() > 1
+ },
+ requires: "2 or more bots",
+ effect() {
+ mod.isBotArmor = true
+ },
+ remove() {
+ mod.isBotArmor = false
+ }
+ },
{
name: "bot replication",
description: "duplicate your permanent bots
remove 90% of your ammo",
@@ -458,7 +513,7 @@ const mod = {
count: 0,
// isNonRefundable: true,
allowed() {
- return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount + mod.boomBotCount + mod.plasmaBotCount > 1
+ return mod.totalBots() > 1
},
requires: "2 or more bots",
effect() {
@@ -468,7 +523,6 @@ const mod = {
b.guns[i].ammo = Math.floor(b.guns[i].ammo * 0.1);
}
}
-
//double bots
for (let i = 0; i < mod.nailBotCount; i++) {
b.nailBot();
@@ -493,29 +547,6 @@ const mod = {
},
remove() {}
},
- // {
- // name: "ablative mines",
- // description: "rebuild your broken parts as a mine
chance to occur after being harmed",
- // maxCount: 1,
- // count: 0,
- // allowed() {
- // return true
- // },
- // requires: "",
- // effect() {
- // mod.isMineOnDamage = true;
- // b.mine({
- // x: mech.pos.x,
- // y: mech.pos.y - 80
- // }, {
- // x: 0,
- // y: 0
- // })
- // },
- // remove() {
- // mod.isMineOnDamage = false;
- // }
- // },
{
name: "ablative drones",
description: "rebuild your broken parts as drones
chance to occur after receiving harm",
@@ -535,6 +566,22 @@ const mod = {
mod.isDroneOnDamage = false;
}
},
+ {
+ name: "mine synthesis",
+ description: "drop a mine after picking up a power up",
+ maxCount: 1,
+ count: 0,
+ allowed() {
+ return true
+ },
+ requires: "",
+ effect() {
+ mod.isMineDrop = true;
+ },
+ remove() {
+ mod.isMineDrop = false;
+ }
+ },
{
name: "squirrel-cage rotor",
description: "jump higher and move faster",
@@ -557,7 +604,7 @@ const mod = {
},
{
name: "Pauli exclusion",
- description: `after receiving harm from a collision
immune to harm for 1 second`,
+ description: `immune to harm for 1 second
after receiving harm from a collision`,
maxCount: 9,
count: 0,
allowed() {
@@ -604,6 +651,22 @@ const mod = {
mod.isSlowFPS = false;
}
},
+ {
+ name: "liquid cooling",
+ description: `freeze all mobs for 6 seconds
after receiving harm`,
+ maxCount: 1,
+ count: 0,
+ allowed() {
+ return mod.isSlowFPS
+ },
+ requires: "clock gating",
+ effect() {
+ mod.isHarmFreeze = true;
+ },
+ remove() {
+ mod.isHarmFreeze = false;
+ }
+ },
{
name: "entanglement",
nameInfo: "",
@@ -790,7 +853,7 @@ const mod = {
{
name: "negentropy",
description: "at the start of each level
heal up to 50% of maximum health",
- maxCount: 9,
+ maxCount: 1,
count: 0,
allowed() {
return mech.maxHealth > 1 || mod.isArmorFromPowerUps
@@ -843,7 +906,7 @@ const mod = {
powerUps.reroll.changeRerolls(0)
}, 1000);
},
- description: "heal to 60% health instead of dying
consumes 1 reroll",
+ description: "heal to full health instead of dying
consumes 1 reroll",
maxCount: 1,
count: 0,
allowed() {
@@ -862,7 +925,7 @@ const mod = {
},
{
name: "bubble fusion",
- description: "after destroying a mob's shield
spawn 3 heals, ammo, or rerolls",
+ description: "after destroying a mob's shield
spawn 2-3 heals, ammo, or rerolls",
maxCount: 1,
count: 0,
allowed() {
@@ -894,7 +957,7 @@ const mod = {
},
{
name: "logistics",
- description: "ammo power ups add to your current gun
spawn 5 ammo",
+ description: "ammo power ups add to your current gun
spawn 6 ammo",
maxCount: 1,
count: 0,
allowed() {
@@ -903,7 +966,7 @@ const mod = {
requires: "at least 2 guns",
effect() {
mod.isAmmoForGun = true;
- for (let i = 0; i < 5; i++) {
+ for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
}
@@ -2313,5 +2376,11 @@ const mod = {
isAoESlow: null,
isHarmArmor: null,
isTurret: null,
- isRerollDamage: null
+ isRerollDamage: null,
+ isHarmFreeze: null,
+ isBotArmor: null,
+ isRerollHaste: null,
+ rerollHaste: null,
+ isMineDrop: null,
+ isRerollBots: null
}
\ No newline at end of file
diff --git a/js/player.js b/js/player.js
index fa9e20f..e4aecc2 100644
--- a/js/player.js
+++ b/js/player.js
@@ -306,6 +306,7 @@ const mech = {
if (mod.mods[i].count < mod.mods[i].maxCount &&
!mod.mods[i].isNonRefundable &&
mod.mods[i].name !== "quantum immortality" &&
+ mod.mods[i].name !== "Born rule" &&
mod.mods[i].allowed()
) options.push(i);
}
@@ -440,6 +441,7 @@ const mech = {
let dmg = 1
dmg *= mech.fieldHarmReduction
dmg *= mod.isSlowFPS ? 0.85 : 1
+ if (mod.isBotArmor) dmg *= 0.94 ** mod.totalBots()
if (mod.isHarmArmor && mech.lastHarmCycle + 600 > mech.cycle) dmg *= 0.5;
if (mod.energyRegen === 0) dmg *= 0.5 //0.22 + 0.78 * mech.energy //77% damage reduction at zero energy
if (mod.isTurret && mech.crouch) dmg /= 2;
@@ -467,7 +469,7 @@ const mech = {
if (mod.isDeathAvoid && powerUps.reroll.rerolls) { //&& Math.random() < 0.5
powerUps.reroll.changeRerolls(-1)
- mech.energy = mech.maxEnergy * 0.6
+ mech.energy = mech.maxEnergy
// if (mech.energy < 0.05) mech.energy = 0.05
mech.immuneCycle = mech.cycle + 120 //disable this.immuneCycle bonus seconds
game.makeTextLog(" death avoided
1 reroll consumed", 420)
@@ -496,7 +498,7 @@ const mech = {
if (mech.health < 0 || isNaN(mech.health)) {
if (mod.isDeathAvoid && powerUps.reroll.rerolls > 0) { //&& Math.random() < 0.5
powerUps.reroll.changeRerolls(-1)
- mech.health = mech.maxHealth * 0.6
+ mech.health = mech.maxHealth * game.healScale
// if (mech.health < 0.05) mech.health = 0.05
mech.immuneCycle = mech.cycle + 120 //disable this.immuneCycle bonus seconds
game.makeTextLog(" death avoided
1 reroll consumed", 420)
@@ -540,6 +542,11 @@ const mech = {
game.fpsInterval = 1000 / game.fpsCap;
//how long to wait to return to normal fps
mech.defaultFPSCycle = mech.cycle + 20 + Math.min(90, Math.floor(200 * dmg))
+ if (mod.isHarmFreeze) { //freeze all mobs
+ for (let i = 0, len = mob.length; i < len; i++) {
+ mobs.statusSlow(mob[i], 360)
+ }
+ }
} else {
if (dmg > 0.05) { // freeze game for high damage hits
game.fpsCap = 4 //40 - Math.min(25, 100 * dmg)
@@ -938,6 +945,13 @@ const mech = {
});
if (dist2 < 5000 && !game.isChoosing) { //use power up if it is close enough
if (mod.isMassEnergy) mech.energy = mech.maxEnergy * 3;
+ if (mod.isMineDrop) b.mine({
+ x: mech.pos.x,
+ y: mech.pos.y
+ }, {
+ x: 0,
+ y: 0
+ }, 0, mod.isMineAmmoBack)
Matter.Body.setVelocity(player, { //player knock back, after grabbing power up
x: player.velocity.x + ((powerUp[i].velocity.x * powerUp[i].mass) / player.mass) * 0.3,
y: player.velocity.y + ((powerUp[i].velocity.y * powerUp[i].mass) / player.mass) * 0.3
diff --git a/js/powerup.js b/js/powerup.js
index 00dba3a..78b6fa0 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -54,9 +54,27 @@ const powerUps = {
changeRerolls(amount) {
powerUps.reroll.rerolls += amount
if (powerUps.reroll.rerolls < 0) powerUps.reroll.rerolls = 0
+
+ if (mob.isRerollBots) {
+ const limit = 3
+ for (; powerUps.reroll.rerolls > limit - 1; powerUps.reroll.rerolls -= limit) {
+ b.randomBot()
+ }
+ }
+
+
if (mod.isDeathAvoid && document.getElementById("mod-anthropic")) {
document.getElementById("mod-anthropic").innerHTML = `(${powerUps.reroll.rerolls})`
}
+ if (mod.isRerollHaste) {
+ if (powerUps.reroll.rerolls === 0) {
+ mod.rerollHaste = 0.66;
+ b.setFireCD();
+ } else {
+ mod.rerollHaste = 1;
+ b.setFireCD();
+ }
+ }
},
diceText() {
const r = powerUps.reroll.rerolls
diff --git a/todo.txt b/todo.txt
index 72948e0..572cc41 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,15 +1,34 @@
+bubble fusion drops 2-3 power ups (down from 3)
+perturbation theory: damage is 5% (down from 6%) per reroll
+ but the mod will not show up until you have 4 rerolls stockpiled
+sporeangium grow faster when stuck to a mob
+
+mod: liquid cooling - freeze all mobs for 6 seconds after receiving harm
+mod: perimeter defense - gain 6% harm reduction for each bot
+mod: bot fabrication - anytime you have 3 rerolls, convert them into a random bot
+mod: Ψ(x) collapse - 33% haste, if you have no rerolls
+mod: mine synthesis - drop a mine after picking up a power up
+
************** TODO - n-gon **************
-mod: taking damage slows (or stuns) all mobs on the map
- requires the mod that slows time, overclock
+map: laboratory
+ rooms with switches that change physics
+ gravity room
+ portal room
+ laser room
+ radiation room
+
+map: prison
+ doors linked to buttons
+ mobs inside the doors?
button: blocks that are on the button at an angle will slowly slide off the button
maybe just avoid long blocks near the button?
maybe actively hold the button in place?
-hazards should affect blocks, bullets, mobs
- and do mob damage?
+hazards should slow blocks, bullets, mobs?
+ mob damage?
rotor doesn't work with
plasma torch