From 4137d719da7694cc59c91014934b90058b3c2202 Mon Sep 17 00:00:00 2001 From: landgreen Date: Wed, 8 Dec 2021 20:48:18 -0800 Subject: [PATCH] only 3 bosses several tech now have fewer requirements to unlock some normal tech is now considered gun tech (mostly explosion stuff) snakeBoss tails, stay attached to each other "snakeBoss", "blockBoss", "powerupBoss" are now the only bosses for the random boss list bug fixes --- .DS_Store | Bin 6148 -> 6148 bytes index.html | 2 +- js/bullet.js | 12 +- js/level.js | 9 +- js/player.js | 2 +- js/spawn.js | 79 +++- js/tech.js | 1111 +++++++++++++++++++++++++------------------------- style.css | 7 +- todo.txt | 37 +- 9 files changed, 656 insertions(+), 603 deletions(-) diff --git a/.DS_Store b/.DS_Store index 9d96e85d8d21e20c10a35dad52fdd091c1a40661..38c8f0f308521b3e8b0d71d1ecbaa661ae7ce8a6 100644 GIT binary patch delta 22 dcmZoMXffEJ#mw}kYO)TqFO!_Z=4$3n5dc(Y2I~L- delta 22 dcmZoMXffEJ#mw}yZL$utFOzJ+=4$3n5dc-X2Oj_c diff --git a/index.html b/index.html index 602d46a..35e9b36 100644 --- a/index.html +++ b/index.html @@ -99,7 +99,7 @@ settings
- diff --git a/js/bullet.js b/js/bullet.js index a8fcb65..409e23b 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -3532,22 +3532,22 @@ const b = { }, randomBot(where = player.position, isKeep = true, isLaser = true) { if (Math.random() < 0.166 && isLaser) { - b.laserBot(where) + b.laserBot(where, isKeep) if (isKeep) tech.laserBotCount++; } else if (Math.random() < 0.2) { - b.dynamoBot(where) + b.dynamoBot(where, isKeep) if (isKeep) tech.dynamoBotCount++; } else if (Math.random() < 0.25) { - b.orbitBot(where); + b.orbitBot(where, isKeep); if (isKeep) tech.orbitBotCount++; } else if (Math.random() < 0.33) { - b.nailBot(where) + b.nailBot(where, isKeep) if (isKeep) tech.nailBotCount++; } else if (Math.random() < 0.5) { - b.foamBot(where) + b.foamBot(where, isKeep) if (isKeep) tech.foamBotCount++; } else { - b.boomBot(where) + b.boomBot(where, isKeep) if (isKeep) tech.boomBotCount++; } }, diff --git a/js/level.js b/js/level.js index f8af1a1..9c3b8bc 100644 --- a/js/level.js +++ b/js/level.js @@ -27,6 +27,7 @@ const level = { // tech.giveTech("antiscience") // for (let i = 0; i < 1; i++) tech.giveTech("reticulum") // for (let i = 0; i < 2; i++) tech.giveTech("laser-bot") + // tech.tech[297].frequency = 100 level.intro(); //starting level // level.testing(); //not in rotation, used for testing @@ -95,7 +96,7 @@ const level = { } } if (tech.isExtraMaxEnergy) { - tech.healMaxEnergyBonus += 0.04 * powerUps.totalPowerUps //Math.min(0.02 * powerUps.totalPowerUps, 0.51) + tech.healMaxEnergyBonus += 0.05 * powerUps.totalPowerUps //Math.min(0.02 * powerUps.totalPowerUps, 0.51) m.setMaxEnergy(); } if (tech.isGunCycle) { @@ -2336,8 +2337,8 @@ const level = { spawn.mapRect(4850, -275, 50, 175); //??? - level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why - spawn.starter(1900, -500, 200) //big boy + // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why + // spawn.starter(1900, -500, 200) //big boy // spawn.launcherOne(1700, -500) // spawn.launcherBoss(3200, -500) @@ -2361,7 +2362,7 @@ const level = { // for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40); // for (let i = 0; i < 5; i++) spawn.focuser(1900, -500) // spawn.slashBoss(1900, -500) - // spawn.sucker(1900, -500) + spawn.pulsar(1900, -500) // spawn.shield(mob[mob.length - 1], 1900, -500, 1); // mob[mob.length - 1].isShielded = true // spawn.growBossCulture(1200, -500) diff --git a/js/player.js b/js/player.js index 6854de7..374ef67 100644 --- a/js/player.js +++ b/js/player.js @@ -518,7 +518,7 @@ const m = { if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.3 if (tech.energyRegen === 0) dmg *= 0.34 - if (tech.isTurret && m.crouch) dmg *= 0.4; + if (tech.isTurret && m.crouch) dmg *= 0.34; if (tech.isEntanglement && b.inventory[0] === b.activeGun) { for (let i = 0, len = b.inventory.length; i < len; i++) dmg *= 0.87 // 1 - 0.15 } diff --git a/js/spawn.js b/js/spawn.js index eaa3a7b..b82c0f9 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -1,8 +1,9 @@ //main object for spawning things in a level const spawn = { - nonCollideBossList: ["cellBossCulture", "bomberBoss", "powerUpBoss", "orbitalBoss", "spawnerBossCulture", "growBossCulture"], + nonCollideBossList: ["snakeBoss"], //"cellBossCulture", "bomberBoss", "powerUpBoss", "orbitalBoss", "spawnerBossCulture", "growBossCulture" // other bosses: suckerBoss, laserBoss, tetherBoss, //these need a particular level to work so they are not included in the random pool - randomLevelBoss(x, y, options = ["shieldingBoss", "orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "snakeBoss", "streamBoss", "pulsarBoss", "spawnerBossCulture", "grenadierBoss", "growBossCulture", "blinkBoss", "snakeSpitBoss", "laserBombingBoss", "blockBoss", "slashBoss"]) { + // "shieldingBoss", "orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss",, , "streamBoss", "pulsarBoss", "spawnerBossCulture", "grenadierBoss", "growBossCulture", "blinkBoss", "snakeSpitBoss", "laserBombingBoss", , "slashBoss" + randomLevelBoss(x, y, options = ["snakeBoss", "powerUpBoss", "blockBoss"]) { spawn[options[Math.floor(Math.random() * options.length)]](x, y) }, pickList: ["starter", "starter"], @@ -2541,6 +2542,8 @@ const spawn = { me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front Matter.Body.rotate(me, Math.random() * Math.PI * 2); me.radius *= 2 + // me.frictionAir = 0.02 + me.vertices[1].x = me.position.x + Math.cos(me.angle) * me.radius; //make one end of the triangle longer me.vertices[1].y = me.position.y + Math.sin(me.angle) * me.radius; // me.homePosition = { x: x, y: y }; @@ -2972,9 +2975,9 @@ const spawn = { Matter.Body.rotate(me, 2 * Math.PI * Math.random()); me.accelMag = 0.00038 * Math.sqrt(simulation.accelScale); me.frictionAir = 0.01; - me.swordRadiusMax = 500 + 8 * simulation.difficulty; + me.swordRadiusMax = 550 + 10 * simulation.difficulty; me.laserAngle = 0; - me.swordDamage = 0.002 * simulation.dmgScale + me.swordDamage = 0.0025 * simulation.dmgScale spawn.shield(me, x, y, 1); Matter.Body.setDensity(me, 0.005); //extra dense //normal is 0.001 //makes effective life much larger @@ -2984,7 +2987,49 @@ const spawn = { me.onDeath = function() { powerUps.spawnBossPowerUp(this.position.x, this.position.y) }; + + + + me.startingDamageReduction = me.damageReduction + me.isInvulnerable = false + me.isNextInvulnerability = 0.75 + me.invulnerabilityCountDown = 0 + me.invulnerable = function() { + if (this.health < this.isNextInvulnerability) { + this.isNextInvulnerability = Math.floor(this.health * 4) / 4 //0.75,0.5,0.25 + this.isInvulnerable = true + this.damageReduction = 0 + this.invulnerabilityCountDown = 180 + } + if (this.isInvulnerable) { + if (this.invulnerabilityCountDown > 0) { + this.invulnerabilityCountDown-- + //graphics //draw a super shield? + + ctx.beginPath(); + + let vertices = this.vertices; + ctx.moveTo(vertices[0].x, vertices[0].y); + for (let j = 1; j < vertices.length; j++) ctx.lineTo(vertices[j].x, vertices[j].y); + ctx.lineTo(vertices[0].x, vertices[0].y); + ctx.lineWidth = 20; + // ctx.fillStyle = `rgba(${Math.floor(255 * Math.random())},${Math.floor(255 * Math.random())},${Math.floor(255 * Math.random())},0.5)` + // ctx.fill(); + ctx.strokeStyle = "rgba(255,255,255,0.4)"; + ctx.stroke(); + + + + + } else { + this.isInvulnerable = false + this.damageReduction = this.startingDamageReduction + } + } + } + me.do = function() { + this.invulnerable(); this.checkStatus(); this.seePlayerByHistory(60); this.attraction(); @@ -4266,7 +4311,7 @@ const spawn = { if (mob[i].isSnakeTail && mob[i].alive) { mob[i].isSnakeTail = false; mob[i].do = mob[i].doActive - mob[i].removeConsBB(); + // mob[i].removeConsBB(); } } }; @@ -4384,7 +4429,7 @@ const spawn = { if (mob[i].isSnakeTail && mob[i].alive) { mob[i].isSnakeTail = false; mob[i].do = mob[i].doActive - mob[i].removeConsBB(); + // mob[i].removeConsBB(); } } }; @@ -4438,24 +4483,24 @@ const spawn = { mobs.spawn(x, y, 8, radius, "rgba(0,180,180,0.4)"); let me = mob[mob.length - 1]; me.collisionFilter.mask = cat.bullet | cat.player | cat.mob //| cat.body - me.accelMag = 0.0004 * simulation.accelScale; + me.accelMag = 0.0006 * simulation.accelScale; me.leaveBody = false; me.showHealthBar = false; me.isDropPowerUp = false; // Matter.Body.setDensity(me, 0.00004); //normal is 0.001 - me.frictionAir = 0.02; + me.frictionAir = 0.015; me.isSnakeTail = true; me.stroke = "transparent" me.onDeath = function() { - if (this.isSnakeTail) { //wake up tail mobs - for (let i = 0; i < mob.length; i++) { - if (mob[i].isSnakeTail && mob[i].alive) { - mob[i].isSnakeTail = false; - mob[i].do = mob[i].doActive - mob[i].removeConsBB(); - } - } - } + // if (this.isSnakeTail) { //wake up tail mobs + // for (let i = 0; i < mob.length; i++) { + // if (mob[i].isSnakeTail && mob[i].alive) { + // mob[i].isSnakeTail = false; + // mob[i].do = mob[i].doActive + // mob[i].removeConsBB(); + // } + // } + // } }; me.do = function() { this.checkStatus(); diff --git a/js/tech.js b/js/tech.js index 12dc5fa..ec3a2e9 100644 --- a/js/tech.js +++ b/js/tech.js @@ -103,7 +103,7 @@ const tech = { if (options.length) { const num = chance * count //scale number added for (let i = 0; i < num; i++) tech.tech[options[Math.floor(Math.random() * options.length)]].frequency++ - simulation.makeTextLog(`tech.tech.push(${num} JUNK)`) + simulation.makeTextLog(`tech.tech.push(${num.toFixed(0)} JUNK)`) return num } else { return 0 @@ -217,7 +217,7 @@ const tech = { if (m.isSneakAttack && m.cycle > m.lastKillCycle + 240) dmg *= tech.sneakAttackDmg if (tech.isTechDamage) dmg *= 1.9 if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance()) - if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5 + if (tech.isLowEnergyDamage) dmg *= 1 + 0.7 * Math.max(0, 1 - m.energy) if (tech.isMaxEnergyTech) dmg *= 1.5 if (tech.isEnergyNoAmmo) dmg *= 1.6 if (tech.isDamageForGuns) dmg *= 1 + 0.14 * b.inventory.length @@ -287,120 +287,8 @@ const tech = { } }, tech: [{ - name: "integrated armament", - link: `integrated armament`, - description: `increase damage by 25%, but new guns
replace your current gun and convert guntech
`, - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return b.inventory.length === 1 - }, - requires: "only 1 gun", - effect() { - tech.isOneGun = true; - }, - remove() { - tech.isOneGun = false; - } - }, - { - name: "entanglement", - nameInfo: "", - addNameInfo() { - setTimeout(function() { - simulation.boldActiveGunHUD(); - }, 1000); - }, - description: "while your first gun is equipped
reduce harm by 13% for each of your guns", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return b.inventory.length > 1 && !tech.isEnergyHealth - }, - requires: "at least 2 guns, not mass-energy", - effect() { - tech.isEntanglement = true - setTimeout(function() { - simulation.boldActiveGunHUD(); - }, 1000); - - }, - remove() { - tech.isEntanglement = false; - } - }, - { - name: "arsenal", - // descriptionFunction() { - // return `increase damage by ${14 * b.inventory.length}%
14% for each gun in your inventory` - // }, - description: "increase damage by 14%
for each gun in your inventory", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return b.inventory.length > 2 - }, - requires: "at least 3 guns", - effect() { - tech.isDamageForGuns = true; - }, - remove() { - tech.isDamageForGuns = false; - } - }, - { - name: "active cooling", - description: "18% decreased delay after firing
for each gun in your inventory", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return b.inventory.length > 1 - }, - requires: "at least 2 guns", - effect() { - tech.isFireRateForGuns = true; - b.setFireCD(); - }, - remove() { - tech.isFireRateForGuns = false; - b.setFireCD(); - } - }, - { - name: "generalist", - description: "spawn 8 guns, but you can't switch guns
guns cycle automatically with each new level", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return (tech.isDamageForGuns || tech.isFireRateForGuns) && b.inventory.length < b.guns.length - 5 //12-5 guns total - }, - requires: "arsenal or active cooling and less than 7 guns", - effect() { - tech.isGunCycle = true; - for (let i = 0; i < 8; i++) powerUps.spawn(m.pos.x + 10 * Math.random(), m.pos.y + 10 * Math.random(), "gun"); - }, - remove() { - if (tech.isGunCycle) { - for (let i = 0; i < 8; i++) { - if (b.inventory.length) b.removeGun(b.guns[b.inventory[b.inventory.length - 1]].name) //remove your last gun - } - tech.isGunCycle = false; - } - } - }, - { name: "gun sciences", - description: "spawn a gun and double the frequency
of finding guntech", + description: "triple the frequency of finding guntech
spawn a gun", maxCount: 1, count: 0, frequency: 1, @@ -416,14 +304,14 @@ const tech = { powerUps.spawn(m.pos.x, m.pos.y, "gun"); // this.count-- for (let i = 0, len = tech.tech.length; i < len; i++) { - if (tech.tech[i].isGunTech) tech.tech[i].frequency *= 2 + if (tech.tech[i].isGunTech) tech.tech[i].frequency *= 3 } }, remove() {} }, { name: "ad hoc", - description: `for every gun in your inventory spawn a
${powerUps.orb.heal()}, ${powerUps.orb.research(1)}, field, ${powerUps.orb.ammo(1)}, or tech`, + description: `spawn a ${powerUps.orb.heal()}, ${powerUps.orb.research(1)}, field, ${powerUps.orb.ammo(1)}, or tech
for every gun in your inventory`, maxCount: 1, //random power up count: 0, frequency: 1, @@ -493,6 +381,118 @@ const tech = { }, remove() {} }, + { + name: "integrated armament", + link: `integrated armament`, + description: `increase damage by 25%, but new guns
replace your current gun and convert guntech
`, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return b.inventory.length === 1 + }, + requires: "only 1 gun", + effect() { + tech.isOneGun = true; + }, + remove() { + tech.isOneGun = false; + } + }, + { + name: "entanglement", + nameInfo: "", + addNameInfo() { + setTimeout(function() { + simulation.boldActiveGunHUD(); + }, 1000); + }, + description: "while your first gun is equipped
reduce harm by 13% for each of your guns", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !tech.isEnergyHealth + }, + requires: "not mass-energy", + effect() { + tech.isEntanglement = true + setTimeout(function() { + simulation.boldActiveGunHUD(); + }, 1000); + + }, + remove() { + tech.isEntanglement = false; + } + }, + { + name: "generalist", + description: "spawn 8 guns, but you can't switch guns
guns cycle automatically with each new level", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return b.inventory.length < b.guns.length - 5 //(tech.isDamageForGuns || tech.isFireRateForGuns) && + }, + requires: "less than 7 guns", + effect() { + tech.isGunCycle = true; + for (let i = 0; i < 8; i++) powerUps.spawn(m.pos.x + 10 * Math.random(), m.pos.y + 10 * Math.random(), "gun"); + }, + remove() { + if (tech.isGunCycle) { + for (let i = 0; i < 8; i++) { + if (b.inventory.length) b.removeGun(b.guns[b.inventory[b.inventory.length - 1]].name) //remove your last gun + } + tech.isGunCycle = false; + } + } + }, + { + name: "arsenal", + // descriptionFunction() { + // return `increase damage by ${14 * b.inventory.length}%
14% for each gun in your inventory` + // }, + description: "increase damage by 14%
for each gun in your inventory", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return true + }, + requires: "", + effect() { + tech.isDamageForGuns = true; + }, + remove() { + tech.isDamageForGuns = false; + } + }, + { + name: "active cooling", + description: "18% decreased delay after firing
for each gun in your inventory", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return true + }, + requires: "", + effect() { + tech.isFireRateForGuns = true; + b.setFireCD(); + }, + remove() { + tech.isFireRateForGuns = false; + b.setFireCD(); + } + }, { name: "logistics", description: `${powerUps.orb.ammo()} give 80% more ammo, but
it's only added to your current gun`, @@ -583,7 +583,7 @@ const tech = { { name: "desublimated ammunition", link: `desublimated ammunition`, - description: `produce bullets from air molecules
every other crouched shot uses no ammo`, + description: `every other shot uses no ammo when crouching`, maxCount: 1, count: 0, frequency: 1, @@ -601,15 +601,15 @@ const tech = { }, { name: "gun turret", - description: "reduce harm by 60% when crouching", + description: "reduce harm by 66% when crouching", maxCount: 1, count: 0, - frequency: 3, - frequencyDefault: 3, + frequency: 1, + frequencyDefault: 1, allowed() { - return (tech.isCrouchAmmo && !tech.isEnergyHealth) || tech.isCrouchRegen + return !tech.isEnergyHealth //(tech.isCrouchAmmo || tech.isCrouchRegen) && }, - requires: "inductive coupling, desublimated ammunition, not mass-energy", + requires: "not mass-energy", //inductive coupling, desublimated ammunition, effect() { tech.isTurret = true }, @@ -815,232 +815,6 @@ const tech = { tech.isDamageFromBulletCount = false } }, - { - name: "anti-shear topology", - link: `anti-shear topology`, - description: "some projectiles last 30% longer
drone, spore, missile, foam, wave, neutron, ice", - - // isGunTech: true, - maxCount: 3, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("matter wave") || tech.isNeutronBomb || tech.isIceField || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 || tech.isWormShot || tech.foamBotCount > 1 - }, - requires: "drones, spores, missiles, foam, matter wave, neutron bomb, ice IX", - effect() { - tech.isBulletsLastLonger += 0.3 - }, - remove() { - tech.isBulletsLastLonger = 1; - } - }, - { - name: "radioactive contamination", - description: "after a mob or shield dies,
leftover radiation spreads to a nearby mob", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return tech.isNailRadiation || tech.isWormholeDamage || tech.isNeutronBomb || tech.isExplodeRadio - }, - requires: "radiation damage source", - effect() { - tech.isRadioactive = true - }, - remove() { - tech.isRadioactive = false - } - }, - { - name: "water shielding", - link: `water shielding`, - description: "radioactive effects on you are reduced by 75%
neutron bomb, drones, explosions, slime", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return tech.isNeutronBomb || tech.isDroneRadioactive || tech.isExplodeRadio - }, - requires: "neutron bomb or irradiated drones or iridium-192", - effect() { - tech.isRadioactiveResistance = true - }, - remove() { - tech.isRadioactiveResistance = false - } - }, - { - name: "iridium-192", - description: "explosions release gamma radiation
100% more damage, but over 4 seconds", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return tech.explosiveRadius === 1 && !tech.isSmallExplosion && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isTokamak) - }, - requires: "an explosive damage source, not ammonium nitrate or nitroglycerin", - effect: () => { - tech.isExplodeRadio = true; //iridium-192 - }, - remove() { - tech.isExplodeRadio = false; - } - }, - { - name: "ammonium nitrate", - description: "increase explosive damage by 30%
increase explosive radius by 30%", - maxCount: 9, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck() - }, - requires: "an explosive damage source, not iridium-192", - effect: () => { - tech.explosiveRadius += 0.3; - }, - remove() { - tech.explosiveRadius = 1; - } - }, - { - name: "nitroglycerin", - description: "increase explosive damage by 66%
decrease explosive radius by 33%", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck() - }, - requires: "an explosive damage source, not iridium-192", - effect: () => { - tech.isSmallExplosion = true; - }, - remove() { - tech.isSmallExplosion = false; - } - }, - { - name: "acetone peroxide", - description: "increase explosive radius by 80%, but
you take 300% more harm from explosions", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - isBadRandomOption: true, - allowed() { - return tech.hasExplosiveDamageCheck() - }, - requires: "an explosive damage source", - effect: () => { - tech.isExplosionHarm = true; - }, - remove() { - tech.isExplosionHarm = false; - } - }, - { - name: "shock wave", - description: "explosions stun mobs for 1-2 seconds
decrease explosive damage by 30%", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck() - }, - requires: "an explosive damage source, not iridium-192", - effect() { - tech.isExplosionStun = true; - }, - remove() { - tech.isExplosionStun = false; - } - }, - { - name: "controlled explosion", - description: `use ${powerUps.orb.research(3)} to dynamically reduce all
explosions until they do no harm`, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 2) && (tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)) - }, - requires: "an explosive damage source, not electric reactive armor", - effect: () => { - tech.isSmartRadius = true; - for (let i = 0; i < 3; i++) { - if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) - } - }, - remove() { - tech.isSmartRadius = false; - if (this.count > 0) powerUps.research.changeRerolls(3) - } - }, - { - name: "electric reactive armor", - // description: "explosions do no harm
while your energy is above 98%", - description: "harm from explosions is passively reduced
by 5% for every 10 stored energy", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return !tech.isSmartRadius && !tech.isExplodeRadio && tech.hasExplosiveDamageCheck() - }, - requires: "an explosive damage source, not iridium-192", - effect: () => { - tech.isImmuneExplosion = true; - }, - remove() { - tech.isImmuneExplosion = false; - } - }, - { - name: "incendiary ammunition", - description: "shotgun, super balls, and drones
are loaded with explosives", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return ((m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && !(tech.isDroneTeleport || tech.isDroneRadioactive || tech.isSporeField || tech.isMissileField || tech.isIceField)) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport) || tech.haveGunCheck("super balls") || tech.haveGunCheck("shotgun")) && !tech.isNailShot && !tech.isIceShot && !tech.isFoamShot && !tech.isWormShot && !tech.isNeedleShot - }, - requires: "super balls, basic or slug shotgun, drones, not irradiated drones or burst drones", - effect() { - tech.isIncendiary = true - }, - remove() { - tech.isIncendiary = false; - } - }, - { - name: "fragmentation", - description: "some detonations and collisions eject nails
blocks, grenades, missiles, slugs, harpoon", - maxCount: 9, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return tech.haveGunCheck("harpoon") || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.missileBotCount || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.blockDamage > 0.075 - }, - requires: "grenades, missiles, shotgun slugs, harpoon, or mass driver", - effect() { - tech.fragments++ - }, - remove() { - tech.fragments = 0 - } - }, { name: "thermal runaway", description: "mobs explode when they die", @@ -1109,9 +883,9 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling || tech.iceIXOnDeath + return true //tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling || tech.iceIXOnDeath }, - requires: "any mob death tech", + requires: "", //"any mob death tech", effect: () => { tech.mobSpawnWithHealth *= 0.89 @@ -1147,12 +921,12 @@ const tech = { description: "increase damage by 100%
after not using your gun or field for 2 seconds", maxCount: 1, count: 0, - frequency: 3, - frequencyDefault: 3, + frequency: 1, + frequencyDefault: 1, allowed() { - return tech.isNoFireDefense + return true }, - requires: "decorrelation", + requires: "", effect() { tech.isNoFireDamage = true }, @@ -1613,9 +1387,9 @@ const tech = { frequencyDefault: 2, isBotTech: true, allowed() { - return b.totalBots() > 2 && !tech.isEnergyHealth + return b.totalBots() > 1 && !tech.isEnergyHealth }, - requires: "at least 3 bots", + requires: "at least 2 bots", effect() { tech.isBotArmor = true }, @@ -1632,9 +1406,9 @@ const tech = { frequencyDefault: 2, isBotTech: true, allowed() { - return b.totalBots() > 2 + return b.totalBots() > 1 }, - requires: "at least 3 bots", + requires: "at least 2 bots", effect() { tech.isBotDamage = true }, @@ -1700,25 +1474,6 @@ const tech = { } } }, - { - name: "capacitor bank", - // description: "charge effects build up almost instantly
throwing blocks, foam, railgun, pulse, tokamak", - descriptionFunction() { return `charge effects build up almost instantly
throwing blocks, ${tech.haveGunCheck("foam", false) ? "foam" : "foam"}, ${tech.isRailGun ? "railgun" : "railgun"}, ${tech.isPulseLaser ? "pulse" : "pulse"}, ${tech.isTokamak ? "tokamak" : "tokamak"}` }, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return tech.blockDamage > 0.075 || tech.haveGunCheck("foam") || tech.isRailGun || tech.isTokamak || tech.isPulseLaser - }, - requires: "throwing blocks, foam, railgun, pulse, tokamak", - effect() { - tech.isCapacitor = true; - }, - remove() { - tech.isCapacitor = false; - } - }, { name: "mass driver", description: "increase block collision damage by 300%", @@ -2220,9 +1975,9 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return m.harmReduction() < 1 + return true }, - requires: "some harm reduction", + requires: "", effect() { tech.isDroneOnDamage = true; for (let i = 0; i < 4; i++) { @@ -2239,12 +1994,12 @@ const tech = { description: "for 10 seconds after receiving harm
reduce harm by 66%", maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { - return !tech.isEnergyHealth && m.harmReduction() < 1 + return !tech.isEnergyHealth }, - requires: "some harm reduction", + requires: "not mass-energy", effect() { tech.isHarmArmor = true; }, @@ -2257,12 +2012,12 @@ const tech = { description: "for 10 seconds after receiving harm
increase damage by 200%", maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { - return m.harmReduction() < 1 + return true }, - requires: "some harm reduction", + requires: "", effect() { tech.isHarmDamage = true; }, @@ -2275,8 +2030,8 @@ const tech = { description: "charge, parity, and time invert to undo harm
rewind (1.5—5) seconds for (66—220) energy", maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { //&& (m.fieldUpgrades[m.fieldMode].name !== "molecular assembler" || m.maxEnergy > 1) return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isEnergyHealth && !tech.isRewindField //&& !tech.isRewindGun }, @@ -2351,12 +2106,12 @@ const tech = { description: "reduce harm by 66%
you no longer passively regenerate energy", maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { - return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isTokamak) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth && !tech.isCrouchRegen + return !tech.isCrouchRegen //(tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isTokamak) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth && !tech.isCrouchRegen }, - requires: "a way to regen extra energy, not time crystals", + requires: "not inductive coupling", //"not time crystals", effect: () => { tech.energyRegen = 0; m.fieldRegen = tech.energyRegen; @@ -2516,12 +2271,12 @@ const tech = { description: `increase damage by 50%, but
reduce maximum energy by 50`, maxCount: 1, count: 0, - frequency: 3, - frequencyDefault: 3, + frequency: 1, + frequencyDefault: 1, allowed() { - return tech.isEnergyLoss && !tech.isRewindAvoidDeath + return !tech.isRewindAvoidDeath }, - requires: "exothermic process, not CPT", + requires: "not CPT", effect() { tech.isMaxEnergyTech = true; m.setMaxEnergy() @@ -2533,15 +2288,15 @@ const tech = { }, { name: "Gibbs free energy", - description: `increase damage by 5%
for every 10 energy below 100`, + description: `increase damage by 0.7%
for each energy below 100`, maxCount: 1, count: 0, - frequency: 3, - frequencyDefault: 3, + frequency: 1, + frequencyDefault: 1, allowed() { - return tech.isEnergyLoss && m.maxEnergy < 1.01 + return true }, - requires: "exothermic process, not max energy increase", + requires: "", effect() { tech.isLowEnergyDamage = true; }, @@ -2607,7 +2362,7 @@ const tech = { allowed() { return tech.energyRegen !== 0 && !tech.isDamageAfterKillNoRegen }, - requires: "not ground state, apex predator", + requires: "not ground state, predator", effect() { tech.isCrouchRegen = true; //only used to check for requirements m.regenEnergy = function() { @@ -2885,7 +2640,7 @@ const tech = { }, { name: "maintenance", - description: `double the frequency of finding healing tech
spawn ${powerUps.orb.heal(11)}`, + description: `double the frequency of finding healing tech
spawn ${powerUps.orb.heal(13)}`, maxCount: 1, count: 0, frequency: 1, @@ -2895,7 +2650,7 @@ const tech = { allowed() { return true }, requires: "NOT EXPERIMENT MODE", effect() { - for (let i = 0; i < 11; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal"); + for (let i = 0; i < 13; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal"); for (let i = 0, len = tech.tech.length; i < len; i++) { if (tech.tech[i].isHealTech) tech.tech[i].frequency *= 2 } @@ -3263,6 +3018,137 @@ const tech = { tech.isMetaAnalysis = false } }, + { + name: "unified field theory", + description: `spawn ${powerUps.orb.research(6)}and when paused
clicking the field box switches your field`, + // description: `in the pause menu, change your field
by clicking on your field's box`, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return true + }, + requires: "not superdeterminism", + effect() { + tech.isPauseSwitchField = true; + for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); + }, + remove() { + if (tech.isPauseSwitchField) { + tech.isPauseSwitchField = false; + powerUps.research.changeRerolls(-6) + } + } + }, + { + name: "cross disciplinary", + description: "tech have an extra field or gun choice", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !tech.isDeterminism + }, + requires: "not determinism", + effect: () => { + tech.isExtraGunField = true; + // for (let i = 0; i < 2; i++) powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); + + }, + remove() { + tech.isExtraGunField = false; + // if (this.count > 0) powerUps.research.changeRerolls(-2) + } + }, + { + name: "emergence", + description: "tech, fields, and guns have 5 choices
+5% JUNK to the potential tech pool", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !tech.isDeterminism + }, + requires: "not determinism", + effect: () => { + tech.isExtraChoice = true; + this.refundAmount += tech.addJunkTechToPool(0.05) + }, + refundAmount: 0, + remove() { + tech.isExtraChoice = false; + if (this.count > 0 && this.refundAmount > 0) { + tech.removeJunkTechFromPool(this.refundAmount) + this.refundAmount = 0 + } + } + }, + { + name: "determinism", + description: "spawn 5 tech, but you have only
1 choice for tech, fields, and guns", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + isBadRandomOption: true, + isNonRefundable: true, + allowed() { + return !tech.isExtraChoice && !tech.isExtraGunField + }, + requires: "not emergence, cross disciplinary", + effect: () => { + tech.isDeterminism = true; + //if you change the number spawned also change it in Born rule + for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); + }, + remove() { + tech.isDeterminism = false; + // if (this.count > 0) { + // for (let i = 0; i < 5; i++) { + // const numberRemoved = tech.removeTech() + // console.log(numberRemoved) + // if (numberRemoved === 0) { //if the player didn't remove a power up then remove 1 tech for the map + // for (let j = powerUp.length - 1; j > -1; j--) { + // if (powerUp[j].name === "tech") { + // Matter.Composite.remove(engine.world, powerUp[j]); + // powerUp.splice(j, 1); + // break; + // } + // } + // } + // } + // } + } + }, + { + name: "superdeterminism", + description: `spawn 5 tech, but you have no cancel
and ${powerUps.orb.research(1)}, no longer spawn`, + maxCount: 1, + count: 0, + frequency: 4, + frequencyDefault: 4, + isBadRandomOption: true, + isNonRefundable: true, + allowed() { + return tech.isDeterminism && !tech.isAnsatz + }, + requires: "determinism, not ansatz", + effect: () => { + tech.isSuperDeterminism = true; + //if you change the number spawned also change it in Born rule + for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); + }, + remove() { + tech.isSuperDeterminism = false; + // tech.isSuperDeterminism = false; + // if (this.count) { + // for (let i = 0; i < 5; i++) tech.removeTech() + // } + } + }, { name: "replication", description: "10% chance to duplicate spawned power ups
+40% JUNK to the potential tech pool", @@ -3413,6 +3299,7 @@ const tech = { count: 0, frequency: 10, frequencyDefault: 10, + isNonRefundable: true, allowed() { return tech.duplicationChance() > 0.99 }, @@ -3499,7 +3386,7 @@ const tech = { }, { name: "vector fields", - description: "triple the frequency of finding field tech
spawn a field", + description: "triple the frequency of finding field tech
spawn a field", maxCount: 1, count: 0, frequency: 1, @@ -3590,137 +3477,6 @@ const tech = { // }, // remove() {} // }, - { - name: "unified field theory", - description: `spawn ${powerUps.orb.research(6)}and when paused
clicking the field box switches your field`, - // description: `in the pause menu, change your field
by clicking on your field's box`, - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return true - }, - requires: "not superdeterminism", - effect() { - tech.isPauseSwitchField = true; - for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); - }, - remove() { - if (tech.isPauseSwitchField) { - tech.isPauseSwitchField = false; - powerUps.research.changeRerolls(-6) - } - } - }, - { - name: "cross disciplinary", - description: "tech have an extra field or gun choice", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return !tech.isDeterminism - }, - requires: "not determinism", - effect: () => { - tech.isExtraGunField = true; - // for (let i = 0; i < 2; i++) powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); - - }, - remove() { - tech.isExtraGunField = false; - // if (this.count > 0) powerUps.research.changeRerolls(-2) - } - }, - { - name: "emergence", - description: "tech, fields, and guns have 5 choices
+5% JUNK to the potential tech pool", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return !tech.isDeterminism - }, - requires: "not determinism", - effect: () => { - tech.isExtraChoice = true; - this.refundAmount += tech.addJunkTechToPool(0.05) - }, - refundAmount: 0, - remove() { - tech.isExtraChoice = false; - if (this.count > 0 && this.refundAmount > 0) { - tech.removeJunkTechFromPool(this.refundAmount) - this.refundAmount = 0 - } - } - }, - { - name: "determinism", - description: "spawn 5 tech, but you have only
1 choice for tech, fields, and guns", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - isBadRandomOption: true, - isNonRefundable: true, - allowed() { - return !tech.isExtraChoice && !tech.isExtraGunField - }, - requires: "not emergence, cross disciplinary", - effect: () => { - tech.isDeterminism = true; - //if you change the number spawned also change it in Born rule - for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); - }, - remove() { - tech.isDeterminism = false; - // if (this.count > 0) { - // for (let i = 0; i < 5; i++) { - // const numberRemoved = tech.removeTech() - // console.log(numberRemoved) - // if (numberRemoved === 0) { //if the player didn't remove a power up then remove 1 tech for the map - // for (let j = powerUp.length - 1; j > -1; j--) { - // if (powerUp[j].name === "tech") { - // Matter.Composite.remove(engine.world, powerUp[j]); - // powerUp.splice(j, 1); - // break; - // } - // } - // } - // } - // } - } - }, - { - name: "superdeterminism", - description: `spawn 5 tech, but you have no cancel
and ${powerUps.orb.research(1)}, no longer spawn`, - maxCount: 1, - count: 0, - frequency: 4, - frequencyDefault: 4, - isBadRandomOption: true, - isNonRefundable: true, - allowed() { - return tech.isDeterminism && !tech.isAnsatz - }, - requires: "determinism, not ansatz", - effect: () => { - tech.isSuperDeterminism = true; - //if you change the number spawned also change it in Born rule - for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); - }, - remove() { - tech.isSuperDeterminism = false; - // tech.isSuperDeterminism = false; - // if (this.count) { - // for (let i = 0; i < 5; i++) tech.removeTech() - // } - } - }, { name: "dark patterns", description: "reduce combat difficulty by 1 level
+31% JUNK to the potential tech pool", @@ -3999,7 +3755,7 @@ const tech = { frequencyDefault: 2, allowed() { // return tech.haveGunCheck("nail gun") || tech.isSlugShot - return tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + (tech.haveGunCheck("nail gun") && !tech.isShieldPierce) + tech.isNeedleShot + tech.isNailShot + tech.isSlugShot) * 2 > 1 + return tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + (tech.haveGunCheck("nail gun")) + tech.isNeedleShot + tech.isNailShot + tech.isSlugShot) * 2 > 1 }, requires: "nails, nail gun, rivets, shotgun, slug", effect() { @@ -4243,7 +3999,7 @@ const tech = { { name: "Noether violation", link: `Noether violation`, - description: "increase shotgun damage 60%
their recoil is increased and reversed", + description: "increase shotgun damage 60%
its recoil is increased and reversed", isGunTech: true, maxCount: 1, count: 0, @@ -4805,6 +4561,222 @@ const tech = { tech.isNeutronSlow = false } }, + { + name: "radioactive contamination", + description: "after a mob or shield dies,
leftover radiation spreads to a nearby mob", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isNailRadiation || tech.isWormholeDamage || tech.isNeutronBomb || tech.isExplodeRadio + }, + requires: "radiation damage source", + effect() { + tech.isRadioactive = true + }, + remove() { + tech.isRadioactive = false + } + }, + { + name: "water shielding", + link: `water shielding`, + description: "radioactive effects on you are reduced by 75%
neutron bomb, drones, explosions, slime", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isNeutronBomb || tech.isDroneRadioactive || tech.isExplodeRadio + }, + requires: "neutron bomb or irradiated drones or iridium-192", + effect() { + tech.isRadioactiveResistance = true + }, + remove() { + tech.isRadioactiveResistance = false + } + }, + { + name: "iridium-192", + description: "explosions release gamma radiation
100% more damage, but over 4 seconds", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.explosiveRadius === 1 && !tech.isSmallExplosion && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isTokamak) + }, + requires: "an explosive damage source, not ammonium nitrate or nitroglycerin", + effect: () => { + tech.isExplodeRadio = true; //iridium-192 + }, + remove() { + tech.isExplodeRadio = false; + } + }, + { + name: "ammonium nitrate", + description: "increase explosive damage by 30%
increase explosive radius by 30%", + isGunTech: true, + maxCount: 9, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck() + }, + requires: "an explosive damage source, not iridium-192", + effect: () => { + tech.explosiveRadius += 0.3; + }, + remove() { + tech.explosiveRadius = 1; + } + }, + { + name: "nitroglycerin", + description: "increase explosive damage by 66%
decrease explosive radius by 33%", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck() + }, + requires: "an explosive damage source, not iridium-192", + effect: () => { + tech.isSmallExplosion = true; + }, + remove() { + tech.isSmallExplosion = false; + } + }, + { + name: "acetone peroxide", + description: "increase explosive radius by 80%, but
you take 300% more harm from explosions", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + isBadRandomOption: true, + allowed() { + return tech.hasExplosiveDamageCheck() + }, + requires: "an explosive damage source", + effect: () => { + tech.isExplosionHarm = true; + }, + remove() { + tech.isExplosionHarm = false; + } + }, + { + name: "shock wave", + description: "explosions stun mobs for 1-2 seconds
decrease explosive damage by 30%", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck() + }, + requires: "an explosive damage source, not iridium-192", + effect() { + tech.isExplosionStun = true; + }, + remove() { + tech.isExplosionStun = false; + } + }, + { + name: "controlled explosion", + description: `use ${powerUps.orb.research(3)} to dynamically reduce all
explosions until they do no harm`, + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 2) && (tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)) + }, + requires: "an explosive damage source, not electric reactive armor", + effect: () => { + tech.isSmartRadius = true; + for (let i = 0; i < 3; i++) { + if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) + } + }, + remove() { + tech.isSmartRadius = false; + if (this.count > 0) powerUps.research.changeRerolls(3) + } + }, + { + name: "electric reactive armor", + // description: "explosions do no harm
while your energy is above 98%", + description: "harm from explosions is passively reduced
by 5% for every 10 stored energy", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return !tech.isSmartRadius && !tech.isExplodeRadio && tech.hasExplosiveDamageCheck() + }, + requires: "an explosive damage source, not iridium-192", + effect: () => { + tech.isImmuneExplosion = true; + }, + remove() { + tech.isImmuneExplosion = false; + } + }, + { + name: "incendiary ammunition", + description: "shotgun, super balls, and drones
are loaded with explosives", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return ((m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && !(tech.isDroneTeleport || tech.isDroneRadioactive || tech.isSporeField || tech.isMissileField || tech.isIceField)) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport) || tech.haveGunCheck("super balls") || tech.haveGunCheck("shotgun")) && !tech.isNailShot && !tech.isIceShot && !tech.isFoamShot && !tech.isWormShot && !tech.isNeedleShot + }, + requires: "super balls, basic or slug shotgun, drones, not irradiated drones or burst drones", + effect() { + tech.isIncendiary = true + }, + remove() { + tech.isIncendiary = false; + } + }, + { + name: "fragmentation", + description: "some detonations and collisions eject nails
blocks, grenades, missiles, slugs, harpoon", + isGunTech: true, + maxCount: 9, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return tech.haveGunCheck("harpoon") || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.missileBotCount || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.blockDamage > 0.075 + }, + requires: "grenades, missiles, shotgun slugs, harpoon, or mass driver", + effect() { + tech.fragments++ + }, + remove() { + tech.fragments = 0 + } + }, { name: "booby trap", description: "drop a mine after picking up a power up
+53% JUNK to the potential tech pool", @@ -5026,6 +4998,26 @@ const tech = { tech.wormSurviveDmg = false } }, + { + name: "anti-shear topology", + link: `anti-shear topology`, + description: "some projectiles last 30% longer
drone, spore, missile, foam, wave, neutron, ice", + isGunTech: true, + maxCount: 3, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("matter wave") || tech.isNeutronBomb || tech.isIceField || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 || tech.isWormShot || tech.foamBotCount > 1 + }, + requires: "drones, spores, missiles, foam, matter wave, neutron bomb, ice IX", + effect() { + tech.isBulletsLastLonger += 0.3 + }, + remove() { + tech.isBulletsLastLonger = 1; + } + }, { name: "fault tolerance", description: "spawn 8 drones that last forever
remove your drone gun", @@ -5245,6 +5237,26 @@ const tech = { tech.isFastDrones = false } }, + { + name: "capacitor bank", + // description: "charge effects build up almost instantly
throwing blocks, foam, railgun, pulse, tokamak", + descriptionFunction() { return `charge effects build up almost instantly
throwing blocks, ${tech.haveGunCheck("foam", false) ? "foam" : "foam"}, ${tech.isRailGun ? "railgun" : "railgun"}, ${tech.isPulseLaser ? "pulse" : "pulse"}, ${tech.isTokamak ? "tokamak" : "tokamak"}` }, + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.blockDamage > 0.075 || tech.haveGunCheck("foam") || tech.isRailGun || tech.isTokamak || tech.isPulseLaser + }, + requires: "throwing blocks, foam, railgun, pulse, tokamak", + effect() { + tech.isCapacitor = true; + }, + remove() { + tech.isCapacitor = false; + } + }, { name: "electrostatic induction", description: "foam bubbles are electrically charged
causing attraction to nearby mobs", @@ -6539,9 +6551,9 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && tech.energyRegen !== 0 + return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") }, - requires: "time dilation or pilot wave, not ground state", + requires: "time dilation or pilot wave", effect: () => { tech.energyRegen = 0.004; m.fieldRegen = tech.energyRegen; @@ -7289,7 +7301,7 @@ const tech = { description: `play planetesimals
(an annoying asteroids game with Newtonian physics)
clearing a level in planetesimals spawns a tech in n-gon
but, if you die in planetesimals you die in n-gon`, maxCount: 1, count: 0, - frequency: 100, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -8704,7 +8716,7 @@ const tech = { { name: "quantum black hole", description: `use your energy and ${powerUps.orb.research(4)} to spawn
inside the event horizon of a huge black hole`, - maxCount: 9, + maxCount: 1, count: 0, frequency: 0, isNonRefundable: true, @@ -8724,8 +8736,8 @@ const tech = { }, { name: "black hole cluster", - description: `spawn 100 nearby black holes`, - maxCount: 9, + description: `spawn nearby black holes`, + maxCount: 1, count: 0, frequency: 0, isNonRefundable: true, @@ -8735,9 +8747,10 @@ const tech = { requires: "", effect() { const unit = { x: 1, y: 0 } - for (let i = 0; i < 100; i++) { - const where = Vector.add(m.pos, Vector.mult(Vector.rotate(unit, Math.random() * 2 * Math.PI), 500 + 200 * Math.random())) - spawn.sucker(where.x, where.y) + for (let i = 0; i < 30; i++) { + const where = Vector.add(m.pos, Vector.mult(Vector.rotate(unit, Math.random() * 2 * Math.PI), 600 + 200 * Math.random())) + spawn.sucker(where.x, where.y, 250) + mob[mob.length - 1].damageReduction = 0.2 } }, remove() {} diff --git a/style.css b/style.css index 53660e3..68f48c7 100644 --- a/style.css +++ b/style.css @@ -27,6 +27,10 @@ select { top: "-15px"; */ } +select option { + background-color: #fff; +} + input { /* font-family: Monaco, monospace; */ padding: 0px 4px; @@ -369,7 +373,8 @@ summary { padding: 10px; border-radius: 8px; border: 2px #333 solid; - background-color: #eee; + /* background-color: #eee; */ + background-color: #fff; } #dmg { diff --git a/todo.txt b/todo.txt index 9d40037..f5a876e 100644 --- a/todo.txt +++ b/todo.txt @@ -1,30 +1,26 @@ ******************************************************** NEXT PATCH ************************************************** -intro screen is more grey -experiment button is larger and darker - -tech: nanowires - needles tunnel through blocks and map, +20% damage - -Occam's razor gives 40->50% damage for each removed tech -determinism no longer removes the cancel button -superdeterminism now removes the cancel button and research, but doesn't remove gun and field power ups -railgun damage is doubled -regression does more damage per hit: 5->6% vs. mobs and 0.5->1% vs. bosses +several tech now have fewer requirements to unlock +some normal tech is now considered gun tech (mostly explosion stuff) +snakeBoss tails, stay attached to each other +"snakeBoss", "blockBoss", "powerupBoss" are now the only bosses bug fixes ******************************************************** TODO ******************************************************** +suggestion: quasarBoss: inverted pulsar boss that hits everything except where its aiming + +pulsar mobs retarget too easily +also they drift around too much + +intro map: diegeticly draw a mouse with field highlighted + also indicate space? + dynamically adjust drawing after picking up a gun + some boss mobs need invulnerability phases maybe trigger immunity to damage for 5-10s after taking the first hit? -static electricity: walking on the ground does something - regen energy - build charge, and discharge to damage mobs - -suggestion: particle accelerator: perfect diamagneticism accelerates projectiles passing through it, increasing their damage and velocity. Alternatively, matter wave's projectiles accelerate, with increased damage the faster they're travelling - -don't in game console log scrap bots increase mass and movement speed at the same time increase jump differently because it scales extra with mass @@ -34,13 +30,6 @@ increase mass and movement speed at the same time tech selection menu choices randomize every second JUNK tech? -needle benefit from pneumatic hammer? -all nails? - -total guntech: - nail gun needle @ 4 - base nail gun @ 5 - new late game level that is easier if you can: platform well, jump high, immune to slime, wormhole through walls, fly fast climb vertically to avoid rising slime populate with multiple boss mobs that can't drop tech