From 77e484c3d2a9c0fb70b164468771829146272fad Mon Sep 17 00:00:00 2001 From: landgreen Date: Sun, 26 Jan 2025 09:09:15 -0800 Subject: [PATCH] another combo tech: collimator - add 1 laser beam and align your diverging beams to be parallel requires diffraction grating added secret pilot wave combo to make blocks rewrote combo test algorithm to be more forgiving with pattern matching also extended combos test to arrow keys, not just WASD cache 17->15x ammo metamaterial cloaking 0.3->0.4x damage reduction while cloaked boson composite drains more energy when passing through mobs scales with difficulty subway level has 6->4 (5 on hard difficulty) stations subway gives 1/3->1/5 interest per station bug fixes Higgs skin removal fixed diaphragm skin removal fixed --- img/collimator.webp | Bin 0 -> 53102 bytes js/bullet.js | 26 +++++++++++ js/index.js | 1 + js/level.js | 18 +++++--- js/lore.js | 2 +- js/player.js | 106 ++++++++++++++++++++++++++++++-------------- js/tech.js | 61 ++++++++++++++++++------- style.css | 1 + todo.txt | 37 ++++++++++------ 9 files changed, 183 insertions(+), 69 deletions(-) create mode 100644 img/collimator.webp diff --git a/img/collimator.webp b/img/collimator.webp new file mode 100644 index 0000000000000000000000000000000000000000..033cda496237a4e8b2e32ff724e49fd8108b0f96 GIT binary patch literal 53102 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 j_p{hV4p^K)#l 0 || !(m.cycle % 3)) ctx.globalAlpha = 0.35 + + const whereSweep = m.angle + (m.crouch ? 0.4 : 1) * (Math.sin(m.cycle * freq + phase * (i))) + const where = { x: m.pos.x + 30 * Math.cos(whereSweep), y: m.pos.y + 30 * Math.sin(whereSweep) } + b.laser(where, { + x: where.x + 5000 * Math.cos(m.angle), + y: where.y + 5000 * Math.sin(m.angle) + }, tech.laserDamage / b.fireCDscale * this.lensDamage); + ctx.globalAlpha = 1 + } + } + }, fireWideBeam() { const drain = tech.laserDrain / b.fireCDscale if (m.energy < drain) { diff --git a/js/index.js b/js/index.js index 768bd67..4bd63fc 100644 --- a/js/index.js +++ b/js/index.js @@ -1176,6 +1176,7 @@ function openExperimentMenu() { document.body.style.overflowX = "hidden"; document.getElementById("info").style.display = 'none' build.reset(); + } //record settings so they can be reproduced in the experimental menu diff --git a/js/level.js b/js/level.js index 7c70f51..37ac320 100644 --- a/js/level.js +++ b/js/level.js @@ -33,7 +33,7 @@ const level = { // tech.tech[297].frequency = 100 // tech.addJunkTechToPool(0.5) // m.couplingChange(10) - // m.setField("wormhole") //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 10 grappling hook + // m.setField("pilot wave") //1 standing wave 2 perfect diamagnetism 3 negative mass 4 molecular assembler 5 plasma torch 6 time dilation 7 metamaterial cloaking 8 pilot wave 9 wormhole 10 grappling hook // m.energy = 0 // powerUps.research.count = 3 // tech.isHookWire = true @@ -50,8 +50,8 @@ const level = { // requestAnimationFrame(() => { tech.giveTech("non-renewables") }); // tech.giveTech("dark matter") // tech.addJunkTechToPool(0.5) - // for (let i = 0; i < 1; ++i) tech.giveTech("demineralization") - // for (let i = 0; i < 1; ++i) tech.giveTech("remineralization") + // for (let i = 0; i < 1; ++i) tech.giveTech("paradigm shift") + // for (let i = 0; i < 1; ++i) tech.giveTech("Higgs mechanism") // m.skin.egg(); // for (let i = 0; i < 1; ++i) tech.giveTech("many-worlds") // requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("quasiparticles") }); @@ -67,7 +67,7 @@ const level = { // for (let i = 0; i < 10; ++i) spawn.starter(1900, -500) - // for (let i = 0; i < 1; i++) spawn.mantisBoss(1900, -500) + // for (let i = 0; i < 1; i++) spawn.softBoss(1900, -500) // for (let i = 0; i < 1; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "entanglement"); // for (let i = 0; i < 2; ++i) powerUps.directSpawn(m.pos.x + 450, m.pos.y + 50 * Math.random(), "gun"); // for (let i = 0; i < 100; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "ammo"); @@ -175,7 +175,8 @@ const level = { let rate = tech.interestRate if (level.onLevel < level.levels.length - 1) {//make sure it's not on the lore level which has an undefined name const levelName = level.levels[level.onLevel] - if (levelName === "final" || levelName === "subway") rate *= 1 / 3 + if (levelName === "final") rate *= 1 / 3 + if (levelName === "subway") rate *= 1 / 5 } let ammoSum = 0 @@ -2754,6 +2755,11 @@ const level = { Composite.add(engine.world, cons[cons.length - 1]); } }, + // softBody(x, y, angle = 0, isAttached = true, len = 15, radius = 20, stiffness = 1, damping = 1) { + // https://github.com/liabru/matter-js/blob/master/examples/softBody.js + // https://brm.io/matter-js/docs/classes/Composites.html + // https://codepen.io/Shokeen/pen/EmOLJO?editors=0010 + // }, //****************************************************************************************************************** //****************************************************************************************************************** //****************************************************************************************************************** @@ -3534,7 +3540,7 @@ const level = { const stationList = [] //use to randomize station order for (let i = 1, totalNumberOfStations = 10; i < totalNumberOfStations; ++i) stationList.push(i) //!!!! update station number when you add a new station stationList.sort(() => Math.random() - 0.5); - stationList.splice(0, 3); //remove some stations to keep it to 4 stations + stationList.splice(0, simulation.difficultyMode > 4 ? 4 : 5); //remove some stations to keep it to 4 stations stationList.unshift(0) //add index zero to the front of the array let isExitOpen = false diff --git a/js/lore.js b/js/lore.js index 9278246..8c8b7c5 100644 --- a/js/lore.js +++ b/js/lore.js @@ -1088,7 +1088,7 @@ const lore = { () => { setTimeout(() => { - lore.anand.text("How ever it thinks it can learn, and I think we showed it that nonviolence is an option,") + lore.anand.text("How ever it thinks, it can learn, and I think we showed it that violence isn't the only option,") }, 1000); }, () => { diff --git a/js/player.js b/js/player.js index 1484d82..d069673 100644 --- a/js/player.js +++ b/js/player.js @@ -3647,6 +3647,7 @@ const m = { m.fieldUpgrades[index].effect(); simulation.inGameConsole(`
  m.setField("${m.fieldUpgrades[m.fieldMode].name}")
