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?