shape memory
shape-memory alloy now also increases 100% heal power ups when "ON" smelting makes multiple harpoons that fire in a quick succession instead of at different angles costs 2 less ammo harpoon tech filament gives +20% longer rope per ammo ground state: 66->50% less passive energy generation grenadier mobs have a much longer delay before they explode on death level based lasers now damage mobs but don't trick mobs into touching the laser, it's rude bug fixes
This commit is contained in:
36
js/bullet.js
36
js/bullet.js
@@ -1820,8 +1820,9 @@ const b = {
|
||||
} else { //&& simulation.cycle % 2
|
||||
for (let i = 0, len = powerUp.length; i < len; ++i) {
|
||||
const radius = powerUp[i].circleRadius + 50
|
||||
if (Vector.magnitudeSquared(Vector.sub(this.vertices[2], powerUp[i].position)) < radius * radius) {
|
||||
if (Vector.magnitudeSquared(Vector.sub(this.vertices[2], powerUp[i].position)) < radius * radius && !powerUp[i].isGrabbed) {
|
||||
if (powerUp[i].name !== "heal" || m.health !== m.maxHealth || tech.isOverHeal) {
|
||||
powerUp[i].isGrabbed = true
|
||||
this.caughtPowerUp = powerUp[i]
|
||||
Matter.Body.setVelocity(powerUp[i], { x: 0, y: 0 })
|
||||
Matter.Body.setPosition(powerUp[i], this.vertices[2])
|
||||
@@ -6543,11 +6544,11 @@ const b = {
|
||||
x: m.pos.x + harpoonSize * 40 * Math.cos(m.angle),
|
||||
y: m.pos.y + harpoonSize * 40 * Math.sin(m.angle)
|
||||
}
|
||||
if (tech.extraHarpoons && !input.down) { //multiple harpoons
|
||||
const num = Math.min(this.ammo, tech.extraHarpoons + 1)
|
||||
if (!input.down && num > 1) { //multiple harpoons
|
||||
const SPREAD = 0.06
|
||||
const len = tech.extraHarpoons + 1
|
||||
let angle = m.angle - SPREAD * len / 2;
|
||||
for (let i = 0; i < len; i++) {
|
||||
let angle = m.angle - SPREAD * num / 2;
|
||||
for (let i = 0; i < num; i++) {
|
||||
if (this.ammo > 0) {
|
||||
this.ammo--
|
||||
b.grapple(where, angle, true, harpoonSize)
|
||||
@@ -6576,13 +6577,13 @@ const b = {
|
||||
}
|
||||
//look for closest mob in player's LoS
|
||||
const harpoonSize = (tech.isLargeHarpoon ? 1 + 0.1 * Math.sqrt(this.ammo) : 1) //* (input.down ? 0.7 : 1)
|
||||
const totalCycles = 6 * (tech.isFilament ? 1 + 0.01 * Math.min(110, this.ammo) : 1) * Math.sqrt(harpoonSize)
|
||||
const totalCycles = 6 * (tech.isFilament ? 1 + 0.012 * Math.min(110, this.ammo) : 1) * Math.sqrt(harpoonSize)
|
||||
|
||||
if (tech.extraHarpoons && !input.down) { //multiple harpoons
|
||||
const SPREAD = 0.1
|
||||
let angle = m.angle - SPREAD * tech.extraHarpoons / 2;
|
||||
const dir = { x: Math.cos(angle), y: Math.sin(angle) }; //make a vector for the player's direction of length 1; used in dot product
|
||||
const range = 450 * (tech.isFilament ? 1 + 0.005 * Math.min(110, this.ammo) : 1)
|
||||
const range = 450 * (tech.isFilament ? 1 + 0.006 * Math.min(110, this.ammo) : 1)
|
||||
let targetCount = 0
|
||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||
if (mob[i].alive && !mob[i].isBadTarget && !mob[i].shield && Matter.Query.ray(map, m.pos, mob[i].position).length === 0 && !mob[i].isInvulnerable) {
|
||||
@@ -6601,14 +6602,23 @@ const b = {
|
||||
}
|
||||
//if more harpoons and no targets left
|
||||
if (targetCount < tech.extraHarpoons + 1) {
|
||||
const num = tech.extraHarpoons + 1 - targetCount
|
||||
for (let i = 0; i < num; i++) {
|
||||
if (this.ammo > 0) {
|
||||
this.ammo--
|
||||
b.harpoon(where, null, angle, harpoonSize, true, totalCycles) //Vector.angle(Vector.sub(where, mob[i].position), { x: 0, y: 0 })
|
||||
angle += SPREAD
|
||||
const num = tech.extraHarpoons - targetCount
|
||||
const delay = 7 //Math.floor(Math.max(4, 8 - 0.5 * tech.extraHarpoons))
|
||||
let count = -1
|
||||
let harpoonDelay = () => {
|
||||
if (simulation.paused) { requestAnimationFrame(harpoonDelay) } else {
|
||||
count++
|
||||
if (!(count % delay) && this.ammo > 0) {
|
||||
this.ammo--
|
||||
b.harpoon({
|
||||
x: m.pos.x + 30 * Math.cos(m.angle),
|
||||
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||
}, null, m.angle, harpoonSize, true, totalCycles)
|
||||
}
|
||||
if (count < num * delay && m.alive) requestAnimationFrame(harpoonDelay);
|
||||
}
|
||||
}
|
||||
requestAnimationFrame(harpoonDelay)
|
||||
}
|
||||
this.ammo++ //make up for the ammo used up in fire()
|
||||
simulation.updateGunHUD();
|
||||
|
||||
12
js/engine.js
12
js/engine.js
@@ -125,7 +125,17 @@ function collisionChecks(event) {
|
||||
m.eyeFillColor = m.fieldMeterColor //'#0cf'
|
||||
if (!tech.isFlipFlopHarm) m.damage(dmg);
|
||||
}
|
||||
if (tech.isFlipFlopHealth) m.setMaxHealth();
|
||||
if (tech.isFlipFlopHealth) {
|
||||
m.setMaxHealth();
|
||||
for (let i = 0; i < powerUp.length; i++) {
|
||||
if (powerUp[i].name === "heal") {
|
||||
const oldSize = powerUp[i].size
|
||||
powerUp[i].size = powerUps.heal.size() //update current heals
|
||||
const scale = powerUp[i].size / oldSize
|
||||
Matter.Body.scale(powerUp[i], scale, scale); //grow
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m.damage(dmg); //normal damage
|
||||
}
|
||||
|
||||
42
js/level.js
42
js/level.js
@@ -17,17 +17,18 @@ const level = {
|
||||
if (level.levelsCleared === 0) { //this code only runs on the first level
|
||||
// simulation.isHorizontalFlipped = true
|
||||
// m.addHealth(Infinity)
|
||||
// m.setField("time dilation")
|
||||
// m.setField("wormhole")
|
||||
// b.giveGuns("nail gun")
|
||||
// b.guns[0].ammo = 10000
|
||||
// b.giveGuns("mine")
|
||||
// tech.giveTech("cross disciplinary")
|
||||
// tech.giveTech("determinism")
|
||||
// tech.giveTech("pseudoscience")
|
||||
// tech.giveTech("alternator")
|
||||
// for (let i = 0; i < 3; ++i) tech.giveTech("smelting")
|
||||
// for (let i = 0; i < 9; ++i) tech.giveTech("propagator")
|
||||
// for (let i = 0; i < 100; ++i) tech.giveTech("nail-bot")
|
||||
// for (let i = 0; i < 9; ++i) tech.giveTech("emergence")
|
||||
// tech.giveTech("decoherence")
|
||||
// tech.giveTech("brainstorming")
|
||||
// tech.giveTech("path integral")
|
||||
// tech.giveTech("adiabatic healing")
|
||||
// tech.giveTech("shape-memory alloy")
|
||||
// m.maxHealth = 100
|
||||
// m.health = m.maxHealth
|
||||
// for (let i = 0; i < 10; i++) tech.giveTech("tungsten carbide")
|
||||
@@ -38,17 +39,17 @@ const level = {
|
||||
// powerUps.research.changeRerolls(100000)
|
||||
// tech.tech[297].frequency = 100
|
||||
// m.immuneCycle = Infinity //you can't take damage
|
||||
// level.difficultyIncrease(40) //30 is near max on hard //60 is near max on why
|
||||
// simulation.enableConstructMode() //used to build maps in testing mode
|
||||
// level.testChamber2();
|
||||
// spawn.cellBossCulture(1900, -500)
|
||||
// level.testing(); //not in rotation, used for testing
|
||||
// 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 < 7; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research");
|
||||
// powerUps.research.changeRerolls(100)
|
||||
// spawn.starter(1900, -500, 300)
|
||||
// for (let i = 0; i < 50; ++i) spawn.starter(1900, -500)
|
||||
// spawn.powerUpBoss(1900, -500)
|
||||
// spawn.starter(1900, -500, 100)
|
||||
// for (let i = 0; i < 20; ++i) spawn.exploder(1900, -500)
|
||||
// spawn.grenadierBoss(1900, -500)
|
||||
// level.difficultyIncrease(20) //30 is near max on hard //60 is near max on why
|
||||
// level.testing(); //not in rotation, used for testing
|
||||
// for (let i = 0; i < 7; ++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");
|
||||
|
||||
if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************
|
||||
// powerUps.research.changeRerolls(3000)
|
||||
@@ -110,7 +111,7 @@ 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.26)
|
||||
const len = Math.ceil((m.maxHealth - m.health) / 0.29)
|
||||
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()
|
||||
@@ -1324,6 +1325,17 @@ const level = {
|
||||
});
|
||||
}
|
||||
}
|
||||
//collision with mobs
|
||||
if (!(simulation.cycle % 5) && !m.isBodiesAsleep) {
|
||||
query = Matter.Query.region(mob, this)
|
||||
for (let i = 0; i < query.length; i++) query[i].damage(5 * damage)
|
||||
}
|
||||
|
||||
// for (let i = 0, len = mob.length; i < len; i++) {
|
||||
// if ( !mob[i].isBoss) {
|
||||
// mob[i].damage(0.1 * damage)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
},
|
||||
query() {
|
||||
@@ -2615,6 +2627,7 @@ const level = {
|
||||
spawn.mapRect(475, -25, 25, 50); //edge shelf
|
||||
},
|
||||
testing() {
|
||||
const hazard = level.hazard(6000, -1000, 5, 1000, 0.4) //laser
|
||||
const button = level.button(1000, 0)
|
||||
spawn.bodyRect(1000, -50, 50, 50);
|
||||
|
||||
@@ -2628,6 +2641,7 @@ const level = {
|
||||
level.enter.draw();
|
||||
};
|
||||
level.customTopLayer = () => {
|
||||
hazard.opticalQuery();
|
||||
button.query();
|
||||
button.draw();
|
||||
ctx.fillStyle = "rgba(0,0,0,0.1)"
|
||||
|
||||
@@ -1162,9 +1162,9 @@ const mobs = {
|
||||
}
|
||||
}
|
||||
|
||||
if (tech.isDeathSkipTime && !m.isBodiesAsleep) {
|
||||
if (tech.deathSkipTime && !m.isBodiesAsleep) {
|
||||
requestAnimationFrame(() => {
|
||||
simulation.timePlayerSkip(this.isBoss ? 45 : 25)
|
||||
simulation.timePlayerSkip((this.isBoss ? 45 : 25) * tech.deathSkipTime)
|
||||
simulation.loop(); //ending with a wipe and normal loop fixes some very minor graphical issues where things are draw in the wrong locations
|
||||
}); //wrapping in animation frame prevents errors, probably
|
||||
|
||||
|
||||
@@ -500,7 +500,7 @@ const m = {
|
||||
},
|
||||
baseHealth: 1,
|
||||
setMaxHealth() {
|
||||
m.maxHealth = m.baseHealth + tech.extraMaxHealth + tech.isFallingDamage + 2 * tech.isFlipFlop * tech.isFlipFlopOn * tech.isFlipFlopHealth
|
||||
m.maxHealth = m.baseHealth + tech.extraMaxHealth + tech.isFallingDamage + 4 * tech.isFlipFlop * tech.isFlipFlopOn * tech.isFlipFlopHealth
|
||||
document.getElementById("health-bg").style.width = `${Math.floor(300 * m.maxHealth)}px`
|
||||
simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-h'>maxHealth</span> <span class='color-symbol'>=</span> ${m.maxHealth.toFixed(2)}`)
|
||||
if (m.health > m.maxHealth) m.health = m.maxHealth;
|
||||
@@ -512,6 +512,7 @@ const m = {
|
||||
harmReduction() {
|
||||
let dmg = 1
|
||||
dmg *= m.fieldHarmReduction
|
||||
// if (!tech.isFlipFlopOn && tech.isFlipFlopHealth) dmg *= 0.5
|
||||
if (tech.isZeno) dmg *= 0.15
|
||||
if (tech.isFieldHarmReduction) dmg *= 0.5
|
||||
if (tech.isHarmMACHO) dmg *= 0.4
|
||||
@@ -2153,6 +2154,8 @@ const m = {
|
||||
description: "use <strong class='color-f'>energy</strong> to emit short range <strong class='color-plasma'>plasma</strong><br><strong class='color-d'>damages</strong> and <strong>pushes</strong> mobs away<br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second",
|
||||
set() {
|
||||
b.isExtruderOn = false
|
||||
// m.fieldCDcycleAlternate = 0
|
||||
|
||||
if (m.plasmaBall) {
|
||||
m.plasmaBall.reset()
|
||||
Matter.Composite.remove(engine.world, m.plasmaBall);
|
||||
|
||||
@@ -248,7 +248,8 @@ const powerUps = {
|
||||
} else if (type === "field") {
|
||||
m.setField(index)
|
||||
} else if (type === "tech") {
|
||||
if (tech.isBanish && tech.tech[index].isBanished) tech.tech[index].isBanished = false
|
||||
// if (tech.isBanish && tech.tech[index].isBanished) tech.tech[index].isBanished = false
|
||||
powerUps.tech.banishList
|
||||
setTimeout(() => { powerUps.lastTechIndex = index }, 10);
|
||||
simulation.makeTextLog(`<span class='color-var'>tech</span>.giveTech("<span class='color-text'>${tech.tech[index].name}</span>")`);
|
||||
tech.giveTech(index)
|
||||
@@ -446,48 +447,21 @@ const powerUps = {
|
||||
name: "heal",
|
||||
color: "#0eb",
|
||||
size() {
|
||||
return 40 * (simulation.healScale ** 0.25) * Math.sqrt(tech.largerHeals) * Math.sqrt(0.1 + Math.random() * 0.5); //(simulation.healScale ** 0.25) gives a smaller radius as heal scale goes down
|
||||
},
|
||||
calculateHeal(size) {
|
||||
return tech.largerHeals * (size / 40 / Math.sqrt(tech.largerHeals) / (simulation.healScale ** 0.25)) ** 2 //heal scale is undone here because heal scale is properly affected on m.addHealth()
|
||||
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
|
||||
},
|
||||
effect() {
|
||||
// if (!tech.isEnergyHealth && m.alive) {
|
||||
// const heal = powerUps.heal.calculateHeal(this.size)
|
||||
// if (heal > 0) {
|
||||
// if (tech.isOverHeal && m.health === m.maxHealth) { //tech quenching
|
||||
// m.damage(heal * simulation.healScale);
|
||||
// //draw damage
|
||||
// simulation.drawList.push({ //add dmg to draw queue
|
||||
// x: m.pos.x,
|
||||
// y: m.pos.y,
|
||||
// radius: heal * 500 * simulation.healScale,
|
||||
// color: simulation.mobDmgColor,
|
||||
// time: simulation.drawTime
|
||||
// });
|
||||
// tech.extraMaxHealth += heal * simulation.healScale //increase max health
|
||||
// m.setMaxHealth();
|
||||
// } else {
|
||||
// const healOutput = Math.min(m.maxHealth - m.health, heal) * simulation.healScale
|
||||
// m.addHealth(heal);
|
||||
// simulation.makeTextLog(`<span class='color-var'>m</span>.health <span class='color-symbol'>+=</span> ${(healOutput).toFixed(3)}`) // <br>${m.health.toFixed(3)}
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
if (!tech.isEnergyHealth && m.alive && !tech.isNoHeals) {
|
||||
const heal = powerUps.heal.calculateHeal(this.size)
|
||||
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()
|
||||
// console.log("size = " + this.size, "heal = " + heal)
|
||||
if (heal > 0) {
|
||||
const overHeal = m.health + heal * simulation.healScale - m.maxHealth //used with tech.isOverHeal
|
||||
|
||||
const healOutput = Math.min(m.maxHealth - m.health, heal) * simulation.healScale
|
||||
m.addHealth(heal);
|
||||
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);
|
||||
simulation.makeTextLog(`<span class='color-var'>m</span>.health <span class='color-symbol'>-=</span> ${(scaledOverHeal).toFixed(3)}`) // <br>${m.health.toFixed(3)}
|
||||
//draw damage
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
x: m.pos.x,
|
||||
y: m.pos.y,
|
||||
@@ -500,7 +474,6 @@ const powerUps = {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tech.healGiveMaxEnergy) {
|
||||
tech.healMaxEnergyBonus += 0.1
|
||||
m.setMaxEnergy();
|
||||
@@ -900,17 +873,19 @@ const powerUps = {
|
||||
for (let i = 0; i < tech.tech.length; i++) tech.tech[i].isRecentlyShown = false //reset recently shown back to zero
|
||||
// powerUps.tech.lastTotalChoices = options.length //this is recorded so that banish can know how many tech were available
|
||||
// console.log(optionLengthNoDuplicates, options.length)
|
||||
powerUps.tech.banishList = []
|
||||
if (options.length > 0) {
|
||||
for (let i = 0; i < totalChoices; i++) {
|
||||
if (options.length < 1) break
|
||||
const choose = options[Math.floor(Math.seededRandom(0, options.length))] //pick an element from the array of options
|
||||
|
||||
if (tech.isBanish) {
|
||||
tech.tech[choose].isBanished = true
|
||||
if (i === 0) simulation.makeTextLog(`options.length = ${optionLengthNoDuplicates}`)
|
||||
}
|
||||
//avoid displaying repeated tech options at the same time
|
||||
removeOption(choose)
|
||||
tech.tech[choose].isRecentlyShown = true
|
||||
|
||||
removeOption(choose) //move from future options pool to avoid repeats on this selection
|
||||
tech.tech[choose].isRecentlyShown = true //this flag prevents this option from being shown the next time you pick up a tech power up
|
||||
|
||||
const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
|
||||
if (tech.tech[choose].isFieldTech) {
|
||||
|
||||
@@ -114,6 +114,7 @@ const simulation = {
|
||||
simulation.checks();
|
||||
mobs.loop();
|
||||
}
|
||||
m.hold();
|
||||
b.bulletRemove();
|
||||
if (!m.isBodiesAsleep) b.bulletDo();
|
||||
}
|
||||
|
||||
36
js/spawn.js
36
js/spawn.js
@@ -3875,12 +3875,8 @@ const spawn = {
|
||||
// this.isInvulnerable = true
|
||||
// this.damageReduction = 0
|
||||
} else {
|
||||
if (Math.abs(this.velocity.y) < 15) {
|
||||
Matter.Body.setVelocity(this, { x: this.velocity.x, y: this.velocity.y * 1.03 });
|
||||
}
|
||||
if (Math.abs(this.velocity.x) < 11) {
|
||||
Matter.Body.setVelocity(this, { x: this.velocity.x * 1.03, y: this.velocity.y });
|
||||
}
|
||||
if (Math.abs(this.velocity.y) < 15) Matter.Body.setVelocity(this, { x: this.velocity.x, y: this.velocity.y * 1.03 });
|
||||
if (Math.abs(this.velocity.x) < 11) Matter.Body.setVelocity(this, { x: this.velocity.x * 1.03, y: this.velocity.y });
|
||||
}
|
||||
|
||||
if (this.isInvulnerable) {
|
||||
@@ -4956,24 +4952,26 @@ const spawn = {
|
||||
spawn.spawnOrbitals(me, radius + 200, 1);
|
||||
Matter.Body.setDensity(me, 0.004 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
me.onDeath = function() { //helps collisions functions work better after vertex have been changed
|
||||
for (let i = 0; i < 6; i++) {
|
||||
spawn.grenade(this.position.x, this.position.y, 75 * simulation.CDScale);
|
||||
const who = mob[mob.length - 1]
|
||||
const speed = 4 * simulation.accelScale;
|
||||
const angle = 2 * Math.PI * i / 6
|
||||
Matter.Body.setVelocity(who, {
|
||||
x: speed * Math.cos(angle),
|
||||
y: speed * Math.sin(angle)
|
||||
});
|
||||
}
|
||||
setTimeout(() => { //fix mob in place, but allow rotation
|
||||
for (let i = 0, len = 6; i < len; i++) {
|
||||
const speed = 2.25 * simulation.accelScale;
|
||||
const angle = 2 * Math.PI * i / len
|
||||
spawn.grenade(this.position.x, this.position.y, 170 * simulation.CDScale);
|
||||
const who = mob[mob.length - 1]
|
||||
Matter.Body.setVelocity(who, {
|
||||
x: speed * Math.cos(angle),
|
||||
y: speed * Math.sin(angle)
|
||||
});
|
||||
}
|
||||
}, 200);
|
||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||
}
|
||||
me.grenadeLimiter = 0
|
||||
me.onDamage = function() {
|
||||
if (this.grenadeLimiter < 240) {
|
||||
if (this.grenadeLimiter < 240 && this.health > 0) {
|
||||
this.grenadeLimiter += 60
|
||||
spawn.grenade(this.position.x, this.position.y, 80 + Math.floor(60 * Math.random()));
|
||||
const who = mob[mob.length - 1]
|
||||
who = mob[mob.length - 1]
|
||||
const velocity = Vector.mult(Vector.normalise(Vector.sub(player.position, who.position)), 3 * Math.sqrt(simulation.accelScale) + 4 * Math.random())
|
||||
Matter.Body.setVelocity(who, {
|
||||
x: this.velocity.x + velocity.x,
|
||||
@@ -5011,7 +5009,7 @@ const spawn = {
|
||||
y: 0
|
||||
};
|
||||
me.onDeath = function() { //helps collisions functions work better after vertex have been changed
|
||||
spawn.grenade(this.position.x, this.position.y, 75 * simulation.CDScale);
|
||||
spawn.grenade(this.position.x, this.position.y, 200 * simulation.CDScale);
|
||||
// mob[mob.length - 1].collisionFilter.category = 0
|
||||
mob[mob.length - 1].collisionFilter.mask = cat.player | cat.map;
|
||||
}
|
||||
|
||||
67
js/tech.js
67
js/tech.js
@@ -224,7 +224,7 @@ const tech = {
|
||||
},
|
||||
damageFromTech() {
|
||||
let dmg = 1 //m.fieldDamage
|
||||
if (tech.isDeathSkipTime) dmg *= 1.67
|
||||
if (tech.deathSkipTime) dmg *= 1 + 0.6 * tech.deathSkipTime
|
||||
if (tech.isNoDraftPause) dmg *= 1.34
|
||||
if (tech.isCloakingDamage) dmg *= 1.35
|
||||
if (tech.isTechDamage) dmg *= 1.9
|
||||
@@ -964,8 +964,8 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "propagator",
|
||||
description: "after mobs <strong>die</strong> advance time <strong>0.5</strong> seconds<br><strong>+67%</strong> <strong class='color-d'>damage</strong>",
|
||||
maxCount: 1,
|
||||
description: "after mobs <strong>die</strong> advance time <strong>0.5</strong> seconds<br><strong>+60%</strong> <strong class='color-d'>damage</strong>",
|
||||
maxCount: 3,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
@@ -974,10 +974,10 @@ const tech = {
|
||||
},
|
||||
requires: "",
|
||||
effect() {
|
||||
tech.isDeathSkipTime = true
|
||||
tech.deathSkipTime++
|
||||
},
|
||||
remove() {
|
||||
tech.isDeathSkipTime = false
|
||||
tech.deathSkipTime = 0
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -1720,7 +1720,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "shape-memory alloy",
|
||||
description: "if <strong>flip-flop</strong> is <strong class='color-flop'>ON</strong><br><strong>+200</strong> maximum <strong class='color-h'>health</strong>",
|
||||
description: `if <strong>flip-flop</strong> is <strong class='color-flop'>ON</strong><br><strong>+400</strong> maximum <strong class='color-h'>health</strong> and <strong>+100%</strong> ${powerUps.orb.heal()} effect`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 4,
|
||||
@@ -1732,10 +1732,26 @@ const tech = {
|
||||
effect() {
|
||||
tech.isFlipFlopHealth = true;
|
||||
m.setMaxHealth();
|
||||
for (let i = 0; i < powerUp.length; i++) {
|
||||
if (powerUp[i].name === "heal") {
|
||||
const oldSize = powerUp[i].size
|
||||
powerUp[i].size = powerUps.heal.size() //update current heals
|
||||
const scale = powerUp[i].size / oldSize
|
||||
Matter.Body.scale(powerUp[i], scale, scale); //grow
|
||||
}
|
||||
}
|
||||
},
|
||||
remove() {
|
||||
tech.isFlipFlopHealth = false;
|
||||
m.setMaxHealth();
|
||||
for (let i = 0; i < powerUp.length; i++) {
|
||||
if (powerUp[i].name === "heal") {
|
||||
const oldSize = powerUp[i].size
|
||||
powerUp[i].size = powerUps.heal.size() //update current heals
|
||||
const scale = powerUp[i].size / oldSize
|
||||
Matter.Body.scale(powerUp[i], scale, scale); //grow
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -2233,7 +2249,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "ground state",
|
||||
description: "<strong>+200</strong> maximum <strong class='color-f'>energy</strong><br><strong>–66%</strong> passive <strong class='color-f'>energy</strong> generation",
|
||||
description: "<strong>+200</strong> maximum <strong class='color-f'>energy</strong><br><strong>–50%</strong> passive <strong class='color-f'>energy</strong> generation",
|
||||
// description: "reduce <strong class='color-defense'>defense</strong> by <strong>66%</strong><br>you <strong>no longer</strong> passively regenerate <strong class='color-f'>energy</strong>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
@@ -2244,7 +2260,7 @@ const tech = {
|
||||
},
|
||||
requires: "not time crystals",
|
||||
effect: () => {
|
||||
m.fieldRegen = 0.00033
|
||||
m.fieldRegen = 0.0005
|
||||
tech.isGroundState = true
|
||||
m.setMaxEnergy()
|
||||
},
|
||||
@@ -2581,16 +2597,16 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "negative entropy",
|
||||
description: `at the start of each <strong>level</strong><br>for every <strong>26</strong> missing <strong class='color-h'>health</strong> spawn ${powerUps.orb.heal()}`,
|
||||
description: `at the start of each <strong>level</strong><br>for every <strong>29</strong> missing <strong class='color-h'>health</strong> spawn ${powerUps.orb.heal()}`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
isHealTech: true,
|
||||
allowed() {
|
||||
return m.health > 0.1 && !tech.isNoHeals
|
||||
return !tech.isNoHeals
|
||||
},
|
||||
requires: "has some health, not ergodicity",
|
||||
requires: "not ergodicity",
|
||||
effect() {
|
||||
tech.isHealLowHealth = true;
|
||||
},
|
||||
@@ -2612,15 +2628,27 @@ const tech = {
|
||||
requires: "under 70% health, not mass-energy equivalence, ergodicity",
|
||||
effect() {
|
||||
tech.largerHeals++;
|
||||
this.refundAmount += tech.addJunkTechToPool(0.05)
|
||||
//update current heals
|
||||
for (let i = 0; i < powerUp.length; i++) {
|
||||
if (powerUp[i].name === "heal") powerUp[i].size = powerUps.heal.size()
|
||||
if (powerUp[i].name === "heal") {
|
||||
const oldSize = powerUp[i].size
|
||||
powerUp[i].size = powerUps.heal.size() //update current heals
|
||||
const scale = powerUp[i].size / oldSize
|
||||
Matter.Body.scale(powerUp[i], scale, scale); //grow
|
||||
}
|
||||
}
|
||||
this.refundAmount += tech.addJunkTechToPool(0.05)
|
||||
},
|
||||
refundAmount: 0,
|
||||
remove() {
|
||||
tech.largerHeals = 1;
|
||||
for (let i = 0; i < powerUp.length; i++) {
|
||||
if (powerUp[i].name === "heal") {
|
||||
const oldSize = powerUp[i].size
|
||||
powerUp[i].size = powerUps.heal.size() //update current heals
|
||||
const scale = powerUp[i].size / oldSize
|
||||
Matter.Body.scale(powerUp[i], scale, scale); //grow
|
||||
}
|
||||
}
|
||||
if (this.count > 0 && this.refundAmount > 0) {
|
||||
tech.removeJunkTechFromPool(this.refundAmount)
|
||||
this.refundAmount = 0
|
||||
@@ -2814,7 +2842,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "decoherence",
|
||||
description: `<strong class='color-r'>researched</strong> or <strong>canceled</strong> <strong class='color-m'>tech</strong> won't <strong>reoccur</strong> <br>spawn ${powerUps.orb.research(7)}`,
|
||||
description: `<strong class='color-m'>tech</strong> options you don't <strong>choose</strong> won't <strong>reoccur</strong><br>spawn ${powerUps.orb.research(7)}`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
@@ -5917,7 +5945,7 @@ const tech = {
|
||||
{
|
||||
name: "smelting",
|
||||
// description: `forge <strong>3</strong> <strong class='color-ammo'>ammo</strong> into a new harpoon<br>fire <strong>+1</strong> <strong>harpoon</strong> with each shot`,
|
||||
descriptionFunction() { return `forge <strong>${(tech.isRailGun ?5:3)*(2+this.count)}</strong> <strong class='color-ammo'>ammo</strong> into a new harpoon<br>fire <strong>+1</strong> <strong>harpoon</strong> with each shot` },
|
||||
descriptionFunction() { return `forge <strong>${(tech.isRailGun ? 2 : 1) * (4 + 2 * this.count)}</strong> <strong class='color-ammo'>ammo</strong> into a new harpoon<br>fire <strong>+1</strong> <strong>harpoon</strong> with each shot` },
|
||||
// descriptionFunction() { return `forge <strong>${tech.isRailGun? 10: 2}</strong> <strong class='color-ammo'>ammo</strong> into a new harpoon<br>fire <strong>+1</strong> <strong>harpoon</strong> with each shot` },
|
||||
isGunTech: true,
|
||||
maxCount: 9,
|
||||
@@ -5931,7 +5959,7 @@ const tech = {
|
||||
effect() {
|
||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||
if (b.guns[i].name === "harpoon") {
|
||||
b.guns[i].ammo -= (tech.isRailGun ? 5 : 3) * (1 + this.count)
|
||||
b.guns[i].ammo -= (tech.isRailGun ? 5 : 2) * (1 + this.count)
|
||||
// console.log(3 + this.count * 3)
|
||||
if (b.guns[i].ammo < 0) b.guns[i].ammo = 0
|
||||
simulation.updateGunHUD();
|
||||
@@ -5958,7 +5986,7 @@ const tech = {
|
||||
{
|
||||
name: "UHMWPE",
|
||||
descriptionFunction() {
|
||||
return `+${(b.guns[9].ammo).toFixed(0)}% <strong>harpoon</strong> <strong>rope</strong> <strong>length</strong><br><em>(1/100 of harpoon <strong class='color-ammo'>ammo</strong>)</em>`
|
||||
return `+${(b.guns[9].ammo).toFixed(0)}% <strong>harpoon</strong> <strong>rope</strong> <strong>length</strong><br><em>(1/80 of harpoon <strong class='color-ammo'>ammo</strong>)</em>`
|
||||
},
|
||||
// description: "increase the <strong>length</strong> of your <strong>harpoon</strong>'s <strong>rope</strong><br>by <strong>1%</strong> per harpoon <strong class='color-ammo'>ammo</strong>",
|
||||
isGunTech: true,
|
||||
@@ -7437,6 +7465,7 @@ const tech = {
|
||||
tech.isWormHolePause = true
|
||||
},
|
||||
remove() {
|
||||
if (tech.isWormHolePause && m.isBodiesAsleep) m.wakeCheck();
|
||||
tech.isWormHolePause = false
|
||||
}
|
||||
},
|
||||
@@ -10303,7 +10332,7 @@ const tech = {
|
||||
isClusterExplode: null,
|
||||
isCircleExplode: null,
|
||||
isPetalsExplode: null,
|
||||
isDeathSkipTime: null,
|
||||
deathSkipTime: null,
|
||||
isIceMaxHealthLoss: null,
|
||||
isIceKill: null,
|
||||
isCritKill: null
|
||||
|
||||
Reference in New Issue
Block a user