diff --git a/img/Bells theorem.webp b/img/Bells theorem.webp new file mode 100644 index 0000000..fe6d266 Binary files /dev/null and b/img/Bells theorem.webp differ diff --git a/img/principle of locality.webp b/img/principle of locality.webp new file mode 100644 index 0000000..83cfa82 Binary files /dev/null and b/img/principle of locality.webp differ diff --git a/js/bullet.js b/js/bullet.js index 2669cca..4dac62e 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -287,7 +287,7 @@ const b = { }, fireCDscale: 1, setFireCD() { - b.fireCDscale = tech.fireRate * tech.slowFire * tech.researchHaste * tech.aimDamage + b.fireCDscale = tech.fireRate * tech.slowFire * tech.researchHaste * tech.slowFireDamage if (m.fieldMode === 6) b.fireCDscale *= 0.8 if (tech.isFastTime) b.fireCDscale *= 0.666 if (tech.isFireRateForGuns) b.fireCDscale *= Math.pow(0.76923, Math.max(0, b.inventory.length - 1)) diff --git a/js/index.js b/js/index.js index f75d9f0..e0e4605 100644 --- a/js/index.js +++ b/js/index.js @@ -1,5 +1,14 @@ "use strict"; +//list of the recent github hashes, shortened to the first 7 digits of the full hash. +//the last element of the array is the most recent commit +// const commitHashes = ['6472d6d', 'c8bf77d', 'eb8f4b0', 'f556371', '74f569b', 'c9f355b', '6814c10', '9402cf2', 'f8b4b6f', '82c0ea8', 'f9849d4', 'd00a94a', '3654198', '9bcf4d3', 'eecf763', 'be109bb', 'e2bf9aa', '3ea8bfd', 'c614451', '1752453', '34e05c7', '07af7a7', '2e76b5c', '1b23dec', '0b728fb', 'e6e5058', '4f87444', 'e418b93', 'b3fa1bf', '09c9e93', 'd8e978f', 'da559f4', '1d4b0c4', '4415942', '6cd2502', '8a211e8', '3d423a5', '4933ef5', '77cafe3', 'bffaeed', '99bd1c8', '8a3ac11', 'bf5f866', 'b14f2c1', 'ff613dc', '1129b9d', '3844d00', 'e9d2262', 'ce74f42', 'ad33cf6', '2d12f1d', 'c47d860', '4e6acdd', '778a2c9', '68f9269', '17f65cf', 'b5e4b0d', '38d9931', '64f2a9f', '64c81cd', '254ec00', '38ef45a', '1728b53', 'fde3a58', '6c3d97a', '951806d', '2b99e59', '3ce6bec', '773ee5c', '4c6b480', 'a1164ed', '507b060', '63bfaba', 'eabd146', '438c166', '1903b9e', '5e12cea', 'f43a5e3', '022e2fa', '20f9b79', 'fc70dfe', '5eae070', '8dacb02', '52046ca', '220a6b4', 'ebd2274', 'cea1c64', 'a47ef97', 'a8c6c0e', '9c2c9be', '8bb8222', '1fde74d', 'f1a6713', '97c5509', '1966173', '2daeae1', '1040d1f', 'c9a5ab9', '77e484c', 'b2426cd'] +// const lastShortHash = 'b2426cd' +//Landgreen needs to update the commitHashes array with the most recent commit hash on each new upload, but the array will always be missing the current hash since it is generated with each new commit +//write code to check the 2nd most recent hash and see if it match an element in the commitHashes array. Use that to calculate how many commits have been made since the last update + + + //convert text into numbers for seed Math.hash = s => { for (var i = 0, h = 9; i < s.length;) h = Math.imul(h ^ s.charCodeAt(i++), 9 ** 9); @@ -1953,13 +1962,41 @@ document.getElementById("updates").addEventListener("toggle", function () { xhr.open("GET", path, true); xhr.send(); } + + // fetch(`https://api.github.com/repos/landgreen/n-gon/commits?per_page=100`) + // .then(response => { + // if (!response.ok) { + // throw new Error(`GitHub API responded with status ${response.status}`); + // } + // return response.json(); + // }) + // .then(commits => { + // // console.log(commits.sha) + // const array = [] + // commits.forEach(commitData => { + // const shortHash = commitData.sha.substr(0, 7); + // array.push(shortHash) + // }); + // console.log(array) + // }) + // .catch(error => { + // console.error('Error fetching commits:', error); + // }); + + + let text = `
n-gon: todo list and complete change-log
` document.getElementById("updates-div").innerHTML = text /// https://api.github.com/repos/landgreen/n-gon/stats/commit_activity loadJSON('https://api.github.com/repos/landgreen/n-gon/commits', function (data) { - // console.log(data[0].sha) //unique code for most recent commit + // console.log(data[0].sha, lastShortHash) + // if (data[0].sha.substr(0, 7) === lastShortHash) { + // text += "
https://github.com/landgreen/n-gon/: hash matches latest version
" + // } else { + // text += "
https://github.com/landgreen/n-gon/: hash does not match latest version
" + // } for (let i = 0, len = 20; i < len; i++) { text += "" + data[i].commit.author.date.substr(0, 10) + " - "; //+ "
" text += data[i].commit.message diff --git a/js/level.js b/js/level.js index 545b9ed..32622a4 100644 --- a/js/level.js +++ b/js/level.js @@ -35,15 +35,6 @@ const level = { // m.couplingChange(10) // 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 - // spawn.bodyRect(625, -100, 100, 75); - // spawn.bodyRect(750, -125, 250, 100); - // spawn.bodyRect(500, -150, 75, 100); - // spawn.bodyRect(1150, -125, 225, 75); - // spawn.bodyRect(1425, -250, 25, 150); - // spawn.bodyRect(1525, -100, 75, 25); - // spawn.bodyRect(1550, -200, 150, 100); - - // m.energy = 0 // powerUps.research.count = 3 // tech.isHookWire = true @@ -60,8 +51,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("paradigm shift") - // for (let i = 0; i < 1; ++i) tech.giveTech("Higgs mechanism") + // for (let i = 0; i < 1; ++i) tech.giveTech("principle of locality") + // for (let i = 0; i < 1; ++i) tech.giveTech("Bells theorem") // m.skin.egg(); // for (let i = 0; i < 1; ++i) tech.giveTech("many-worlds") // requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("surfing") }); @@ -71,7 +62,7 @@ const level = { // for (let i = 0; i < 7; i++) powerUps.directSpawn(450, -50, "field"); // for (let i = 0; i < 7; i++) powerUps.directSpawn(m.pos.x + 200, m.pos.y - 250, "research", false); // spawn.bodyRect(575, -700, 150, 150); //block mob line of site on testing - // level.testing(); + // level.subway(); level[simulation.isTraining ? "walk" : "initial"]() //normal starting level ************************************************** @@ -139,7 +130,7 @@ const level = { for (let i = 0; i < tech.wimpCount; i++) { spawn.WIMP() mob[mob.length - 1].isDecoupling = true //so you can find it to remove - for (let j = 0, len = 4; j < len; j++) powerUps.spawn(level.exit.x + 100 * (Math.random() - 0.5), level.exit.y - 100 + 100 * (Math.random() - 0.5), "research", false) + for (let j = 0, len = 5; j < len; j++) powerUps.spawn(level.exit.x + 100 * (Math.random() - 0.5), level.exit.y - 100 + 100 * (Math.random() - 0.5), "research", false) } if (m.plasmaBall) m.plasmaBall.fire() @@ -147,6 +138,11 @@ const level = { const flip = localSettings.entanglement.isHorizontalFlipped === simulation.isHorizontalFlipped ? 1 : -1 powerUps.directSpawn(flip * localSettings.entanglement.position.x, localSettings.entanglement.position.y, "entanglement", false); } + if (m.fieldMode === 8) { + Matter.Body.setPosition(m.fieldUpgrades[8].collider, m.pos); + m.fieldPosition = { x: m.pos.x, y: m.pos.y } + m.lastFieldPosition = { x: m.pos.x, y: m.pos.y } + } level.newLevelOrPhase() if (simulation.isTraining) { simulation.difficultyMode = 1 @@ -3555,6 +3551,7 @@ const level = { stationList.unshift(0) //add index zero to the front of the array let isExitOpen = false + let isTechSpawned = false let gatesOpenRight = -1 let gatesOpenLeft = -1 const infrastructure = (x, isInProgress = true) => { @@ -3636,7 +3633,10 @@ const level = { if (isExitOpen) { level.exit.x = x - 50; level.exit.y = -260; - if (simulation.difficultyMode < 7) powerUps.spawn(level.exit.x, level.exit.y - 100, "tech"); + if (simulation.difficultyMode < 7 && !isTechSpawned) { + isTechSpawned = true + powerUps.spawn(level.exit.x, level.exit.y - 100, "tech"); + } } else { var gateButton = level.button(x - 62, -237, 125, false) //x, y, width = 126, isSpawnBase = true gateButton.isUp = true @@ -7772,6 +7772,7 @@ const level = { }, gravitron() { mobs.maxMobBody = 25 //normally 40, but set lower to avoid too much clutter + level.isVerticalFLipLevel = true simulation.fallHeight = 4000 level.announceMobTypes() @@ -7787,7 +7788,12 @@ const level = { powerUps.chooseRandomPowerUp(3900, 925); let buttons = [] - level.isFlipped = false; + // level.isFlipped = false; + if (simulation.isInvertedVertical) { + level.isFlipped = true + } else { + level.isFlipped = false + } let isFlipping = false; const flipAnimationCycles = 60 diff --git a/js/player.js b/js/player.js index 425f243..99c6787 100644 --- a/js/player.js +++ b/js/player.js @@ -809,6 +809,7 @@ const m = { tech.mineralDamageReduction = 1 - (1 - tech.mineralDamageReduction) * Math.pow(0.9, seconds); dmg *= tech.mineralDamageReduction } + if (tech.isInPilot && Vector.magnitude(Vector.sub(m.fieldPosition, m.pos)) < m.fieldRadius + 100) dmg *= 0.1 // return tech.isEnergyHealth ? Math.pow(dmg, 0.7) : dmg //defense has less effect // dmg *= m.fieldHarmReduction return dmg * m.fieldHarmReduction @@ -5170,6 +5171,7 @@ const m = { keyLog: [null, null, null, null, null, null, null], collider: null, fieldMass: 1, + drain: 1, effect: () => { m.fieldUpgrades[8].collider = Matter.Bodies.polygon(m.pos.x, m.pos.y, 8, 35, { friction: 0, @@ -5177,7 +5179,6 @@ const m = { collisionFilter: { category: cat.player, mask: cat.map }, //no collision because player is holding classType: "field", lastSpeed: 0, - isPLayerInField: false, }); Composite.add(engine.world, m.fieldUpgrades[8].collider); //add to world @@ -5233,11 +5234,13 @@ const m = { m.fieldPosition = { x: simulation.mouseInGame.x, y: simulation.mouseInGame.y } m.lastFieldPosition = { x: simulation.mouseInGame.x, y: simulation.mouseInGame.y } m.fieldOn = false; - // m.fieldFire = true; + if (tech.isNoPilotCost) m.fieldFire = true; + m.fieldRadius = 0; m.drop(); m.hold = function () { + let isOn = (tech.isNoPilotCost ? !input.field : input.field) if (tech.isPrinter) { //spawn blocks if field and crouch if (input.field && m.fieldCDcycle < m.cycle && input.down && !m.isHolding) { @@ -5268,7 +5271,7 @@ const m = { //if releasing field throw it } - if (input.field) { + if (isOn) { if (m.fieldCDcycle < m.cycle) { if (!m.fieldOn) { // if field was off, teleport to player m.fieldOn = true; @@ -5281,7 +5284,7 @@ const m = { const mag = Vector.magnitude(sub) //adjust speed of field here, and with friction and mass above where the collier is spawned - const fieldMassScale = Math.max(1.5, Math.pow(m.fieldUpgrades[8].fieldMass, 0.35)) //how much mass inside the field slows the push and cap + const fieldMassScale = Math.max(1.5, Math.pow(m.fieldUpgrades[8].fieldMass, 0.3)) //how much mass inside the field slows the push and cap const scaledMag = 0.00000017 / fieldMassScale * Math.pow(mag, 2) //having the mag squared makes the effect weaker in close for fine movement let push = Vector.mult(Vector.normalise(sub), scaledMag) const cap = 0.17 / fieldMassScale //acts like a "speed limit" @@ -5296,11 +5299,6 @@ const m = { m.fieldPosition.x = m.fieldUpgrades[8].collider.position.x m.fieldPosition.y = m.fieldUpgrades[8].collider.position.y - //check if player is inside field - // if (tech.isSurfing) { - - // } - //grab power ups into the field for (let i = 0, len = powerUp.length; i < len; ++i) { if (tech.isEnergyNoAmmo && powerUp[i].name === "ammo") continue @@ -5333,18 +5331,16 @@ const m = { } } } - //grab power ups normally at player too - m.grabPowerUp(); let radiusGoal, radiusSmooth, drainPassive if (Matter.Query.ray(map, m.fieldPosition, player.position).length) { //is there something blocking the player's view of the field radiusGoal = 0 radiusSmooth = 0.995 - drainPassive = 1.5 * m.fieldRegen //* (tech.isSurfing && m.fieldUpgrades[8].collider.isPLayerInField ? 0 : 1) + drainPassive = 1.5 * m.fieldRegen * m.fieldUpgrades[8].drain } else { - radiusGoal = Math.max(50, 250 - 2 * m.fieldUpgrades[8].collider.speed) //* (tech.isSurfing && m.fieldUpgrades[8].collider.isPLayerInField ? 1.5 : 1) + radiusGoal = Math.max(50, 250 - 2 * m.fieldUpgrades[8].collider.speed) radiusSmooth = 0.97 - drainPassive = m.fieldRegen //* (tech.isSurfing && m.fieldUpgrades[8].collider.isPLayerInField ? 0 : 1) + drainPassive = m.fieldRegen * m.fieldUpgrades[8].drain } m.fieldRadius = m.fieldRadius * radiusSmooth + radiusGoal * (1 - radiusSmooth) @@ -5358,7 +5354,7 @@ const m = { for (let i = 0, len = body.length; i < len; ++i) { if (Vector.magnitude(Vector.sub(body[i].position, m.fieldPosition)) < m.fieldRadius && !body[i].isNotHoldable) { // const drainBlock = m.fieldUpgrades[8].collider.speed * body[i].mass * 0.0000013 - const drainBlock = speedChange * body[i].mass * 0.000095 //* (tech.isSurfing && m.fieldUpgrades[8].collider.isPLayerInField ? 0 : 1) + const drainBlock = m.fieldUpgrades[8].drain * speedChange * body[i].mass * 0.000095 if (m.energy > drainBlock) { m.energy -= drainBlock; Matter.Body.setVelocity(body[i], m.fieldUpgrades[8].collider.velocity); //give block mouse velocity @@ -5434,6 +5430,9 @@ const m = { m.fieldOn = false m.fieldRadius = 0 } + //grab power ups normally at player too + if (input.field) m.grabPowerUp(); + m.drawRegenEnergy("rgba(0,0,0,0.2)") // //draw physics collider diff --git a/js/powerup.js b/js/powerup.js index 559f5a7..482326f 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -1138,7 +1138,7 @@ const powerUps = { } // console.log(options.length) if (options.length > 0 || !tech.isSuperDeterminism) { - let totalChoices = 2 + tech.extraChoices + 3 * (m.fieldMode === 8) - level.fewerChoices + let totalChoices = 2 + tech.extraChoices + (tech.isInPilot ? 1 : 3) * (m.fieldMode === 8) - level.fewerChoices if (tech.isCancelTech && tech.cancelTechCount === 1) { totalChoices *= 3 tech.cancelTechCount++ @@ -1205,7 +1205,7 @@ const powerUps = { for (let i = 1; i < m.fieldUpgrades.length; i++) { //skip field emitter if (i !== m.fieldMode) options.push(i); } - let totalChoices = 2 + tech.extraChoices + 3 * (m.fieldMode === 8) - level.fewerChoices + let totalChoices = 2 + tech.extraChoices + (tech.isInPilot ? 1 : 3) * (m.fieldMode === 8) - level.fewerChoices if (tech.isCancelTech && tech.cancelTechCount === 1) { totalChoices *= 3 tech.cancelTechCount++ @@ -1285,7 +1285,7 @@ const powerUps = { } } //set total choices - let totalChoices = 3 + tech.extraChoices + 3 * (m.fieldMode === 8) - level.fewerChoices + let totalChoices = 3 + tech.extraChoices + (tech.isInPilot ? 1 : 3) * (m.fieldMode === 8) - level.fewerChoices if (tech.isCancelTech && tech.cancelTechCount === 1) { totalChoices *= 3 tech.cancelTechCount++ diff --git a/js/tech.js b/js/tech.js index d6a4c66..6868c27 100644 --- a/js/tech.js +++ b/js/tech.js @@ -141,7 +141,7 @@ const tech = { if (tech.tech[index].isLost) tech.tech[index].isLost = false; //give specific tech if (tech.isBanish && tech.tech[index].isBanished) tech.tech[index].isBanished = false //stops the bug where you can't gets stacks of tech you take with decoherence, I think if (tech.isDamageFieldTech && tech.tech[index].isFieldTech) { - tech.damage *= 1.2 + tech.damage *= 1.3 // simulation.inGameConsole(`damage *= ${1.05}`) simulation.inGameConsole(`tech.damage *= ${1.1} //hidden-variable theory`); } @@ -2550,9 +2550,9 @@ const tech = { frequency: 3, frequencyDefault: 3, allowed() { - return (tech.blockDamage > 0.075 || tech.isPrinter) && !tech.nailsDeathMob && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.iceIXOnDeath + return (tech.blockDamage > 0.075 || tech.isPrinter) }, - requires: "mass driver, printer, no other mob death tech", + requires: "mass driver, printer", effect() { tech.isMobBlockFling = true }, @@ -2570,7 +2570,7 @@ const tech = { frequency: 3, frequencyDefault: 3, allowed() { - return (tech.blockDamage > 0.075 || tech.isPrinter) && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && !tech.isTokamak + return (tech.blockDamage > 0.075 || tech.isPrinter) && !tech.isTokamak }, requires: "mass driver, printer, not pilot wave, tokamak", effect() { @@ -3089,8 +3089,28 @@ const tech = { } }, { - name: "torpor", - description: "if a mob has not died in the last 5 seconds
0.3x damage taken", + name: "fluoroantimonic acid", + description: "if your health is above 100
1.35x damage", + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return m.maxHealth > 1; + }, + requires: "maximum health above 100", + effect() { + tech.isAcidDmg = true; + }, + remove() { + tech.isAcidDmg = false; + } + }, + { + name: "control theory", + descriptionFunction() { + return `2x damage
while your health is at maximum` + }, maxCount: 1, count: 0, frequency: 1, @@ -3100,10 +3120,10 @@ const tech = { }, requires: "", effect() { - tech.isHarmReduceNoKill = true; + tech.isMaxHealthDamage = true; }, remove() { - tech.isHarmReduceNoKill = false; + tech.isMaxHealthDamage = false; } }, { @@ -3147,10 +3167,8 @@ const tech = { } }, { - name: "control theory", - descriptionFunction() { - return `2x damage
while your health is at maximum` - }, + name: "torpor", + description: "if a mob has not died in the last 5 seconds
0.3x damage taken", maxCount: 1, count: 0, frequency: 1, @@ -3160,10 +3178,10 @@ const tech = { }, requires: "", effect() { - tech.isMaxHealthDamage = true; + tech.isHarmReduceNoKill = true; }, remove() { - tech.isMaxHealthDamage = false; + tech.isHarmReduceNoKill = false; } }, { @@ -3255,7 +3273,7 @@ const tech = { { name: "ergodicity", descriptionFunction() { - return `0.50x healing from ${powerUps.orb.heal()}
1.7x damage` + return `0.5x healing from ${powerUps.orb.heal()}
1.7x damage` }, maxCount: 1, count: 0, @@ -3291,24 +3309,6 @@ const tech = { tech.isHalfHeals = false; } }, - { - name: "fluoroantimonic acid", - description: "if your health is above 100
1.35x damage", - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return m.maxHealth > 1; - }, - requires: "maximum health above 100", - effect() { - tech.isAcidDmg = true; - }, - remove() { - tech.isAcidDmg = false; - } - }, { name: "induction brake", descriptionFunction() { @@ -8328,12 +8328,12 @@ const tech = { damage: 1.4, effect() { tech.damage *= this.damage - tech.aimDamage = 1.42 + tech.slowFireDamage = 1.42 b.setFireCD(); }, remove() { if (this.count && m.alive) tech.damage /= this.damage - tech.aimDamage = 1 + tech.slowFireDamage = 1 b.setFireCD(); } }, @@ -8406,9 +8406,9 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return (m.fieldMode === 10 || m.fieldMode === 5 || m.fieldMode === 8) + return (m.fieldMode === 10 || m.fieldMode === 5 || m.fieldMode === 8) && !tech.isNoPilotCost }, - requires: "plasma torch, grappling hook, pilot wave", + requires: "plasma torch, grappling hook, pilot wave, not Bells theorem", effect() { tech.isHarmReduce = true }, @@ -8811,7 +8811,7 @@ const tech = { }, { name: "hidden-variable theory", - description: `1.2x damage after you choose ${powerUps.orb.fieldTech()}`, + description: `1.3x damage after you choose ${powerUps.orb.fieldTech()}`, isFieldTech: true, maxCount: 1, count: 0, @@ -8828,28 +8828,52 @@ const tech = { tech.isDamageFieldTech = false } }, - // { - // name: "surfing", - // description: `while player is inside the pilot wave field
1.5x field radius and no field energy drain`, - // isFieldTech: true, - // maxCount: 1, - // count: 0, - // frequency: 4, - // frequencyDefault: 4, - // allowed() { - // return m.fieldMode === 8 - // }, - // requires: "pilot wave", - // effect() { - // tech.isSurfing = true - // }, - // remove() { - // tech.isSurfing = false - // } - // }, + { + name: "Bells theorem", + description: `pilot wave is always on
and has no energy cost`, + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 4, + frequencyDefault: 4, + allowed() { + return m.fieldMode === 8 && !tech.isHarmReduce + }, + requires: "pilot wave, not degenerate matter", + effect() { + tech.isNoPilotCost = true + m.fieldUpgrades[8].drain = 0 + if (m.fieldMode === 8) m.fieldFire = true; + + }, + remove() { + tech.isNoPilotCost = false + m.fieldUpgrades[8].drain = 1 + if (m.fieldMode === 8) m.fieldFire = false + } + }, + { + name: "principle of locality", + description: `0.9x damage taken while inside pilot wave
, , and have -2 choices`, + isFieldTech: true, + maxCount: 1, + count: 0, + frequency: 4, + frequencyDefault: 4, + allowed() { + return m.fieldMode === 8 + }, + requires: "pilot wave", + effect() { + tech.isInPilot = true + }, + remove() { + tech.isInPilot = false + } + }, { name: "WIMPs", - description: `at the exit to each level spawn ${powerUps.orb.research(4)}
and a dangerous particle that slowly chases you`, + description: `at the exit to each level spawn ${powerUps.orb.research(5)}
and a dangerous particle that slowly chases you`, isFieldTech: true, maxCount: 9, count: 0, @@ -8862,7 +8886,7 @@ const tech = { effect() { tech.wimpCount++ spawn.WIMP() - for (let j = 0, len = 4; j < len; j++) powerUps.spawn(level.exit.x + 100 * (Math.random() - 0.5), level.exit.y - 100 + 100 * (Math.random() - 0.5), "research", false) + for (let j = 0, len = 5; j < len; j++) powerUps.spawn(level.exit.x + 100 * (Math.random() - 0.5), level.exit.y - 100 + 100 * (Math.random() - 0.5), "research", false) }, remove() { tech.wimpCount = 0 @@ -12127,7 +12151,7 @@ const tech = { bonusEnergy: null, // healGiveMaxEnergy: null, healMaxEnergyBonus: 0, //not null - aimDamage: null, + slowFireDamage: null, isNoFireDefense: null, isNoFireDamage: null, duplicateChance: null, @@ -12369,5 +12393,6 @@ const tech = { mineralDamage: null, negativeMassCost: null, beamCollimator: null, - isSurfing: null, + isInPilot: null, + isNoPilotCost: null, } \ No newline at end of file diff --git a/todo.txt b/todo.txt index cf4299e..e7cb2de 100644 --- a/todo.txt +++ b/todo.txt @@ -1,47 +1,33 @@ ******************************************************** NEXT PATCH ************************************************** -pilot wave effect rework - it's easier to surf on blocks controlled by pilot wave - pilot wave secret combo spawns blocks that are easier to surf on: long and thin - pilot wave location resets to player when off - pilot wave hitting map no longer shrinks, it just will not enter map - field speed slows down with total block mass in field - energy drain - 1x energy regen disabled when field is active - 2x passive regen drained when out of line of sight of player - energy drain that scales with size and acceleration of blocks in field - added graphical flicker when field is out of line of sight - a few more bosses now interact with blocks and can take damage - prevented field from disabling when mouse goes off screen - I don't expect any bugs from this, but maybe... +pilot wave tech: Bells theorem - field is always on for no energy cost +pilot wave tech: principle of locality - 0.9x damage taken while inside pilot wave field, -2 choices -ghoster mobs have 2x->1.5x extra density and health -exploder mobs no longer have a chance for a shield - 2.5x explode damage, 1.3x health - added a red aura to show they explode on contact -spawnerBossCulture changed visual look to be a flashing transparent red outline - 2x explode damage -laser mobs no longer explode, 1.5x density/mass +hidden-variable theory 1.2->1.3 damage per field tech +WIMPS spawn 4->5 research per level + +bug fixes + fixed exploit with final tech power up on subway level ******************************************************** BUGS ******************************************************** -player can become crouched while not touching the ground if they exit the ground while crouched +graphical bug - player can become crouched while not touching the ground if they exit the ground while crouched *********************************************************** TODO ***************************************************** -tech - while player is in field increase field radius and no energy drain - check if player is inside field - m.fieldUpgrades[8].collider.isPLayerInField = false - fix tech.isSurfing && m.fieldUpgrades[8].collider.isPLayerInField - -tech - get a benefit while surfing on a block inside the pilot wave field - defense? damage? tech - benefit if you haven't killed any mobs on this level + have to clean up mobs that die on level spawn from falling blocks tech - benefit in the first 20 seconds of the level plasma globe - it should not explode on map contact, but instead shrink? only explode on mouse release + use pilot wave code? + +rework JUNK + example: +5 JUNK adds a frequency of (1? 6?) to a random JUNK tech + if you see that JUNK tech again it's frequency drops down to 0 again + have to rework constraints and a few other tech... mob - moves around, but then stops and makes porcupine spikes for 2 seconds, then moves again. maybe use hopper movement?