From 88f595642fd7fed019ed941b80910afaa75401f4 Mon Sep 17 00:00:00 2001 From: landgreen Date: Sat, 19 Jun 2021 07:23:26 -0700 Subject: [PATCH] catabolism and inductive coupling update catabolism - lowers your max health by 1 (was 3 harm) and gives 4 ammo inductive coupling - gives max energy for leftover power ups (was max health) now requires mass-energy equivalence switched to a newer copy, paste URL this seems to fix issues with failed text copy in the level builder if you hold mouse down for over 6 seconds --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 27 +++-- js/index.js | 22 +++- js/level.js | 147 +++++++++++++++-------- js/player.js | 6 +- js/simulation.js | 100 ++++++++-------- js/spawn.js | 6 +- js/tech.js | 302 +++++++++++++++++++++++++++++++++++------------ todo.txt | 10 +- 9 files changed, 415 insertions(+), 205 deletions(-) diff --git a/.DS_Store b/.DS_Store index a208d48aabab7fc5cd4876e37e207f818adfa769..21bb93dcf8ce7024ac3701bdeef9ddb1884405b9 100644 GIT binary patch delta 21 ccmZoMXffEJ#mw|lZ?X=vFQfS8D&{T`07@VRQ~&?~ delta 21 ccmZoMXffEJ#msbwZL$utFQdffD&{T`07gp&1^@s6 diff --git a/js/bullet.js b/js/bullet.js index 5b8132c..e8631be 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -96,13 +96,16 @@ const b = { outOfAmmo() { //triggers after firing when you have NO ammo simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`); m.fireCDcycle = m.cycle + 30; //fire cooldown - if (tech.isAmmoFromHealth) { - if (m.health > 0.03) { - m.damage(0.03 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty - if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered - for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 50 * (Math.random() - 0.5), m.pos.y + 50 * (Math.random() - 0.5), "ammo"); - } - } + if (tech.isAmmoFromHealth && m.maxHealth > 0.01) { + tech.extraMaxHealth -= 0.01 //decrease max health + m.setMaxHealth(); + for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 50 * (Math.random() - 0.5), m.pos.y + 50 * (Math.random() - 0.5), "ammo"); + // if (m.health > 0.03) { + // m.damage(0.03 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty + // if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered + // + // } + // } } }, giveGuns(gun = "random", ammoPacks = 10) { @@ -1206,7 +1209,7 @@ const b = { didExtruderDrain: false, canExtruderFire: true, extruder() { - const DRAIN = 0.0006 + m.fieldRegen + const DRAIN = 0.0007 + m.fieldRegen if (m.energy > DRAIN && b.canExtruderFire) { m.energy -= DRAIN if (m.energy < 0) { @@ -1225,7 +1228,7 @@ const b = { frictionAir: 0, isInHole: true, //this keeps the bullet from entering wormholes minDmgSpeed: 0, - dmg: b.dmgScale * 1.5, //damage also changes when you divide by mob.mass on in .do() + dmg: b.dmgScale * 1.4, //damage also changes when you divide by mob.mass on in .do() classType: "bullet", isBranch: false, restitution: 0, @@ -2107,7 +2110,7 @@ const b = { } } //power ups - if (!this.isImproved && !simulation.isChoosing && !tech.isExtraMaxHealth) { + if (!this.isImproved && !simulation.isChoosing && !tech.isExtraMaxEnergy) { if (this.lockedOn) { //grab, but don't lock onto nearby power up for (let i = 0, len = powerUp.length; i < len; ++i) { @@ -3460,8 +3463,8 @@ const b = { name: "shotgun", description: "fire a wide burst of short range bullets", ammo: 0, - ammoPack: 5.5, - defaultAmmoPack: 5.5, + ammoPack: 5, + defaultAmmoPack: 5, have: false, do() {}, fire() { diff --git a/js/index.js b/js/index.js index b37ed73..96aa9ab 100644 --- a/js/index.js +++ b/js/index.js @@ -504,13 +504,30 @@ const build = { if (isCustom) { url += `&level=${Math.abs(Number(document.getElementById("starting-level").value))}` url += `&noPower=${Number(document.getElementById("no-power-ups").checked)}` - alert('n-gon build URL copied to clipboard.\nPaste into browser address bar.') + // alert('n-gon build URL copied to clipboard.\nPaste into browser address bar.') } else { simulation.makeTextLog("n-gon build URL copied to clipboard.
Paste into browser address bar.") } console.log('n-gon build URL copied to clipboard.\nPaste into browser address bar.') console.log(url) - simulation.copyToClipBoard(url) + + navigator.clipboard.writeText(url).then(function() { + /* clipboard successfully set */ + if (isCustom) { + setTimeout(function() { + alert('n-gon build URL copied to clipboard.\nPaste into browser address bar.') + }, 300); + } + }, function() { + /* clipboard write failed */ + if (isCustom) { + setTimeout(function() { + alert('copy failed') + }, 300); + } + console.log('copy failed') + }); + }, startExperiment() { build.isExperimentSelection = false; @@ -1165,7 +1182,6 @@ function cycle() { simulation.clearMap(); level.start(); } - simulation.loop(); // if (isNaN(m.health) || isNaN(m.energy)) { // console.log(`m.health = ${m.health}`) diff --git a/js/level.js b/js/level.js index 1d23970..e4b025d 100644 --- a/js/level.js +++ b/js/level.js @@ -80,9 +80,9 @@ const level = { simulation.draw.setPaths(); b.respawnBots(); m.resetHistory(); - if (tech.isExtraMaxHealth) { - tech.extraMaxHealth += Math.min(0.03 * powerUps.totalPowerUps, 0.51) - m.setMaxHealth(); + if (tech.isExtraMaxEnergy) { + tech.healMaxEnergyBonus += 0.03 * powerUps.totalPowerUps //Math.min(0.02 * powerUps.totalPowerUps, 0.51) + m.setMaxEnergy(); } if (tech.isGunCycle) { b.inventoryGun++; @@ -1099,9 +1099,7 @@ const level = { doCustomTopLayer = [] offset = { x: 0, y: 0 } enterOptions = [ - () => { //lasers - const x = offset.x - const y = offset.y + (x = offset.x, y = offset.y) => { //lasers level.setPosToSpawn(x + 2300, y - 800); spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); spawn.mapRect(x + 1850, y - 1350, 50, 450); //entrance left wall @@ -1163,9 +1161,7 @@ const level = { // } ] exitOptions = [ - () => { //8 spinners - const x = offset.x - const y = offset.y + (x = offset.x, y = offset.y) => { //8 spinners level.exit.x = x + 1250; level.exit.y = y - 980; spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20); @@ -1188,7 +1184,7 @@ const level = { spawn.bodyRect(x + 1075, y - 1075, 100, 125, 0.25); spawn.bodyRect(x + 1450, y - 1050, 100, 100, 0.25); - const density = 0.001 + const density = 0.0015 + (simulation.difficultyMode < 3 ? 0.003 : 0) const angle = 0 const variance = Math.PI const frictionAir = 0 @@ -1240,9 +1236,7 @@ const level = { } ) }, - () => { //7 spinners - const x = offset.x - const y = offset.y + (x = offset.x, y = offset.y) => { //7 spinners level.exit.x = x + 2450; level.exit.y = y - 980; spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20); @@ -1252,33 +1246,39 @@ const level = { spawn.bodyRect(x + 1275, y - 475, 125, 125, 0.25); spawn.bodyRect(x + 1825, y - 125, 125, 125, 0.25); spawn.bodyRect(x + 500, y - 100, 125, 100, 0.25); - spawn.bodyRect(x + 0, y - 150, 100, 150, 0.25); + spawn.bodyRect(x + 800, y - 150, 100, 150, 0.25); spawn.bodyRect(x + 2375, y - 150, 125, 150, 0.25); if (Math.random() > 0.5) { - const density = 0.0013 + const density = 0.0012 + (simulation.difficultyMode < 3 ? 0.002 : 0) const angle = Math.PI / 2 - const variance = 0.3 //Math.PI - const frictionAir = 0.01 - balance1 = level.spinner(x + 1150, y - 500, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) { - balance3 = level.spinner(x + 600, y - 600, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance2 = level.spinner(x + 125, y - 850, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance4 = level.spinner(x + 650, y - 1145, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance5 = level.spinner(x + 1100, y - 1145, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance6 = level.spinner(x + 1550, y - 1145, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance7 = level.spinner(x + 2000, y - 1145, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) + const variance = 0.2 //Math.PI + const frictionAir = 0.012 + const height = 35 + balance1 = level.spinner(x + 1150, y - 500, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) { + balance3 = level.spinner(x + 600, y - 600, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) + balance2 = level.spinner(x + 125, y - 850, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) + balance4 = level.spinner(x + 650, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) + balance5 = level.spinner(x + 1100, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) + balance6 = level.spinner(x + 1550, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) + balance7 = level.spinner(x + 2000, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) } else { - const density = 0.0013 + const density = 0.001 + (simulation.difficultyMode < 3 ? 0.002 : 0) const angle = Math.PI / 2 - const variance = 0 //Math.PI - const frictionAir = 0.01 - balance1 = level.spinner(x + 150, y - 500, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) { - balance2 = level.spinner(x + 2300, y - 550, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance4 = level.spinner(x + 1850, y - 550, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance3 = level.spinner(x + 650, y - 700, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance5 = level.spinner(x + 1100, y - 900, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance6 = level.spinner(x + 1550, y - 900, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) - balance7 = level.spinner(x + 1970, y - 1150, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) + const variance = Math.PI + const frictionAir = 0 + const width = 200 + const height = 200 + const angularVelocity = 0.01 + const spinVariance = 0.02 + + balance1 = level.spinner(x + 50, y - 350, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) { + balance4 = level.spinner(x + 350, y - 550, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) + balance3 = level.spinner(x + 650, y - 700, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) + balance5 = level.spinner(x + 950, y - 850, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) + balance2 = level.spinner(x + 1250, y - 650, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) + balance6 = level.spinner(x + 1600, y - 850, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) + balance7 = level.spinner(x + 2000, y - 800, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) } spawn.randomMob(x + 1175, y - 725, 0.1); spawn.randomMob(x + 1450, y - 725, 0.2); @@ -1314,35 +1314,78 @@ const level = { } ] emptyOptions = [ //nothing good here - () => { - const x = offset.x - const y = offset.y + (x = offset.x, y = offset.y) => { if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) spawn.randomLevelBoss(x + 1250, y - 600); } ] lootOptions = [ //has some power up reward //field, ammo, research, gun - () => { - const x = offset.x - const y = offset.y + (x = offset.x, y = offset.y) => { powerUps.spawnStartingPowerUps(x + 1250, y - 100); } ] upDownOptions = [ //extra tall vertical section 3000x3000 //this is where the level boss is - () => { - const x = offset.x - const y = offset.y + (x = offset.x, y = offset.y) => { + const elevator1 = level.elevator(x + 1100, y - 200, 250, 30, -2100, 0.0015) // elevator(x, y, width, height, maxHeight, force = 0.003, friction = { up: 0.01, down: 0.2 }, isTeleport = false) { + const toggle = level.toggle(650, 0, false, true) // toggle(x, y, isOn = false, isLockOn = false) { + toggle.isAddedElements = false - - const elevator = level.elevator(x + 1200, y - 100, 380, 50, -2000, 0.001) // elevator(x, y, width, height, maxHeight, force = 0.003, friction = { up: 0.01, down: 0.2 }, isTeleport = false) { - - // if (simulation.difficulty > 3) - spawn.randomLevelBoss(x + 1250, y - 1400); doCustomTopLayer.push( () => { - elevator.move() + elevator1.move() + toggle.query(); + if (toggle.isOn && !toggle.isAddedElements) { + toggle.isAddedElements = true //only do this once + + // if (simulation.difficulty > 3) + spawn.randomLevelBoss(x + 1250, y - 1400); + + spawn.mapRect(1375, -1400, 1375, 1225); + len = map.length - 1 + map[len].collisionFilter.category = cat.map; + map[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet; + Matter.Body.setStatic(map[len], true); //make static + World.add(engine.world, map[len]); //add to world + + // spawn.mapRect(1800, -1825, 725, 1550); + spawn.mapRect(-175, -1400, 1250, 1225); + len = map.length - 1 + map[len].collisionFilter.category = cat.map; + map[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet; + Matter.Body.setStatic(map[len], true); //make static + World.add(engine.world, map[len]); //add to world + + //see map in world + simulation.draw.setPaths() //update map graphics + } } ) + }, + (x = offset.x, y = offset.y) => { + const elevator1 = level.elevator(x + 1100, y - 200, 250, 30, -2100, 0.0015) // elevator(x, y, width, height, maxHeight, force = 0.003, friction = { up: 0.01, down: 0.2 }, isTeleport = false) { + // const elevator1 = level.elevator(x + 175, y - 200, 250, 30, -1400, 0.001) + // const elevator2 = level.elevator(x + 2175, y - 200, 250, 30, -1400, 0.001) + spawn.mapRect(-200, -1400, 350, 50); //up left door ledge + spawn.mapRect(2450, -1400, 350, 50); //up right door ledge + + spawn.mapRect(225, -450, 350, 350); //left crawl zone + // spawn.mapRect(725, -175, 275, 75); + spawn.mapRect(725, -225, 350, 100); + spawn.mapRect(275, -750, 200, 200); + spawn.mapRect(1375, -700, 500, 750); //right side big elevator wall + spawn.mapRect(2375, -325, 350, 50); + spawn.mapRect(1800, -500, 250, 50); + + //up high elevator + spawn.mapRect(1375, -2100, 500, 175); + spawn.mapRect(600, -2100, 475, 175); + + if (simulation.difficulty > 3) spawn.randomLevelBoss(x + 1250, y - 1400); + doCustomTopLayer.push( + () => { + elevator1.move() + } + ) } ] //pick which type of room spawns @@ -1350,8 +1393,8 @@ const level = { exit = exitOptions[Math.floor(Math.random() * exitOptions.length)]; empty = emptyOptions[Math.floor(Math.random() * emptyOptions.length)]; loot = lootOptions[Math.floor(Math.random() * lootOptions.length)]; - upDown = upDownOptions[Math.floor(Math.random() * upDownOptions.length)]; - + // upDown = upDownOptions[Math.floor(Math.random() * upDownOptions.length)]; + upDown = upDownOptions[0] //********************************* DO !NOT! RUN THIS LINE IN THE FINAL VERSION *************************************** //3x2: 4 short rooms (3000x1500), 1 double tall room (3000x3000) //rooms let rooms = ["enter", "empty", "loot", "exit"] @@ -1457,7 +1500,7 @@ const level = { }; powerUps.addResearchToLevel() //needs to run after mobs are spawned - level.setPosToSpawn(0, 0); //********************************* DO !NOT! RUN THIS LINE IN THE FINAL VERSION *************************************** + level.setPosToSpawn(200, -100); //********************************* DO !NOT! RUN THIS LINE IN THE FINAL VERSION *************************************** }, null() { level.levels.pop(); //remove lore level from rotation diff --git a/js/player.js b/js/player.js index c6f6036..4b9d2e4 100644 --- a/js/player.js +++ b/js/player.js @@ -628,7 +628,7 @@ const m = { } if (tech.isEnergyHealth) { - m.energy -= dmg * 1.1; + m.energy -= dmg * 1.15; if (m.energy < 0 || isNaN(m.energy)) { //taking deadly damage if (tech.isDeathAvoid && powerUps.research.count && !tech.isDeathAvoidedThisLevel) { tech.isDeathAvoidedThisLevel = true @@ -1312,7 +1312,7 @@ const m = { x: player.velocity.x - (15 * unit.x) / massRoot, y: player.velocity.y - (15 * unit.y) / massRoot }); - if (mob[i].isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 }); + if (who.isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 }); if (m.crouch) { Matter.Body.setVelocity(player, { @@ -1332,7 +1332,7 @@ const m = { x: player.velocity.x - (20 * unit.x) / massRoot, y: player.velocity.y - (20 * unit.y) / massRoot }); - if (mob[i].isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 }); + if (who.isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 }); if (who.isDropPowerUp && player.speed < 12) { const massRootCap = Math.sqrt(Math.min(10, Math.max(0.4, who.mass))); // masses above 12 can start to overcome the push back diff --git a/js/simulation.js b/js/simulation.js index e75b58b..522c074 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -1104,42 +1104,6 @@ const simulation = { // if line1 and line2 are segments, they intersect if both of the above are true return result; }, - copyToClipBoard(value) { - // Create a fake textarea - const textAreaEle = document.createElement('textarea'); - - // Reset styles - textAreaEle.style.border = '0'; - textAreaEle.style.padding = '0'; - textAreaEle.style.margin = '0'; - - // Set the absolute position - // User won't see the element - textAreaEle.style.position = 'absolute'; - textAreaEle.style.left = '-9999px'; - textAreaEle.style.top = `0px`; - - // Set the value - textAreaEle.value = value - - // Append the textarea to body - document.body.appendChild(textAreaEle); - - // Focus and select the text - textAreaEle.focus(); - textAreaEle.select(); - - // Execute the "copy" command - try { - document.execCommand('copy'); - } catch (err) { - // Unable to copy - console.log(err) - } finally { - // Remove the textarea - document.body.removeChild(textAreaEle); - } - }, constructMouseDownPosition: { x: 0, y: 0 @@ -1160,18 +1124,6 @@ const simulation = { ctx.strokeRect(x, y, dx, dy); } }, - outputMapString(string) { - if (string) simulation.constructMapString.push(string) //store command as a string in the next element of an array - let out = "" //combine set of map strings to one string - let outHTML = "" - for (let i = 0, len = simulation.constructMapString.length; i < len; i++) { - out += simulation.constructMapString[i]; - outHTML += "
" + simulation.constructMapString[i] + "
" - } - console.log(out) - simulation.copyToClipBoard(out) - document.getElementById("construct").innerHTML = outHTML - }, enableConstructMode() { simulation.isConstructionMode = true; simulation.isHorizontalFlipped = false; @@ -1203,8 +1155,8 @@ const simulation = { map[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet; Matter.Body.setStatic(map[len], true); //make static World.add(engine.world, map[len]); //add to world - simulation.draw.setPaths() //update map graphics + } else if (e.which === 3) { //add body simulation.outputMapString(`spawn.bodyRect(${x}, ${y}, ${dx}, ${dy});`); @@ -1246,5 +1198,53 @@ const simulation = { simulation.outputMapString(); } }); - } + }, + outputMapString(string) { + if (string) simulation.constructMapString.push(string) //store command as a string in the next element of an array + let out = "" //combine set of map strings to one string + let outHTML = "" + for (let i = 0, len = simulation.constructMapString.length; i < len; i++) { + out += simulation.constructMapString[i]; + outHTML += "
" + simulation.constructMapString[i] + "
" + } + console.log(out) + navigator.clipboard.writeText(out).then(function() { /* clipboard successfully set */ }, function() { /* clipboard write failed */ console.log('copy failed') }); + document.getElementById("construct").innerHTML = outHTML + }, + // copyToClipBoard(value) { + // // Create a fake textarea + // const textAreaEle = document.createElement('textarea'); + + // // Reset styles + // textAreaEle.style.border = '0'; + // textAreaEle.style.padding = '0'; + // textAreaEle.style.margin = '0'; + + // // Set the absolute position + // // User won't see the element + // textAreaEle.style.position = 'absolute'; + // textAreaEle.style.left = '-9999px'; + // textAreaEle.style.top = `0px`; + + // // Set the value + // textAreaEle.value = value + + // // Append the textarea to body + // document.body.appendChild(textAreaEle); + + // // Focus and select the text + // textAreaEle.focus(); + // textAreaEle.select(); + + // // Execute the "copy" command + // try { + // document.execCommand('copy'); + // } catch (err) { + // // Unable to copy + // console.log(err) + // } finally { + // // Remove the textarea + // document.body.removeChild(textAreaEle); + // } + // }, }; \ No newline at end of file diff --git a/js/spawn.js b/js/spawn.js index 2cae736..c4c39a4 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -1477,7 +1477,7 @@ const spawn = { mobs.spawn(x, y, 0, radius, "transparent"); let me = mob[mob.length - 1]; Matter.Body.setDensity(me, 0.25); //extra dense //normal is 0.001 - me.laserRange = 350; + me.laserRange = 300; me.seeAtDistance2 = 2000000; me.isBoss = true; me.showHealthBar = false; //drawn in this.awake @@ -1534,9 +1534,9 @@ const spawn = { const rotation = simulation.cycle * 0.015 const phase = simulation.cycle * 0.021 ctx.lineWidth = 1; - ctx.fillStyle = "rgba(150,0,255,0.1)" + ctx.fillStyle = "rgba(150,0,255,0.05)" ctx.strokeStyle = "#70f" - for (let i = 0, len = 7; i < len; i++) { + for (let i = 0, len = 6; i < len; i++) { ctx.beginPath(); ctx.ellipse(this.position.x, this.position.y, this.laserRange * Math.abs(Math.sin(phase + i / len * Math.PI)), this.laserRange, rotation, 0, 2 * Math.PI); ctx.fill(); diff --git a/js/tech.js b/js/tech.js index 2b072ee..6fc84c3 100644 --- a/js/tech.js +++ b/js/tech.js @@ -181,7 +181,7 @@ return dmg * tech.slowFire * tech.aimDamage }, duplicationChance() { - return (tech.isPowerUpsVanish ? 0.2 : 0) + (tech.isStimulatedEmission ? 0.22 : 0) + tech.cancelCount * 0.047 + tech.duplicateChance + m.duplicateChance + return (tech.isPowerUpsVanish ? 0.2 : 0) + (tech.isStimulatedEmission ? 0.22 : 0) + tech.cancelCount * 0.05 + tech.duplicateChance + m.duplicateChance }, maxDuplicationEvent() { if (tech.is100Duplicate && tech.duplicationChance() > 0.99) { @@ -204,6 +204,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return b.inventory.length === 1 //&& !tech.haveGunCheck("CPT gun") }, @@ -233,6 +234,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return b.inventory.length > 1 && !tech.isEnergyHealth }, @@ -254,6 +256,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return b.inventory.length > 1 }, @@ -271,6 +274,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return b.inventory.length > 1 }, @@ -290,6 +294,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.isDamageForGuns || tech.isFireRateForGuns) && (b.inventory.length + 5) < b.guns.length }, @@ -364,6 +369,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isEnergyNoAmmo }, @@ -381,6 +387,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, isNonRefundable: true, isBadRandomOption: true, allowed() { @@ -397,14 +404,15 @@ }, { name: "catabolism", - description: "when you fire while out of ammo
gain 4 ammo, but lose 3 health", + description: "when you fire while out of ammo
gain 4 ammo, but lose 1 max health", maxCount: 1, count: 0, - frequency: 2, + frequency: 1, + frequencyDefault: 1, allowed() { - return m.harmReduction() < 1 && !tech.isEnergyHealth && !tech.isEnergyNoAmmo + return !tech.isEnergyHealth && !tech.isEnergyNoAmmo }, - requires: "some harm reduction, not mass-energy equivalence, exciton-lattice", + requires: "not mass-energy equivalence or exciton-lattice", effect: () => { tech.isAmmoFromHealth = true; }, @@ -418,6 +426,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return true }, @@ -471,6 +480,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !m.isShipMode && !tech.isAlwaysFire }, @@ -494,6 +504,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return true }, @@ -515,6 +526,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.Fx > 0.016 && !tech.isEnergyHealth }, @@ -532,6 +544,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.Fx > 0.016 }, @@ -549,6 +562,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return true }, @@ -566,6 +580,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return true }, @@ -584,6 +599,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return true }, @@ -621,6 +637,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isStunField || tech.oneSuperBall || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isExplosionStun }, @@ -638,6 +655,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isBulletsLastLonger > 1 }, @@ -656,6 +674,7 @@ maxCount: 3, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb || tech.isIceField || tech.relayIce || tech.blockingIce > 1 }, @@ -673,6 +692,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isNailRadiation || tech.isWormholeDamage || tech.isNeutronBomb || tech.isExplodeRadio }, @@ -690,6 +710,7 @@ 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.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) }, @@ -707,6 +728,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) }, @@ -724,6 +746,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) }, @@ -760,6 +783,7 @@ maxCount: 1, count: 0, frequency: 1, + frequencyDefault: 1, allowed() { return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) }, @@ -778,6 +802,7 @@ maxCount: 1, count: 0, frequency: 1, + frequencyDefault: 1, allowed() { return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) }, @@ -796,6 +821,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isMissileField || tech.isExplodeMob || tech.isPulseLaser || tech.isBlockExplosion }, @@ -813,6 +839,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return ((m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)) || tech.haveGunCheck("drones") || tech.haveGunCheck("super balls") || tech.haveGunCheck("shotgun")) && !tech.isNailShot }, @@ -830,6 +857,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.haveGunCheck("rail gun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1 }, @@ -847,6 +875,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath }, @@ -864,6 +893,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath }, @@ -881,6 +911,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath }, @@ -901,6 +932,7 @@ maxCount: 3, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling || tech.iceIXOnDeath }, @@ -923,6 +955,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (b.totalBots() > 1 || tech.haveGunCheck("mine") || tech.haveGunCheck("spores") || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing") && !tech.isEnergyHealth }, @@ -940,6 +973,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isNoFireDefense }, @@ -1438,6 +1472,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name !== "wormhole" }, @@ -1473,6 +1508,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isBlockExplosion }, @@ -1544,6 +1580,7 @@ maxCount: 9, count: 0, frequency: 1, + frequencyDefault: 1, allowed() { return true }, @@ -1562,6 +1599,7 @@ maxCount: 3, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return true //tech.collisionImmuneCycles > 30 }, @@ -1611,6 +1649,7 @@ maxCount: 1, count: 0, frequency: 1, + frequencyDefault: 1, allowed() { return !tech.isRelay }, @@ -1648,6 +1687,7 @@ maxCount: 1, count: 0, frequency: 1, + frequencyDefault: 1, allowed() { return !tech.isFlipFlop }, @@ -1743,6 +1783,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob }, @@ -1760,6 +1801,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isIceField || tech.relayIce || tech.blockingIce || tech.iceIXOnDeath }, @@ -1777,6 +1819,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1 || tech.iceIXOnDeath }, @@ -1794,6 +1837,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isStunField || tech.isExplosionStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.relayIce || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage || tech.blockingIce > 1 || tech.iceIXOnDeath }, @@ -1829,6 +1873,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return simulation.fpsCapDefault > 45 }, @@ -1868,6 +1913,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.harmReduction() < 1 }, @@ -1888,6 +1934,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isEnergyHealth && m.harmReduction() < 1 }, @@ -1905,6 +1952,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.harmReduction() < 1 }, @@ -1922,6 +1970,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { //&& (m.fieldUpgrades[m.fieldMode].name !== "nano-scale manufacturing" || m.maxEnergy > 1) return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name !== "standing wave harmonics" && !tech.isEnergyHealth && !tech.isRewindGun }, @@ -1957,6 +2006,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isExplosionHarm && tech.isRewindAvoidDeath }, @@ -1974,6 +2024,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isEnergyHealth && (m.harmReduction() < 1 || tech.isFlipFlopHarm) }, @@ -1992,6 +2043,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isBlockExplosion) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth }, @@ -2011,13 +2063,13 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { - return !tech.isNoHeals && !tech.isEnergyLoss && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isRewindGun && !tech.isSpeedHarm && m.fieldUpgrades[m.fieldMode].name !== "negative mass field" && !tech.isHealLowHealth && !tech.isTechDamage + return !tech.isAmmoFromHealth && !tech.isNoHeals && !tech.isEnergyLoss && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isRewindGun && !tech.isSpeedHarm && m.fieldUpgrades[m.fieldMode].name !== "negative mass field" && !tech.isHealLowHealth && !tech.isTechDamage }, requires: "not exothermic process, piezoelectricity, CPT, 1st law, negative mass , ...", effect: () => { m.health = 0 - // m.displayHealth(); document.getElementById("health").style.display = "none" document.getElementById("health-bg").style.display = "none" document.getElementById("dmg").style.backgroundColor = "#0cf"; @@ -2041,6 +2093,7 @@ maxCount: 1, count: 0, frequency: 3, + frequencyDefault: 3, allowed() { return tech.isEnergyHealth && !tech.isNoHeals }, @@ -2054,19 +2107,56 @@ }, remove() { tech.healGiveMaxEnergy = false; - tech.healMaxEnergyBonus = 0 + // tech.healMaxEnergyBonus = 0 powerUps.heal.color = "#0eb" for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color } } }, + { + name: "inductive coupling", + description: "each unused power up at the end of a level
adds 3 max energy", // (up to 51 health per level)", + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isEnergyHealth && !tech.isDroneGrab + }, + requires: "mass-energy equivalence, not drone harvester", + effect() { + tech.isExtraMaxEnergy = true; //tracked by tech.extraMaxHealth + }, + remove() { + tech.isExtraMaxEnergy = false; + } + }, + { + name: "transceiver chip", + description: "unused power ups at the end of each level
are still activated (selections are random)", + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isExtraMaxEnergy + }, + requires: "inductive coupling", + effect() { + tech.isEndLevelPowerUp = true; + }, + remove() { + tech.isEndLevelPowerUp = false; + } + }, { name: "electrolytes", description: "increase damage by 1%
for every 9 stored energy", maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.maxEnergy > 1 || tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isBlockExplosion }, @@ -2084,6 +2174,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.haveGunCheck("nail gun") && tech.isIceCrystals) || tech.haveGunCheck("laser") || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, @@ -2101,6 +2192,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isEnergyHealth }, @@ -2156,6 +2248,7 @@ maxCount: 9, count: 0, frequency: 1, + frequencyDefault: 1, allowed() { return true }, @@ -2177,6 +2270,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isRailEnergyGain || tech.isWormholeEnergy || tech.iceEnergy > 0 || tech.isMassEnergy || tech.isBlockExplosion }, @@ -2196,6 +2290,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.damageFromTech() > 1 }, @@ -2250,6 +2345,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return true }, @@ -2285,6 +2381,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.health < 0.5 || build.isExperimentSelection }, @@ -2302,6 +2399,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (m.harmReduction() < 1 || tech.healthDrain || tech.isLowHealthDmg || tech.isHealthRecovery || tech.isHealLowHealth || tech.largerHeals > 1) && !tech.isEnergyHealth }, @@ -2337,6 +2435,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.maxHealth > 1; }, @@ -2374,8 +2473,8 @@ description: "increase your maximum health by 100
landings that force you to crouch cause harm", maxCount: 1, count: 0, - frequency: 1, - frequencyDefault: 1, + frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isEnergyHealth && !tech.isNoHeals }, @@ -2395,8 +2494,8 @@ description: "if you're at full health heal power ups do harm
but they also increase your maximum health", maxCount: 1, count: 0, - frequency: 1, - frequencyDefault: 1, + frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isEnergyHealth && !tech.isNoHeals }, @@ -2408,54 +2507,18 @@ tech.isOverHeal = false; } }, - { - name: "inductive coupling", - description: "for each unused power up at the end of a level
add 3 max health (up to 51 health per level)", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return !tech.isEnergyHealth && !tech.isDroneGrab && !tech.isNoHeals - }, - requires: "not mass-energy equivalence, not drone harvester, ergodicity", - effect() { - tech.isExtraMaxHealth = true; //tracked by tech.extraMaxHealth - }, - remove() { - tech.isExtraMaxHealth = false; - // tech.extraMaxHealth = 0; //this is now reset in tech.setupAllTech(); - m.setMaxHealth(); - } - }, - { - name: "transceiver chip", - description: "unused power ups at the end of each level
are still activated (selections are random)", - maxCount: 1, - count: 0, - frequency: 2, - allowed() { - return tech.isExtraMaxHealth - }, - requires: "inductive coupling", - effect() { - tech.isEndLevelPowerUp = true; - }, - remove() { - tech.isEndLevelPowerUp = false; - } - }, { name: "negentropy", description: `at the start of each level
spawn a heal for every 33 missing health`, maxCount: 1, count: 0, - frequency: 2, + frequency: 1, + frequencyDefault: 1, isHealTech: true, allowed() { - return m.health > 0.1 && (m.maxHealth > 1 || tech.isExtraMaxHealth) && !tech.isNoHeals + return m.health > 0.1 && !tech.isNoHeals }, - requires: "increased max health, not ergodicity", + requires: "has some health, not ergodicity", effect() { tech.isHealLowHealth = true; }, @@ -2469,6 +2532,7 @@ maxCount: 3, count: 0, frequency: 2, + frequencyDefault: 2, isHealTech: true, allowed() { return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth && !tech.isNoHeals @@ -2514,6 +2578,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, isHealTech: true, allowed() { return powerUps.research.count > 0 || build.isExperimentSelection @@ -2554,6 +2619,7 @@ maxCount: 1, count: 0, frequency: 4, + frequencyDefault: 4, allowed() { return !tech.isSwitchReality && !tech.isResearchReality && tech.isDeathAvoid && !tech.isCollisionRealitySwitch }, @@ -2631,6 +2697,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (powerUps.research.count > 2 || build.isExperimentSelection) && !tech.isDeterminism }, @@ -2650,6 +2717,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (powerUps.research.count > 3 || build.isExperimentSelection) && !tech.isSuperDeterminism && !tech.isRerollHaste }, @@ -2667,6 +2735,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return powerUps.research.count === 0 && !tech.isAnsatz }, @@ -2688,6 +2757,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste }, @@ -2705,6 +2775,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return powerUps.research.count > 4 || build.isExperimentSelection }, @@ -2722,6 +2793,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, isNonRefundable: true, isBadRandomOption: true, allowed() { @@ -2846,29 +2918,9 @@ powerUps.setDo(); //needed after adjusting duplication chance } }, - // { - // name: "attract", - // description: "", - // maxCount: 1, - // count: 0, - // frequency: 1, - // frequencyDefault: 1, - // allowed() { - // return true - // }, - // requires: "", - // effect: () => { - // tech.isPowerUpsAttract = true - // powerUps.setDo(); //needed after adjusting duplication chance - // }, - // remove() { - // tech.isPowerUpsAttract = false - // powerUps.setDo(); //needed after adjusting duplication chance - // } - // }, { name: "futures exchange", - description: "clicking × to cancel a field, tech, or gun
adds 4.7% power up duplication chance", + description: "clicking × to cancel a field, tech, or gun
adds 5% power up duplication chance", maxCount: 1, count: 0, frequency: 1, @@ -2894,6 +2946,7 @@ maxCount: 1, count: 0, frequency: 1, + frequencyDefault: 1, allowed() { return !tech.isDeterminism }, @@ -2911,6 +2964,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.duplicationChance() > 0.15 }, @@ -2928,6 +2982,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.duplicationChance() > 0 }, @@ -2945,6 +3000,7 @@ maxCount: 1, count: 0, frequency: 6, + frequencyDefault: 6, allowed() { return tech.duplicationChance() > 0.66 }, @@ -3116,6 +3172,7 @@ maxCount: 1, count: 0, frequency: 1, + frequencyDefault: 1, isNonRefundable: true, isBadRandomOption: true, allowed() { @@ -3143,6 +3200,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return !tech.isDeterminism }, @@ -3267,6 +3325,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (b.totalBots() > 3 || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection || }, @@ -3310,6 +3369,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isRivets }, @@ -3348,6 +3408,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isNeedles && !tech.isNailRadiation }, @@ -3366,6 +3427,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isNeedles }, @@ -3398,6 +3460,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isRivets }, @@ -3416,6 +3479,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isRivets && !tech.isNeedles && !tech.isNailRadiation && !tech.isNailCrit }, @@ -3453,6 +3517,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles }, @@ -3479,6 +3544,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("nail gun") && tech.nailFireRate && !tech.isIceCrystals }, @@ -3505,6 +3571,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.isNailShot || tech.nailBotCount > 1 || tech.haveGunCheck("nail gun")) && !tech.isIceCrystals }, @@ -3523,6 +3590,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + tech.isNailShot + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce)) * 2 > 1) && !tech.isIceCrystals }, @@ -3541,6 +3609,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isNailRadiation && !tech.isFastRadiation }, @@ -3559,6 +3628,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isNailRadiation && !tech.isSlowRadiation }, @@ -3572,11 +3642,12 @@ }, { name: "shotgun spin-statistics", - description: "immune to harm while firing the shotgun
ammo costs are doubled", + description: "immune to harm while firing the shotgun
shotgun ammo gives 50% less shots", isGunTech: true, maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("shotgun") }, @@ -3617,6 +3688,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isSlugShot }, @@ -3635,6 +3707,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("shotgun") && !tech.isNailShot }, @@ -3653,6 +3726,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("shotgun") }, @@ -3671,6 +3745,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("super balls") && !tech.oneSuperBall }, @@ -3689,6 +3764,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("super balls") && !tech.oneSuperBall }, @@ -3715,6 +3791,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("super balls") && tech.superBallNumber === 3 && !tech.superBallDelay }, @@ -3741,6 +3818,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("super balls") }, @@ -3759,6 +3837,7 @@ maxCount: 3, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("wave beam") }, @@ -3777,6 +3856,7 @@ maxCount: 3, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("wave beam") }, @@ -3800,6 +3880,7 @@ maxCount: 3, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("wave beam") }, @@ -3820,6 +3901,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("wave beam") }, @@ -3840,6 +3922,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("wave beam") }, @@ -3858,6 +3941,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("missiles") || tech.isMissileField }, @@ -3876,6 +3960,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("missiles") }, @@ -3894,6 +3979,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, isBot: true, isBotTech: true, allowed() { @@ -3917,6 +4003,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("grenades") }, @@ -3937,6 +4024,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("grenades") && !tech.isNeutronBomb }, @@ -3957,6 +4045,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("grenades") && !tech.fragments && !tech.isVacuumBomb }, @@ -3977,6 +4066,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isNeutronBomb }, @@ -3995,6 +4085,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isNeutronBomb }, @@ -4013,6 +4104,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineSentry }, @@ -4031,6 +4123,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("mine") && !tech.isMineSentry }, @@ -4049,6 +4142,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineAmmoBack && !tech.isLaserMine }, @@ -4088,6 +4182,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("spores") }, @@ -4106,6 +4201,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField }, @@ -4125,6 +4221,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField }, @@ -4143,6 +4240,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField }, @@ -4161,6 +4259,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField) && !tech.isEnergyHealth }, @@ -4179,6 +4278,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)) }, @@ -4197,8 +4297,9 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { - return !tech.isExtraMaxHealth && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) + return !tech.isExtraMaxEnergy && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) }, requires: "drones, not inductive coupling", effect() { @@ -4215,6 +4316,7 @@ maxCount: 3, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)) }, @@ -4241,6 +4343,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("drones") }, @@ -4259,6 +4362,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("foam") || tech.foamBotCount > 1 }, @@ -4277,6 +4381,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("foam") || tech.foamBotCount > 1 }, @@ -4297,6 +4402,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("foam") || tech.foamBotCount > 1 }, @@ -4315,6 +4421,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("foam") }, @@ -4333,6 +4440,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("foam") }, @@ -4351,6 +4459,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("rail gun") }, @@ -4369,6 +4478,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("rail gun") }, @@ -4387,6 +4497,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("rail gun") }, @@ -4405,6 +4516,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("laser") || tech.laserBotCount > 1 || tech.isLaserMine }, @@ -4423,6 +4535,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.haveGunCheck("laser") && !tech.isPulseLaser) || tech.laserBotCount > 1 }, @@ -4442,6 +4555,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.laserBotCount > 1) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser }, @@ -4464,6 +4578,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("laser") && !tech.isWideLaser && !tech.isPulseAim && !tech.historyLaser }, @@ -4490,6 +4605,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser && !tech.historyLaser }, @@ -4518,6 +4634,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("laser") && tech.isWideLaser }, @@ -4546,6 +4663,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isWideLaser }, @@ -4574,6 +4692,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser }, @@ -4600,6 +4719,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return tech.isPulseLaser && !tech.beamSplitter }, @@ -4623,6 +4743,7 @@ maxCount: 9, count: 0, frequency: 3, + frequencyDefault: 3, allowed() { return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" }, @@ -4646,6 +4767,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" }, @@ -4665,6 +4787,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" }, @@ -4683,6 +4806,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" }, @@ -4701,6 +4825,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" }, @@ -4719,6 +4844,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" }, @@ -4840,6 +4966,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) }, @@ -4863,6 +4990,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (build.isExperimentSelection || powerUps.research.count > 2) && m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) }, @@ -4886,6 +5014,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab) }, @@ -4909,6 +5038,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, @@ -4928,6 +5058,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field") && !tech.isEnergyHealth }, @@ -4946,6 +5077,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "negative mass field" }, @@ -4964,6 +5096,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "negative mass field" }, @@ -4982,6 +5115,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "time dilation field" }, @@ -5041,6 +5175,7 @@ maxCount: 9, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isExtruder }, @@ -5059,6 +5194,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" }, @@ -5077,6 +5213,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && tech.isPlasmaRange === 1 }, @@ -5095,6 +5232,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "time dilation field" }, @@ -5115,6 +5253,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "time dilation field" }, @@ -5139,6 +5278,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return (m.fieldUpgrades[m.fieldMode].name === "time dilation field") && tech.energyRegen !== 0 }, @@ -5159,6 +5299,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" }, @@ -5177,6 +5318,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" }, @@ -5213,6 +5355,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, @@ -5233,6 +5376,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, @@ -5270,6 +5414,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "wormhole" }, @@ -5288,6 +5433,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "wormhole" }, @@ -5306,6 +5452,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "wormhole" }, @@ -5324,6 +5471,7 @@ maxCount: 1, count: 0, frequency: 2, + frequencyDefault: 2, allowed() { return m.fieldUpgrades[m.fieldMode].name === "wormhole" }, @@ -6820,7 +6968,7 @@ squirrelJump: null, fastTimeJump: null, isFastRadiation: null, - isExtraMaxHealth: null, + isExtraMaxEnergy: null, isAmmoForGun: null, isRapidPulse: null, isPulseAim: null, @@ -6862,7 +7010,7 @@ isCloakStun: null, bonusEnergy: null, healGiveMaxEnergy: null, - healMaxEnergyBonus: null, + healMaxEnergyBonus: 0, //not null aimDamage: null, isNoFireDefense: null, isNoFireDamage: null, diff --git a/todo.txt b/todo.txt index eb25533..3f935ae 100644 --- a/todo.txt +++ b/todo.txt @@ -1,11 +1,11 @@ ******************************************************** NEXT PATCH ******************************************************** -tech: quenching - if you're at full health heal power ups do harm but they also increase your max health +catabolism - lowers your max health by 1 (was 3 harm) and gives 4 ammo +inductive coupling - gives max energy for leftover power ups (was max health) + now requires mass-energy equivalence -you can play with camera smoothing now in the console - m.lookSmoothing = 0.07, //1 is instant/jerky, 0.01 is slow zoom, 0.07 is standard - -more progress on level - labs +switched to a newer copy, paste URL + this seems to fix issues with failed text copy in the level builder if you hold mouse down for over 6 seconds ******************************************************** BUGS ********************************************************