diff --git a/js/bullet.js b/js/bullet.js
index c0198b1..ded565f 100644
--- a/js/bullet.js
+++ b/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();
diff --git a/js/engine.js b/js/engine.js
index 485757d..456b1d7 100644
--- a/js/engine.js
+++ b/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
}
diff --git a/js/level.js b/js/level.js
index 8f5db5f..e6333fe 100644
--- a/js/level.js
+++ b/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)"
diff --git a/js/mob.js b/js/mob.js
index dad0ff7..281ef45 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -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
diff --git a/js/player.js b/js/player.js
index e2272e5..9da604b 100644
--- a/js/player.js
+++ b/js/player.js
@@ -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(`m.maxHealth = ${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 energy to emit short range plasma
damages and pushes mobs away
generate 6 energy per second",
set() {
b.isExtruderOn = false
+ // m.fieldCDcycleAlternate = 0
+
if (m.plasmaBall) {
m.plasmaBall.reset()
Matter.Composite.remove(engine.world, m.plasmaBall);
diff --git a/js/powerup.js b/js/powerup.js
index a41bae3..38b8466 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -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(`tech.giveTech("${tech.tech[index].name}")`);
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(`m.health += ${(healOutput).toFixed(3)}`) //
${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(`m.health += ${(healOutput).toFixed(3)}`) //
${m.health.toFixed(3)}
-
if (tech.isOverHeal && overHeal > 0) { //tech quenching
const scaledOverHeal = overHeal * 0.7
m.damage(scaledOverHeal);
simulation.makeTextLog(`m.health -= ${(scaledOverHeal).toFixed(3)}`) //
${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) {
diff --git a/js/simulation.js b/js/simulation.js
index d196a85..fdecb75 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -114,6 +114,7 @@ const simulation = {
simulation.checks();
mobs.loop();
}
+ m.hold();
b.bulletRemove();
if (!m.isBodiesAsleep) b.bulletDo();
}
diff --git a/js/spawn.js b/js/spawn.js
index ac13490..e9d7fdd 100644
--- a/js/spawn.js
+++ b/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;
}
diff --git a/js/tech.js b/js/tech.js
index 7109ddc..562d938 100644
--- a/js/tech.js
+++ b/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 die advance time 0.5 seconds
+67% damage",
- maxCount: 1,
+ description: "after mobs die advance time 0.5 seconds
+60% damage",
+ 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 flip-flop is ON
+200 maximum health",
+ description: `if flip-flop is ON
+400 maximum health and +100% ${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: "+200 maximum energy
–66% passive energy generation",
+ description: "+200 maximum energy
–50% passive energy generation",
// description: "reduce defense by 66%
you no longer passively regenerate energy",
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 level
for every 26 missing health spawn ${powerUps.orb.heal()}`,
+ description: `at the start of each level
for every 29 missing health 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: `researched or canceled tech won't reoccur
spawn ${powerUps.orb.research(7)}`,
+ description: `tech options you don't choose won't reoccur
spawn ${powerUps.orb.research(7)}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -5917,7 +5945,7 @@ const tech = {
{
name: "smelting",
// description: `forge 3 ammo into a new harpoon
fire +1 harpoon with each shot`,
- descriptionFunction() { return `forge ${(tech.isRailGun ?5:3)*(2+this.count)} ammo into a new harpoon
fire +1 harpoon with each shot` },
+ descriptionFunction() { return `forge ${(tech.isRailGun ? 2 : 1) * (4 + 2 * this.count)} ammo into a new harpoon
fire +1 harpoon with each shot` },
// descriptionFunction() { return `forge ${tech.isRailGun? 10: 2} ammo into a new harpoon
fire +1 harpoon 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)}% harpoon rope length
(1/100 of harpoon ammo)`
+ return `+${(b.guns[9].ammo).toFixed(0)}% harpoon rope length
(1/80 of harpoon ammo)`
},
// description: "increase the length of your harpoon's rope
by 1% per harpoon ammo",
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
diff --git a/todo.txt b/todo.txt
index b4530c1..6e983e1 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,20 +1,41 @@
******************************************************** NEXT PATCH **************************************************
-rewrite of the tech,gun,field selection code
- odds of new bugs is pretty high, but the code is shorter and faster, so easier to fix
-path integral is no longer a JUNK tech
- lets you choose from every option on next tech
-emergence is stackable
- +2 power up choices per stack
+shape-memory alloy now also increases 100% heal power ups when "ON"
-tech: integrated circuit - if ON +7 power up choices if OFF -1
+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
-update matter.js engine 0.17.1 -> 0.18.0
- shouldn't change anything
-big fixes
+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
*********************************************************** TODO *****************************************************
+improve mob invincible graphic
+ opacity oscillates from 100% to 0%?
+
+hopBossMom
+ spawns lots of small hopBullets
+ drops eggs, that hatch into hopBullets
+ like sporangium
+ normally runs away from player, but goes closer to drop eggs
+
+
+make plasma ball pick up still work when you have no no energy
+ make a unique CD var for plasma ball?
+
+give laser gun _____ if you fire in an angle range
+ draw angle range as a slowly rotation circle arc around player
+ effect:
+ bonus damage
+ extra beams
+ extra reflections
+
wormhole tech: entropic gravity - gain defense for each research
requires wormhole or negative mass field or pilot wave
@@ -77,13 +98,6 @@ cloaking field
just delay setting the m.isCloak for a couple seconds
and also set all active bots to remember player in the de-cloaked stop
-give laser gun _____ if you fire in an angle range
- draw angle range as a slowly rotation circle arc around player
- effect:
- bonus damage
- extra beams
- extra reflections
-
scrap bots can't move?
only works for nail, foam, laser
might be tricky code?