input.key.field: ["MouseRight"]`); if (m.fieldMode === 4) simulation.inGameConsole(`simulation.molecularMode = ${m.fieldUpgrades[4].modeText()}     ↓↘→↓↙←↑↑↓`); + if (m.fieldMode === 8) simulation.inGameConsole(`Composite.add(engine.world, block)     //↓↓→↘↓↙←↓↓`); }, fieldEvent: null, fieldUpgrades: [ @@ -4209,43 +4210,23 @@ const m = { setDescription() { return `use energy to deflect mobs
excess energy used to print ${simulation.molecularMode === 0 ? "spores" : simulation.molecularMode === 1 ? "missiles" : simulation.molecularMode === 2 ? "ice IX" : "drones"}
12 energy per second ↓↘→↓↙←↑↑↓` }, - keyLog: [], + keyLog: [null, null, null, null, null, null, null], effect: () => { //store event function so it can be found and removed in m.setField() m.fieldEvent = function (event) { - m.fieldUpgrades[4].keyLog.push(event.code) - - - // Helper function to compare arrays - function arraysEqual(arr1, arr2) { - if (arr1.length !== arr2.length) return false; - for (let i = 0; i < arr1.length; i++) { - if (arr1[i] !== arr2[i]) return false; - } - return true; - } - - const pattern = [input.key.down, input.key.right, input.key.down, input.key.left, input.key.up, input.key.up, input.key.down] - //check if the newest key press is correct - if (event.code !== pattern[m.fieldUpgrades[4].keyLog.length - 1]) { - m.fieldUpgrades[4].keyLog = [] //pattern is wrong, reset log - } else if (arraysEqual(m.fieldUpgrades[4].keyLog, pattern)) { //pattern is complete + m.fieldUpgrades[4].keyLog.shift() //remove first element + m.fieldUpgrades[4].keyLog.push(event.code) //add new key to end + const patternA = ["ArrowDown", "ArrowRight", "ArrowDown", "ArrowLeft", "ArrowUp", "ArrowUp", "ArrowDown"] + const patternB = [input.key.down, input.key.right, input.key.down, input.key.left, input.key.up, input.key.up, input.key.down] + const arraysEqual = (a, b) => a.length === b.length && a.every((val, i) => val === b[i]); + if (arraysEqual(m.fieldUpgrades[4].keyLog, patternA) || arraysEqual(m.fieldUpgrades[4].keyLog, patternB)) { //cycle to next molecular mode - m.fieldUpgrades[4].keyLog = [] - const energy = m.energy //save current energy - if (simulation.molecularMode < 3) { - simulation.molecularMode++ - } else { - simulation.molecularMode = 0 - } - // m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field, skip field emitter + simulation.molecularMode = simulation.molecularMode < 3 ? simulation.molecularMode + 1 : 0 m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription() - m.energy = energy //return to current energy - const name = `${simulation.molecularMode === 0 ? "spores" : simulation.molecularMode === 1 ? "missiles" : simulation.molecularMode === 2 ? "ice IX" : "drones"}` simulation.inGameConsole(`simulation.molecularMode = ${simulation.molecularMode} // ${name}   ↓↘→↓↙←↑↑↓`); } - // console.log(m.fieldUpgrades[4].keyLog) + // console.log(event.code, m.fieldUpgrades[4].keyLog) } window.addEventListener("keydown", m.fieldEvent); @@ -5019,7 +5000,7 @@ const m = { }, { name: "metamaterial cloaking", - description: `0.3x damage taken while cloaked
after decloaking 4.5x damage for 2 s
6 energy per second`, + description: `0.4x damage taken while cloaked
after decloaking 4.5x damage for 2 s
6 energy per second`, effect: () => { m.fieldFire = true; m.fieldMeterColor = "#333"; @@ -5070,7 +5051,7 @@ const m = { if (!m.isCloak) { //&& m.energy > drain + 0.03 // m.energy -= drain m.isCloak = true //enter cloak - m.fieldHarmReduction = 0.3; + m.fieldHarmReduction = 0.4; m.enterCloakCycle = m.cycle if (tech.isCloakHealLastHit && m.lastHit > 0) { const heal = Math.min(0.75 * m.lastHit, m.energy) @@ -5151,8 +5132,8 @@ const m = { if (inPlayer.length > 0) { for (let i = 0; i < inPlayer.length; i++) { if (m.energy > 0) { - if (!inPlayer[i].isUnblockable) m.energy -= 0.003; - if (inPlayer[i].shield) m.energy -= 0.011; + if (!inPlayer[i].isUnblockable) m.energy -= 0.004 + 0.0005 * simulation.difficultyMode; + if (inPlayer[i].shield) m.energy -= 0.015 + 0.001 * simulation.difficultyMode; } } } @@ -5180,8 +5161,65 @@ const m = { }, { name: "pilot wave", - description: `use energy to guide blocks
,
, and
have +3 choices
10 energy per second`, + description: `use energy to guide blocks↓↓→↘↓↙←↓↓
,
, and
have +3 choices
10 energy per second`, + keyLog: [null, null, null, null, null, null, null], effect: () => { + //store event function so it can be found and removed in m.setField() + m.fieldEvent = function (event) { + m.fieldUpgrades[4].keyLog.shift() //remove first element + m.fieldUpgrades[4].keyLog.push(event.code) //add new key to end + const patternA = ["ArrowDown", "ArrowDown", "ArrowRight", "ArrowDown", "ArrowLeft", "ArrowDown", "ArrowDown"] + const patternB = [input.key.down, input.key.down, input.key.right, input.key.down, input.key.left, input.key.down, input.key.down] + const arraysEqual = (a, b) => a.length === b.length && a.every((val, i) => val === b[i]); + const where = { + x: m.pos.x, + y: m.pos.y - 75 + } + if ( + (arraysEqual(m.fieldUpgrades[4].keyLog, patternA) || arraysEqual(m.fieldUpgrades[4].keyLog, patternB)) + && !Matter.Query.point(map, where).length + ) { + //remove old blocks + // for (let i = 0; i < body.length; i++) { + // if (body[i].isPilotWave) { + // Matter.Composite.remove(engine.world, body[i]); + // body.splice(i, 1); + // break + // } + // } + + //spawn a block + const radius = 25 + Math.floor(15 * Math.random()) + // body[body.length] = Matter.Bodies.polygon(simulation.mouseInGame.x, simulation.mouseInGame.y, 4, radius, { + body[body.length] = Matter.Bodies.polygon(where.x, where.y, 4 + Math.floor(4 * Math.random()), radius, { + friction: 0.05, + frictionAir: 0.001, + collisionFilter: { + category: cat.body, + mask: cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet + }, + classType: "body", + isPilotWave: true, + }); + const block = body[body.length - 1] + //mess with the block shape (this code is horrible) + Composite.add(engine.world, block); //add to world + const r1 = radius * (0.85 + 0.6 * Math.random()) + const r2 = radius * (0.85 + 0.6 * Math.random()) + let angle = Math.PI / 4 + const vertices = [] + for (let i = 0, len = block.vertices.length; i < len; i++) { + angle += 2 * Math.PI / len + 0.06 * Math.random() + vertices.push({ x: block.position.x + r1 * Math.cos(angle), y: block.position.y + r2 * Math.sin(angle) }) + } + Matter.Body.setVertices(block, vertices) + /* ↓↘→↓↙←↑↑↓ */ + simulation.inGameConsole(`Composite.add(engine.world, block)     //↓↓→↘↓↙←↓↓`); + } + } + window.addEventListener("keydown", m.fieldEvent); + + m.fieldMeterColor = "#333" m.eyeFillColor = m.fieldMeterColor diff --git a/js/tech.js b/js/tech.js index 59d5ea4..3807f51 100644 --- a/js/tech.js +++ b/js/tech.js @@ -406,12 +406,13 @@ const tech = { m.skin.strokeGap(); }, remove() { - tech.isFireMoveLock = false if (tech.isFireMoveLock) { + tech.isFireMoveLock = false b.setFireCD(); b.setFireMethod(); - if (this.count) m.resetSkin(); + m.resetSkin(); } + tech.isFireMoveLock = false } }, { @@ -480,7 +481,10 @@ const tech = { }, remove() { tech.isDilate = false - if (this.count) m.resetSkin(); + if (this.count) { + m.resetSkin(); + if (tech.isDiaphragm) m.skin.dilate2() + } } }, { @@ -490,7 +494,7 @@ const tech = { count: 0, frequency: 2, frequencyDefault: 2, - isSkin: true, + // isSkin: true, allowed() { return tech.isDilate }, @@ -502,7 +506,10 @@ const tech = { }, remove() { tech.isDiaphragm = false - if (this.count) m.resetSkin(); + if (this.count) { + m.resetSkin(); + if (tech.isDilate) m.skin.dilate() + } } }, { @@ -1063,7 +1070,7 @@ const tech = { { name: "cache", link: `cache`, - description: `17x ammo per ${powerUps.orb.ammo()}, but
you can't store additional ammo`, + description: `15x ammo per ${powerUps.orb.ammo()}, but
you can't store additional ammo`, maxCount: 1, count: 0, frequency: 1, @@ -1073,7 +1080,7 @@ const tech = { }, requires: "not non-renewables", effect() { - tech.ammoCap = 17; + tech.ammoCap = 15; powerUps.ammo.effect() }, remove() { @@ -7372,7 +7379,7 @@ const tech = { requestAnimationFrame(() => { let techGiven = 0 for (let j = 0; j < 3; j++) { - const names = ["quasiparticles", "lens", "compound lens", "arc length", "infrared diode", "free-electron laser", "dye laser", "relativistic momentum", "specular reflection", "diffraction grating", "diffuse beam", "output coupler", "slow light", "laser-bot", "laser-bot upgrade"] + const names = ["quasiparticles", "lens", "compound lens", "arc length", "infrared diode", "free-electron laser", "dye laser", "relativistic momentum", "specular reflection", "diffraction grating", "diffuse beam", "output coupler", "slow light", "laser-bot", "laser-bot upgrade", "collimator"] //convert names into indexes const options = [] for (let i = 0; i < names.length; i++) { @@ -7514,7 +7521,7 @@ const tech = { allowed() { return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.isLaserBotUpgrade || tech.isLaserField) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser }, - requires: "laser, not diffuse beam, pulse, or slow light", + requires: "laser, not diffuse beam, pulse, slow light", effect() { tech.laserReflections += 2; }, @@ -7533,7 +7540,7 @@ const tech = { allowed() { return tech.haveGunCheck("laser") && !tech.isWideLaser && !tech.historyLaser }, - requires: "laser gun, diffuse beam, or slow light", + requires: "laser gun, not diffuse beam, slow light", effect() { tech.beamSplitter++ b.guns[11].chooseFireMethod() @@ -7545,6 +7552,29 @@ const tech = { } } }, + { + name: "collimator", + description: `+1 laser beam
align your diverging laser beams to be parallel`, + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return tech.haveGunCheck("laser") && !tech.isWideLaser && !tech.historyLaser && tech.beamSplitter > 0 && !tech.isPulseLaser + }, + requires: "laser gun, diffraction, not diffuse beam, slow light, pulse", + effect() { + tech.beamSplitter++ + tech.beamCollimator = true + b.guns[11].chooseFireMethod() + }, + remove() { + tech.beamCollimator = false + if (tech.beamSplitter > 0) tech.beamSplitter-- + b.guns[11].chooseFireMethod() + } + }, { name: "diffuse beam", link: `diffuse beam`, @@ -7607,7 +7637,7 @@ const tech = { allowed() { return tech.haveGunCheck("laser") && !tech.beamSplitter && !tech.isWideLaser }, - requires: "laser gun, diffraction grating, diffuse beam", + requires: "laser gun, not diffraction grating, diffuse beam", effect() { tech.historyLaser++ b.guns[11].chooseFireMethod() @@ -7657,8 +7687,8 @@ const tech = { effect() { tech.laserDrain *= 0.75 tech.laserDamage *= 1.25 - tech.laserColor = "rgb(0, 11, 255)" - tech.laserColorAlpha = "rgba(0, 11, 255,0.5)" + tech.laserColor = "rgb(0, 40, 255)" + tech.laserColorAlpha = "rgba(0, 40, 255,0.5)" }, remove() { tech.laserDrain = 0.003; @@ -7701,9 +7731,9 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser && tech.laserDrain === 0.003 && !tech.isStuckOn + return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser && tech.laserDrain === 0.003 && !tech.isStuckOn && !tech.beamCollimator }, - requires: "laser gun, not specular reflection, diffuse, free-electron laser, optical amplifier", + requires: "laser gun, not specular reflection, diffuse, free-electron laser, optical amplifier, collimator", effect() { tech.isPulseLaser = true; b.guns[11].chooseFireMethod() @@ -12319,4 +12349,5 @@ const tech = { isDemineralize: null, mineralDamage: null, negativeMassCost: null, + beamCollimator: null, } \ No newline at end of file diff --git a/style.css b/style.css index b72325c..ba7656e 100644 --- a/style.css +++ b/style.css @@ -9,6 +9,7 @@ body { margin: 0; overflow: hidden; cursor: auto; + background-color: #f00; /* filter: grayscale(1); */ /* transition: background-color 0.2s ease-in-out; */ } diff --git a/todo.txt b/todo.txt index 4dc0196..4c467bc 100644 --- a/todo.txt +++ b/todo.txt @@ -1,17 +1,22 @@ ******************************************************** NEXT PATCH ************************************************** -mantisBoss flashes for a second before it drops invulnerability -removed parasitism - it's too similar to invulnerability tech -invariant no longer drains energy while wormhole time is paused - added 1 research cost -added secret combo to change molecular assembler mode +tech: collimator - add 1 laser beam and align your diverging beams to be parallel + requires diffraction grating + +added secret pilot wave combo to make blocks +rewrote combo test algorithm to be more forgiving with pattern matching + also extended combos test to arrow keys, not just WASD + +cache 17->15x ammo +metamaterial cloaking 0.3->0.4x damage reduction while cloaked +boson composite drains more energy when passing through mobs + scales with difficulty +subway level has 6->4 (5 on hard difficulty) stations +subway gives 1/3->1/5 interest per station bug fixes - issue with constraint: "mob death heals mobs" - mob health was becoming NaN, this was infecting other values like player energy - entering a seed in settings wasn't giving the same results as a randomly generated seeds - also removed some random code that was using seeded shuffle, but didn't need to - converted it to non seeded random shuffle with .sort(() => Math.random() - 0.5); + Higgs skin removal fixed + diaphragm skin removal fixed ******************************************************** BUGS ******************************************************** @@ -19,9 +24,10 @@ player can become crouched while not touching the ground if they exit the ground *********************************************************** TODO ***************************************************** +soft body boss? + search softBody(x, y, angle = 0, isAttached = true, len = 15, radius = 20, stiffness = 1, damping = 1) { use ←↑→↓↖↗↘↙ combos to allow fields to have special actions - !!should this be wasd, arrows, or both? how to limit spam? on cooldown timer or once per level @@ -40,8 +46,7 @@ use ←↑→↓↖↗↘↙ combos to allow fields to have special actions plasma torch time dilation metamaterial cloaking - pilot wave - spawn blocks + pilot wave - done wormhole shoot out all the blocks that were sucked in this level (maybe cap at like 10?, cap with energy spent to fire) are block sizes stored properly? because they shrink before they get eaten... @@ -52,6 +57,12 @@ use ←↑→↓↖↗↘↙ combos to allow fields to have special actions fire from player (and draw a wormhole looking graphic) grappling hook +new level idea: large map sized blocks that can't be destroyed that the player walks on as a part of the level + eventually the blocks fall + after fall level progresses to a phase 2 to clean up the blocks or leave them + should bosses be killed by falling blocks?? + how to avoid the large block vibrating/dancing on tiny block issue + new level idea: escort mission player has to stay near something that moves slowly through the level maybe only a zone around the escort is safe