diff --git a/.DS_Store b/.DS_Store index 9d96e85..38c8f0f 100644 Binary files a/.DS_Store and b/.DS_Store differ 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