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,
|
||||
}
|
||||
45
todo.txt
45
todo.txt
@@ -1,20 +1,55 @@
|
||||
******************************************************** NEXT PATCH **************************************************
|
||||
|
||||
some new images
|
||||
tech - after deflecting drains all your energy, shoot lasers in every direction
|
||||
is it too hard to safely lose all energy after deflecting
|
||||
add in some mob knock back or damage immunity?
|
||||
make this a tech?
|
||||
balance damage
|
||||
download image
|
||||
sometimes the field goes on CD after deflection but when energy isn't 0
|
||||
fixed?
|
||||
look at side effects of setting standing wave, molecular assembler, emitter to not disable at 0 energy, not 0.05 or 0.1
|
||||
might allow repeated deflection with no CD?
|
||||
energy regen is disable when deflection is on CD
|
||||
m.fieldCDcycle < m.cycle
|
||||
|
||||
tech expansion no long gives deflection efficiency
|
||||
|
||||
retrocausality drains 30% less energy as time rewinds, but each time you start to rewind you drain 30 energy
|
||||
no longer provides immunity for 1 second after on ending rewind
|
||||
also spawns 20% fewer bots and grenades
|
||||
|
||||
bug fixes
|
||||
|
||||
added a generic system to add code that loops for a set time
|
||||
Example code:
|
||||
simulation.ephemera.push({
|
||||
name: "uniqueName",
|
||||
count: 60, //cycles before it self removes
|
||||
do() {
|
||||
this.count--
|
||||
if (this.count < 0) simulation.removeEphemera(this.name)
|
||||
//run code here
|
||||
},
|
||||
})
|
||||
|
||||
*********************************************************** TODO *****************************************************
|
||||
|
||||
tech: using research spawns a heal and ammo
|
||||
tech: choose next map by name after exiting current map
|
||||
use modified tech selection code?
|
||||
this might be too much work without much reward
|
||||
JUNK only?
|
||||
|
||||
|
||||
build a system to add in methods to an array that runs these objects in the game loop
|
||||
method to run the code
|
||||
condition to remove from array should be inside the method
|
||||
|
||||
Tech: relativity
|
||||
Simulation speed scales with movement speed. When still, time moves at 0.4 speed, at full walking speed it’s 1. (So if you’re falling or something and you move faster the simulation will be faster than usual)
|
||||
Also a damage and/or defense boost to make it worth using
|
||||
|
||||
Tech: Turbine - Energy generation is proportional to your speed up to +X% energy generation at 40 speed
|
||||
Tech: "Electric Reactive Armor": Defense increases by 2% for each 1 energy generation you have
|
||||
|
||||
wormhole tech - teleport away mobs with mass below 3 when they get too near the player
|
||||
short CD, small energy cost, only mobs below a mass
|
||||
@@ -1155,6 +1190,10 @@ possible names for tech
|
||||
nuclear pasta - hard matter in neutron star
|
||||
nonlocal
|
||||
fine-tuned universe
|
||||
nonperturbative
|
||||
D-branes
|
||||
instanton or pseudoparticle
|
||||
soliton (wave packet)
|
||||
hall effect thrusters
|
||||
spaghettification
|
||||
particle accelerator
|
||||
|
||||
Reference in New Issue
Block a user