diff --git a/js/bullet.js b/js/bullet.js
index 25f36a7..139edba 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -281,11 +281,6 @@ const b = {
fireCDscale: 1,
setFireCD() {
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.82, b.inventory.length)
if (tech.isFireMoveLock) b.fireCDscale *= 0.55
diff --git a/js/index.js b/js/index.js
index a77ed0b..1023617 100644
--- a/js/index.js
+++ b/js/index.js
@@ -229,14 +229,13 @@ const build = {
//used for junk estimation
let junkCount = 0
- let totalCount = 0
+ let totalCount = 1 //start at one to avoid NaN issues
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}`
@@ -259,7 +258,7 @@ 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(true): ""}
${botText}
health: (${(m.health*100).toFixed(0)} / ${(m.maxHealth*100).toFixed(0)})
@@ -962,18 +961,18 @@ window.addEventListener("keydown", function(event) {
if (tech.isPauseSwitchField || simulation.testing) {
document.getElementById("pause-field").addEventListener("click", () => {
- const energy = m.energy
+ const energy = m.energy //save current energy
if (m.fieldMode === 4 && simulation.molecularMode < 3) {
simulation.molecularMode++
m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription()
} else {
- m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field
+ m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 0 : m.fieldMode + 1) //cycle to next field
if (m.fieldMode === 4) {
simulation.molecularMode = 0
m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription()
}
}
- m.energy = energy
+ m.energy = energy //return to current energy
document.getElementById("pause-field").innerHTML = `
${m.fieldUpgrades[m.fieldMode].name}
${m.fieldUpgrades[m.fieldMode].description}`
});
}
diff --git a/js/level.js b/js/level.js
index cab2876..5d0fd10 100644
--- a/js/level.js
+++ b/js/level.js
@@ -16,7 +16,7 @@ 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(1 * 4) //30 is near max on hard //60 is near max on why
+ // level.difficultyIncrease(3 * 4) //30 is near max on hard //60 is near max on why
// simulation.isHorizontalFlipped = true
// m.maxHealth = m.health = 100
// tech.isRerollDamage = true
@@ -26,10 +26,9 @@ const level = {
// 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("coupling");
// tech.giveTech("time crystals");
// tech.giveTech("retrocausality")
- // for (let i = 0; i < 1; ++i) tech.giveTech("slow light")
+ // for (let i = 0; i < 5; ++i) tech.giveTech("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")
@@ -38,7 +37,7 @@ const level = {
// spawn.starter(1900, -500, 200)
// spawn.beetleBoss(1900, -400)
- // spawn.timeBoss(1900, -400)
+ // spawn.pulsarBoss(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");
diff --git a/js/mob.js b/js/mob.js
index ff0348b..d5148e3 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -605,7 +605,6 @@ 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 + m.collisionImmuneCycles; //player is immune to damage
}
},
searchSpring() {
diff --git a/js/player.js b/js/player.js
index 6b3f1fa..50b8f9c 100644
--- a/js/player.js
+++ b/js/player.js
@@ -540,7 +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
+ 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)))
@@ -658,6 +658,11 @@ const m = {
},
collisionImmuneCycles: 30,
damage(dmg) {
+ if (tech.isCouplingNoHit) {
+ for (let i = 0, len = tech.tech.length; i < len; i++) {
+ if (tech.tech[i].name === "fine-structure constant") powerUps.ejectTech(i, true)
+ }
+ }
if (tech.isRewindAvoidDeath && m.energy > 0.6 && dmg > 0.01) {
const steps = Math.floor(Math.min(299, 150 * m.energy))
simulation.makeTextLog(`m.rewind(${steps})`)
@@ -1538,28 +1543,62 @@ const m = {
}
},
hold() {},
- couplingDescription() {
+ // 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 other fields`
+ 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`
case 1: //standing wave
- return `+40 max energy per coupling`
+ return `+${40*couple} max energy`
case 2: //perfect diamagnetism
- return `invulnerable +3 seconds post collision per coupling`
+ return `invulnerable +${3*couple} seconds post collision`
case 3: //negative mass
- return `+20% defense per coupling`
+ return `+${27*couple}% defense`
case 4: //assembler
- return `generate 6 energy per second per coupling`
+ return `generate ${6*couple} energy per second`
case 5: //plasma
- return `+50 max health per coupling`
+ return `+${50*couple} max health`
case 6: //time dilation
- return `+20% fire rate per coupling` //movement, jumping, and
+ return `+${25*couple}% longer stopped time` //movement, jumping, and
case 7: //cloaking
- return `+15% damage per coupling`
+ return `+${33*couple}% ambush damage`
case 8: //pilot wave
- return `+40% block collision damage per coupling`
+ return `+${40*couple}% block collision damage`
case 9: //wormhole
- return `+5% duplication per coupling`
+ return `+${4*couple}% duplication`
}
},
couplingChange() {
@@ -1568,7 +1607,6 @@ const m = {
m.setFieldRegen()
mobs.setMobSpawnHealth();
powerUps.setDupChance();
- b.setFireCD();
m.collisionImmuneCycles = 30 + m.coupling * 180
// switch (m.fieldMode) {
// case 0: //field emitter
@@ -2680,17 +2718,13 @@ const m = {
sleep(mob);
sleep(body);
sleep(bullet);
-
simulation.cycle--; //pause all functions that depend on game cycle increasing
}
-
if (tech.isRewindField) {
this.rewindCount = 0
m.grabPowerUpRange2 = 300000
m.hold = function() {
-
m.grabPowerUp();
-
// //grab power ups
// for (let i = 0, len = powerUp.length; i < len; ++i) {
// if (
@@ -2705,15 +2739,13 @@ const m = {
// break; //because the array order is messed up after splice
// }
// }
-
-
if (m.isHolding) {
m.drawHold(m.holdingTarget);
m.holding();
m.throwBlock();
m.wakeCheck();
} else if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
- const drain = 0.002
+ const drain = 0.002 / (1 + 0.25 * m.coupling)
if (m.energy > drain) m.energy -= drain
m.grabPowerUp();
@@ -2790,7 +2822,7 @@ const m = {
m.holding();
m.throwBlock();
} else if (input.field && m.fieldCDcycle < m.cycle) {
- const drain = 0.0026
+ const drain = 0.0026 / (1 + 0.25 * m.coupling)
if (m.energy > drain) m.energy -= drain
m.grabPowerUp();
m.lookForPickUp(); //this drains energy 0.001
diff --git a/js/powerup.js b/js/powerup.js
index 0ad1750..20cea23 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -325,6 +325,10 @@ const powerUps = {
powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), spawnType, false);
}
}
+ if (tech.isCancelCouple) {
+ m.coupling += 0.5
+ m.couplingChange()
+ }
// if (tech.isCancelTech && Math.random() < 0.3) {
// powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "tech", false);
// simulation.makeTextLog(`options exchange: returns 1 tech`)
diff --git a/js/simulation.js b/js/simulation.js
index db62293..d2427b2 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -816,7 +816,6 @@ const simulation = {
m.alive = true;
m.onGround = false
m.lastOnGroundCycle = 0
- m.setMaxHealth()
m.health = 0;
m.addHealth(0.25)
m.drop();
@@ -838,8 +837,8 @@ const simulation = {
//
input.key.field = ["${input.key.field}", "right mouse"]
//
m.field.description = "${m.fieldUpgrades[m.fieldMode].description}"
// `, 800);
-
- m.setField(0)
+ m.coupling = 0
+ m.setField(0) //this calls m.couplingChange(), which sets max health and max energy
// m.energy = 0;
//exit testing
if (simulation.testing) {
diff --git a/js/spawn.js b/js/spawn.js
index a91f1e8..cbdf322 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -743,7 +743,7 @@ const spawn = {
vertexCollision(where, look, body);
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
- if (m.immuneCycle < m.cycle + 60 + tech.collisionImmuneCycles) m.immuneCycle = m.cycle + 60 + tech.collisionImmuneCycles; //player is immune to damage extra time
+ if (m.immuneCycle < m.cycle + 60 + m.collisionImmuneCycles) m.immuneCycle = m.cycle + 60 + m.collisionImmuneCycles; //player is immune to damage extra time
m.damage(dmg);
simulation.drawList.push({ //add dmg to draw queue
x: best.x,
@@ -1639,7 +1639,7 @@ const spawn = {
me.collisionFilter.category = cat.mobBullet;
me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet;
me.onHit = function() {
- this.explode(this.mass * 2);
+ this.explode(this.mass);
};
me.do = function() {
this.gravity();
@@ -3160,7 +3160,7 @@ const spawn = {
// //check damage
// const hitPlayer = Matter.Query.ray([player], this.position, wing, radius)
// if (hitPlayer.length && 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);
// }
@@ -3411,7 +3411,7 @@ const spawn = {
}
//damage player if in range
if (Vector.magnitude(Vector.sub(player.position, this.fireTarget)) < this.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.045 * simulation.dmgScale);
}
simulation.drawList.push({ //add dmg to draw queue
@@ -3532,7 +3532,7 @@ const spawn = {
}
//damage player if in range
if (Vector.magnitude(Vector.sub(player.position, this.fireTarget)) < this.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.03 * simulation.dmgScale);
}
simulation.drawList.push({ //add dmg to draw queue
@@ -3747,7 +3747,7 @@ const spawn = {
vertexCollision(where, look, body);
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
- m.immuneCycle = m.cycle + tech.collisionImmuneCycles + 60; //player is immune to damage for an extra second
+ m.immuneCycle = m.cycle + m.collisionImmuneCycles + 60; //player is immune to damage for an extra second
const dmg = 0.14 * simulation.dmgScale;
m.damage(dmg);
simulation.drawList.push({ //add dmg to draw queue
@@ -3999,7 +3999,7 @@ const spawn = {
vertexCollision(where, look, map);
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
- m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for an extra second
+ m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for an extra second
m.damage(this.swordDamage);
simulation.drawList.push({ //add dmg to draw queue
x: best.x,
@@ -4625,7 +4625,7 @@ const spawn = {
vertexCollision(where, look, map);
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
- m.immuneCycle = m.cycle + tech.collisionImmuneCycles + 60; //player is immune to damage for an extra second
+ m.immuneCycle = m.cycle + m.collisionImmuneCycles + 60; //player is immune to damage for an extra second
m.damage(this.swordDamage);
simulation.drawList.push({ //add dmg to draw queue
x: best.x,
@@ -4749,7 +4749,7 @@ const spawn = {
vertexCollision(where, look, map);
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
- m.immuneCycle = m.cycle + tech.collisionImmuneCycles + 60; //player is immune to damage for an extra second
+ m.immuneCycle = m.cycle + m.collisionImmuneCycles + 60; //player is immune to damage for an extra second
m.damage(this.swordDamage);
simulation.drawList.push({ //add dmg to draw queue
x: best.x,
@@ -5540,7 +5540,7 @@ const spawn = {
me.onDeath = function() {
//damage player if in range
if (Vector.magnitude(Vector.sub(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.015 * simulation.dmgScale);
}
simulation.drawList.push({ //add dmg to draw queue
@@ -6358,7 +6358,7 @@ const spawn = {
Matter.Body.setPosition(this, Vector.add(Vector.add(who.position, who.velocity), Vector.mult(orbit, radius))) //bullets move with player
//damage player
if (Matter.Query.collides(this, [player]).length > 0 && !(m.isCloak && tech.isIntangible) && m.immuneCycle < m.cycle) {
- m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
+ m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for 30 cycles
const dmg = 0.03 * simulation.dmgScale
m.damage(dmg);
simulation.drawList.push({ //add dmg to draw queue
diff --git a/js/tech.js b/js/tech.js
index 46cd82b..5ec8375 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -234,14 +234,14 @@ 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 *= tech.sneakAttackDmg
+ 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
},
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.05 * 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.04 * m.coupling)
},
isScaleMobsWithDuplication: false,
maxDuplicationEvent() {
@@ -2853,8 +2853,8 @@ const tech = {
}
},
{
- name: "non-unitary operator",
- link: `non-unitary operator`,
+ name: "Hilbert space",
+ // link: `non-unitary operator`,
description: "reduce combat difficulty by 2 levels
after a collision enter an alternate reality",
maxCount: 1,
count: 0,
@@ -2886,7 +2886,7 @@ const tech = {
allowed() {
return !tech.isResearchReality && !tech.isCollisionRealitySwitch
},
- requires: "not Ψ(t) collapse, non-unitary",
+ requires: "not Ψ(t) collapse, Hilbert space",
effect() {
tech.isSwitchReality = true;
},
@@ -2905,7 +2905,7 @@ const tech = {
allowed() {
return !tech.isSwitchReality && !tech.isCollisionRealitySwitch && !tech.isJunkResearch
},
- requires: "not many-worlds, non-unitary, pseudoscience",
+ requires: "not many-worlds, Hilbert space, pseudoscience",
bonusResearch: 17,
effect() {
tech.isResearchReality = true;
@@ -3153,9 +3153,9 @@ const tech = {
isBadRandomOption: true,
isNonRefundable: true,
allowed() {
- return tech.isDeterminism && !tech.isAnsatz
+ return tech.isDeterminism && !tech.isAnsatz && !tech.isJunkResearch && !tech.isBrainstorm
},
- requires: "NOT EXPERIMENT MODE, determinism, not ansatz",
+ requires: "determinism, not ansatz, pseudoscience, brainstorming",
effect() {
tech.isSuperDeterminism = true;
//if you change the number spawned also change it in Born rule
@@ -3352,6 +3352,107 @@ const tech = {
tech.isShieldAmmo = false;
}
},
+ {
+ name: "field coupling",
+ descriptionFunction() {
+ return `+1 field coupling (${m.fieldUpgrades[m.fieldMode].name})
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}`
+ },
+ maxCount: 9,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() {
+ return (build.isExperimentSelection || powerUps.research.count > 1)
+ },
+ requires: "",
+ effect() {
+ m.coupling++
+ m.couplingChange()
+ },
+ remove() {
+ m.coupling -= this.count
+ m.couplingChange()
+ }
+ },
+ {
+ name: "crystallography",
+ descriptionFunction() {
+ return `use all your ${powerUps.orb.research(1)} to get +${powerUps.research.count*this.couplingToResearch} coupling
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}`
+ },
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() {
+ return powerUps.research.count > 3
+ },
+ requires: "",
+ researchUsed: 0,
+ couplingToResearch: 0.25,
+ effect() {
+ while (powerUps.research.count > 0) {
+ powerUps.research.changeRerolls(-1)
+ this.researchUsed++
+ m.coupling += this.couplingToResearch
+ }
+ m.couplingChange()
+ },
+ remove() {
+ if (this.count) {
+ m.coupling -= this.researchUsed * this.couplingToResearch
+ powerUps.research.changeRerolls(this.researchUsed)
+ this.researchUsed = 0
+ }
+ m.couplingChange()
+ }
+ },
+ {
+ name: "fine-structure constant",
+ descriptionFunction() {
+ return `+${this.value} coupling, eject this tech after losing health
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}`
+ },
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() {
+ return true
+ },
+ value: 6,
+ requires: "",
+ effect() {
+ tech.isCouplingNoHit = true
+ m.coupling += this.value
+ m.couplingChange()
+ },
+ remove() {
+ if (this.count) {
+ m.coupling -= this.value
+ m.couplingChange()
+ }
+ tech.isCouplingNoHit = false
+ }
+ },
+ {
+ name: "residual dipolar coupling",
+ descriptionFunction() {
+ return `clicking × to cancel yields +0.5 coupling
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}`
+ },
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() {
+ return !tech.isSuperDeterminism
+ },
+ requires: "not superdeterminism",
+ effect() {
+ tech.isCancelCouple = true
+ },
+ remove() {
+ tech.isCancelCouple = false
+ }
+ },
{
name: "options exchange",
link: `options exchange`,
@@ -3391,7 +3492,7 @@ const tech = {
},
{
name: "futures exchange",
- description: "clicking × to cancel a field, tech, or gun
adds 4.5% power up duplication chance",
+ description: "clicking × to cancel a field, tech, or gun
+4.5% power up duplication chance",
maxCount: 1,
count: 0,
frequency: 1,
@@ -6413,41 +6514,6 @@ const tech = {
//************************************************** field
//************************************************** tech
//**************************************************
- {
- name: "coupling",
- descriptionFunction() {
- return `+1 field coupling (${m.fieldUpgrades[m.fieldMode].name})
${ m.couplingDescription()}`
- },
- // isFieldTech: true,
- maxCount: 9,
- count: 0,
- frequency: 1,
- frequencyDefault: 1,
- allowed() {
- return (build.isExperimentSelection || powerUps.research.count > 1)
- },
- requires: "",
- // researchUsed: 0,
- // couplingToResearch: 0.1,
- effect() {
- m.coupling++
- m.couplingChange()
- // while (powerUps.research.count > 0) {
- // powerUps.research.changeRerolls(-1)
- // this.researchUsed++
- // m.coupling += this.couplingToResearch
- // }
- },
- remove() {
- m.coupling -= this.count
- m.couplingChange()
- // if (this.count) {
- // m.coupling -= this.researchUsed * this.couplingToResearch
- // powerUps.research.changeRerolls(this.researchUsed)
- // this.researchUsed = 0
- // }
- }
- },
{
name: "zero point energy",
description: `use ${powerUps.orb.research(2)}
+100 maximum energy`,
@@ -7404,25 +7470,25 @@ const tech = {
tech.isCloakStun = false;
}
},
- {
- name: "ambush",
- description: "metamaterial cloaking field damage effect
is increased from 333% to 555%",
- isFieldTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- frequencyDefault: 2,
- allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
- },
- requires: "metamaterial cloaking",
- effect() {
- tech.sneakAttackDmg = 6.55 //555% + 100%
- },
- remove() {
- tech.sneakAttackDmg = 4.33 //333% + 100%
- }
- },
+ // {
+ // name: "ambush",
+ // description: "metamaterial cloaking field damage effect
is increased from 333% to 555%",
+ // isFieldTech: true,
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 2,
+ // frequencyDefault: 2,
+ // allowed() {
+ // return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
+ // },
+ // requires: "metamaterial cloaking",
+ // effect() {
+ // tech.sneakAttackDmg = 6.55 //555% + 100%
+ // },
+ // remove() {
+ // tech.sneakAttackDmg = 4.33 //333% + 100%
+ // }
+ // },
{
name: "dynamical systems",
description: `use ${powerUps.orb.research(2)}
+35% damage`,
@@ -10546,5 +10612,6 @@ const tech = {
isExtraBotOption: null,
isLastHitDamage: null,
isCloakHealLastHit: null,
- isRicochet: null
+ isRicochet: null,
+ isCancelCouple: null
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 66ce38c..d4e352f 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,28 +1,37 @@
******************************************************** 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
+non-unitary operator renamed to Hilbert space
+
+bug fixes
*********************************************************** TODO *****************************************************
-coupling:
- field emitter balance?
-
coupling tech
- names: fine-structure constant, strongly coupled, Vibronic coupling
+ names: strongly coupled, Vibronic coupling, Residual dipolar coupling, NMR coupling
tech: convert all research into "coupling"
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?)
- Tech: Cancelling a tech/gun/field gives x coupling
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
maybe this could be a rework for bremstralung
-rewindBoss: after hitting 1/5 damage theasholds the boss rewinds back in time to where it was a few seconds ago
+rewindBoss: after hitting 1/5 damage thresholds the boss rewinds back in time to where it was a few seconds ago
track it's data like player history
+make orbitals increase orbital rotation speed after Orbital boss takes damage
+
worms can target player, buff their damage
can't target player in first few seconds?