gun ammo descriptions

missile Bot: +10% bigger explosions, +10% damage, +7% fire rate
plasma Bot: +40% damage, and drains 2% less energy
1st ionization energy: 8->11 energy per heal
mass-energy: defense reduction factor 0.13->0.33
neutron bomb: +25% damage
non-renewables: 78->88% damage
junk DNA: applies to all damage, not just spores
pseudoscience: adds (1-4)->(1-3) JUNK to tech pool per free research
futures exchange: 4.1->4.3 duplication per cancel

default skin has slightly more narrow legs

added ammo to gun descriptions
This commit is contained in:
landgreen
2023-09-25 19:49:07 -07:00
parent 8a3ac11793
commit bf5f8661fc
7 changed files with 2341 additions and 2259 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -394,7 +394,7 @@ const build = {
<br> <br>
<br><strong class='color-d'>damage</strong>: ${((tech.damageFromTech())).toPrecision(4)} &nbsp; &nbsp; difficulty: ${((m.dmgScale)).toPrecision(4)} <br><strong class='color-d'>damage</strong>: ${((tech.damageFromTech())).toPrecision(4)} &nbsp; &nbsp; difficulty: ${((m.dmgScale)).toPrecision(4)}
<br><strong class='color-defense'>defense</strong>: ${tech.isEnergyHealth ? (1 - Math.pow(m.defense(), 0.13)).toPrecision(5) : (1 - m.defense()).toPrecision(5)} &nbsp; &nbsp; difficulty: ${(1 / simulation.dmgScale).toPrecision(4)} <br><strong class='color-defense'>defense</strong>: ${(1 - m.defense()).toPrecision(5)} &nbsp; &nbsp; difficulty: ${(1 / simulation.dmgScale).toPrecision(4)}
<br><strong><em>fire rate</em></strong>: ${((1 - b.fireCDscale) * 100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}% <br><strong><em>fire rate</em></strong>: ${((1 - b.fireCDscale) * 100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}%
${tech.duplicationChance() ? `<br><strong class='color-dup'>duplication</strong>: ${(tech.duplicationChance() * 100).toFixed(0)}%` : ""} ${tech.duplicationChance() ? `<br><strong class='color-dup'>duplication</strong>: ${(tech.duplicationChance() * 100).toFixed(0)}%` : ""}
${m.coupling ? `<br><span style = 'font-size:90%;'>` + m.couplingDescription(m.coupling) + `</span> from ${(m.coupling).toFixed(0)} ${powerUps.orb.coupling(1)}` : ""} ${m.coupling ? `<br><span style = 'font-size:90%;'>` + m.couplingDescription(m.coupling) + `</span> from ${(m.coupling).toFixed(0)} ${powerUps.orb.coupling(1)}` : ""}
@@ -437,7 +437,7 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>" : ""}
text += `<div class="pause-grid-module card-background" ${style} > text += `<div class="pause-grid-module card-background" ${style} >
<div class="card-text"> <div class="card-text">
<div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${build.nameLink(b.guns[b.inventory[i]].name)} - <span style="font-size:100%;font-weight: 100;">${b.guns[b.inventory[i]].ammo}</span></div> <div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${build.nameLink(b.guns[b.inventory[i]].name)} - <span style="font-size:100%;font-weight: 100;">${b.guns[b.inventory[i]].ammo}</span></div>
${b.guns[b.inventory[i]].description}</div> </div>` ${b.guns[b.inventory[i]].descriptionFunction()}</div> </div>`
} }
if (!localSettings.isHideHUD) text += `<div class="pause-grid-module pause-console" style = "background-color: rgba(255,255,255,0.3);">${document.getElementById("text-log").innerHTML}</div>` //show last in game console message if (!localSettings.isHideHUD) text += `<div class="pause-grid-module pause-console" style = "background-color: rgba(255,255,255,0.3);">${document.getElementById("text-log").innerHTML}</div>` //show last in game console message
let el = document.getElementById("pause-grid-left") let el = document.getElementById("pause-grid-left")
@@ -842,7 +842,7 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>" : ""}
text += `<div id="gun-${i}" class="experiment-grid-module card-background ${b.guns[i].have ? "build-gun-selected" : ""}" onclick="build.choosePowerUp(${i},'gun')" ${style} > text += `<div id="gun-${i}" class="experiment-grid-module card-background ${b.guns[i].have ? "build-gun-selected" : ""}" onclick="build.choosePowerUp(${i},'gun')" ${style} >
<div class="card-text"> <div class="card-text">
<div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${build.nameLink(b.guns[i].name)}</div> <div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${build.nameLink(b.guns[i].name)}</div>
${b.guns[i].description}</div> </div>` ${b.guns[i].descriptionFunction()}</div> </div>`
} }
for (let i = 0, len = tech.tech.length; i < len; i++) { for (let i = 0, len = tech.tech.length; i < len; i++) {
if ((!tech.tech[i].isJunk || localSettings.isJunkExperiment) && !tech.tech[i].isLore) { if ((!tech.tech[i].isJunk || localSettings.isJunkExperiment) && !tech.tech[i].isLore) {
@@ -1667,7 +1667,7 @@ if (localSettings.isAllowed && !localSettings.isEmpty) {
if (localSettings.isHideImages === undefined) localSettings.isHideImages = true //default to hide images if (localSettings.isHideImages === undefined) localSettings.isHideImages = true //default to hide images
document.getElementById("hide-images").checked = localSettings.isHideImages document.getElementById("hide-images").checked = localSettings.isHideImages
if (localSettings.isHideHUD === undefined) localSettings.isHideHUD = false if (localSettings.isHideHUD === undefined) localSettings.isHideHUD = true
document.getElementById("hide-hud").checked = localSettings.isHideHUD document.getElementById("hide-hud").checked = localSettings.isHideHUD
} else { } else {

View File

@@ -8,7 +8,7 @@ const level = {
onLevel: -1, onLevel: -1,
levelsCleared: 0, levelsCleared: 0,
// playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"], // playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"],
//see level.populateLevels: (intro, ... , reservoir or factory, reactor, ... , gauntlet, final) added later //see level.populateLevels: (intro, ... , reservoir or factory, reactor, ... , subway, final) added later
playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock"], playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock"],
communityLevels: ["gauntlet", "stronghold", "basement", "crossfire", "vats", "run", "ngon", "house", "perplex", "coliseum", "tunnel", "islands", "temple", "dripp", "biohazard", "stereoMadness", "yingYang", "staircase", "fortress", "commandeer", "clock", "buttonbutton", "downpour", "superNgonBros", "underpass", "cantilever", "dojo", "tlinat", "ruins", "ace", "crimsonTowers"], communityLevels: ["gauntlet", "stronghold", "basement", "crossfire", "vats", "run", "ngon", "house", "perplex", "coliseum", "tunnel", "islands", "temple", "dripp", "biohazard", "stereoMadness", "yingYang", "staircase", "fortress", "commandeer", "clock", "buttonbutton", "downpour", "superNgonBros", "underpass", "cantilever", "dojo", "tlinat", "ruins", "ace", "crimsonTowers"],
trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon", "diamagnetism"], trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon", "diamagnetism"],
@@ -36,7 +36,7 @@ const level = {
// b.guns[3].ammo = 100000000 // b.guns[3].ammo = 100000000
// requestAnimationFrame(() => { tech.giveTech("MACHO") }); // requestAnimationFrame(() => { tech.giveTech("MACHO") });
// for (let i = 0; i < 1; ++i) tech.giveTech("additive manufacturing") // for (let i = 0; i < 1; ++i) tech.giveTech("additive manufacturing")
// for (let i = 0; i < 1; ++i) tech.giveTech("dark star") // for (let i = 0; i < 1; ++i) tech.giveTech("flatland")
// for (let i = 0; i < 1; ++i) tech.giveTech("foam-bot") // for (let i = 0; i < 1; ++i) tech.giveTech("foam-bot")
// for (let i = 0; i < 1; ++i) tech.giveTech("nail-bot") // for (let i = 0; i < 1; ++i) tech.giveTech("nail-bot")
// for (let i = 0; i < 1; ++i) tech.giveTech("sound-bot upgrade") // for (let i = 0; i < 1; ++i) tech.giveTech("sound-bot upgrade")

View File

@@ -579,7 +579,7 @@ const m = {
if (tech.isTurret && m.crouch) dmg *= 0.34; if (tech.isTurret && m.crouch) dmg *= 0.34;
if (tech.isFirstDer && b.inventory[0] === b.activeGun) dmg *= 0.85 ** b.inventory.length if (tech.isFirstDer && b.inventory[0] === b.activeGun) dmg *= 0.85 ** b.inventory.length
if (tech.isEnergyHealth) { if (tech.isEnergyHealth) {
return Math.pow(dmg, 0.19) //defense has less effect return Math.pow(dmg, 0.33) //defense has less effect
} else { } else {
return dmg return dmg
} }
@@ -729,7 +729,7 @@ const m = {
powerUps.research.changeRerolls(-1) powerUps.research.changeRerolls(-1)
simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-r'>research</span><span class='color-symbol'>--</span><br>${powerUps.research.count}`) simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-r'>research</span><span class='color-symbol'>--</span><br>${powerUps.research.count}`)
for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "heal", false); for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "heal", false);
m.energy = m.maxEnergy m.energy = m.maxEnergy + 0.1
if (m.immuneCycle < m.cycle + 300) m.immuneCycle = m.cycle + 300 //disable this.immuneCycle bonus seconds if (m.immuneCycle < m.cycle + 300) m.immuneCycle = m.cycle + 300 //disable this.immuneCycle bonus seconds
simulation.wipe = function () { //set wipe to have trails simulation.wipe = function () { //set wipe to have trails
ctx.fillStyle = "rgba(255,255,255,0.03)"; ctx.fillStyle = "rgba(255,255,255,0.03)";
@@ -910,27 +910,27 @@ const m = {
ctx.lineTo(m.knee.x, m.knee.y); ctx.lineTo(m.knee.x, m.knee.y);
ctx.lineTo(m.foot.x, m.foot.y); ctx.lineTo(m.foot.x, m.foot.y);
ctx.strokeStyle = stroke; ctx.strokeStyle = stroke;
ctx.lineWidth = 7; ctx.lineWidth = 6;
ctx.stroke(); ctx.stroke();
//toe lines //toe lines
ctx.beginPath(); ctx.beginPath();
ctx.moveTo(m.foot.x, m.foot.y); ctx.moveTo(m.foot.x, m.foot.y);
ctx.lineTo(m.foot.x - 15, m.foot.y + 5); ctx.lineTo(m.foot.x - 14, m.foot.y + 5);
ctx.moveTo(m.foot.x, m.foot.y); ctx.moveTo(m.foot.x, m.foot.y);
ctx.lineTo(m.foot.x + 15, m.foot.y + 5); ctx.lineTo(m.foot.x + 14, m.foot.y + 5);
ctx.lineWidth = 4; ctx.lineWidth = 4;
ctx.stroke(); ctx.stroke();
//hip joint //hip joint
ctx.beginPath(); ctx.beginPath();
ctx.arc(m.hip.x, m.hip.y, 11, 0, 2 * Math.PI); ctx.arc(m.hip.x, m.hip.y, 10, 0, 2 * Math.PI);
//knee joint //knee joint
ctx.moveTo(m.knee.x + 7, m.knee.y); ctx.moveTo(m.knee.x + 6, m.knee.y);
ctx.arc(m.knee.x, m.knee.y, 7, 0, 2 * Math.PI); ctx.arc(m.knee.x, m.knee.y, 6, 0, 2 * Math.PI);
//foot joint //foot joint
ctx.moveTo(m.foot.x + 6, m.foot.y); ctx.moveTo(m.foot.x + 5, m.foot.y + 1);
ctx.arc(m.foot.x, m.foot.y, 6, 0, 2 * Math.PI); ctx.arc(m.foot.x, m.foot.y + 1, 5, 0, 2 * Math.PI);
ctx.fillStyle = m.fillColor; ctx.fillStyle = m.fillColor;
ctx.fill(); ctx.fill();
ctx.lineWidth = 2; ctx.lineWidth = 2;
@@ -938,6 +938,83 @@ const m = {
ctx.restore(); ctx.restore();
} }
}, },
// resetSkin() {
// simulation.isAutoZoom = true;
// m.yOffWhen.jump = 70
// m.yOffWhen.stand = 49
// m.yOffWhen.crouch = 22
// m.isAltSkin = false
// m.color = {
// hue: 0,
// sat: 0,
// light: 100,
// }
// m.setFillColors();
// m.draw = function () {
// ctx.fillStyle = m.fillColor;
// m.walk_cycle += m.flipLegs * m.Vx;
// ctx.save();
// ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5 //|| (m.cycle % 40 > 20)
// ctx.translate(m.pos.x, m.pos.y);
// m.calcLeg(Math.PI, -3);
// m.drawLeg("#4a4a4a");
// m.calcLeg(0, 0);
// m.drawLeg("#333");
// ctx.rotate(m.angle);
// ctx.beginPath();
// ctx.arc(0, 0, 30, 0, 2 * Math.PI);
// ctx.fillStyle = m.bodyGradient
// ctx.fill();
// ctx.arc(15, 0, 4, 0, 2 * Math.PI);
// ctx.strokeStyle = "#333";
// ctx.lineWidth = 2;
// ctx.stroke();
// ctx.restore();
// m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
// powerUps.boost.draw()
// }
// m.drawLeg = function (stroke) {
// // if (simulation.mouseInGame.x > m.pos.x) {
// if (m.angle > -Math.PI / 2 && m.angle < Math.PI / 2) {
// m.flipLegs = 1;
// } else {
// m.flipLegs = -1;
// }
// ctx.save();
// ctx.scale(m.flipLegs, 1); //leg lines
// ctx.beginPath();
// ctx.moveTo(m.hip.x, m.hip.y);
// ctx.lineTo(m.knee.x, m.knee.y);
// ctx.lineTo(m.foot.x, m.foot.y);
// ctx.strokeStyle = stroke;
// ctx.lineWidth = 7;
// ctx.stroke();
// //toe lines
// ctx.beginPath();
// ctx.moveTo(m.foot.x, m.foot.y);
// ctx.lineTo(m.foot.x - 15, m.foot.y + 5);
// ctx.moveTo(m.foot.x, m.foot.y);
// ctx.lineTo(m.foot.x + 15, m.foot.y + 5);
// ctx.lineWidth = 4;
// ctx.stroke();
// //hip joint
// ctx.beginPath();
// ctx.arc(m.hip.x, m.hip.y, 11, 0, 2 * Math.PI);
// //knee joint
// ctx.moveTo(m.knee.x + 7, m.knee.y);
// ctx.arc(m.knee.x, m.knee.y, 7, 0, 2 * Math.PI);
// //foot joint
// ctx.moveTo(m.foot.x + 6, m.foot.y);
// ctx.arc(m.foot.x, m.foot.y, 6, 0, 2 * Math.PI);
// ctx.fillStyle = m.fillColor;
// ctx.fill();
// ctx.lineWidth = 2;
// ctx.stroke();
// ctx.restore();
// }
// },
skin: { skin: {
none() { none() {
m.isAltSkin = true m.isAltSkin = true
@@ -1122,27 +1199,27 @@ const m = {
ctx.lineTo(m.knee.x, m.knee.y); ctx.lineTo(m.knee.x, m.knee.y);
ctx.lineTo(m.foot.x, m.foot.y); ctx.lineTo(m.foot.x, m.foot.y);
ctx.strokeStyle = stroke; ctx.strokeStyle = stroke;
ctx.lineWidth = 7; ctx.lineWidth = 6;
ctx.stroke(); ctx.stroke();
//toe lines //toe lines
ctx.beginPath(); ctx.beginPath();
ctx.moveTo(m.foot.x, m.foot.y); ctx.moveTo(m.foot.x, m.foot.y);
ctx.lineTo(m.foot.x - 15, m.foot.y + 5); ctx.lineTo(m.foot.x - 14, m.foot.y + 5);
ctx.moveTo(m.foot.x, m.foot.y); ctx.moveTo(m.foot.x, m.foot.y);
ctx.lineTo(m.foot.x + 15, m.foot.y + 5); ctx.lineTo(m.foot.x + 14, m.foot.y + 5);
ctx.lineWidth = 4; ctx.lineWidth = 4;
ctx.stroke(); ctx.stroke();
//hip joint //hip joint
ctx.beginPath(); ctx.beginPath();
ctx.arc(m.hip.x, m.hip.y, 11, 0, 2 * Math.PI); ctx.arc(m.hip.x, m.hip.y, 10, 0, 2 * Math.PI);
//knee joint //knee joint
ctx.moveTo(m.knee.x + 7, m.knee.y); ctx.moveTo(m.knee.x + 6, m.knee.y);
ctx.arc(m.knee.x, m.knee.y, 7, 0, 2 * Math.PI); ctx.arc(m.knee.x, m.knee.y, 6, 0, 2 * Math.PI);
//foot joint //foot joint
ctx.moveTo(m.foot.x + 6, m.foot.y); ctx.moveTo(m.foot.x + 5, m.foot.y);
ctx.arc(m.foot.x, m.foot.y, 6, 0, 2 * Math.PI); ctx.arc(m.foot.x, m.foot.y + 1, 5, 0, 2 * Math.PI);
ctx.strokeStyle = "rgba(0,255,255,0.25)"; ctx.strokeStyle = "rgba(0,255,255,0.25)";
ctx.lineWidth = 5; ctx.lineWidth = 5;
ctx.stroke(); ctx.stroke();

View File

@@ -326,7 +326,7 @@ const powerUps = {
return return
} }
if (tech.isCancelDuplication) { if (tech.isCancelDuplication) {
tech.duplication += 0.041 tech.duplication += 0.043
tech.maxDuplicationEvent() tech.maxDuplicationEvent()
simulation.makeTextLog(`tech.duplicationChance() <span class='color-symbol'>+=</span> ${0.043}`) simulation.makeTextLog(`tech.duplicationChance() <span class='color-symbol'>+=</span> ${0.043}`)
simulation.circleFlare(0.043); simulation.circleFlare(0.043);
@@ -579,7 +579,7 @@ const powerUps = {
} }
} }
if (powerUps.healGiveMaxEnergy) { if (powerUps.healGiveMaxEnergy) {
tech.healMaxEnergyBonus += 0.08 * tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1) tech.healMaxEnergyBonus += 0.11 * tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)
m.setMaxEnergy(); m.setMaxEnergy();
} }
}, },
@@ -667,7 +667,7 @@ const powerUps = {
text += `<div class='choose-grid-module entanglement flipX' onclick='powerUps.endDraft("${type}",true)'>entanglement</div>` text += `<div class='choose-grid-module entanglement flipX' onclick='powerUps.endDraft("${type}",true)'>entanglement</div>`
} else if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) { } else if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
text += `<div onclick="powerUps.research.use('${type}')" class='research-card'>` // style = "margin-left: 192px; margin-right: -192px;" text += `<div onclick="powerUps.research.use('${type}')" class='research-card'>` // style = "margin-left: 192px; margin-right: -192px;"
tech.junkResearchNumber = Math.ceil(4 * Math.random()) tech.junkResearchNumber = Math.ceil(3 * Math.random())
text += `<div><div> <span style="position:relative;">` text += `<div><div> <span style="position:relative;">`
for (let i = 0; i < tech.junkResearchNumber; i++) { for (let i = 0; i < tech.junkResearchNumber; i++) {
text += `<div class="circle-grid junk" style="position:absolute; top:0; left:${15 * i}px ;opacity:0.8; border: 1px #fff solid;width: 1.15em;height: 1.15em;"></div>` text += `<div class="circle-grid junk" style="position:absolute; top:0; left:${15 * i}px ;opacity:0.8; border: 1px #fff solid;width: 1.15em;height: 1.15em;"></div>`
@@ -689,7 +689,7 @@ const powerUps = {
text += `<span class='research-card entanglement flipX' style="width: 275px;" onclick='powerUps.endDraft("${type}",true)'><span style="letter-spacing: 6px;">entanglement</span></span>` //&zwnj; text += `<span class='research-card entanglement flipX' style="width: 275px;" onclick='powerUps.endDraft("${type}",true)'><span style="letter-spacing: 6px;">entanglement</span></span>` //&zwnj;
} else if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) { } else if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
text += `<span onclick="powerUps.research.use('${type}')" class='research-card' style="width: 275px;float: left;">` // style = "margin-left: 192px; margin-right: -192px;" text += `<span onclick="powerUps.research.use('${type}')" class='research-card' style="width: 275px;float: left;">` // style = "margin-left: 192px; margin-right: -192px;"
tech.junkResearchNumber = Math.ceil(4 * Math.random()) tech.junkResearchNumber = Math.ceil(3 * Math.random())
text += `<div><div><span style="position:relative;">` text += `<div><div><span style="position:relative;">`
for (let i = 0, len = tech.junkResearchNumber; i < len; i++) { for (let i = 0, len = tech.junkResearchNumber; i < len; i++) {
text += `<div class="circle-grid junk" style="position:absolute; top:0; left:${15 * i}px ;opacity:0.8; border: 1px #fff solid;width: 1.15em;height: 1.15em;"></div>` text += `<div class="circle-grid junk" style="position:absolute; top:0; left:${15 * i}px ;opacity:0.8; border: 1px #fff solid;width: 1.15em;height: 1.15em;"></div>`
@@ -775,7 +775,7 @@ const powerUps = {
return `<div class="choose-grid-module card-background" onclick="${click}" onauxclick="${click}" ${style}> return `<div class="choose-grid-module card-background" onclick="${click}" onauxclick="${click}" ${style}>
<div class="card-text"> <div class="card-text">
<div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${b.guns[choose].name}</div> <div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${b.guns[choose].name}</div>
${b.guns[choose].description}</div></div>` ${b.guns[choose].descriptionFunction()}</div></div>`
}, },
fieldText(choose, click) { fieldText(choose, click) {
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/field/${m.fieldUpgrades[choose].name}${choose === 0 ? Math.floor(Math.random() * 10) : ""}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/field/${m.fieldUpgrades[choose].name}${choose === 0 ? Math.floor(Math.random() * 10) : ""}.webp');"`
@@ -1169,7 +1169,7 @@ const powerUps = {
document.body.style.cursor = "auto"; document.body.style.cursor = "auto";
document.getElementById("choose-grid").style.transitionDuration = "0s"; document.getElementById("choose-grid").style.transitionDuration = "0s";
} }
if (count < 5 && simulation.isChoosing) { if (count < 10 && simulation.isChoosing) {
requestAnimationFrame(cycle); requestAnimationFrame(cycle);
} else { } else {
tech.isBrainstormActive = false tech.isBrainstormActive = false

View File

@@ -83,6 +83,7 @@ const tech = {
// } // }
// }, // },
addJunkTechToPool(percent) { //percent is number between 0-1 addJunkTechToPool(percent) { //percent is number between 0-1
tech.junkPoolPercent += percent
//make an array for possible junk tech to add //make an array for possible junk tech to add
let options = []; let options = [];
for (let i = 0; i < tech.tech.length; i++) { for (let i = 0; i < tech.tech.length; i++) {
@@ -110,6 +111,7 @@ const tech = {
} }
} }
} }
tech.junkPoolPercent = 0
}, },
giveRandomJUNK() { giveRandomJUNK() {
const list = [] const list = []
@@ -120,7 +122,6 @@ const tech = {
tech.giveTech(name) tech.giveTech(name)
simulation.makeTextLog(`<span class='color-var'>tech</span>.giveTech("<span class='color-text'>${name}</span>")<em>`); simulation.makeTextLog(`<span class='color-var'>tech</span>.giveTech("<span class='color-text'>${name}</span>")<em>`);
}, },
giveTech(index = 'random') { giveTech(index = 'random') {
if (index === 'random') { if (index === 'random') {
let options = []; let options = [];
@@ -161,6 +162,7 @@ const tech = {
simulation.updateTechHUD(); simulation.updateTechHUD();
} }
}, },
junkPoolPercent: 0,
junkCount: 0, junkCount: 0,
countJunkTech() { countJunkTech() {
tech.junkCount = 0 tech.junkCount = 0
@@ -257,6 +259,7 @@ const tech = {
if (tech.isHarmDamage && m.lastHarmCycle + 480 > m.cycle) dmg *= 3; if (tech.isHarmDamage && m.lastHarmCycle + 480 > m.cycle) dmg *= 3;
if (tech.lastHitDamage && m.lastHit) dmg *= 1 + tech.lastHitDamage * m.lastHit * (2 - m.defense()) // if (!simulation.paused) m.lastHit = 0 if (tech.lastHitDamage && m.lastHit) dmg *= 1 + tech.lastHitDamage * m.lastHit * (2 - m.defense()) // if (!simulation.paused) m.lastHit = 0
if (tech.isLowHealthDmg) dmg *= 1 + 0.7 * Math.max(0, 1 - (tech.isEnergyHealth ? m.energy : m.health)) if (tech.isLowHealthDmg) dmg *= 1 + 0.7 * Math.max(0, 1 - (tech.isEnergyHealth ? m.energy : m.health))
if (tech.isJunkDNA) dmg *= 1 + tech.junkPoolPercent
return dmg return dmg
}, },
duplicationChance() { duplicationChance() {
@@ -408,7 +411,7 @@ const tech = {
{ {
name: "mass-energy equivalence", name: "mass-energy equivalence",
// description: "<strong class='color-f'>energy</strong> protects you instead of <strong class='color-h'>health</strong><br>√ of <strong class='color-defense'>defense</strong> <strong>reduction</strong> reduces max <strong class='color-f'>energy</strong>", // description: "<strong class='color-f'>energy</strong> protects you instead of <strong class='color-h'>health</strong><br>√ of <strong class='color-defense'>defense</strong> <strong>reduction</strong> reduces max <strong class='color-f'>energy</strong>",
description: "<strong class='color-f'>energy</strong> protects you instead of <strong class='color-h'>health</strong><br>exponentially <strong>reduced</strong> <strong class='color-defense'>defense</strong> <em>(~ x^0.19)</em>", description: `<strong class='color-f'>energy</strong> protects you instead of <strong class='color-h'>health</strong><br><strong class='color-defense'>defensive</strong> upgrades <strong>reduced</strong> by <strong>~66%</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -450,7 +453,7 @@ const tech = {
// description: `after you collect ${powerUps.orb.heal()}<br><strong>+${0.1 * tech.largerHeals}</strong> maximum <strong class='color-f'>energy</strong>`, // description: `after you collect ${powerUps.orb.heal()}<br><strong>+${0.1 * tech.largerHeals}</strong> maximum <strong class='color-f'>energy</strong>`,
// descriptionFunction: `convert current and future ${powerUps.orb.heal()} into <div class="heal-circle" style = "background-color: #ff0; border: 0.5px #000 solid;"></div><br><div class="heal-circle" style = "background-color: #ff0; border: 0.5px #000 solid;"></div> give <strong>+${10 * tech.largerHeals}</strong> maximum <strong class='color-f'>energy</strong>`, // descriptionFunction: `convert current and future ${powerUps.orb.heal()} into <div class="heal-circle" style = "background-color: #ff0; border: 0.5px #000 solid;"></div><br><div class="heal-circle" style = "background-color: #ff0; border: 0.5px #000 solid;"></div> give <strong>+${10 * tech.largerHeals}</strong> maximum <strong class='color-f'>energy</strong>`,
descriptionFunction() { descriptionFunction() {
return `convert current and future <div class="heal-circle"></div> into <div class="heal-circle" style = "background-color: #ff0; border: 0.5px #000 solid;"></div><br><div class="heal-circle" style = "background-color: #ff0; border: 0.5px #000 solid;"></div> give <strong>+${8 * tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)}</strong> maximum <strong class='color-f'>energy</strong>` return `convert current and future <div class="heal-circle"></div> into <div class="heal-circle" style = "background-color: #ff0; border: 0.5px #000 solid;"></div><br><div class="heal-circle" style = "background-color: #ff0; border: 0.5px #000 solid;"></div> give <strong>+${11 * tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)}</strong> maximum <strong class='color-f'>energy</strong>`
}, },
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -854,7 +857,7 @@ const tech = {
}, },
{ {
name: "non-renewables", name: "non-renewables",
description: `<strong>+78%</strong> <strong class='color-d'>damage</strong><br>${powerUps.orb.ammo()} can't <strong>spawn</strong>`, description: `<strong>+88%</strong> <strong class='color-d'>damage</strong><br>${powerUps.orb.ammo()} can't <strong>spawn</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -863,7 +866,7 @@ const tech = {
return !tech.isAmmoFromHealth && !tech.isBoostReplaceAmmo return !tech.isAmmoFromHealth && !tech.isBoostReplaceAmmo
}, },
requires: "not catabolism, quasiparticles", requires: "not catabolism, quasiparticles",
damage: 1.78, damage: 1.88,
effect() { effect() {
tech.damage *= this.damage tech.damage *= this.damage
tech.isEnergyNoAmmo = true; tech.isEnergyNoAmmo = true;
@@ -875,7 +878,6 @@ const tech = {
}, },
{ {
name: "desublimated ammunition", name: "desublimated ammunition",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Deposition_(phase_transition)' class="link">desublimated ammunition</a>`,
description: `if <strong>crouching</strong><br>alternating shots use no <strong class='color-ammo'>ammo</strong>`, description: `if <strong>crouching</strong><br>alternating shots use no <strong class='color-ammo'>ammo</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -1406,7 +1408,7 @@ const tech = {
{ {
name: "nail-bot upgrade", name: "nail-bot upgrade",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">nail-bot upgrade</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">nail-bot upgrade</a>`,
description: "<strong>convert</strong> your bots to <strong>nail-bots</strong><br><strong>+500%</strong> <strong>fire rate</strong> and <strong>+40%</strong> nail <strong>velocity</strong>", description: "<strong>convert</strong> your bots to <strong>nail-bots</strong><br><strong>+500%</strong> <em>fire rate</em> and <strong>+40%</strong> nail <strong>velocity</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 3, frequency: 3,
@@ -1438,7 +1440,7 @@ const tech = {
{ {
name: "foam-bot", name: "foam-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">foam-bot</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">foam-bot</a>`,
description: "a <strong class='color-bot'>bot</strong> fires <strong>foam</strong> at nearby mobs", description: "a <strong class='color-bot'>bot</strong> sprays sticky <strong>foam</strong> at nearby mobs",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3547,7 +3549,7 @@ const tech = {
}, },
{ {
name: "pseudoscience", name: "pseudoscience",
description: "<span style = 'font-size:94%;'>when <strong>selecting</strong> a power up, <strong class='color-r'>research</strong> <strong>3</strong> times</span><br>for <strong>free</strong>, but add <strong>1-4%</strong> <strong class='color-junk'>JUNK</strong> to the <strong class='color-m'>tech</strong> pool", description: "<span style = 'font-size:94%;'>when <strong>selecting</strong> a power up, <strong class='color-r'>research</strong> <strong>3</strong> times</span><br>for <strong>free</strong>, but add <strong>1-3%</strong> <strong class='color-junk'>JUNK</strong> to the <strong class='color-m'>tech</strong> pool",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3783,6 +3785,34 @@ const tech = {
} }
} }
}, },
{
name: "junk DNA",
descriptionFunction() {
// return ` <strong>+100%</strong> ${b.guns[6].nameString()} <strong class='color-d'>damage</strong> per <strong class='color-junk'>JUNK</strong><strong class='color-m'>tech</strong> <em>(${(100 * tech.junkCount).toFixed(0)}%)</em><br><strong>+33%</strong> <strong class='color-junk'>JUNK</strong> to <strong class='color-m'>tech</strong> pool`
return `<strong class='color-d'>damage</strong> scales with <strong class='color-junk'>JUNK</strong> <strong class='color-m'>tech</strong> pool percent`
},
// isGunTech: true,
maxCount: 1,
count: 0,
frequency: 1,
frequencyDefault: 1,
allowed() {
return tech.junkPoolPercent > 0
},
requires: "JUNK in tech pool",
effect() {
tech.isJunkDNA = true
// this.refundAmount += tech.addJunkTechToPool(0.20)
},
// refundAmount: 0,
remove() {
tech.isJunkDNA = false
// if (this.count > 0 && this.refundAmount > 0) {
// tech.removeJunkTechFromPool(this.refundAmount)
// this.refundAmount = 0
// }
}
},
{ {
name: "exciton", name: "exciton",
descriptionFunction() { descriptionFunction() {
@@ -4079,7 +4109,7 @@ const tech = {
}, },
{ {
name: "futures exchange", name: "futures exchange",
description: "clicking <strong class='color-cancel'>cancel</strong> for a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>gives <strong>+4.1%</strong> power up <strong class='color-dup'>duplication</strong> chance", description: "clicking <strong class='color-cancel'>cancel</strong> for a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>gives <strong>+4.3%</strong> power up <strong class='color-dup'>duplication</strong> chance",
// descriptionFunction() { // descriptionFunction() {
// return `clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>gives <strong>+${4.9 - 0.15*simulation.difficultyMode}%</strong> power up <strong class='color-dup'>duplication</strong> chance` // return `clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>gives <strong>+${4.9 - 0.15*simulation.difficultyMode}%</strong> power up <strong class='color-dup'>duplication</strong> chance`
// }, // },
@@ -4229,7 +4259,7 @@ const tech = {
{ {
name: "strange attractor", name: "strange attractor",
descriptionFunction() { descriptionFunction() {
return `<strong>+7%</strong> <strong class='color-d'>damage</strong><br><strong>removing</strong> this increases <strong class='color-dup'>duplication</strong> by <strong>+10%</strong>` return `<strong>+7%</strong> <strong class='color-d'>damage</strong><br><strong>removing</strong> this increases <strong class='color-dup'>duplication</strong> by <strong>+11%</strong>`
}, },
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4246,7 +4276,7 @@ const tech = {
}, },
remove() { remove() {
if (this.count > 0 && m.alive) { if (this.count > 0 && m.alive) {
tech.duplication += 0.1 tech.duplication += 0.11
powerUps.setPowerUpMode(); //needed after adjusting duplication chance powerUps.setPowerUpMode(); //needed after adjusting duplication chance
tech.damage /= this.damage tech.damage /= this.damage
this.frequency = 0 this.frequency = 0
@@ -6168,33 +6198,6 @@ const tech = {
tech.isSporeFollow = false tech.isSporeFollow = false
} }
}, },
{
name: "junk DNA",
descriptionFunction() {
return `<strong>+53%</strong> ${b.guns[6].nameString()} <strong class='color-d'>damage</strong> per <strong class='color-junk'>JUNK</strong><strong class='color-m'>tech</strong> <em>(${(53 * tech.junkCount).toFixed(0)}%)</em><br><strong>+50%</strong> <strong class='color-junk'>JUNK</strong> to <strong class='color-m'>tech</strong> pool`
},
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldMode === 4 && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea
},
requires: "spores",
effect() {
tech.isJunkDNA = true
this.refundAmount += tech.addJunkTechToPool(0.5)
},
refundAmount: 0,
remove() {
tech.isJunkDNA = false
if (this.count > 0 && this.refundAmount > 0) {
tech.removeJunkTechFromPool(this.refundAmount)
this.refundAmount = 0
}
}
},
// { // {
// name: "junk DNA", // name: "junk DNA",
// //increase damage by 10% for each JUNK tech percent in the tech pool, remove all JUNK tech, // //increase damage by 10% for each JUNK tech percent in the tech pool, remove all JUNK tech,
@@ -6264,7 +6267,7 @@ const tech = {
}, },
{ {
name: "siphonaptera", name: "siphonaptera",
description: "<strong class='color-p' style='letter-spacing: 2px;'>spores</strong> metamorphose into <strong class='color-p' style='letter-spacing: -0.8px;'>fleas</strong>", description: "<strong class='color-p' style='letter-spacing: 2px;'>spores</strong> metamorphose into <strong class='color-p' style='letter-spacing: -0.8px;'>fleas</strong><br><strong>shotgun</strong> fires <strong class='color-p' style='letter-spacing: -0.8px;'>fleas</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -6284,7 +6287,7 @@ const tech = {
}, },
{ {
name: "nematodes", name: "nematodes",
description: "<strong class='color-p' style='letter-spacing: 2px;'>spores</strong> metamorphose into <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong>", description: "<strong class='color-p' style='letter-spacing: 2px;'>spores</strong> metamorphose into <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong><br><strong>shotgun</strong> fires <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -7669,7 +7672,10 @@ const tech = {
}, },
{ {
name: "radiative equilibrium", name: "radiative equilibrium",
description: "after losing <strong class='color-h'>health</strong><br><strong>+200%</strong> <strong class='color-d'>damage</strong> for <strong>8</strong> seconds", descriptionFunction() {
return `after losing ${tech.isEnergyHealth ? "<strong class='color-f'>energy</strong>" : "<strong class='color-h'>health</strong>"}<br><strong>+200%</strong> <strong class='color-d'>damage</strong> for <strong>8</strong> seconds`
},
// description: `after losing ${tech.isEnergyHealth ? "<strong class='color-f'>energy</strong>" : "<strong class='color-h'>health</strong>"}<br><strong>+200%</strong> <strong class='color-d'>damage</strong> for <strong>8</strong> seconds`,
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -9377,7 +9383,7 @@ const tech = {
effect() { effect() {
tech.isBrainstorm = true tech.isBrainstorm = true
tech.isBrainstormActive = false tech.isBrainstormActive = false
tech.brainStormDelay = 500 tech.brainStormDelay = 500 //show each option for 0.5 seconds
}, },
remove() { remove() {
tech.isBrainstorm = false tech.isBrainstorm = false
@@ -10261,67 +10267,70 @@ const tech = {
}, },
remove() { } remove() { }
}, },
{ // {
name: "flatland", // name: "flatland",
description: "map blocks line of sight", // description: "map blocks line of sight",
maxCount: 1, // maxCount: 1,
count: 0, // count: 0,
frequency: 0, // frequency: 0,
isNonRefundable: true, // isNonRefundable: true,
isJunk: true, // isJunk: true,
allowed() { return true }, // allowed() { return true },
requires: "", // requires: "",
effect() { // effect() {
simulation.ephemera.push({ // simulation.draw.lineOfSightPrecalculation() //required precalculation for line of sight
name: "LoS", count: 0, do() { // simulation.draw.drawMapPath = simulation.draw.drawMapSight
const pos = m.pos
const radius = 3000
if (!simulation.isTimeSkipping) {
const vertices = simulation.sight.circleLoS(pos, radius);
if (vertices.length) {
ctx.beginPath();
ctx.moveTo(vertices[0].x, vertices[0].y);
for (var i = 1; i < vertices.length; i++) {
var currentDistance = Math.sqrt((vertices[i - 1].x - pos.x) ** 2 + (vertices[i - 1].y - pos.y) ** 2);
var newDistance = Math.sqrt((vertices[i].x - pos.x) ** 2 + (vertices[i].y - pos.y) ** 2);
if (Math.abs(currentDistance - radius) < 1 && Math.abs(newDistance - radius) < 1) {
const currentAngle = Math.atan2(vertices[i - 1].y - pos.y, vertices[i - 1].x - pos.x);
const newAngle = Math.atan2(vertices[i].y - pos.y, vertices[i].x - pos.x);
ctx.arc(pos.x, pos.y, radius, currentAngle, newAngle);
} else {
ctx.lineTo(vertices[i].x, vertices[i].y)
}
}
newDistance = Math.sqrt((vertices[0].x - pos.x) ** 2 + (vertices[0].y - pos.y) ** 2);
currentDistance = Math.sqrt((vertices[vertices.length - 1].x - pos.x) ** 2 + (vertices[vertices.length - 1].y - pos.y) ** 2);
if (Math.abs(currentDistance - radius) < 1 && Math.abs(newDistance - radius) < 1) {
const currentAngle = Math.atan2(vertices[vertices.length - 1].y - pos.y, vertices[vertices.length - 1].x - pos.x);
const newAngle = Math.atan2(vertices[0].y - pos.y, vertices[0].x - pos.x);
ctx.arc(pos.x, pos.y, radius, currentAngle, newAngle);
} else {
ctx.lineTo(vertices[0].x, vertices[0].y)
}
//stroke the map, so it looks different form the line of sight // simulation.ephemera.push({
ctx.strokeStyle = "#234"; // name: "LoS", count: 0, do() {
ctx.lineWidth = 9; // const pos = m.pos
ctx.stroke(simulation.draw.mapPath); //this has a pretty large impact on performance, maybe 5% worse performance // const radius = 3000
// if (!simulation.isTimeSkipping) {
// const vertices = simulation.sight.circleLoS(pos, radius);
// if (vertices.length) {
// ctx.beginPath();
// ctx.moveTo(vertices[0].x, vertices[0].y);
// for (var i = 1; i < vertices.length; i++) {
// var currentDistance = Math.sqrt((vertices[i - 1].x - pos.x) ** 2 + (vertices[i - 1].y - pos.y) ** 2);
// var newDistance = Math.sqrt((vertices[i].x - pos.x) ** 2 + (vertices[i].y - pos.y) ** 2);
// if (Math.abs(currentDistance - radius) < 1 && Math.abs(newDistance - radius) < 1) {
// const currentAngle = Math.atan2(vertices[i - 1].y - pos.y, vertices[i - 1].x - pos.x);
// const newAngle = Math.atan2(vertices[i].y - pos.y, vertices[i].x - pos.x);
// ctx.arc(pos.x, pos.y, radius, currentAngle, newAngle);
// } else {
// ctx.lineTo(vertices[i].x, vertices[i].y)
// }
// }
// newDistance = Math.sqrt((vertices[0].x - pos.x) ** 2 + (vertices[0].y - pos.y) ** 2);
// currentDistance = Math.sqrt((vertices[vertices.length - 1].x - pos.x) ** 2 + (vertices[vertices.length - 1].y - pos.y) ** 2);
// if (Math.abs(currentDistance - radius) < 1 && Math.abs(newDistance - radius) < 1) {
// const currentAngle = Math.atan2(vertices[vertices.length - 1].y - pos.y, vertices[vertices.length - 1].x - pos.x);
// const newAngle = Math.atan2(vertices[0].y - pos.y, vertices[0].x - pos.x);
// ctx.arc(pos.x, pos.y, radius, currentAngle, newAngle);
// } else {
// ctx.lineTo(vertices[0].x, vertices[0].y)
// }
ctx.globalCompositeOperation = "destination-in"; // //stroke the map, so it looks different form the line of sight
ctx.fillStyle = "#000"; // ctx.strokeStyle = "#234";
ctx.fill(); // ctx.lineWidth = 9;
ctx.globalCompositeOperation = "source-over"; // ctx.stroke(simulation.draw.mapPath); //this has a pretty large impact on performance, maybe 5% worse performance
// also see the map
// ctx.fill(simulation.draw.mapPath); // ctx.globalCompositeOperation = "destination-in";
// ctx.fillStyle = "#000"; // ctx.fillStyle = "#000";
ctx.clip(); // ctx.fill();
} // ctx.globalCompositeOperation = "source-over";
} // // also see the map
}, // // ctx.fill(simulation.draw.mapPath);
}) // // ctx.fillStyle = "#000";
}, // ctx.clip();
remove() { } // }
}, // }
// },
// })
// },
// remove() { }
// },
{ {
name: "umbra", name: "umbra",
description: "produce a blue glow around everything<br>and probably some simulation lag", description: "produce a blue glow around everything<br>and probably some simulation lag",

View File

@@ -1,12 +1,20 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
on later levels spawn 2 bosses, but 1 power up each missile Bot: +10% bigger explosions, +10% damage, +7% fire rate
starts at simulation.difficulty > 23 //on hard mode level 6, level 12 on easy, level 4 on why? plasma Bot: +40% damage, and drains 2% less energy
makes combat harder, but also means that you will always get at least 2 drops per level 1st ionization energy: 8->11 energy per heal
you used to have a chance to only get 1 near the end of the game mass-energy: defense reduction factor 0.13->0.33
I'm guessing this will lead to about 3 more total tech by the final boss neutron bomb: +25% damage
abiogenesis - removed non-renewables: 78->88% damage
parthenogenesis - doesn't duplicate bosses anymore, +8% duplication junk DNA: applies to all damage, not just spores
pseudoscience: adds (1-4)->(1-3) JUNK to tech pool per free research
futures exchange: 4.1->4.3 duplication per cancel
default skin has slightly more narrow legs
added ammo to gun descriptions
calculate the ammo drop rate for each gun live based on ammo tech?
need to make a generic function
*********************************************************** TODO ***************************************************** *********************************************************** TODO *****************************************************