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:
@@ -5390,7 +5390,7 @@ const b = {
|
||||
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",
|
||||
ammo: 0,
|
||||
ammoPack: 3.5,
|
||||
ammoPack: 3.8,
|
||||
have: false,
|
||||
do() {},
|
||||
fire() {
|
||||
|
||||
10
js/level.js
10
js/level.js
@@ -15,13 +15,13 @@ const level = {
|
||||
// localSettings.levelsClearedLastGame = 10
|
||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||
// simulation.isHorizontalFlipped = true
|
||||
// m.setField("negative mass")
|
||||
// m.setField("time dilation")
|
||||
// b.giveGuns("harpoon")
|
||||
// tech.giveTech("rotary cannon")
|
||||
// tech.giveTech("fragmentation")
|
||||
// tech.giveTech("rivet gun")
|
||||
// tech.giveTech("retrocausality")
|
||||
// tech.giveTech("causality bots")
|
||||
// tech.giveTech("causality bombs")
|
||||
// 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 < 2; i++) tech.giveTech("laser-bot")
|
||||
// tech.isCancelDuplication = true
|
||||
|
||||
@@ -45,7 +45,7 @@ const mobs = {
|
||||
applySlow(who)
|
||||
//look for mobs near the target
|
||||
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++) {
|
||||
if (who !== mob[i] && Vector.magnitudeSquared(Vector.sub(who.position, mob[i].position)) < range2 + mob[i].radius) applySlow(mob[i])
|
||||
}
|
||||
|
||||
362
js/player.js
362
js/player.js
@@ -133,6 +133,7 @@ const m = {
|
||||
transX: 0,
|
||||
transY: 0,
|
||||
history: [], //tracks the last second of player position
|
||||
rewindCount: 0, //used with CPT gun
|
||||
resetHistory() {
|
||||
for (let i = 0; i < 600; i++) { //reset history
|
||||
m.history[i] = {
|
||||
@@ -298,7 +299,7 @@ const m = {
|
||||
},
|
||||
alive: false,
|
||||
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
|
||||
//remove all tech and count current tech total
|
||||
let totalTech = 0;
|
||||
@@ -932,7 +933,7 @@ const m = {
|
||||
holdingMassScale: 0,
|
||||
hole: {
|
||||
isOn: false,
|
||||
isReady: true,
|
||||
isReady: false,
|
||||
pos1: {
|
||||
x: 0,
|
||||
y: 0
|
||||
@@ -983,7 +984,7 @@ const m = {
|
||||
// m.setMaxEnergy();
|
||||
m.hole = {
|
||||
isOn: false,
|
||||
isReady: true,
|
||||
isReady: false,
|
||||
pos1: {
|
||||
x: 0,
|
||||
y: 0
|
||||
@@ -2126,8 +2127,177 @@ const m = {
|
||||
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><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: () => {
|
||||
// m.fieldMeterColor = "#000"
|
||||
set() {
|
||||
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.isBodiesAsleep = false;
|
||||
m.drain = 0.0005
|
||||
@@ -2139,7 +2309,7 @@ const m = {
|
||||
m.throwBlock();
|
||||
} else if (input.field && m.fieldCDcycle < m.cycle) {
|
||||
m.grabPowerUp();
|
||||
m.lookForPickUp(180);
|
||||
m.lookForPickUp();
|
||||
|
||||
m.drain += 0.0000025
|
||||
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"
|
||||
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>
|
||||
effect: function() {
|
||||
m.duplicateChance = 0.07
|
||||
m.fieldRange = 0
|
||||
powerUps.setDupChance(); //needed after adjusting duplication chance
|
||||
|
||||
m.hold = function() {
|
||||
@@ -2871,12 +3047,60 @@ const m = {
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
if (m.fieldCDcycle < m.cycle) {
|
||||
const scale = 60
|
||||
// console.log(Matter.Query.region(map, bounds))
|
||||
if (m.hole.isReady &&
|
||||
(
|
||||
const justPastMouse = Vector.add(Vector.mult(Vector.normalise(Vector.sub(simulation.mouseInGame, m.pos)), 50), simulation.mouseInGame)
|
||||
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, {
|
||||
min: {
|
||||
x: simulation.mouseInGame.x - scale,
|
||||
@@ -2888,15 +3112,7 @@ const m = {
|
||||
}
|
||||
}).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.hole.isReady = false;
|
||||
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()
|
||||
}
|
||||
},
|
||||
rewindCount: 0,
|
||||
|
||||
// rewind: function() {
|
||||
// if (input.down) {
|
||||
// if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
|
||||
|
||||
@@ -292,6 +292,7 @@ const powerUps = {
|
||||
|
||||
document.body.style.cursor = "none";
|
||||
// document.body.style.overflow = "hidden"
|
||||
// if (m.alive){}
|
||||
simulation.paused = false;
|
||||
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
|
||||
|
||||
@@ -523,6 +523,8 @@ const simulation = {
|
||||
// document.getElementById("choose-grid").style.display = "none"
|
||||
document.getElementById("choose-grid").style.visibility = "hidden"
|
||||
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.opacity = "0";
|
||||
document.getElementById("experiment-button").style.display = "inline"
|
||||
|
||||
363
js/tech.js
363
js/tech.js
@@ -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>`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return b.inventory.length > 1 && !tech.isEnergyHealth
|
||||
},
|
||||
@@ -401,6 +401,7 @@
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
isNonRefundable: true,
|
||||
// isExperimentHide: true,
|
||||
isBadRandomOption: true,
|
||||
@@ -423,8 +424,8 @@
|
||||
maxCount: 1, //random power up
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
isNonRefundable: true,
|
||||
// isExperimentHide: true,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 4,
|
||||
frequencyDefault: 4,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
allowed() {
|
||||
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",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 9,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return true
|
||||
},
|
||||
@@ -714,8 +715,8 @@
|
||||
description: "<strong>30%</strong> decreased <strong><em>delay</em></strong> after firing",
|
||||
maxCount: 9,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return true
|
||||
},
|
||||
@@ -884,6 +885,7 @@
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
isBadRandomOption: true,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 9,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
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
|
||||
},
|
||||
@@ -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",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
allowed() {
|
||||
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",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
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",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
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",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
return tech.dynamoBotCount > 1 && !b.hasBotUpgrade()
|
||||
@@ -1519,9 +1521,9 @@
|
||||
frequencyDefault: 2,
|
||||
isBotTech: true,
|
||||
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() {
|
||||
tech.isRerollBots = true;
|
||||
powerUps.research.changeRerolls(0)
|
||||
@@ -1529,6 +1531,7 @@
|
||||
},
|
||||
remove() {
|
||||
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,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
return b.totalBots() > 3 && !tech.isEnergyHealth
|
||||
return b.totalBots() > 2 && !tech.isEnergyHealth
|
||||
},
|
||||
requires: "at least 4 bots",
|
||||
requires: "at least 3 bots",
|
||||
effect() {
|
||||
tech.isBotArmor = true
|
||||
},
|
||||
@@ -1590,9 +1593,9 @@
|
||||
frequencyDefault: 2,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
return b.totalBots() > 3
|
||||
return b.totalBots() > 2
|
||||
},
|
||||
requires: "at least 4 bots",
|
||||
requires: "at least 3 bots",
|
||||
effect() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return m.harmReduction() < 1
|
||||
},
|
||||
@@ -2203,7 +2206,7 @@
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -2223,9 +2226,9 @@
|
||||
frequencyDefault: 2,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
return tech.isRewindAvoidDeath
|
||||
return tech.isRewindAvoidDeath || tech.isRewindField
|
||||
},
|
||||
requires: "CPT",
|
||||
requires: "CPT, retrocausality",
|
||||
effect() {
|
||||
tech.isRewindBot++;
|
||||
},
|
||||
@@ -2236,15 +2239,15 @@
|
||||
{
|
||||
name: "causality bombs",
|
||||
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,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return tech.isRewindAvoidDeath
|
||||
return tech.isRewindAvoidDeath || tech.isRewindField
|
||||
},
|
||||
requires: "CPT",
|
||||
requires: "CPT, retrocausality",
|
||||
effect() {
|
||||
tech.isRewindGrenade = true;
|
||||
},
|
||||
@@ -2299,7 +2302,7 @@
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
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",
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 4,
|
||||
frequencyDefault: 4,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
allowed() {
|
||||
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>`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 4,
|
||||
frequencyDefault: 4,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return !tech.isEnergyHealth && !tech.isNoHeals
|
||||
},
|
||||
@@ -2772,11 +2775,11 @@
|
||||
},
|
||||
{
|
||||
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,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
isHealTech: true,
|
||||
allowed() {
|
||||
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",
|
||||
effect() {
|
||||
tech.largerHeals++;
|
||||
this.refundAmount += tech.addJunkTechToPool(0.05)
|
||||
},
|
||||
refundAmount: 0,
|
||||
remove() {
|
||||
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)}`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
isHealTech: true,
|
||||
allowed() {
|
||||
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`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
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>`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return tech.duplicationChance() > 0.33
|
||||
},
|
||||
@@ -3305,34 +3314,9 @@
|
||||
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",
|
||||
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,
|
||||
count: 0,
|
||||
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");
|
||||
tech.tech[choose].count = 0;
|
||||
tech.tech[choose].remove(); // remove a random tech form the list of tech you have
|
||||
tech.tech[choose].isLost = true
|
||||
@@ -3372,9 +3356,9 @@
|
||||
isNonRefundable: true,
|
||||
isBadRandomOption: true,
|
||||
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: () => {
|
||||
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");
|
||||
@@ -3506,7 +3490,7 @@
|
||||
},
|
||||
{
|
||||
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,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
@@ -3527,7 +3511,7 @@
|
||||
},
|
||||
{
|
||||
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,
|
||||
count: 0,
|
||||
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>`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 8,
|
||||
frequencyDefault: 8,
|
||||
frequency: 5,
|
||||
frequencyDefault: 5,
|
||||
isBadRandomOption: true,
|
||||
allowed() {
|
||||
return tech.isDeterminism && !tech.isAnsatz && !tech.isGunSwitchField
|
||||
@@ -3670,51 +3654,51 @@
|
||||
//************************************************** gun
|
||||
//************************************************** tech
|
||||
//**************************************************
|
||||
{
|
||||
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)
|
||||
// for (let i = 0; i < b.guns.length; i++) {
|
||||
// if (b.guns[i].name === "CPT gun") {
|
||||
// b.guns[i].have = false
|
||||
// for (let j = 0; j < b.inventory.length; j++) {
|
||||
// if (b.inventory[j] === i) {
|
||||
// b.inventory.splice(j, 1)
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// if (b.inventory.length) {
|
||||
// b.activeGun = b.inventory[0];
|
||||
// } else {
|
||||
// b.activeGun = null;
|
||||
// }
|
||||
// simulation.makeGunHUD();
|
||||
// {
|
||||
// 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)
|
||||
// // for (let i = 0; i < b.guns.length; i++) {
|
||||
// // if (b.guns[i].name === "CPT gun") {
|
||||
// // b.guns[i].have = false
|
||||
// // for (let j = 0; j < b.inventory.length; j++) {
|
||||
// // if (b.inventory[j] === i) {
|
||||
// // b.inventory.splice(j, 1)
|
||||
// // break
|
||||
// // }
|
||||
// // }
|
||||
// // if (b.inventory.length) {
|
||||
// // b.activeGun = b.inventory[0];
|
||||
// // } else {
|
||||
// // b.activeGun = null;
|
||||
// // }
|
||||
// // simulation.makeGunHUD();
|
||||
|
||||
// b.guns.splice(i, 1) //also remove CPT gun from gun pool array
|
||||
// break
|
||||
// // b.guns.splice(i, 1) //also remove CPT gun from gun pool array
|
||||
// // break
|
||||
// // }
|
||||
// // }
|
||||
// tech.isRewindGun = false
|
||||
// }
|
||||
// }
|
||||
tech.isRewindGun = false
|
||||
}
|
||||
}
|
||||
},
|
||||
// },
|
||||
{
|
||||
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`,
|
||||
@@ -5883,9 +5867,9 @@
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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() {
|
||||
tech.isFreezeMobs = true
|
||||
},
|
||||
@@ -6255,6 +6239,52 @@
|
||||
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",
|
||||
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,
|
||||
frequencyDefault: 2,
|
||||
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() {
|
||||
tech.isTimeSkip = true;
|
||||
b.setFireCD();
|
||||
@@ -8679,7 +8709,7 @@
|
||||
isRewindGrenade: null,
|
||||
isExtruder: null,
|
||||
isEndLevelPowerUp: null,
|
||||
isRewindGun: null,
|
||||
// isRewindGun: null,
|
||||
missileSize: null,
|
||||
isLaserMine: null,
|
||||
isAmmoFoamSize: null,
|
||||
@@ -8791,5 +8821,6 @@
|
||||
baseJumpForce: null,
|
||||
baseFx: null,
|
||||
isNeutronium: null,
|
||||
isFreeWormHole: null
|
||||
isFreeWormHole: null,
|
||||
isRewindField: null
|
||||
}
|
||||
39
todo.txt
39
todo.txt
@@ -1,20 +1,32 @@
|
||||
******************************************************** NEXT PATCH **************************************************
|
||||
|
||||
field tech balance:
|
||||
pilot wave has access to more field tech: time crystals, WIMPs, no-cloning
|
||||
time dilation: can get symbiosis
|
||||
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
|
||||
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
|
||||
|
||||
******************************************************** TODO ********************************************************
|
||||
|
||||
tech perfect diamagnetism - holding the field makes the field slowly travel forward
|
||||
could be base effect
|
||||
make causality bots and bombs work with retrocausality
|
||||
|
||||
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?
|
||||
|
||||
@@ -53,13 +65,6 @@ be nice if block throwing had a projected path
|
||||
JUNK tech: planetesimals game inside n-gon
|
||||
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
|
||||
Energy use is increased, but you can now shape blocks using pressure
|
||||
Grouping blocks will merge them into a massive ball
|
||||
|
||||
Reference in New Issue
Block a user