From b5dd456db07460340e88ff99e2951933a75aaaef Mon Sep 17 00:00:00 2001 From: landgreen Date: Sun, 11 Jul 2021 06:21:16 -0700 Subject: [PATCH] field research tech tech: Noether violation - shotgun and railgun recoil is increased and it's direction is reversed, +60% damage for shot/rail gun each field now has a tech that uses research to give a simple bonus wormhole: virtual particles - 3 research for 19% duplication chance cloaking field, pilot wave: dynamical systems - 2 research for 35% damage standing wave harmonics, pilot wave: zero point energy - 2 research for 74% max energy perfect diamagnetism or negative mass field: tessellation - 50% harm reduction for 4 research cost time dilation field - Lorentz transformation now uses 4 research for a 50% speed increase (was 40% for no research) plasma-bot - now also requires 1 research nano-scale already has several research deals added a research to the intro level Newton's 1st law reduces harm by up to 66% (was 60%) when moving at up to 30 Newton's 2nd law increases damage by up to 66% (was 43%) when moving at up to 30 also they both have no requirements anymore super ball tech supertemporal now fires with much less delay and it syncs with frame rate much cleaner metamaterial cloaking now gets the damage buff after 3 seconds of no kills (was 4s) recloaks 1/2 second faster cloaked vision has a 10% larger radius 6 situational tech can now show up in situations where they are only "OK", but not "great" choices --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 97 +++++++------ js/level.js | 17 +-- js/mob.js | 4 +- js/player.js | 133 ++++++++--------- js/spawn.js | 4 +- js/tech.js | 398 ++++++++++++++++++++++++++++++++------------------- todo.txt | 36 ++++- 8 files changed, 416 insertions(+), 273 deletions(-) diff --git a/.DS_Store b/.DS_Store index 1f2ebdbd23e7402e1f32a59058285b1e1aa44bc1..af8396edf422cdfb0b03ba851b5108f318f11406 100644 GIT binary patch delta 21 ccmZoMXffEJ#msb|f3gm { - if (!simulation.paused) { - const me = bullet.length; - bullet[me] = Bodies.polygon(x, y, 12, 11 * tech.bulletSize, b.fireAttributes(dir, false)); - World.add(engine.world, bullet[me]); //add bullet to world - Matter.Body.setVelocity(bullet[me], { - x: SPEED * Math.cos(dir), - y: SPEED * Math.sin(dir) - }); - bullet[me].endCycle = simulation.cycle + Math.floor(330 * tech.isBulletsLastLonger); - bullet[me].minDmgSpeed = 0; - bullet[me].restitution = 0.99; - bullet[me].friction = 0; - bullet[me].do = function() { - this.force.y += this.mass * 0.001; - }; - bullet[me].beforeDmg = function() { - if (tech.isIncendiary) { - b.explosion(this.position, this.mass * 350 + 60 * Math.random()); //makes bullet do explosive damage at end - this.endCycle = 0 - } - }; - m.fireCDcycle = m.cycle + delay; // cool down + const fireBall = () => { + const me = bullet.length; + bullet[me] = Bodies.polygon(x, y, 12, 11 * tech.bulletSize, b.fireAttributes(dir, false)); + World.add(engine.world, bullet[me]); //add bullet to world + Matter.Body.setVelocity(bullet[me], { + x: SPEED * Math.cos(dir), + y: SPEED * Math.sin(dir) + }); + bullet[me].endCycle = simulation.cycle + Math.floor(330 * tech.isBulletsLastLonger); + bullet[me].minDmgSpeed = 0; + bullet[me].restitution = 0.99; + bullet[me].friction = 0; + bullet[me].do = function() { + this.force.y += this.mass * 0.001; + }; + bullet[me].beforeDmg = function() { + if (tech.isIncendiary) { + b.explosion(this.position, this.mass * 350 + 60 * Math.random()); //makes bullet do explosive damage at end + this.endCycle = 0 } - }, 50 * i + 100); + }; + m.fireCDcycle = m.cycle + delay; // cool down } + + function cycle() { + if (simulation.paused || m.isBodiesAsleep) { requestAnimationFrame(cycle) } else { + count++ + if (count % 2) fireBall() + if (count < tech.superBallNumber * 2 && m.alive) requestAnimationFrame(cycle); + } + } + let count = 0 + requestAnimationFrame(cycle); + // fireBall(); }, chooseFireMethod() { //set in simulation.startGame if (tech.oneSuperBall) { @@ -4702,7 +4715,7 @@ const b = { }); //knock back - const KNOCK = m.crouch ? 0.08 : 0.34 + const KNOCK = (m.crouch ? 0.08 : 0.34) * (tech.isShotgunReversed ? -2 : 1) player.force.x -= KNOCK * Math.cos(m.angle) player.force.y -= KNOCK * Math.sin(m.angle) * 0.35 //reduce knock back in vertical direction to stop super jumps @@ -4714,9 +4727,6 @@ const b = { const me = bullet.length; bullet[me] = Bodies.rectangle(0, 0, 0.015, 0.0015, { density: 0.008, //0.001 is normal - //frictionAir: 0.01, //restitution: 0, - // angle: 0, - // friction: 0.5, restitution: 0, frictionAir: 0, dmg: 0, //damage done in addition to the damage from momentum @@ -4738,7 +4748,6 @@ const b = { x: -0.5 * this.velocity.x, y: -0.5 * this.velocity.y }); - // Matter.Body.setDensity(this, 0.001); } if (tech.fragments && this.speed > 10) { b.targetedNail(this.position, tech.fragments * 20) @@ -4781,7 +4790,7 @@ const b = { }); //knock back - const KNOCK = ((m.crouch) ? 0.1 : 0.5) * this.charge * this.charge + const KNOCK = ((m.crouch) ? 0.1 : 0.5) * this.charge * this.charge * (tech.isShotgunReversed ? -2 : 1) player.force.x -= KNOCK * Math.cos(m.angle) player.force.y -= KNOCK * Math.sin(m.angle) * 0.35 //reduce knock back in vertical direction to stop super jumps pushAway(1200 * this.charge) diff --git a/js/level.js b/js/level.js index 22e8661..813aaaa 100644 --- a/js/level.js +++ b/js/level.js @@ -15,8 +15,10 @@ const level = { // level.difficultyIncrease(30) // simulation.isHorizontalFlipped = true // m.setField("wormhole") - // b.giveGuns("laser") - // tech.giveTech("laser diode") + // b.giveGuns("shotgun") + // tech.isShotgunRecoil = true + // tech.isShotgunReversed = true + // tech.giveTech("supertemporal") // tech.giveTech("free-electron laser") // for (let i = 0; i < 9; i++) tech.giveTech("spherical harmonics") // tech.giveTech("decoherence") @@ -2265,7 +2267,7 @@ const level = { // spawn.laser(1200, -500) // spawn.shield(mob[mob.length - 1], 1800, -120, 1); - spawn.nodeGroup(1200, -500, "grenadier") + // spawn.nodeGroup(1200, -500, "grenadier") // spawn.snakeBoss(1200, -500) // spawn.suckerBoss(2900, -500) // spawn.randomMob(1600, -500) @@ -2616,10 +2618,9 @@ const level = { // localSettings.levelsClearedLastGame = 20 if (level.levelsCleared === 0) { - // powerUps.spawn(-100, 0, "heal", false); //starting gun - powerUps.spawn(1900, -150, "heal", false); //starting gun - powerUps.spawn(2050, -150, "heal", false); //starting gun - // powerUps.spawn(2050, -150, "field", false); //starting gun + powerUps.spawn(2500, -50, "research", false); + powerUps.spawn(1900, -50, "heal", false); + powerUps.spawn(2050, -50, "heal", false); if (localSettings.levelsClearedLastGame < 6) { if (!simulation.isCheating && !m.isShipMode) { spawn.wireFoot(); @@ -2632,7 +2633,7 @@ const level = { simulation.trails() } } - powerUps.spawnStartingPowerUps(2300, -150); + powerUps.spawnStartingPowerUps(2300, -50); }, testChamber() { level.setPosToSpawn(0, -50); //lower start diff --git a/js/mob.js b/js/mob.js index 7d4d598..58acfa0 100644 --- a/js/mob.js +++ b/js/mob.js @@ -1074,12 +1074,12 @@ const mobs = { } if (tech.isBotSpawnerReset) { for (let i = 0, len = bullet.length; i < len; i++) { - if (bullet[i].botType && bullet[i].endCycle !== Infinity) bullet[i].endCycle = simulation.cycle + 660 //10 seconds and 1 extra second for fun + if (bullet[i].botType && bullet[i].endCycle !== Infinity) bullet[i].endCycle = simulation.cycle + 840 //14 seconds } } if (Math.random() < tech.botSpawner) { b.randomBot(this.position, false) - bullet[bullet.length - 1].endCycle = simulation.cycle + 660 //10 seconds and 1 extra second for fun + bullet[bullet.length - 1].endCycle = simulation.cycle + 840 //14 seconds this.leaveBody = false; // no body since it turned into the bot } } else if (tech.isShieldAmmo && this.shield && !this.isExtraShield) { diff --git a/js/player.js b/js/player.js index 9a84530..df0d6a7 100644 --- a/js/player.js +++ b/js/player.js @@ -75,8 +75,8 @@ const m = { Fx: 0.016, //run Force on ground // jumpForce: 0.42, setMovement() { - m.Fx = 0.016 * tech.squirrelFx * tech.fastTime; - m.jumpForce = 0.42 * tech.squirrelJump * tech.fastTimeJump; + m.Fx = 0.016 * tech.squirrelFx * (tech.isFastTime ? 1.5 : 1); + m.jumpForce = 0.42 * tech.squirrelJump * (tech.isFastTime ? 1.13 : 1) }, FxAir: 0.016, // 0.4/5/5 run Force in Air yOff: 70, @@ -490,19 +490,20 @@ const m = { harmReduction() { let dmg = 1 dmg *= m.fieldHarmReduction + if (tech.isFieldHarmReduction) dmg *= 0.5 if (tech.isHarmMACHO) dmg *= 0.33 if (tech.isImmortal) dmg *= 0.66 if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.33 : 1.15 if (tech.healthDrain) dmg *= 1 + 2.667 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage if (tech.isBlockHarm && m.isHolding) dmg *= 0.15 - if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.019, 0.60) + if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.022, 0.66) if (tech.isSlowFPS) dmg *= 0.8 // if (tech.isPiezo) dmg *= 0.85 if (tech.isHarmReduce && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.4 if (tech.isBotArmor) dmg *= 0.93 ** b.totalBots() if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; - if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.34 + 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.55; if (tech.isEntanglement && b.inventory[0] === b.activeGun) { @@ -512,7 +513,7 @@ const m = { }, rewind(steps) { // m.rewind(Math.floor(Math.min(599, 137 * m.energy))) if (tech.isRewindGrenade) { - const immunityCycle = m.cycle + 60 + const immunityCycle = m.cycle + 90 if (m.immuneCycle < immunityCycle) m.immuneCycle = immunityCycle; //player is immune to damage until after grenades might explode... for (let i = 1, len = Math.floor(2 + steps / 40); i < len; i++) { @@ -605,7 +606,7 @@ const m = { simulation.fpsInterval = 1000 / simulation.fpsCap; m.defaultFPSCycle = m.cycle if (tech.isRewindBot) { - const len = steps * 0.052 * tech.isRewindBot + const len = steps * 0.07 * tech.isRewindBot const botStep = Math.floor(steps / len) for (let i = 0; i < len; i++) { const where = m.history[Math.abs(m.cycle - i * botStep) % 600].position //spread out spawn locations along past history @@ -975,7 +976,7 @@ const m = { } }, setMaxEnergy() { - m.maxEnergy = (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus + m.maxEnergy = (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus + tech.harmonicEnergy simulation.makeTextLog(`m.maxEnergy = ${(m.maxEnergy.toFixed(2))}`) }, fieldMeterColor: "#0cf", @@ -1655,60 +1656,6 @@ const m = { } } }, - { - name: "nano-scale manufacturing", - description: "excess energy used to build drones
use energy to deflect mobs
double your default energy regeneration", - effect: () => { - // m.fieldMeterColor = "#0c5" - // m.eyeFillColor = m.fieldMeterColor - m.hold = function() { - if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 150 && (m.cycle % 2)) { - if (tech.isSporeField) { - for (let i = 0, len = Math.random() * 20; i < len; i++) { - m.energy -= 0.08 - if (m.energy > 0) { - b.spore(m.pos) - } else { - m.energy = 0.001 - break; - } - } - } else if (tech.isMissileField) { - m.energy -= 0.3; - b.missile({ x: m.pos.x, y: m.pos.y - 40 }, -Math.PI / 2 + 0.5 * (Math.random() - 0.5), 0, 1) - } else if (tech.isIceField) { - m.energy -= 0.04; - b.iceIX(1) - } else if (tech.isDroneRadioactive) { - m.energy -= 1.5; //almost 5x drain of normal drones - b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 25) - } else { - m.energy -= 0.45 * tech.droneEnergyReduction; - b.drone() - } - } - - if (m.isHolding) { - m.drawHold(m.holdingTarget); - m.holding(); - m.throwBlock(); - } else if ((input.field && m.fieldCDcycle < m.cycle)) { //not hold but field button is pressed - m.grabPowerUp(); - m.lookForPickUp(); - if (m.energy > 0.05) { - m.drawField(); - m.pushMobsFacing(); - } - } else if (m.holdingTarget && m.fieldCDcycle < m.cycle) { //holding, but field button is released - m.pickUp(); - } else { - m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) - } - m.energy += m.fieldRegen; - m.drawFieldMeter() - } - } - }, { name: "negative mass field", description: "use energy to nullify  gravity
reduce harm by 55%
blocks held by the field have a lower mass", @@ -1859,6 +1806,60 @@ const m = { } } }, + { + name: "nano-scale manufacturing", + description: "excess energy used to build drones
use energy to deflect mobs
double your default energy regeneration", + effect: () => { + // m.fieldMeterColor = "#0c5" + // m.eyeFillColor = m.fieldMeterColor + m.hold = function() { + if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 150 && (m.cycle % 2)) { + if (tech.isSporeField) { + for (let i = 0, len = Math.random() * 20; i < len; i++) { + m.energy -= 0.08 + if (m.energy > 0) { + b.spore(m.pos) + } else { + m.energy = 0.001 + break; + } + } + } else if (tech.isMissileField) { + m.energy -= 0.3; + b.missile({ x: m.pos.x, y: m.pos.y - 40 }, -Math.PI / 2 + 0.5 * (Math.random() - 0.5), 0, 1) + } else if (tech.isIceField) { + m.energy -= 0.04; + b.iceIX(1) + } else if (tech.isDroneRadioactive) { + m.energy -= 1.5; //almost 5x drain of normal drones + b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 25) + } else { + m.energy -= 0.45 * tech.droneEnergyReduction; + b.drone() + } + } + + if (m.isHolding) { + m.drawHold(m.holdingTarget); + m.holding(); + m.throwBlock(); + } else if ((input.field && m.fieldCDcycle < m.cycle)) { //not hold but field button is pressed + m.grabPowerUp(); + m.lookForPickUp(); + if (m.energy > 0.05) { + m.drawField(); + m.pushMobsFacing(); + } + } else if (m.holdingTarget && m.fieldCDcycle < m.cycle) { //holding, but field button is released + m.pickUp(); + } else { + m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) + } + m.energy += m.fieldRegen; + m.drawFieldMeter() + } + } + }, { name: "plasma torch", description: "use energy to emit short range plasma
damages and pushes mobs away", @@ -2020,7 +2021,7 @@ const m = { }, { name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency" - description: "when not firing activate a cloaking effect
if a mob has not died in the last 4 seconds
increase damage by 300%", + description: "when not firing activate a cloaking effect
if a mob has not died in the last 3 seconds
increase damage by 300%", effect: () => { m.fieldFire = true; m.fieldMeterColor = "#333"; @@ -2031,7 +2032,7 @@ const m = { // m.fieldDamage = 2.46 // 1 + 146/100 m.fieldDrawRadius = 0 m.isSneakAttack = true; - const drawRadius = 1000 + const drawRadius = 1100 m.hold = function() { if (m.isHolding) { @@ -2047,9 +2048,9 @@ const m = { m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) } - //120 cycles after shooting (or using field) enable cloak + //shooting (or using field) enable cloak if (m.energy < 0.05 && m.fireCDcycle < m.cycle && !input.fire) m.fireCDcycle = m.cycle - if (m.fireCDcycle + 50 < m.cycle && !input.fire) { //automatically cloak if not firing + if (m.fireCDcycle + 30 < m.cycle && !input.fire) { //automatically cloak if not firing if (!m.isCloak) { m.isCloak = true //enter cloak if (tech.isIntangible) { @@ -2161,7 +2162,7 @@ const m = { } //show sneak attack status - if (m.cycle > m.lastKillCycle + 300) { + if (m.cycle > m.lastKillCycle + 240) { ctx.strokeStyle = "rgba(0,0,0,0.4)" //m.fieldMeterColor; //"rgba(255,255,0,0.2)" //ctx.strokeStyle = `rgba(0,0,255,${0.5+0.5*Math.random()})` ctx.beginPath(); ctx.arc(m.pos.x, m.pos.y, 28, 0, 2 * Math.PI); diff --git a/js/spawn.js b/js/spawn.js index c3412de..0ab5db1 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -92,8 +92,8 @@ const spawn = { if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) { spawn.randomLevelBoss(x, y); } else if (tech.isResearchBoss) { - if (powerUps.research.count > 4) { - powerUps.research.changeRerolls(-5) + if (powerUps.research.count > 3) { + powerUps.research.changeRerolls(-4) simulation.makeTextLog(`m.research -= 5
${powerUps.research.count}`) } else { tech.addJunkTechToPool(49) diff --git a/js/tech.js b/js/tech.js index e0fe69f..ccf0d07 100644 --- a/js/tech.js +++ b/js/tech.js @@ -151,6 +151,7 @@ }, damageFromTech() { let dmg = 1 //m.fieldDamage + if (tech.isCloakingDamage) dmg *= 1.35 if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.45 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599 if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 2 : 0.66 @@ -160,23 +161,23 @@ if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5 if (tech.isMaxEnergyTech) dmg *= 1.5 if (tech.isEnergyNoAmmo) dmg *= 1.6 - if (tech.isDamageForGuns) dmg *= 1 + 0.12 * b.inventory.length + if (tech.isDamageForGuns) dmg *= 1 + 0.13 * b.inventory.length if (tech.isLowHealthDmg) dmg *= 1 + 0.5 * Math.max(0, 1 - m.health) if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3; if (tech.isEnergyLoss) dmg *= 1.55; if (tech.isAcidDmg && m.health > 1) dmg *= 1.35; if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage if (tech.isEnergyDamage) dmg *= 1 + m.energy / 9; - if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038 + if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.005 if (tech.isRerollDamage) dmg *= 1 + 0.042 * powerUps.research.count if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.3 - if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 1.9 - if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.43, player.speed * 0.015) + if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2 + if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.022) if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots() return dmg * tech.slowFire * tech.aimDamage }, duplicationChance() { - return (tech.isPowerUpsVanish ? 0.2 : 0) + (tech.isStimulatedEmission ? 0.22 : 0) + tech.cancelCount * 0.05 + tech.duplicateChance + m.duplicateChance + return (tech.isPowerUpsVanish ? 0.2 : 0) + (tech.isStimulatedEmission ? 0.22 : 0) + tech.cancelCount * 0.05 + tech.duplicateChance + m.duplicateChance + tech.wormDuplicate }, maxDuplicationEvent() { if (tech.is100Duplicate && tech.duplicationChance() > 0.99) { @@ -247,15 +248,15 @@ }, { name: "arsenal", - description: "increase damage by 12%
for each gun in your inventory", + description: "increase damage by 13%
for each gun in your inventory", maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return b.inventory.length > 1 + return b.inventory.length > 0 }, - requires: "at least 2 guns", + requires: "at least 1 gun", effect() { tech.isDamageForGuns = true; }, @@ -265,15 +266,15 @@ }, { name: "active cooling", - description: "14% decreased delay after firing
for each gun in your inventory", + description: "15% decreased delay after firing
for each gun in your inventory", maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return b.inventory.length > 1 + return b.inventory.length > 0 }, - requires: "at least 2 guns", + requires: "at least 1 gun", effect() { tech.isFireRateForGuns = true; b.setFireCD(); @@ -517,15 +518,15 @@ }, { name: "Newton's 1st law", - description: "moving at high speeds reduces harm
by up to 60%", + description: "moving at high speeds reduces harm
by up to 66%", maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { - return m.Fx > 0.016 && !tech.isEnergyHealth + return !tech.isEnergyHealth }, - requires: "speed increase, not mass-energy equivalence", + requires: "not mass-energy equivalence", effect() { tech.isSpeedHarm = true }, @@ -535,15 +536,15 @@ }, { name: "Newton's 2nd law", - description: "moving at high speeds increases damage
by up to 43%", + description: "moving at high speeds increases damage
by up to 66%", maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { - return m.Fx > 0.016 + return true }, - requires: "speed increase", + requires: "", effect() { tech.isSpeedDamage = true }, @@ -646,15 +647,15 @@ }, { name: "microstates", - description: "increase damage by 4%
for every 10 active bullets", + description: "increase damage by 6%
for every 10 active bullets", maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return tech.isBulletsLastLonger > 1 + return true }, - requires: "anti-shear topology", + requires: "", effect() { tech.isDamageFromBulletCount = true }, @@ -964,15 +965,15 @@ }, { name: "decorrelation", - description: "reduce harm by 66% after not activating
your gun or field for 2 seconds", + description: "reduce harm by 70% after not activating
your gun or field for 2 seconds", maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { - return ((m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" && (tech.blockingIce !== 0 || tech.blockDmg !== 0)) || b.totalBots() > 1 || tech.haveGunCheck("mine") || tech.haveGunCheck("spores") || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing") && !tech.isEnergyHealth + return !tech.isEnergyHealth //((m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" && (tech.blockingIce !== 0 || tech.blockDmg !== 0)) || b.totalBots() > 1 || tech.haveGunCheck("mine") || tech.haveGunCheck("spores") || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing") && }, - requires: "drones, spores, mines, or bots, ", + requires: "not mass-energy", effect() { tech.isNoFireDefense = true }, @@ -982,7 +983,7 @@ }, { name: "anticorrelation", - description: "increase damage by 90%
after not using your gun or field for 2 seconds", + description: "increase damage by 100%
after not using your gun or field for 2 seconds", maxCount: 1, count: 0, frequency: 2, @@ -1000,7 +1001,7 @@ }, { name: "scrap bots", - description: "33% chance after killing a mob to build
a scrap bot that operates for 10 seconds", + description: "33% chance after killing a mob to build
a scrap bot that operates for 14 seconds", maxCount: 3, count: 0, frequency: 1, @@ -1018,7 +1019,7 @@ }, { name: "scrap refit", - description: "killing a mob resets your functional scrap bots
to 10 seconds of operation", + description: "killing a mob resets your functional scrap bots
to 14 seconds of operation", maxCount: 1, count: 0, frequency: 1, @@ -1257,7 +1258,7 @@ }, { name: "orbital-bot upgrade", - description: "convert all your bots to orbital-bots
increase damage by 200% and radius by 40%", + description: "convert all your bots to orbital-bots
increase damage by 250% and radius by 40%", maxCount: 1, count: 0, frequency: 2, @@ -2129,7 +2130,7 @@ }, { name: "inductive coupling", - description: "each unused power up at the end of a level
adds 3 max energy", // (up to 51 health per level)", + description: "each unused power up at the end of a level
adds 3 maximum energy", // (up to 51 health per level)", maxCount: 1, count: 0, frequency: 1, @@ -2354,7 +2355,7 @@ }, { name: "dormancy", - description: "if a mob has died in the last 5 seconds
increase damage by 100% else decrease it by 33%", + description: "if a mob has died in the last 5 seconds
increase damage by 99% else decrease it by 33%", maxCount: 1, count: 0, frequency: 2, @@ -2852,15 +2853,15 @@ }, { name: "abiogenesis", - description: "at the start of a level spawn a 2nd boss for
5 research or +49 JUNK to the tech pool", + description: "at the start of a level spawn a 2nd boss for
4 research or +49 JUNK to the tech pool", maxCount: 1, count: 0, - frequency: 1, - frequencyDefault: 1, + frequency: 2, + frequencyDefault: 2, allowed() { - return (build.isExperimentSelection || powerUps.research.count > 4) && !tech.isDuplicateBoss + return (build.isExperimentSelection || powerUps.research.count > 3) && !tech.isDuplicateBoss }, - requires: "at least 5 research and not parthenogenesis", + requires: "at least 4 research and not parthenogenesis", effect() { tech.isResearchBoss = true; //abiogenesis }, @@ -3754,16 +3755,16 @@ }, { name: "Newton's 3rd law", - description: "shotgun recoil is greatly increased
and has a 66% decreased delay after firing", + description: "shotgun recoil is increased
decrease shotgun delay after firing by 66%", isGunTech: true, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("shotgun") + return tech.haveGunCheck("shotgun") && !tech.isShotgunReversed }, - requires: "shotgun", + requires: "shotgun, not Noether violation", effect() { tech.isShotgunRecoil = true; }, @@ -3771,6 +3772,25 @@ tech.isShotgunRecoil = false; } }, + { + name: "Noether violation", + description: "increase shotgun and rail gun damage 60%
their recoil is increased and reversed", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return (tech.haveGunCheck("shotgun") || tech.haveGunCheck("rail gun")) && !tech.isShotgunRecoil + }, + requires: "shotgun or rail gun, not Newton's 3rd law", + effect() { + tech.isShotgunReversed = true; + }, + remove() { + tech.isShotgunReversed = false; + } + }, { name: "super duper", description: "fire 1 additional super ball", @@ -4887,7 +4907,30 @@ //************************************************** field //************************************************** tech //************************************************** - + { + name: "zero point energy", + description: "use 2 research to
increase your maximum energy by 74", + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return (m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && (build.isExperimentSelection || powerUps.research.count > 1) + }, + requires: "standing wave harmonics or pilot wave", + effect() { + tech.harmonicEnergy = 0.74 + m.setMaxEnergy() + for (let i = 0; i < 2; i++) { + if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) + } + }, + remove() { + tech.harmonicEnergy = 0; + m.setMaxEnergy() + } + }, { name: "spherical harmonics", description: "standing wave oscillates in a 3rd dimension
increasing deflecting efficiency by 40%", @@ -5008,6 +5051,104 @@ tech.isPerfectBrake = false; } }, + { + name: "tessellation", + description: "use 4 research
reduce harm by 50%", + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return (m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "negative mass field") && (build.isExperimentSelection || powerUps.research.count > 3) + }, + requires: "perfect diamagnetism or negative mass field", + effect() { + tech.isFieldHarmReduction = true + for (let i = 0; i < 4; i++) { + if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) + } + }, + remove() { + tech.isFieldHarmReduction = false + } + }, + { + name: "degenerate matter", + description: "reduce harm by 60% while your field is active", + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field") && !tech.isEnergyHealth + }, + requires: "field: perfect, negative mass, pilot wave, plasma, not mass-energy", + effect() { + tech.isHarmReduce = true + }, + remove() { + tech.isHarmReduce = false; + } + }, + { + name: "annihilation", + description: "touching normal mobs annihilates them
but drains 33% of your maximum energy", + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return m.fieldUpgrades[m.fieldMode].name === "negative mass field" + }, + requires: "negative mass field", + effect() { + tech.isAnnihilation = true + }, + remove() { + tech.isAnnihilation = false; + } + }, + { + name: "inertial mass", + description: "negative mass field is larger and faster
blocks also move horizontally with the field", + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return m.fieldUpgrades[m.fieldMode].name === "negative mass field" + }, + requires: "negative mass field", + effect() { + tech.isFlyFaster = true + }, + remove() { + tech.isFlyFaster = false; + } + }, + { + name: "Bose Einstein condensate", + description: "mobs inside your field are frozen
pilot wave, negative mass, time dilation", + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "time dilation" + }, + requires: "pilot wave, negative mass field, time dilation", + effect() { + tech.isFreezeMobs = true + }, + remove() { + tech.isFreezeMobs = false + } + }, { name: "bot manufacturing", description: "use nano-scale manufacturing and 2 research
to build 3 random bots", @@ -5203,82 +5344,6 @@ tech.isMassEnergy = false; } }, - { - name: "degenerate matter", - description: "reduce harm by 60% while your field is active", - isFieldTech: true, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field") && !tech.isEnergyHealth - }, - requires: "field: perfect, negative mass, pilot wave, plasma, not mass-energy", - effect() { - tech.isHarmReduce = true - }, - remove() { - tech.isHarmReduce = false; - } - }, - { - name: "annihilation", - description: "touching normal mobs annihilates them
but drains 33% of your maximum energy", - isFieldTech: true, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return m.fieldUpgrades[m.fieldMode].name === "negative mass field" - }, - requires: "negative mass field", - effect() { - tech.isAnnihilation = true - }, - remove() { - tech.isAnnihilation = false; - } - }, - { - name: "inertial mass", - description: "negative mass field is larger and faster
blocks also move horizontally with the field", - isFieldTech: true, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return m.fieldUpgrades[m.fieldMode].name === "negative mass field" - }, - requires: "negative mass field", - effect() { - tech.isFlyFaster = true - }, - remove() { - tech.isFlyFaster = false; - } - }, - { - name: "Bose Einstein condensate", - description: "mobs inside your field are frozen
pilot wave, negative mass, time dilation", - isFieldTech: true, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "time dilation" - }, - requires: "pilot wave, negative mass field, time dilation", - effect() { - tech.isFreezeMobs = true - }, - remove() { - tech.isFreezeMobs = false - } - }, // { // name: "thermal reservoir", // description: "increase your plasma damage by 100%
plasma temporarily lowers health not energy", @@ -5299,7 +5364,7 @@ // }, { name: "plasma-bot", - description: "a bot uses energy to emit plasma
that damages and pushes mobs", + description: "use 1 research to build a bot
that uses energy to emit plasma", isFieldTech: true, maxCount: 1, count: 0, @@ -5307,12 +5372,15 @@ isBot: true, isBotTech: true, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "plasma torch" + return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && (build.isExperimentSelection || powerUps.research.count > 0) }, requires: "plasma torch", effect() { tech.plasmaBotCount++; b.plasmaBot(); + for (let i = 0; i < 1; i++) { + if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) + } }, remove() { tech.plasmaBotCount = 0; @@ -5400,25 +5468,26 @@ }, { name: "Lorentz transformation", - description: "permanently increase your relative time rate
move, jump, and shoot 40% faster", + description: "use 3 research to increase your time rate
move, jump, and shoot 50% faster", isFieldTech: true, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "time dilation" + return m.fieldUpgrades[m.fieldMode].name === "time dilation" && (build.isExperimentSelection || powerUps.research.count > 2) }, requires: "time dilation", effect() { - tech.fastTime = 1.40; - tech.fastTimeJump = 1.11; + tech.isFastTime = true m.setMovement(); b.setFireCD(); + for (let i = 0; i < 3; i++) { + if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) + } }, remove() { - tech.fastTime = 1; - tech.fastTimeJump = 1; + tech.isFastTime = false m.setMovement(); b.setFireCD(); } @@ -5482,24 +5551,28 @@ tech.isCloakStun = false; } }, - // { - // name: "combinatorial optimization", - // description: "increase damage by 66%
if a mob has not died in the last 5 seconds", - // isFieldTech: true, - // maxCount: 1, - // count: 0, - // frequency: 2, - // allowed() { - // return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" - // }, - // requires: "metamaterial cloaking or pilot wave", - // effect() { - // tech.isSneakAttack = true; - // }, - // remove() { - // tech.isSneakAttack = false; - // } - // }, + { + name: "dynamical systems", + description: "use 1 research
increase your damage by 35%", + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return (m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && (build.isExperimentSelection || powerUps.research.count > 0) + }, + requires: "metamaterial cloaking or pilot wave", + effect() { + tech.isCloakingDamage = true + for (let i = 0; i < 1; i++) { + if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) + } + }, + remove() { + tech.isCloakingDamage = false + } + }, { name: "discrete optimization", description: "increase damage by 50%
50% increased delay after firing", @@ -5578,6 +5651,30 @@ tech.isWormholeDamage = false } }, + { + name: "virtual particles", + description: "use 3 research to exploit your wormhole for
19% chance to duplicate spawned power ups", + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return m.fieldUpgrades[m.fieldMode].name === "wormhole" && (build.isExperimentSelection || powerUps.research.count > 2) + }, + requires: "wormhole", + effect() { + tech.wormDuplicate = 0.19 + powerUps.setDo(); //needed after adjusting duplication chance + for (let i = 0; i < 3; i++) { + if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) + } + }, + remove() { + tech.wormDuplicate = 0 + powerUps.setDo(); //needed after adjusting duplication chance + } + }, { name: "Penrose process", description: "after a block falls into a wormhole
you gain 63 energy", @@ -7208,7 +7305,6 @@ slowFire: null, fastTime: null, squirrelJump: null, - fastTimeJump: null, isFastRadiation: null, isExtraMaxEnergy: null, isAmmoForGun: null, @@ -7365,5 +7461,11 @@ junkResearchNumber: null, laserColor: null, laserColorAlpha: null, - isLongitudinal: null + isLongitudinal: null, + isShotgunReversed: null, + wormDuplicate: null, + isCloakingDamage: null, + harmonicEnergy: null, + isFieldHarmReduction: null, + isFastTime: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index d30c193..3a83850 100644 --- a/todo.txt +++ b/todo.txt @@ -1,8 +1,41 @@ ******************************************************** NEXT PATCH ******************************************************** +tech: Noether violation - shotgun and railgun recoil is increased and it's direction is reversed, +60% damage for shot/rail gun + +each field now has a tech that uses research to give a simple bonus + wormhole: virtual particles - 3 research for 19% duplication chance + cloaking field, pilot wave: dynamical systems - 2 research for 35% damage + standing wave harmonics, pilot wave: zero point energy - 2 research for 74% max energy + perfect diamagnetism or negative mass field: tessellation - 50% harm reduction for 4 research cost + time dilation field - Lorentz transformation now uses 4 research for a 50% speed increase (was 40% for no research) + plasma-bot - now also requires 1 research + nano-scale already has several research deals + +added a research to the intro level +Newton's 1st law reduces harm by up to 66% (was 60%) when moving at up to 30 +Newton's 2nd law increases damage by up to 66% (was 43%) when moving at up to 30 + also they both have no requirements anymore +super ball tech supertemporal now fires with much less delay + and it syncs with frame rate much cleaner +metamaterial cloaking + now gets the damage buff after 3 seconds of no kills (was 4s) + recloaks 1/2 second faster + cloaked vision has a 10% larger radius +6 situational tech can now show up in situations where they are only "OK", but not "great" choices ******************************************************** TODO ******************************************************** +undo the research lost when you refund researched tech??? + this only really matters for many worlds type runs, would yield an general research drain? + +consider executables: + press F to do things + ideas: + +at the start of the null level use speech API to say something short, + if the on end event runs set the lore.isVoiceWorking flag to be true + if lore.isVoiceWorking is false, skip voice and just move through each sentence with a short delay + make the player get a buff after using wormhole while energy lasts: drain energy and give damage buff @@ -321,16 +354,13 @@ possible names for tech stochastic optimization electrostatic discharge Gödel's incompleteness - dynamical systems quantum zeno effect (perturbation of a system prevents some systems from evolving because it scrambles coherence) (apply to lasers, fields) counterfactual - something false axion - maybe a 3rd dark matter type tech Pigeonhole principle - if there are several things that are matched up regression to the mean - tessellation = tiling of a flat surface is the covering of a plane using one or more geometric shapes, called tiles, with no overlaps and no gaps. phlogiston theory is a superseded scientific theory that postulated the existence of a fire-like element called phlogiston Laplace's demon was a notable published articulation of causal determinism on a scientific basis by Pierre-Simon Laplace in 1814.[1] According to determinism, if someone (the demon) knows the precise location and momentum of every atom in the universe, their past and future values for any given time are entailed; they can be calculated from the laws of classical mechanics. - Degenerate matter is a highly dense state of fermionic matter in which the Pauli exclusion principle exerts significant pressure in addition to, or in lieu of thermal pressure. evolutionary cosmology eternal inflation