moving code to my other computer
This commit is contained in:
@@ -5112,7 +5112,7 @@ const b = {
|
||||
minDmgSpeed: 2,
|
||||
lookFrequency: 20 + Math.floor(7 * Math.random()) - 13 * tech.isLaserBotUpgrade,
|
||||
range: (700 + 500 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()),
|
||||
drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4,// laser bot will not attack if the player is below this energy
|
||||
drainThreshold: 0.15 + 0.5 * Math.random() + (tech.isEnergyHealth ? 0.3 : 0),// laser bot will not attack if the player is below this energy
|
||||
drain: (0.57 - 0.45 * tech.isLaserBotUpgrade) * tech.laserDrain,
|
||||
laserDamage: 0.75 + 0.75 * tech.isLaserBotUpgrade,
|
||||
endCycle: Infinity,
|
||||
|
||||
21
js/level.js
21
js/level.js
@@ -18,7 +18,7 @@ const level = {
|
||||
// simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode
|
||||
// simulation.isHorizontalFlipped = true
|
||||
// tech.giveTech("performance")
|
||||
// level.difficultyIncrease(4 * 4) //30 is near max on hard //60 is near max on why
|
||||
// level.difficultyIncrease(12 * 4) //30 is near max on hard //60 is near max on why
|
||||
// spawn.setSpawnList();
|
||||
// spawn.setSpawnList();
|
||||
// m.maxHealth = m.health = 100
|
||||
@@ -28,16 +28,17 @@ const level = {
|
||||
// tech.tech[297].frequency = 100
|
||||
// m.couplingChange(5)
|
||||
// m.setField("standing wave") //1 standing wave 2 perfect diamagnetism 3 negative mass 4 molecular assembler 5 plasma torch 6 time dilation 7 metamaterial cloaking 8 pilot wave 9 wormhole
|
||||
// m.energy = 0
|
||||
// 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.giveGuns("foam") //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[3].ammo = 100000000
|
||||
// tech.giveTech("recycling")
|
||||
// tech.giveTech("fine-structure constant")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("bot fabrication")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("accretion")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("superdeterminism")
|
||||
// tech.giveTech("surface plasmons")
|
||||
// tech.giveTech("relativistic momentum")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("dye laser")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("free-electron laser")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("causality bots")
|
||||
// requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("foam-bot") });
|
||||
// for (let i = 0; i < 1; i++) tech.giveTech("foam-bot upgrade")
|
||||
// for (let i = 0; i < 3; i++) powerUps.directSpawn(450, -50, "tech");
|
||||
@@ -48,8 +49,8 @@ const level = {
|
||||
// spawn.nodeGroup(2200, -300, "sniper")
|
||||
// spawn.nodeGroup(2200, -300, "sniper")
|
||||
// spawn.mantisBoss(1900, -500)
|
||||
// spawn.sneakBoss(1900, -500)
|
||||
// spawn.starter(1900, -500, 250)
|
||||
// spawn.cellBoss(1900, -500)
|
||||
// for (let i = 0; i < 5; ++i) spawn.sneaker(1900, -500, 50)
|
||||
// spawn.sneaker(1900, -500, 25)
|
||||
// spawn.sniper(2000, -450)
|
||||
// spawn.zombie(1000 + 1000 * Math.random(), -500 + 300 * Math.random(), 30, 5, "white") // zombie(x, y, radius, sides, color)
|
||||
@@ -16587,8 +16588,8 @@ const level = {
|
||||
|
||||
|
||||
|
||||
spawn.randomLevelBoss(17902, -1689, ["blinkBoss", "shooterBoss", "launcherBoss", "pulsarBoss", "blockBoss", "bladeBoss", "revolutionBoss", "spawnerBossCulture", "spiderBoss", "sneakBoss", "snakeSpitBoss"])
|
||||
|
||||
// spawn.randomLevelBoss(17902, -1689, ["blinkBoss", "shooterBoss", "launcherBoss", "pulsarBoss", "blockBoss", "bladeBoss", "revolutionBoss", "spawnerBossCulture", "spiderBoss", "sneakBoss", "snakeSpitBoss"])
|
||||
spawn.randomLevelBoss(17902, -1689, ["launcherBoss", "laserTargetingBoss", "blinkBoss", "streamBoss", "historyBoss", "grenadierBoss", "blockBoss", "revolutionBoss", "slashBoss"]);
|
||||
|
||||
// powerUps.spawnStartingPowerUps(1475, -1175);
|
||||
// spawn.debris(750, -2200, 3700, 16); //16 debris per level
|
||||
|
||||
123
js/player.js
123
js/player.js
@@ -455,6 +455,7 @@ const m = {
|
||||
m.alive = false;
|
||||
simulation.paused = true;
|
||||
m.health = 0;
|
||||
simulation.ephemera = []
|
||||
document.getElementById("defense-bar").style.display = "none"; //hide defense
|
||||
document.getElementById("damage-bar").style.display = "none"
|
||||
m.displayHealth();
|
||||
@@ -468,7 +469,7 @@ const m = {
|
||||
}, 5000);
|
||||
}
|
||||
},
|
||||
storeTech() { //store a copy of your tech, it will show up at your location next run
|
||||
storeTech() { //store a copy of your tech, it will show up at your location next run in the entanglement power up
|
||||
if (localSettings.isAllowed && !simulation.isCheating) {
|
||||
const gunList = [] //store gun names
|
||||
for (i = 0, len = b.inventory.length; i < len; i++) gunList.push(b.inventory[i])
|
||||
@@ -1950,7 +1951,6 @@ const m = {
|
||||
m.fieldRegen = 0.001 //6 energy per second
|
||||
}
|
||||
if (m.fieldMode === 0 || m.fieldMode === 4) m.fieldRegen += 0.00133 * m.coupling //return `generate <strong>${(6*couple).toFixed(0)}</strong> <strong class='color-f'>energy</strong> per second`
|
||||
|
||||
if (tech.isTimeCrystals) {
|
||||
m.fieldRegen *= 3
|
||||
} else if (tech.isGroundState) {
|
||||
@@ -1958,11 +1958,11 @@ const m = {
|
||||
}
|
||||
},
|
||||
regenEnergy: function () { //used in drawRegenEnergy // rewritten by some tech
|
||||
if (m.immuneCycle < m.cycle) m.energy += m.fieldRegen;
|
||||
if (m.immuneCycle < m.cycle && m.fieldCDcycle < m.cycle) m.energy += m.fieldRegen;
|
||||
if (m.energy < 0) m.energy = 0
|
||||
},
|
||||
regenEnergyDefault: function () {
|
||||
if (m.immuneCycle < m.cycle) m.energy += m.fieldRegen;
|
||||
if (m.immuneCycle < m.cycle && m.fieldCDcycle < m.cycle) m.energy += m.fieldRegen;
|
||||
if (m.energy < 0) m.energy = 0
|
||||
},
|
||||
lookingAt(who) {
|
||||
@@ -2271,8 +2271,27 @@ const m = {
|
||||
pushMass(who, fieldBlockCost = (0.025 + Math.sqrt(who.mass) * Vector.magnitude(Vector.sub(who.velocity, player.velocity)) * 0.002) * m.fieldShieldingScale) {
|
||||
if (m.energy > fieldBlockCost * 0.2) { //shield needs at least some of the cost to block
|
||||
m.energy -= fieldBlockCost
|
||||
if (m.energy < 0) m.energy = 0;
|
||||
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
|
||||
if (m.energy < 0) {
|
||||
m.energy = 0;
|
||||
m.fieldCDcycle = m.cycle + Math.max(m.fieldBlockCD, 60);
|
||||
if (tech.isLaserField) {
|
||||
simulation.ephemera.push({
|
||||
name: "laser field", //used to find this array element in simulation.removeEphemera()
|
||||
// tech.laserDrain = 0.0018;
|
||||
count: Math.floor(m.maxEnergy * 30) * 0.0018 / tech.laserDrain, //how many cycles the ephemera lasts, scales with max energy
|
||||
do() {
|
||||
this.count--
|
||||
if (this.count < 0) simulation.removeEphemera(this.name)
|
||||
for (let i = 0, num = 12; i < num; i++) { //draw random lasers
|
||||
const angle = 6.28 * i / num + m.cycle * 0.04
|
||||
b.laser({ x: m.pos.x + 30 * Math.cos(angle), y: m.pos.y + 30 * Math.sin(angle) }, { x: m.pos.x + 3000 * Math.cos(angle), y: m.pos.y + 3000 * Math.sin(angle) })//dmg = tech.laserDamage, reflections = tech.laserReflections, isThickBeam = false, push = 1
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
} else {
|
||||
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
|
||||
}
|
||||
if (!who.isInvulnerable && (m.coupling && m.fieldMode < 3) && bullet.length < 250) { //for standing wave mostly
|
||||
for (let i = 0; i < m.coupling; i++) {
|
||||
if (m.coupling - i > Math.random()) {
|
||||
@@ -2282,24 +2301,10 @@ const m = {
|
||||
b.iceIX(6 + 6 * Math.random(), angle + 3 * (Math.random() - 0.5), Vector.add(m.pos, rad))
|
||||
}
|
||||
}
|
||||
|
||||
// let count = 0
|
||||
// for(let j=0; j<100;j++){
|
||||
// const len = m.coupling + 0.5 * (Math.random() - 0.5)
|
||||
// for (let i = 0; i < len; i++) {
|
||||
// count++
|
||||
// }
|
||||
// }
|
||||
// console.log(count)
|
||||
|
||||
}
|
||||
const unit = Vector.normalise(Vector.sub(player.position, who.position))
|
||||
if (tech.blockDmg) {
|
||||
Matter.Body.setVelocity(who, {
|
||||
x: 0.5 * who.velocity.x,
|
||||
y: 0.5 * who.velocity.y
|
||||
});
|
||||
|
||||
Matter.Body.setVelocity(who, { x: 0.5 * who.velocity.x, y: 0.5 * who.velocity.y });
|
||||
if (who.isShielded) {
|
||||
for (let i = 0, len = mob.length; i < len; i++) {
|
||||
if (mob[i].id === who.shieldID) mob[i].damage(tech.blockDmg * m.dmgScale * (tech.isBlockRadiation ? 6 : 2), true)
|
||||
@@ -2313,10 +2318,8 @@ const m = {
|
||||
} else {
|
||||
who.damage(tech.blockDmg * m.dmgScale, true)
|
||||
}
|
||||
|
||||
//draw electricity
|
||||
const step = 40
|
||||
ctx.beginPath();
|
||||
ctx.beginPath(); //draw electricity
|
||||
for (let i = 0, len = 0.8 * tech.blockDmg; i < len; i++) {
|
||||
let x = m.pos.x - 20 * unit.x;
|
||||
let y = m.pos.y - 20 * unit.y;
|
||||
@@ -2333,30 +2336,18 @@ const m = {
|
||||
} else {
|
||||
m.drawHold(who);
|
||||
}
|
||||
// if (tech.isFreezeMobs) mobs.statusSlow(who, 60) //this works but doesn't have a fun effect
|
||||
if (tech.isStunField) mobs.statusStun(who, tech.isStunField)
|
||||
// m.holdingTarget = null
|
||||
//knock backs
|
||||
const massRoot = Math.sqrt(Math.min(12, Math.max(0.15, who.mass))); // masses above 12 can start to overcome the push back
|
||||
Matter.Body.setVelocity(who, {
|
||||
x: player.velocity.x - (15 * unit.x) / massRoot,
|
||||
y: player.velocity.y - (15 * unit.y) / massRoot
|
||||
});
|
||||
Matter.Body.setVelocity(who, { x: player.velocity.x - (15 * unit.x) / massRoot, y: player.velocity.y - (15 * unit.y) / massRoot });
|
||||
if (who.isUnstable) {
|
||||
if (m.fieldCDcycle < m.cycle + 30) m.fieldCDcycle = m.cycle + 10
|
||||
who.death();
|
||||
}
|
||||
|
||||
if (m.crouch) {
|
||||
Matter.Body.setVelocity(player, {
|
||||
x: player.velocity.x + 0.1 * m.blockingRecoil * unit.x * massRoot,
|
||||
y: player.velocity.y + 0.1 * m.blockingRecoil * unit.y * massRoot
|
||||
});
|
||||
Matter.Body.setVelocity(player, { x: player.velocity.x + 0.1 * m.blockingRecoil * unit.x * massRoot, y: player.velocity.y + 0.1 * m.blockingRecoil * unit.y * massRoot });
|
||||
} else {
|
||||
Matter.Body.setVelocity(player, {
|
||||
x: player.velocity.x + m.blockingRecoil * unit.x * massRoot,
|
||||
y: player.velocity.y + m.blockingRecoil * unit.y * massRoot
|
||||
});
|
||||
Matter.Body.setVelocity(player, { x: player.velocity.x + m.blockingRecoil * unit.x * massRoot, y: player.velocity.y + m.blockingRecoil * unit.y * massRoot });
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2371,7 +2362,7 @@ const m = {
|
||||
mob[i].locatePlayer();
|
||||
m.pushMass(mob[i]);
|
||||
if (mob[i].isShielded) {
|
||||
m.fieldCDcycle = m.cycle + 60
|
||||
m.fieldCDcycle = m.cycle + 30
|
||||
} else if (tech.deflectEnergy && !mob[i].isInvulnerable) {
|
||||
m.energy += tech.deflectEnergy
|
||||
}
|
||||
@@ -2577,7 +2568,7 @@ const m = {
|
||||
if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
|
||||
m.grabPowerUp();
|
||||
m.lookForPickUp();
|
||||
if (m.energy > 0.05) {
|
||||
if (m.energy > 0) {
|
||||
m.drawField();
|
||||
m.pushMobsFacing();
|
||||
}
|
||||
@@ -2601,7 +2592,7 @@ const m = {
|
||||
m.fieldBlockCD = 0;
|
||||
m.blockingRecoil = 2 //4 is normal
|
||||
m.fieldRange = 185
|
||||
m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
|
||||
m.fieldShieldingScale = 1.6 * Math.pow(0.6, (tech.harmonics - 2))
|
||||
// m.fieldHarmReduction = 0.66; //33% reduction
|
||||
|
||||
m.harmonic3Phase = () => { //normal standard 3 different 2-d circles
|
||||
@@ -2629,7 +2620,7 @@ const m = {
|
||||
m.pushMass(mob[i]);
|
||||
this.drainCD = m.cycle + 15
|
||||
}
|
||||
if (mob[i].isShielded || mob[i].shield) m.fieldCDcycle = m.cycle + 20
|
||||
if (mob[i].isShielded || mob[i].shield) m.fieldCDcycle = m.cycle + 10
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2680,7 +2671,7 @@ const m = {
|
||||
} else {
|
||||
m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
||||
}
|
||||
if (m.energy > 0.1 && m.fieldCDcycle < m.cycle) {
|
||||
if (m.energy > 0 && m.fieldCDcycle < m.cycle) {
|
||||
if (tech.isStandingWaveExpand) {
|
||||
if (input.field) {
|
||||
// const oldHarmonicRadius = m.harmonicRadius
|
||||
@@ -2728,7 +2719,7 @@ const m = {
|
||||
) {
|
||||
mob[i].locatePlayer();
|
||||
const unit = Vector.normalise(Vector.sub(m.fieldPosition, mob[i].position))
|
||||
m.fieldCDcycle = m.cycle + m.fieldBlockCD + (mob[i].isShielded ? 15 : 0);
|
||||
m.fieldCDcycle = m.cycle + m.fieldBlockCD + (mob[i].isShielded ? 18 : 0);
|
||||
if (!mob[i].isInvulnerable && bullet.length < 250) {
|
||||
for (let i = 0; i < m.coupling; i++) {
|
||||
if (m.coupling - i > Math.random()) {
|
||||
@@ -3208,7 +3199,6 @@ const m = {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m.isHolding) {
|
||||
m.drawHold(m.holdingTarget);
|
||||
m.holding();
|
||||
@@ -3217,7 +3207,7 @@ const m = {
|
||||
if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
|
||||
m.grabPowerUp();
|
||||
m.lookForPickUp();
|
||||
if (m.energy > 0.05) {
|
||||
if (m.energy > 0) {
|
||||
m.drawField();
|
||||
m.pushMobsFacing();
|
||||
}
|
||||
@@ -3736,13 +3726,24 @@ const m = {
|
||||
m.throwBlock();
|
||||
m.wakeCheck();
|
||||
} else if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
|
||||
const drain = 0.002 / (1 + 0.5 * m.coupling)
|
||||
const drain = 0.0014 / (1 + 0.5 * m.coupling)
|
||||
if (m.energy > drain) m.energy -= drain
|
||||
|
||||
m.grabPowerUp();
|
||||
if (this.rewindCount === 0) m.lookForPickUp();
|
||||
if (this.rewindCount === 0) {
|
||||
m.lookForPickUp();
|
||||
}
|
||||
|
||||
if (!m.holdingTarget) {
|
||||
if (this.rewindCount === 0) { //large upfront energy cost to enter rewind mode
|
||||
if (m.energy > 0.3) {
|
||||
m.energy -= 0.3
|
||||
} else {
|
||||
this.rewindCount = 0;
|
||||
m.resetHistory();
|
||||
if (m.fireCDcycle < m.cycle + 60) m.fieldCDcycle = m.cycle + 60
|
||||
m.immuneCycle = m.cycle //if you reach the end of the history disable harm immunity
|
||||
}
|
||||
}
|
||||
this.rewindCount += 6;
|
||||
const DRAIN = 0.003
|
||||
let history = m.history[(m.cycle - this.rewindCount) % 600]
|
||||
@@ -3759,7 +3760,7 @@ const m = {
|
||||
ctx.globalCompositeOperation = "source-over"
|
||||
// m.grabPowerUp(); //a second grab power up to make the power ups easier to grab, and they more fast which matches the time theme
|
||||
m.energy -= DRAIN
|
||||
if (m.immuneCycle < m.cycle + 60) m.immuneCycle = m.cycle + 60; //player is immune to damage for __ cycles
|
||||
if (m.immuneCycle < m.cycle + 5) m.immuneCycle = m.cycle + 5; //player is immune to damage for 5 cycles
|
||||
Matter.Body.setPosition(player, history.position);
|
||||
Matter.Body.setVelocity(player, {
|
||||
x: history.velocity.x,
|
||||
@@ -3776,19 +3777,17 @@ const m = {
|
||||
} else {
|
||||
m.undoCrouch()
|
||||
}
|
||||
if (!(this.rewindCount % 30)) {
|
||||
if (tech.isRewindBot) {
|
||||
for (let i = 0; i < tech.isRewindBot; i++) {
|
||||
b.randomBot(m.pos, false, false)
|
||||
bullet[bullet.length - 1].endCycle = simulation.cycle + 480 + Math.floor(120 * Math.random()) //8-9 seconds
|
||||
}
|
||||
}
|
||||
if (tech.isRewindGrenade) {
|
||||
b.grenade(m.pos, this.rewindCount) //Math.PI / 2
|
||||
const who = bullet[bullet.length - 1]
|
||||
who.endCycle = simulation.cycle + 60
|
||||
if (tech.isRewindBot && !(this.rewindCount % 60)) {
|
||||
for (let i = 0; i < tech.isRewindBot; i++) {
|
||||
b.randomBot(m.pos, false, false)
|
||||
bullet[bullet.length - 1].endCycle = simulation.cycle + 300 + Math.floor(180 * Math.random()) //8-9 seconds
|
||||
}
|
||||
}
|
||||
if (tech.isRewindGrenade && !(this.rewindCount % 30)) {
|
||||
b.grenade(m.pos, this.rewindCount) //Math.PI / 2
|
||||
const who = bullet[bullet.length - 1]
|
||||
who.endCycle = simulation.cycle + 120
|
||||
}
|
||||
}
|
||||
}
|
||||
m.wakeCheck();
|
||||
|
||||
@@ -548,7 +548,7 @@ const powerUps = {
|
||||
simulation.makeTextLog(`<span class='color-var'>m</span>.health <span class='color-symbol'>+=</span> ${(healOutput).toFixed(3)}`) // <br>${m.health.toFixed(3)}
|
||||
if (tech.isOverHeal && overHeal > 0) { //tech quenching
|
||||
const scaledOverHeal = overHeal * 0.7
|
||||
m.damage(scaledOverHeal);
|
||||
m.damage(scaledOverHeal*0.9);
|
||||
simulation.makeTextLog(`<span class='color-var'>m</span>.health <span class='color-symbol'>-=</span> ${(scaledOverHeal).toFixed(3)}`) // <br>${m.health.toFixed(3)}
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
x: m.pos.x,
|
||||
@@ -563,7 +563,6 @@ const powerUps = {
|
||||
requestAnimationFrame(() => {
|
||||
powerUps.directSpawn(this.position.x, this.position.y, "heal", true, null, overHeal * 40 * (simulation.healScale ** 0.25))// directSpawn(x, y, target, moving = true, mode = null, size = powerUps[target].size()) {
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ const simulation = {
|
||||
b.bulletDraw();
|
||||
if (!m.isBodiesAsleep) b.bulletDo();
|
||||
simulation.drawCircle();
|
||||
simulation.runEphemera();
|
||||
// simulation.clip();
|
||||
ctx.restore();
|
||||
simulation.drawCursor();
|
||||
@@ -68,6 +69,7 @@ const simulation = {
|
||||
simulation.draw.cons();
|
||||
simulation.draw.testing();
|
||||
simulation.drawCircle();
|
||||
simulation.runEphemera();
|
||||
simulation.constructCycle()
|
||||
ctx.restore();
|
||||
simulation.testingOutput();
|
||||
@@ -96,6 +98,7 @@ const simulation = {
|
||||
b.fire();
|
||||
b.bulletRemove();
|
||||
b.bulletDo();
|
||||
simulation.runEphemera();
|
||||
}
|
||||
simulation.isTimeSkipping = false;
|
||||
},
|
||||
@@ -113,9 +116,24 @@ const simulation = {
|
||||
if (m.fieldMode !== 7) m.hold();
|
||||
b.bulletRemove();
|
||||
if (!m.isBodiesAsleep) b.bulletDo();
|
||||
simulation.runEphemera();
|
||||
}
|
||||
simulation.isTimeSkipping = false;
|
||||
},
|
||||
ephemera: [], //array that is used to store ephemera objects
|
||||
removeEphemera: function (name) {
|
||||
for (let i = 0, len = simulation.ephemera.length; i < len; i++) {
|
||||
if (simulation.ephemera[i].name === name) {
|
||||
simulation.ephemera.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
runEphemera() {
|
||||
for (let i = 0; i < simulation.ephemera.length; i++) {
|
||||
simulation.ephemera[i].do();
|
||||
}
|
||||
},
|
||||
// timeMobSkip() {
|
||||
// simulation.gravity();
|
||||
// Engine.update(engine, simulation.delta);
|
||||
@@ -745,6 +763,7 @@ const simulation = {
|
||||
level.populateLevels()
|
||||
|
||||
input.endKeySensing();
|
||||
simulation.ephemera = []
|
||||
b.removeAllGuns();
|
||||
tech.setupAllTech(); //sets tech to default values
|
||||
tech.cancelCount = 0;
|
||||
|
||||
@@ -1908,8 +1908,9 @@ const spawn = {
|
||||
|
||||
const k = 642 //k=r^2/m
|
||||
me.split = function () {
|
||||
Matter.Body.scale(this, 0.45, 0.45);
|
||||
this.radius = Math.sqrt(this.mass * k / Math.PI)
|
||||
const scale = 0.45
|
||||
Matter.Body.scale(this, scale, scale);
|
||||
this.radius *= scale;
|
||||
spawn.cellBoss(this.position.x, this.position.y, this.radius, this.cellID);
|
||||
mob[mob.length - 1].health = this.health
|
||||
}
|
||||
@@ -1928,7 +1929,7 @@ const spawn = {
|
||||
if (this.seePlayer.recall && this.mass < this.cellMassMax) { //grow cell radius
|
||||
const scale = 1 + 0.0002 * this.cellMassMax / this.mass;
|
||||
Matter.Body.scale(this, scale, scale);
|
||||
this.radius = Math.sqrt(this.mass * k / Math.PI)
|
||||
this.radius *= scale;
|
||||
}
|
||||
if (!(simulation.cycle % this.seePlayerFreq)) { //move away from other mobs
|
||||
const repelRange = 150
|
||||
|
||||
73
js/tech.js
73
js/tech.js
@@ -258,7 +258,7 @@ const tech = {
|
||||
return dmg
|
||||
},
|
||||
duplicationChance() {
|
||||
return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.043 + tech.duplicateChance + 0.05 * tech.isExtraGunField + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication * (1 - 0.016 * (simulation.difficultyMode ** 2))) // + (m.fieldMode === 0 || m.fieldMode === 9) * 0.03 * m.coupling)
|
||||
return Math.min(1, Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.043 + tech.duplicateChance + 0.05 * tech.isExtraGunField + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication * (1 - 0.016 * (simulation.difficultyMode ** 2)))) // + (m.fieldMode === 0 || m.fieldMode === 9) * 0.03 * m.coupling)
|
||||
},
|
||||
isScaleMobsWithDuplication: false,
|
||||
maxDuplicationEvent() {
|
||||
@@ -1247,8 +1247,10 @@ const tech = {
|
||||
{
|
||||
name: "collider",
|
||||
descriptionFunction() {
|
||||
return `after mobs <strong>die</strong> there is a <strong>+33%</strong> chance <br>to smash <strong>power ups</strong> into a different <strong>flavor</strong>`
|
||||
return `after mobs <strong>die</strong> there is a <strong>+33%</strong> chance to<br>collide <strong>power ups</strong> to form different <strong>power ups</strong>`
|
||||
// return `after mobs <strong>die</strong> there is a <strong>+33%</strong> chance to convert<br>${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, ${powerUps.orb.research(1)}, <strong class='color-m'>tech</strong>, <strong class='color-f'>field</strong>, <strong class='color-g'>gun</strong> into other types`
|
||||
},
|
||||
|
||||
maxCount: 3,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
@@ -2717,7 +2719,7 @@ const tech = {
|
||||
effect() {
|
||||
tech.isCrouchRegen = true; //only used to check for requirements
|
||||
m.regenEnergy = function () {
|
||||
if (m.immuneCycle < m.cycle && m.crouch) m.energy += 7 * m.fieldRegen;
|
||||
if (m.immuneCycle < m.cycle && m.crouch && m.fieldCDcycle < m.cycle) m.energy += 7 * m.fieldRegen;
|
||||
if (m.energy < 0) m.energy = 0
|
||||
}
|
||||
},
|
||||
@@ -2758,7 +2760,7 @@ const tech = {
|
||||
effect() {
|
||||
tech.isDamageAfterKillNoRegen = true;
|
||||
m.regenEnergy = function () {
|
||||
if (m.immuneCycle < m.cycle && (m.lastKillCycle + 300 < m.cycle)) m.energy += m.fieldRegen;
|
||||
if (m.immuneCycle < m.cycle && (m.lastKillCycle + 300 < m.cycle) && m.fieldCDcycle < m.cycle) m.energy += m.fieldRegen;
|
||||
if (m.energy < 0) m.energy = 0
|
||||
}
|
||||
},
|
||||
@@ -2887,7 +2889,7 @@ const tech = {
|
||||
{
|
||||
name: "antiscience",
|
||||
descriptionFunction() {
|
||||
return `<strong>+66%</strong> <strong class='color-d'>damage</strong><br><strong>–10</strong> ${tech.isEnergyHealth ? "<strong class='color-f'>energy</strong>" : "<strong class='color-h'>health</strong>"} after picking up a <strong class='color-m'>tech</strong>`
|
||||
return `<strong>–10</strong> ${tech.isEnergyHealth ? "<strong class='color-f'>energy</strong>" : "<strong class='color-h'>health</strong>"} after picking up a <strong class='color-m'>tech</strong><br><strong>+66%</strong> <strong class='color-d'>damage</strong>`
|
||||
},
|
||||
// description: "<strong>+66%</strong> <strong class='color-d'>damage</strong><br><strong>–10</strong> <strong class='color-h'>health</strong> after picking up a <strong class='color-m'>tech</strong>",
|
||||
maxCount: 1,
|
||||
@@ -3020,9 +3022,9 @@ const tech = {
|
||||
frequencyDefault: 1,
|
||||
isHealTech: true,
|
||||
allowed() {
|
||||
return !tech.isHealAttract
|
||||
return true
|
||||
},
|
||||
requires: "not accretion",
|
||||
requires: "",
|
||||
effect() {
|
||||
tech.isOverHeal = true;
|
||||
},
|
||||
@@ -3032,20 +3034,20 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "accretion",
|
||||
description: `${powerUps.orb.heal(1)} follow you, even between levels<br>spawn ${powerUps.orb.heal(3)}`,
|
||||
description: `${powerUps.orb.heal(1)} follow you, even between levels<br>spawn ${powerUps.orb.heal(5)}`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
isHealTech: true,
|
||||
allowed() {
|
||||
return m.fieldMode !== 9 && !tech.isOverHeal
|
||||
return m.fieldMode !== 9
|
||||
},
|
||||
requires: "not wormhole, quenching",
|
||||
requires: "not wormhole",
|
||||
effect() {
|
||||
tech.isHealAttract = true
|
||||
powerUps.setPowerUpMode();
|
||||
for (let i = 0; i < 3; i++) powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "heal");
|
||||
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");
|
||||
},
|
||||
remove() {
|
||||
tech.isHealAttract = false
|
||||
@@ -3315,7 +3317,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "perturbation theory",
|
||||
description: `if you have no ${powerUps.orb.research(1)} in your inventory<br><strong>+60%</strong> <strong><em>fire rate</em></strong>`,
|
||||
description: `if you have no ${powerUps.orb.research(1)} in your inventory<br><strong>+70%</strong> <strong><em>fire rate</em></strong>`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
@@ -3326,7 +3328,7 @@ const tech = {
|
||||
requires: "no research",
|
||||
effect() {
|
||||
tech.isRerollHaste = true;
|
||||
tech.researchHaste = 0.4;
|
||||
tech.researchHaste = 0.3;
|
||||
b.setFireCD();
|
||||
},
|
||||
remove() {
|
||||
@@ -3399,7 +3401,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "brainstorming",
|
||||
description: "<strong class='color-m'>tech</strong> choices <strong>randomize</strong><br>every <strong>2</strong> seconds for <strong>10</strong> seconds",
|
||||
description: "<strong class='color-m'>tech</strong> choices <strong>randomize</strong><br>every <strong>1.5</strong> seconds for <strong>10</strong> seconds",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
@@ -3411,7 +3413,7 @@ const tech = {
|
||||
effect() {
|
||||
tech.isBrainstorm = true
|
||||
tech.isBrainstormActive = false
|
||||
tech.brainStormDelay = 2000 - simulation.difficultyMode * 100
|
||||
tech.brainStormDelay = 1800 - simulation.difficultyMode * 100
|
||||
},
|
||||
remove() {
|
||||
tech.isBrainstorm = false
|
||||
@@ -6913,7 +6915,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return (tech.haveGunCheck("laser") && !tech.isPulseLaser) || tech.isLaserBotUpgrade
|
||||
return (tech.haveGunCheck("laser") && !tech.isPulseLaser) || tech.isLaserBotUpgrade || tech.isLaserField
|
||||
},
|
||||
requires: "laser, not pulse",
|
||||
effect() {
|
||||
@@ -6998,7 +7000,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser
|
||||
return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade || tech.isLaserField) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser
|
||||
},
|
||||
requires: "laser, not diffuse beam, pulse, or slow light",
|
||||
effect() {
|
||||
@@ -7115,7 +7117,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return (tech.haveGunCheck("laser") || tech.isLaserBotUpgrade || tech.isLaserMine) && !tech.isPulseLaser && tech.laserDrain === 0.0018
|
||||
return (tech.haveGunCheck("laser") || tech.isLaserBotUpgrade || tech.isLaserMine || tech.isLaserField) && !tech.isPulseLaser && tech.laserDrain === 0.0018
|
||||
},
|
||||
requires: "laser, not free-electron, pulse",
|
||||
effect() {
|
||||
@@ -7138,7 +7140,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade) && !tech.isPulseLaser && tech.laserDrain === 0.0018
|
||||
return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade || tech.isLaserField) && !tech.isPulseLaser && tech.laserDrain === 0.0018
|
||||
},
|
||||
requires: "laser, not pulse, infrared diode",
|
||||
effect() {
|
||||
@@ -7163,7 +7165,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade) && !tech.isPulseLaser && tech.laserDrain === 0.0018
|
||||
return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade || tech.isLaserField) && !tech.isPulseLaser && tech.laserDrain === 0.0018
|
||||
},
|
||||
requires: "laser, not pulse, infrared diode",
|
||||
effect() {
|
||||
@@ -7231,6 +7233,25 @@ const tech = {
|
||||
if (this.count > 0) powerUps.research.changeRerolls(2)
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "surface plasmons",
|
||||
description: "if <strong>deflecting</strong> a mob drains all your energy<br>emit <strong class='color-laser'>laser</strong> beams in every direction",
|
||||
isFieldTech: true,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldMode === 4 || m.fieldMode === 1 || m.fieldMode === 0
|
||||
},
|
||||
requires: "molecular assembler, standing wave, field emitter",
|
||||
effect() {
|
||||
tech.isLaserField = true
|
||||
},
|
||||
remove() {
|
||||
tech.isLaserField = false
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "spherical harmonics",
|
||||
description: "<strong>+40%</strong> <strong>standing wave</strong> deflection efficiency<br>no longer deactivates on mob <strong>shields</strong>", //<strong>standing wave</strong> oscillates in a 3rd dimension<br>
|
||||
@@ -7245,19 +7266,18 @@ const tech = {
|
||||
requires: "standing wave",
|
||||
effect() {
|
||||
tech.harmonics++
|
||||
m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
|
||||
m.fieldShieldingScale = 1.6 * Math.pow(0.6, (tech.harmonics - 2))
|
||||
m.harmonicShield = m.harmonicAtomic
|
||||
},
|
||||
remove() {
|
||||
tech.harmonics = 2
|
||||
m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
|
||||
m.fieldShieldingScale = 1.6 * Math.pow(0.6, (tech.harmonics - 2))
|
||||
m.harmonicShield = m.harmonic3Phase
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "expansion",
|
||||
description: "<strong>+50%</strong> <strong>standing wave</strong> deflection efficiency<br>using <strong>standing wave</strong> field <strong>expands</strong> its <strong>radius</strong>",
|
||||
// description: "use <strong class='color-f'>energy</strong> to <strong>expand</strong> <strong>standing wave</strong><br>the field slowly <strong>contracts</strong> when not used",
|
||||
description: "using <strong>standing wave</strong> field <strong>expands</strong> its <strong>radius</strong>",
|
||||
isFieldTech: true,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
@@ -7269,11 +7289,11 @@ const tech = {
|
||||
requires: "standing wave",
|
||||
effect() {
|
||||
tech.isStandingWaveExpand = true
|
||||
m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.3) * Math.pow(0.6, (tech.harmonics - 2))
|
||||
// m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
|
||||
},
|
||||
remove() {
|
||||
tech.isStandingWaveExpand = false
|
||||
m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.3) * Math.pow(0.6, (tech.harmonics - 2))
|
||||
// m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
|
||||
m.harmonicRadius = 1
|
||||
}
|
||||
},
|
||||
@@ -11462,4 +11482,5 @@ const tech = {
|
||||
isDivisor: null,
|
||||
isFoamCavitation: null,
|
||||
isHealAttract: null,
|
||||
isLaserField: null,
|
||||
}
|
||||
Reference in New Issue
Block a user