retrocausality

time dilation tech: retrocausality - instead of pausing time your field rewinds time, including your health
  this tech replaces replaces CPT gun
  works well with tech: causality bots and grenades

wormhole
  activated on mouse up
  draw an outline of the wormhole to show if can work at your mouse location

adiabatic healing: adds 5% JUNK in addition to 100% better heals

several tech pool frequencies have been adjusted to roughly this rule:
  no requirements:  1x chance
  requirements: 2x chance
    (most gun and field tech)
  strict requirements: 3x chance or higher

bug fixes
This commit is contained in:
landgreen
2021-10-31 07:01:54 -07:00
parent 7af4ffdce8
commit 093e56dd12
9 changed files with 635 additions and 290 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -5390,7 +5390,7 @@ const b = {
name: "railgun", name: "railgun",
description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire", description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire",
ammo: 0, ammo: 0,
ammoPack: 3.5, ammoPack: 3.8,
have: false, have: false,
do() {}, do() {},
fire() { fire() {

View File

@@ -15,13 +15,13 @@ const level = {
// localSettings.levelsClearedLastGame = 10 // localSettings.levelsClearedLastGame = 10
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
// simulation.isHorizontalFlipped = true // simulation.isHorizontalFlipped = true
// m.setField("negative mass") // m.setField("time dilation")
// b.giveGuns("harpoon") // b.giveGuns("harpoon")
// tech.giveTech("rotary cannon") // tech.giveTech("retrocausality")
// tech.giveTech("fragmentation") // tech.giveTech("causality bots")
// tech.giveTech("rivet gun") // tech.giveTech("causality bombs")
// for (let i = 0; i < 2; i++) tech.giveTech("refractory metal") // for (let i = 0; i < 2; i++) tech.giveTech("refractory metal")
// tech.giveTech("all-stars") // tech.giveTech("antiscience")
// for (let i = 0; i < 1; i++) tech.giveTech("reticulum") // for (let i = 0; i < 1; i++) tech.giveTech("reticulum")
// for (let i = 0; i < 2; i++) tech.giveTech("laser-bot") // for (let i = 0; i < 2; i++) tech.giveTech("laser-bot")
// tech.isCancelDuplication = true // tech.isCancelDuplication = true

View File

@@ -45,7 +45,7 @@ const mobs = {
applySlow(who) applySlow(who)
//look for mobs near the target //look for mobs near the target
if (tech.isAoESlow) { if (tech.isAoESlow) {
const range2 = (180 + 170 * Math.random()) ** 2 const range2 = (200 + 170 * Math.random()) ** 2
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
if (who !== mob[i] && Vector.magnitudeSquared(Vector.sub(who.position, mob[i].position)) < range2 + mob[i].radius) applySlow(mob[i]) if (who !== mob[i] && Vector.magnitudeSquared(Vector.sub(who.position, mob[i].position)) < range2 + mob[i].radius) applySlow(mob[i])
} }

View File

@@ -133,6 +133,7 @@ const m = {
transX: 0, transX: 0,
transY: 0, transY: 0,
history: [], //tracks the last second of player position history: [], //tracks the last second of player position
rewindCount: 0, //used with CPT gun
resetHistory() { resetHistory() {
for (let i = 0; i < 600; i++) { //reset history for (let i = 0; i < 600; i++) { //reset history
m.history[i] = { m.history[i] = {
@@ -298,7 +299,7 @@ const m = {
}, },
alive: false, alive: false,
switchWorlds() { switchWorlds() {
const totalGuns = b.inventory.length - tech.isRewindGun //count guns, but not CPT gun const totalGuns = b.inventory.length //- tech.isRewindGun //count guns, but not CPT gun
simulation.isTextLogOpen = false; //prevent console spam simulation.isTextLogOpen = false; //prevent console spam
//remove all tech and count current tech total //remove all tech and count current tech total
let totalTech = 0; let totalTech = 0;
@@ -932,7 +933,7 @@ const m = {
holdingMassScale: 0, holdingMassScale: 0,
hole: { hole: {
isOn: false, isOn: false,
isReady: true, isReady: false,
pos1: { pos1: {
x: 0, x: 0,
y: 0 y: 0
@@ -983,7 +984,7 @@ const m = {
// m.setMaxEnergy(); // m.setMaxEnergy();
m.hole = { m.hole = {
isOn: false, isOn: false,
isReady: true, isReady: false,
pos1: { pos1: {
x: 0, x: 0,
y: 0 y: 0
@@ -2126,8 +2127,177 @@ const m = {
name: "time dilation", name: "time dilation",
// description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br>while time is stopped you can <strong>move</strong> and <strong>fire</strong><br>and <strong>collisions</strong> do <strong>50%</strong> less <strong class='color-harm'>harm</strong>", // description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br>while time is stopped you can <strong>move</strong> and <strong>fire</strong><br>and <strong>collisions</strong> do <strong>50%</strong> less <strong class='color-harm'>harm</strong>",
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br><strong>move</strong> and <strong>fire</strong> while time is stopped<br>but, <strong>collisions</strong> still do <strong class='color-harm'>harm</strong>", description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br><strong>move</strong> and <strong>fire</strong> while time is stopped<br>but, <strong>collisions</strong> still do <strong class='color-harm'>harm</strong>",
effect: () => { set() {
// m.fieldMeterColor = "#000" if (tech.isRewindField) {
this.rewindCount = 0
m.grabPowerUpRange2 = 300000
m.hold = function() {
if (m.isHolding) {
m.drawHold(m.holdingTarget);
m.holding();
m.throwBlock();
} else if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
m.grabPowerUp();
if (this.rewindCount === 0) m.lookForPickUp();
if (!m.holdingTarget) {
this.rewindCount += 6;
const DRAIN = 0.001
let history = m.history[(m.cycle - this.rewindCount) % 600]
if (this.rewindCount > 599 || m.energy < DRAIN) {
this.rewindCount = 0;
m.resetHistory();
if (m.fireCDcycle < m.cycle + 60) m.fieldCDcycle = m.cycle + 60
m.immuneCycle = m.cycle //if you reach the end of the history disable harm immunity
} else {
//draw field everywhere
ctx.globalCompositeOperation = "saturation"
ctx.fillStyle = "#ccc";
ctx.fillRect(-100000, -100000, 200000, 200000)
ctx.globalCompositeOperation = "source-over"
// m.grabPowerUp(); //a second grab power up to make the power ups easier to grab, and they more fast which matches the time theme
m.energy -= DRAIN
if (m.immuneCycle < m.cycle + 60) m.immuneCycle = m.cycle + 60; //player is immune to damage for __ cycles
Matter.Body.setPosition(player, history.position);
Matter.Body.setVelocity(player, { x: history.velocity.x, y: history.velocity.y });
if (m.health < history.health) {
m.health = history.health
if (m.health > m.maxHealth) m.health = m.maxHealth
m.displayHealth();
}
m.yOff = history.yOff
if (m.yOff < 48) {
m.doCrouch()
} else {
m.undoCrouch()
}
//grab power ups
for (let i = 0, len = powerUp.length; i < len; ++i) {
if (
Vector.magnitudeSquared(Vector.sub(m.pos, powerUp[i].position)) < 100000 &&
!simulation.isChoosing &&
(powerUp[i].name !== "heal" || m.health !== m.maxHealth || tech.isOverHeal)
) {
powerUps.onPickUp(powerUp[i]);
powerUp[i].effect();
Matter.Composite.remove(engine.world, powerUp[i]);
powerUp.splice(i, 1);
break; //because the array order is messed up after splice
}
}
if (!(this.rewindCount % 30)) {
if (tech.isRewindBot) {
for (let i = 0; i < tech.isRewindBot; i++) {
b.randomBot(m.pos, false, false)
bullet[bullet.length - 1].endCycle = simulation.cycle + 480 + Math.floor(120 * Math.random()) //8-9 seconds
}
}
if (tech.isRewindGrenade) {
b.grenade(m.pos, this.rewindCount) //Math.PI / 2
const who = bullet[bullet.length - 1]
// Matter.Body.setVelocity(who, {
// x: 0,
// y: 0
// });
who.endCycle = simulation.cycle + 60
// if (tech.isVacuumBomb) {
// Matter.Body.setVelocity(who, {
// x: who.velocity.x * 0.5,
// y: who.velocity.y * 0.5
// });
// } else if (tech.isRPG) {
// who.endCycle = simulation.cycle + 10
// } else if (tech.isNeutronBomb) {
// Matter.Body.setVelocity(who, {
// x: who.velocity.x * 0.3,
// y: who.velocity.y * 0.3
// });
// } else {
// Matter.Body.setVelocity(who, {
// x: who.velocity.x * 0.5,
// y: who.velocity.y * 0.5
// });
// who.endCycle = simulation.cycle + 30
// }
}
}
}
}
} else if (m.holdingTarget && m.fieldCDcycle < m.cycle) { //holding, but field button is released
m.pickUp();
this.rewindCount = 0;
} else {
m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
this.rewindCount = 0;
}
m.drawFieldMeter()
// // console.log(this.rewindCount)
// if (input.field && m.fieldCDcycle < m.cycle) { //button has been held down
// if (m.isHolding) {
// m.drawHold(m.holdingTarget);
// m.holding();
// m.throwBlock();
// } else {
// m.grabPowerUp();
// m.lookForPickUp();
// if (!m.holdingTarget) {
// this.rewindCount += 8;
// const DRAIN = 0.001
// let history = m.history[(m.cycle - this.rewindCount) % 600]
// if (this.rewindCount > 599 || m.energy < DRAIN) {
// this.rewindCount = 0;
// m.resetHistory();
// } else {
// // m.grabPowerUp(); //a second grab power up to make the power ups easier to grab, and they more fast which matches the time theme
// m.energy -= DRAIN
// if (m.immuneCycle < m.cycle + 30) m.immuneCycle = m.cycle + 30; //player is immune to damage for 30 cycles
// Matter.Body.setPosition(player, history.position);
// Matter.Body.setVelocity(player, { x: history.velocity.x, y: history.velocity.y });
// if (m.health < history.health) {
// m.health = history.health
// m.displayHealth();
// }
// m.yOff = history.yOff
// if (m.yOff < 48) {
// m.doCrouch()
// } else {
// m.undoCrouch()
// }
// //grab power ups
// for (let i = 0, len = powerUp.length; i < len; ++i) {
// if (
// Vector.magnitudeSquared(Vector.sub(m.pos, powerUp[i].position)) < 100000 &&
// !simulation.isChoosing &&
// (powerUp[i].name !== "heal" || m.health !== m.maxHealth || tech.isOverHeal)
// ) {
// powerUps.onPickUp(powerUp[i]);
// powerUp[i].effect();
// Matter.Composite.remove(engine.world, powerUp[i]);
// powerUp.splice(i, 1);
// break; //because the array order is messed up after splice
// }
// }
// }
// }
// }
// } else { //button is held the first time
// this.rewindCount = 0;
// if (m.holdingTarget && m.fieldCDcycle < m.cycle) {
// m.pickUp();
// } else {
// m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
// }
// }
}
} else {
m.fieldFire = true; m.fieldFire = true;
m.isBodiesAsleep = false; m.isBodiesAsleep = false;
m.drain = 0.0005 m.drain = 0.0005
@@ -2139,7 +2309,7 @@ const m = {
m.throwBlock(); m.throwBlock();
} else if (input.field && m.fieldCDcycle < m.cycle) { } else if (input.field && m.fieldCDcycle < m.cycle) {
m.grabPowerUp(); m.grabPowerUp();
m.lookForPickUp(180); m.lookForPickUp();
m.drain += 0.0000025 m.drain += 0.0000025
if (m.energy > m.drain) { if (m.energy > m.drain) {
@@ -2204,6 +2374,11 @@ const m = {
} }
} }
}, },
effect() {
// m.fieldMeterColor = "#000"
this.set();
}
},
{ {
name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency" name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency"
description: "when not firing activate a <strong class='color-cloaked'>cloaking</strong> effect<br><strong>+333%</strong> <strong class='color-d'>damage</strong> if a mob hasn't recently <strong>died</strong><br><strong>collisions</strong> do <strong>50%</strong> less <strong class='color-harm'>harm</strong> when <strong class='color-cloaked'>cloaked</strong>", description: "when not firing activate a <strong class='color-cloaked'>cloaking</strong> effect<br><strong>+333%</strong> <strong class='color-d'>damage</strong> if a mob hasn't recently <strong>died</strong><br><strong>collisions</strong> do <strong>50%</strong> less <strong class='color-harm'>harm</strong> when <strong class='color-cloaked'>cloaked</strong>",
@@ -2678,6 +2853,7 @@ const m = {
description: "use <strong class='color-f'>energy</strong> to <strong>tunnel</strong> through a <strong class='color-worm'>wormhole</strong><br><strong class='color-worm'>wormholes</strong> attract <strong class='color-block'>blocks</strong> and power ups<br><strong>7%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>", //<br>bullets may also traverse <strong class='color-worm'>wormholes</strong> description: "use <strong class='color-f'>energy</strong> to <strong>tunnel</strong> through a <strong class='color-worm'>wormhole</strong><br><strong class='color-worm'>wormholes</strong> attract <strong class='color-block'>blocks</strong> and power ups<br><strong>7%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>", //<br>bullets may also traverse <strong class='color-worm'>wormholes</strong>
effect: function() { effect: function() {
m.duplicateChance = 0.07 m.duplicateChance = 0.07
m.fieldRange = 0
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
m.hold = function() { m.hold = function() {
@@ -2785,7 +2961,7 @@ const m = {
body.splice(i, 1); body.splice(i, 1);
m.fieldRange *= 0.8 m.fieldRange *= 0.8
if (tech.isWormholeEnergy) m.energy += 0.63 if (tech.isWormholeEnergy) m.energy += 0.63
if (tech.isWormholeSpores) { //pandimensionalspermia if (tech.isWormholeSpores) { //pandimensional spermia
for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) { for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) {
if (tech.isSporeWorm) { if (tech.isSporeWorm) {
b.worm(Vector.add(m.hole.pos2, Vector.rotate({ b.worm(Vector.add(m.hole.pos2, Vector.rotate({
@@ -2819,7 +2995,7 @@ const m = {
m.fieldRange *= 0.8 m.fieldRange *= 0.8
// if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2 // if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2
if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.63 if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.63
if (tech.isWormholeSpores) { //pandimensionalspermia if (tech.isWormholeSpores) { //pandimensional spermia
for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) { for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) {
if (tech.isSporeWorm) { if (tech.isSporeWorm) {
b.worm(Vector.add(m.hole.pos1, Vector.rotate({ b.worm(Vector.add(m.hole.pos1, Vector.rotate({
@@ -2871,12 +3047,60 @@ const m = {
} }
} }
if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed if (m.fieldCDcycle < m.cycle) {
const justPastMouse = Vector.add(Vector.mult(Vector.normalise(Vector.sub(simulation.mouseInGame, m.pos)), 50), simulation.mouseInGame)
const scale = 60 const scale = 60
// console.log(Matter.Query.region(map, bounds)) const justPastMouse = Vector.add(Vector.mult(Vector.normalise(Vector.sub(simulation.mouseInGame, m.pos)), 50), simulation.mouseInGame)
if (m.hole.isReady && const sub = Vector.sub(simulation.mouseInGame, m.pos)
( const mag = Vector.magnitude(sub)
const drain = tech.isFreeWormHole ? 0 : 0.06 + 0.006 * Math.sqrt(mag)
if (input.field) {
m.grabPowerUp();
//draw possible wormhole
if (mag > 250 && m.energy > drain) {
const unit = Vector.perp(Vector.normalise(sub))
const where = { x: m.pos.x + 30 * Math.cos(m.angle), y: m.pos.y + 30 * Math.sin(m.angle) }
m.fieldRange = 0.97 * m.fieldRange + 0.03 * (50 + 10 * Math.sin(simulation.cycle * 0.025))
const edge2a = Vector.add(Vector.mult(unit, 1.5 * m.fieldRange), simulation.mouseInGame)
const edge2b = Vector.add(Vector.mult(unit, -1.5 * m.fieldRange), simulation.mouseInGame)
ctx.beginPath();
ctx.moveTo(where.x, where.y)
ctx.bezierCurveTo(where.x, where.y, simulation.mouseInGame.x, simulation.mouseInGame.y, edge2a.x, edge2a.y);
ctx.moveTo(where.x, where.y)
ctx.bezierCurveTo(where.x, where.y, simulation.mouseInGame.x, simulation.mouseInGame.y, edge2b.x, edge2b.y);
if (
Matter.Query.region(map, {
min: {
x: simulation.mouseInGame.x - scale,
y: simulation.mouseInGame.y - scale
},
max: {
x: simulation.mouseInGame.x + scale,
y: simulation.mouseInGame.y + scale
}
}).length === 0 &&
Matter.Query.ray(map, m.pos, justPastMouse).length === 0
) {
m.hole.isReady = true;
// ctx.fillStyle = "rgba(255,255,255,0.5)"
// ctx.fill();
ctx.lineWidth = 1
ctx.strokeStyle = "#000"
ctx.stroke();
} else {
m.hole.isReady = false;
ctx.lineWidth = 1
ctx.strokeStyle = "#000"
ctx.lineDashOffset = 30 * Math.random()
ctx.setLineDash([20, 40]);
ctx.stroke();
ctx.setLineDash([]);
}
}
} else {
//make new wormhole
if (
m.hole.isReady && mag > 250 && m.energy > drain &&
Matter.Query.region(map, { Matter.Query.region(map, {
min: { min: {
x: simulation.mouseInGame.x - scale, x: simulation.mouseInGame.x - scale,
@@ -2888,15 +3112,7 @@ const m = {
} }
}).length === 0 && }).length === 0 &&
Matter.Query.ray(map, m.pos, justPastMouse).length === 0 Matter.Query.ray(map, m.pos, justPastMouse).length === 0
// Matter.Query.ray(map, m.pos, simulation.mouseInGame).length === 0 &&
// Matter.Query.ray(map, player.position, simulation.mouseInGame).length === 0 &&
// Matter.Query.ray(map, player.position, justPastMouse).length === 0
)
) { ) {
const sub = Vector.sub(simulation.mouseInGame, m.pos)
const mag = Vector.magnitude(sub)
const drain = tech.isFreeWormHole ? 0 : 0.06 + 0.006 * Math.sqrt(mag)
if (m.energy > drain && mag > 300) {
m.energy -= drain m.energy -= drain
m.hole.isReady = false; m.hole.isReady = false;
m.fieldRange = 0 m.fieldRange = 0
@@ -2940,21 +3156,111 @@ const m = {
} }
} }
} }
} else {
m.grabPowerUp();
} }
} else {
m.grabPowerUp();
} }
// } else if (m.holdingTarget && m.fieldCDcycle < m.cycle) { //holding, but field button is released
// m.pickUp();
} else {
m.hole.isReady = true;
} }
// if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
// const justPastMouse = Vector.add(Vector.mult(Vector.normalise(Vector.sub(simulation.mouseInGame, m.pos)), 50), simulation.mouseInGame)
// const scale = 60
// // console.log(Matter.Query.region(map, bounds))
// const sub = Vector.sub(simulation.mouseInGame, m.pos)
// const mag = Vector.magnitude(sub)
// const drain = tech.isFreeWormHole ? 0 : 0.06 + 0.006 * Math.sqrt(mag)
// if (m.hole.isReady && mag > 250 && m.energy > drain) {
// if (
// Matter.Query.region(map, {
// min: {
// x: simulation.mouseInGame.x - scale,
// y: simulation.mouseInGame.y - scale
// },
// max: {
// x: simulation.mouseInGame.x + scale,
// y: simulation.mouseInGame.y + scale
// }
// }).length === 0 &&
// Matter.Query.ray(map, m.pos, justPastMouse).length === 0
// // Matter.Query.ray(map, m.pos, simulation.mouseInGame).length === 0 &&
// // Matter.Query.ray(map, player.position, simulation.mouseInGame).length === 0 &&
// // Matter.Query.ray(map, player.position, justPastMouse).length === 0
// ) {
// m.energy -= drain
// m.hole.isReady = false;
// m.fieldRange = 0
// Matter.Body.setPosition(player, simulation.mouseInGame);
// m.buttonCD_jump = 0 //this might fix a bug with jumping
// const velocity = Vector.mult(Vector.normalise(sub), 20)
// Matter.Body.setVelocity(player, {
// x: velocity.x,
// y: velocity.y - 4 //an extra vertical kick so the player hangs in place longer
// });
// if (m.immuneCycle < m.cycle + 15) m.immuneCycle = m.cycle + 15; //player is immune to damage for 1/4 seconds
// // move bots to player
// for (let i = 0; i < bullet.length; i++) {
// if (bullet[i].botType) {
// Matter.Body.setPosition(bullet[i], Vector.add(player.position, {
// x: 250 * (Math.random() - 0.5),
// y: 250 * (Math.random() - 0.5)
// }));
// Matter.Body.setVelocity(bullet[i], {
// x: 0,
// y: 0
// });
// }
// }
// //set holes
// m.hole.isOn = true;
// m.hole.pos1.x = m.pos.x
// m.hole.pos1.y = m.pos.y
// m.hole.pos2.x = player.position.x
// m.hole.pos2.y = player.position.y
// m.hole.angle = Math.atan2(sub.y, sub.x)
// m.hole.unit = Vector.perp(Vector.normalise(sub))
// if (tech.isWormholeDamage) {
// who = Matter.Query.ray(mob, m.pos, simulation.mouseInGame, 100)
// for (let i = 0; i < who.length; i++) {
// if (who[i].body.alive) {
// mobs.statusDoT(who[i].body, 1, 420)
// mobs.statusStun(who[i].body, 360)
// }
// }
// }
// } else {
// //draw failed wormhole
// const unit = Vector.perp(Vector.normalise(Vector.sub(simulation.mouseInGame, m.pos)))
// const where = { x: m.pos.x + 30 * Math.cos(m.angle), y: m.pos.y + 30 * Math.sin(m.angle), }
// m.fieldRange = 0.97 * m.fieldRange + 0.03 * (50 + 10 * Math.sin(simulation.cycle * 0.025))
// const edge2a = Vector.add(Vector.mult(unit, 1.5 * m.fieldRange), simulation.mouseInGame)
// const edge2b = Vector.add(Vector.mult(unit, -1.5 * m.fieldRange), simulation.mouseInGame)
// ctx.beginPath();
// ctx.moveTo(where.x, where.y)
// ctx.bezierCurveTo(where.x, where.y, simulation.mouseInGame.x, simulation.mouseInGame.y, edge2a.x, edge2a.y);
// ctx.lineTo(edge2b.x, edge2b.y)
// ctx.bezierCurveTo(simulation.mouseInGame.x, simulation.mouseInGame.y, where.x, where.y, where.x, where.y);
// // ctx.fillStyle = "rgba(255,255,255,0.5)"
// // ctx.fill();
// ctx.lineWidth = 1
// ctx.strokeStyle = "#000"
// ctx.lineDashOffset = 30 * Math.random()
// ctx.setLineDash([20, 40]);
// ctx.stroke();
// ctx.setLineDash([]);
// }
// }
// m.grabPowerUp();
// } else {
// m.hole.isReady = true;
// }
m.drawFieldMeter() m.drawFieldMeter()
} }
}, },
rewindCount: 0,
// rewind: function() { // rewind: function() {
// if (input.down) { // if (input.down) {
// if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed // if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed

View File

@@ -292,6 +292,7 @@ const powerUps = {
document.body.style.cursor = "none"; document.body.style.cursor = "none";
// document.body.style.overflow = "hidden" // document.body.style.overflow = "hidden"
// if (m.alive){}
simulation.paused = false; simulation.paused = false;
simulation.isChoosing = false; //stops p from un pausing on key down simulation.isChoosing = false; //stops p from un pausing on key down
if (m.immuneCycle < m.cycle + 15) m.immuneCycle = m.cycle + 15; //player is immune to damage for 30 cycles if (m.immuneCycle < m.cycle + 15) m.immuneCycle = m.cycle + 15; //player is immune to damage for 30 cycles

View File

@@ -523,6 +523,8 @@ const simulation = {
// document.getElementById("choose-grid").style.display = "none" // document.getElementById("choose-grid").style.display = "none"
document.getElementById("choose-grid").style.visibility = "hidden" document.getElementById("choose-grid").style.visibility = "hidden"
document.getElementById("choose-grid").style.opacity = "0" document.getElementById("choose-grid").style.opacity = "0"
document.getElementById("choose-background").style.visibility = "hidden"
document.getElementById("choose-background").style.opacity = "0"
document.getElementById("info").style.display = "inline"; document.getElementById("info").style.display = "inline";
document.getElementById("info").style.opacity = "0"; document.getElementById("info").style.opacity = "0";
document.getElementById("experiment-button").style.display = "inline" document.getElementById("experiment-button").style.display = "inline"

View File

@@ -286,8 +286,8 @@
description: `increase <strong class='color-d'>damage</strong> by <strong>19.95%</strong><br>your inventory can only hold 1 <strong class='color-g'>gun</strong>`, description: `increase <strong class='color-d'>damage</strong> by <strong>19.95%</strong><br>your inventory can only hold 1 <strong class='color-g'>gun</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return b.inventory.length === 1 //&& !tech.haveGunCheck("CPT gun") return b.inventory.length === 1 //&& !tech.haveGunCheck("CPT gun")
}, },
@@ -316,8 +316,8 @@
description: "while your <strong>first</strong> <strong class='color-g'>gun</strong> is equipped<br>reduce <strong class='color-harm'>harm</strong> by <strong>13%</strong> for each of your <strong class='color-g'>guns</strong>", description: "while your <strong>first</strong> <strong class='color-g'>gun</strong> is equipped<br>reduce <strong class='color-harm'>harm</strong> by <strong>13%</strong> for each of your <strong class='color-g'>guns</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return b.inventory.length > 1 && !tech.isEnergyHealth return b.inventory.length > 1 && !tech.isEnergyHealth
}, },
@@ -401,6 +401,7 @@
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
frequencyDefault: 1,
isNonRefundable: true, isNonRefundable: true,
// isExperimentHide: true, // isExperimentHide: true,
isBadRandomOption: true, isBadRandomOption: true,
@@ -423,8 +424,8 @@
maxCount: 1, //random power up maxCount: 1, //random power up
count: 0, count: 0,
frequency: 1, frequency: 1,
frequencyDefault: 1,
isNonRefundable: true, isNonRefundable: true,
// isExperimentHide: true,
allowed() { allowed() {
return b.inventory.length > 1 return b.inventory.length > 1
}, },
@@ -559,8 +560,8 @@
description: "reduce <strong class='color-harm'>harm</strong> by <strong>55%</strong> when <strong>crouching</strong>", description: "reduce <strong class='color-harm'>harm</strong> by <strong>55%</strong> when <strong>crouching</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 4, frequency: 3,
frequencyDefault: 4, frequencyDefault: 3,
allowed() { allowed() {
return tech.isCrouchAmmo && !tech.isEnergyHealth return tech.isCrouchAmmo && !tech.isEnergyHealth
}, },
@@ -595,8 +596,8 @@
description: "while <strong>firing</strong> your <strong>position</strong> is locked<br><strong>50%</strong> decreased <strong><em>delay</em></strong> after firing", description: "while <strong>firing</strong> your <strong>position</strong> is locked<br><strong>50%</strong> decreased <strong><em>delay</em></strong> after firing",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return !m.isShipMode && !tech.isAlwaysFire return !m.isShipMode && !tech.isAlwaysFire
}, },
@@ -619,8 +620,8 @@
description: "<strong>move</strong> and <strong>jump</strong> <strong>30%</strong> faster<br>take <strong>5%</strong> more <strong class='color-harm'>harm</strong>", description: "<strong>move</strong> and <strong>jump</strong> <strong>30%</strong> faster<br>take <strong>5%</strong> more <strong class='color-harm'>harm</strong>",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return true return true
}, },
@@ -677,8 +678,8 @@
description: "increase <strong class='color-d'>damage</strong> by up to <strong>33%</strong> at a <strong>distance</strong><br>of up to 50 player widths from the target", description: "increase <strong class='color-d'>damage</strong> by up to <strong>33%</strong> at a <strong>distance</strong><br>of up to 50 player widths from the target",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return true return true
}, },
@@ -695,8 +696,8 @@
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",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return true return true
}, },
@@ -714,8 +715,8 @@
description: "<strong>30%</strong> decreased <strong><em>delay</em></strong> after firing", description: "<strong>30%</strong> decreased <strong><em>delay</em></strong> after firing",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return true return true
}, },
@@ -754,8 +755,8 @@
description: "increase <strong class='color-d'>damage</strong> by <strong>7%</strong><br>for every <strong>10</strong> active <strong>projectiles</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>7%</strong><br>for every <strong>10</strong> active <strong>projectiles</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return true return true
}, },
@@ -884,6 +885,7 @@
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
frequencyDefault: 2,
isBadRandomOption: true, isBadRandomOption: true,
allowed() { allowed() {
return tech.hasExplosiveDamageCheck() return tech.hasExplosiveDamageCheck()
@@ -978,8 +980,8 @@
description: "some <strong class='color-e'>detonations</strong> and collisions eject <strong>nails</strong><br><em style = 'font-size: 90%'>blocks, railgun, grenades, missiles, slugs, harpoon</em>", description: "some <strong class='color-e'>detonations</strong> and collisions eject <strong>nails</strong><br><em style = 'font-size: 90%'>blocks, railgun, grenades, missiles, slugs, harpoon</em>",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return tech.haveGunCheck("harpoon") || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.missileBotCount || tech.haveGunCheck("railgun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1 return tech.haveGunCheck("harpoon") || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.missileBotCount || tech.haveGunCheck("railgun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1
}, },
@@ -1098,8 +1100,8 @@
description: "increase <strong class='color-d'>damage</strong> by <strong>100%</strong><br>after not using your <strong class='color-g'>gun</strong> or <strong class='color-f'>field</strong> for <strong>2</strong> seconds", description: "increase <strong class='color-d'>damage</strong> by <strong>100%</strong><br>after not using your <strong class='color-g'>gun</strong> or <strong class='color-f'>field</strong> for <strong>2</strong> seconds",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
allowed() { allowed() {
return tech.isNoFireDefense return tech.isNoFireDefense
}, },
@@ -1137,8 +1139,8 @@
description: "killing a mob resets your functional scrap <strong class='color-bot'>bots</strong><br>to <strong>14</strong> seconds of operation", description: "killing a mob resets your functional scrap <strong class='color-bot'>bots</strong><br>to <strong>14</strong> seconds of operation",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 3,
frequencyDefault: 1, frequencyDefault: 3,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return tech.botSpawner return tech.botSpawner
@@ -1183,8 +1185,8 @@
description: "<strong>convert</strong> all your bots to <strong>nail-bots</strong><br><strong>500%</strong> increased nail-bot <strong>fire rate</strong>", description: "<strong>convert</strong> all your bots to <strong>nail-bots</strong><br><strong>500%</strong> increased nail-bot <strong>fire rate</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return tech.nailBotCount > 1 && !b.hasBotUpgrade() return tech.nailBotCount > 1 && !b.hasBotUpgrade()
@@ -1241,8 +1243,8 @@
description: "<strong>convert</strong> all your bots to <strong>foam-bots</strong><br><strong>250%</strong> increased foam <strong>size</strong> and <strong>fire rate</strong>", description: "<strong>convert</strong> all your bots to <strong>foam-bots</strong><br><strong>250%</strong> increased foam <strong>size</strong> and <strong>fire rate</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return tech.foamBotCount > 1 && !b.hasBotUpgrade() return tech.foamBotCount > 1 && !b.hasBotUpgrade()
@@ -1299,8 +1301,8 @@
description: "<strong>convert</strong> all your bots to <strong>boom-bots</strong><br><strong>250%</strong> increased <strong class='color-e'>explosion</strong> <strong class='color-d'>damage</strong> and size", description: "<strong>convert</strong> all your bots to <strong>boom-bots</strong><br><strong>250%</strong> increased <strong class='color-e'>explosion</strong> <strong class='color-d'>damage</strong> and size",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return tech.boomBotCount > 1 && !b.hasBotUpgrade() return tech.boomBotCount > 1 && !b.hasBotUpgrade()
@@ -1357,8 +1359,8 @@
description: "<strong>convert</strong> all your bots to <strong>laser-bots</strong><br><strong>75%</strong> improved <strong class='color-d'>damage</strong>, efficiency, and range", // <strong>400%</strong> increased <strong>laser-bot</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>", description: "<strong>convert</strong> all your bots to <strong>laser-bots</strong><br><strong>75%</strong> improved <strong class='color-d'>damage</strong>, efficiency, and range", // <strong>400%</strong> increased <strong>laser-bot</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return tech.laserBotCount > 1 && !b.hasBotUpgrade() return tech.laserBotCount > 1 && !b.hasBotUpgrade()
@@ -1415,8 +1417,8 @@
description: "<strong>convert</strong> all your bots to <strong>orbital-bots</strong><br>increase <strong class='color-d'>damage</strong> by <strong>250%</strong> and <strong>radius</strong> by <strong>40%</strong>", description: "<strong>convert</strong> all your bots to <strong>orbital-bots</strong><br>increase <strong class='color-d'>damage</strong> by <strong>250%</strong> and <strong>radius</strong> by <strong>40%</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return tech.orbitBotCount > 1 && !b.hasBotUpgrade() return tech.orbitBotCount > 1 && !b.hasBotUpgrade()
@@ -1482,8 +1484,8 @@
description: "<strong>convert</strong> your bots to <strong>dynamo-bots</strong><br>increase regen to <strong>16</strong> <strong class='color-f'>energy</strong> per second", description: "<strong>convert</strong> your bots to <strong>dynamo-bots</strong><br>increase regen to <strong>16</strong> <strong class='color-f'>energy</strong> per second",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return tech.dynamoBotCount > 1 && !b.hasBotUpgrade() return tech.dynamoBotCount > 1 && !b.hasBotUpgrade()
@@ -1519,9 +1521,9 @@
frequencyDefault: 2, frequencyDefault: 2,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return powerUps.research.count > 2 || build.isExperimentSelection return powerUps.research.count > 1 || build.isExperimentSelection
}, },
requires: "at least 3 research", requires: "at least 2 research",
effect() { effect() {
tech.isRerollBots = true; tech.isRerollBots = true;
powerUps.research.changeRerolls(0) powerUps.research.changeRerolls(0)
@@ -1529,6 +1531,7 @@
}, },
remove() { remove() {
tech.isRerollBots = false; tech.isRerollBots = false;
this.description = `if you collect ${powerUps.orb.research(2 + Math.floor(0.2 * b.totalBots()))}use them to build a<br>random <strong class='color-bot'>bot</strong> <em>(+1 cost every 5 bots)</em>`
} }
}, },
{ {
@@ -1571,9 +1574,9 @@
frequencyDefault: 2, frequencyDefault: 2,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return b.totalBots() > 3 && !tech.isEnergyHealth return b.totalBots() > 2 && !tech.isEnergyHealth
}, },
requires: "at least 4 bots", requires: "at least 3 bots",
effect() { effect() {
tech.isBotArmor = true tech.isBotArmor = true
}, },
@@ -1590,9 +1593,9 @@
frequencyDefault: 2, frequencyDefault: 2,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return b.totalBots() > 3 return b.totalBots() > 2
}, },
requires: "at least 4 bots", requires: "at least 3 bots",
effect() { effect() {
tech.isBotDamage = true tech.isBotDamage = true
}, },
@@ -1663,8 +1666,8 @@
description: "charge <strong>throws</strong> more <strong>quickly</strong> for less <strong class='color-f'>energy</strong><br>increase <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong> by <strong>200%</strong>", description: "charge <strong>throws</strong> more <strong>quickly</strong> for less <strong class='color-f'>energy</strong><br>increase <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong> by <strong>200%</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name !== "wormhole" return m.fieldUpgrades[m.fieldMode].name !== "wormhole"
}, },
@@ -2066,8 +2069,8 @@
description: `<strong class='color-s'>freeze</strong> all mobs for <strong>7</strong> seconds<br>after receiving <strong class='color-harm'>harm</strong>`, description: `<strong class='color-s'>freeze</strong> all mobs for <strong>7</strong> seconds<br>after receiving <strong class='color-harm'>harm</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 3, frequency: 2,
frequencyDefault: 3, frequencyDefault: 2,
allowed() { allowed() {
return tech.isSlowFPS return tech.isSlowFPS
}, },
@@ -2102,8 +2105,8 @@
description: "reduce <strong class='color-harm'>harm</strong> by <strong>33%</strong><br>after <strong>dying</strong>, continue in an <strong class='alt'>alternate reality</strong>", description: "reduce <strong class='color-harm'>harm</strong> by <strong>33%</strong><br>after <strong>dying</strong>, continue in an <strong class='alt'>alternate reality</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 3, frequency: 1,
frequencyDefault: 3, frequencyDefault: 1,
allowed() { allowed() {
return true return true
}, },
@@ -2142,8 +2145,8 @@
description: "rebuild your broken parts as <strong>drones</strong><br>chance to occur after receiving <strong class='color-harm'>harm</strong>", description: "rebuild your broken parts as <strong>drones</strong><br>chance to occur after receiving <strong class='color-harm'>harm</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return m.harmReduction() < 1 return m.harmReduction() < 1
}, },
@@ -2203,7 +2206,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { //&& (m.fieldUpgrades[m.fieldMode].name !== "molecular assembler" || m.maxEnergy > 1) allowed() { //&& (m.fieldUpgrades[m.fieldMode].name !== "molecular assembler" || m.maxEnergy > 1)
return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isEnergyHealth && !tech.isRewindGun return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isEnergyHealth && !tech.isRewindField //&& !tech.isRewindGun
}, },
requires: "not standing wave, mass-energy, max energy reduction, CPT gun", requires: "not standing wave, mass-energy, max energy reduction, CPT gun",
effect() { effect() {
@@ -2223,9 +2226,9 @@
frequencyDefault: 2, frequencyDefault: 2,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return tech.isRewindAvoidDeath return tech.isRewindAvoidDeath || tech.isRewindField
}, },
requires: "CPT", requires: "CPT, retrocausality",
effect() { effect() {
tech.isRewindBot++; tech.isRewindBot++;
}, },
@@ -2236,15 +2239,15 @@
{ {
name: "causality bombs", name: "causality bombs",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Causality' class="link">causality bombs</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Causality' class="link">causality bombs</a>`,
description: "before you <strong class='color-rewind'>rewind</strong> drop several <strong>grenades</strong><br>become immune to <strong class='color-harm'>harm</strong> until they <strong class='color-e'>explode</strong>", description: "when you <strong class='color-rewind'>rewind</strong> drop several <strong>grenades</strong><br>become immune to <strong class='color-harm'>harm</strong> until they <strong class='color-e'>explode</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isRewindAvoidDeath return tech.isRewindAvoidDeath || tech.isRewindField
}, },
requires: "CPT", requires: "CPT, retrocausality",
effect() { effect() {
tech.isRewindGrenade = true; tech.isRewindGrenade = true;
}, },
@@ -2299,7 +2302,7 @@
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
return !tech.isZeno && !tech.isNoHeals && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isRewindGun && !tech.isTechDamage && !tech.isMutualism //&& !tech.isAmmoFromHealth return !tech.isZeno && !tech.isNoHeals && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isTechDamage && !tech.isMutualism //&& !tech.isAmmoFromHealth && !tech.isRewindGun
}, },
requires: "not Zeno, ergodicity, piezoelectricity, CPT, rewind gun, antiscience, mutualism", requires: "not Zeno, ergodicity, piezoelectricity, CPT, rewind gun, antiscience, mutualism",
effect: () => { effect: () => {
@@ -2392,8 +2395,8 @@
description: "increase <strong class='color-d'>damage</strong> by <strong>1%</strong><br>for every <strong>11</strong> stored <strong class='color-f'>energy</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>1%</strong><br>for every <strong>11</strong> stored <strong class='color-f'>energy</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return true return true
}, },
@@ -2428,8 +2431,8 @@
description: "increase <strong class='color-d'>damage</strong> by <strong>50%</strong><br>if a mob <strong>dies</strong> drain <strong class='color-f'>energy</strong> by <strong>25%</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>50%</strong><br>if a mob <strong>dies</strong> drain <strong class='color-f'>energy</strong> by <strong>25%</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return true return true
}, },
@@ -2446,8 +2449,8 @@
description: `increase <strong class='color-d'>damage</strong> by <strong>50%</strong>, but<br>reduce maximum <strong class='color-f'>energy</strong> by <strong>50</strong>`, description: `increase <strong class='color-d'>damage</strong> by <strong>50%</strong>, but<br>reduce maximum <strong class='color-f'>energy</strong> by <strong>50</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 4, frequency: 3,
frequencyDefault: 4, frequencyDefault: 3,
allowed() { allowed() {
return tech.isEnergyLoss && !tech.isRewindAvoidDeath return tech.isEnergyLoss && !tech.isRewindAvoidDeath
}, },
@@ -2466,8 +2469,8 @@
description: `increase <strong class='color-d'>damage</strong> by <strong>5%</strong><br>for every <strong>10</strong> <strong class='color-f'>energy</strong> below <strong>100</strong>`, description: `increase <strong class='color-d'>damage</strong> by <strong>5%</strong><br>for every <strong>10</strong> <strong class='color-f'>energy</strong> below <strong>100</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 4, frequency: 3,
frequencyDefault: 4, frequencyDefault: 3,
allowed() { allowed() {
return tech.isEnergyLoss && m.maxEnergy < 1.01 return tech.isEnergyLoss && m.maxEnergy < 1.01
}, },
@@ -2626,8 +2629,8 @@
// description: "every <strong>5</strong> seconds remove <strong>1/10</strong> of your <strong class='color-h'>health</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>90%</strong>", // description: "every <strong>5</strong> seconds remove <strong>1/10</strong> of your <strong class='color-h'>health</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>90%</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return !tech.isEnergyHealth return !tech.isEnergyHealth
}, },
@@ -2717,8 +2720,8 @@
description: "increase your <strong>maximum</strong> <strong class='color-h'>health</strong> by <strong>100</strong><br><strong>landings</strong> that force you to crouch cause <strong class='color-harm'>harm</strong>", description: "increase your <strong>maximum</strong> <strong class='color-h'>health</strong> by <strong>100</strong><br><strong>landings</strong> that force you to crouch cause <strong class='color-harm'>harm</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return !tech.isEnergyHealth return !tech.isEnergyHealth
}, },
@@ -2738,8 +2741,8 @@
description: `over healing from ${powerUps.orb.heal()} does <strong class='color-harm'>harm</strong><br>but it also increase your <strong>maximum</strong> <strong class='color-h'>health</strong>`, description: `over healing from ${powerUps.orb.heal()} does <strong class='color-harm'>harm</strong><br>but it also increase your <strong>maximum</strong> <strong class='color-h'>health</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return !tech.isEnergyHealth && !tech.isNoHeals return !tech.isEnergyHealth && !tech.isNoHeals
}, },
@@ -2772,11 +2775,11 @@
}, },
{ {
name: "adiabatic healing", name: "adiabatic healing",
description: `${powerUps.orb.heal()} are <strong>100%</strong> more effective`, description: `${powerUps.orb.heal()} are <strong>100%</strong> more effective<br><strong>+5%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool`,
maxCount: 3, maxCount: 3,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
isHealTech: true, isHealTech: true,
allowed() { allowed() {
return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth && !tech.isNoHeals return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth && !tech.isNoHeals
@@ -2784,9 +2787,15 @@
requires: "under 70% health, not mass-energy equivalence, ergodicity", requires: "under 70% health, not mass-energy equivalence, ergodicity",
effect() { effect() {
tech.largerHeals++; tech.largerHeals++;
this.refundAmount += tech.addJunkTechToPool(0.05)
}, },
refundAmount: 0,
remove() { remove() {
tech.largerHeals = 1; tech.largerHeals = 1;
if (this.count > 0 && this.refundAmount > 0) {
tech.removeJunkTechFromPool(this.refundAmount)
this.refundAmount = 0
}
} }
}, },
{ {
@@ -2821,8 +2830,8 @@
description: `once per level, instead of <strong>dying</strong><br>use ${powerUps.orb.research(1)} and spawn ${powerUps.orb.heal(5)}`, description: `once per level, instead of <strong>dying</strong><br>use ${powerUps.orb.research(1)} and spawn ${powerUps.orb.heal(5)}`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
isHealTech: true, isHealTech: true,
allowed() { allowed() {
return powerUps.research.count > 0 || build.isExperimentSelection return powerUps.research.count > 0 || build.isExperimentSelection
@@ -3007,8 +3016,8 @@
description: `after choosing a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawn ${powerUps.orb.research(2)}if you have 0 ${powerUps.orb.research(1)} in your inventory`, description: `after choosing a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawn ${powerUps.orb.research(2)}if you have 0 ${powerUps.orb.research(1)} in your inventory`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste && !tech.isResearchReality return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste && !tech.isResearchReality
}, },
@@ -3255,8 +3264,8 @@
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", 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,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return tech.duplicationChance() > 0.15 return tech.duplicationChance() > 0.15
}, },
@@ -3273,8 +3282,8 @@
description: "<span style = 'font-size:90%;'> <strong>bosses</strong> have a <strong>2x</strong> chance to be <strong class='color-dup'>duplicated</strong>, but their<br><strong>health</strong> is increased by your <strong class='color-dup'>duplication</strong> chance</span>", description: "<span style = 'font-size:90%;'> <strong>bosses</strong> have a <strong>2x</strong> chance to be <strong class='color-dup'>duplicated</strong>, but their<br><strong>health</strong> is increased by your <strong class='color-dup'>duplication</strong> chance</span>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return tech.duplicationChance() > 0 && !tech.isResearchBoss return tech.duplicationChance() > 0 && !tech.isResearchBoss
}, },
@@ -3291,8 +3300,8 @@
description: `when you reach <strong>100%</strong> <strong class='color-dup'>duplication</strong><br>spawn <strong>8 bosses</strong> with <strong>100%</strong> more <strong>health</strong>`, description: `when you reach <strong>100%</strong> <strong class='color-dup'>duplication</strong><br>spawn <strong>8 bosses</strong> with <strong>100%</strong> more <strong>health</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 3, frequency: 2,
frequencyDefault: 3, frequencyDefault: 2,
allowed() { allowed() {
return tech.duplicationChance() > 0.33 return tech.duplicationChance() > 0.33
}, },
@@ -3305,34 +3314,9 @@
tech.is100Duplicate = false; tech.is100Duplicate = false;
} }
}, },
// {
// name: "zero point energy",
// description: "use <strong>2</strong> <strong class='color-r'>research</strong> to<br>increase your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>74</strong>",
// isFieldTech: true,
// maxCount: 1,
// count: 0,
// frequency: 3,
// frequencyDefault: 3,
// allowed() {
// return (m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && (build.isExperimentSelection || powerUps.research.count > 1)
// },
// requires: "standing wave or pilot wave",
// effect() {
// tech.harmonicEnergy = 0.74
// m.setMaxEnergy()
// for (let i = 0; i < 2; i++) {
// if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
// }
// },
// remove() {
// tech.harmonicEnergy = 0;
// m.setMaxEnergy()
// if (this.count > 0) powerUps.research.changeRerolls(2)
// }
// },
{ {
name: "exchange symmetry", name: "exchange symmetry",
description: "convert <strong>1</strong> random <strong class='color-m'>tech</strong> into <strong>3</strong> new <strong class='color-g'>guns</strong><br><em>recursive tech lose all stacks</em>", description: "convert <strong>1</strong> random <strong class='color-m'>tech</strong> into <strong>2</strong> new <strong class='color-g'>guns</strong><br><em>recursive tech lose all stacks</em>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3354,7 +3338,7 @@
powerUps.spawn(m.pos.x, m.pos.y, "gun"); powerUps.spawn(m.pos.x, m.pos.y, "gun");
} }
powerUps.spawn(m.pos.x, m.pos.y, "gun"); powerUps.spawn(m.pos.x, m.pos.y, "gun");
powerUps.spawn(m.pos.x, m.pos.y, "gun"); // powerUps.spawn(m.pos.x, m.pos.y, "gun");
tech.tech[choose].count = 0; tech.tech[choose].count = 0;
tech.tech[choose].remove(); // remove a random tech form the list of tech you have tech.tech[choose].remove(); // remove a random tech form the list of tech you have
tech.tech[choose].isLost = true tech.tech[choose].isLost = true
@@ -3372,9 +3356,9 @@
isNonRefundable: true, isNonRefundable: true,
isBadRandomOption: true, isBadRandomOption: true,
allowed() { allowed() {
return (tech.totalCount > 3) && !tech.isSuperDeterminism && tech.duplicationChance() > 0 return (tech.totalCount > 3) && !tech.isSuperDeterminism
}, },
requires: "NOT EXPERIMENT MODE, at least 4 tech, a chance to duplicate power ups, not superdeterminism", requires: "NOT EXPERIMENT MODE, at least 4 tech, not superdeterminism",
effect: () => { effect: () => {
const removeTotal = tech.removeTech() const removeTotal = tech.removeTech()
for (let i = 0; i < removeTotal + 1; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); for (let i = 0; i < removeTotal + 1; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech");
@@ -3506,7 +3490,7 @@
}, },
{ {
name: "cross disciplinary", name: "cross disciplinary",
description: "<strong class='color-m'>tech</strong> have an extra <strong class='color-f'>field</strong> or <strong class='color-g'>gun</strong> <strong>choice</strong>", //<br><strong>+7</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool //<br>spawn <strong>2</strong> <strong class='color-r'>research</strong> description: "<strong class='color-m'>tech</strong> have an extra <strong class='color-f'>field</strong> or <strong class='color-g'>gun</strong> <strong>choice</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3527,7 +3511,7 @@
}, },
{ {
name: "emergence", name: "emergence",
description: "<strong class='color-m'>tech</strong>, <strong class='color-f'>fields</strong>, and <strong class='color-g'>guns</strong> have <strong>5</strong> <strong>choices</strong><br><strong>+5</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool", description: "<strong class='color-m'>tech</strong>, <strong class='color-f'>fields</strong>, and <strong class='color-g'>guns</strong> have <strong>5</strong> <strong>choices</strong><br><strong>+5%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3590,8 +3574,8 @@
description: `spawn <strong>5</strong> <strong class='color-m'>tech</strong><br>${powerUps.orb.research(1)}, <strong class='color-g'>guns</strong>, and <strong class='color-f'>fields</strong> no longer <strong>spawn</strong>`, description: `spawn <strong>5</strong> <strong class='color-m'>tech</strong><br>${powerUps.orb.research(1)}, <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,
frequency: 8, frequency: 5,
frequencyDefault: 8, frequencyDefault: 5,
isBadRandomOption: true, isBadRandomOption: true,
allowed() { allowed() {
return tech.isDeterminism && !tech.isAnsatz && !tech.isGunSwitchField return tech.isDeterminism && !tech.isAnsatz && !tech.isGunSwitchField
@@ -3670,51 +3654,51 @@
//************************************************** gun //************************************************** gun
//************************************************** tech //************************************************** tech
//************************************************** //**************************************************
{ // {
name: "CPT gun", // name: "CPT gun",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/CPT_symmetry' class="link">CPT gun</a>`, // link: `<a target="_blank" href='https://en.wikipedia.org/wiki/CPT_symmetry' class="link">CPT gun</a>`,
description: `adds the <strong>CPT</strong> <strong class='color-g'>gun</strong> to your inventory<br>it <strong>rewinds</strong> your <strong class='color-h'>health</strong>, <strong>velocity</strong>, and <strong>position</strong>`, // description: `adds the <strong>CPT</strong> <strong class='color-g'>gun</strong> to your inventory<br>it <strong>rewinds</strong> your <strong class='color-h'>health</strong>, <strong>velocity</strong>, and <strong>position</strong>`,
isGunTech: true, // isGunTech: true,
maxCount: 1, // maxCount: 1,
count: 0, // count: 0,
frequency: 2, // frequency: 2,
frequencyDefault: 2, // frequencyDefault: 2,
allowed() { // allowed() {
return (b.totalBots() > 3 || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection || // return (b.totalBots() > 3 || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection ||
}, // },
requires: "bots > 3, plasma torch, assembler, pilot wave, not mass-energy equivalence, CPT", // requires: "bots > 3, plasma torch, assembler, pilot wave, not mass-energy equivalence, CPT",
effect() { // effect() {
tech.isRewindGun = true // tech.isRewindGun = true
b.guns.push(b.gunRewind) // b.guns.push(b.gunRewind)
b.giveGuns("CPT gun"); // b.giveGuns("CPT gun");
}, // },
remove() { // remove() {
if (tech.isRewindGun) { // if (tech.isRewindGun) {
b.removeGun("CPT gun", true) // b.removeGun("CPT gun", true)
// for (let i = 0; i < b.guns.length; i++) { // // for (let i = 0; i < b.guns.length; i++) {
// if (b.guns[i].name === "CPT gun") { // // if (b.guns[i].name === "CPT gun") {
// b.guns[i].have = false // // b.guns[i].have = false
// for (let j = 0; j < b.inventory.length; j++) { // // for (let j = 0; j < b.inventory.length; j++) {
// if (b.inventory[j] === i) { // // if (b.inventory[j] === i) {
// b.inventory.splice(j, 1) // // b.inventory.splice(j, 1)
// break // // break
// } // // }
// } // // }
// if (b.inventory.length) { // // if (b.inventory.length) {
// b.activeGun = b.inventory[0]; // // b.activeGun = b.inventory[0];
// } else { // // } else {
// b.activeGun = null; // // b.activeGun = null;
// } // // }
// simulation.makeGunHUD(); // // simulation.makeGunHUD();
// b.guns.splice(i, 1) //also remove CPT gun from gun pool array // // b.guns.splice(i, 1) //also remove CPT gun from gun pool array
// break // // break
// // }
// // }
// tech.isRewindGun = false
// } // }
// } // }
tech.isRewindGun = false // },
}
}
},
{ {
name: "needle ice", name: "needle ice",
description: `when <strong>needles</strong> impact walls<br>they chip off <strong>1-2</strong> freezing <strong class='color-s'>ice IX</strong> crystals`, description: `when <strong>needles</strong> impact walls<br>they chip off <strong>1-2</strong> freezing <strong class='color-s'>ice IX</strong> crystals`,
@@ -5883,9 +5867,9 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || m.fieldUpgrades[m.fieldMode].name === "time dilation" return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || (m.fieldUpgrades[m.fieldMode].name === "time dilation" && !tech.isRewindField)
}, },
requires: "pilot wave, negative mass, time dilation", requires: "pilot wave, negative mass, time dilation, not retrocausality",
effect() { effect() {
tech.isFreezeMobs = true tech.isFreezeMobs = true
}, },
@@ -6255,6 +6239,52 @@
tech.extruderRange = 15 tech.extruderRange = 15
} }
}, },
// {
// name: "CPT gun",
// link: `<a target="_blank" href='https://en.wikipedia.org/wiki/CPT_symmetry' class="link">CPT gun</a>`,
// description: `adds the <strong>CPT</strong> <strong class='color-g'>gun</strong> to your inventory<br>it <strong>rewinds</strong> your <strong class='color-h'>health</strong>, <strong>velocity</strong>, and <strong>position</strong>`,
// isGunTech: true,
// maxCount: 1,
// count: 0,
// frequency: 2,
// frequencyDefault: 2,
// allowed() {
// return (b.totalBots() > 3 || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection ||
// },
// requires: "bots > 3, plasma torch, assembler, pilot wave, not mass-energy equivalence, CPT",
// effect() {
// tech.isRewindGun = true
// b.guns.push(b.gunRewind)
// b.giveGuns("CPT gun");
// },
// remove() {
// if (tech.isRewindGun) {
// b.removeGun("CPT gun", true)
// tech.isRewindGun = false
// }
// }
// },
{
name: "retrocausality",
description: "<strong>time dilation</strong> uses <strong class='color-f'>energy</strong> to <strong>rewind</strong> your<br><strong class='color-h'>health</strong>, <strong>velocity</strong>, and <strong>position</strong> up to <strong>10</strong> s",
isFieldTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation" && !m.isShipMode && !tech.isRewindAvoidDeath && !tech.isEnergyHealth && !tech.isTimeSkip && !tech.isFreezeMobs
},
requires: "time dilation, not CPT symmetry, mass-energy, timelike, Bose Einstein condensate",
effect() {
tech.isRewindField = true;
m.fieldUpgrades[m.fieldMode].set()
},
remove() {
tech.isRewindField = false;
if (this.count) m.fieldUpgrades[m.fieldMode].set()
}
},
{ {
name: "timelike", name: "timelike",
description: "<strong>time dilation</strong> doubles your relative time <strong>rate</strong><br>and makes you <strong>immune</strong> to <strong class='color-harm'>harm</strong>", description: "<strong>time dilation</strong> doubles your relative time <strong>rate</strong><br>and makes you <strong>immune</strong> to <strong class='color-harm'>harm</strong>",
@@ -6264,9 +6294,9 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation" && !m.isShipMode return m.fieldUpgrades[m.fieldMode].name === "time dilation" && !m.isShipMode && !tech.isRewindField
}, },
requires: "time dilation", requires: "time dilation, not retrocausality",
effect() { effect() {
tech.isTimeSkip = true; tech.isTimeSkip = true;
b.setFireCD(); b.setFireCD();
@@ -8679,7 +8709,7 @@
isRewindGrenade: null, isRewindGrenade: null,
isExtruder: null, isExtruder: null,
isEndLevelPowerUp: null, isEndLevelPowerUp: null,
isRewindGun: null, // isRewindGun: null,
missileSize: null, missileSize: null,
isLaserMine: null, isLaserMine: null,
isAmmoFoamSize: null, isAmmoFoamSize: null,
@@ -8791,5 +8821,6 @@
baseJumpForce: null, baseJumpForce: null,
baseFx: null, baseFx: null,
isNeutronium: null, isNeutronium: null,
isFreeWormHole: null isFreeWormHole: null,
isRewindField: null
} }

View File

@@ -1,20 +1,32 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
field tech balance: time dilation tech: retrocausality - instead of pausing time your field rewinds time, including your health
pilot wave has access to more field tech: time crystals, WIMPs, no-cloning this tech replaces replaces CPT gun
time dilation: can get symbiosis works well with tech: causality bots and grenades
flux pinning: 2s -> 4s stun on blocking
zero point energy: 74 energy -> 100 energy
tessellation: 4->2 research cost
bremsstrahlung: 33% more damage
triple point: 50% more ice
bug fixes wormhole
activated on mouse up
draw an outline of the wormhole to show if can work at your mouse location
adiabatic healing: adds 5% JUNK in addition to 100% better heals
several tech pool frequencies have been adjusted to roughly this rule:
no requirements: 1x chance
requirements: 2x chance
(most gun and field tech)
strict requirements: 3x chance or higher
bug fixes
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
tech perfect diamagnetism - holding the field makes the field slowly travel forward make causality bots and bombs work with retrocausality
could be base effect
tech: after bullets hit a mob, the mob takes 1% more damage
this.damageReduction *= 1.01
make CPT gun a tech for time dilation field
tech: CPT - time dilation field rewinds your health velocity and position
bug - death while paused crashes game? bug - death while paused crashes game?
@@ -53,13 +65,6 @@ be nice if block throwing had a projected path
JUNK tech: planetesimals game inside n-gon JUNK tech: planetesimals game inside n-gon
https://codepen.io/lilgreenland/pen/jrMvaB?editors=0010 https://codepen.io/lilgreenland/pen/jrMvaB?editors=0010
on mouse down wormhole shows a possible wormhole
on mouse up the wormhole becomes real
make the player get a buff after using wormhole
while energy lasts: drain energy and give damage buff
using wormhole makes you immune to harm and drains energy until you run out
disable incoming energy, by saving current energy and just setting energy in the next cycle to be lower then the saved value
Pilot wave tech Pilot wave tech
Energy use is increased, but you can now shape blocks using pressure Energy use is increased, but you can now shape blocks using pressure
Grouping blocks will merge them into a massive ball Grouping blocks will merge them into a massive ball