diff --git a/img/K-selection.webp b/img/K-selection.webp
index 79250f3..595519a 100644
Binary files a/img/K-selection.webp and b/img/K-selection.webp differ
diff --git a/img/Newtons 3rd law.webp b/img/Newtons 3rd law.webp
index 1634991..ad9c801 100644
Binary files a/img/Newtons 3rd law.webp and b/img/Newtons 3rd law.webp differ
diff --git a/img/Noether violation.webp b/img/Noether violation.webp
index 884d5d2..b3c6797 100644
Binary files a/img/Noether violation.webp and b/img/Noether violation.webp differ
diff --git a/img/colony.webp b/img/colony.webp
index 2d721ab..c572b6e 100644
Binary files a/img/colony.webp and b/img/colony.webp differ
diff --git a/img/field/field emitter20.webp b/img/field/field emitter20.webp
new file mode 100644
index 0000000..58e0cd7
Binary files /dev/null and b/img/field/field emitter20.webp differ
diff --git a/img/field/field emitter21.webp b/img/field/field emitter21.webp
new file mode 100644
index 0000000..2c1ba1d
Binary files /dev/null and b/img/field/field emitter21.webp differ
diff --git a/img/gun/nail gun.webp b/img/gun/nail gun.webp
index c8b1743..66ac201 100644
Binary files a/img/gun/nail gun.webp and b/img/gun/nail gun.webp differ
diff --git a/img/gun/shotgun.webp b/img/gun/shotgun.webp
index 6714812..436490a 100644
Binary files a/img/gun/shotgun.webp and b/img/gun/shotgun.webp differ
diff --git a/img/gun/spores.webp b/img/gun/spores.webp
index d430913..d8fca1f 100644
Binary files a/img/gun/spores.webp and b/img/gun/spores.webp differ
diff --git a/img/gun/wave.webp b/img/gun/wave.webp
index 0c2e709..b769112 100644
Binary files a/img/gun/wave.webp and b/img/gun/wave.webp differ
diff --git a/img/liquid cooling.webp b/img/liquid cooling.webp
deleted file mode 100644
index 1f9fb98..0000000
Binary files a/img/liquid cooling.webp and /dev/null differ
diff --git a/img/mutualism.webp b/img/mutualism.webp
index 5431c72..5b0252e 100644
Binary files a/img/mutualism.webp and b/img/mutualism.webp differ
diff --git a/img/nail-shot.webp b/img/nail-shot.webp
index d9743f9..eb412f0 100644
Binary files a/img/nail-shot.webp and b/img/nail-shot.webp differ
diff --git a/img/needle gun.webp b/img/needle gun.webp
index b976c12..129df9a 100644
Binary files a/img/needle gun.webp and b/img/needle gun.webp differ
diff --git a/img/nematodes.webp b/img/nematodes.webp
index 26c7a33..637b19e 100644
Binary files a/img/nematodes.webp and b/img/nematodes.webp differ
diff --git a/img/path integration.webp b/img/path integration.webp
index 1cf8f34..9427793 100644
Binary files a/img/path integration.webp and b/img/path integration.webp differ
diff --git a/img/refrigerant.webp b/img/refrigerant.webp
new file mode 100644
index 0000000..d8f27c3
Binary files /dev/null and b/img/refrigerant.webp differ
diff --git a/index.html b/index.html
index 1abc9eb..f4e9c1c 100644
--- a/index.html
+++ b/index.html
@@ -52,10 +52,10 @@
@@ -67,6 +67,24 @@
+
+
+
@@ -79,13 +97,15 @@
+
-
+
+
-
-
-
-
+ -->
diff --git a/js/level.js b/js/level.js
index c2dbe8f..91e6f03 100644
--- a/js/level.js
+++ b/js/level.js
@@ -27,15 +27,15 @@ const level = {
// m.immuneCycle = Infinity //you can't take damage
// tech.tech[297].frequency = 100
// m.couplingChange(10)
- // m.setField("metamaterial cloaking") //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.setField("time dilation") //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("harpoon") //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("shotgun") //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("accretion")
- // tech.giveTech("metastability")
+ // tech.giveTech("Maxwells demon")
+ // tech.giveTech("missile-bot")
// for (let i = 0; i < 6; ++i) tech.giveTech("replication")
// for (let i = 0; i < 1; ++i) tech.giveTech("waste heat recovery")
// requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("foam-bot") });
@@ -44,11 +44,11 @@ const level = {
// for (let i = 0; i < 3; i++) powerUps.directSpawn(450, -50, "tech");
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "research");
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "coupling");
- // level.underpass();
+ // level.factory();
// spawn.nodeGroup(3200, -300, "sniper")
// spawn.nodeGroup(2200, -300, "sniper")
// spawn.nodeGroup(2200, -300, "sniper")
- // spawn.mantisBoss(1900, -500)
+ // spawn.shareBoss(1900, -500)
// spawn.cellBoss(1900, -500)
// for (let i = 0; i < 2; ++i) spawn.starter(1900, -500, 50)
// spawn.sneaker(1900, -500, 25)
@@ -198,7 +198,7 @@ const level = {
difficultyIncrease(num = 1) {
for (let i = 0; i < num; i++) {
simulation.difficulty++
- m.dmgScale *= 0.922; //damage done by player decreases each level
+ m.dmgScale *= 0.9; //damage done by player decreases each level
if (simulation.accelScale < 6) simulation.accelScale *= 1.024 //mob acceleration increases each level
if (simulation.CDScale > 0.15) simulation.CDScale *= 0.964 //mob CD time decreases each level
}
@@ -209,7 +209,7 @@ const level = {
difficultyDecrease(num = 1) { //used in easy mode for simulation.reset()
for (let i = 0; i < num; i++) {
simulation.difficulty--
- m.dmgScale /= 0.922; //damage done by player decreases each level
+ m.dmgScale /= 0.9; //damage done by player decreases each level
if (simulation.accelScale > 1) simulation.accelScale /= 1.024 //mob acceleration increases each level
if (simulation.CDScale < 1) simulation.CDScale /= 0.964 //mob CD time decreases each level
}
@@ -292,20 +292,28 @@ const level = {
if (document.getElementById("banned").value) { //remove levels from ban list in settings
const banList = document.getElementById("banned").value.replace(/,/g, ' ').replace(/\s\s+/g, ' ').replace(/[^\w\s]/g, '') //replace commas with spaces, replace double spaces with single, remove strange symbols
const remove = banList.split(" ");
- console.log('remove these', remove)
- console.log('community levels before', level.communityLevels)
+ // console.log('remove these', remove)
+ // console.log('community levels before', level.communityLevels)
for (let i = 0; i < remove.length; i++) {
const index = level.communityLevels.indexOf(remove[i])
- if (index !== -1) level.communityLevels.splice(index, 1);
+ if (index !== -1) {
+ level.communityLevels.splice(index, 1);
+ // console.log('removed level:', remove[i])
+ requestAnimationFrame(() => { simulation.makeTextLog(`banned level: ${remove[i]}`); });
+ }
}
- console.log('community levels after', level.communityLevels)
- console.log('Landgreen levels before', level.playableLevels)
+ // console.log('community levels after', level.communityLevels)
+ // console.log('Landgreen levels before', level.playableLevels)
for (let i = 0; i < remove.length; i++) {
if (level.playableLevels.length + level.communityLevels.length * simulation.isCommunityMaps < 10) break //can't remove too many levels
const index = level.playableLevels.indexOf(remove[i])
- if (index !== -1) level.playableLevels.splice(index, 1);
+ if (index !== -1) {
+ level.playableLevels.splice(index, 1);
+ // console.log('removed level:', remove[i])
+ requestAnimationFrame(() => { simulation.makeTextLog(`banned level: ${remove[i]}`); });
+ }
}
- console.log('Landgreen levels after', level.playableLevels)
+ // console.log('Landgreen levels after', level.playableLevels)
}
if (document.getElementById("seed").value) { //check for player entered seed in settings
@@ -1607,15 +1615,11 @@ const level = {
pushBlock(blocks[i].bodyA)
pushBlock(blocks[i].bodyB)
}
-
const mobTargets = Matter.Query.collides(this, mob)
for (let i = 0; i < mobTargets.length; i++) {
pushBlock(mobTargets[i].bodyA)
pushBlock(mobTargets[i].bodyB)
}
-
-
-
let pushPowerUp = (who) => {
if (!who.isMover) {
if ((this.VxGoal > 0 && who.velocity.x < this.VxGoal) || (this.VxGoal < 0 && who.velocity.x > this.VxGoal)) {
@@ -3398,34 +3402,45 @@ const level = {
level.setPosToSpawn(2235, -1375); //normal spawn
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); //bump for level entrance
- level.exit.x = 5150;
- level.exit.y = -2705;
+ level.exit.x = 7875;
+ level.exit.y = -2480;
+
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20); //bump for level exit
- level.defaultZoom = 1800
+ level.defaultZoom = 1500
simulation.zoomTransition(level.defaultZoom)
- document.body.style.backgroundColor = "#d8d9dc";
- color.map = "#262a2f"
+ document.body.style.backgroundColor = "#d0d2d4s";
+ // color.map = "#262a2f"
let isPowerLeft = true
const movers = []
- const moveSpeed = -5
- movers.push(level.mover(125, -140, 925, 35, moveSpeed))
- movers.push(level.mover(1100, -437, 1100, 35, moveSpeed))
- movers.push(level.mover(2000, -600, 850, 35, moveSpeed))
+ //left side
+ movers.push(level.mover(125, -140, 925, 35, -5))
+ movers.push(level.mover(1100, -437, 1100, 35, -5))
+ movers.push(level.mover(2000, -600, 850, 35, -5))
+ //right side
const moveSpeedStopGo = 8
movers.push(level.mover(2700, -200, 3600, 35, 0))
- const leftMoverSpeed = 6
- movers.push(level.mover(6750, -450, 425, 350, leftMoverSpeed))
- movers.push(level.mover(7675, -725, 500, 410, -leftMoverSpeed))
- movers.push(level.mover(6750, -1075, 425, 50, -leftMoverSpeed))
- movers.push(level.mover(5525, -1075, 450, 50, leftMoverSpeed))
movers.push(level.mover(7175, -215, 2275, 50, 3))
movers.push(level.mover(6475, -215, 275, 100, -3))
+ movers.push(level.mover(6725, -500, 500, 375, 3))
- const trains = []
- trains.push(level.transport(6275, -2100, 600, 50, 8 + simulation.difficultyMode))
- trains.push(level.transport(6275, -2425, 600, 50, -8 - simulation.difficultyMode))
+ movers.push(level.mover(7675, -725, 500, 410, 0))
+ movers.push(level.mover(6775, -1075, 375, 50, 0))
+ movers.push(level.mover(5525, -1075, 450, 50, 0))
+ movers.push(level.mover(6775, -2100, 375, 50, 0))
+ movers.push(level.mover(5450, -1900, 525, 50, 0))
+
+ function setMoverDirection(VxGoal) {
+ for (let i = 7; i < movers.length; i++) {
+ movers[i].VxGoal = VxGoal
+ }
+ }
+ setMoverDirection(0)
+
+ const buttonRight = level.button(7735, -1825)
+ buttonRight.isUp = true
+ const buttonLeft = level.button(5275, -1900)
const lasers = []
const laserX = 3390 //3882 - 1130 / 2
@@ -3454,15 +3469,15 @@ const level = {
if (isPowerLeft) {
if (!(simulation.cycle % 90)) spawnBlock(2730, -1600);
} else {
- for (let i = 0; i < trains.length; i++) {
- //oscillate back and forth
- if (trains[i].position.x < 5275) {
- trains[i].changeDirection(true) //go right
- } else if (trains[i].position.x > 7875) {
- trains[i].changeDirection(false) //go left
- }
- trains[i].move();
- }
+ // for (let i = 0; i < trains.length; i++) {
+ // //oscillate back and forth
+ // if (trains[i].position.x < 5275) {
+ // trains[i].changeDirection(true) //go right
+ // } else if (trains[i].position.x > 7875) {
+ // trains[i].changeDirection(false) //go left
+ // }
+ // trains[i].move();
+ // }
const rate = 160 //multiples of 32!
if ((simulation.cycle % rate) === 80) {
@@ -3513,6 +3528,20 @@ const level = {
}
}
}
+ if (buttonRight.isUp) {
+ buttonRight.query();
+ if (!buttonRight.isUp) {
+ buttonLeft.isUp = true //flip the other button up
+ setMoverDirection(-7)
+ }
+ }
+ if (buttonLeft.isUp) {
+ buttonLeft.query();
+ if (!buttonLeft.isUp) {
+ buttonRight.isUp = true //flip the other button up
+ setMoverDirection(7)
+ }
+ }
if (button1.isUp) {
button1.query();
@@ -3544,19 +3573,20 @@ const level = {
powerUps.addResearchToLevel() //needs to run after mobs are spawned
}
}
+ buttonRight.draw();
+ buttonLeft.draw();
button1.draw();
for (let i = 0; i < movers.length; i++) movers[i].push();
level.exit.drawAndCheck();
level.enter.draw();
ctx.fillStyle = "rgba(0,0,0,0.1)"
- ctx.fillRect(6937, -1050, 50, 675);
+ ctx.fillRect(6937, -2075, 50, 1775); //6937, -1050, 50, 675);
ctx.fillStyle = "rgba(0,255,255,0.15)" // ctx.fillStyle = "#f2f2f2"
- ctx.fillRect(4975, -3050, 475, 375); //exit room
-
+ ctx.fillRect(7675, -2875, 500, 425); //exit room
};
level.customTopLayer = () => {
if (isPowerLeft) {
- ctx.fillStyle = "rgba(0,0,0,0.1)"
+ ctx.fillStyle = "rgba(0,0,0,0.2)"
ctx.fillRect(2400, -1650, 7050, 2750) //right side
ctx.fillRect(4950, -3075, 3225, 1425);
ctx.beginPath()
@@ -3572,7 +3602,7 @@ const level = {
ctx.lineTo(2452, 65)
ctx.fill();
} else {
- for (let i = 0; i < trains.length; i++) trains[i].draw()
+ // for (let i = 0; i < trains.length; i++) trains[i].draw()
ctx.beginPath()
ctx.moveTo(2526, -589);
ctx.lineTo(2531, -597)
@@ -3583,14 +3613,14 @@ const level = {
ctx.lineTo(6618, 857)
ctx.lineTo(6622, 1100)
ctx.lineTo(2521, 1100)
- ctx.fillStyle = "rgba(0,0,0,0.1)"
+ ctx.fillStyle = "rgba(0,0,0,0.2)"
ctx.fill();
ctx.fillRect(-100, -1650, 2625, 2750) //left side
for (let i = 0; i < lasers.length; i++) lasers[i].opticalQuery()
}
ctx.fillStyle = "rgba(0,0,0,0.07)"
- ctx.fillRect(7675, -1825, 1775, 1650);
- ctx.fillRect(4975, -1900, 475, 825);
+ ctx.fillRect(7675, -2200, 1775, 2025);
+ ctx.fillRect(4950, -2075, 500, 1000);
ctx.fillRect(2050, -1650, 350, 325) //entrance room
for (let i = 0; i < movers.length; i++) movers[i].draw();
};
@@ -3609,8 +3639,6 @@ const level = {
spawn.mapRect(4975, -1087, 550, 62);
spawn.mapRect(4975, -1100, 500, 75);
-
-
spawn.mapRect(7875, -1100, 175, 25); //right 3 hop stairs
spawn.mapRect(8075, -1450, 200, 25);
spawn.mapRect(7675, -1825, 375, 25);
@@ -3620,9 +3648,13 @@ const level = {
spawn.mapRect(4900, -1575, 175, 25);
spawn.mapRect(5125, -1900, 325, 25);
spawn.mapRect(5225, -1875, 225, 625);
+ spawn.mapRect(4950, -3075, 500, 1000);
+
+ //exit
+ spawn.mapRect(7675, -2450, 525, 250);
+ spawn.mapRect(7675, -3050, 550, 175);
+ spawn.mapRect(7675, -2925, 50, 175);
- spawn.mapRect(5400, -3100, 50, 250); //exit
- spawn.mapRect(4875, -2675, 675, 50); //exit
spawn.mapRect(1925, -1325, 550, 50); //entrance
spawn.mapRect(2050, -1675, 50, 175); //entrance
spawn.mapRect(1700, -200, 750, 275); //button shelf
diff --git a/js/mob.js b/js/mob.js
index 258b074..20047eb 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -60,7 +60,7 @@ const mobs = {
function applySlow(whom) {
if (!whom.shield && !whom.isShielded && whom.alive) {
- if (tech.isIceMaxHealthLoss && whom.health > 0.65 && whom.damageReduction > 0) whom.health = 0.66
+ if (tech.isIceMaxHealthLoss && whom.health > 0.66 && whom.damageReduction > 0) whom.health = 0.66
if (tech.isIceKill && whom.health < 0.34 && whom.damageReduction > 0 && whom.alive) {
// whom.death();
whom.damage(Infinity);
diff --git a/js/player.js b/js/player.js
index ae73d61..3394f81 100644
--- a/js/player.js
+++ b/js/player.js
@@ -546,7 +546,6 @@ const m = {
if (tech.isFieldHarmReduction) dmg *= 0.5
if (tech.isHarmMACHO) dmg *= 0.4
if (tech.isImmortal) dmg *= 0.67
- if (tech.isSlowFPS) dmg *= 0.8
if (tech.energyRegen === 0) dmg *= 0.34
// if (tech.healthDrain) dmg *= 1 + 3.33 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage
if (m.fieldMode === 0 || m.fieldMode === 3) dmg *= 0.973 ** m.coupling
@@ -563,7 +562,7 @@ const m = {
if (tech.isTurret && m.crouch) dmg *= 0.34;
if (tech.isFirstDer && b.inventory[0] === b.activeGun) dmg *= 0.85 ** b.inventory.length
if (tech.isEnergyHealth) {
- return Math.pow(dmg, 0.13) //defense has less effect
+ return Math.pow(dmg, 0.19) //defense has less effect
} else {
return dmg
}
@@ -782,26 +781,37 @@ const m = {
};
if (m.defaultFPSCycle < m.cycle) requestAnimationFrame(normalFPS);
- if (tech.isSlowFPS) { // slow game
- simulation.fpsCap = 30 //new fps
+ if (dmg > 0.05) { // freeze game for high damage hits
+ simulation.fpsCap = 4 //40 - Math.min(25, 100 * dmg)
simulation.fpsInterval = 1000 / simulation.fpsCap;
- //how long to wait to return to normal fps
- m.defaultFPSCycle = m.cycle + 20 + Math.min(90, Math.floor(200 * dmg))
- if (tech.isHarmFreeze) { //freeze all mobs
- for (let i = 0, len = mob.length; i < len; i++) {
- mobs.statusSlow(mob[i], 450)
- }
+ if (tech.isHarmFreeze) {
+ for (let i = 0, len = mob.length; i < len; i++) mobs.statusSlow(mob[i], 480) //freeze all mobs
}
} else {
- if (dmg > 0.05) { // freeze game for high damage hits
- simulation.fpsCap = 4 //40 - Math.min(25, 100 * dmg)
- simulation.fpsInterval = 1000 / simulation.fpsCap;
- } else {
- simulation.fpsCap = simulation.fpsCapDefault
- simulation.fpsInterval = 1000 / simulation.fpsCap;
- }
- m.defaultFPSCycle = m.cycle
+ simulation.fpsCap = simulation.fpsCapDefault
+ simulation.fpsInterval = 1000 / simulation.fpsCap;
}
+ m.defaultFPSCycle = m.cycle
+ // if (tech.isSlowFPS) { // slow game
+ // simulation.fpsCap = 30 //new fps
+ // simulation.fpsInterval = 1000 / simulation.fpsCap;
+ // //how long to wait to return to normal fps
+ // m.defaultFPSCycle = m.cycle + 20 + Math.min(90, Math.floor(200 * dmg))
+ // if (tech.isHarmFreeze) { //freeze all mobs
+ // for (let i = 0, len = mob.length; i < len; i++) {
+ // mobs.statusSlow(mob[i], 450)
+ // }
+ // }
+ // } else {
+ // if (dmg > 0.05) { // freeze game for high damage hits
+ // simulation.fpsCap = 4 //40 - Math.min(25, 100 * dmg)
+ // simulation.fpsInterval = 1000 / simulation.fpsCap;
+ // } else {
+ // simulation.fpsCap = simulation.fpsCapDefault
+ // simulation.fpsInterval = 1000 / simulation.fpsCap;
+ // }
+ // m.defaultFPSCycle = m.cycle
+ // }
// if (!noTransition) {
// document.getElementById("health").style.transition = "width 0s ease-out"
// } else {
@@ -2235,16 +2245,14 @@ const m = {
// float towards player if looking at and in range or if very close to player
if (
dist2 < m.grabPowerUpRange2 &&
- (m.lookingAt(powerUp[i]) || dist2 < 1000) &&
+ (m.lookingAt(powerUp[i]) || dist2 < 10000) &&
Matter.Query.ray(map, powerUp[i].position, m.pos).length === 0
) {
- powerUp[i].force.x += 0.04 * (dxP / Math.sqrt(dist2)) * powerUp[i].mass;
- powerUp[i].force.y += 0.04 * (dyP / Math.sqrt(dist2)) * powerUp[i].mass - powerUp[i].mass * simulation.g; //negate gravity
- //extra friction
- Matter.Body.setVelocity(powerUp[i], {
- x: powerUp[i].velocity.x * 0.11,
- y: powerUp[i].velocity.y * 0.11
- });
+ if (!tech.isHealAttract || powerUp[i].name !== "heal") { //if you have accretion heals are already pulled in a different way
+ powerUp[i].force.x += 0.04 * (dxP / Math.sqrt(dist2)) * powerUp[i].mass;
+ powerUp[i].force.y += 0.04 * (dyP / Math.sqrt(dist2)) * powerUp[i].mass - powerUp[i].mass * simulation.g; //negate gravity
+ Matter.Body.setVelocity(powerUp[i], { x: powerUp[i].velocity.x * 0.11, y: powerUp[i].velocity.y * 0.11 }); //extra friction
+ }
if ( //use power up if it is close enough
dist2 < 5000 &&
!simulation.isChoosing &&
@@ -3784,7 +3792,7 @@ const m = {
},
{
name: "metamaterial cloaking",
- description: "when not firing activate cloaking
after decloaking +333% damage for 2 s
generate 6 energy per second",
+ description: "+50% defense while cloaked
after decloaking +333% damage for 2 s
generate 6 energy per second",
effect: () => {
m.fieldFire = true;
m.fieldMeterColor = "#333";
@@ -3957,7 +3965,7 @@ const m = {
//
blocks can't collide with intangible mobs
//field radius decreases out of line of sight
//unlock tech from other fields
- description: "use energy to guide blocks
tech, fields, and guns have +2 choice
generate 10 energy per second",
+ description: "use energy to guide blocks
tech, fields, and guns have +2 choices
generate 10 energy per second",
effect: () => {
m.fieldMeterColor = "#333"
m.eyeFillColor = m.fieldMeterColor
diff --git a/js/powerup.js b/js/powerup.js
index 4d68f71..6bf7f02 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -516,7 +516,7 @@ const powerUps = {
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 (healOutput > 0) simulation.makeTextLog(`m.health += ${(healOutput).toFixed(3)}`) //
${m.health.toFixed(3)}
if (tech.isOverHeal && overHeal > 0) { //tech quenching
const scaledOverHeal = overHeal * 0.9
m.damage(scaledOverHeal);
@@ -582,7 +582,6 @@ const powerUps = {
tech.healMaxEnergyBonus += 0.08 * tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)
m.setMaxEnergy();
}
-
},
spawn(x, y, size) { //used to spawn a heal with a specific size / heal amount, not normally used
powerUps.directSpawn(x, y, "heal", false, null, size)
@@ -1313,7 +1312,7 @@ const powerUps = {
powerUps.spawn(x, y, "coupling");
return;
}
- if (tech.isBoostPowerUps && Math.random() < 0.16) {
+ if (tech.isBoostPowerUps && Math.random() < 0.14) {
powerUps.spawn(x, y, "boost");
return;
}
diff --git a/js/simulation.js b/js/simulation.js
index d927992..1a47771 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -765,8 +765,8 @@ const simulation = {
input.endKeySensing();
simulation.ephemera = []
- b.removeAllGuns();
tech.setupAllTech(); //sets tech to default values
+ b.removeAllGuns();
tech.duplication = 0;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
diff --git a/js/tech.js b/js/tech.js
index c15c5db..b3d4f7b 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -228,7 +228,7 @@ const tech = {
// }
// }
// }
- if (tech.isDivisor && b.guns[b.activeGun].ammo % 3 === 0) dmg *= 1.83
+ if (tech.isDivisor && b.activeGun && b.guns[b.activeGun].ammo % 3 === 0) dmg *= 1.77
if (tech.isNoGroundDamage) dmg *= m.onGround ? 0.78 : 1.88
if (tech.isDilate) dmg *= 1.5 + 0.6 * Math.sin(m.cycle * 0.0075)
if (tech.isGunChoice && tech.buffedGun === b.inventoryGun) dmg *= 1 + 0.31 * b.inventory.length
@@ -407,7 +407,7 @@ const tech = {
{
name: "mass-energy equivalence",
// description: "energy protects you instead of health
√ of defense reduction reduces max energy",
- description: "energy protects you instead of health
exponentially reduced defense (~ x^0.13)",
+ description: "energy protects you instead of health
exponentially reduced defense (~ x^0.19)",
maxCount: 1,
count: 0,
frequency: 1,
@@ -542,7 +542,7 @@ const tech = {
{
name: "ternary", //"divisor",
descriptionFunction() {
- return `+83% damage while your current gun
has ammo divisible by 3`
+ return `+77% damage while your current gun
has ammo divisible by 3`
},
maxCount: 1,
count: 0,
@@ -2475,16 +2475,16 @@ const tech = {
}
},
{
- name: "liquid cooling",
- description: `after losing health
freeze all mobs for 7 seconds`,
+ name: "refrigerant",
+ description: `after losing at least 5% health
freeze all mobs for 7 seconds`,
maxCount: 1,
count: 0,
- frequency: 2,
- frequencyDefault: 2,
+ frequency: 1,
+ frequencyDefault: 1,
allowed() {
- return tech.isSlowFPS
+ return true
},
- requires: "clock gating",
+ requires: "",
effect() {
tech.isHarmFreeze = true;
},
@@ -2492,24 +2492,24 @@ const tech = {
tech.isHarmFreeze = false;
}
},
- {
- name: "clock gating",
- description: `after losing health slow time by 50%
+20% defense`,
- maxCount: 1,
- count: 0,
- frequency: 1,
- frequencyDefault: 1,
- allowed() {
- return simulation.fpsCapDefault > 45
- },
- requires: "FPS above 45",
- effect() {
- tech.isSlowFPS = true;
- },
- remove() {
- tech.isSlowFPS = false;
- }
- },
+ // {
+ // name: "clock gating",
+ // description: `after losing health slow time by 50%
+20% defense`,
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 1,
+ // frequencyDefault: 1,
+ // allowed() {
+ // return simulation.fpsCapDefault > 45
+ // },
+ // requires: "FPS above 45",
+ // effect() {
+ // tech.isSlowFPS = true;
+ // },
+ // remove() {
+ // tech.isSlowFPS = false;
+ // }
+ // },
{
name: "piezoelectricity",
@@ -2639,7 +2639,7 @@ const tech = {
},
{
name: "Maxwells demon",
- description: "energy above your max decays 96% slower
+5% JUNK to tech pool",
+ description: "energy above max decays by 30% 1% per second
+5% JUNK to tech pool",
maxCount: 1,
count: 0,
frequency: 2,
@@ -2649,7 +2649,7 @@ const tech = {
},
requires: "energy above your max",
effect() {
- tech.overfillDrain = 0.94 //70% = 1-(1-0.75)/(1-0.15) //92% = 1-(1-0.75)/(1-0.87)
+ tech.overfillDrain = 0.99 //70% = 1-(1-0.75)/(1-0.15) //92% = 1-(1-0.75)/(1-0.87)
this.refundAmount += tech.addJunkTechToPool(0.05)
},
refundAmount: 0,
@@ -3574,7 +3574,7 @@ const tech = {
},
{
name: "dark patterns",
- description: "+15% damage
+15% JUNK to tech pool",
+ description: "+17% damage
+17% JUNK to tech pool",
maxCount: 9,
count: 0,
frequency: 1,
@@ -3583,10 +3583,10 @@ const tech = {
return true
},
requires: "",
- damage: 1.15,
+ damage: 1.17,
effect() {
tech.damage *= this.damage
- this.refundAmount += tech.addJunkTechToPool(0.15)
+ this.refundAmount += tech.addJunkTechToPool(0.17)
},
refundAmount: 0,
remove() {
@@ -3599,7 +3599,7 @@ const tech = {
{
name: "exciton",
descriptionFunction() {
- return `after mobs die they have a 16% chance to
spawn ${powerUps.orb.boost(1)} that give +${(powerUps.boost.damage * 100).toFixed(0)}% damage for ${(powerUps.boost.duration / 60).toFixed(0)} seconds`
+ return `after mobs die they have a 14% chance to
spawn ${powerUps.orb.boost(1)} that give +${(powerUps.boost.damage * 100).toFixed(0)}% damage for ${(powerUps.boost.duration / 60).toFixed(0)} seconds`
},
maxCount: 1,
count: 0,
@@ -4181,8 +4181,8 @@ const tech = {
}
powerUps.spawn(m.pos.x, m.pos.y, "gun");
// powerUps.spawn(m.pos.x, m.pos.y, "gun");
- tech.tech[choose].count = 0;
tech.tech[choose].remove(); // remove a random tech form the list of tech you have
+ // tech.tech[choose].count = 0;
tech.tech[choose].isLost = true
simulation.updateTechHUD();
},
@@ -7502,7 +7502,8 @@ const tech = {
{
name: "dynamic equilibrium",
descriptionFunction() {
- return `increase damage by your defense and
5% of your last ${tech.isEnergyHealth ? "energy" : "health"} loss (+${(100 * Math.max(5, tech.lastHitDamage) * m.lastHit * (2 - m.defense())).toFixed(0)}% damage)`
+ // return `increase damage by your defense and
5% of your last ${tech.isEnergyHealth ? "energy" : "health"} loss (+${(100 * Math.max(5, tech.lastHitDamage) * m.lastHit * (2 - m.defense())).toFixed(0)}% damage)`
+ return `increase damage by your last ${tech.isEnergyHealth ? "energy" : "health"} loss
scales with defense (+${(100 * Math.max(5, tech.lastHitDamage) * m.lastHit * (2 - m.defense())).toFixed(0)}% damage)`
}, // = +${10*m.defense()}%
// descriptionFunction() { return `increase damage by your last ${tech.isEnergyHealth ? "energy" : "health"} loss
(${(tech.lastHitDamage).toFixed(0)}%)(${(100*m.lastHit).toFixed(0)} ${tech.isEnergyHealth ? "energy" : "health"})(${2 - m.defense()} defense) = ${(100*tech.lastHitDamage * m.lastHit * (2 - m.defense())).toFixed(0)}% damage ` }, // = +${10*m.defense()}%
isFieldTech: true,
@@ -7515,7 +7516,7 @@ const tech = {
},
requires: "negative mass, pilot wave, not patch",
effect() {
- tech.lastHitDamage += 5;
+ tech.lastHitDamage += 4;
},
remove() {
tech.lastHitDamage = 0;
diff --git a/todo.txt b/todo.txt
index e729237..ca75494 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,18 +1,18 @@
******************************************************** NEXT PATCH **************************************************
-new community map!! underpass by Richard0820
+factory: rewrote the end
-duplicated power ups aren't circles
-metastability makes power ups triangles instead of circles
- 3->4 seconds of half life before exploding
- only metastability duplicated power ups have the lighting graphic
+clock gating was removed because it's annoying
+liquid cooling -> refrigerant - freezes mobs after losing at least 5% health
+mass-energy gets more effect from defense (0.13 -> 0.19)
+ternary 84 -> 77% damage
+dark patterns 15 -> 17% damage and JUNK
+Maxwell's demon 3% -> 1% energy loss above max
+exciton 16 -> 14% chance to drop
-mob's that fall off the map now die instead of just being removed
- so they can still spawn power ups
-you can pick up power ups from slightly farther away (450)
- but less far away when not facing the power up (100)
- accretion has less lag at high amounts of heal power ups following you
-several other bug fixes
+10% increase in overall mob health
+new images
+bug fixes
*********************************************************** TODO *****************************************************
@@ -33,9 +33,6 @@ perfect diamagnatism - invulnerable while field is active?
mobs attack mines
mines periodically set all mobs to have player location to be the mine
is this going to work with all mob vision types?
-
-maybe use ⚆ in game text?
- increase font?
rework quantum eraser
@@ -1229,7 +1226,6 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
***past style themes***
field emitter - bipedal white robot spherical gun turret on bird legs
damaged dirty white robot spherical gun turret on bird legs in the style of Solarpunk
- a white spherical bipedal mech standing motionless while black lines travel quickly in the background, minimalist style --no arms --v5
standing wave - a 3-D cyan transparent nested concentric aligned centered sphere with rings
by Philippe Starck
perfect diamagnetism - physics magnetic field chalk diagram