diff --git a/js/bullet.js b/js/bullet.js
index 4f04a9c..7926bc1 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -5112,7 +5112,7 @@ const b = {
minDmgSpeed: 2,
lookFrequency: 20 + Math.floor(7 * Math.random()) - 13 * tech.isLaserBotUpgrade,
range: (700 + 500 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()),
- drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4,// laser bot will not attack if the player is below this energy
+ drainThreshold: 0.15 + 0.5 * Math.random() + (tech.isEnergyHealth ? 0.3 : 0),// laser bot will not attack if the player is below this energy
drain: (0.57 - 0.45 * tech.isLaserBotUpgrade) * tech.laserDrain,
laserDamage: 0.75 + 0.75 * tech.isLaserBotUpgrade,
endCycle: Infinity,
diff --git a/js/level.js b/js/level.js
index 348fee5..c819eba 100644
--- a/js/level.js
+++ b/js/level.js
@@ -18,7 +18,7 @@ const level = {
// simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode
// simulation.isHorizontalFlipped = true
// tech.giveTech("performance")
- // level.difficultyIncrease(4 * 4) //30 is near max on hard //60 is near max on why
+ // level.difficultyIncrease(12 * 4) //30 is near max on hard //60 is near max on why
// spawn.setSpawnList();
// spawn.setSpawnList();
// m.maxHealth = m.health = 100
@@ -28,16 +28,17 @@ const level = {
// tech.tech[297].frequency = 100
// m.couplingChange(5)
// m.setField("standing wave") //1 standing wave 2 perfect diamagnetism 3 negative mass 4 molecular assembler 5 plasma torch 6 time dilation 7 metamaterial cloaking 8 pilot wave 9 wormhole
+ // m.energy = 0
// simulation.molecularMode = 2
// m.damage(0.1);
// b.giveGuns("nail gun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
// b.giveGuns("foam") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
// b.guns[3].ammo = 100000000
- // tech.giveTech("recycling")
- // tech.giveTech("fine-structure constant")
- // for (let i = 0; i < 1; ++i) tech.giveTech("bot fabrication")
- // for (let i = 0; i < 1; ++i) tech.giveTech("accretion")
- // for (let i = 0; i < 1; ++i) tech.giveTech("superdeterminism")
+ // tech.giveTech("surface plasmons")
+ // tech.giveTech("relativistic momentum")
+ // for (let i = 0; i < 1; ++i) tech.giveTech("dye laser")
+ // for (let i = 0; i < 1; ++i) tech.giveTech("free-electron laser")
+ // for (let i = 0; i < 1; ++i) tech.giveTech("causality bots")
// requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("foam-bot") });
// for (let i = 0; i < 1; i++) tech.giveTech("foam-bot upgrade")
// for (let i = 0; i < 3; i++) powerUps.directSpawn(450, -50, "tech");
@@ -48,8 +49,8 @@ const level = {
// spawn.nodeGroup(2200, -300, "sniper")
// spawn.nodeGroup(2200, -300, "sniper")
// spawn.mantisBoss(1900, -500)
- // spawn.sneakBoss(1900, -500)
- // spawn.starter(1900, -500, 250)
+ // spawn.cellBoss(1900, -500)
+ // for (let i = 0; i < 5; ++i) spawn.sneaker(1900, -500, 50)
// spawn.sneaker(1900, -500, 25)
// spawn.sniper(2000, -450)
// spawn.zombie(1000 + 1000 * Math.random(), -500 + 300 * Math.random(), 30, 5, "white") // zombie(x, y, radius, sides, color)
@@ -16587,8 +16588,8 @@ const level = {
- spawn.randomLevelBoss(17902, -1689, ["blinkBoss", "shooterBoss", "launcherBoss", "pulsarBoss", "blockBoss", "bladeBoss", "revolutionBoss", "spawnerBossCulture", "spiderBoss", "sneakBoss", "snakeSpitBoss"])
-
+ // spawn.randomLevelBoss(17902, -1689, ["blinkBoss", "shooterBoss", "launcherBoss", "pulsarBoss", "blockBoss", "bladeBoss", "revolutionBoss", "spawnerBossCulture", "spiderBoss", "sneakBoss", "snakeSpitBoss"])
+ spawn.randomLevelBoss(17902, -1689, ["launcherBoss", "laserTargetingBoss", "blinkBoss", "streamBoss", "historyBoss", "grenadierBoss", "blockBoss", "revolutionBoss", "slashBoss"]);
// powerUps.spawnStartingPowerUps(1475, -1175);
// spawn.debris(750, -2200, 3700, 16); //16 debris per level
diff --git a/js/player.js b/js/player.js
index 38e8255..20c02b7 100644
--- a/js/player.js
+++ b/js/player.js
@@ -455,6 +455,7 @@ const m = {
m.alive = false;
simulation.paused = true;
m.health = 0;
+ simulation.ephemera = []
document.getElementById("defense-bar").style.display = "none"; //hide defense
document.getElementById("damage-bar").style.display = "none"
m.displayHealth();
@@ -468,7 +469,7 @@ const m = {
}, 5000);
}
},
- storeTech() { //store a copy of your tech, it will show up at your location next run
+ storeTech() { //store a copy of your tech, it will show up at your location next run in the entanglement power up
if (localSettings.isAllowed && !simulation.isCheating) {
const gunList = [] //store gun names
for (i = 0, len = b.inventory.length; i < len; i++) gunList.push(b.inventory[i])
@@ -1950,7 +1951,6 @@ const m = {
m.fieldRegen = 0.001 //6 energy per second
}
if (m.fieldMode === 0 || m.fieldMode === 4) m.fieldRegen += 0.00133 * m.coupling //return `generate ${(6*couple).toFixed(0)} energy per second`
-
if (tech.isTimeCrystals) {
m.fieldRegen *= 3
} else if (tech.isGroundState) {
@@ -1958,11 +1958,11 @@ const m = {
}
},
regenEnergy: function () { //used in drawRegenEnergy // rewritten by some tech
- if (m.immuneCycle < m.cycle) m.energy += m.fieldRegen;
+ if (m.immuneCycle < m.cycle && m.fieldCDcycle < m.cycle) m.energy += m.fieldRegen;
if (m.energy < 0) m.energy = 0
},
regenEnergyDefault: function () {
- if (m.immuneCycle < m.cycle) m.energy += m.fieldRegen;
+ if (m.immuneCycle < m.cycle && m.fieldCDcycle < m.cycle) m.energy += m.fieldRegen;
if (m.energy < 0) m.energy = 0
},
lookingAt(who) {
@@ -2271,8 +2271,27 @@ const m = {
pushMass(who, fieldBlockCost = (0.025 + Math.sqrt(who.mass) * Vector.magnitude(Vector.sub(who.velocity, player.velocity)) * 0.002) * m.fieldShieldingScale) {
if (m.energy > fieldBlockCost * 0.2) { //shield needs at least some of the cost to block
m.energy -= fieldBlockCost
- if (m.energy < 0) m.energy = 0;
- m.fieldCDcycle = m.cycle + m.fieldBlockCD;
+ if (m.energy < 0) {
+ m.energy = 0;
+ m.fieldCDcycle = m.cycle + Math.max(m.fieldBlockCD, 60);
+ if (tech.isLaserField) {
+ simulation.ephemera.push({
+ name: "laser field", //used to find this array element in simulation.removeEphemera()
+ // tech.laserDrain = 0.0018;
+ count: Math.floor(m.maxEnergy * 30) * 0.0018 / tech.laserDrain, //how many cycles the ephemera lasts, scales with max energy
+ do() {
+ this.count--
+ if (this.count < 0) simulation.removeEphemera(this.name)
+ for (let i = 0, num = 12; i < num; i++) { //draw random lasers
+ const angle = 6.28 * i / num + m.cycle * 0.04
+ b.laser({ x: m.pos.x + 30 * Math.cos(angle), y: m.pos.y + 30 * Math.sin(angle) }, { x: m.pos.x + 3000 * Math.cos(angle), y: m.pos.y + 3000 * Math.sin(angle) })//dmg = tech.laserDamage, reflections = tech.laserReflections, isThickBeam = false, push = 1
+ }
+ },
+ })
+ }
+ } else {
+ m.fieldCDcycle = m.cycle + m.fieldBlockCD;
+ }
if (!who.isInvulnerable && (m.coupling && m.fieldMode < 3) && bullet.length < 250) { //for standing wave mostly
for (let i = 0; i < m.coupling; i++) {
if (m.coupling - i > Math.random()) {
@@ -2282,24 +2301,10 @@ const m = {
b.iceIX(6 + 6 * Math.random(), angle + 3 * (Math.random() - 0.5), Vector.add(m.pos, rad))
}
}
-
- // let count = 0
- // for(let j=0; j<100;j++){
- // const len = m.coupling + 0.5 * (Math.random() - 0.5)
- // for (let i = 0; i < len; i++) {
- // count++
- // }
- // }
- // console.log(count)
-
}
const unit = Vector.normalise(Vector.sub(player.position, who.position))
if (tech.blockDmg) {
- Matter.Body.setVelocity(who, {
- x: 0.5 * who.velocity.x,
- y: 0.5 * who.velocity.y
- });
-
+ Matter.Body.setVelocity(who, { x: 0.5 * who.velocity.x, y: 0.5 * who.velocity.y });
if (who.isShielded) {
for (let i = 0, len = mob.length; i < len; i++) {
if (mob[i].id === who.shieldID) mob[i].damage(tech.blockDmg * m.dmgScale * (tech.isBlockRadiation ? 6 : 2), true)
@@ -2313,10 +2318,8 @@ const m = {
} else {
who.damage(tech.blockDmg * m.dmgScale, true)
}
-
- //draw electricity
const step = 40
- ctx.beginPath();
+ ctx.beginPath(); //draw electricity
for (let i = 0, len = 0.8 * tech.blockDmg; i < len; i++) {
let x = m.pos.x - 20 * unit.x;
let y = m.pos.y - 20 * unit.y;
@@ -2333,30 +2336,18 @@ const m = {
} else {
m.drawHold(who);
}
- // if (tech.isFreezeMobs) mobs.statusSlow(who, 60) //this works but doesn't have a fun effect
if (tech.isStunField) mobs.statusStun(who, tech.isStunField)
- // m.holdingTarget = null
//knock backs
const massRoot = Math.sqrt(Math.min(12, Math.max(0.15, who.mass))); // masses above 12 can start to overcome the push back
- Matter.Body.setVelocity(who, {
- x: player.velocity.x - (15 * unit.x) / massRoot,
- y: player.velocity.y - (15 * unit.y) / massRoot
- });
+ Matter.Body.setVelocity(who, { x: player.velocity.x - (15 * unit.x) / massRoot, y: player.velocity.y - (15 * unit.y) / massRoot });
if (who.isUnstable) {
if (m.fieldCDcycle < m.cycle + 30) m.fieldCDcycle = m.cycle + 10
who.death();
}
-
if (m.crouch) {
- Matter.Body.setVelocity(player, {
- x: player.velocity.x + 0.1 * m.blockingRecoil * unit.x * massRoot,
- y: player.velocity.y + 0.1 * m.blockingRecoil * unit.y * massRoot
- });
+ Matter.Body.setVelocity(player, { x: player.velocity.x + 0.1 * m.blockingRecoil * unit.x * massRoot, y: player.velocity.y + 0.1 * m.blockingRecoil * unit.y * massRoot });
} else {
- Matter.Body.setVelocity(player, {
- x: player.velocity.x + m.blockingRecoil * unit.x * massRoot,
- y: player.velocity.y + m.blockingRecoil * unit.y * massRoot
- });
+ Matter.Body.setVelocity(player, { x: player.velocity.x + m.blockingRecoil * unit.x * massRoot, y: player.velocity.y + m.blockingRecoil * unit.y * massRoot });
}
}
},
@@ -2371,7 +2362,7 @@ const m = {
mob[i].locatePlayer();
m.pushMass(mob[i]);
if (mob[i].isShielded) {
- m.fieldCDcycle = m.cycle + 60
+ m.fieldCDcycle = m.cycle + 30
} else if (tech.deflectEnergy && !mob[i].isInvulnerable) {
m.energy += tech.deflectEnergy
}
@@ -2577,7 +2568,7 @@ const m = {
if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
- if (m.energy > 0.05) {
+ if (m.energy > 0) {
m.drawField();
m.pushMobsFacing();
}
@@ -2601,7 +2592,7 @@ const m = {
m.fieldBlockCD = 0;
m.blockingRecoil = 2 //4 is normal
m.fieldRange = 185
- m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
+ m.fieldShieldingScale = 1.6 * Math.pow(0.6, (tech.harmonics - 2))
// m.fieldHarmReduction = 0.66; //33% reduction
m.harmonic3Phase = () => { //normal standard 3 different 2-d circles
@@ -2629,7 +2620,7 @@ const m = {
m.pushMass(mob[i]);
this.drainCD = m.cycle + 15
}
- if (mob[i].isShielded || mob[i].shield) m.fieldCDcycle = m.cycle + 20
+ if (mob[i].isShielded || mob[i].shield) m.fieldCDcycle = m.cycle + 10
}
}
}
@@ -2680,7 +2671,7 @@ const m = {
} 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)
}
- if (m.energy > 0.1 && m.fieldCDcycle < m.cycle) {
+ if (m.energy > 0 && m.fieldCDcycle < m.cycle) {
if (tech.isStandingWaveExpand) {
if (input.field) {
// const oldHarmonicRadius = m.harmonicRadius
@@ -2728,7 +2719,7 @@ const m = {
) {
mob[i].locatePlayer();
const unit = Vector.normalise(Vector.sub(m.fieldPosition, mob[i].position))
- m.fieldCDcycle = m.cycle + m.fieldBlockCD + (mob[i].isShielded ? 15 : 0);
+ m.fieldCDcycle = m.cycle + m.fieldBlockCD + (mob[i].isShielded ? 18 : 0);
if (!mob[i].isInvulnerable && bullet.length < 250) {
for (let i = 0; i < m.coupling; i++) {
if (m.coupling - i > Math.random()) {
@@ -3208,7 +3199,6 @@ const m = {
}
}
}
-
if (m.isHolding) {
m.drawHold(m.holdingTarget);
m.holding();
@@ -3217,7 +3207,7 @@ const m = {
if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
- if (m.energy > 0.05) {
+ if (m.energy > 0) {
m.drawField();
m.pushMobsFacing();
}
@@ -3736,13 +3726,24 @@ const m = {
m.throwBlock();
m.wakeCheck();
} else if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
- const drain = 0.002 / (1 + 0.5 * m.coupling)
+ const drain = 0.0014 / (1 + 0.5 * m.coupling)
if (m.energy > drain) m.energy -= drain
-
m.grabPowerUp();
- if (this.rewindCount === 0) m.lookForPickUp();
+ if (this.rewindCount === 0) {
+ m.lookForPickUp();
+ }
if (!m.holdingTarget) {
+ if (this.rewindCount === 0) { //large upfront energy cost to enter rewind mode
+ if (m.energy > 0.3) {
+ m.energy -= 0.3
+ } else {
+ 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
+ }
+ }
this.rewindCount += 6;
const DRAIN = 0.003
let history = m.history[(m.cycle - this.rewindCount) % 600]
@@ -3759,7 +3760,7 @@ const m = {
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
+ if (m.immuneCycle < m.cycle + 5) m.immuneCycle = m.cycle + 5; //player is immune to damage for 5 cycles
Matter.Body.setPosition(player, history.position);
Matter.Body.setVelocity(player, {
x: history.velocity.x,
@@ -3776,19 +3777,17 @@ const m = {
} else {
m.undoCrouch()
}
- 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]
- who.endCycle = simulation.cycle + 60
+ if (tech.isRewindBot && !(this.rewindCount % 60)) {
+ for (let i = 0; i < tech.isRewindBot; i++) {
+ b.randomBot(m.pos, false, false)
+ bullet[bullet.length - 1].endCycle = simulation.cycle + 300 + Math.floor(180 * Math.random()) //8-9 seconds
}
}
+ if (tech.isRewindGrenade && !(this.rewindCount % 30)) {
+ b.grenade(m.pos, this.rewindCount) //Math.PI / 2
+ const who = bullet[bullet.length - 1]
+ who.endCycle = simulation.cycle + 120
+ }
}
}
m.wakeCheck();
diff --git a/js/powerup.js b/js/powerup.js
index 4fe8128..ba3a238 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -548,7 +548,7 @@ const powerUps = {
simulation.makeTextLog(`m.health += ${(healOutput).toFixed(3)}`) //
${m.health.toFixed(3)}
if (tech.isOverHeal && overHeal > 0) { //tech quenching
const scaledOverHeal = overHeal * 0.7
- m.damage(scaledOverHeal);
+ m.damage(scaledOverHeal*0.9);
simulation.makeTextLog(`m.health -= ${(scaledOverHeal).toFixed(3)}`) //
${m.health.toFixed(3)}
simulation.drawList.push({ //add dmg to draw queue
x: m.pos.x,
@@ -563,7 +563,6 @@ const powerUps = {
requestAnimationFrame(() => {
powerUps.directSpawn(this.position.x, this.position.y, "heal", true, null, overHeal * 40 * (simulation.healScale ** 0.25))// directSpawn(x, y, target, moving = true, mode = null, size = powerUps[target].size()) {
});
-
}
}
}
diff --git a/js/simulation.js b/js/simulation.js
index 86d400a..15db420 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -33,6 +33,7 @@ const simulation = {
b.bulletDraw();
if (!m.isBodiesAsleep) b.bulletDo();
simulation.drawCircle();
+ simulation.runEphemera();
// simulation.clip();
ctx.restore();
simulation.drawCursor();
@@ -68,6 +69,7 @@ const simulation = {
simulation.draw.cons();
simulation.draw.testing();
simulation.drawCircle();
+ simulation.runEphemera();
simulation.constructCycle()
ctx.restore();
simulation.testingOutput();
@@ -96,6 +98,7 @@ const simulation = {
b.fire();
b.bulletRemove();
b.bulletDo();
+ simulation.runEphemera();
}
simulation.isTimeSkipping = false;
},
@@ -113,9 +116,24 @@ const simulation = {
if (m.fieldMode !== 7) m.hold();
b.bulletRemove();
if (!m.isBodiesAsleep) b.bulletDo();
+ simulation.runEphemera();
}
simulation.isTimeSkipping = false;
},
+ ephemera: [], //array that is used to store ephemera objects
+ removeEphemera: function (name) {
+ for (let i = 0, len = simulation.ephemera.length; i < len; i++) {
+ if (simulation.ephemera[i].name === name) {
+ simulation.ephemera.splice(i, 1);
+ break;
+ }
+ }
+ },
+ runEphemera() {
+ for (let i = 0; i < simulation.ephemera.length; i++) {
+ simulation.ephemera[i].do();
+ }
+ },
// timeMobSkip() {
// simulation.gravity();
// Engine.update(engine, simulation.delta);
@@ -745,6 +763,7 @@ const simulation = {
level.populateLevels()
input.endKeySensing();
+ simulation.ephemera = []
b.removeAllGuns();
tech.setupAllTech(); //sets tech to default values
tech.cancelCount = 0;
diff --git a/js/spawn.js b/js/spawn.js
index 53e713b..743541b 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -1908,8 +1908,9 @@ const spawn = {
const k = 642 //k=r^2/m
me.split = function () {
- Matter.Body.scale(this, 0.45, 0.45);
- this.radius = Math.sqrt(this.mass * k / Math.PI)
+ const scale = 0.45
+ Matter.Body.scale(this, scale, scale);
+ this.radius *= scale;
spawn.cellBoss(this.position.x, this.position.y, this.radius, this.cellID);
mob[mob.length - 1].health = this.health
}
@@ -1928,7 +1929,7 @@ const spawn = {
if (this.seePlayer.recall && this.mass < this.cellMassMax) { //grow cell radius
const scale = 1 + 0.0002 * this.cellMassMax / this.mass;
Matter.Body.scale(this, scale, scale);
- this.radius = Math.sqrt(this.mass * k / Math.PI)
+ this.radius *= scale;
}
if (!(simulation.cycle % this.seePlayerFreq)) { //move away from other mobs
const repelRange = 150
diff --git a/js/tech.js b/js/tech.js
index 1b2f1a5..92218ca 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -258,7 +258,7 @@ const tech = {
return dmg
},
duplicationChance() {
- return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.043 + tech.duplicateChance + 0.05 * tech.isExtraGunField + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication * (1 - 0.016 * (simulation.difficultyMode ** 2))) // + (m.fieldMode === 0 || m.fieldMode === 9) * 0.03 * m.coupling)
+ return Math.min(1, Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.043 + tech.duplicateChance + 0.05 * tech.isExtraGunField + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication * (1 - 0.016 * (simulation.difficultyMode ** 2)))) // + (m.fieldMode === 0 || m.fieldMode === 9) * 0.03 * m.coupling)
},
isScaleMobsWithDuplication: false,
maxDuplicationEvent() {
@@ -1247,8 +1247,10 @@ const tech = {
{
name: "collider",
descriptionFunction() {
- return `after mobs die there is a +33% chance
to smash power ups into a different flavor`
+ return `after mobs die there is a +33% chance to
collide power ups to form different power ups`
+ // return `after mobs die there is a +33% chance to convert
${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, ${powerUps.orb.research(1)}, tech, field, gun into other types`
},
+
maxCount: 3,
count: 0,
frequency: 1,
@@ -2717,7 +2719,7 @@ const tech = {
effect() {
tech.isCrouchRegen = true; //only used to check for requirements
m.regenEnergy = function () {
- if (m.immuneCycle < m.cycle && m.crouch) m.energy += 7 * m.fieldRegen;
+ if (m.immuneCycle < m.cycle && m.crouch && m.fieldCDcycle < m.cycle) m.energy += 7 * m.fieldRegen;
if (m.energy < 0) m.energy = 0
}
},
@@ -2758,7 +2760,7 @@ const tech = {
effect() {
tech.isDamageAfterKillNoRegen = true;
m.regenEnergy = function () {
- if (m.immuneCycle < m.cycle && (m.lastKillCycle + 300 < m.cycle)) m.energy += m.fieldRegen;
+ if (m.immuneCycle < m.cycle && (m.lastKillCycle + 300 < m.cycle) && m.fieldCDcycle < m.cycle) m.energy += m.fieldRegen;
if (m.energy < 0) m.energy = 0
}
},
@@ -2887,7 +2889,7 @@ const tech = {
{
name: "antiscience",
descriptionFunction() {
- return `+66% damage
–10 ${tech.isEnergyHealth ? "energy" : "health"} after picking up a tech`
+ return `–10 ${tech.isEnergyHealth ? "energy" : "health"} after picking up a tech
+66% damage`
},
// description: "+66% damage
–10 health after picking up a tech",
maxCount: 1,
@@ -3020,9 +3022,9 @@ const tech = {
frequencyDefault: 1,
isHealTech: true,
allowed() {
- return !tech.isHealAttract
+ return true
},
- requires: "not accretion",
+ requires: "",
effect() {
tech.isOverHeal = true;
},
@@ -3032,20 +3034,20 @@ const tech = {
},
{
name: "accretion",
- description: `${powerUps.orb.heal(1)} follow you, even between levels
spawn ${powerUps.orb.heal(3)}`,
+ description: `${powerUps.orb.heal(1)} follow you, even between levels
spawn ${powerUps.orb.heal(5)}`,
maxCount: 1,
count: 0,
frequency: 1,
frequencyDefault: 1,
isHealTech: true,
allowed() {
- return m.fieldMode !== 9 && !tech.isOverHeal
+ return m.fieldMode !== 9
},
- requires: "not wormhole, quenching",
+ requires: "not wormhole",
effect() {
tech.isHealAttract = true
powerUps.setPowerUpMode();
- for (let i = 0; i < 3; i++) powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "heal");
+ for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "heal");
},
remove() {
tech.isHealAttract = false
@@ -3315,7 +3317,7 @@ const tech = {
},
{
name: "perturbation theory",
- description: `if you have no ${powerUps.orb.research(1)} in your inventory
+60% fire rate`,
+ description: `if you have no ${powerUps.orb.research(1)} in your inventory
+70% fire rate`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3326,7 +3328,7 @@ const tech = {
requires: "no research",
effect() {
tech.isRerollHaste = true;
- tech.researchHaste = 0.4;
+ tech.researchHaste = 0.3;
b.setFireCD();
},
remove() {
@@ -3399,7 +3401,7 @@ const tech = {
},
{
name: "brainstorming",
- description: "tech choices randomize
every 2 seconds for 10 seconds",
+ description: "tech choices randomize
every 1.5 seconds for 10 seconds",
maxCount: 1,
count: 0,
frequency: 1,
@@ -3411,7 +3413,7 @@ const tech = {
effect() {
tech.isBrainstorm = true
tech.isBrainstormActive = false
- tech.brainStormDelay = 2000 - simulation.difficultyMode * 100
+ tech.brainStormDelay = 1800 - simulation.difficultyMode * 100
},
remove() {
tech.isBrainstorm = false
@@ -6913,7 +6915,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.haveGunCheck("laser") && !tech.isPulseLaser) || tech.isLaserBotUpgrade
+ return (tech.haveGunCheck("laser") && !tech.isPulseLaser) || tech.isLaserBotUpgrade || tech.isLaserField
},
requires: "laser, not pulse",
effect() {
@@ -6998,7 +7000,7 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() {
- return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser
+ return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade || tech.isLaserField) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser
},
requires: "laser, not diffuse beam, pulse, or slow light",
effect() {
@@ -7115,7 +7117,7 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() {
- return (tech.haveGunCheck("laser") || tech.isLaserBotUpgrade || tech.isLaserMine) && !tech.isPulseLaser && tech.laserDrain === 0.0018
+ return (tech.haveGunCheck("laser") || tech.isLaserBotUpgrade || tech.isLaserMine || tech.isLaserField) && !tech.isPulseLaser && tech.laserDrain === 0.0018
},
requires: "laser, not free-electron, pulse",
effect() {
@@ -7138,7 +7140,7 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() {
- return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade) && !tech.isPulseLaser && tech.laserDrain === 0.0018
+ return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade || tech.isLaserField) && !tech.isPulseLaser && tech.laserDrain === 0.0018
},
requires: "laser, not pulse, infrared diode",
effect() {
@@ -7163,7 +7165,7 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() {
- return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade) && !tech.isPulseLaser && tech.laserDrain === 0.0018
+ return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade || tech.isLaserField) && !tech.isPulseLaser && tech.laserDrain === 0.0018
},
requires: "laser, not pulse, infrared diode",
effect() {
@@ -7231,6 +7233,25 @@ const tech = {
if (this.count > 0) powerUps.research.changeRerolls(2)
}
},
+ {
+ name: "surface plasmons",
+ description: "if deflecting a mob drains all your energy
emit laser beams in every direction",
+ isFieldTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return m.fieldMode === 4 || m.fieldMode === 1 || m.fieldMode === 0
+ },
+ requires: "molecular assembler, standing wave, field emitter",
+ effect() {
+ tech.isLaserField = true
+ },
+ remove() {
+ tech.isLaserField = false
+ }
+ },
{
name: "spherical harmonics",
description: "+40% standing wave deflection efficiency
no longer deactivates on mob shields", //standing wave oscillates in a 3rd dimension
@@ -7245,19 +7266,18 @@ const tech = {
requires: "standing wave",
effect() {
tech.harmonics++
- m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
+ m.fieldShieldingScale = 1.6 * Math.pow(0.6, (tech.harmonics - 2))
m.harmonicShield = m.harmonicAtomic
},
remove() {
tech.harmonics = 2
- m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
+ m.fieldShieldingScale = 1.6 * Math.pow(0.6, (tech.harmonics - 2))
m.harmonicShield = m.harmonic3Phase
}
},
{
name: "expansion",
- description: "+50% standing wave deflection efficiency
using standing wave field expands its radius",
- // description: "use energy to expand standing wave
the field slowly contracts when not used",
+ description: "using standing wave field expands its radius",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -7269,11 +7289,11 @@ const tech = {
requires: "standing wave",
effect() {
tech.isStandingWaveExpand = true
- m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.3) * Math.pow(0.6, (tech.harmonics - 2))
+ // m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
},
remove() {
tech.isStandingWaveExpand = false
- m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.3) * Math.pow(0.6, (tech.harmonics - 2))
+ // m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
m.harmonicRadius = 1
}
},
@@ -11462,4 +11482,5 @@ const tech = {
isDivisor: null,
isFoamCavitation: null,
isHealAttract: null,
+ isLaserField: null,
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 505e69e..7d3d6e1 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,20 +1,55 @@
******************************************************** NEXT PATCH **************************************************
-some new images
+tech - after deflecting drains all your energy, shoot lasers in every direction
+ is it too hard to safely lose all energy after deflecting
+ add in some mob knock back or damage immunity?
+ make this a tech?
+ balance damage
+ download image
+ sometimes the field goes on CD after deflection but when energy isn't 0
+ fixed?
+ look at side effects of setting standing wave, molecular assembler, emitter to not disable at 0 energy, not 0.05 or 0.1
+ might allow repeated deflection with no CD?
+ energy regen is disable when deflection is on CD
+ m.fieldCDcycle < m.cycle
+
+tech expansion no long gives deflection efficiency
+
+retrocausality drains 30% less energy as time rewinds, but each time you start to rewind you drain 30 energy
+ no longer provides immunity for 1 second after on ending rewind
+ also spawns 20% fewer bots and grenades
bug fixes
+added a generic system to add code that loops for a set time
+Example code:
+simulation.ephemera.push({
+ name: "uniqueName",
+ count: 60, //cycles before it self removes
+ do() {
+ this.count--
+ if (this.count < 0) simulation.removeEphemera(this.name)
+ //run code here
+ },
+})
*********************************************************** TODO *****************************************************
-tech: using research spawns a heal and ammo
+tech: choose next map by name after exiting current map
+ use modified tech selection code?
+ this might be too much work without much reward
+ JUNK only?
+
+
+build a system to add in methods to an array that runs these objects in the game loop
+ method to run the code
+ condition to remove from array should be inside the method
Tech: relativity
Simulation speed scales with movement speed. When still, time moves at 0.4 speed, at full walking speed it’s 1. (So if you’re falling or something and you move faster the simulation will be faster than usual)
Also a damage and/or defense boost to make it worth using
Tech: Turbine - Energy generation is proportional to your speed up to +X% energy generation at 40 speed
-Tech: "Electric Reactive Armor": Defense increases by 2% for each 1 energy generation you have
wormhole tech - teleport away mobs with mass below 3 when they get too near the player
short CD, small energy cost, only mobs below a mass
@@ -1155,6 +1190,10 @@ possible names for tech
nuclear pasta - hard matter in neutron star
nonlocal
fine-tuned universe
+ nonperturbative
+ D-branes
+ instanton or pseudoparticle
+ soliton (wave packet)
hall effect thrusters
spaghettification
particle accelerator