diff --git a/js/bullet.js b/js/bullet.js
index 2f4f2f6..25f36a7 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -280,10 +280,15 @@ const b = {
},
fireCDscale: 1,
setFireCD() {
- b.fireCDscale = tech.fireRate * tech.slowFire * tech.researchHaste * tech.aimDamage * m.fieldFireRate
+ b.fireCDscale = tech.fireRate * tech.slowFire * tech.researchHaste * tech.aimDamage
+ if (m.fieldMode === 0) {
+ b.fireCDscale *= 0.8 ** (m.coupling)
+ } else if (m.fieldMode === 6) {
+ b.fireCDscale *= 0.75 * 0.8 ** (m.coupling)
+ }
if (tech.isFastTime) b.fireCDscale *= 0.5
- if (tech.isFireRateForGuns) b.fireCDscale *= Math.pow(0.8, b.inventory.length)
- if (tech.isFireMoveLock) b.fireCDscale *= 0.5
+ if (tech.isFireRateForGuns) b.fireCDscale *= Math.pow(0.82, b.inventory.length)
+ if (tech.isFireMoveLock) b.fireCDscale *= 0.55
},
fireAttributes(dir, rotate = true) {
if (rotate) {
@@ -4876,7 +4881,7 @@ const b = {
const DIST = Vector.magnitude(sub);
const unit = Vector.normalise(sub)
if (DIST < tech.isPlasmaRange * 450 && m.energy > this.drainThreshold) {
- m.energy -= 0.00035 + m.fieldRegen //0.004; //normal plasma field is 0.00008 + m.fieldRegen = 0.00108
+ m.energy -= 0.00135 //0.004; //normal plasma field is 0.00008 + m.fieldRegen = 0.00108
// if (m.energy < 0) {
// m.fieldCDcycle = m.cycle + 120;
// m.energy = 0;
@@ -5866,7 +5871,7 @@ const b = {
ctx.lineWidth = 2 * tech.wavePacketDamage
ctx.beginPath();
const end = 700 * Math.sqrt(tech.isBulletsLastLonger) / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1060
- const damage = 2 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.43 : 1) //damage is lower for large radius mobs, since they feel the waves longer
+ const damage = 1.8 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.43 : 1) //damage is lower for large radius mobs, since they feel the waves longer
for (let i = this.waves.length - 1; i > -1; i--) {
//draw wave
@@ -5959,7 +5964,7 @@ const b = {
ctx.lineWidth = 2 * tech.wavePacketDamage
ctx.beginPath();
const end = 1100 * tech.isBulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1767
- const damage = 2 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.43 : 1) //damage is lower for large radius mobs, since they feel the waves longer
+ const damage = 1.8 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.43 : 1) //damage is lower for large radius mobs, since they feel the waves longer
for (let i = this.waves.length - 1; i > -1; i--) {
const v1 = Vector.add(this.waves[i].position, Vector.mult(this.waves[i].unit1, this.waves[i].radius))
@@ -7024,7 +7029,6 @@ const b = {
this.fire = () => {
const drain = 0.01 * (tech.isCapacitor ? 10 : 1) / b.fireCDscale
if (m.energy > drain) {
- // m.energy -= m.fieldRegen
if (this.charge < 50 * m.maxEnergy) {
m.energy -= drain
this.charge += drain * 100
@@ -7106,7 +7110,7 @@ const b = {
// b.photon({ x: m.pos.x + 23 * Math.cos(m.angle), y: m.pos.y + 23 * Math.sin(m.angle) }, m.angle)
// },
fireLaser() {
- const drain = m.fieldRegen + tech.laserDrain / b.fireCDscale
+ const drain = 0.001 + tech.laserDrain / b.fireCDscale
if (m.energy < drain) {
m.fireCDcycle = m.cycle + 100; // cool down if out of energy
} else {
@@ -7124,7 +7128,7 @@ const b = {
},
firePulse() {},
fireSplit() {
- const drain = m.fieldRegen + tech.laserDrain / b.fireCDscale
+ const drain = 0.001 + tech.laserDrain / b.fireCDscale
if (m.energy < drain) {
m.fireCDcycle = m.cycle + 100; // cool down if out of energy
} else {
@@ -7149,7 +7153,7 @@ const b = {
}
},
fireWideBeam() {
- const drain = m.fieldRegen + tech.laserDrain / b.fireCDscale
+ const drain = 0.001 + tech.laserDrain / b.fireCDscale
if (m.energy < drain) {
m.fireCDcycle = m.cycle + 100; // cool down if out of energy
} else {
@@ -7214,7 +7218,7 @@ const b = {
}
},
fireHistory() {
- drain = m.fieldRegen + tech.laserDrain / b.fireCDscale
+ drain = 0.001 + tech.laserDrain / b.fireCDscale
if (m.energy < drain) {
m.fireCDcycle = m.cycle + 100; // cool down if out of energy
} else {
diff --git a/js/engine.js b/js/engine.js
index 5767467..399ce79 100644
--- a/js/engine.js
+++ b/js/engine.js
@@ -42,7 +42,7 @@ function playerOnGroundCheck(event) {
//falling damage
if (tech.isFallingDamage && m.immuneCycle < m.cycle && momentum > 150) {
m.damage(Math.min(Math.sqrt(momentum - 133) * 0.01, 0.25));
- if (m.immuneCycle < m.cycle + tech.collisionImmuneCycles) m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
+ if (m.immuneCycle < m.cycle + m.collisionImmuneCycles) m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for 30 cycles
}
} else {
m.yOffGoal = m.yOffWhen.stand;
@@ -148,7 +148,7 @@ function collisionChecks(event) {
if (tech.isPiezo) m.energy += 20.48;
if (tech.isStimulatedEmission) powerUps.ejectTech()
if (mob[k].onHit) mob[k].onHit();
- if (m.immuneCycle < m.cycle + tech.collisionImmuneCycles) m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
+ if (m.immuneCycle < m.cycle + m.collisionImmuneCycles) m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for 30 cycles
//extra kick between player and mob //this section would be better with forces but they don't work...
let angle = Math.atan2(player.position.y - mob[k].position.y, player.position.x - mob[k].position.x);
Matter.Body.setVelocity(player, {
@@ -162,7 +162,7 @@ function collisionChecks(event) {
if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && !mob[k].isBoss && mob[k].isDropPowerUp && m.energy > 0.34 * m.maxEnergy && mob[k].damageReduction > 0) {
m.energy -= 0.33 * Math.max(m.maxEnergy, m.energy) //0.33 * m.energy
- if (m.immuneCycle === m.cycle + tech.collisionImmuneCycles) m.immuneCycle = 0; //player doesn't go immune to collision damage
+ if (m.immuneCycle === m.cycle + m.collisionImmuneCycles) m.immuneCycle = 0; //player doesn't go immune to collision damage
mob[k].death();
simulation.drawList.push({ //add dmg to draw queue
x: pairs[i].activeContacts[0].vertex.x,
@@ -224,7 +224,7 @@ function collisionChecks(event) {
}
}
- let dmg = tech.blockDamage * m.dmgScale * v * obj.mass * (tech.isMobBlockFling ? 2.5 : 1) * (tech.isBlockRestitution ? 2.5 : 1);
+ let dmg = tech.blockDamage * m.dmgScale * v * obj.mass * (tech.isMobBlockFling ? 2.5 : 1) * (tech.isBlockRestitution ? 2.5 : 1) * ((m.fieldMode === 0 || m.fieldMode === 8) ? 1 + 0.4 * m.coupling : 1);
if (mob[k].isShielded) dmg *= 0.7
mob[k].damage(dmg, true);
diff --git a/js/index.js b/js/index.js
index 3eae6ad..a77ed0b 100644
--- a/js/index.js
+++ b/js/index.js
@@ -226,6 +226,17 @@ for (let i = 0, len = tech.tech.length; i < len; i++) {
}
const build = {
pauseGrid() {
+
+ //used for junk estimation
+ let junkCount = 0
+ let totalCount = 0
+ for (let i = 0; i < tech.tech.length; i++) {
+ if (tech.tech[i].count < tech.tech[i].maxCount && tech.tech[i].allowed() && !tech.tech[i].isBanished) {
+ totalCount += tech.tech[i].frequency
+ if (tech.tech[i].isJunk) junkCount += tech.tech[i].frequency
+ }
+ }
+ // ${m.coupling> 0 ? '
'+m.couplingDescription(): ""}
//left side
let botText = ""
if (tech.nailBotCount) botText += `
nail-bots: ${tech.nailBotCount}`
@@ -248,13 +259,14 @@ const build = {
fire rate: ${((1-b.fireCDscale)*100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}%
duplication: ${(tech.duplicationChance()*100).toFixed(0)}%
coupling: ${(m.coupling).toFixed(2)}
-${m.coupling> 0 ? '
'+m.couplingDescription(): ""}
+
${botText}
health: (${(m.health*100).toFixed(0)} / ${(m.maxHealth*100).toFixed(0)})
-
energy: (${(m.energy*100).toFixed(0)} / ${(m.maxEnergy*100).toFixed(0)})
+
energy: (${(m.energy*100).toFixed(0)} / ${(m.maxEnergy*100).toFixed(0)}) +(${(m.fieldRegen*6000).toFixed(0)}/s)
gun: ${b.activeGun === null || b.activeGun === undefined ? "undefined":b.guns[b.activeGun].name} ammo: ${b.activeGun === null || b.activeGun === undefined ? "0":b.guns[b.activeGun].ammo}
-
tech: ${tech.totalCount} research: ${powerUps.research.count}
+
tech: ${tech.totalCount} research: ${powerUps.research.count}
+
JUNK: ${(junkCount / totalCount * 100).toFixed(1)}%
seed: ${Math.initialSeed}
level: ${level.levels[level.onLevel]} (${level.difficultyText()}) ${m.cycle} cycles
@@ -972,7 +984,7 @@ window.addEventListener("keydown", function(event) {
if (m.alive && localSettings.loreCount > 0) {
if (simulation.difficultyMode > 4) {
simulation.makeTextLog("testing mode disabled for this difficulty");
- // break
+ break
}
if (simulation.testing) {
simulation.testing = false;
@@ -1281,6 +1293,7 @@ if (localSettings.isAllowed && !localSettings.isEmpty) {
}
document.getElementById("fps-select").value = localSettings.fpsCapDefault
+ if (!localSettings.banList) localSettings.banList = ""
if (localSettings.banList.length === 0 || localSettings.banList === "undefined") {
localSettings.banList = ""
localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
diff --git a/js/level.js b/js/level.js
index c2f9a30..19db768 100644
--- a/js/level.js
+++ b/js/level.js
@@ -16,19 +16,19 @@ const level = {
start() {
if (level.levelsCleared === 0) { //this code only runs on the first level
// simulation.enableConstructMode() //used to build maps in testing mode
- // level.difficultyIncrease(5 * 4) //30 is near max on hard //60 is near max on why
+ // level.difficultyIncrease(1 * 4) //30 is near max on hard //60 is near max on why
// simulation.isHorizontalFlipped = true
// m.maxHealth = m.health = 100
// tech.isRerollDamage = true
// powerUps.research.changeRerolls(100000)
// m.immuneCycle = Infinity //you can't take damage
// tech.tech[297].frequency = 100
- // m.setField("time dilation") //molecular assembler time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass
- // b.giveGuns("nail gun") //0 nail gun 1 shotgun 2 super balls 3 matter wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
+ m.setField("time dilation") //molecular assembler time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass
+ // b.giveGuns("laser") //0 nail gun 1 shotgun 2 super balls 3 matter wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
// b.guns[0].ammo = 1000000
- // tech.giveTech("sentry");
- // tech.giveTech("MACHO");
- // tech.giveTech("elephant's toothpaste")
+ // tech.giveTech("coupling");
+ // tech.giveTech("time crystals");
+ tech.giveTech("retrocausality")
// for (let i = 0; i < 1; ++i) tech.giveTech("slow light")
// for (let i = 0; i < 1; ++i) tech.giveTech("free-electron laser")
// m.damage(0.1);
@@ -37,7 +37,8 @@ const level = {
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "research");
// spawn.starter(1900, -500, 200)
- // spawn.snakeSpitBoss(1900, -400)
+ // spawn.beetleBoss(1900, -400)
+ // spawn.timeBoss(1900, -400)
// for (let i = 0; i < 15; ++i) spawn.starter(1900 + 300 * Math.random(), -500 + 300 * Math.random())
// level.testing();
// for (let i = 0; i < 7; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research");
@@ -1134,10 +1135,10 @@ const level = {
player.isInPortal = this.portalPair
//teleport
if (this.portalPair.angle % (Math.PI / 2)) { //if left, right up or down
- if (m.immuneCycle < m.cycle + tech.collisionImmuneCycles) m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
+ if (m.immuneCycle < m.cycle + m.collisionImmuneCycles) m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for 30 cycles
Matter.Body.setPosition(player, this.portalPair.portal.position);
} else { //if at some odd angle
- if (m.immuneCycle < m.cycle + tech.collisionImmuneCycles) m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
+ if (m.immuneCycle < m.cycle + m.collisionImmuneCycles) m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for 30 cycles
Matter.Body.setPosition(player, this.portalPair.position);
}
//rotate velocity
@@ -1325,7 +1326,7 @@ const level = {
//collision with player
if (this.height > 0 && Matter.Query.region([player], this).length && !(m.isCloak)) {
if (m.immuneCycle < m.cycle) {
- m.immuneCycle = m.cycle + tech.collisionImmuneCycles;
+ m.immuneCycle = m.cycle + m.collisionImmuneCycles;
m.damage(damage)
simulation.drawList.push({ //add dmg to draw queue
x: player.position.x,
@@ -1357,7 +1358,7 @@ const level = {
if (this.height > 0 && Matter.Query.region([player], this).length) {
if (m.immuneCycle < m.cycle) {
- const DRAIN = 0.0022 * (tech.isRadioactiveResistance ? 0.25 : 1) + m.fieldRegen
+ const DRAIN = 0.0032 * (tech.isRadioactiveResistance ? 0.25 : 1)
if (m.energy > DRAIN) {
m.energy -= DRAIN
// m.damage(damage * (tech.isRadioactiveResistance ? 0.25 : 1) * 0.03) //still take 2% damage while you have energy
@@ -10253,7 +10254,7 @@ const level = {
me.onDeath = function() {
//damage player if in range
if (distance(player.position, this.position) < pulseRadius && m.immuneCycle < m.cycle) {
- m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage
+ m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage
m.damage(0.02 * simulation.dmgScale);
}
simulation.drawList.push({ //add dmg to draw queue
@@ -10616,7 +10617,7 @@ const level = {
// Trolled
const hasCPT = tech.isRewindAvoidDeath;
tech.isRewindAvoidDeath = false;
- const DRAIN = 0.002 * (tech.isRadioactiveResistance ? 0.25 : 1) + m.fieldRegen;
+ const DRAIN = 0.002 * (tech.isRadioactiveResistance ? 0.25 : 1) + 0.001;
if (m.energy > DRAIN && !tech.isEnergyHealth) {
m.energy -= DRAIN;
}
@@ -10698,7 +10699,7 @@ const level = {
if (this.isHeal) {
m.energy += 0.005;
} else {
- m.energy = Math.max(m.energy - 0.007 - m.fieldRegen, 0);
+ m.energy = Math.max(m.energy - 0.006, 0);
if (m.energy <= 0.01 && m.immuneCycle < m.cycle) m.damage(0.002);
}
},
@@ -11640,7 +11641,7 @@ const level = {
// me.onDeath = function() {
// //damage player if in range
// if (distance(player.position, this.position) < pulseRadius && m.immuneCycle < m.cycle) {
- // m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage
+ // m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage
// m.damage(0.02 * simulation.dmgScale);
// }
// simulation.drawList.push({ //add dmg to draw queue
diff --git a/js/mob.js b/js/mob.js
index aa51a78..ff0348b 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -235,7 +235,10 @@ const mobs = {
// })
// }
// },
-
+ mobSpawnWithHealth: 1,
+ setMobSpawnHealth() {
+ mobs.mobSpawnWithHealth = 0.87 ** (tech.mobSpawnWithHealth) //+ (m.fieldMode === 0 || m.fieldMode === 7) * m.coupling
+ },
//**********************************************************************************************
//**********************************************************************************************
spawn(xPos, yPos, sides, radius, color) {
@@ -256,7 +259,7 @@ const mobs = {
onHit: undefined,
alive: true,
index: i,
- health: tech.mobSpawnWithHealth,
+ health: mobs.mobSpawnWithHealth,
showHealthBar: true,
accelMag: 0.001 * simulation.accelScale,
cd: 0, //game cycle when cooldown will be over
@@ -602,7 +605,7 @@ const mobs = {
const hitPlayer = Matter.Query.ray([player], this.position, Vector.add(this.position, Vector.mult(perp, radius * 2.05)), minorRadius)
if (hitPlayer.length && m.immuneCycle < m.cycle) {
m.damage(dmg * simulation.dmgScale);
- // m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage
+ // m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage
}
},
searchSpring() {
diff --git a/js/player.js b/js/player.js
index cd8ce46..6b3f1fa 100644
--- a/js/player.js
+++ b/js/player.js
@@ -56,12 +56,20 @@ const m = {
light: 100,
},
setFillColors() {
- this.fillColor = `hsl(${m.color.hue},${m.color.sat}%,${m.color.light}%)`
- this.fillColorDark = `hsl(${m.color.hue},${m.color.sat}%,${m.color.light - 25}%)`
+ m.fillColor = `hsl(${m.color.hue},${m.color.sat}%,${m.color.light}%)`
+ m.fillColorDark = `hsl(${m.color.hue},${m.color.sat}%,${m.color.light - 25}%)`
let grd = ctx.createLinearGradient(-30, 0, 30, 0);
grd.addColorStop(0, m.fillColorDark);
grd.addColorStop(1, m.fillColor);
- this.bodyGradient = grd
+ m.bodyGradient = grd
+ },
+ setFillColorsAlpha(alpha = 0.5) {
+ m.fillColor = `hsla(${m.color.hue},${m.color.sat}%,${m.color.light}%,${alpha})`
+ m.fillColorDark = `hsla(${m.color.hue},${m.color.sat}%,${m.color.light - 25}%,${alpha})`
+ let grd = ctx.createLinearGradient(-30, 0, 30, 0);
+ grd.addColorStop(0, m.fillColorDark);
+ grd.addColorStop(1, m.fillColor);
+ m.bodyGradient = grd
},
height: 42,
yOffWhen: {
@@ -498,7 +506,7 @@ const m = {
},
baseHealth: 1,
setMaxHealth() {
- m.maxHealth = m.baseHealth + tech.extraMaxHealth + tech.isFallingDamage + 4 * tech.isFlipFlop * tech.isFlipFlopOn * tech.isFlipFlopHealth
+ m.maxHealth = m.baseHealth + tech.extraMaxHealth + tech.isFallingDamage + 4 * tech.isFlipFlop * tech.isFlipFlopOn * tech.isFlipFlopHealth + (m.fieldMode === 0 || m.fieldMode === 5) * 0.5 * m.coupling
document.getElementById("health-bg").style.width = `${Math.floor(300 * m.maxHealth)}px`
simulation.makeTextLog(`m.maxHealth = ${m.maxHealth.toFixed(2)}`)
if (m.health > m.maxHealth) m.health = m.maxHealth;
@@ -532,6 +540,7 @@ const m = {
if (tech.isEntanglement && b.inventory[0] === b.activeGun) {
for (let i = 0, len = b.inventory.length; i < len; i++) dmg *= 0.87 // 1 - 0.15
}
+ if (m.fieldMode === 0 || m.fieldMode === 3) dmg *= 0.75 ** m.coupling
return dmg
},
rewind(steps) { // m.rewind(Math.floor(Math.min(599, 137 * m.energy)))
@@ -599,7 +608,7 @@ const m = {
}
}
m.energy = Math.max(m.energy - steps / 150, 0.01)
- if (m.immuneCycle < m.cycle + tech.collisionImmuneCycles) m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
+ if (m.immuneCycle < m.cycle + m.collisionImmuneCycles) m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for 30 cycles
let isDrawPlayer = true
const shortPause = function() {
@@ -647,6 +656,7 @@ const m = {
}
}
},
+ collisionImmuneCycles: 30,
damage(dmg) {
if (tech.isRewindAvoidDeath && m.energy > 0.6 && dmg > 0.01) {
const steps = Math.floor(Math.min(299, 150 * m.energy))
@@ -845,7 +855,7 @@ const m = {
ctx.rotate(m.angle);
ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI);
- ctx.fillStyle = this.bodyGradient
+ ctx.fillStyle = m.bodyGradient
ctx.fill();
ctx.arc(15, 0, 4, 0, 2 * Math.PI);
ctx.strokeStyle = "#333";
@@ -873,7 +883,7 @@ const m = {
ctx.rotate(m.angle);
ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI);
- ctx.fillStyle = this.bodyGradient
+ ctx.fillStyle = m.bodyGradient
ctx.fill();
ctx.arc(15, 0, 4, 0, 2 * Math.PI);
ctx.strokeStyle = "#333";
@@ -902,7 +912,6 @@ const m = {
// these values are set on reset by setHoldDefaults()
fieldFx: 1,
fieldJump: 1,
- fieldFireRate: 1,
blockingRecoil: 4,
grabPowerUpRange2: 0,
isFieldActive: false,
@@ -935,7 +944,7 @@ const m = {
fieldArc: 0,
fieldThreshold: 0,
calculateFieldThreshold() {
- m.fieldThreshold = Math.cos(m.fieldArc * Math.PI)
+ m.fieldThreshold = Math.cos((m.fieldArc) * Math.PI)
},
setHoldDefaults() {
if (tech.isFreeWormHole && m.fieldUpgrades[m.fieldMode].name !== "wormhole") {
@@ -947,7 +956,6 @@ const m = {
if (removed) powerUps.directSpawn(m.pos.x, m.pos.y, "tech");
}
if (m.energy < m.maxEnergy) m.energy = m.maxEnergy;
- // m.fieldRegen = 0.001
m.fieldMeterColor = "#0cf"
m.eyeFillColor = m.fieldMeterColor
m.fieldShieldingScale = 1;
@@ -956,7 +964,6 @@ const m = {
m.lastHit = 0
m.isSneakAttack = false
m.duplicateChance = 0
- powerUps.setDupChance();
m.grabPowerUpRange2 = 156000;
m.blockingRecoil = 4;
m.fieldRange = 155;
@@ -965,10 +972,9 @@ const m = {
m.isCloak = false;
player.collisionFilter.mask = cat.body | cat.map | cat.mob | cat.mobBullet | cat.mobShield
m.airSpeedLimit = 125
- m.fieldFireRate = 1
- b.setFireCD();
m.fieldFx = 1
m.fieldJump = 1
+ m.setFieldRegen();
m.setMovement();
m.drop();
m.holdingMassScale = 0.5;
@@ -976,7 +982,7 @@ const m = {
m.calculateFieldThreshold(); //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob)
m.isBodiesAsleep = true;
m.wakeCheck();
- m.setMaxEnergy();
+ m.couplingChange()
m.hole = {
isOn: false,
isReady: false,
@@ -991,12 +997,12 @@ const m = {
}
},
setMaxEnergy() {
- m.maxEnergy = (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus + tech.harmonicEnergy + 2 * tech.isGroundState + 3 * tech.isRelay * tech.isFlipFlopOn * tech.isRelayEnergy + 0.6 * (m.fieldUpgrades[m.fieldMode].name === "standing wave")
+ m.maxEnergy = (m.fieldMode === 0 || m.fieldMode === 1) * 0.4 * m.coupling + (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus + tech.harmonicEnergy + 2 * tech.isGroundState + 3 * tech.isRelay * tech.isFlipFlopOn * tech.isRelayEnergy + 0.6 * (m.fieldUpgrades[m.fieldMode].name === "standing wave")
// if (tech.isEnergyHealth) m.maxEnergy *= Math.sqrt(m.harmReduction())
simulation.makeTextLog(`m.maxEnergy = ${(m.maxEnergy.toFixed(2))}`)
},
fieldMeterColor: "#0cf",
- drawFieldMeter(bgColor = "rgba(0, 0, 0, 0.4)", range = 60) {
+ drawRegenEnergy(bgColor = "rgba(0, 0, 0, 0.4)", range = 60) {
if (m.energy < m.maxEnergy) {
m.regenEnergy();
ctx.fillStyle = bgColor;
@@ -1014,8 +1020,8 @@ const m = {
ctx.fillRect(xOff, yOff, range * m.energy, 10);
}
},
- drawFieldMeterCloaking: function() {
- if (m.energy < m.maxEnergy) { // replaces m.drawFieldMeter() with custom code
+ drawRegenEnergyCloaking: function() {
+ if (m.energy < m.maxEnergy) { // replaces m.drawRegenEnergy() with custom code
m.regenEnergy();
const xOff = m.pos.x - m.radius * m.maxEnergy
const yOff = m.pos.y - 50
@@ -1030,7 +1036,22 @@ const m = {
ctx.stroke();
}
},
- regenEnergy: function() { //used in drawFieldMeter // rewritten by some tech
+ setFieldRegen() {
+ if (m.fieldMode === 6) {
+ m.fieldRegen = 0.003 //18 energy per second
+ } else if (m.fieldMode === 4) {
+ m.fieldRegen = 0.002 //12 energy per second
+ } else {
+ m.fieldRegen = 0.001 //6 energy per second
+ }
+ if (m.fieldMode === 0 || m.fieldMode === 4) m.fieldRegen += 0.001 * m.coupling
+ if (tech.isTimeCrystals) {
+ m.fieldRegen *= 3
+ } else if (tech.isGroundState) {
+ m.fieldRegen *= 0.5
+ }
+ },
+ regenEnergy: function() { //used in drawRegenEnergy // rewritten by some tech
if (m.immuneCycle < m.cycle) m.energy += m.fieldRegen;
if (m.energy < 0) m.energy = 0
},
@@ -1428,7 +1449,6 @@ const m = {
}
},
lookForPickUp() { //find body to pickup
- if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen;
const grabbing = {
targetIndex: null,
targetRange: 150,
@@ -1521,27 +1541,61 @@ const m = {
couplingDescription() {
switch (m.fieldMode) {
case 0: //field emitter
- return `gain the effects of all fields`
+ return `gain the effects of all other fields`
case 1: //standing wave
- return `+20 max energy per coupling`
+ return `+40 max energy per coupling`
case 2: //perfect diamagnetism
- return `+10° arc per coupling`
+ return `invulnerable +3 seconds post collision per coupling`
case 3: //negative mass
- return `+25% defense per coupling`
+ return `+20% defense per coupling`
case 4: //assembler
- return `generate 4 energy per second per coupling`
+ return `generate 6 energy per second per coupling`
case 5: //plasma
- return `+13% damage per coupling`
+ return `+50 max health per coupling`
case 6: //time dilation
return `+20% fire rate per coupling` //movement, jumping, and
case 7: //cloaking
- return `remove +10% mob durability per coupling`
+ return `+15% damage per coupling`
case 8: //pilot wave
- return `________ per coupling`
+ return `+40% block collision damage per coupling`
case 9: //wormhole
return `+5% duplication per coupling`
}
},
+ couplingChange() {
+ m.setMaxEnergy();
+ m.setMaxHealth();
+ m.setFieldRegen()
+ mobs.setMobSpawnHealth();
+ powerUps.setDupChance();
+ b.setFireCD();
+ m.collisionImmuneCycles = 30 + m.coupling * 180
+ // switch (m.fieldMode) {
+ // case 0: //field emitter
+ // // m.fieldFireRate = 0.8 ** (m.coupling)
+ // // b.setFireCD();
+ // break
+ // // case 1: //standing wave
+ // // break
+ // // case 2: //perfect diamagnetism
+ // // break
+ // // case 3: //negative mass
+ // // break
+ // // case 4: //assembler
+ // // break
+ // // case 5: //plasma
+ // // break
+ // case 6: //time dilation
+ // // m.fieldFireRate = 0.75 * 0.8 ** (m.coupling)
+ // break
+ // // case 7: //cloaking
+ // // break
+ // // case 8: //pilot wave
+ // // break
+ // // case 9: //wormhole
+ // // break
+ // }
+ },
setField(index) {
if (isNaN(index)) { //find index by name
let found = false
@@ -1572,6 +1626,7 @@ const m = {
m.holding();
m.throwBlock();
} else if ((input.field && m.fieldCDcycle < m.cycle)) { //not hold but field button is pressed
+ if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
if (m.energy > 0.05) {
@@ -1583,7 +1638,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)
}
- m.drawFieldMeter()
+ m.drawRegenEnergy()
}
}
},
@@ -1667,6 +1722,7 @@ const m = {
m.holding();
m.throwBlock();
} else if ((input.field) && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
+ if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
} else if (m.holdingTarget && m.fieldCDcycle < m.cycle) { //holding, but field button is released
@@ -1686,7 +1742,7 @@ const m = {
}
m.harmonicShield()
}
- m.drawFieldMeter()
+ m.drawRegenEnergy()
}
}
},
@@ -1835,6 +1891,7 @@ const m = {
m.holding();
m.throwBlock();
} else if (input.field) { //not hold but field button is pressed
+ if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
m.fieldPosition = { x: m.pos.x, y: m.pos.y }
@@ -1883,8 +1940,8 @@ const m = {
m.perfectPush(true);
}
}
- // m.drawFieldMeter()
- m.drawFieldMeter("rgba(0,0,0,0.2)")
+ // m.drawRegenEnergy()
+ m.drawRegenEnergy("rgba(0,0,0,0.2)")
if (tech.isPerfectBrake) { //cap mob speed around player
const range = 200 + 140 * wave + 150 * m.energy
for (let i = 0; i < mob.length; i++) {
@@ -1925,6 +1982,7 @@ const m = {
m.holding();
m.throwBlock();
} else if (input.field && m.fieldCDcycle < m.cycle) { //push away
+ if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
const DRAIN = 0.00035
@@ -2035,14 +2093,15 @@ const m = {
// }
// }
// }
-
//draw zero-G range
- ctx.beginPath();
- ctx.arc(m.pos.x, m.pos.y, this.fieldDrawRadius, 0, 2 * Math.PI);
- ctx.fillStyle = "#f5f5ff";
- ctx.globalCompositeOperation = "difference";
- ctx.fill();
- ctx.globalCompositeOperation = "source-over";
+ if (!simulation.isTimeSkipping) {
+ ctx.beginPath();
+ ctx.arc(m.pos.x, m.pos.y, this.fieldDrawRadius, 0, 2 * Math.PI);
+ ctx.fillStyle = "#f5f5ff";
+ ctx.globalCompositeOperation = "difference";
+ ctx.fill();
+ ctx.globalCompositeOperation = "source-over";
+ }
}
} else if (m.holdingTarget && m.fieldCDcycle < m.cycle) { //holding, but field button is released
m.pickUp();
@@ -2051,7 +2110,7 @@ const m = {
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.fieldDrawRadius = 0
}
- m.drawFieldMeter("rgba(0,0,0,0.2)")
+ m.drawRegenEnergy("rgba(0,0,0,0.2)")
}
}
},
@@ -2136,6 +2195,7 @@ const m = {
m.holding();
m.throwBlock();
} else if ((input.field && m.fieldCDcycle < m.cycle)) { //not hold but field button is pressed
+ if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
if (m.energy > 0.05) {
@@ -2147,8 +2207,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)
}
- m.regenEnergy()
- m.drawFieldMeter()
+ m.drawRegenEnergy()
}
}
},
@@ -2177,7 +2236,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)
// }
- // m.drawFieldMeter("rgba(0, 0, 0, 0.2)")
+ // m.drawRegenEnergy("rgba(0, 0, 0, 0.2)")
// if (tech.isExtruder) {
// if (input.field) {
@@ -2434,6 +2493,7 @@ const m = {
m.holding();
m.throwBlock();
} else if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
+ if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
@@ -2514,7 +2574,7 @@ const m = {
m.plasmaBall.fire()
}
}
- m.drawFieldMeter("rgba(0, 0, 0, 0.2)")
+ m.drawRegenEnergy("rgba(0, 0, 0, 0.2)")
m.plasmaBall.do()
}
} else if (tech.isExtruder) {
@@ -2525,6 +2585,7 @@ const m = {
m.holding();
m.throwBlock();
} else if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
+ if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
b.extruder();
@@ -2533,7 +2594,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)
}
- m.drawFieldMeter("rgba(0, 0, 0, 0.2)")
+ m.drawRegenEnergy("rgba(0, 0, 0, 0.2)")
if (input.field) {
b.wasExtruderOn = true
} else {
@@ -2565,6 +2626,7 @@ const m = {
m.holding();
m.throwBlock();
} else if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
+ if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
b.plasma();
@@ -2573,7 +2635,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)
}
- m.drawFieldMeter("rgba(0, 0, 0, 0.2)")
+ m.drawRegenEnergy("rgba(0, 0, 0, 0.2)")
}
}
},
@@ -2592,9 +2654,6 @@ const m = {
// m.fieldMeterColor = "#ff0"
m.fieldMeterColor = "#3fe"
m.eyeFillColor = m.fieldMeterColor
-
- m.fieldFireRate = 0.75
- b.setFireCD();
m.fieldFx = 1.2
m.fieldJump = 1.09
m.setMovement();
@@ -2654,6 +2713,9 @@ 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
+ if (m.energy > drain) m.energy -= drain
+
m.grabPowerUp();
if (this.rewindCount === 0) m.lookForPickUp();
@@ -2716,13 +2778,11 @@ const m = {
this.rewindCount = 0;
m.wakeCheck();
}
- if (m.energy < m.maxEnergy) m.regenEnergy(); //extra energy regen
- m.drawFieldMeter() // this calls m.regenEnergy(); also
+ m.drawRegenEnergy() // this calls m.regenEnergy(); also
}
} else {
m.fieldFire = true;
m.isBodiesAsleep = false;
- m.drain = 0.002
m.hold = function() {
if (m.isHolding) {
m.wakeCheck();
@@ -2730,17 +2790,16 @@ const m = {
m.holding();
m.throwBlock();
} else if (input.field && m.fieldCDcycle < m.cycle) {
+ const drain = 0.0026
+ if (m.energy > drain) m.energy -= drain
m.grabPowerUp();
- m.lookForPickUp();
- if (m.energy > m.drain) {
- m.energy -= m.drain;
- if (m.energy < m.drain) { //out of energy
- m.fieldCDcycle = m.cycle + 120;
- m.energy = 0;
- m.wakeCheck();
- }
+ m.lookForPickUp(); //this drains energy 0.001
+ if (m.energy > drain) {
timeStop();
} else { //holding, but field button is released
+ m.fieldCDcycle = m.cycle + 120;
+ m.energy = 0;
+ m.wakeCheck();
m.wakeCheck();
}
} else if (tech.isTimeStop && player.speed < 1 && m.onGround && m.fireCDcycle < m.cycle && !input.fire) {
@@ -2765,9 +2824,7 @@ const m = {
m.wakeCheck();
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 < m.maxEnergy) m.regenEnergy(); //extra energy regen
- if (m.energy < m.maxEnergy) m.regenEnergy(); //extra energy regen
- m.drawFieldMeter()
+ m.drawRegenEnergy()
}
}
},
@@ -2813,6 +2870,7 @@ const m = {
m.holding();
m.throwBlock();
} else if (input.field && m.fieldCDcycle < m.cycle) { //not hold and field button is pressed
+ if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp();
m.lookForPickUp();
} else if (m.holdingTarget && m.fieldCDcycle < m.cycle) { //holding target exists, and field button is not pressed
@@ -2825,6 +2883,15 @@ const m = {
if (m.fireCDcycle + 30 < m.cycle && !input.fire) { //automatically cloak if not firing
if (!m.isCloak) {
m.isCloak = true //enter cloak
+
+ // m.color = {
+ // hue: 0,
+ // sat: 0,
+ // light: 100
+ // }
+ // m.setFillColorsAlpha(0)
+
+
m.enterCloakCycle = m.cycle
if (tech.isCloakHealLastHit && m.lastHit > 0) {
const heal = Math.min(0.75 * m.lastHit, m.energy)
@@ -2914,7 +2981,7 @@ const m = {
player.collisionFilter.mask = cat.body | cat.map | cat.mob | cat.mobBullet | cat.mobShield //normal collisions
}
}
- this.drawFieldMeterCloaking()
+ this.drawRegenEnergyCloaking()
//show sneak attack status
// if (m.cycle > m.lastKillCycle + 240) {
// if (m.sneakAttackCharge > 0) {
@@ -3258,7 +3325,7 @@ const m = {
m.fieldOn = false
m.fieldRadius = 0
}
- m.drawFieldMeter("rgba(0,0,0,0.2)")
+ m.drawRegenEnergy("rgba(0,0,0,0.2)")
}
}
},
@@ -3685,7 +3752,7 @@ const m = {
// } else {
// m.hole.isReady = true;
// }
- m.drawFieldMeter()
+ m.drawRegenEnergy()
}
},
@@ -3771,7 +3838,7 @@ const m = {
// 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)
// }
// }
- // m.drawFieldMeter()
+ // m.drawRegenEnergy()
// },
},
],
@@ -3955,7 +4022,7 @@ const m = {
//body
ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI);
- ctx.fillStyle = this.bodyGradient
+ ctx.fillStyle = m.bodyGradient
ctx.fill();
ctx.arc(15, 0, 4, 0, 2 * Math.PI);
ctx.strokeStyle = "#333";
@@ -3998,7 +4065,7 @@ const m = {
if (tech.isPiezo) m.energy += 20.48;
if (tech.isStimulatedEmission) powerUps.ejectTech()
if (mob[k].onHit) mob[k].onHit();
- if (m.immuneCycle < m.cycle + tech.collisionImmuneCycles) m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
+ if (m.immuneCycle < m.cycle + m.collisionImmuneCycles) m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for 30 cycles
//extra kick between player and mob //this section would be better with forces but they don't work...
let angle = Math.atan2(player.position.y - mob[k].position.y, player.position.x - mob[k].position.x);
Matter.Body.setVelocity(player, {
diff --git a/js/powerup.js b/js/powerup.js
index 3e53405..0ad1750 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -825,15 +825,20 @@ const powerUps = {
if (!tech.isSuperDeterminism) text += `