removed ice IX gun

reroll renamed -> research

spore damage increased 25%

ice IX has it's damage buffed by 50%, and freeze effect lasts 2s (up from 1s)
ice IX is no longer a gun
  but you can still get it for nano-scale field (and it's pretty strong)
tech: heavy water was removed

tech: correlated damage - duplication chance also gives % damage
(also added some minor nerfs to other duplication tech for balance)
This commit is contained in:
landgreen
2021-01-02 18:46:14 -08:00
parent ecb41e1a19
commit 79136db727
12 changed files with 282 additions and 247 deletions

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@
.jsbeautifyrc .jsbeautifyrc
.DS_Store .DS_Store
.DS_Store .DS_Store
.DS_Store

View File

@@ -41,6 +41,7 @@
<div id="dmg"></div> <div id="dmg"></div>
<div id="choose-background"></div> <div id="choose-background"></div>
<div id='construct'></div> <div id='construct'></div>
<!-- <input type="text" id="console" spellcheck="false" /> -->
<!-- contenteditable="true" --> <!-- contenteditable="true" -->
<!-- guns --> <!-- guns -->

View File

@@ -88,7 +88,7 @@ const b = {
}, },
fireCD: 1, fireCD: 1,
setFireCD() { setFireCD() {
b.fireCD = tech.fireRate * tech.slowFire * tech.rerollHaste * tech.aimDamage / tech.fastTime b.fireCD = tech.fireRate * tech.slowFire * tech.researchHaste * tech.aimDamage / tech.fastTime
}, },
fireAttributes(dir, rotate = true) { fireAttributes(dir, rotate = true) {
if (rotate) { if (rotate) {
@@ -1452,14 +1452,14 @@ const b = {
friction: 0, friction: 0,
frictionAir: 0.025, frictionAir: 0.025,
thrust: (tech.isFastSpores ? 0.001 : 0.0004) * (1 + 0.3 * (Math.random() - 0.5)), thrust: (tech.isFastSpores ? 0.001 : 0.0004) * (1 + 0.3 * (Math.random() - 0.5)),
dmg: tech.isMutualism ? 6 : 3, //2x bonus damage from tech.isMutualism dmg: tech.isMutualism ? 8 : 4, //2x bonus damage from tech.isMutualism
lookFrequency: 97 + Math.floor(117 * Math.random()), lookFrequency: 100 + Math.floor(117 * Math.random()),
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
category: cat.bullet, category: cat.bullet,
mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body
}, },
endCycle: simulation.cycle + Math.floor((540 + Math.floor(Math.random() * 360)) * tech.isBulletsLastLonger), endCycle: simulation.cycle + Math.floor((600 + Math.floor(Math.random() * 420)) * tech.isBulletsLastLonger),
minDmgSpeed: 0, minDmgSpeed: 0,
playerOffPosition: { //used when following player to keep spores separate playerOffPosition: { //used when following player to keep spores separate
x: 100 * (Math.random() - 0.5), x: 100 * (Math.random() - 0.5),
@@ -1568,8 +1568,8 @@ const b = {
friction: 0, friction: 0,
frictionAir: 0.10, frictionAir: 0.10,
restitution: 0.3, restitution: 0.3,
dmg: 0.15, //damage done in addition to the damage from momentum dmg: 0.29, //damage done in addition to the damage from momentum
lookFrequency: 10 + Math.floor(7 * Math.random()), lookFrequency: 14 + Math.floor(8 * Math.random()),
endCycle: simulation.cycle + 120 * tech.isBulletsLastLonger, //Math.floor((1200 + 420 * Math.random()) * tech.isBulletsLastLonger), endCycle: simulation.cycle + 120 * tech.isBulletsLastLonger, //Math.floor((1200 + 420 * Math.random()) * tech.isBulletsLastLonger),
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
@@ -1580,9 +1580,9 @@ const b = {
lockedOn: null, lockedOn: null,
isFollowMouse: true, isFollowMouse: true,
beforeDmg(who) { beforeDmg(who) {
mobs.statusSlow(who, 60) mobs.statusSlow(who, 120)
this.endCycle = simulation.cycle this.endCycle = simulation.cycle
if (tech.isHeavyWater) mobs.statusDoT(who, 0.15, 300) // if (tech.isHeavyWater) mobs.statusDoT(who, 0.15, 300)
if (tech.iceEnergy && !who.shield && !who.isShielded && who.dropPowerUp && who.alive) { if (tech.iceEnergy && !who.shield && !who.isShielded && who.dropPowerUp && who.alive) {
setTimeout(function() { setTimeout(function() {
if (!who.alive) { if (!who.alive) {
@@ -1597,7 +1597,7 @@ const b = {
// this.force.y += this.mass * 0.0002; // this.force.y += this.mass * 0.0002;
//find mob targets //find mob targets
if (!(simulation.cycle % this.lookFrequency)) { if (!(simulation.cycle % this.lookFrequency)) {
const scale = 1 - 0.09 / tech.isBulletsLastLonger //0.9 * tech.isBulletsLastLonger; const scale = 1 - 0.08 / tech.isBulletsLastLonger //0.9 * tech.isBulletsLastLonger;
Matter.Body.scale(this, scale, scale); Matter.Body.scale(this, scale, scale);
this.lockedOn = null; this.lockedOn = null;
let closeDist = Infinity; let closeDist = Infinity;
@@ -3535,23 +3535,23 @@ const b = {
} }
} }
}, },
{ // {
name: "ice IX", // name: "ice IX",
description: "synthesize <strong>short-lived</strong> ice crystals<br>crystals <strong>seek</strong> out and <strong class='color-s'>freeze</strong> mobs", // description: "synthesize <strong>short-lived</strong> ice crystals<br>crystals <strong>seek</strong> out and <strong class='color-s'>freeze</strong> mobs",
ammo: 0, // ammo: 0,
ammoPack: 64, // ammoPack: 64,
have: false, // have: false,
fire() { // fire() {
if (mech.crouch) { // if (mech.crouch) {
b.iceIX(10, 0.3) // b.iceIX(10, 0.3)
mech.fireCDcycle = mech.cycle + Math.floor(8 * b.fireCD); // cool down // mech.fireCDcycle = mech.cycle + Math.floor(8 * b.fireCD); // cool down
} else { // } else {
b.iceIX(2) // b.iceIX(2)
mech.fireCDcycle = mech.cycle + Math.floor(3 * b.fireCD); // cool down // mech.fireCDcycle = mech.cycle + Math.floor(3 * b.fireCD); // cool down
} // }
} // }
}, // },
{ {
name: "foam", name: "foam",
description: "spray bubbly foam that <strong>sticks</strong> to mobs<br><strong class='color-s'>slows</strong> mobs and does <strong class='color-d'>damage</strong> over time", description: "spray bubbly foam that <strong>sticks</strong> to mobs<br><strong class='color-s'>slows</strong> mobs and does <strong class='color-d'>damage</strong> over time",

View File

@@ -186,7 +186,7 @@ const build = {
<br><strong><em>fire delay</em></strong> decrease: ${((1-b.fireCD)*100).toFixed(0)}% <br><strong><em>fire delay</em></strong> decrease: ${((1-b.fireCD)*100).toFixed(0)}%
<br><strong class='color-dup'>duplication</strong> chance: ${(Math.min(1,tech.duplicationChance())*100).toFixed(0)}% <br><strong class='color-dup'>duplication</strong> chance: ${(Math.min(1,tech.duplicationChance())*100).toFixed(0)}%
<br> <br>
<br><strong class='color-r'>rerolls</strong>: ${powerUps.reroll.rerolls} <br><strong class='color-r'>research</strong>: ${powerUps.research.research}
<br><strong class='color-h'>health</strong>: (${(mech.health*100).toFixed(0)} / ${(mech.maxHealth*100).toFixed(0)}) &nbsp; <strong class='color-f'>energy</strong>: (${(mech.energy*100).toFixed(0)} / ${(mech.maxEnergy*100).toFixed(0)}) <br><strong class='color-h'>health</strong>: (${(mech.health*100).toFixed(0)} / ${(mech.maxHealth*100).toFixed(0)}) &nbsp; <strong class='color-f'>energy</strong>: (${(mech.energy*100).toFixed(0)} / ${(mech.maxEnergy*100).toFixed(0)})
<br>position: (${player.position.x.toFixed(1)}, ${player.position.y.toFixed(1)}) &nbsp; velocity: (${player.velocity.x.toFixed(1)}, ${player.velocity.y.toFixed(1)}) <br>position: (${player.position.x.toFixed(1)}, ${player.position.y.toFixed(1)}) &nbsp; velocity: (${player.velocity.x.toFixed(1)}, ${player.velocity.y.toFixed(1)})
<br>mouse: (${simulation.mouseInGame.x.toFixed(1)}, ${simulation.mouseInGame.y.toFixed(1)}) &nbsp; mass: ${player.mass.toFixed(1)} <br>mouse: (${simulation.mouseInGame.x.toFixed(1)}, ${simulation.mouseInGame.y.toFixed(1)}) &nbsp; mass: ${player.mass.toFixed(1)}
@@ -756,7 +756,7 @@ window.addEventListener("keydown", function(event) {
simulation.setZoom(); simulation.setZoom();
break break
case "`": case "`":
powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "reroll"); powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "research");
break break
case "1": case "1":
powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "heal"); powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "heal");

View File

@@ -61,7 +61,7 @@ const level = {
b.respawnBots(); b.respawnBots();
mech.resetHistory(); mech.resetHistory();
if (tech.isArmorFromPowerUps) { if (tech.isArmorFromPowerUps) {
const gain = Math.min(0.04 * powerUps.totalPowerUps, 0.44) const gain = Math.min(0.04 * powerUps.totalPowerUps, 0.40)
tech.armorFromPowerUps += gain tech.armorFromPowerUps += gain
mech.setMaxHealth(); mech.setMaxHealth();
// if (powerUps.totalPowerUps) simulation.makeTextLog("<span style='font-size:115%;'> max health increased by " + (gain * 100).toFixed(0) + "%</span>", 300) // if (powerUps.totalPowerUps) simulation.makeTextLog("<span style='font-size:115%;'> max health increased by " + (gain * 100).toFixed(0) + "%</span>", 300)
@@ -74,7 +74,7 @@ const level = {
// powerUps.heal.spawn(mech.pos.x + 60 * (Math.random() - 0.5), mech.pos.y + 60 * (Math.random() - 0.5), 50); // powerUps.heal.spawn(mech.pos.x + 60 * (Math.random() - 0.5), mech.pos.y + 60 * (Math.random() - 0.5), 50);
} }
} }
if (tech.isPerpetualReroll) powerUps.spawn(mech.pos.x + 60 * (Math.random() - 0.5), mech.pos.y + 60 * (Math.random() - 0.5), "reroll", false); if (tech.isPerpetualReroll) powerUps.spawn(mech.pos.x + 60 * (Math.random() - 0.5), mech.pos.y + 60 * (Math.random() - 0.5), "research", false);
if (tech.isPerpetualAmmo) { if (tech.isPerpetualAmmo) {
powerUps.spawn(mech.pos.x + 60 * (Math.random() - 0.5), mech.pos.y + 60 * (Math.random() - 0.5), "ammo", false); powerUps.spawn(mech.pos.x + 60 * (Math.random() - 0.5), mech.pos.y + 60 * (Math.random() - 0.5), "ammo", false);
powerUps.spawn(mech.pos.x + 60 * (Math.random() - 0.5), mech.pos.y + 60 * (Math.random() - 0.5), "ammo", false); powerUps.spawn(mech.pos.x + 60 * (Math.random() - 0.5), mech.pos.y + 60 * (Math.random() - 0.5), "ammo", false);
@@ -115,6 +115,20 @@ const level = {
// hazardLaser1.draw(); // hazardLaser1.draw();
// hazardLaser2.draw(); // hazardLaser2.draw();
//draw wires
ctx.beginPath();
ctx.moveTo(-525, -800);
ctx.quadraticCurveTo(-800, -100, -1775, -375);
ctx.moveTo(-600, -800);
ctx.quadraticCurveTo(-800, -200, -1775, -325);
// ctx.moveTo(-525, -800);
// ctx.quadraticCurveTo(-800, -100, -1825, -450);
ctx.lineWidth = 1;
ctx.strokeStyle = "#234";
ctx.stroke();
}; };
level.setPosToSpawn(0, -50); //normal spawn level.setPosToSpawn(0, -50); //normal spawn
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
@@ -145,8 +159,8 @@ const level = {
spawn.mapRect(-2000, -1000, 4000, 200); //ceiling spawn.mapRect(-2000, -1000, 4000, 200); //ceiling
spawn.mapRect(-2000, -1000, 225, 2000); //left spawn.mapRect(-2000, -1000, 225, 2000); //left
spawn.mapRect(1800, -1000, 200, 2000); //right spawn.mapRect(1800, -1000, 200, 2000); //right
spawn.mapRect(-500, -5, 25, 50); //edge shelf spawn.mapRect(-500, -25, 25, 50); //edge shelf
spawn.mapRect(475, -5, 25, 50); //edge shelf spawn.mapRect(475, -25, 25, 50); //edge shelf
// spawn.mapRect(-500, -820, 50, 25); //edge shelf ceiling // spawn.mapRect(-500, -820, 50, 25); //edge shelf ceiling
// spawn.mapRect(450, -820, 50, 25); //edge shelf ceiling // spawn.mapRect(450, -820, 50, 25); //edge shelf ceiling
// spawn.bodyRect(1540, -1110, 300, 25, 0.9); // spawn.bodyRect(1540, -1110, 300, 25, 0.9);
@@ -196,7 +210,7 @@ const level = {
spawn.mapRect(-250, -700, 1000, 900); // shelf spawn.mapRect(-250, -700, 1000, 900); // shelf
spawn.mapRect(-250, -1200, 1000, 250); // shelf roof spawn.mapRect(-250, -1200, 1000, 250); // shelf roof
// powerUps.spawnStartingPowerUps(600, -800); // powerUps.spawnStartingPowerUps(600, -800);
// for (let i = 0; i < 50; ++i) powerUps.spawn(550, -800, "reroll", 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);
function blockDoor(x, y, blockSize = 58) { function blockDoor(x, y, blockSize = 58) {

View File

@@ -1058,7 +1058,7 @@ const mobs = {
if (Math.random() < 0.4) { if (Math.random() < 0.4) {
type = "heal" type = "heal"
} else if (Math.random() < 0.3 && !tech.isSuperDeterminism) { } else if (Math.random() < 0.3 && !tech.isSuperDeterminism) {
type = "reroll" type = "research"
} }
for (let i = 0, len = Math.ceil(2 * Math.random()); i < len; i++) { for (let i = 0, len = Math.ceil(2 * Math.random()); i < len; i++) {
powerUps.spawn(this.position.x, this.position.y, type); powerUps.spawn(this.position.x, this.position.y, type);

View File

@@ -158,7 +158,7 @@ const mech = {
mech.Vx = player.velocity.x; mech.Vx = player.velocity.x;
mech.Vy = player.velocity.y; mech.Vy = player.velocity.y;
//tracks the last second of player information //tracks the last 10s of player information
// console.log(mech.history) // console.log(mech.history)
mech.history.splice(mech.cycle % 600, 1, { mech.history.splice(mech.cycle % 600, 1, {
position: { position: {
@@ -175,7 +175,7 @@ const mech = {
activeGun: b.activeGun activeGun: b.activeGun
}); });
// const back = 59 // 59 looks at 1 second ago //29 looks at 1/2 a second ago // const back = 59 // 59 looks at 1 second ago //29 looks at 1/2 a second ago
// historyIndex = (mech.cycle - back) % 60 // historyIndex = (mech.cycle - back) % 600
}, },
transSmoothX: 0, transSmoothX: 0,
transSmoothY: 0, transSmoothY: 0,
@@ -618,11 +618,11 @@ const mech = {
if (tech.isEnergyHealth) { if (tech.isEnergyHealth) {
mech.energy -= dmg; mech.energy -= dmg;
if (mech.energy < 0 || isNaN(mech.energy)) { //taking deadly damage if (mech.energy < 0 || isNaN(mech.energy)) { //taking deadly damage
if (tech.isDeathAvoid && powerUps.reroll.rerolls && !tech.isDeathAvoidedThisLevel) { if (tech.isDeathAvoid && powerUps.research.research && !tech.isDeathAvoidedThisLevel) {
tech.isDeathAvoidedThisLevel = true tech.isDeathAvoidedThisLevel = true
powerUps.reroll.changeRerolls(-1) powerUps.research.changeRerolls(-1)
simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>rerolls</span><span class='color-symbol'>--</span> simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>research</span><span class='color-symbol'>--</span>
<br>${powerUps.reroll.rerolls}`) <br>${powerUps.research.research}`)
for (let i = 0; i < 6; i++) { for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false); powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false);
} }
@@ -649,12 +649,12 @@ const mech = {
dmg *= mech.harmReduction() dmg *= mech.harmReduction()
mech.health -= dmg; mech.health -= dmg;
if (mech.health < 0 || isNaN(mech.health)) { if (mech.health < 0 || isNaN(mech.health)) {
if (tech.isDeathAvoid && powerUps.reroll.rerolls > 0 && !tech.isDeathAvoidedThisLevel) { //&& Math.random() < 0.5 if (tech.isDeathAvoid && powerUps.research.research > 0 && !tech.isDeathAvoidedThisLevel) { //&& Math.random() < 0.5
tech.isDeathAvoidedThisLevel = true tech.isDeathAvoidedThisLevel = true
mech.health = 0.05 mech.health = 0.05
powerUps.reroll.changeRerolls(-1) powerUps.research.changeRerolls(-1)
simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>rerolls</span><span class='color-symbol'>--</span> simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>research</span><span class='color-symbol'>--</span>
<br>${powerUps.reroll.rerolls}`) <br>${powerUps.research.research}`)
for (let i = 0; i < 6; i++) { for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false); powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false);
} }
@@ -1499,13 +1499,11 @@ const mech = {
description: "use <strong class='color-f'>energy</strong> to <strong>block</strong> mobs<br>excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br><strong>double</strong> your default <strong class='color-f'>energy</strong> regeneration", description: "use <strong class='color-f'>energy</strong> to <strong>block</strong> mobs<br>excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br><strong>double</strong> your default <strong class='color-f'>energy</strong> regeneration",
effect: () => { effect: () => {
mech.hold = function() { mech.hold = function() {
if (mech.energy > mech.maxEnergy - 0.02 && mech.fieldCDcycle < mech.cycle && !input.field) { if (mech.energy > mech.maxEnergy - 0.02 && mech.fieldCDcycle < mech.cycle && !input.field && bullet.length < 200) {
if (tech.isSporeField) { if (tech.isSporeField) {
const len = Math.floor(5 + 4 * Math.random()) const len = Math.floor(5 + 4 * Math.random())
mech.energy -= len * 0.105; mech.energy -= len * 0.105;
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) b.spore(mech.pos)
b.spore(mech.pos)
}
} else if (tech.isMissileField) { } else if (tech.isMissileField) {
mech.energy -= 0.55; mech.energy -= 0.55;
b.missile({ x: mech.pos.x, y: mech.pos.y - 40 }, -Math.PI / 2, 0, 1) b.missile({ x: mech.pos.x, y: mech.pos.y - 40 }, -Math.PI / 2, 0, 1)

View File

@@ -42,11 +42,11 @@ const powerUps = {
if (Math.random() < 0.33) { if (Math.random() < 0.33) {
spawnType = "heal" spawnType = "heal"
} else if (Math.random() < 0.5 && !tech.isSuperDeterminism) { } else if (Math.random() < 0.5 && !tech.isSuperDeterminism) {
spawnType = "reroll" spawnType = "research"
} }
for (let i = 0; i < 6; i++) powerUps.spawn(mech.pos.x + 40 * (Math.random() - 0.5), mech.pos.y + 40 * (Math.random() - 0.5), spawnType, false); for (let i = 0; i < 6; i++) powerUps.spawn(mech.pos.x + 40 * (Math.random() - 0.5), mech.pos.y + 40 * (Math.random() - 0.5), spawnType, false);
} }
if (tech.isBanish && type === 'tech') { // banish rerolled tech by adding them to the list of banished tech if (tech.isBanish && type === 'tech') { // banish researched tech by adding them to the list of banished tech
const banishLength = tech.isDeterminism ? 1 : 3 + tech.isExtraChoice * 2 const banishLength = tech.isDeterminism ? 1 : 3 + tech.isExtraChoice * 2
if (powerUps.tech.choiceLog.length > banishLength || powerUps.tech.choiceLog.length === banishLength) { //I'm not sure this check is needed if (powerUps.tech.choiceLog.length > banishLength || powerUps.tech.choiceLog.length === banishLength) { //I'm not sure this check is needed
for (let i = 0; i < banishLength; i++) { for (let i = 0; i < banishLength; i++) {
@@ -56,8 +56,8 @@ const powerUps = {
simulation.makeTextLog(`powerUps.tech.length: ${Math.max(0,powerUps.tech.lastTotalChoices - powerUps.tech.banishLog.length)}`) simulation.makeTextLog(`powerUps.tech.length: ${Math.max(0,powerUps.tech.lastTotalChoices - powerUps.tech.banishLog.length)}`)
} }
} }
if (tech.manyWorlds && powerUps.reroll.rerolls === 0) { if (tech.manyWorlds && powerUps.research.research === 0) {
for (let i = 0; i < 2; i++) powerUps.spawn(mech.pos.x + 40 * (Math.random() - 0.5), mech.pos.y + 40 * (Math.random() - 0.5), "reroll", false); for (let i = 0; i < 2; i++) powerUps.spawn(mech.pos.x + 40 * (Math.random() - 0.5), mech.pos.y + 40 * (Math.random() - 0.5), "research", false);
} }
document.getElementById("choose-grid").style.display = "none" document.getElementById("choose-grid").style.display = "none"
document.getElementById("choose-background").style.display = "none" document.getElementById("choose-background").style.display = "none"
@@ -69,58 +69,58 @@ const powerUps = {
build.unPauseGrid() build.unPauseGrid()
requestAnimationFrame(cycle); requestAnimationFrame(cycle);
}, },
reroll: { research: {
rerolls: 0, research: 0,
name: "reroll", name: "research",
color: "#f7b", color: "#f7b",
size() { size() {
return 20; return 20;
}, },
effect() { effect() {
powerUps.reroll.changeRerolls(1) powerUps.research.changeRerolls(1)
}, },
changeRerolls(amount) { changeRerolls(amount) {
powerUps.reroll.rerolls += amount powerUps.research.research += amount
if (powerUps.reroll.rerolls < 0) { if (powerUps.research.research < 0) {
powerUps.reroll.rerolls = 0 powerUps.research.research = 0
} else { } else {
simulation.makeTextLog(`powerUps.reroll.rerolls <span class='color-symbol'>+=</span> ${amount}`) // <br>${powerUps.reroll.rerolls} simulation.makeTextLog(`powerUps.research.research <span class='color-symbol'>+=</span> ${amount}`) // <br>${powerUps.research.research}
} }
if (tech.isRerollBots) { if (tech.isRerollBots) {
const limit = 5 const limit = 5
for (; powerUps.reroll.rerolls > limit - 1; powerUps.reroll.rerolls -= limit) { for (; powerUps.research.research > limit - 1; powerUps.research.research -= limit) {
b.randomBot() b.randomBot()
if (tech.renormalization) { if (tech.renormalization) {
for (let i = 0; i < limit; i++) { for (let i = 0; i < limit; i++) {
if (Math.random() < 0.37) { if (Math.random() < 0.37) {
mech.fieldCDcycle = mech.cycle + 30; mech.fieldCDcycle = mech.cycle + 30;
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll"); powerUps.spawn(mech.pos.x, mech.pos.y, "research");
} }
} }
} }
} }
} }
if (tech.isDeathAvoid && document.getElementById("tech-anthropic")) { if (tech.isDeathAvoid && document.getElementById("tech-anthropic")) {
document.getElementById("tech-anthropic").innerHTML = `-${powerUps.reroll.rerolls}` document.getElementById("tech-anthropic").innerHTML = `-${powerUps.research.research}`
} }
if (tech.renormalization && Math.random() < 0.37 && amount < 0) powerUps.spawn(mech.pos.x, mech.pos.y, "reroll"); if (tech.renormalization && Math.random() < 0.37 && amount < 0) powerUps.spawn(mech.pos.x, mech.pos.y, "research");
if (tech.isRerollHaste) { if (tech.isRerollHaste) {
if (powerUps.reroll.rerolls === 0) { if (powerUps.research.research === 0) {
tech.rerollHaste = 0.66; tech.researchHaste = 0.66;
b.setFireCD(); b.setFireCD();
} else { } else {
tech.rerollHaste = 1; tech.researchHaste = 1;
b.setFireCD(); b.setFireCD();
} }
} }
}, },
use(type) { //runs when you actually reroll a list of selections, type can be field, gun, or tech use(type) { //runs when you actually research a list of selections, type can be field, gun, or tech
powerUps.reroll.changeRerolls(-1) powerUps.research.changeRerolls(-1)
// simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>rerolls</span><span class='color-symbol'>--</span> // simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>research</span><span class='color-symbol'>--</span>
// <br>${powerUps.reroll.rerolls}`) // <br>${powerUps.research.research}`)
if (tech.isBanish && type === 'tech') { // banish rerolled tech if (tech.isBanish && type === 'tech') { // banish researched tech
const banishLength = tech.isDeterminism ? 1 : 3 + tech.isExtraChoice * 2 const banishLength = tech.isDeterminism ? 1 : 3 + tech.isExtraChoice * 2
if (powerUps.tech.choiceLog.length > banishLength || powerUps.tech.choiceLog.length === banishLength) { //I'm not sure this check is needed if (powerUps.tech.choiceLog.length > banishLength || powerUps.tech.choiceLog.length === banishLength) { //I'm not sure this check is needed
for (let i = 0; i < banishLength; i++) { for (let i = 0; i < banishLength; i++) {
@@ -248,12 +248,12 @@ const powerUps = {
powerUps.field.choiceLog.push(choice2) powerUps.field.choiceLog.push(choice2)
powerUps.field.choiceLog.push(choice3) powerUps.field.choiceLog.push(choice3)
if (powerUps.reroll.rerolls) { if (powerUps.research.research) {
text += `<div class="choose-grid-module" onclick="powerUps.reroll.use('field')"><div class="grid-title"> <span style="position:relative;">` text += `<div class="choose-grid-module" onclick="powerUps.research.use('field')"><div class="grid-title"> <span style="position:relative;">`
for (let i = 0, len = Math.min(powerUps.reroll.rerolls, 30); i < len; i++) text += `<div class="circle-grid reroll" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>` for (let i = 0, len = Math.min(powerUps.research.research, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>`
text += `</span><span class='reroll-select'>reroll</span></div></div>` text += `</span><span class='research-select'>research</span></div></div>`
} }
//(${powerUps.reroll.rerolls}) //(${powerUps.research.research})
// text += `<div style = 'color:#fff'>${simulation.SVGrightMouse} activate the shield with the right mouse<br>fields shield you from damage <br>and let you pick up and throw blocks</div>` // text += `<div style = 'color:#fff'>${simulation.SVGrightMouse} activate the shield with the right mouse<br>fields shield you from damage <br>and let you pick up and throw blocks</div>`
document.getElementById("choose-grid").innerHTML = text document.getElementById("choose-grid").innerHTML = text
powerUps.showDraft(); powerUps.showDraft();
@@ -358,12 +358,12 @@ const powerUps = {
powerUps.tech.choiceLog.push(choice1) powerUps.tech.choiceLog.push(choice1)
powerUps.tech.choiceLog.push(choice2) powerUps.tech.choiceLog.push(choice2)
powerUps.tech.choiceLog.push(choice3) powerUps.tech.choiceLog.push(choice3)
// if (powerUps.reroll.rerolls) text += `<div class="choose-grid-module" onclick="powerUps.reroll.use('tech')"><div class="grid-title"><div class="circle-grid reroll"></div> &nbsp; reroll <span class="reroll-select">${powerUps.reroll.rerolls}</span></div></div>` // if (powerUps.research.research) text += `<div class="choose-grid-module" onclick="powerUps.research.use('tech')"><div class="grid-title"><div class="circle-grid research"></div> &nbsp; research <span class="research-select">${powerUps.research.research}</span></div></div>`
if (powerUps.reroll.rerolls) { if (powerUps.research.research) {
text += `<div class="choose-grid-module" onclick="powerUps.reroll.use('tech')"><div class="grid-title"> <span style="position:relative;">` text += `<div class="choose-grid-module" onclick="powerUps.research.use('tech')"><div class="grid-title"> <span style="position:relative;">`
for (let i = 0, len = Math.min(powerUps.reroll.rerolls, 30); i < len; i++) text += `<div class="circle-grid reroll" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>` for (let i = 0, len = Math.min(powerUps.research.research, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>`
text += `</span><span class='reroll-select'>reroll</span></div></div>` text += `</span><span class='research-select'>research</span></div></div>`
} }
document.getElementById("choose-grid").innerHTML = text document.getElementById("choose-grid").innerHTML = text
@@ -445,11 +445,11 @@ const powerUps = {
powerUps.gun.choiceLog.push(choice1) powerUps.gun.choiceLog.push(choice1)
powerUps.gun.choiceLog.push(choice2) powerUps.gun.choiceLog.push(choice2)
powerUps.gun.choiceLog.push(choice3) powerUps.gun.choiceLog.push(choice3)
// if (powerUps.reroll.rerolls) text += `<div class="choose-grid-module" onclick="powerUps.reroll.use('gun')"><div class="grid-title"><div class="circle-grid reroll"></div> &nbsp; reroll <span class="reroll-select">${powerUps.reroll.rerolls}</span></div></div>` // if (powerUps.research.research) text += `<div class="choose-grid-module" onclick="powerUps.research.use('gun')"><div class="grid-title"><div class="circle-grid research"></div> &nbsp; research <span class="research-select">${powerUps.research.research}</span></div></div>`
if (powerUps.reroll.rerolls) { if (powerUps.research.research) {
text += `<div class="choose-grid-module" onclick="powerUps.reroll.use('gun')"><div class="grid-title"> <span style="position:relative;">` text += `<div class="choose-grid-module" onclick="powerUps.research.use('gun')"><div class="grid-title"> <span style="position:relative;">`
for (let i = 0, len = Math.min(powerUps.reroll.rerolls, 30); i < len; i++) text += `<div class="circle-grid reroll" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>` for (let i = 0, len = Math.min(powerUps.research.research, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>`
text += `</span><span class='reroll-select'>reroll</span></div></div>` text += `</span><span class='research-select'>research</span></div></div>`
} }
// console.log(powerUps.gun.choiceLog) // console.log(powerUps.gun.choiceLog)
// console.log(choice1, choice2, choice3) // console.log(choice1, choice2, choice3)
@@ -502,7 +502,7 @@ const powerUps = {
return; return;
} }
// if (Math.random() < 0.01) { // if (Math.random() < 0.01) {
// powerUps.spawn(x, y, "reroll"); // powerUps.spawn(x, y, "research");
// return; // return;
// } // }
}, },
@@ -543,10 +543,10 @@ const powerUps = {
powerUps.spawn(x, y, "ammo", false); powerUps.spawn(x, y, "ammo", false);
} }
}, },
addRerollToLevel() { //add a random power up to a location that has a mob, mostly used to give each level one randomly placed reroll addRerollToLevel() { //add a random power up to a location that has a mob, mostly used to give each level one randomly placed research
if (mob.length && Math.random() < 0.8) { // 80% chance if (mob.length && Math.random() < 0.8) { // 80% chance
const index = Math.floor(Math.random() * mob.length) const index = Math.floor(Math.random() * mob.length)
powerUps.spawn(mob[index].position.x, mob[index].position.y, "reroll"); powerUps.spawn(mob[index].position.x, mob[index].position.y, "research");
} }
}, },
spawnStartingPowerUps(x, y) { //used for map specific power ups, mostly to give player a starting gun spawnStartingPowerUps(x, y) { //used for map specific power ups, mostly to give player a starting gun
@@ -664,7 +664,7 @@ const powerUps = {
if ( if (
(!tech.isSuperDeterminism || (target === 'tech' || target === 'heal' || target === 'ammo')) && (!tech.isSuperDeterminism || (target === 'tech' || target === 'heal' || target === 'ammo')) &&
!(tech.isEnergyNoAmmo && target === 'ammo') && !(tech.isEnergyNoAmmo && target === 'ammo') &&
(!simulation.isNoPowerUps || (target === 'reroll' || target === 'heal' || target === 'ammo')) (!simulation.isNoPowerUps || (target === 'research' || target === 'heal' || target === 'ammo'))
) { ) {
powerUps.directSpawn(x, y, target, moving, mode, size) powerUps.directSpawn(x, y, target, moving, mode, size)
if (Math.random() < tech.duplicationChance()) { if (Math.random() < tech.duplicationChance()) {

View File

@@ -527,7 +527,7 @@ const simulation = {
b.setFireCD(); b.setFireCD();
simulation.updateTechHUD(); simulation.updateTechHUD();
powerUps.totalPowerUps = 0; powerUps.totalPowerUps = 0;
powerUps.reroll.rerolls = 0; powerUps.research.research = 0;
mech.setFillColors(); mech.setFillColors();
mech.maxHealth = 1 mech.maxHealth = 1
mech.maxEnergy = 1 mech.maxEnergy = 1

View File

@@ -77,7 +77,7 @@ const tech = {
}, },
damageFromTech() { damageFromTech() {
let dmg = mech.fieldDamage let dmg = mech.fieldDamage
// if (tech.aimDamage>1) if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance())
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - mech.energy) * 0.5 if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - mech.energy) * 0.5
if (tech.isMaxEnergyTech) dmg *= 1.4 if (tech.isMaxEnergyTech) dmg *= 1.4
if (tech.isEnergyNoAmmo) dmg *= 1.5 if (tech.isEnergyNoAmmo) dmg *= 1.5
@@ -89,7 +89,7 @@ const tech = {
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
if (tech.isEnergyDamage) dmg *= 1 + mech.energy / 9; if (tech.isEnergyDamage) dmg *= 1 + mech.energy / 9;
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038 if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038
if (tech.isRerollDamage) dmg *= 1 + 0.04 * powerUps.reroll.rerolls if (tech.isRerollDamage) dmg *= 1 + 0.035 * powerUps.research.research
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25 if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25
if (tech.isNoFireDamage && mech.cycle > mech.fireCDcycle + 120) dmg *= 1.66 if (tech.isNoFireDamage && mech.cycle > mech.fireCDcycle + 120) dmg *= 1.66
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.4, player.speed * 0.013) if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.4, player.speed * 0.013)
@@ -97,7 +97,7 @@ const tech = {
return dmg * tech.slowFire * tech.aimDamage return dmg * tech.slowFire * tech.aimDamage
}, },
duplicationChance() { duplicationChance() {
return (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.04 + tech.duplicateChance + mech.duplicateChance return (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.035 + tech.duplicateChance + mech.duplicateChance
}, },
totalBots() { totalBots() {
return tech.foamBotCount + tech.nailBotCount + tech.laserBotCount + tech.boomBotCount + tech.orbitBotCount + tech.plasmaBotCount + tech.missileBotCount return tech.foamBotCount + tech.nailBotCount + tech.laserBotCount + tech.boomBotCount + tech.orbitBotCount + tech.plasmaBotCount + tech.missileBotCount
@@ -156,7 +156,7 @@ const tech = {
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return tech.isEnergyLoss && mech.maxEnergy === 1 && !tech.isMissileField && !tech.isSporeField && !tech.isRewindAvoidDeath return tech.isEnergyLoss && mech.maxEnergy < 1.1 && !tech.isMissileField && !tech.isSporeField && !tech.isRewindAvoidDeath
}, },
requires: "exothermic process, not max energy increase, CPT, missile or spore nano-scale", requires: "exothermic process, not max energy increase, CPT, missile or spore nano-scale",
effect() { effect() {
@@ -176,7 +176,7 @@ const tech = {
allowed() { allowed() {
return tech.isEnergyLoss && mech.maxEnergy < 1.1 return tech.isEnergyLoss && mech.maxEnergy < 1.1
}, },
requires: "exothermic process", requires: "exothermic process, not max energy increase",
effect() { effect() {
tech.isLowEnergyDamage = true; tech.isLowEnergyDamage = true;
}, },
@@ -216,22 +216,6 @@ const tech = {
tech.isFarAwayDmg = false; tech.isFarAwayDmg = false;
} }
}, },
{
name: "fluoroantimonic acid",
description: "increase <strong class='color-d'>damage</strong> by <strong>40%</strong><br>when your <strong>health</strong> is above <strong>100</strong>",
maxCount: 1,
count: 0,
allowed() {
return mech.maxHealth > 1;
},
requires: "health above 100",
effect() {
tech.isAcidDmg = true;
},
remove() {
tech.isAcidDmg = false;
}
},
{ {
name: "integrated armament", 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>", description: "increase <strong class='color-d'>damage</strong> by <strong>25%</strong><br>your inventory can only hold <strong>1 gun</strong>",
@@ -284,6 +268,22 @@ const tech = {
tech.isGunCycle = false; tech.isGunCycle = false;
} }
}, },
{
name: "fluoroantimonic acid",
description: "increase <strong class='color-d'>damage</strong> by <strong>40%</strong><br>when your <strong>health</strong> is above <strong>100</strong>",
maxCount: 1,
count: 0,
allowed() {
return mech.maxHealth > 1;
},
requires: "health above 100",
effect() {
tech.isAcidDmg = true;
},
remove() {
tech.isAcidDmg = false;
}
},
{ {
name: "negative feedback", name: "negative feedback",
description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for every <strong>10</strong> <strong>health</strong> below <strong>100</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for every <strong>10</strong> <strong>health</strong> below <strong>100</strong>",
@@ -317,14 +317,30 @@ const tech = {
} }
}, },
{ {
name: "perturbation theory", name: "correlated damage",
description: "increase <strong class='color-d'>damage</strong> by <strong>4%</strong><br>for each of your <strong class='color-r'>rerolls</strong>", description: "your chance to <strong class='color-dup'>duplicate</strong> power ups<br>increases your <strong class='color-d'>damage</strong> by the same percent",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return powerUps.reroll.rerolls > 3 || build.isCustomSelection return tech.duplicationChance() > 0
}, },
requires: "at least 4 rerolls", requires: "some duplication chance",
effect() {
tech.isDupDamage = true;
},
remove() {
tech.isDupDamage = false;
}
},
{
name: "perturbation theory",
description: "increase <strong class='color-d'>damage</strong> by <strong>3.5%</strong><br>for each <strong class='color-r'>research</strong> in your inventory",
maxCount: 1,
count: 0,
allowed() {
return powerUps.research.research > 4 || build.isCustomSelection
},
requires: "at least 5 research",
effect() { effect() {
tech.isRerollDamage = true; tech.isRerollDamage = true;
}, },
@@ -332,6 +348,26 @@ const tech = {
tech.isRerollDamage = false; tech.isRerollDamage = false;
} }
}, },
{
name: "Ψ(t) collapse",
description: "<strong>66%</strong> decreased <strong><em>delay</em></strong> after firing<br>when you have no <strong class='color-r'>research</strong> in your inventory",
maxCount: 1,
count: 0,
allowed() {
return powerUps.research.research === 0 && !tech.manyWorlds
},
requires: "no research",
effect() {
tech.isRerollHaste = true;
tech.researchHaste = 0.33;
b.setFireCD();
},
remove() {
tech.isRerollHaste = false;
tech.researchHaste = 1;
b.setFireCD();
}
},
{ {
name: "electrostatic discharge", name: "electrostatic discharge",
description: "increase <strong class='color-d'>damage</strong> by <strong>20%</strong><br><strong>20%</strong> increased <strong><em>delay</em></strong> after firing", description: "increase <strong class='color-d'>damage</strong> by <strong>20%</strong><br><strong>20%</strong> increased <strong><em>delay</em></strong> after firing",
@@ -349,26 +385,6 @@ const tech = {
b.setFireCD(); b.setFireCD();
} }
}, },
{
name: "Ψ(t) collapse",
description: "<strong>66%</strong> decreased <strong><em>delay</em></strong> after firing<br>when you have no <strong class='color-r'>rerolls</strong>",
maxCount: 1,
count: 0,
allowed() {
return powerUps.reroll.rerolls === 0 && !tech.manyWorlds
},
requires: "no rerolls",
effect() {
tech.isRerollHaste = true;
tech.rerollHaste = 0.33;
b.setFireCD();
},
remove() {
tech.isRerollHaste = false;
tech.rerollHaste = 1;
b.setFireCD();
}
},
{ {
name: "auto-loading heuristics", name: "auto-loading heuristics",
description: "<strong>30%</strong> decreased <strong><em>delay</em></strong> after firing", description: "<strong>30%</strong> decreased <strong><em>delay</em></strong> after firing",
@@ -763,17 +779,17 @@ const tech = {
}, },
{ {
name: "bot fabrication", 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>", description: "anytime you collect <strong>5</strong> <strong class='color-r'>research</strong><br>use them to build a <strong>random bot</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return powerUps.reroll.rerolls > 5 || build.isCustomSelection return powerUps.research.research > 5 || build.isCustomSelection
}, },
requires: "at least 6 rerolls", requires: "at least 6 research",
effect() { effect() {
tech.isRerollBots = true; tech.isRerollBots = true;
powerUps.reroll.changeRerolls(0) powerUps.research.changeRerolls(0)
simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>rerolls</span> <span class='color-symbol'>=</span> 0`) simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>research</span> <span class='color-symbol'>=</span> 0`)
}, },
remove() { remove() {
tech.isRerollBots = false; tech.isRerollBots = false;
@@ -1057,7 +1073,7 @@ const tech = {
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return tech.isStunField || tech.isPulseStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.haveGunCheck("ice IX") || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage return tech.isStunField || tech.isPulseStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage
}, },
requires: "a freezing or stunning effect", requires: "a freezing or stunning effect",
effect() { effect() {
@@ -1325,7 +1341,7 @@ const tech = {
}, },
{ {
name: "inductive coupling", name: "inductive coupling",
description: "for each unused <strong>power up</strong> at the end of a <strong>level</strong><br>add 4 <strong>max</strong> <strong class='color-h'>health</strong> <em>(up to 44 health per level)</em>", description: "for each unused <strong>power up</strong> at the end of a <strong>level</strong><br>add 4 <strong>max</strong> <strong class='color-h'>health</strong> <em>(up to 40 health per level)</em>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1394,21 +1410,21 @@ const tech = {
nameInfo: "<span id = 'tech-anthropic'></span>", nameInfo: "<span id = 'tech-anthropic'></span>",
addNameInfo() { addNameInfo() {
setTimeout(function() { setTimeout(function() {
powerUps.reroll.changeRerolls(0) powerUps.research.changeRerolls(0)
}, 1000); }, 1000);
}, },
description: "consume a <strong class='color-r'>reroll</strong> to avoid <strong>dying</strong> once a level <br>and spawn <strong>6</strong> <strong class='color-h'>heal</strong> power ups", description: "use a <strong class='color-r'>research</strong> to avoid <strong>dying</strong> once a level <br>and spawn <strong>6</strong> <strong class='color-h'>heal</strong> power ups",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return powerUps.reroll.rerolls > 0 || build.isCustomSelection return powerUps.research.research > 0 || build.isCustomSelection
}, },
requires: "at least 1 reroll", requires: "at least 1 research",
effect() { effect() {
tech.isDeathAvoid = true; tech.isDeathAvoid = true;
tech.isDeathAvoidedThisLevel = false; tech.isDeathAvoidedThisLevel = false;
setTimeout(function() { setTimeout(function() {
powerUps.reroll.changeRerolls(0) powerUps.research.changeRerolls(0)
}, 1000); }, 1000);
}, },
remove() { remove() {
@@ -1417,17 +1433,17 @@ const tech = {
}, },
{ {
name: "quantum immortality", name: "quantum immortality",
description: "after <strong>dying</strong>, continue in an <strong>alternate reality</strong><br>spawn <strong>4</strong> <strong class='color-r'>rerolls</strong>", description: "after <strong>dying</strong>, continue in an <strong>alternate reality</strong><br>spawn <strong>4</strong> <strong class='color-r'>research</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return powerUps.reroll.rerolls > 1 || build.isCustomSelection return powerUps.research.research > 1 || build.isCustomSelection
}, },
requires: "at least 2 rerolls", requires: "at least 2 research",
effect() { effect() {
tech.isImmortal = true; tech.isImmortal = true;
for (let i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll", false); powerUps.spawn(mech.pos.x, mech.pos.y, "research", false);
} }
}, },
remove() { remove() {
@@ -1436,7 +1452,7 @@ const tech = {
}, },
{ {
name: "bubble fusion", name: "bubble fusion",
description: "after destroying a mob's <strong>shield</strong><br>spawn <strong>1-2</strong> <strong class='color-h'>heals</strong>, <strong class='color-g'>ammo</strong>, or <strong class='color-r'>rerolls</strong>", description: "after destroying a mob's <strong>shield</strong><br>spawn <strong>1-2</strong> <strong class='color-h'>heals</strong>, <strong class='color-g'>ammo</strong>, or <strong class='color-r'>research</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1470,7 +1486,7 @@ const tech = {
}, },
{ {
name: "stimulated emission", name: "stimulated emission",
description: "<strong>6%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>", description: "<strong>6%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br><em>duplication chance can't exceed 100%</em>",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
allowed() { allowed() {
@@ -1488,7 +1504,7 @@ const tech = {
}, },
{ {
name: "futures exchange", name: "futures exchange",
description: "clicking <strong style = 'font-size:150%;'>×</strong> to cancel a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>increases power up <strong class='color-dup'>duplication</strong> chance by <strong>4%</strong>", description: "clicking <strong style = 'font-size:150%;'>×</strong> to cancel a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>adds <strong>3.5%</strong> power up <strong class='color-dup'>duplication</strong> chance",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1508,7 +1524,7 @@ const tech = {
}, },
{ {
name: "commodities exchange", name: "commodities exchange",
description: "clicking <strong style = 'font-size:150%;'>×</strong> to cancel a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawns <strong>6</strong> <strong class='color-h'>heals</strong>, <strong class='color-g'>ammo</strong>, or <strong class='color-r'>rerolls</strong>", description: "clicking <strong style = 'font-size:150%;'>×</strong> to cancel a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawns <strong>6</strong> <strong class='color-h'>heals</strong>, <strong class='color-g'>ammo</strong>, or <strong class='color-r'>research</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1583,19 +1599,19 @@ const tech = {
}, },
{ {
name: "strange attractor", name: "strange attractor",
description: `use <strong>2</strong> <strong class='color-r'>rerolls</strong> to spawn <strong>1</strong> <strong class='color-m'>tech</strong><br>with <strong>double</strong> your <strong class='color-dup'>duplication</strong> chance`, description: `use <strong>2</strong> <strong class='color-r'>research</strong> to spawn <strong>1</strong> <strong class='color-m'>tech</strong><br>with <strong>double</strong> your <strong class='color-dup'>duplication</strong> chance`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
allowed() { allowed() {
return !tech.isSuperDeterminism && tech.duplicationChance() > 0 && powerUps.reroll.rerolls > 1 return !tech.isSuperDeterminism && tech.duplicationChance() > 0 && powerUps.research.research > 1
}, },
requires: "at least 1 tech and 1 reroll, a chance to duplicate power ups", requires: "at least 1 tech and 1 research, a chance to duplicate power ups",
effect: () => { effect: () => {
powerUps.reroll.changeRerolls(-2) powerUps.research.changeRerolls(-2)
simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>rerolls</span> <span class='color-symbol'>-=</span> 2 simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-r'>research</span> <span class='color-symbol'>-=</span> 2
<br>${powerUps.reroll.rerolls}`) <br>${powerUps.research.research}`)
const chanceStore = tech.duplicateChance const chanceStore = tech.duplicateChance
tech.duplicateChance = (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.04 + mech.duplicateChance + tech.duplicateChance * 2 //increase duplication chance to simulate doubling all 3 sources of duplication chance tech.duplicateChance = (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.04 + mech.duplicateChance + tech.duplicateChance * 2 //increase duplication chance to simulate doubling all 3 sources of duplication chance
powerUps.spawn(mech.pos.x, mech.pos.y, "tech"); powerUps.spawn(mech.pos.x, mech.pos.y, "tech");
@@ -1740,7 +1756,7 @@ const tech = {
}, },
{ {
name: "superdeterminism", name: "superdeterminism",
description: "spawn <strong>7</strong> <strong class='color-m'>tech</strong><br><strong class='color-r'>rerolls</strong>, <strong class='color-g'>guns</strong>, and <strong class='color-f'>fields</strong> no longer <strong>spawn</strong>", description: "spawn <strong>7</strong> <strong class='color-m'>tech</strong><br><strong class='color-r'>research</strong>, <strong class='color-g'>guns</strong>, and <strong class='color-f'>fields</strong> no longer <strong>spawn</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
isNonRefundable: true, isNonRefundable: true,
@@ -1760,13 +1776,13 @@ const tech = {
}, },
{ {
name: "many-worlds", name: "many-worlds",
description: "after choosing a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>if you have no <strong class='color-r'>rerolls</strong> spawn <strong>2</strong>", description: "after choosing a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>if you have no <strong class='color-r'>research</strong> spawn <strong>2</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return powerUps.reroll.rerolls === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste return powerUps.research.research === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste
}, },
requires: "not superdeterminism or Ψ(t) collapse<br>no rerolls", requires: "not superdeterminism or Ψ(t) collapse<br>no research",
effect: () => { effect: () => {
tech.manyWorlds = true; tech.manyWorlds = true;
}, },
@@ -1776,13 +1792,13 @@ const tech = {
}, },
{ {
name: "renormalization", name: "renormalization",
description: "consuming a <strong class='color-r'>reroll</strong> for <strong>any</strong> purpose<br>has a <strong>37%</strong> chance to spawn a <strong class='color-r'>reroll</strong>", description: "using a <strong class='color-r'>research</strong> for <strong>any</strong> purpose<br>has a <strong>37%</strong> chance to spawn a <strong class='color-r'>research</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return (powerUps.reroll.rerolls > 1 || build.isCustomSelection) && !tech.isSuperDeterminism && !tech.isRerollHaste return (powerUps.research.research > 1 || build.isCustomSelection) && !tech.isSuperDeterminism && !tech.isRerollHaste
}, },
requires: "not superdeterminism or Ψ(t) collapse<br>at least 2 rerolls", requires: "not superdeterminism or Ψ(t) collapse<br>at least 2 research",
effect() { effect() {
tech.renormalization = true; tech.renormalization = true;
}, },
@@ -1792,17 +1808,17 @@ const tech = {
}, },
{ {
name: "erase", name: "erase",
description: "<strong class='color-r'>rerolled</strong> or <strong>canceled</strong> <strong class='color-m'>tech</strong> will not <strong>reoccur</strong> <br>spawn <strong>4</strong> <strong class='color-r'>rerolls</strong>", description: "<strong class='color-r'>researched</strong> or <strong>canceled</strong> <strong class='color-m'>tech</strong> won't <strong>reoccur</strong> <br>spawn <strong>4</strong> <strong class='color-r'>research</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return (powerUps.reroll.rerolls > 2 || build.isCustomSelection) && !tech.isDeterminism return (powerUps.research.research > 2 || build.isCustomSelection) && !tech.isDeterminism
}, },
requires: "not determinism, at least 3 rerolls", requires: "not determinism, at least 3 research",
effect() { effect() {
tech.isBanish = true tech.isBanish = true
for (let i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll", false); powerUps.spawn(mech.pos.x, mech.pos.y, "research", false);
} }
}, },
remove() { remove() {
@@ -1841,8 +1857,8 @@ const tech = {
remove() {} remove() {}
}, },
{ {
name: "perpetual rerolls", name: "perpetual research",
description: "find <strong>1</strong> <strong class='color-r'>reroll</strong> at the start of each <strong>level</strong>", description: "find <strong>1</strong> <strong class='color-r'>research</strong> at the start of each <strong>level</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1984,16 +2000,33 @@ const tech = {
tech.fragments = 0 tech.fragments = 0
} }
}, },
{
name: "superfluidity",
description: "<strong class='color-s'>freeze</strong> effects are applied to a small area",
isGunTech: true,
maxCount: 1,
count: 0,
allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField
},
requires: "a freeze effect",
effect() {
tech.isAoESlow = true
},
remove() {
tech.isAoESlow = false
}
},
{ {
name: "anti-shear topology", name: "anti-shear topology",
description: "some <strong>bullets</strong> last <strong>30% longer</strong><br><em style = 'font-size: 83%'>drones, spores, missiles, foam, wave, ice IX, neutron</em>", description: "some <strong>bullets</strong> last <strong>30% longer</strong><br><em style = 'font-size: 83%'>drones, spores, missiles, foam, wave, neutron</em>",
isGunTech: true, isGunTech: true,
maxCount: 3, maxCount: 3,
count: 0, count: 0,
allowed() { allowed() {
return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.haveGunCheck("ice IX") || tech.isNeutronBomb return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb
}, },
requires: "drones, spores, missiles, foam<br>wave beam, ice IX, neutron bomb", requires: "drones, spores, missiles, foam<br>wave beam, neutron bomb",
effect() { effect() {
tech.isBulletsLastLonger += 0.3 tech.isBulletsLastLonger += 0.3
}, },
@@ -2351,7 +2384,7 @@ const tech = {
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return tech.haveGunCheck("flechettes") || tech.isNailPoison || tech.isHeavyWater || tech.isWormholeDamage || tech.isNeutronBomb return tech.haveGunCheck("flechettes") || tech.isNailPoison || tech.isWormholeDamage || tech.isNeutronBomb
}, },
requires: "radiation damage source", requires: "radiation damage source",
effect() { effect() {
@@ -2779,57 +2812,6 @@ const tech = {
tech.isDroneGrab = false tech.isDroneGrab = false
} }
}, },
{
name: "superfluidity",
description: "<strong class='color-s'>freeze</strong> effects apply to mobs near it's target",
isGunTech: true,
maxCount: 1,
count: 0,
allowed() {
return tech.haveGunCheck("ice IX") || tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField
},
requires: "a freeze effect",
effect() {
tech.isAoESlow = true
},
remove() {
tech.isAoESlow = false
}
},
{
name: "heavy water",
description: "<strong>ice IX</strong> is synthesized with an extra neutron<br>does <strong class='color-p'>radioactive</strong> <strong class='color-d'>damage</strong> over <strong>5</strong> seconds",
isGunTech: true,
maxCount: 1,
count: 0,
allowed() {
return (tech.haveGunCheck("ice IX") || tech.isIceField) && !tech.iceEnergy
},
requires: "ice IX",
effect() {
tech.isHeavyWater = true
},
remove() {
tech.isHeavyWater = false;
}
},
{
name: "thermoelectric effect",
description: "<strong>killing</strong> mobs with <strong>ice IX</strong> gives <strong>4</strong> <strong class='color-h'>health</strong><br>and <strong>80</strong> <strong class='color-f'>energy</strong>",
isGunTech: true,
maxCount: 9,
count: 0,
allowed() {
return (tech.haveGunCheck("ice IX") || tech.isIceField) && !tech.isHeavyWater
},
requires: "ice IX",
effect() {
tech.iceEnergy++
},
remove() {
tech.iceEnergy = 0;
}
},
{ {
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>",
@@ -3387,7 +3369,7 @@ const tech = {
}, },
{ {
name: "ice IX manufacturing", name: "ice IX manufacturing",
description: "<strong>nano-scale manufacturing</strong> is repurposed<br>excess <strong class='color-f'>energy</strong> used to synthesize <strong>ice IX</strong>", description: "<strong>nano-scale manufacturing</strong> is repurposed<br>excess <strong class='color-f'>energy</strong> used to synthesize <strong class='color-s'>ice IX</strong>",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -3402,6 +3384,23 @@ const tech = {
tech.isIceField = false; tech.isIceField = false;
} }
}, },
{
name: "thermoelectric effect",
description: "<strong>killing</strong> mobs with <strong class='color-s'>ice IX</strong> gives <strong>4</strong> <strong class='color-h'>health</strong><br>and <strong>80</strong> <strong class='color-f'>energy</strong>",
isFieldTech: true,
maxCount: 9,
count: 0,
allowed() {
return tech.isIceField
},
requires: "ice IX",
effect() {
tech.iceEnergy++
},
remove() {
tech.iceEnergy = 0;
}
},
{ {
name: "degenerate matter", name: "degenerate matter",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>40%</strong><br>while <strong>negative mass field</strong> is active", description: "reduce <strong class='color-harm'>harm</strong> by <strong>40%</strong><br>while <strong>negative mass field</strong> is active",
@@ -3745,8 +3744,8 @@ const tech = {
remove() {} remove() {}
}, },
{ {
name: "rerolls", name: "research",
description: "spawn <strong>4</strong> <strong class='color-r'>rerolls</strong>", description: "spawn <strong>4</strong> <strong class='color-r'>research</strong>",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
isNonRefundable: true, isNonRefundable: true,
@@ -3757,7 +3756,7 @@ const tech = {
requires: "not superdeterminism", requires: "not superdeterminism",
effect() { effect() {
for (let i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll"); powerUps.spawn(mech.pos.x, mech.pos.y, "research");
} }
this.count-- this.count--
}, },
@@ -3858,7 +3857,6 @@ const tech = {
isBlockStun: null, isBlockStun: null,
isStunField: null, isStunField: null,
isHarmDamage: null, isHarmDamage: null,
isHeavyWater: null,
energyRegen: null, energyRegen: null,
isVacuumBomb: null, isVacuumBomb: null,
renormalization: null, renormalization: null,
@@ -3902,7 +3900,7 @@ const tech = {
isHarmFreeze: null, isHarmFreeze: null,
isBotArmor: null, isBotArmor: null,
isRerollHaste: null, isRerollHaste: null,
rerollHaste: null, researchHaste: null,
isMineDrop: null, isMineDrop: null,
isRerollBots: null, isRerollBots: null,
isRailTimeSlow: null, isRailTimeSlow: null,
@@ -3978,5 +3976,7 @@ const tech = {
isRewindGun: null, isRewindGun: null,
missileSize: null, missileSize: null,
isLaserMine: null, isLaserMine: null,
isAmmoFoamSize: null isAmmoFoamSize: null,
isIceIX: null,
isDupDamage: null
} }

View File

@@ -646,12 +646,12 @@ summary {
background: #0d9; background: #0d9;
} }
.reroll { .research {
/* #f84 #f99*/ /* #f84 #f99*/
background: #f7b; background: #f7b;
} }
.reroll-select { .research-select {
float: right; float: right;
} }
@@ -676,4 +676,15 @@ summary {
.right { .right {
text-align: right; text-align: right;
} }
/* #console {
font-family: monospace;
font-size: 1.5em;
width: 300px;
height: 50px;
position: absolute;
bottom: 10px;
right: 10px;
z-index: 3;
} */

View File

@@ -1,6 +1,16 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
reroll renamed -> research
spore damage increased 25%
ice IX has it's damage buffed by 50%, and freeze effect lasts 2s (up from 1s)
ice IX is no longer a gun
but you can still get it for nano-scale field (and it's pretty strong)
tech: heavy water was removed
tech: correlated damage - duplication chance also gives % damage
(also added some minor nerfs to other duplication tech for balance)
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
@@ -41,8 +51,6 @@ tech: dodge chance for cloaking, harmonic fields, also pilot wave
rename rename
health > integrity, unity health > integrity, unity
heal > also integrity, unity heal > also integrity, unity
level > world?
reroll > research
in game console in game console
set highlighting rules set highlighting rules
@@ -416,11 +424,13 @@ scientist console text:
at the start of each level listen to text conversation from the two colors of text strings also at the start of each level listen to text conversation from the two colors of text strings also
talking about the robot, watching talking about the robot, watching
trying to communicate with the robot? but how trying to communicate with the robot? but how
random lines: random lines when:
say something about what mobs types are queued up, and level order at start of level, about: what mobs types are queued up, and level order
I think it's planing to escape when player gets a cool tech combination
Why is it attacking those shapes? at random times:
Are those shapes supposed to be us? I think it's planing to escape
Why is it attacking those shapes?
Are those shapes supposed to be us?
ending outline ending outline
if no cheats if no cheats