diff --git a/js/index.js b/js/index.js
index 1023617..52c9f9e 100644
--- a/js/index.js
+++ b/js/index.js
@@ -255,17 +255,17 @@ const build = {
text += `
damage: ${((tech.damageFromTech())).toPrecision(3)} difficulty: ${((m.dmgScale)).toPrecision(3)}
defense: ${(1-m.harmReduction()).toPrecision(3)} difficulty: ${(1/simulation.dmgScale).toPrecision(3)}
-
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(true): ""}
+${b.fireCDscale < 1 ? `
fire rate: ${((1-b.fireCDscale)*100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}%`: ""}
+${tech.duplicationChance() ? `
duplication: ${(tech.duplicationChance()*100).toFixed(0)}%`: ""}
+${m.coupling ? `
coupling: ${(m.coupling).toFixed(2)} `+m.couplingDescription(true)+"": ""}
${botText}
health: (${(m.health*100).toFixed(0)} / ${(m.maxHealth*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}
-
JUNK: ${(junkCount / totalCount * 100).toFixed(1)}%
+${junkCount ? `
JUNK: ${(junkCount / totalCount * 100).toFixed(1)}% `: ""}
+
seed: ${Math.initialSeed}
level: ${level.levels[level.onLevel]} (${level.difficultyText()}) ${m.cycle} cycles
diff --git a/js/level.js b/js/level.js
index 5d0fd10..02a5c03 100644
--- a/js/level.js
+++ b/js/level.js
@@ -23,12 +23,11 @@ const level = {
// 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
+ // m.setField("standing wave") //molecular assembler standing wave 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("time crystals");
- // tech.giveTech("retrocausality")
- // for (let i = 0; i < 5; ++i) tech.giveTech("coupling")
+ // tech.giveTech("expansion")
+ // for (let i = 0; i < 1; ++i) tech.giveTech("field coupling")
// for (let i = 0; i < 1; ++i) tech.giveTech("free-electron laser")
// m.damage(0.1);
// for (let i = 0; i < 1; i++) tech.giveTech("dynamic equilibrium")
@@ -37,7 +36,7 @@ const level = {
// spawn.starter(1900, -500, 200)
// spawn.beetleBoss(1900, -400)
- // spawn.pulsarBoss(1900, -400)
+ // spawn.shooter(1900, -500)
// 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");
@@ -145,7 +144,7 @@ const level = {
simulation.accelScale = 1 //mob acceleration increases each level
simulation.CDScale = 1 //mob CD time decreases each level
simulation.dmgScale = Math.max(0.1, 0.34 * simulation.difficulty) //damage done by mobs scales with total levels
- simulation.healScale = 1 / (1 + simulation.difficulty * 0.052) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
+ simulation.healScale = 1 / (1 + simulation.difficulty * 0.05) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
},
difficultyIncrease(num = 1) {
for (let i = 0; i < num; i++) {
@@ -155,7 +154,7 @@ const level = {
if (simulation.CDScale > 0.15) simulation.CDScale *= 0.965 //mob CD time decreases each level
}
simulation.dmgScale = Math.max(0.1, 0.34 * simulation.difficulty) //damage done by mobs scales with total levels
- simulation.healScale = 1 / (1 + simulation.difficulty * 0.052) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
+ simulation.healScale = 1 / (1 + simulation.difficulty * 0.05) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
// console.log(`CD = ${simulation.CDScale}`)
},
difficultyDecrease(num = 1) { //used in easy mode for simulation.reset()
@@ -167,7 +166,7 @@ const level = {
}
if (simulation.difficulty < 1) simulation.difficulty = 0;
simulation.dmgScale = Math.max(0.1, 0.34 * simulation.difficulty) //damage done by mobs scales with total levels
- simulation.healScale = 1 / (1 + simulation.difficulty * 0.052)
+ simulation.healScale = 1 / (1 + simulation.difficulty * 0.05)
},
difficultyText() {
if (simulation.difficultyMode === 1) {
diff --git a/js/player.js b/js/player.js
index 50b8f9c..a9d1d8d 100644
--- a/js/player.js
+++ b/js/player.js
@@ -344,7 +344,7 @@ const m = {
!tech.tech[i].isFromAppliedScience &&
tech.tech[i].name !== "many-worlds" &&
tech.tech[i].name !== "Ψ(t) collapse" &&
- tech.tech[i].name !== "non-unitary operator" &&
+ tech.tech[i].name !== "Hilbert space" &&
tech.tech[i].name !== "-quantum leap-"
) {
totalTech += tech.tech[i].count
@@ -519,28 +519,28 @@ const m = {
let dmg = 1
dmg *= m.fieldHarmReduction
// if (!tech.isFlipFlopOn && tech.isFlipFlopHealth) dmg *= 0.5
- if (tech.isLowHealthDefense) dmg *= 1 - Math.max(0, 1 - m.health) * 0.8
if (tech.isZeno) dmg *= 0.15
if (tech.isFieldHarmReduction) dmg *= 0.5
if (tech.isHarmMACHO) dmg *= 0.4
if (tech.isImmortal) dmg *= 0.66
- if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33
+ if (tech.isSlowFPS) dmg *= 0.8
+ if (tech.energyRegen === 0) dmg *= 0.34
if (tech.healthDrain) dmg *= 1 + 3.33 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage
+ if (m.fieldMode === 0 || m.fieldMode === 3) dmg *= 0.73 ** m.coupling
+ if (tech.isLowHealthDefense) dmg *= 1 - Math.max(0, 1 - m.health) * 0.8
+ if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33
if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage
if (tech.isAddBlockMass && m.isHolding) dmg *= 0.15
if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.0165, 0.66)
- if (tech.isSlowFPS) dmg *= 0.8
if (tech.isHarmReduce && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.25
if (tech.isNeutronium && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.1
if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots()
if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33;
if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.3
- if (tech.energyRegen === 0) dmg *= 0.34
if (tech.isTurret && m.crouch) dmg *= 0.34;
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.73 ** m.coupling
return dmg
},
rewind(steps) { // m.rewind(Math.floor(Math.min(599, 137 * m.energy)))
@@ -987,6 +987,8 @@ 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.setMaxHealth();
m.couplingChange()
m.hole = {
isOn: false,
@@ -1002,7 +1004,8 @@ const m = {
}
},
setMaxEnergy() {
- 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")
+ // (m.fieldMode === 0 || m.fieldMode === 1) * 0.4 * m.coupling +
+ 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")
// if (tech.isEnergyHealth) m.maxEnergy *= Math.sqrt(m.harmReduction())
simulation.makeTextLog(`m.maxEnergy = ${(m.maxEnergy.toFixed(2))}`)
},
@@ -1368,8 +1371,13 @@ const m = {
m.energy -= fieldBlockCost
if (m.energy < 0) m.energy = 0;
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
- if (tech.blockingIce && !who.isInvulnerable) {
- for (let i = 0; i < fieldBlockCost * 60 * tech.blockingIce; i++) b.iceIX(3, 2 * Math.PI * Math.random(), m.pos)
+ if (!who.isInvulnerable && (m.coupling && m.fieldMode < 3) && bullet.length < 250) { //for standing wave mostly
+ for (let i = 0; i < m.coupling; i++) {
+ const sub = Vector.mult(Vector.normalise(Vector.sub(who.position, m.pos)), (m.fieldRange * m.harmonicRadius) * (0.4 + 0.3 * Math.random())) //m.harmonicRadius should be 1 unless you are standing wave expansion
+ const rad = Vector.rotate(sub, 1 * (Math.random() - 0.5))
+ const angle = Math.atan2(sub.y, sub.x)
+ b.iceIX(6 + 6 * Math.random(), angle + 3 * (Math.random() - 0.5), Vector.add(m.pos, rad))
+ }
}
const unit = Vector.normalise(Vector.sub(player.position, who.position))
if (tech.blockDmg) {
@@ -1543,54 +1551,22 @@ const m = {
}
},
hold() {},
- // couplingDescription() {
- // switch (m.fieldMode) {
- // case 0: //field emitter
- // return `gain the effects of all other fields`
- // case 1: //standing wave
- // return `+40 max energy per coupling`
- // case 2: //perfect diamagnetism
- // return `invulnerable +3 seconds post collision per coupling`
- // case 3: //negative mass
- // return `+27% defense per coupling`
- // case 4: //assembler
- // return `generate 6 energy per second per coupling`
- // case 5: //plasma
- // return `+50 max health per coupling`
- // case 6: //time dilation
- // return `+25% longer stopped time per coupling` //movement, jumping, and
- // case 7: //cloaking
- // return `+33% ambush damage per coupling`
- // case 8: //pilot wave
- // return `+40% block collision damage per coupling`
- // case 9: //wormhole
- // return `+4% duplication per coupling`
- // }
- // },
couplingDescription(isScaled = false) {
const couple = isScaled ? m.coupling : 1
switch (m.fieldMode) {
case 0: //field emitter
- return `gain the effects of all applicable fields`
- // return `+${40*couple} max energy
- //
invulnerable +${3*couple} seconds post collision
- //
+${27*couple}% defense
- //
generate ${6*couple} energy per second
- //
+${50*couple} max health
- //
+${20*couple}% longer stopped time
- //
+${33*couple}% ambush damage
- //
+${40*couple}% block collision damage
- //
+${4*couple}% duplication`
+ return `gain the effects of all fields`
case 1: //standing wave
- return `+${40*couple} max energy`
+ return `deflecting condenses +${Math.ceil(couple)} ice IX`
case 2: //perfect diamagnetism
- return `invulnerable +${3*couple} seconds post collision`
+ return `deflecting condenses +${Math.ceil(couple)} ice IX`
+ // return `invulnerable +${2*couple} seconds post collision`
case 3: //negative mass
return `+${27*couple}% defense`
case 4: //assembler
return `generate ${6*couple} energy per second`
case 5: //plasma
- return `+${50*couple} max health`
+ return `+${15*couple} damage`
case 6: //time dilation
return `+${25*couple}% longer stopped time` //movement, jumping, and
case 7: //cloaking
@@ -1598,16 +1574,17 @@ const m = {
case 8: //pilot wave
return `+${40*couple}% block collision damage`
case 9: //wormhole
- return `+${4*couple}% duplication`
+ return `after eating blocks +${20*couple} energy`
}
},
couplingChange() {
- m.setMaxEnergy();
- m.setMaxHealth();
+ // m.setMaxEnergy();
+ // m.setMaxHealth();
m.setFieldRegen()
mobs.setMobSpawnHealth();
+ if ((m.fieldMode === 0 || m.fieldMode === 9) && !build.isExperimentSelection && !simulation.isTextLogOpen) simulation.circleFlare(0.4);
powerUps.setDupChance();
- m.collisionImmuneCycles = 30 + m.coupling * 180
+ // m.collisionImmuneCycles = 30 + m.coupling * 120 //2 seconds
// switch (m.fieldMode) {
// case 0: //field emitter
// // m.fieldFireRate = 0.8 ** (m.coupling)
@@ -1654,9 +1631,9 @@ const m = {
},
fieldUpgrades: [{
name: "field emitter",
- //
energy regen disabled if immune to harm
- description: "use energy to deflect mobs
100 max energy
generate 6 energy per second",
- // description: "use energy to deflect mobs,
grab power ups, and throw blocks
generate 6 energy/s, when not immune to harm",
+ description: `use energy to deflect mobs
+
100 max energy
+
generate 6 energy per second`,
effect: () => {
m.hold = function() {
if (m.isHolding) {
@@ -1683,7 +1660,9 @@ const m = {
{
name: "standing wave",
//deflecting protects you in every direction
- description: "3 oscillating shields are permanently active
+60 max energy
generate 6 energy per second", //drains energy //deflecting has 50% less recoil
+ description: `3 oscillating shields are permanently active
+
+60 max energy
+
generate 6 energy per second`,
drainCD: 0,
effect: () => {
m.fieldBlockCD = 0;
@@ -1811,10 +1790,11 @@ 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);
- if (tech.blockingIce) {
- for (let i = 0; i < 2 * tech.blockingIce; i++) {
- const angle = m.fieldAngle + 1.55 * (Math.random() - 0.5)
- b.iceIX(10, angle, Vector.add(m.fieldPosition, { x: m.fieldRange * Math.cos(angle), y: m.fieldRange * Math.sin(angle) }))
+ if (bullet.length < 250) {
+ for (let i = 0; i < m.coupling; i++) {
+ const angle = m.fieldAngle + 4 * m.fieldArc * (Math.random() - 0.5)
+ const radius = m.fieldRange * (0.6 + 0.3 * Math.random())
+ b.iceIX(6 + 6 * Math.random(), angle, Vector.add(m.fieldPosition, { x: radius * Math.cos(angle), y: radius * Math.sin(angle) }))
}
}
if (tech.blockDmg) { //electricity
@@ -3478,7 +3458,7 @@ const m = {
Matter.Composite.remove(engine.world, body[i]);
body.splice(i, 1);
m.fieldRange *= 0.8
- if (tech.isWormholeEnergy) m.energy += 0.5
+ if ((m.fieldMode === 0 || m.fieldMode === 9) && m.immuneCycle < m.cycle) m.energy += 0.2 * m.coupling
if (tech.isWormholeWorms) { //pandimensional spermia
b.worm(Vector.add(m.hole.pos2, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random())))
Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), -10));
@@ -3501,7 +3481,9 @@ const m = {
body.splice(i, 1);
m.fieldRange *= 0.8
// if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2
- if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.5
+ // if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.5
+ if ((m.fieldMode === 0 || m.fieldMode === 9) && m.immuneCycle < m.cycle) m.energy += 0.2 * m.coupling
+ if (m.fieldMode === 0 || m.fieldMode === 9) m.energy += 0.2 * m.coupling
if (tech.isWormholeWorms) { //pandimensional spermia
b.worm(Vector.add(m.hole.pos1, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random())))
Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), 5));
diff --git a/js/powerup.js b/js/powerup.js
index 20cea23..418192d 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -595,7 +595,7 @@ const powerUps = {
}
}
if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
- tech.junkResearchNumber = Math.floor(5 * Math.random())
+ tech.junkResearchNumber = Math.ceil(3 * Math.random())
text += `
`
for (let i = 0; i < tech.junkResearchNumber; i++) text += ``
text += ` pseudoscience `
@@ -734,7 +734,7 @@ const powerUps = {
}
}
if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
- tech.junkResearchNumber = Math.floor(5 * Math.random())
+ tech.junkResearchNumber = Math.ceil(3 * Math.random())
text += ` `
for (let i = 0; i < tech.junkResearchNumber; i++) text += ``
text += ` pseudoscience `
@@ -987,7 +987,7 @@ const powerUps = {
}
//add in research button or pseudoscience button
if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
- tech.junkResearchNumber = Math.floor(5 * Math.random())
+ tech.junkResearchNumber = Math.ceil(3 * Math.random())
text += ` `
for (let i = 0; i < tech.junkResearchNumber; i++) text += ``
text += ` pseudoscience `
diff --git a/js/spawn.js b/js/spawn.js
index cbdf322..081a24d 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -2009,7 +2009,7 @@ const spawn = {
this.checkStatus();
if (this.seePlayer.recall) {
//throw large seekers
- if (!(simulation.cycle % 240)) {
+ if (!(simulation.cycle % 90)) {
spawn.seeker(this.position.x, this.position.y, 15 * (0.7 + 0.5 * Math.random()), 7); //give the bullet a rotational velocity as if they were attached to a vertex
const who = mob[mob.length - 1]
Matter.Body.setDensity(who, 0.00001); //normal is 0.001
@@ -2559,7 +2559,6 @@ const spawn = {
};
me.warpIntensity = 0
me.awake = function() {
- // this.armor();
this.checkStatus();
//health bar needs to be here because the position is being set
const h = this.radius * 0.3;
@@ -2627,14 +2626,6 @@ const spawn = {
ctx.stroke();
}
- // ctx.beginPath();
- // ctx.arc(this.position.x, this.position.y, this.laserRange * 0.9, 0, 2 * Math.PI);
- // ctx.strokeStyle = "rgba(150,0,255,0.5)";
- // ctx.lineWidth = 1;
- // ctx.stroke();
- // ctx.setLineDash([]);
- // ctx.fillStyle = "rgba(150,0,255,0.03)";
- // ctx.fill();
if (!this.isStunned && !this.isSlowed) {
if (this.followDelay > this.delayLimit) this.followDelay -= 0.15;
let history = m.history[(m.cycle - Math.floor(this.followDelay)) % 600]
@@ -4261,8 +4252,8 @@ const spawn = {
this.death();
//hit player
if (Vector.magnitude(Vector.sub(this.position, player.position)) < this.explodeRange && m.immuneCycle < m.cycle) {
- m.damage(0.015 * simulation.dmgScale * (tech.isRadioactiveResistance ? 0.25 : 1));
- m.energy -= 0.15 * (tech.isRadioactiveResistance ? 0.25 : 1)
+ m.damage(0.02 * simulation.dmgScale * (tech.isRadioactiveResistance ? 0.25 : 1));
+ m.energy -= 0.2 * (tech.isRadioactiveResistance ? 0.25 : 1)
if (m.energy < 0) m.energy = 0
}
// mob[i].isInvulnerable = false //make mineBoss not invulnerable ?
@@ -5046,11 +5037,52 @@ const spawn = {
// this.armor();
this.seePlayerByLookingAt();
this.checkStatus();
- this.fire();
- //gently return to starting location
- // const sub = Vector.sub(this.homePosition, this.position)
- // const dist = Vector.magnitude(sub)
- // if (dist > 50) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002)
+ // this.fire();
+ const setNoseShape = () => {
+ const mag = this.radius + this.radius * this.noseLength;
+ this.vertices[1].x = this.position.x + Math.cos(this.angle) * mag;
+ this.vertices[1].y = this.position.y + Math.sin(this.angle) * mag;
+ };
+ //throw a mob/bullet at player
+ if (this.seePlayer.recall) {
+ //set direction to turn to fire
+ if (!(simulation.cycle % this.seePlayerFreq)) {
+ this.fireDir = Vector.normalise(Vector.sub(this.seePlayer.position, this.position));
+ this.fireDir.y -= Math.abs(this.seePlayer.position.x - this.position.x) / 2500; //gives the bullet an arc //was / 1600
+ }
+ //rotate towards fireAngle
+ const angle = this.angle + Math.PI / 2;
+ const dot = Vector.dot({
+ x: Math.cos(angle),
+ y: Math.sin(angle)
+ }, this.fireDir)
+ // c = Math.cos(angle) * this.fireDir.x + Math.sin(angle) * this.fireDir.y;
+ const threshold = 0.1;
+ if (dot > threshold) {
+ this.torque += 0.000004 * this.inertia;
+ } else if (dot < -threshold) {
+ this.torque -= 0.000004 * this.inertia;
+ } else if (this.noseLength > 1.5 && dot > -0.2 && dot < 0.2) {
+ //fire
+ for (let i = 0, len = 2 + 0.07 * simulation.difficulty; i < len; i++) {
+ spawn.bullet(this.vertices[1].x, this.vertices[1].y, 7 + Math.ceil(this.radius / 25));
+ const v = 15;
+ Matter.Body.setVelocity(mob[mob.length - 1], {
+ x: this.velocity.x + this.fireDir.x * v + 7 * Math.random(),
+ y: this.velocity.y + this.fireDir.y * v + 7 * Math.random()
+ });
+ }
+ this.noseLength = 0;
+ // recoil
+ this.force.x -= 0.005 * this.fireDir.x * this.mass;
+ this.force.y -= 0.005 * this.fireDir.y * this.mass;
+ }
+ if (this.noseLength < 1.5) this.noseLength += this.fireFreq;
+ setNoseShape();
+ } else if (this.noseLength > 0.1) {
+ this.noseLength -= this.fireFreq / 2;
+ setNoseShape();
+ }
};
},
bullet(x, y, radius = 9, sides = 0) {
@@ -5059,11 +5091,11 @@ const spawn = {
let me = mob[mob.length - 1];
me.stroke = "transparent";
me.onHit = function() {
- this.explode(this.mass * 20);
+ this.explode(this.mass * 15);
};
Matter.Body.setDensity(me, 0.00004); //normal is 0.001
- me.timeLeft = 200;
- // me.g = 0.001; //required if using this.gravity
+ me.timeLeft = 220;
+ me.g = 0.001; //required if using this.gravity
me.frictionAir = 0;
me.restitution = 0.8;
me.leaveBody = false;
@@ -5074,7 +5106,7 @@ const spawn = {
me.collisionFilter.category = cat.mobBullet;
me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet;
me.do = function() {
- // this.gravity();
+ this.gravity();
this.timeLimit();
};
},
@@ -6026,7 +6058,7 @@ const spawn = {
for (let i = 0; i < nodes; ++i) {
angle -= 0.1
spawn.snakeBody(x + tailRadius * Math.cos(angle), y + tailRadius * Math.sin(angle), i === 0 ? 25 : 20);
- if (i < 3) mob[mob.length - 1].snakeHeadID = me.id
+ if (i < 4) mob[mob.length - 1].snakeHeadID = me.id
mob[mob.length - 1].previousTailID = previousTailID
previousTailID = mob[mob.length - 1].id
}
@@ -6125,7 +6157,7 @@ const spawn = {
spawn.snakeBody(x + tailRadius * Math.cos(angle), y + tailRadius * Math.sin(angle), i === 0 ? 25 : 20);
const who = mob[mob.length - 1]
who.fill = `hsl(${160+40*Math.random()}, 100%, ${5 + 25*Math.random()*Math.random()}%)`
- if (i < 3) who.snakeHeadID = me.id
+ if (i < 4) who.snakeHeadID = me.id
if (i === 0) me.snakeBody1 = who //track this segment, so the difference in position between this segment and the head can be used to angle the wings
who.previousTailID = previousTailID
previousTailID = who.id
diff --git a/js/tech.js b/js/tech.js
index 5ec8375..e860cb8 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -1,6 +1,7 @@
const tech = {
totalCount: null,
setupAllTech() {
+ tech.damage = 1
for (let i = 0, len = tech.tech.length; i < len; i++) {
tech.tech[i].count = 0
tech.tech[i].isLost = false
@@ -90,7 +91,6 @@ const tech = {
if (tech.tech[i].count < tech.tech[i].maxCount && tech.tech[i].allowed() && !tech.tech[i].isJunk) countNonJunk += tech.tech[i].frequency
}
const num = percent * countNonJunk //scale number added
- console.log(num)
for (let i = 0; i < num; i++) tech.tech[options[Math.floor(Math.random() * options.length)]].frequency++ //add random array options to tech pool
simulation.makeTextLog(`tech.tech.push(${num.toFixed(0)} JUNK)`)
return num
@@ -206,17 +206,12 @@ const tech = {
hasExplosiveDamageCheck() {
return tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount > 0 || tech.isBoomBotUpgrade || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)
},
+ damage: 1, //used for tech changes to player damage that don't have complex conditions
damageFromTech() {
- let dmg = 1 //m.fieldDamage
- if (m.coupling && (m.fieldMode === 0 || m.fieldMode === 7)) dmg *= 1 + 0.15 * m.coupling
+ let dmg = tech.damage //m.fieldDamage
+ if (m.coupling && (m.fieldMode === 0 || m.fieldMode === 5)) dmg *= 1 + 0.15 * m.coupling
+ if (m.isSneakAttack && m.sneakAttackCycle + Math.min(120, 0.5 * (m.cycle - m.enterCloakCycle)) > m.cycle) dmg *= 4.33 * (1 + 0.33 * m.coupling)
if (tech.deathSkipTime) dmg *= 1 + 0.6 * tech.deathSkipTime
- if (tech.isNoDraftPause) dmg *= 1.34
- if (tech.isCloakingDamage) dmg *= 1.35
- if (tech.isTechDamage) dmg *= 1.9
- if (tech.isMaxEnergyTech) dmg *= 1.5
- if (tech.isEnergyNoAmmo) dmg *= 1.88
- if (tech.isEnergyLoss) dmg *= 1.55
- if (tech.OccamDamage) dmg *= tech.OccamDamage
if (tech.isTechDebt) dmg *= Math.max(41 / (tech.totalCount + 21), 4 - 0.15 * tech.totalCount)
if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555
if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599
@@ -234,14 +229,13 @@ const tech = {
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165)
if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 1.6
- if (m.isSneakAttack && m.sneakAttackCycle + Math.min(120, 0.5 * (m.cycle - m.enterCloakCycle)) > m.cycle) dmg *= 4.33 * (1 + 0.33 * m.coupling)
if (tech.isAxion && tech.isHarmMACHO) dmg *= 2 - m.harmReduction()
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
if (tech.lastHitDamage && m.lastHit) dmg *= 1 + tech.lastHitDamage * m.lastHit * (2 - m.harmReduction()) // if (!simulation.paused) m.lastHit = 0
- return dmg * tech.slowFire * tech.aimDamage
+ return dmg
},
duplicationChance() {
- return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.045 + 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.04 * m.coupling)
+ return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.045 + 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() {
@@ -592,10 +586,13 @@ const tech = {
return !tech.isAmmoFromHealth
},
requires: "not catabolism",
+ damage: 1.88,
effect() {
+ tech.damage *= this.damage
tech.isEnergyNoAmmo = true;
},
remove() {
+ if (this.count) tech.damage /= this.damage
tech.isEnergyNoAmmo = false;
}
},
@@ -815,11 +812,14 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() { return true },
+ damage: 1.2,
effect() {
+ tech.damage *= this.damage
tech.slowFire = 1.2
b.setFireCD();
},
remove() {
+ if (this.count) tech.damage /= this.damage
tech.slowFire = 1;
b.setFireCD();
}
@@ -941,6 +941,22 @@ const tech = {
tech.sporesOnDeath = 0;
}
},
+ {
+ name: "bubble fusion",
+ description: `after destroying a mob's natural shield
spawn 1-2 ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`,
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() { return true },
+ requires: "",
+ effect() {
+ tech.isShieldAmmo = true;
+ },
+ remove() {
+ tech.isShieldAmmo = false;
+ }
+ },
{
name: "reaction inhibitor",
description: "-13% maximum mob health", //health
@@ -2321,11 +2337,14 @@ const tech = {
return !tech.isRewindAvoidDeath
},
requires: "not CPT",
+ damage: 1.5,
effect() {
+ tech.damage *= this.damage
tech.isMaxEnergyTech = true;
m.setMaxEnergy()
},
remove() {
+ if (this.count) tech.damage /= this.damage
tech.isMaxEnergyTech = false;
m.setMaxEnergy()
}
@@ -2339,10 +2358,13 @@ const tech = {
frequencyDefault: 1,
allowed() { return true },
requires: "",
+ damage: 1.55,
effect() {
+ tech.damage *= this.damage
tech.isEnergyLoss = true;
},
remove() {
+ if (this.count) tech.damage /= this.damage
tech.isEnergyLoss = false;
}
},
@@ -2607,10 +2629,13 @@ const tech = {
frequencyDefault: 1,
allowed() { return true },
requires: "",
+ damage: 1.9,
effect() {
+ tech.damage *= this.damage
tech.isTechDamage = true;
},
remove() {
+ if (this.count) tech.damage /= this.damage
tech.isTechDamage = false;
}
},
@@ -2750,6 +2775,37 @@ const tech = {
tech.healthDrain = 0;
}
},
+ {
+ name: "ergodicity",
+ description: `+91% damage
${powerUps.orb.heal()} have no effect`,
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() {
+ return !tech.isEnergyHealth && !tech.healthDrain
+ },
+ requires: "not mass-energy, enthalpy",
+ damage: 1.91,
+ effect() {
+ tech.damage *= this.damage
+ tech.isNoHeals = true;
+ powerUps.heal.color = "#abb"
+ for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live
+ if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color
+ }
+ },
+ remove() {
+ if (this.count) {
+ tech.damage /= this.damage
+ powerUps.heal.color = "#0eb"
+ for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live
+ if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color
+ }
+ }
+ tech.isNoHeals = false;
+ }
+ },
{
name: "maintenance",
description: `double the frequency of finding healing tech
spawn ${powerUps.orb.heal(13)}`,
@@ -2854,8 +2910,7 @@ const tech = {
},
{
name: "Hilbert space",
- // link: `non-unitary operator`,
- description: "reduce combat difficulty by 2 levels
after a collision enter an alternate reality",
+ description: "+91% damage
after a collision enter an alternate reality",
maxCount: 1,
count: 0,
frequency: 1,
@@ -2864,15 +2919,14 @@ const tech = {
return !tech.isResearchReality && !tech.isSwitchReality
},
requires: "not Ψ(t) collapse, many-worlds",
+ damage: 1.91,
effect() {
+ tech.damage *= this.damage
tech.isCollisionRealitySwitch = true;
- level.difficultyDecrease(simulation.difficultyMode * 2)
},
remove() {
+ if (this.count) tech.damage /= this.damage
tech.isCollisionRealitySwitch = false;
- if (this.count > 0) {
- level.difficultyIncrease(simulation.difficultyMode * 2)
- }
}
},
{
@@ -3022,7 +3076,7 @@ const tech = {
},
{
name: "pseudoscience",
- description: "when selecting a power up, research 3 times
for free, but add 0-3% JUNK to the tech pool",
+ description: "when selecting a power up, research 3 times
for free, but add 1-3% JUNK to the tech pool",
maxCount: 1,
count: 0,
frequency: 1,
@@ -3165,68 +3219,6 @@ const tech = {
tech.isSuperDeterminism = false;
}
},
- {
- name: "unified field theory",
- description: `clicking the field box when paused cycles your field
triple the frequency of finding fieldtech`,
- maxCount: 1,
- count: 0,
- frequency: 1,
- frequencyDefault: 1,
- allowed() {
- return !tech.isSuperDeterminism && !tech.isNoDraftPause
- },
- requires: "not superdeterminism, eternalism",
- effect() {
- tech.isPauseSwitchField = true;
- for (let i = 0, len = tech.tech.length; i < len; i++) {
- if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 3
- }
- },
- remove() {
- tech.isPauseSwitchField = false;
- if (this.count > 1) {
- for (let i = 0, len = tech.tech.length; i < len; i++) {
- if (tech.tech[i].isFieldTech) tech.tech[i].frequency /= 3
- }
- }
- }
- },
- {
- name: "paradigm shift",
- description: `clicking tech while paused ejects them
16% chance to fail`,
- maxCount: 1,
- count: 0,
- frequency: 1,
- frequencyDefault: 1,
- allowed() {
- return !tech.isSuperDeterminism && !tech.isNoDraftPause
- },
- requires: "not superdeterminism, eternalism",
- effect() {
- tech.isPauseEjectTech = true;
- },
- remove() {
- tech.isPauseEjectTech = false;
- }
- },
- {
- name: "eternalism",
- description: "+34% damage
time can't be paused (time can be dilated)",
- maxCount: 1,
- count: 0,
- frequency: 1,
- frequencyDefault: 1,
- allowed() {
- return !tech.isPauseSwitchField && !tech.isPauseEjectTech && !tech.isWormHolePause
- },
- requires: "not unified field theory, paradigm shift, invariant",
- effect() {
- tech.isNoDraftPause = true
- },
- remove() {
- tech.isNoDraftPause = false
- }
- },
{
name: "technical debt", // overengineering
descriptionFunction() {
@@ -3265,7 +3257,7 @@ const tech = {
},
{
name: "meta-analysis",
- description: `if you choose a JUNK tech you instead get a
random normal tech and ${powerUps.orb.research(2)}`,
+ description: `if you choose a JUNK tech you instead get a
random normal tech and spawn ${powerUps.orb.research(2)}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3281,81 +3273,95 @@ const tech = {
},
{
name: "dark patterns",
- description: "reduce combat difficulty by 1 level
+31% JUNK to tech pool",
- maxCount: 1,
- count: 0,
- frequency: 1,
- frequencyDefault: 1,
- allowed() {
- return level.onLevel < 8 && level.onLevel > 0
- },
- requires: "on levels 1 through 7",
- effect() {
- level.difficultyDecrease(simulation.difficultyMode)
- // simulation.difficulty-=
- simulation.makeTextLog(`level.difficultyDecrease(simulation.difficultyMode)`)
- this.refundAmount += tech.addJunkTechToPool(0.31)
- // for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i])
- },
- refundAmount: 0,
- remove() {
- if (this.count > 0) {
- if (this.refundAmount > 0) tech.removeJunkTechFromPool(this.refundAmount)
- level.difficultyIncrease(simulation.difficultyMode)
- }
- }
- },
- {
- name: "ergodicity",
- description: `reduce combat difficulty by 2 levels
${powerUps.orb.heal()} have no effect`,
- maxCount: 1,
- count: 0,
- frequency: 1,
- frequencyDefault: 1,
- allowed() {
- return level.onLevel > 1 && !tech.isEnergyHealth && !tech.healthDrain
- },
- requires: "past level 1, not mass-energy, enthalpy",
- effect() {
- tech.isNoHeals = true;
- level.difficultyDecrease(simulation.difficultyMode * 2)
- simulation.makeTextLog(`level.difficultyDecrease(simulation.difficultyMode * 2)`)
- powerUps.heal.color = "#abb"
- for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live
- if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color
- }
- },
- remove() {
- if (tech.isNoHeals) {
- powerUps.heal.color = "#0eb"
- for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live
- if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color
- }
- }
- tech.isNoHeals = false;
- if (this.count > 0) level.difficultyIncrease(simulation.difficultyMode * 2)
- }
- },
- {
- name: "bubble fusion",
- description: `after destroying a mob's natural shield
spawn 1-2 ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`,
+ description: "+38% damage
+53% JUNK to tech pool",
maxCount: 1,
count: 0,
frequency: 1,
frequencyDefault: 1,
allowed() { return true },
requires: "",
+ damage: 1.38,
effect() {
- tech.isShieldAmmo = true;
+ tech.damage *= this.damage
+ this.refundAmount += tech.addJunkTechToPool(0.53)
+ },
+ refundAmount: 0,
+ remove() {
+ if (this.count > 0) {
+ tech.damage /= this.damage
+ if (this.refundAmount > 0) tech.removeJunkTechFromPool(this.refundAmount)
+ }
+ }
+ },
+ {
+ name: "eternalism",
+ description: "+34% damage
time can't be paused (time can be dilated)",
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() {
+ return !tech.isPauseSwitchField && !tech.isPauseEjectTech && !tech.isWormHolePause
+ },
+ requires: "not unified field theory, paradigm shift, invariant",
+ damage: 1.34,
+ effect() {
+ tech.damage *= this.damage
+ tech.isNoDraftPause = true
},
remove() {
- tech.isShieldAmmo = false;
+ if (this.count) tech.damage /= this.damage
+ tech.isNoDraftPause = false
+ }
+ },
+ {
+ name: "paradigm shift",
+ description: `clicking tech while paused ejects them
16% chance to fail`,
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() {
+ return !tech.isSuperDeterminism && !tech.isNoDraftPause
+ },
+ requires: "not superdeterminism, eternalism",
+ effect() {
+ tech.isPauseEjectTech = true;
+ },
+ remove() {
+ tech.isPauseEjectTech = false;
+ }
+ },
+ {
+ name: "unified field theory",
+ description: `clicking the field box when paused cycles your field
triple the frequency of finding fieldtech`,
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() {
+ return !tech.isSuperDeterminism && !tech.isNoDraftPause
+ },
+ requires: "not superdeterminism, eternalism",
+ effect() {
+ tech.isPauseSwitchField = true;
+ for (let i = 0, len = tech.tech.length; i < len; i++) {
+ if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 3
+ }
+ },
+ remove() {
+ tech.isPauseSwitchField = false;
+ if (this.count > 1) {
+ for (let i = 0, len = tech.tech.length; i < len; i++) {
+ if (tech.tech[i].isFieldTech) tech.tech[i].frequency /= 3
+ }
+ }
}
},
{
name: "field coupling",
descriptionFunction() {
- return `+1 field coupling (${m.fieldUpgrades[m.fieldMode].name})
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}`
+ return `+1 coupling (${m.fieldUpgrades[m.fieldMode].name})
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}`
},
maxCount: 9,
count: 0,
@@ -3375,7 +3381,7 @@ const tech = {
}
},
{
- name: "crystallography",
+ name: "quintessence",
descriptionFunction() {
return `use all your ${powerUps.orb.research(1)} to get +${powerUps.research.count*this.couplingToResearch} coupling
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}`
},
@@ -3670,11 +3676,8 @@ const tech = {
},
{
name: "Occam's razor",
- // descriptionFunction() {
- // return `randomly remove ${this.removePercent * 100}% of your tech
for each removed gain ${this.damagePerRemoved * 100}% damage`
- // },
descriptionFunction() {
- return `randomly remove half your tech
for each removed +${this.damagePerRemoved * 100 }% damage (~${(this.count === 0) ? this.damagePerRemoved * 50 * tech.totalCount : tech.OccamDamage*100}%)`
+ return `randomly remove half your tech
for each removed +${this.damagePerRemoved * 100 }% damage (~${(this.count === 0) ? this.damagePerRemoved * 50 * tech.totalCount : this.damage*100}%)`
},
maxCount: 1,
count: 0,
@@ -3688,6 +3691,7 @@ const tech = {
requires: "more than 6 tech",
// removePercent: 0.5,
damagePerRemoved: 0.5,
+ damage: null,
effect() {
let pool = []
for (let i = 0, len = tech.tech.length; i < len; i++) { // spawn new tech power ups
@@ -3696,11 +3700,11 @@ const tech = {
pool = shuffle(pool); //shuffles order of maps
let removeCount = 0
for (let i = 0, len = pool.length * this.damagePerRemoved; i < len; i++) removeCount += tech.removeTech(pool[i])
- tech.OccamDamage = 1 + this.damagePerRemoved * removeCount
- // tech.OccamDamage = Math.pow(1.25, removeCount)
+ this.damage = 1 + this.damagePerRemoved * removeCount
+ tech.damage *= this.damage
},
remove() {
- tech.OccamDamage = 0;
+ if (this.count) tech.damage /= this.damage
}
},
{
@@ -4336,7 +4340,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1
+ return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3)
},
requires: "a freeze effect",
effect() {
@@ -4355,7 +4359,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1
+ return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3)
},
requires: "a freeze effect",
effect() {
@@ -4374,7 +4378,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
+ return (tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3)) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
},
requires: "a localized freeze effect, no other mob death tech",
effect() {
@@ -4393,7 +4397,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || tech.blockingIce || tech.iceIXOnDeath || tech.isIceShot
+ return (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot
},
requires: "ice IX",
effect() {
@@ -4412,7 +4416,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 || tech.iceIXOnDeath || tech.isIceShot
+ return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot
},
requires: "a localized freeze effect",
effect() {
@@ -5012,7 +5016,7 @@ const tech = {
},
{
name: "vacuum bomb",
- description: "grenades fire slower, explode bigger
and, suck everything towards them",
+ description: "grenades fire slower, explode bigger,
and suck everything towards them",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -6572,9 +6576,9 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "standing wave" && (tech.blockDmg || tech.blockingIce)
+ return m.fieldUpgrades[m.fieldMode].name === "standing wave"
},
- requires: "standing wave, bremsstrahlung, triple point",
+ requires: "standing wave",
effect() {
tech.isStandingWaveExpand = true
m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.3) * Math.pow(0.6, (tech.harmonics - 2))
@@ -6623,28 +6627,28 @@ const tech = {
tech.isBlockRadiation = false;
}
},
- {
- name: "triple point",
- description: "deflecting condenses ice IX crystals",
- isFieldTech: true,
- maxCount: 9,
- count: 0,
- frequency: 2,
- frequencyDefault: 2,
- allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
- },
- requires: "standing wave, perfect diamagnetism",
- effect() {
- tech.blockingIce++
- },
- remove() {
- tech.blockingIce = 0;
- }
- },
+ // {
+ // name: "triple point",
+ // description: "deflecting condenses ice IX crystals",
+ // isFieldTech: true,
+ // maxCount: 9,
+ // count: 0,
+ // frequency: 2,
+ // frequencyDefault: 2,
+ // allowed() {
+ // return m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
+ // },
+ // requires: "standing wave, perfect diamagnetism",
+ // effect() {
+ // tech.blockingIce++
+ // },
+ // remove() {
+ // tech.blockingIce = 0;
+ // }
+ // },
{
name: "flux pinning",
- description: "after deflecting a mob
it is stunned for upto 4 seconds",
+ description: "after deflecting a mob
it is stunned for up to 4 seconds",
isFieldTech: true,
maxCount: 9,
count: 0,
@@ -7501,7 +7505,9 @@ const tech = {
return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && (build.isExperimentSelection || powerUps.research.count > 1)
},
requires: "cloaking, pilot wave, or plasma torch",
+ damage: 1.35,
effect() {
+ tech.damage *= this.damage
tech.isCloakingDamage = true
for (let i = 0; i < 2; i++) {
if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
@@ -7509,7 +7515,10 @@ const tech = {
},
remove() {
tech.isCloakingDamage = false
- if (this.count > 0) powerUps.research.changeRerolls(2)
+ if (this.count > 0) {
+ tech.damage /= this.damage
+ powerUps.research.changeRerolls(2)
+ }
}
},
{
@@ -7524,11 +7533,14 @@ const tech = {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler"
},
requires: "cloaking, molecular assembler, plasma torch, pilot wave",
+ damage: 1.35,
effect() {
+ tech.damage *= this.damage
tech.aimDamage = 1.35
b.setFireCD();
},
remove() {
+ if (this.count) tech.damage /= this.damage
tech.aimDamage = 1
b.setFireCD();
}
@@ -7580,25 +7592,25 @@ const tech = {
if (this.count > 0) powerUps.research.changeRerolls(6)
}
},
- {
- name: "Penrose process",
- description: "after a block falls into a wormhole
+50 energy",
- isFieldTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- frequencyDefault: 2,
- allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "wormhole"
- },
- requires: "wormhole",
- effect() {
- tech.isWormholeEnergy = true
- },
- remove() {
- tech.isWormholeEnergy = false
- }
- },
+ // {
+ // name: "Penrose process",
+ // description: "after a block falls into a wormhole
+50 energy",
+ // isFieldTech: true,
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 2,
+ // frequencyDefault: 2,
+ // allowed() {
+ // return m.fieldUpgrades[m.fieldMode].name === "wormhole"
+ // },
+ // requires: "wormhole",
+ // effect() {
+ // tech.isWormholeEnergy = true
+ // },
+ // remove() {
+ // tech.isWormholeEnergy = false
+ // }
+ // },
{
name: "transdimensional worms",
link: `transdimensional worms`,
@@ -10419,7 +10431,7 @@ const tech = {
iceEnergy: null,
isPerfectBrake: null,
explosiveRadius: null,
- isWormholeEnergy: null,
+ // isWormholeEnergy: null,
isWormholeDamage: null,
isNailCrit: null,
isFlechetteExplode: null,
@@ -10497,7 +10509,7 @@ const tech = {
isDroneRespawn: null,
deathSpawns: null,
isMobBlockFling: null,
- blockingIce: null,
+ // blockingIce: null,
isPhaseVelocity: null,
waveBeamSpeed: null,
wavePacketAmplitude: null,
@@ -10565,7 +10577,7 @@ const tech = {
isFreeWormHole: null,
isRewindField: null,
isCrouchRegen: null,
- OccamDamage: null,
+ // OccamDamage: null,
isAxion: null,
isWormholeMapIgnore: null,
isLessDamageReduction: null,
diff --git a/todo.txt b/todo.txt
index d4e352f..18904cb 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,27 +1,33 @@
******************************************************** NEXT PATCH **************************************************
-tech: crystallography - convert all your research into 0.25 coupling per research
-tech: residual dipolar coupling - cancelling field gun or tech gives +0.5 coupling
-tech: fine-structure constant - +6 coupling, eject this tech if you take damage
-coupling for cloaking field now gives +33% ambush damage
- tech: ambush removed
-coupling for time dilation now gives +25% longer time dilation effect
- about +2 seconds
-coupling tech isn't well balanced yet, so give me feedback
+coupling
+ crystallography renamed quintessence
+ wormhole -> energy after eating blocks
+ penrose process is removed
+ perfect diamagnatism and standing wave -> ice IX after blocking
+ tech triple point removed
+ plasma torch -> +damage
-non-unitary operator renamed to Hilbert space
+killing one of the first 3->4 snake body mobs makes snake bosses vulnerable
+shooterBoss shoots 3-6 smaller bullets
bug fixes
*********************************************************** TODO *****************************************************
+coupling
+ negative coupling?
+
coupling tech
- names: strongly coupled, Vibronic coupling, Residual dipolar coupling, NMR coupling
- tech: convert all research into "coupling"
+ names: strongly coupled, Vibronic coupling, Residual dipolar coupling, NMR coupling, quintessence
tech: +x% field coupling, your field changes randomly every y seconds
tech: coupling starts at 200%, but decays when the field is in use, coupling recharges when the field is not in use
some fields aren't used much (that's ok?)
+triple point iceIX needs to spawn in the radius of the field and an arc in the same quadrant as the mob
+
+tech give laser mines more lasers (3->4? 5?)
+
buffing your deflecting for 1 second after pressing the field button sounds cool
2 second cooldown on the effect to prevent spamming it
buff: giving energy or doing damage makes sense
@@ -44,6 +50,9 @@ greatly increase walking speed
for time dilation field
make jumping normal
+junk tech: charged shot
+immediately fire all of your ammo
+
after taking damage explode while invulnerable
scale explosion radius with damage
@@ -903,6 +912,7 @@ possible names for tech
NP-complete
lenticular lens: is an array of lenses, designed so that when viewed from slightly different angles, different parts of the image underneath are shown.
p-zombie
+ p-hacking JUNK tech
plot script: