mass-energy rework
mass-energy is compatible with more tech
defense works with mass-energy, but is exponentially reduced (~10%)
damage taken scales with difficulty based heal reduction
1.3x dmg level 5 hard, 2x dmg level 13 why
ergodicity: 91->66% damage, no heals -> 1/2 size heals
negative feedback 0.5% -> 1% damage per missing health
negative entropy spawn heals for 33% missing health not 33 flat missing health
this means it caps at 3 health per level
tech - iceIX freeze effect lasts 2 seconds longer, spawn 10 coupling
perfect diamagnetism, standing wave
research is less common
path integral comes with 5% JUNK
there are fewer starting power ups on why difficulty
bug fixes:
fixed the text overflow issue on small screens
decoherence: if you get a tech that is banished it stops being banished
you can now have negative research
This commit is contained in:
@@ -2961,7 +2961,7 @@ const b = {
|
||||
if (tech.iceEnergy && !who.shield && !who.isShielded && who.isDropPowerUp && who.alive && m.immuneCycle < m.cycle) {
|
||||
setTimeout(() => { if (!who.alive) m.energy += tech.iceEnergy * 0.8 }, 10);
|
||||
}
|
||||
mobs.statusSlow(who, 180)
|
||||
mobs.statusSlow(who, tech.iceIXFreezeTime)
|
||||
this.endCycle = simulation.cycle
|
||||
// if (tech.isHeavyWater) mobs.statusDoT(who, 0.15, 300)
|
||||
},
|
||||
|
||||
@@ -253,7 +253,7 @@ const build = {
|
||||
</svg><br>`
|
||||
text += `
|
||||
<br><strong class='color-d'>damage</strong>: ${((tech.damageFromTech())).toPrecision(3)} difficulty: ${((m.dmgScale)).toPrecision(3)}
|
||||
<br><strong class='color-defense'>defense</strong>: ${(1-m.harmReduction()).toPrecision(3)} difficulty: ${(1/simulation.dmgScale).toPrecision(3)}
|
||||
<br><strong class='color-defense'>defense</strong>: ${tech.isEnergyHealth ? (1-Math.pow(m.harmReduction(), 0.1)).toPrecision(3) : (1-m.harmReduction()).toPrecision(3) } difficulty: ${(1/simulation.dmgScale).toPrecision(3)}
|
||||
<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)}%`: ""}
|
||||
${m.coupling ? `<br><strong class='color-coupling'>coupling</strong>: ${(m.coupling).toFixed(2)} <span style = 'font-size:90%;'>`+m.couplingDescription()+"</span>": ""}
|
||||
|
||||
49
js/level.js
49
js/level.js
@@ -24,17 +24,17 @@ const level = {
|
||||
// m.immuneCycle = Infinity //you can't take damage
|
||||
// tech.tech[297].frequency = 100
|
||||
// m.couplingChange(5)
|
||||
// m.setField("perfect diamagnetism") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass
|
||||
// m.setField("metamaterial cloaking") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass
|
||||
// simulation.molecularMode = 2
|
||||
// m.damage(0.1);
|
||||
// b.giveGuns("nail gun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
|
||||
// b.guns[0].ammo = 1000000
|
||||
|
||||
// tech.giveTech("Meissner effect")
|
||||
// for (let i = 0; i < 4; ++i) tech.giveTech("bound state")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("isotropic")
|
||||
// tech.giveTech("sympathetic resonance")
|
||||
// for (let i = 0; i < 9; i++) tech.giveTech("replication")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("mass-energy equivalence")
|
||||
// tech.giveTech("Zeno's paradox")
|
||||
// tech.giveTech("homeostasis")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("1st ionization energy")
|
||||
// for (let i = 0; i < 1; i++) tech.giveTech("negative feedback")
|
||||
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "tech");
|
||||
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "boost");
|
||||
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "coupling");
|
||||
@@ -42,14 +42,14 @@ const level = {
|
||||
// level.testing();
|
||||
// spawn.starter(1900, -500)
|
||||
// spawn.beetleBoss(2538, -1950)
|
||||
// for (let i = 0; i < 33; ++i) spawn.starter(1000 + 5000 * Math.random(), -500 + 300 * Math.random())
|
||||
// tech.addJunkTechToPool(2)
|
||||
// for (let i = 0; i < 33; ++i) spawn.sniper(1000 + 5000 * Math.random(), -500 + 300 * Math.random())
|
||||
// tech.addJunkTechToPool(0.5)
|
||||
// tech.tech[322].frequency = 100
|
||||
// spawn.tetherBoss(1900, -500, { x: 1900, y: -500 })
|
||||
// for (let i = 0; i < 13; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research");
|
||||
// for (let i = 0; i < 4; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech");
|
||||
|
||||
// for (let i = 0; i < 13; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research");
|
||||
if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************
|
||||
// for (let i = 0; i < 4; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech");
|
||||
// for (let i = 0; i < 30; i++) powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "tech", false);
|
||||
|
||||
//lore testing
|
||||
@@ -58,7 +58,7 @@ const level = {
|
||||
// simulation.isCheating = false //true;
|
||||
// level.levelsCleared = 10
|
||||
// mobs.mobDeaths = 200
|
||||
// localSettings.loreCount = 6 //this sets what conversation is heard
|
||||
// localSettings.loreCount = 7 //this sets what conversation is heard
|
||||
// if (localSettings.isAllowed) localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
|
||||
// level.onLevel = -1 //this sets level.levels[level.onLevel] = undefined which is required to run the conversation
|
||||
// level.null()
|
||||
@@ -117,14 +117,23 @@ const level = {
|
||||
powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "tech", false);
|
||||
}
|
||||
if (tech.isHealLowHealth) {
|
||||
const len = Math.ceil((m.maxHealth - m.health) / 0.29)
|
||||
// if (tech.isEnergyHealth) {
|
||||
// var len = Math.ceil((m.maxEnergy - m.energy) / 0.33)
|
||||
// } else {
|
||||
// var len = Math.ceil((m.maxHealth - m.health) / 0.33)
|
||||
// }
|
||||
if (tech.isEnergyHealth) {
|
||||
var len = 3 * (1 - m.energy / m.maxEnergy) //as a percent
|
||||
} else {
|
||||
var len = 3 * (1 - m.health / m.maxHealth) //as a percent
|
||||
}
|
||||
for (let i = 0; i < len; i++) powerUps.spawn(player.position.x + 90 * (Math.random() - 0.5), player.position.y + 90 * (Math.random() - 0.5), "heal", false);
|
||||
}
|
||||
if (tech.isMACHO) spawn.MACHO()
|
||||
for (let i = 0; i < tech.wimpCount; i++) {
|
||||
spawn.WIMP()
|
||||
mob[mob.length - 1].isDecoupling = true //so you can find it to remove
|
||||
for (let j = 0, len = 5; j < len; j++) powerUps.spawn(level.exit.x + 100 * (Math.random() - 0.5), level.exit.y - 100 + 100 * (Math.random() - 0.5), "research", false)
|
||||
for (let j = 0, len = 4; j < len; j++) powerUps.spawn(level.exit.x + 100 * (Math.random() - 0.5), level.exit.y - 100 + 100 * (Math.random() - 0.5), "research", false)
|
||||
}
|
||||
// if (tech.isFlipFlopLevelReset && !tech.isFlipFlopOn) {
|
||||
if ((tech.isRelay || tech.isFlipFlop) && !tech.isFlipFlopOn) {
|
||||
@@ -1320,7 +1329,7 @@ const level = {
|
||||
}
|
||||
},
|
||||
isHazardRise: false,
|
||||
hazard(x, y, width, height, damage = 0.003) {
|
||||
hazard(x, y, width, height, damage = 0.002) {
|
||||
return {
|
||||
min: {
|
||||
x: x,
|
||||
@@ -1374,7 +1383,7 @@ const level = {
|
||||
|
||||
if (this.height > 0 && Matter.Query.region([player], this).length) {
|
||||
if (m.immuneCycle < m.cycle) {
|
||||
const DRAIN = 0.0032 * (tech.isRadioactiveResistance ? 0.25 : 1)
|
||||
const DRAIN = 0.004 * (tech.isRadioactiveResistance ? 0.25 : 1)
|
||||
if (m.energy > DRAIN) {
|
||||
m.energy -= DRAIN
|
||||
// m.damage(damage * (tech.isRadioactiveResistance ? 0.25 : 1) * 0.03) //still take 2% damage while you have energy
|
||||
@@ -3297,9 +3306,11 @@ const level = {
|
||||
} else {
|
||||
powerUps.spawnStartingPowerUps(2095 + 15 * (Math.random() - 0.5), -2070 - 125);
|
||||
}
|
||||
powerUps.spawn(2095 + 15 * (Math.random() - 0.5), -2070 - 25, "heal", false);
|
||||
powerUps.spawn(2095 + 15 * (Math.random() - 0.5), -2070 - 75, "heal", false);
|
||||
powerUps.spawn(2095 + 15 * (Math.random() - 0.5), -2070, "research", false);
|
||||
if (simulation.difficultyMode < 5) {
|
||||
powerUps.spawn(2095 + 15 * (Math.random() - 0.5), -2070 - 25, "heal", false);
|
||||
powerUps.spawn(2095 + 15 * (Math.random() - 0.5), -2070 - 75, "heal", false);
|
||||
powerUps.spawn(2095 + 15 * (Math.random() - 0.5), -2070, "research", false); //not on why difficulty
|
||||
}
|
||||
} else {
|
||||
requestAnimationFrame(cycle);
|
||||
}
|
||||
@@ -8895,7 +8906,7 @@ const level = {
|
||||
buttonThird.query();
|
||||
buttonThird.draw();
|
||||
if (!buttonThird.isUp && !hasSecretButton2) {
|
||||
for (var i = 0; i < 4; i++) powerUps.spawn(1614, -3700, "research");
|
||||
for (var i = 0; i < 1; i++) powerUps.spawn(1614, -3700, "research");
|
||||
hasSecretButton2 = true;
|
||||
}
|
||||
if (!buttonSec.isUp) {
|
||||
|
||||
29
js/player.js
29
js/player.js
@@ -659,11 +659,6 @@ const m = {
|
||||
},
|
||||
collisionImmuneCycles: 30,
|
||||
damage(dmg) {
|
||||
// if (tech.isCouplingNoHit) {
|
||||
// for (let i = 0, len = tech.tech.length; i < len; i++) {
|
||||
// if (tech.tech[i].name === "fine-structure constant") powerUps.ejectTech(i, true)
|
||||
// }
|
||||
// }
|
||||
if (tech.isRewindAvoidDeath && m.energy > 0.6 && dmg > 0.01) {
|
||||
const steps = Math.floor(Math.min(299, 150 * m.energy))
|
||||
simulation.makeTextLog(`<span class='color-var'>m</span>.rewind(${steps})`)
|
||||
@@ -677,9 +672,9 @@ const m = {
|
||||
if (Math.random() < 0.5) b.drone({ x: m.pos.x + 30 * Math.cos(m.angle) + 100 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 100 * (Math.random() - 0.5) }) //spawn drone
|
||||
}
|
||||
}
|
||||
|
||||
if (tech.isEnergyHealth) {
|
||||
m.energy -= dmg
|
||||
dmg *= Math.pow(m.harmReduction(), 0.1) //defense has less effect
|
||||
m.energy -= 0.9 * dmg / Math.sqrt(simulation.healScale) //scale damage with heal reduction difficulty
|
||||
if (m.energy < 0 || isNaN(m.energy)) { //taking deadly damage
|
||||
if (tech.isDeathAvoid && powerUps.research.count && !tech.isDeathAvoidedThisLevel) {
|
||||
tech.isDeathAvoidedThisLevel = true
|
||||
@@ -738,7 +733,6 @@ const m = {
|
||||
document.getElementById("dmg").style.transition = "opacity 0s";
|
||||
document.getElementById("dmg").style.opacity = 0.1 + Math.min(0.6, dmg * 4);
|
||||
}
|
||||
|
||||
if (dmg > 0.03) {
|
||||
m.lastHit = dmg;
|
||||
if (dmg > 0.06 / m.holdingMassScale) m.drop(); //drop block if holding // m.holdingMassScale = 0.5 for most fields
|
||||
@@ -1594,7 +1588,19 @@ const m = {
|
||||
couplingChange(change = 0) {
|
||||
if (change > 0 && level.onLevel !== -1) simulation.makeTextLog(`m.coupling <span class='color-symbol'>+=</span> ${change}`, 60); //level.onLevel !== -1 means not on lore level
|
||||
m.coupling += change
|
||||
if (m.coupling < 0) m.coupling = 0 //can't go negative
|
||||
if (m.coupling < 0) {
|
||||
//look for coupling power ups on this level and remove them to prevent exploiting tech ejections
|
||||
for (let i = powerUp.length - 1; i > -1; i--) {
|
||||
if (powerUp[i].name === "coupling") {
|
||||
Matter.Composite.remove(engine.world, powerUp[i]);
|
||||
powerUp.splice(i, 1);
|
||||
m.coupling += 0.1
|
||||
if (!(m.coupling < 0)) break
|
||||
}
|
||||
}
|
||||
|
||||
m.coupling = 0 //can't go negative
|
||||
}
|
||||
// m.setMaxEnergy();
|
||||
// m.setMaxHealth();
|
||||
m.setFieldRegen()
|
||||
@@ -2922,9 +2928,12 @@ const m = {
|
||||
//not shooting (or using field) enable cloak
|
||||
if (m.energy < 0.05 && m.fireCDcycle < m.cycle && !input.fire) m.fireCDcycle = m.cycle
|
||||
if (m.fireCDcycle + 30 < m.cycle && !input.fire) { //automatically cloak if not firing
|
||||
if (!m.isCloak) {
|
||||
const drain = 0.1
|
||||
if (!m.isCloak && m.energy > drain) {
|
||||
m.energy -= drain
|
||||
m.isCloak = true //enter cloak
|
||||
|
||||
|
||||
// m.color = {
|
||||
// hue: 0,
|
||||
// sat: 0,
|
||||
|
||||
@@ -31,6 +31,7 @@ const powerUps = {
|
||||
time: 16
|
||||
});
|
||||
},
|
||||
healGiveMaxEnergy: false, //for tech 1st ionization energy
|
||||
orb: {
|
||||
research(num = 1) {
|
||||
switch (num) {
|
||||
@@ -98,19 +99,35 @@ const powerUps = {
|
||||
return text
|
||||
},
|
||||
heal(num = 1) {
|
||||
switch (num) {
|
||||
case 1:
|
||||
return `<div class="heal-circle"></div>`
|
||||
if (powerUps.healGiveMaxEnergy) {
|
||||
switch (num) {
|
||||
case 1:
|
||||
return `<div class="heal-circle-energy"></div>`
|
||||
}
|
||||
let text = '<span style="position:relative;">'
|
||||
for (let i = 0; i < num; i++) {
|
||||
text += `<div class="heal-circle-energy" style="position:absolute; top:1px; left:${i*10}px;"></div>`
|
||||
}
|
||||
text += '</span> '
|
||||
for (let i = 0; i < num; i++) {
|
||||
text += ' '
|
||||
}
|
||||
return text
|
||||
} else {
|
||||
switch (num) {
|
||||
case 1:
|
||||
return `<div class="heal-circle"></div>`
|
||||
}
|
||||
let text = '<span style="position:relative;">'
|
||||
for (let i = 0; i < num; i++) {
|
||||
text += `<div class="heal-circle" style="position:absolute; top:1px; left:${i*10}px;"></div>`
|
||||
}
|
||||
text += '</span> '
|
||||
for (let i = 0; i < num; i++) {
|
||||
text += ' '
|
||||
}
|
||||
return text
|
||||
}
|
||||
let text = '<span style="position:relative;">'
|
||||
for (let i = 0; i < num; i++) {
|
||||
text += `<div class="heal-circle" style="position:absolute; top:1px; left:${i*10}px;"></div>`
|
||||
}
|
||||
text += '</span> '
|
||||
for (let i = 0; i < num; i++) {
|
||||
text += ' '
|
||||
}
|
||||
return text
|
||||
},
|
||||
tech(num = 1) {
|
||||
return `<div class="tech-circle"></div>`
|
||||
@@ -122,11 +139,11 @@ const powerUps = {
|
||||
}
|
||||
let text = '<span style="position:relative;">'
|
||||
for (let i = 0; i < num; i++) {
|
||||
text += `<div class="coupling-circle" style="position:absolute; top:1.5px; left:${i*8}px;"></div>`
|
||||
text += `<div class="coupling-circle" style="position:absolute; top:1.5px; left:${i*6}px;"></div>`
|
||||
}
|
||||
text += '</span> '
|
||||
text += '</span> '
|
||||
for (let i = 0; i < num; i++) {
|
||||
text += ' '
|
||||
text += '  '
|
||||
}
|
||||
return text
|
||||
},
|
||||
@@ -452,9 +469,8 @@ const powerUps = {
|
||||
changeRerolls(amount) {
|
||||
if (amount !== 0) {
|
||||
powerUps.research.count += amount
|
||||
if (powerUps.research.count < 0) {
|
||||
powerUps.research.count = 0
|
||||
}
|
||||
// if (powerUps.research.count < 0) powerUps.research.count = 0
|
||||
|
||||
// else {
|
||||
// simulation.makeTextLog(`powerUps.research.count <span class='color-symbol'>+=</span> ${amount}`) // <br>${powerUps.research.count}
|
||||
// }
|
||||
@@ -520,11 +536,11 @@ const powerUps = {
|
||||
name: "heal",
|
||||
color: "#0eb",
|
||||
size() {
|
||||
return Math.sqrt(0.1 + 0.25) * 40 * (simulation.healScale ** 0.25) * Math.sqrt(tech.largerHeals) * (tech.isFlipFlopOn && tech.isFlipFlopHealth ? Math.sqrt(2) : 1); //(simulation.healScale ** 0.25) gives a smaller radius as heal scale goes down
|
||||
return Math.sqrt(0.1 + 0.25) * 40 * (simulation.healScale ** 0.25) * Math.sqrt(tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)) * (tech.isFlipFlopOn && tech.isFlipFlopHealth ? Math.sqrt(2) : 1); //(simulation.healScale ** 0.25) gives a smaller radius as heal scale goes down
|
||||
},
|
||||
effect() {
|
||||
if (!tech.isEnergyHealth && m.alive && !tech.isNoHeals) {
|
||||
const heal = (this.size / 40 / (simulation.healScale ** 0.25)) ** 2 //simulation.healScale is undone here because heal scale is already properly affected on m.addHealth()
|
||||
if (!tech.isEnergyHealth && m.alive) {
|
||||
let heal = (this.size / 40 / (simulation.healScale ** 0.25)) ** 2 //simulation.healScale is undone here because heal scale is already properly affected on m.addHealth()
|
||||
// console.log("size = " + this.size, "heal = " + heal)
|
||||
if (heal > 0) {
|
||||
const overHeal = m.health + heal * simulation.healScale - m.maxHealth //used with tech.isOverHeal
|
||||
@@ -547,8 +563,8 @@ const powerUps = {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tech.healGiveMaxEnergy) {
|
||||
tech.healMaxEnergyBonus += 0.08 * tech.largerHeals
|
||||
if (powerUps.healGiveMaxEnergy) {
|
||||
tech.healMaxEnergyBonus += 0.08 * tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)
|
||||
m.setMaxEnergy();
|
||||
}
|
||||
},
|
||||
@@ -670,7 +686,7 @@ const powerUps = {
|
||||
}
|
||||
}
|
||||
if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
|
||||
tech.junkResearchNumber = Math.ceil(3 * Math.random())
|
||||
tech.junkResearchNumber = Math.ceil(4 * Math.random())
|
||||
text += `<div class="choose-grid-module" onclick="powerUps.research.use('gun')"><div class="grid-title"> <span style="position:relative;">`
|
||||
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;"></div>`
|
||||
text += `</span> <span class='research-select'>pseudoscience</span></div></div>`
|
||||
@@ -809,7 +825,7 @@ const powerUps = {
|
||||
}
|
||||
}
|
||||
if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
|
||||
tech.junkResearchNumber = Math.ceil(3 * Math.random())
|
||||
tech.junkResearchNumber = Math.ceil(4 * Math.random())
|
||||
text += `<div class="choose-grid-module" onclick="powerUps.research.use('field')"><div class="grid-title"> <span style="position:relative;">`
|
||||
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;"></div>`
|
||||
text += `</span> <span class='research-select'>pseudoscience</span></div></div>`
|
||||
@@ -1062,11 +1078,11 @@ const powerUps = {
|
||||
}
|
||||
//add in research button or pseudoscience button
|
||||
if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
|
||||
tech.junkResearchNumber = Math.ceil(3 * Math.random())
|
||||
tech.junkResearchNumber = Math.ceil(4 * Math.random())
|
||||
text += `<div class="choose-grid-module" onclick="powerUps.research.use('tech')"><div class="grid-title"> <span style="position:relative;">`
|
||||
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;"></div>`
|
||||
text += `</span> <span class='research-select'>pseudoscience</span></div></div>`
|
||||
} else if (powerUps.research.count) {
|
||||
} else if (powerUps.research.count > 0) {
|
||||
text += `<div class="choose-grid-module" onclick="powerUps.research.use('tech')"><div class="grid-title"> <span style="position:relative;">`
|
||||
for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px;opacity:0.8; border: 1px #fff solid;"></div>`
|
||||
// text += `</span> <span class='research-select'>research</span></div></div>`
|
||||
@@ -1094,7 +1110,7 @@ const powerUps = {
|
||||
},
|
||||
onPickUp(who) {
|
||||
powerUps.research.currentRerollCount = 0
|
||||
if (tech.isTechDamage && who.name === "tech") m.damage(0.12 + 0.12 * tech.isEnergyHealth)
|
||||
if (tech.isTechDamage && who.name === "tech") m.damage(0.1)
|
||||
if (tech.isMassEnergy) m.energy += 2;
|
||||
if (tech.isMineDrop && bullet.length < 150 && Math.random() < 0.6) {
|
||||
if (tech.isLaserMine && input.down) {
|
||||
@@ -1205,7 +1221,7 @@ const powerUps = {
|
||||
}
|
||||
},
|
||||
addResearchToLevel() { //add a random power up to a location that has a mob, mostly used to give each level one randomly placed research
|
||||
if (mob.length && Math.random() < 0.8) { // 80% chance
|
||||
if (mob.length && Math.random() < 0.5 - 0.3 && simulation.difficultyMode < 5) { //lower chance on why difficulty
|
||||
const index = Math.floor(Math.random() * mob.length)
|
||||
powerUps.spawn(mob[index].position.x, mob[index].position.y, "research");
|
||||
}
|
||||
@@ -1263,7 +1279,7 @@ const powerUps = {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} else if (tech.tech[choose].count) {
|
||||
} else if (tech.tech[choose].count && tech.tech[choose].isNonRefundable) {
|
||||
// simulation.makeTextLog(`<div class='circle tech'></div> <strong>${tech.tech[choose].name}</strong> was ejected`, 600) //message about what tech was lost
|
||||
simulation.makeTextLog(`<span class='color-var'>tech</span>.remove("<span class='color-text'>${tech.tech[choose].name}</span>")`)
|
||||
|
||||
@@ -1285,7 +1301,7 @@ const powerUps = {
|
||||
},
|
||||
pauseEjectTech(index) {
|
||||
if ((tech.isPauseEjectTech || simulation.testing) && !simulation.isChoosing && !tech.tech[index].isNonRefundable) {
|
||||
if (Math.random() < 0.16 || tech.tech[index].isFromAppliedScience || (tech.tech[index].bonusResearch !== undefined && tech.tech[index].bonusResearch > powerUps.research.count)) {
|
||||
if (Math.random() < 0.2 || tech.tech[index].isFromAppliedScience || (tech.tech[index].bonusResearch !== undefined && tech.tech[index].bonusResearch > powerUps.research.count)) {
|
||||
tech.removeTech(index)
|
||||
// powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false);
|
||||
} else {
|
||||
|
||||
@@ -1157,8 +1157,13 @@ const simulation = {
|
||||
|
||||
if (!(m.cycle % 420)) { //once every 7 seconds
|
||||
if (tech.isZeno) {
|
||||
m.health *= 0.95 //remove 5%
|
||||
m.displayHealth();
|
||||
if (tech.isEnergyHealth) {
|
||||
m.energy *= 0.95
|
||||
} else {
|
||||
m.health *= 0.95 //remove 5%
|
||||
m.displayHealth();
|
||||
}
|
||||
|
||||
}
|
||||
if (tech.cyclicImmunity && m.immuneCycle < m.cycle + tech.cyclicImmunity) m.immuneCycle = m.cycle + tech.cyclicImmunity; //player is immune to damage for 60 cycles
|
||||
|
||||
|
||||
32
js/spawn.js
32
js/spawn.js
@@ -666,8 +666,8 @@ const spawn = {
|
||||
//when player is inside event horizon
|
||||
if (Vector.magnitude(Vector.sub(this.position, player.position)) < this.eventHorizon) {
|
||||
if (m.immuneCycle < m.cycle) {
|
||||
if (m.energy > 0) m.energy -= 0.015
|
||||
if (m.energy < 0.05 && m.immuneCycle < m.cycle) m.damage(0.0005 * simulation.dmgScale);
|
||||
if (m.energy > 0) m.energy -= 0.02
|
||||
if (m.energy < 0.05 && m.immuneCycle < m.cycle) m.damage(0.0004 * simulation.dmgScale);
|
||||
}
|
||||
const angle = Math.atan2(player.position.y - this.position.y, player.position.x - this.position.x);
|
||||
player.force.x -= 0.0017 * Math.cos(angle) * player.mass * (m.onGround ? 1.7 : 1);
|
||||
@@ -1317,8 +1317,10 @@ const spawn = {
|
||||
me.onHit = function() { //run this function on hitting player
|
||||
if (powerUps.ejectTech()) {
|
||||
powerUps.ejectGraphic("150, 138, 255");
|
||||
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo");
|
||||
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "research");
|
||||
// powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo");
|
||||
// powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "research");
|
||||
this.accelMag *= 1.4
|
||||
Matter.Body.setDensity(this, this.density * 1.4); //normal is 0.001
|
||||
}
|
||||
};
|
||||
me.onDeath = function() {
|
||||
@@ -1397,8 +1399,10 @@ const spawn = {
|
||||
me.onHit = function() { //run this function on hitting player
|
||||
if (powerUps.ejectTech()) {
|
||||
powerUps.ejectGraphic("150, 138, 255");
|
||||
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo");
|
||||
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "research");
|
||||
// powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo");
|
||||
// powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "research");
|
||||
this.accelMag *= 1.4
|
||||
Matter.Body.setDensity(this, this.density * 1.4); //normal is 0.001
|
||||
}
|
||||
};
|
||||
me.onDeath = function() {
|
||||
@@ -1874,8 +1878,8 @@ const spawn = {
|
||||
//when player is inside event horizon
|
||||
if (Vector.magnitude(Vector.sub(this.position, player.position)) < eventHorizon) {
|
||||
if (m.immuneCycle < m.cycle) {
|
||||
if (m.energy > 0) m.energy -= 0.004
|
||||
if (m.energy < 0.1) m.damage(0.00015 * simulation.dmgScale);
|
||||
if (m.energy > 0) m.energy -= 0.005
|
||||
if (m.energy < 0.1) m.damage(0.0001 * simulation.dmgScale);
|
||||
}
|
||||
const angle = Math.atan2(player.position.y - this.position.y, player.position.x - this.position.x);
|
||||
player.force.x -= 0.00125 * player.mass * Math.cos(angle) * (m.onGround ? 1.8 : 1);
|
||||
@@ -2056,8 +2060,8 @@ const spawn = {
|
||||
//when player is inside event horizon
|
||||
if (Vector.magnitude(Vector.sub(this.position, player.position)) < eventHorizon) {
|
||||
if (m.immuneCycle < m.cycle) {
|
||||
if (m.energy > 0) m.energy -= 0.006
|
||||
if (m.energy < 0.1) m.damage(0.0002 * simulation.dmgScale);
|
||||
if (m.energy > 0) m.energy -= 0.008
|
||||
if (m.energy < 0.1) m.damage(0.00015 * simulation.dmgScale);
|
||||
}
|
||||
const angle = Math.atan2(player.position.y - this.position.y, player.position.x - this.position.x);
|
||||
player.force.x -= 0.0013 * Math.cos(angle) * player.mass * (m.onGround ? 1.7 : 1);
|
||||
@@ -3284,9 +3288,9 @@ const spawn = {
|
||||
mobs.spawn(x, y, 5, 50, "rgb(0,235,255)"); //"rgb(221,102,119)"
|
||||
let me = mob[mob.length - 1];
|
||||
Matter.Body.rotate(me, Math.PI * 0.1);
|
||||
Matter.Body.setDensity(me, 0.003); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
Matter.Body.setDensity(me, 0.002); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
me.isBoss = true;
|
||||
me.damageReduction = 0.04 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
|
||||
me.damageReduction = 0.03 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
|
||||
|
||||
me.frictionStatic = 0;
|
||||
me.friction = 0;
|
||||
@@ -3300,7 +3304,7 @@ const spawn = {
|
||||
me.grenadeDelay = 100
|
||||
}
|
||||
me.pulseRadius = 1.5 * Math.min(550, 200 + simulation.difficulty * 2)
|
||||
me.delay = 30 + 35 * simulation.CDScale;
|
||||
me.delay = 35 + 35 * simulation.CDScale;
|
||||
me.nextBlinkCycle = me.delay;
|
||||
spawn.shield(me, x, y, 1);
|
||||
me.onDamage = function() {
|
||||
@@ -6029,7 +6033,7 @@ const spawn = {
|
||||
this.cycle++
|
||||
if (this.seePlayer.recall && ((this.cycle % 15) === 0)) {
|
||||
if (this.canFire) {
|
||||
if (this.cycle > 120) {
|
||||
if (this.cycle > 100) {
|
||||
this.cycle = 0
|
||||
this.canFire = false
|
||||
// Matter.Body.setAngularVelocity(this, 0.1)
|
||||
|
||||
558
js/tech.js
558
js/tech.js
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user