From 9402cf2fe0f2731076b67db4b6da3b3a802b26d2 Mon Sep 17 00:00:00 2001 From: landgreen Date: Tue, 7 Feb 2023 15:41:42 -0800 Subject: [PATCH] elasticity tech: elasticity - skin, does "crouch landings" a tiny bit more jump and move faster, +15% defense (replaces squirrel cage rotor) tech: diaphragm - skin, defense cycles between -33% and +100% requires aperture tungsten carbide 150->200 maximum health but now does "crouch landings" a more Zectron damage 80->100% and it does a bit less harm to player flip-flop, relay switch are no longer skins pause brings up the most recent in game console message in game console no longer fades out it just instantly goes on and off bug fixes --- img/diaphragm.webp | Bin 0 -> 36726 bytes img/elasticity.webp | Bin 0 -> 16158 bytes img/squirrel-cage rotor.webp | Bin 10480 -> 0 bytes js/bullet.js | 4 +- js/engine.js | 2 +- js/index.js | 7 +- js/level.js | 17 +- js/player.js | 174 +++++++++++++- js/simulation.js | 37 ++- js/spawn.js | 8 +- js/tech.js | 451 +++++++++++++++++++---------------- style.css | 13 +- todo.txt | 37 ++- 13 files changed, 500 insertions(+), 250 deletions(-) create mode 100644 img/diaphragm.webp create mode 100644 img/elasticity.webp delete mode 100644 img/squirrel-cage rotor.webp diff --git a/img/diaphragm.webp b/img/diaphragm.webp new file mode 100644 index 0000000000000000000000000000000000000000..10a8bc210761c6f08c3f1f156ea2094890dcdb36 GIT binary patch literal 36726 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 literal 0 HcmV?d00001 diff --git a/img/elasticity.webp b/img/elasticity.webp new file mode 100644 index 0000000000000000000000000000000000000000..a2081d72d4f6d478eeb0335b98e149c4801951eb GIT binary patch literal 16158 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 literal 0 HcmV?d00001 diff --git a/img/squirrel-cage rotor.webp b/img/squirrel-cage rotor.webp deleted file mode 100644 index 63c2c81a8ab01fa30c6abe824b0798b58b5c2515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10480 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 130) { + if (momentum > tech.hardLanding) { m.doCrouch(); m.yOff = m.yOffWhen.jump; m.hardLandCD = m.cycle + Math.min(momentum / 6.5 - 6, 40) diff --git a/js/index.js b/js/index.js index 82b7dae..aaa3cab 100644 --- a/js/index.js +++ b/js/index.js @@ -380,7 +380,7 @@ ${simulation.isCheating ? "

lore disabled": ""}

${b.guns[b.inventory[i]].description} ` } - + text += `
${document.getElementById("text-log").innerHTML}
` //show last in game console message let el = document.getElementById("pause-grid-left") el.style.display = "grid" el.innerHTML = text @@ -441,6 +441,11 @@ ${simulation.isCheating ? "

lore disabled": ""} document.getElementById("field").style.display = "none" document.getElementById("health").style.display = "none" document.getElementById("health-bg").style.display = "none" + + //show in game console + // document.getElementById("text-log").style.display = "inline" + simulation.lastLogTime = m.cycle //hide in game console + }, unPauseGrid() { document.getElementById("tech").style.display = "inline" diff --git a/js/level.js b/js/level.js index 84db4b3..4686fc7 100644 --- a/js/level.js +++ b/js/level.js @@ -33,12 +33,12 @@ const level = { // b.giveGuns("laser") //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("wave") //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[0].ammo = 10000 - // tech.giveTech("tungsten carbide") - // tech.giveTech("ship") + // tech.giveTech("aperture") + // tech.giveTech("diaphragm") // for (let i = 0; i < 1; ++i) tech.giveTech("mass-energy equivalence") - // for (let i = 0; i < 1; ++i) tech.giveTech("squirrel-cage rotor") + // for (let i = 0; i < 1; ++i) tech.giveTech("tungsten carbide") // for (let i = 0; i < 1; i++) tech.giveTech("CPT symmetry") - // for (let i = 0; i < 1; i++) tech.giveTech("Meissner effect") + // for (let i = 0; i < 1; i++) tech.giveTech("elasticity") // for (let i = 0; i < 3; i++) powerUps.directSpawn(450, -50, "tech"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "boost"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "coupling"); @@ -57,9 +57,13 @@ const level = { // for (let i = 0; i < 40; ++i) tech.giveTech() // for (let i = 0; i < 13; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research"); + //a for loop that produces Fibinochi numbers + + + level[simulation.isTraining ? "walk" : "intro"]() //normal starting level ************************************************ - // simulation.isAutoZoom = false; + // simulation.isAutoZoom = false; //look in close // simulation.zoomScale *= 0.5; // simulation.setZoom(); @@ -259,7 +263,7 @@ const level = { level.disableExit = true document.getElementById("health").style.display = "none" document.getElementById("health-bg").style.display = "none" - document.getElementById("text-log").style.opacity = 0; //fade out any active text logs + document.getElementById("text-log").style.display = "none" document.getElementById("fade-out").style.opacity = 1; //slowly fades out setTimeout(function() { simulation.paused = true; @@ -314,6 +318,7 @@ const level = { } if (simulation.isTraining) { + simulation.isHorizontalFlipped = false level.levels = level.trainingLevels.slice(0) //copy array, not by just by assignment } else { //add remove and shuffle levels for the normal game (not training levels) level.levels = level.playableLevels.slice(0) //copy array, not by just by assignment diff --git a/js/player.js b/js/player.js index 36e85dd..6ba2676 100644 --- a/js/player.js +++ b/js/player.js @@ -464,7 +464,7 @@ const m = { simulation.paused = true; m.health = 0; m.displayHealth(); - document.getElementById("text-log").style.opacity = 0; //fade out any active text logs + document.getElementById("text-log").style.display = "none" document.getElementById("fade-out").style.opacity = 0.9; //slowly fade to 90% white on top of canvas // build.shareURL(false) setTimeout(function() { @@ -533,7 +533,7 @@ const m = { }, baseHealth: 1, setMaxHealth() { - m.maxHealth = m.baseHealth + tech.extraMaxHealth + 1.5 * tech.isFallingDamage + 4 * tech.isFlipFlop * tech.isFlipFlopOn * tech.isFlipFlopHealth //+ (m.fieldMode === 0 || m.fieldMode === 5) * 0.5 * m.coupling + m.maxHealth = m.baseHealth + tech.extraMaxHealth + 2 * tech.isFallingDamage + 4 * tech.isFlipFlop * tech.isFlipFlopOn * tech.isFlipFlopHealth //+ (m.fieldMode === 0 || m.fieldMode === 5) * 0.5 * m.coupling 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; @@ -546,6 +546,8 @@ const m = { let dmg = 1 dmg *= m.fieldHarmReduction // if (!tech.isFlipFlopOn && tech.isFlipFlopHealth) dmg *= 0.5 + // 1.25 + Math.sin(m.cycle * 0.01) + if (tech.isDiaphragm) dmg *= 0.66 + 0.66 * Math.sin(m.cycle * 0.01); if (tech.isZeno) dmg *= 0.15 if (tech.isFieldHarmReduction) dmg *= 0.5 if (tech.isHarmMACHO) dmg *= 0.4 @@ -556,7 +558,7 @@ const m = { if (m.fieldMode === 0 || m.fieldMode === 3) dmg *= 0.73 ** m.coupling if (tech.isLowHealthDefense) dmg *= 1 - Math.max(0, 1 - m.health) * 0.8 if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33 - if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage + if (tech.squirrelFx !== 1) dmg *= 1 - 3 * (tech.squirrelFx - 1) / 5 //cause more damage if (tech.isAddBlockMass && m.isHolding) dmg *= 0.15 if (tech.isSpeedHarm && player.speed > 0.1) dmg *= 1 - Math.min(player.speed * 0.0165, 0.66) if (tech.isHarmReduce && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.25 @@ -836,6 +838,9 @@ const m = { draw() {}, isAltSkin: false, resetSkin() { + m.yOffWhen.jump = 70 + m.yOffWhen.stand = 49 + m.yOffWhen.crouch = 22 m.isAltSkin = false m.color = { hue: 0, @@ -912,6 +917,94 @@ const m = { none() { m.isAltSkin = true }, + mech() { + m.isAltSkin = true + m.yOffWhen.stand = 52 + m.yOffWhen.jump = 72 + // m.yOffWhen.crouch = 22 + // m.color = { + // hue: 184, + // sat: 0, + // light: 55, + // } + // m.setFillColors(); + m.draw = function() { + m.walk_cycle += m.flipLegs * m.Vx; + ctx.save(); + ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5 //|| (m.cycle % 40 > 20) + ctx.translate(m.pos.x, m.pos.y); + m.calcLeg(Math.PI, -1.25); + m.drawLeg("#606060"); + m.calcLeg(0, 0); + m.drawLeg("#444"); + ctx.rotate(m.angle); + ctx.beginPath(); + ctx.arc(0, 0, 30, 0, 2 * Math.PI); + ctx.fillStyle = m.bodyGradient + ctx.fill(); + ctx.arc(15, 0, 4, 0, 2 * Math.PI); + ctx.strokeStyle = "#333"; + ctx.lineWidth = 2; + ctx.stroke(); + ctx.restore(); + m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal + powerUps.boost.draw() + } + m.drawLeg = function(stroke) { + if (m.angle > -Math.PI / 2 && m.angle < Math.PI / 2) { + m.flipLegs = 1; + } else { + m.flipLegs = -1; + } + const hip = { x: m.hip.x - 5, y: m.hip.y + 5 } + const sub = Vector.sub(m.knee, hip) + const off = Vector.mult(Vector.rotate(Vector.normalise(sub), Math.PI / 2), 8) + const kneeBraceHigh = Vector.add(hip, off) + const kneeBraceLow = Vector.add(kneeBraceHigh, Vector.mult(sub, 0.9)) + const foot = { x: m.foot.x - 10, y: m.foot.y - 15 } + ctx.save(); + ctx.scale(m.flipLegs, 1); //leg lines + ctx.beginPath(); + ctx.moveTo(hip.x, hip.y); + ctx.lineTo(m.knee.x, m.knee.y); + ctx.lineTo(foot.x, foot.y); + //extra upper leg brace + ctx.moveTo(kneeBraceHigh.x, kneeBraceHigh.y); + ctx.lineTo(kneeBraceLow.x, kneeBraceLow.y); + ctx.lineTo(m.knee.x, m.knee.y); + + ctx.strokeStyle = stroke; + ctx.lineWidth = 3; + ctx.stroke(); + //foot + ctx.beginPath(); + ctx.moveTo(foot.x, foot.y); + ctx.quadraticCurveTo(m.foot.x - 30, m.foot.y + 12, m.foot.x + 13, m.foot.y + 3); + ctx.lineWidth = 1.5; + ctx.stroke(); + + //hip joint + ctx.beginPath(); + ctx.arc(m.hip.x, m.hip.y - 1, 11, 0, 2 * Math.PI); + //knee joint + ctx.moveTo(m.knee.x + 3, m.knee.y); + ctx.arc(m.knee.x, m.knee.y, 3, 0, 2 * Math.PI); + //knee brace + // ctx.moveTo(kneeBraceHigh.x + 4, kneeBraceHigh.y); + // ctx.arc(kneeBraceHigh.x, kneeBraceHigh.y, 4, 0, 2 * Math.PI); + ctx.moveTo(kneeBraceLow.x + 2.5, kneeBraceLow.y); + ctx.arc(kneeBraceLow.x, kneeBraceLow.y, 2.5, 0, 2 * Math.PI); + //foot joint + ctx.moveTo(foot.x + 2.5, foot.y); + ctx.arc(foot.x, foot.y, 2.5, 0, 2 * Math.PI); + ctx.fillStyle = m.fillColor; + ctx.fill(); + ctx.lineWidth = 1; + // ctx.strokeStyle = "#333" + ctx.stroke(); + ctx.restore(); + } + }, energy() { m.isAltSkin = true m.color = { @@ -1231,19 +1324,90 @@ const m = { ctx.fill(); ctx.strokeStyle = "#333"; ctx.lineWidth = 2; + ctx.arc(12, 0, 8 + 4 * Math.sin(m.cycle * 0.01), 0, 2 * Math.PI); //big eye ctx.stroke(); ctx.beginPath(); ctx.arc(12, 0, 8 + 4 * Math.sin(m.cycle * 0.01), 0, 2 * Math.PI); //big eye ctx.fillStyle = `hsl(${150+100*Math.sin(m.cycle * 0.01)},100%,50%)` ctx.fill(); - ctx.strokeStyle = "#333"; - ctx.lineWidth = 2; ctx.stroke(); ctx.restore(); m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal powerUps.boost.draw() } }, + dilate2() { + m.isAltSkin = true + m.draw = function() { + ctx.fillStyle = m.fillColor; + m.walk_cycle += m.flipLegs * m.Vx; + ctx.save(); + ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5 //|| (m.cycle % 40 > 20) + ctx.translate(m.pos.x, m.pos.y); + m.calcLeg(Math.PI, -3); + m.drawLeg("#5f5f5f"); + m.calcLeg(0, 0); + m.drawLeg("#444"); + ctx.rotate(m.angle); + ctx.beginPath(); + ctx.arc(0, 0, 30, 0, 2 * Math.PI); + ctx.fillStyle = m.bodyGradient + ctx.fill(); + ctx.strokeStyle = "#444"; + ctx.lineWidth = 3 + 3 * Math.sin(m.cycle * 0.01 + Math.PI); + ctx.arc(12, 0, 6 + 3 * Math.sin(m.cycle * 0.01), 0, 2 * Math.PI); //big eye + ctx.stroke(); + ctx.beginPath(); + ctx.arc(12, 0, 6 + 3 * Math.sin(m.cycle * 0.01), 0, 2 * Math.PI); //big eye + ctx.fillStyle = `hsl(${150+100*Math.sin(m.cycle * 0.01)},100%,50%)` + ctx.fill(); + ctx.stroke(); + ctx.restore(); + m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal + powerUps.boost.draw() + } + m.drawLeg = function(stroke) { + // if (simulation.mouseInGame.x > m.pos.x) { + if (m.angle > -Math.PI / 2 && m.angle < Math.PI / 2) { + m.flipLegs = 1; + } else { + m.flipLegs = -1; + } + ctx.save(); + ctx.scale(m.flipLegs, 1); //leg lines + ctx.beginPath(); + ctx.moveTo(m.hip.x, m.hip.y); + ctx.lineTo(m.knee.x, m.knee.y); + ctx.lineTo(m.foot.x, m.foot.y); + ctx.strokeStyle = stroke; + ctx.lineWidth = 7; + ctx.stroke(); + + //toe lines + ctx.beginPath(); + ctx.moveTo(m.foot.x, m.foot.y); + ctx.lineTo(m.foot.x - 15, m.foot.y + 5); + ctx.moveTo(m.foot.x, m.foot.y); + ctx.lineTo(m.foot.x + 15, m.foot.y + 5); + ctx.lineWidth = 4; + ctx.stroke(); + + //hip joint + ctx.beginPath(); + ctx.arc(m.hip.x, m.hip.y, 11, 0, 2 * Math.PI); + //knee joint + ctx.moveTo(m.knee.x + 7, m.knee.y); + ctx.arc(m.knee.x, m.knee.y, 7, 0, 2 * Math.PI); + //foot joint + ctx.moveTo(m.foot.x + 6, m.foot.y); + ctx.arc(m.foot.x, m.foot.y, 6, 0, 2 * Math.PI); + ctx.fillStyle = m.fillColor; + ctx.fill(); + ctx.lineWidth = 3 + 3 * Math.sin(m.cycle * 0.01 + Math.PI); + ctx.stroke(); + ctx.restore(); + } + }, CPT() { m.isAltSkin = true m.color = { diff --git a/js/simulation.js b/js/simulation.js index 384db5b..513060b 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -379,17 +379,34 @@ const simulation = { } requestAnimationFrame(loop) }, - // lastLogTimeBig: 0, boldActiveGunHUD() { if (b.inventory.length > 0) { - for (let i = 0, len = b.inventory.length; i < len; ++i) document.getElementById(b.inventory[i]).style.opacity = "0.3"; - // document.getElementById(b.activeGun).style.fontSize = "30px"; - if (document.getElementById(b.activeGun)) document.getElementById(b.activeGun).style.opacity = "1"; + for (let i = 0, len = b.inventory.length; i < len; ++i) { + if (b.inventory[i] === b.activeGun && document.getElementById(b.activeGun)) { + document.getElementById(b.inventory[i]).style.opacity = "1"; + } else { + document.getElementById(b.inventory[i]).style.opacity = "0.3"; + } + } } + + // if (b.inventory.length > 0) { + // for (let i = 0, len = b.inventory.length; i < len; ++i) document.getElementById(b.inventory[i]).style.opacity = "0.3"; + // // document.getElementById(b.activeGun).style.fontSize = "30px"; + // if (document.getElementById(b.activeGun)) document.getElementById(b.activeGun).style.opacity = "1"; + // } }, updateGunHUD() { + // for (let i = 0, len = b.inventory.length; i < len; ++i) { + // if (flashIndex === i) { + // document.getElementById(b.inventory[i]).innerHTML = b.guns[b.inventory[i]].name + " - " + b.guns[b.inventory[i]].ammo; + // } else { + // document.getElementById(b.inventory[i]).innerHTML = b.guns[b.inventory[i]].name + " - " + b.guns[b.inventory[i]].ammo; + // } + // } for (let i = 0, len = b.inventory.length; i < len; ++i) { - document.getElementById(b.inventory[i]).innerHTML = b.guns[b.inventory[i]].name + " - " + b.guns[b.inventory[i]].ammo; + // document.getElementById(b.inventory[i]).innerHTML = b.guns[b.inventory[i]].name + " - " + b.guns[b.inventory[i]].ammo; + document.getElementById(b.inventory[i]).innerHTML = `${b.guns[b.inventory[i]].name} - ${b.guns[b.inventory[i]].ammo}` } }, makeGunHUD() { @@ -402,8 +419,8 @@ const simulation = { for (let i = 0, len = b.inventory.length; i < len; ++i) { const node = document.createElement("div"); node.setAttribute("id", b.inventory[i]); - let textnode = document.createTextNode(b.guns[b.inventory[i]].name + " - " + b.guns[b.inventory[i]].ammo); - node.appendChild(textnode); + const textNode = document.createTextNode(`${b.guns[b.inventory[i]].name} - ${b.guns[b.inventory[i]].ammo}`); //b.guns[b.inventory[i]].name + " - " + b.guns[b.inventory[i]].ammo); + node.appendChild(textNode); document.getElementById("guns").appendChild(node); } simulation.boldActiveGunHUD(); @@ -439,7 +456,7 @@ const simulation = { simulation.lastLogTime = m.cycle + time; } else { document.getElementById("text-log").innerHTML = text; - document.getElementById("text-log").style.opacity = 1; + document.getElementById("text-log").style.display = "inline"; simulation.lastLogTime = m.cycle + time; } } @@ -448,7 +465,7 @@ const simulation = { if (simulation.lastLogTime && simulation.lastLogTime < m.cycle) { simulation.lastLogTime = 0; // document.getElementById("text-log").innerHTML = " "; - document.getElementById("text-log").style.opacity = 0; + document.getElementById("text-log").style.display = "none"; } }, nextGun() { @@ -790,7 +807,7 @@ const simulation = { simulation.difficultyMode = Number(document.getElementById("difficulty-select").value) simulation.clearNow = true; - document.getElementById("text-log").style.opacity = 0; + document.getElementById("text-log").style.display = "none" document.getElementById("fade-out").style.opacity = 0; document.title = "n-gon"; // simulation.makeTextLog(`input.key.up: ["${input.key.up}", "ArrowUp"]`); diff --git a/js/spawn.js b/js/spawn.js index 56a0b71..0628c51 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -976,7 +976,7 @@ const spawn = { // m.displayHealth(); document.getElementById("health").style.display = "none" document.getElementById("health-bg").style.display = "none" - document.getElementById("text-log").style.opacity = 0; //fade out any active text logs + document.getElementById("text-log").style.display = "none" document.getElementById("fade-out").style.opacity = 1; //slowly fades out // build.shareURL(false) setTimeout(function() { @@ -2688,13 +2688,13 @@ const spawn = { mobs.spawn(x, y, 6, radius, "transparent"); let me = mob[mob.length - 1]; me.stroke = "transparent"; //used for drawSneaker - me.eventHorizon = radius * 27; //required for blackhole + me.eventHorizon = radius * 30; //required for blackhole me.seeAtDistance2 = (me.eventHorizon + 400) * (me.eventHorizon + 400); //vision limit is event horizon me.accelMag = 0.00012 * simulation.accelScale; me.frictionAir = 0.025; me.collisionFilter.mask = cat.player | cat.bullet //| cat.body me.memory = Infinity; - Matter.Body.setDensity(me, 0.01); //extra dense //normal is 0.001 //makes effective life much larger + Matter.Body.setDensity(me, 0.015); //extra dense //normal is 0.001 //makes effective life much larger me.do = function() { //keep it slow, to stop issues from explosion knock backs if (this.speed > 5) { @@ -2825,7 +2825,7 @@ const spawn = { me.collisionFilter.mask = cat.player | cat.bullet //| cat.body // me.frictionAir = 0.005; me.memory = 1600; - Matter.Body.setDensity(me, 0.04); //extra dense //normal is 0.001 //makes effective life much larger + Matter.Body.setDensity(me, 0.06); //extra dense //normal is 0.001 //makes effective life much larger me.onDeath = function() { //applying forces to player doesn't seem to work inside this method, not sure why powerUps.spawnBossPowerUp(this.position.x, this.position.y) diff --git a/js/tech.js b/js/tech.js index d7cc875..942aeb1 100644 --- a/js/tech.js +++ b/js/tech.js @@ -299,6 +299,234 @@ const tech = { } }, tech: [{ + name: "tungsten carbide", + description: "+200 maximum health
lose health after hard landings", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + isSkin: true, + allowed() { + return !m.isAltSkin + }, + requires: "not skin", + effect() { + tech.hardLanding = 40 + tech.isFallingDamage = true; + m.setMaxHealth(); + m.addHealth(1 / simulation.healScale) + m.skin.tungsten() + }, + remove() { + tech.hardLanding = 130 + tech.isFallingDamage = false; + m.setMaxHealth(); + m.resetSkin(); + } + }, + { + name: "elasticity", + description: "+33% movement and jumping
+15% defense", + maxCount: 3, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !m.isAltSkin + }, + requires: "not skinned", + effect() { + m.skin.mech(); + tech.hardLanding = 80 + tech.squirrelFx += 0.4; + tech.squirrelJump += 0.16; + m.setMovement() + }, + remove() { + tech.hardLanding = 130 + tech.squirrelFx = 1; + tech.squirrelJump = 1; + m.setMovement() + m.resetSkin(); + } + }, + { + name: "aperture", + description: "your damage cycles every 6 seconds
between -75% and +125% damage", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + isSkin: true, + allowed() { + return !m.isAltSkin + }, + requires: "not skinned", + effect() { + tech.isDilate = true + m.skin.dilate() + }, + remove() { + tech.isDilate = false + m.resetSkin(); + } + }, + { + name: "diaphragm", + description: "your defense cycles every 6 seconds
between +100% and -33% defense", + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + isSkin: true, + allowed() { + return tech.isDilate + }, + requires: "aperture", + effect() { + tech.isDiaphragm = true + m.resetSkin(); + m.skin.dilate2() + }, + remove() { + tech.isDiaphragm = false + m.resetSkin(); + } + }, + { + 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.12)", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + isSkin: true, + allowed() { + return !m.isAltSkin && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isAnnihilation //&& !tech.isAmmoFromHealth && !tech.isRewindGun + }, + requires: "not piezoelectricity, CPT, annihilation", + effect() { + m.health = 0 + document.getElementById("health").style.display = "none" + document.getElementById("health-bg").style.display = "none" + document.getElementById("dmg").style.backgroundColor = "#0cf"; + tech.isEnergyHealth = true; + simulation.mobDmgColor = "rgba(0, 255, 255,0.6)" //"#0cf" + m.displayHealth(); + m.skin.energy(); + }, + remove() { + if (tech.isEnergyHealth) { + tech.isEnergyHealth = false; + document.getElementById("health").style.display = "inline" + document.getElementById("health-bg").style.display = "inline" + document.getElementById("dmg").style.backgroundColor = "#f67"; + m.health = Math.max(Math.min(m.maxHealth, m.energy), 0.1); + simulation.mobDmgColor = "rgba(255,0,0,0.7)" + m.displayHealth(); + } + tech.isEnergyHealth = false; + m.resetSkin(); + } + }, + { + name: "1st ionization energy", + link: `
1st ionization energy`, + // description: `after you collect ${powerUps.orb.heal()}
+${0.1 * tech.largerHeals} maximum energy`, + // descriptionFunction: `convert current and future ${powerUps.orb.heal()} into

give +${10 * tech.largerHeals} maximum energy`, + descriptionFunction() { + return `convert current and future
into

give +${8 * tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)} maximum energy` + }, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isEnergyHealth + }, + requires: "mass-energy equivalence", + effect() { + powerUps.healGiveMaxEnergy = true; //tech.healMaxEnergyBonus given from heal power up + powerUps.heal.color = "#ff0" //"#0ae" + for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live + if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color + } + }, + remove() { + powerUps.healGiveMaxEnergy = false; + // tech.healMaxEnergyBonus = 0 + powerUps.heal.color = "#0eb" + for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live + if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color + } + } + }, + { + name: "CPT symmetry", + // description: "charge, parity, and time invert to undo defense
rewind (1.5—5) seconds for (66—220) energy", + // description: "after losing health, if you have full energy
rewind time for 44 energy per second", + descriptionFunction() { + return `after losing health, if you have ${(100*Math.min(100,m.maxEnergy)).toFixed(0)} energy
rewind time for 40 energy per second` + }, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + isSkin: true, + allowed() { + return !m.isAltSkin && m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isRewindField && !tech.isEnergyHealth + }, + requires: "not skinned, standing wave, max energy reduction, retrocausality, mass-energy", + effect() { + tech.isRewindAvoidDeath = true; + m.skin.CPT() + }, + remove() { + tech.isRewindAvoidDeath = false; + m.resetSkin(); + } + }, + { + name: "causality bots", + link: `causality bots`, + description: "when you rewind build scrap bots
that protect you for about 9 seconds", + maxCount: 3, + count: 0, + frequency: 2, + frequencyDefault: 2, + isBotTech: true, + allowed() { + return tech.isRewindAvoidDeath || tech.isRewindField + }, + requires: "CPT, retrocausality", + effect() { + tech.isRewindBot++; + }, + remove() { + tech.isRewindBot = 0; + } + }, + { + name: "causality bombs", + link: `causality bombs`, + description: "when you rewind drop several grenades
become invulnerable until they explode", + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isRewindAvoidDeath || tech.isRewindField + }, + requires: "CPT, retrocausality", + effect() { + tech.isRewindGrenade = true; + }, + remove() { + tech.isRewindGrenade = false; + } + }, + { name: "ordnance", description: "double the frequency of finding guntech
spawn a gun and +7% JUNK to tech pool", maxCount: 1, @@ -726,28 +954,7 @@ const tech = { } } }, - { - name: "squirrel-cage rotor", - description: "+30% movement and jumping
–5% defense", - maxCount: 9, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return this.count > 0 - }, - requires: "", - effect() { - tech.squirrelFx += 0.25; - tech.squirrelJump += 0.1; - m.setMovement() - }, - remove() { - tech.squirrelFx = 1; - tech.squirrelJump = 1; - m.setMovement() - } - }, + // { // name: "coyote", // description: "", @@ -1913,9 +2120,9 @@ const tech = { } } } - if (!m.isShipMode) { - m.skin.flipFlop() - } + // if (!m.isShipMode) { + // m.skin.flipFlop() + // } }, remove() { tech.isFlipFlop = false @@ -1929,7 +2136,7 @@ const tech = { } } m.eyeFillColor = 'transparent' - m.resetSkin(); + // m.resetSkin(); } }, { @@ -2067,9 +2274,9 @@ const tech = { } } } - if (!m.isShipMode) { - m.skin.flipFlop() - } + // if (!m.isShipMode) { + // m.skin.flipFlop() + // } }, remove() { tech.isRelay = false @@ -2083,7 +2290,7 @@ const tech = { } } m.eyeFillColor = 'transparent' - m.resetSkin(); + // m.resetSkin(); } }, { @@ -2294,70 +2501,7 @@ const tech = { tech.isSlowFPS = false; } }, - { - name: "CPT symmetry", - // description: "charge, parity, and time invert to undo defense
rewind (1.5—5) seconds for (66—220) energy", - // description: "after losing health, if you have full energy
rewind time for 44 energy per second", - descriptionFunction() { - return `after losing health, if you have ${(100*Math.min(100,m.maxEnergy)).toFixed(0)} energy
rewind time for 40 energy per second` - }, - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - isSkin: true, - allowed() { - return !m.isAltSkin && m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isRewindField && !tech.isEnergyHealth - }, - requires: "not skinned, standing wave, max energy reduction, retrocausality, mass-energy", - effect() { - tech.isRewindAvoidDeath = true; - m.skin.CPT() - }, - remove() { - tech.isRewindAvoidDeath = false; - m.resetSkin(); - } - }, - { - name: "causality bots", - link: `causality bots`, - description: "when you rewind build scrap bots
that protect you for about 9 seconds", - maxCount: 3, - count: 0, - frequency: 2, - frequencyDefault: 2, - isBotTech: true, - allowed() { - return tech.isRewindAvoidDeath || tech.isRewindField - }, - requires: "CPT, retrocausality", - effect() { - tech.isRewindBot++; - }, - remove() { - tech.isRewindBot = 0; - } - }, - { - name: "causality bombs", - link: `causality bombs`, - description: "when you rewind drop several grenades
become invulnerable until they explode", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return tech.isRewindAvoidDeath || tech.isRewindField - }, - requires: "CPT, retrocausality", - effect() { - tech.isRewindGrenade = true; - }, - remove() { - tech.isRewindGrenade = false; - } - }, + { name: "piezoelectricity", description: "if you collide with a mob
generate +2048 energy", //
reduce defense by 15% @@ -2377,75 +2521,6 @@ const tech = { tech.isPiezo = false; } }, - { - 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.12)", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - isSkin: true, - allowed() { - return !m.isAltSkin && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isAnnihilation //&& !tech.isAmmoFromHealth && !tech.isRewindGun - }, - requires: "not piezoelectricity, CPT, annihilation", - effect() { - m.health = 0 - document.getElementById("health").style.display = "none" - document.getElementById("health-bg").style.display = "none" - document.getElementById("dmg").style.backgroundColor = "#0cf"; - tech.isEnergyHealth = true; - simulation.mobDmgColor = "rgba(0, 255, 255,0.6)" //"#0cf" - m.displayHealth(); - m.skin.energy(); - }, - remove() { - if (tech.isEnergyHealth) { - tech.isEnergyHealth = false; - document.getElementById("health").style.display = "inline" - document.getElementById("health-bg").style.display = "inline" - document.getElementById("dmg").style.backgroundColor = "#f67"; - m.health = Math.max(Math.min(m.maxHealth, m.energy), 0.1); - simulation.mobDmgColor = "rgba(255,0,0,0.7)" - m.displayHealth(); - } - tech.isEnergyHealth = false; - m.resetSkin(); - } - }, - { - name: "1st ionization energy", - link: `1st ionization energy`, - // description: `after you collect ${powerUps.orb.heal()}
+${0.1 * tech.largerHeals} maximum energy`, - // descriptionFunction: `convert current and future ${powerUps.orb.heal()} into

give +${10 * tech.largerHeals} maximum energy`, - descriptionFunction() { - return `convert current and future
into

give +${8 * tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)} maximum energy` - }, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return tech.isEnergyHealth - }, - requires: "mass-energy equivalence", - effect() { - powerUps.healGiveMaxEnergy = true; //tech.healMaxEnergyBonus given from heal power up - powerUps.heal.color = "#ff0" //"#0ae" - for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live - if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color - } - }, - remove() { - powerUps.healGiveMaxEnergy = false; - // tech.healMaxEnergyBonus = 0 - powerUps.heal.color = "#0eb" - for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live - if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color - } - } - }, { name: "electronegativity", descriptionFunction() { @@ -2860,30 +2935,7 @@ const tech = { tech.isAcidDmg = false; } }, - { - name: "tungsten carbide", - description: "+150 maximum health
lose health after hard landings", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - isSkin: true, - allowed() { - return !m.isAltSkin - }, - requires: "not skin", - effect() { - tech.isFallingDamage = true; - m.setMaxHealth(); - m.addHealth(1 / simulation.healScale) - m.skin.tungsten() - }, - remove() { - tech.isFallingDamage = false; - m.setMaxHealth(); - m.resetSkin(); - } - }, + { name: "adiabatic healing", descriptionFunction() { @@ -3510,27 +3562,6 @@ const tech = { } } }, - { - name: "aperture", - description: "your damage cycles every 6 seconds
between -75% and +125% damage", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - isSkin: true, - allowed() { - return !m.isAltSkin - }, - requires: "not skinned", - effect() { - tech.isDilate = true - m.skin.dilate() - }, - remove() { - tech.isDilate = false - m.resetSkin(); - } - }, { name: "exciton", descriptionFunction() { @@ -4781,7 +4812,7 @@ const tech = { }, { name: "Zectron", - description: `+80% super ball density and damage, but
after colliding with super balls lose health`, + description: `+100% super ball density and damage, but
after colliding with super balls lose health`, isGunTech: true, maxCount: 9, count: 0, @@ -11292,4 +11323,6 @@ const tech = { sentryAmmo: null, collidePowerUps: null, isDilate: null, + isDiaphragm: null, + hardLanding: null, } \ No newline at end of file diff --git a/style.css b/style.css index 7a6e97b..753d009 100644 --- a/style.css +++ b/style.css @@ -239,6 +239,11 @@ summary { -ms-overflow-style: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ } +.pause-console { + padding: 10px; + margin: 5px; + border-radius: 10px; +} #pause-grid-left::-webkit-scrollbar { display: none; @@ -623,12 +628,18 @@ summary { font-size: 1.15em; color: #555; background-color: rgba(255, 255, 255, 0.5); - transition: opacity 0.25s; + /* transition: opacity 0.15s; */ pointer-events: none; user-select: none; } /* color for in game console output */ +/* .ammo-flash { + color: #f33; + transition: color 2s; +} */ + + .color-text { color: #000; } diff --git a/todo.txt b/todo.txt index 38752c3..98145e5 100644 --- a/todo.txt +++ b/todo.txt @@ -1,26 +1,41 @@ ******************************************************** NEXT PATCH ************************************************** -some tech come with a skin - but only 1 at a time - tech aperture - skin, damage cycles between -25% and +125% - tungsten carbide - skin, +100->150 max health - mass-energy equivalence - skin, gets a bit more benefit from defense - CPT symmetry - skin, costs a bit less energy - flip-flop, and relay switch and a few JUNK tech are also skins +tech: elasticity - skin, does "crouch landings" a tiny bit more + jump and move faster, +15% defense + (replaces squirrel cage rotor) + +tech: diaphragm - skin, defense cycles between -33% and +100% + requires aperture + +tungsten carbide 150->200 maximum health + but now does "crouch landings" a more +Zectron damage 80->100% and it does a bit less harm to player +flip-flop, relay switch are no longer skins + +pause brings up the most recent in game console message + in game console no longer fades out it just instantly goes on and off -some new images bug fixes + *********************************************************** TODO ***************************************************** +Tech: Von Neuman probes - Drones will consume blocks to replicate themselves + it's a little too similar to the drone repair tech, but I kinda like it better. drones that eat blocks and spit out more drones is cool + +when gaining ammo have the ammo test quickly count up by Math.floor(1/20x) of the total ammo given + maybe bold, flash the text for a second after + +tech: parry - immune to harm for 0.25-0.5 seconds after pressing field button + needs a 5 second CD? + tech: if a needle hits 2 mobs reset your fire CD - and maybe to 2x damage for each consecutive mob hit? + maybe to 2x damage for each consecutive mob hit? + maybe after a needle hits a mob the needle splits into 3 needles tech for lens - you can only fire through the lens and some buff? damage or energy? this was in todo.txt on GitHub. I think it should be 'laser never drains energy, but you can only fire through lens and +90° lens arc, +100% damage (also you can not gain compound lens with this upgrade) -Tech: Von Neuman probes - Drones will consume blocks to replicate themselves - it's a little too similar to the drone repair tech, but I kinda like it better. drones that eat blocks and spit out more drones is cool - new boss level like reactor with a very very big boss mechanics around a very big boss? maybe the boss moves into rooms so you have to do platforming to clear the room before the boss enters the room