mod: causality bots - before you rewind, build bots that protect you for for 7 seconds

mod grenade: causality bombs - before you rewind, drop some grenades
This commit is contained in:
landgreen
2020-12-09 17:39:13 -08:00
parent 15f2c00fe8
commit 46fbb90d8d
6 changed files with 625 additions and 395 deletions

View File

@@ -108,21 +108,6 @@ const mod = {
return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount + mod.boomBotCount + mod.plasmaBotCount + mod.orbitBotCount
},
mods: [{
name: "integrated armament",
description: "increase <strong class='color-d'>damage</strong> by <strong>25%</strong><br>your inventory can only hold <strong>1 gun</strong>",
maxCount: 1,
count: 0,
allowed() {
return b.inventory.length < 2
},
requires: "no more than 1 gun",
effect() {
mod.isOneGun = true;
},
remove() {
mod.isOneGun = false;
}
}, {
name: "capacitor",
description: "increase <strong class='color-d'>damage</strong> by <strong>1%</strong><br>for every <strong>7</strong> stored <strong class='color-f'>energy</strong>",
maxCount: 1,
@@ -176,7 +161,7 @@ const mod = {
maxCount: 1,
count: 0,
allowed() {
return mod.isEnergyLoss && mech.maxEnergy === 1 && !mod.isMissileField && !mod.isSporeField && !mod.isTimeAvoidDeath
return mod.isEnergyLoss && mech.maxEnergy === 1 && !mod.isMissileField && !mod.isSporeField && !mod.isRewindAvoidDeath
},
requires: "heat engine, not max energy increase, CPT, missile or spore nano-scale",
effect() {
@@ -210,9 +195,9 @@ const mod = {
maxCount: 6,
count: 0,
allowed() {
return true
return mech.Fx === 0.016
},
requires: "",
requires: "base movement speed",
effect: () => {
mod.restDamage += 0.25
},
@@ -252,6 +237,22 @@ const mod = {
mod.isAcidDmg = false;
}
},
{
name: "integrated armament",
description: "increase <strong class='color-d'>damage</strong> by <strong>25%</strong><br>your inventory can only hold <strong>1 gun</strong>",
maxCount: 1,
count: 0,
allowed() {
return b.inventory.length < 2
},
requires: "no more than 1 gun",
effect() {
mod.isOneGun = true;
},
remove() {
mod.isOneGun = false;
}
},
{
name: "negative feedback",
description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for every <strong>10</strong> missing base <strong>health</strong>",
@@ -371,78 +372,6 @@ const mod = {
mod.throwChargeRate = 1
}
},
{
name: "reaction inhibitor",
description: "mobs spawn with <strong>12%</strong> less <strong>health</strong>",
maxCount: 3,
count: 0,
allowed() {
return mod.nailsDeathMob || mod.sporesOnDeath || mod.isExplodeMob
},
requires: "zoospore vector or impact shear or thermal runaway",
effect: () => {
mod.mobSpawnWithHealth *= 0.88
//set all mobs at full health to 0.85
for (let i = 0; i < mob.length; i++) {
if (mob.health > mod.mobSpawnWithHealth) mob.health = mod.mobSpawnWithHealth
}
},
remove() {
mod.mobSpawnWithHealth = 1;
}
},
{
name: "zoospore vector",
description: "mobs produce <strong class='color-p' style='letter-spacing: 2px;'>spores</strong> when they <strong>die</strong><br><strong>9%</strong> chance",
maxCount: 9,
count: 0,
allowed() {
return !mod.nailsDeathMob && !mod.isExplodeMob
},
requires: "not impact shear or thermal runaway",
effect() {
mod.sporesOnDeath += 0.09;
for (let i = 0; i < 8; i++) {
b.spore(mech.pos)
}
},
remove() {
mod.sporesOnDeath = 0;
}
},
{
name: "impact shear",
description: "mobs release a <strong>nail</strong> when they <strong>die</strong><br>nails target nearby mobs",
maxCount: 9,
count: 0,
allowed() {
return !mod.sporesOnDeath && !mod.isExplodeMob
},
requires: "not zoospore vector or thermal runaway",
effect: () => {
mod.nailsDeathMob++
},
remove() {
mod.nailsDeathMob = 0;
}
},
{
name: "thermal runaway",
description: "mobs <strong class='color-e'>explode</strong> when they <strong>die</strong><br><em>be careful</em>",
maxCount: 1,
count: 0,
allowed() {
return (mod.haveGunCheck("missiles") || mod.isIncendiary || (mod.haveGunCheck("grenades") && !mod.isNeutronBomb) || mod.haveGunCheck("vacuum bomb") || mod.isPulseLaser || mod.isMissileField || mod.boomBotCount > 1 || mod.isFlechetteExplode) && !mod.sporesOnDeath && !mod.nailsDeathMob
},
requires: "an explosive damage source, not zoospore vector or impact shear",
effect: () => {
mod.isExplodeMob = true;
},
remove() {
mod.isExplodeMob = false;
}
},
{
name: "ammonium nitrate",
description: "increase <strong class='color-e'>explosive</strong> <strong class='color-d'>damage</strong> by <strong>20%</strong><br>increase <strong class='color-e'>explosive</strong> <strong>radius</strong> by <strong>20%</strong>",
@@ -508,15 +437,87 @@ const mod = {
mod.isImmuneExplosion = false;
}
},
{
name: "thermal runaway",
description: "mobs <strong class='color-e'>explode</strong> when they <strong>die</strong><br><em>be careful</em>",
maxCount: 1,
count: 0,
allowed() {
return (mod.haveGunCheck("missiles") || mod.isIncendiary || (mod.haveGunCheck("grenades") && !mod.isNeutronBomb) || mod.haveGunCheck("vacuum bomb") || mod.isPulseLaser || mod.isMissileField || mod.boomBotCount > 1 || mod.isFlechetteExplode) && !mod.sporesOnDeath && !mod.nailsDeathMob && !mod.isBotSpawner
},
requires: "an explosive damage source, no other mob death mods",
effect: () => {
mod.isExplodeMob = true;
},
remove() {
mod.isExplodeMob = false;
}
},
{
name: "reaction inhibitor",
description: "mobs spawn with <strong>12%</strong> less <strong>health</strong>",
maxCount: 3,
count: 0,
allowed() {
return mod.nailsDeathMob || mod.sporesOnDeath || mod.isExplodeMob || mod.isBotSpawner
},
requires: "any mob death mod",
effect: () => {
mod.mobSpawnWithHealth *= 0.88
//set all mobs at full health to 0.85
for (let i = 0; i < mob.length; i++) {
if (mob.health > mod.mobSpawnWithHealth) mob.health = mod.mobSpawnWithHealth
}
},
remove() {
mod.mobSpawnWithHealth = 1;
}
},
{
name: "zoospore vector",
description: "mobs produce <strong class='color-p' style='letter-spacing: 2px;'>spores</strong> when they <strong>die</strong><br><strong>9%</strong> chance",
maxCount: 9,
count: 0,
allowed() {
return !mod.nailsDeathMob && !mod.isExplodeMob && !mod.isBotSpawner
},
requires: "no other mob death mods",
effect() {
mod.sporesOnDeath += 0.09;
for (let i = 0; i < 8; i++) {
b.spore(mech.pos)
}
},
remove() {
mod.sporesOnDeath = 0;
}
},
{
name: "impact shear",
description: "mobs release a <strong>nail</strong> when they <strong>die</strong><br>nails target nearby mobs",
maxCount: 9,
count: 0,
allowed() {
return !mod.sporesOnDeath && !mod.isExplodeMob && !mod.isBotSpawner
},
requires: "no other mob death mods",
effect: () => {
mod.nailsDeathMob++
},
remove() {
mod.nailsDeathMob = 0;
}
},
{
name: "scrap bots",
description: "<strong>20%</strong> chance to build a <strong>bot</strong> after killing a mob<br>the bot lasts for about <strong>20</strong> seconds",
maxCount: 3,
count: 0,
allowed() {
return mod.totalBots() > 0
return mod.totalBots() > 0 && !mod.sporesOnDeath && !mod.nailsDeathMob && !mod.isExplodeMob
},
requires: "a bot",
requires: "a bot and no other mob death mods",
effect() {
mod.isBotSpawner += 0.20;
},
@@ -524,23 +525,6 @@ const mod = {
mod.isBotSpawner = 0;
}
},
{
name: "bot fabrication",
description: "anytime you collect <strong>5</strong> <strong class='color-r'>rerolls</strong><br>use them to build a <strong>random bot</strong>",
maxCount: 1,
count: 0,
allowed() {
return powerUps.reroll.rerolls > 5 || build.isCustomSelection
},
requires: "at least 6 rerolls",
effect() {
mod.isRerollBots = true;
powerUps.reroll.changeRerolls(0)
},
remove() {
mod.isRerollBots = false;
}
},
{
name: "nail-bot",
description: "a bot fires <strong>nails</strong> at targets in line of sight",
@@ -664,9 +648,9 @@ const mod = {
maxCount: 9,
count: 0,
allowed() {
return true
return mech.maxEnergy > 0.5
},
requires: "",
requires: "maximum energy above 50%",
effect() {
mod.laserBotCount++;
b.laserBot();
@@ -746,6 +730,23 @@ const mod = {
}
}
},
{
name: "bot fabrication",
description: "anytime you collect <strong>5</strong> <strong class='color-r'>rerolls</strong><br>use them to build a <strong>random bot</strong>",
maxCount: 1,
count: 0,
allowed() {
return powerUps.reroll.rerolls > 5 || build.isCustomSelection
},
requires: "at least 6 rerolls",
effect() {
mod.isRerollBots = true;
powerUps.reroll.changeRerolls(0)
},
remove() {
mod.isRerollBots = false;
}
},
{
name: "perimeter defense",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>3%</strong><br>for each of your permanent <strong>bots</strong>",
@@ -1039,18 +1040,50 @@ const mod = {
},
{
name: "CPT reversal",
description: "<strong>rewind 1.5 - 5</strong> seconds to avoid <strong class='color-harm'>harm</strong><br>drains <strong>66 - 220</strong> <strong class='color-f'>energy</strong>",
description: "<strong class='color-rewind'>rewind</strong> <strong>1.5 - 5</strong> seconds to avoid <strong class='color-harm'>harm</strong><br>drains <strong>66 - 220</strong> <strong class='color-f'>energy</strong>",
maxCount: 1,
count: 0,
allowed() {
return mech.maxEnergy > 0.99 && (mech.fieldUpgrades[mech.fieldMode].name !== "nano-scale manufacturing" || mech.maxEnergy > 1) && mech.fieldUpgrades[mech.fieldMode].name !== "standing wave harmonics" && !mod.isEnergyHealth && !mod.isEnergyLoss && !mod.isPiezo
allowed() { //&& (mech.fieldUpgrades[mech.fieldMode].name !== "nano-scale manufacturing" || mech.maxEnergy > 1)
return mech.maxEnergy > 0.99 && mech.fieldUpgrades[mech.fieldMode].name !== "standing wave harmonics" && !mod.isEnergyHealth && !mod.isEnergyLoss && !mod.isPiezo
},
requires: "not nano-scale, mass-energy, standing wave, acute stress, piezoelectricity",
effect() {
mod.isTimeAvoidDeath = true;
mod.isRewindAvoidDeath = true;
},
remove() {
mod.isTimeAvoidDeath = false;
mod.isRewindAvoidDeath = false;
}
},
{
name: "causality bots",
description: "when you <strong class='color-rewind'>rewind</strong>, build some <strong>bots</strong><br>that protect you for about <strong>7</strong> seconds",
maxCount: 3,
count: 0,
allowed() {
return mod.isRewindAvoidDeath || mod.isRewindEnergy
},
requires: "CPT",
effect() {
mod.isRewindBot++;
},
remove() {
mod.isRewindBot = 0;
}
},
{
name: "causality bombs",
description: "before you <strong class='color-rewind'>rewind</strong> drop some <strong>grenades</strong>",
maxCount: 1,
count: 0,
allowed() {
return mod.isRewindAvoidDeath
},
requires: "CPT",
effect() {
mod.isRewindGrenade = true;
},
remove() {
mod.isRewindGrenade = false;
}
},
{
@@ -1059,7 +1092,7 @@ const mod = {
maxCount: 1,
count: 0,
allowed() {
return !mod.isEnergyHealth && !mod.isTimeAvoidDeath
return !mod.isEnergyHealth && !mod.isRewindAvoidDeath
},
requires: "not mass-energy equivalence, CPT reversal",
effect() {
@@ -1094,7 +1127,7 @@ const mod = {
maxCount: 1,
count: 0,
allowed() {
return !mod.isEnergyLoss && !mod.isPiezo && !mod.isTimeAvoidDeath && !mod.isSpeedHarm && mech.fieldUpgrades[mech.fieldMode].name !== "negative mass field"
return !mod.isEnergyLoss && !mod.isPiezo && !mod.isRewindAvoidDeath && !mod.isSpeedHarm && mech.fieldUpgrades[mech.fieldMode].name !== "negative mass field"
},
requires: "not piezoelectricity, acute stress response, 1st law, negative mass field",
effect: () => {
@@ -1163,7 +1196,7 @@ const mod = {
},
{
name: "energy conservation",
description: "<strong>7%</strong> of <strong class='color-d'>damage</strong> done recovered as <strong class='color-f'>energy</strong>",
description: "<strong>6%</strong> of <strong class='color-d'>damage</strong> done recovered as <strong class='color-f'>energy</strong>",
maxCount: 9,
count: 0,
allowed() {
@@ -1171,7 +1204,7 @@ const mod = {
},
requires: "some increased damage",
effect() {
mod.energySiphon += 0.07;
mod.energySiphon += 0.06;
},
remove() {
mod.energySiphon = 0;
@@ -2355,12 +2388,14 @@ const mod = {
allowed() {
return mod.haveGunCheck("grenades") && !mod.isVacuumBomb && !mod.isNeutronBomb
},
requires: "grenades, not vacuum bomb",
requires: "grenades, not vacuum bomb, neutron",
effect() {
mod.isRPG = true;
b.setGrenadeMode()
},
remove() {
mod.isRPG = false;
b.setGrenadeMode()
}
},
{
@@ -2374,17 +2409,11 @@ const mod = {
requires: "grenades, not rocket-propelled",
effect() {
mod.isVacuumBomb = true;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "grenades") b.guns[i].fire = b.guns[i].fireVacuum
}
b.setGrenadeMode()
},
remove() {
mod.isVacuumBomb = false;
if (!mod.isNeutronBomb) {
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "grenades") b.guns[i].fire = (mod.isNeutronBomb) ? b.guns[i].fireNeutron : b.guns[i].fireNormal
}
}
b.setGrenadeMode()
}
},
{
@@ -2398,15 +2427,11 @@ const mod = {
requires: "grenades, not rocket-propelled or fragmentation",
effect() {
mod.isNeutronBomb = true;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "grenades") b.guns[i].fire = b.guns[i].fireNeutron
}
b.setGrenadeMode()
},
remove() {
mod.isNeutronBomb = false;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "grenades") b.guns[i].fire = (mod.isVacuumBomb) ? b.guns[i].fireVacuum : b.guns[i].fireNormal
}
b.setGrenadeMode()
}
},
{
@@ -3671,5 +3696,7 @@ const mod = {
isBotDamage: null,
isBanish: null,
isMaxEnergyMod: null,
isLowEnergyDamage: null
isLowEnergyDamage: null,
isRewindBot: null,
isRewindGrenade: null
}