pilot wave tech

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

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
This commit is contained in:
landgreen
2025-02-09 17:47:36 -08:00
parent b2426cd7be
commit 7142943b71
9 changed files with 178 additions and 125 deletions

BIN
img/Bells theorem.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -287,7 +287,7 @@ const b = {
}, },
fireCDscale: 1, fireCDscale: 1,
setFireCD() { 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 (m.fieldMode === 6) b.fireCDscale *= 0.8
if (tech.isFastTime) b.fireCDscale *= 0.666 if (tech.isFastTime) b.fireCDscale *= 0.666
if (tech.isFireRateForGuns) b.fireCDscale *= Math.pow(0.76923, Math.max(0, b.inventory.length - 1)) if (tech.isFireRateForGuns) b.fireCDscale *= Math.pow(0.76923, Math.max(0, b.inventory.length - 1))

View File

@@ -1,5 +1,14 @@
"use strict"; "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 //convert text into numbers for seed
Math.hash = s => { Math.hash = s => {
for (var i = 0, h = 9; i < s.length;) h = Math.imul(h ^ s.charCodeAt(i++), 9 ** 9); 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.open("GET", path, true);
xhr.send(); 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 = `<pre><strong>n-gon</strong>: <a href="https://github.com/landgreen/n-gon/blob/master/todo.txt">todo list</a> and complete <a href="https://github.com/landgreen/n-gon/commits/master">change-log</a><hr>` let text = `<pre><strong>n-gon</strong>: <a href="https://github.com/landgreen/n-gon/blob/master/todo.txt">todo list</a> and complete <a href="https://github.com/landgreen/n-gon/commits/master">change-log</a><hr>`
document.getElementById("updates-div").innerHTML = text document.getElementById("updates-div").innerHTML = text
/// https://api.github.com/repos/landgreen/n-gon/stats/commit_activity /// https://api.github.com/repos/landgreen/n-gon/stats/commit_activity
loadJSON('https://api.github.com/repos/landgreen/n-gon/commits', loadJSON('https://api.github.com/repos/landgreen/n-gon/commits',
function (data) { 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 += "<br><em>https://github.com/landgreen/n-gon/</em>: hash matches latest version<hr>"
// } else {
// text += "<br><em>https://github.com/landgreen/n-gon/</em>: hash does <strong>not</strong> match latest version<br><hr>"
// }
for (let i = 0, len = 20; i < len; i++) { for (let i = 0, len = 20; i < len; i++) {
text += "<strong>" + data[i].commit.author.date.substr(0, 10) + "</strong> - "; //+ "<br>" text += "<strong>" + data[i].commit.author.date.substr(0, 10) + "</strong> - "; //+ "<br>"
text += data[i].commit.message text += data[i].commit.message

View File

@@ -35,15 +35,6 @@ const level = {
// m.couplingChange(10) // 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 // 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 // m.energy = 0
// powerUps.research.count = 3 // powerUps.research.count = 3
// tech.isHookWire = true // tech.isHookWire = true
@@ -60,8 +51,8 @@ const level = {
// requestAnimationFrame(() => { tech.giveTech("non-renewables") }); // requestAnimationFrame(() => { tech.giveTech("non-renewables") });
// tech.giveTech("dark matter") // tech.giveTech("dark matter")
// tech.addJunkTechToPool(0.5) // tech.addJunkTechToPool(0.5)
// for (let i = 0; i < 1; ++i) tech.giveTech("paradigm shift") // for (let i = 0; i < 1; ++i) tech.giveTech("principle of locality")
// for (let i = 0; i < 1; ++i) tech.giveTech("Higgs mechanism") // for (let i = 0; i < 1; ++i) tech.giveTech("Bells theorem")
// m.skin.egg(); // m.skin.egg();
// for (let i = 0; i < 1; ++i) tech.giveTech("many-worlds") // for (let i = 0; i < 1; ++i) tech.giveTech("many-worlds")
// requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("surfing") }); // 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(450, -50, "field");
// for (let i = 0; i < 7; i++) powerUps.directSpawn(m.pos.x + 200, m.pos.y - 250, "research", false); // 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 // 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 ************************************************** level[simulation.isTraining ? "walk" : "initial"]() //normal starting level **************************************************
@@ -139,7 +130,7 @@ const level = {
for (let i = 0; i < tech.wimpCount; i++) { for (let i = 0; i < tech.wimpCount; i++) {
spawn.WIMP() spawn.WIMP()
mob[mob.length - 1].isDecoupling = true //so you can find it to remove 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() if (m.plasmaBall) m.plasmaBall.fire()
@@ -147,6 +138,11 @@ const level = {
const flip = localSettings.entanglement.isHorizontalFlipped === simulation.isHorizontalFlipped ? 1 : -1 const flip = localSettings.entanglement.isHorizontalFlipped === simulation.isHorizontalFlipped ? 1 : -1
powerUps.directSpawn(flip * localSettings.entanglement.position.x, localSettings.entanglement.position.y, "entanglement", false); 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() level.newLevelOrPhase()
if (simulation.isTraining) { if (simulation.isTraining) {
simulation.difficultyMode = 1 simulation.difficultyMode = 1
@@ -3555,6 +3551,7 @@ const level = {
stationList.unshift(0) //add index zero to the front of the array stationList.unshift(0) //add index zero to the front of the array
let isExitOpen = false let isExitOpen = false
let isTechSpawned = false
let gatesOpenRight = -1 let gatesOpenRight = -1
let gatesOpenLeft = -1 let gatesOpenLeft = -1
const infrastructure = (x, isInProgress = true) => { const infrastructure = (x, isInProgress = true) => {
@@ -3636,7 +3633,10 @@ const level = {
if (isExitOpen) { if (isExitOpen) {
level.exit.x = x - 50; level.exit.x = x - 50;
level.exit.y = -260; 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 { } else {
var gateButton = level.button(x - 62, -237, 125, false) //x, y, width = 126, isSpawnBase = true var gateButton = level.button(x - 62, -237, 125, false) //x, y, width = 126, isSpawnBase = true
gateButton.isUp = true gateButton.isUp = true
@@ -7772,6 +7772,7 @@ const level = {
}, },
gravitron() { gravitron() {
mobs.maxMobBody = 25 //normally 40, but set lower to avoid too much clutter mobs.maxMobBody = 25 //normally 40, but set lower to avoid too much clutter
level.isVerticalFLipLevel = true level.isVerticalFLipLevel = true
simulation.fallHeight = 4000 simulation.fallHeight = 4000
level.announceMobTypes() level.announceMobTypes()
@@ -7787,7 +7788,12 @@ const level = {
powerUps.chooseRandomPowerUp(3900, 925); powerUps.chooseRandomPowerUp(3900, 925);
let buttons = [] let buttons = []
level.isFlipped = false; // level.isFlipped = false;
if (simulation.isInvertedVertical) {
level.isFlipped = true
} else {
level.isFlipped = false
}
let isFlipping = false; let isFlipping = false;
const flipAnimationCycles = 60 const flipAnimationCycles = 60

View File

@@ -809,6 +809,7 @@ const m = {
tech.mineralDamageReduction = 1 - (1 - tech.mineralDamageReduction) * Math.pow(0.9, seconds); tech.mineralDamageReduction = 1 - (1 - tech.mineralDamageReduction) * Math.pow(0.9, seconds);
dmg *= tech.mineralDamageReduction 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 // return tech.isEnergyHealth ? Math.pow(dmg, 0.7) : dmg //defense has less effect
// dmg *= m.fieldHarmReduction // dmg *= m.fieldHarmReduction
return dmg * m.fieldHarmReduction return dmg * m.fieldHarmReduction
@@ -5170,6 +5171,7 @@ const m = {
keyLog: [null, null, null, null, null, null, null], keyLog: [null, null, null, null, null, null, null],
collider: null, collider: null,
fieldMass: 1, fieldMass: 1,
drain: 1,
effect: () => { effect: () => {
m.fieldUpgrades[8].collider = Matter.Bodies.polygon(m.pos.x, m.pos.y, 8, 35, { m.fieldUpgrades[8].collider = Matter.Bodies.polygon(m.pos.x, m.pos.y, 8, 35, {
friction: 0, friction: 0,
@@ -5177,7 +5179,6 @@ const m = {
collisionFilter: { category: cat.player, mask: cat.map }, //no collision because player is holding collisionFilter: { category: cat.player, mask: cat.map }, //no collision because player is holding
classType: "field", classType: "field",
lastSpeed: 0, lastSpeed: 0,
isPLayerInField: false,
}); });
Composite.add(engine.world, m.fieldUpgrades[8].collider); //add to world 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.fieldPosition = { x: simulation.mouseInGame.x, y: simulation.mouseInGame.y }
m.lastFieldPosition = { x: simulation.mouseInGame.x, y: simulation.mouseInGame.y } m.lastFieldPosition = { x: simulation.mouseInGame.x, y: simulation.mouseInGame.y }
m.fieldOn = false; m.fieldOn = false;
// m.fieldFire = true; if (tech.isNoPilotCost) m.fieldFire = true;
m.fieldRadius = 0; m.fieldRadius = 0;
m.drop(); m.drop();
m.hold = function () { m.hold = function () {
let isOn = (tech.isNoPilotCost ? !input.field : input.field)
if (tech.isPrinter) { if (tech.isPrinter) {
//spawn blocks if field and crouch //spawn blocks if field and crouch
if (input.field && m.fieldCDcycle < m.cycle && input.down && !m.isHolding) { if (input.field && m.fieldCDcycle < m.cycle && input.down && !m.isHolding) {
@@ -5268,7 +5271,7 @@ const m = {
//if releasing field throw it //if releasing field throw it
} }
if (input.field) { if (isOn) {
if (m.fieldCDcycle < m.cycle) { if (m.fieldCDcycle < m.cycle) {
if (!m.fieldOn) { // if field was off, teleport to player if (!m.fieldOn) { // if field was off, teleport to player
m.fieldOn = true; m.fieldOn = true;
@@ -5281,7 +5284,7 @@ const m = {
const mag = Vector.magnitude(sub) const mag = Vector.magnitude(sub)
//adjust speed of field here, and with friction and mass above where the collier is spawned //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 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) let push = Vector.mult(Vector.normalise(sub), scaledMag)
const cap = 0.17 / fieldMassScale //acts like a "speed limit" 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.x = m.fieldUpgrades[8].collider.position.x
m.fieldPosition.y = m.fieldUpgrades[8].collider.position.y m.fieldPosition.y = m.fieldUpgrades[8].collider.position.y
//check if player is inside field
// if (tech.isSurfing) {
// }
//grab power ups into the field //grab power ups into the field
for (let i = 0, len = powerUp.length; i < len; ++i) { for (let i = 0, len = powerUp.length; i < len; ++i) {
if (tech.isEnergyNoAmmo && powerUp[i].name === "ammo") continue 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 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 if (Matter.Query.ray(map, m.fieldPosition, player.position).length) { //is there something blocking the player's view of the field
radiusGoal = 0 radiusGoal = 0
radiusSmooth = 0.995 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 { } 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 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) m.fieldRadius = m.fieldRadius * radiusSmooth + radiusGoal * (1 - radiusSmooth)
@@ -5358,7 +5354,7 @@ const m = {
for (let i = 0, len = body.length; i < len; ++i) { 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) { 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 = 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) { if (m.energy > drainBlock) {
m.energy -= drainBlock; m.energy -= drainBlock;
Matter.Body.setVelocity(body[i], m.fieldUpgrades[8].collider.velocity); //give block mouse velocity Matter.Body.setVelocity(body[i], m.fieldUpgrades[8].collider.velocity); //give block mouse velocity
@@ -5434,6 +5430,9 @@ const m = {
m.fieldOn = false m.fieldOn = false
m.fieldRadius = 0 m.fieldRadius = 0
} }
//grab power ups normally at player too
if (input.field) m.grabPowerUp();
m.drawRegenEnergy("rgba(0,0,0,0.2)") m.drawRegenEnergy("rgba(0,0,0,0.2)")
// //draw physics collider // //draw physics collider

View File

@@ -1138,7 +1138,7 @@ const powerUps = {
} }
// console.log(options.length) // console.log(options.length)
if (options.length > 0 || !tech.isSuperDeterminism) { 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) { if (tech.isCancelTech && tech.cancelTechCount === 1) {
totalChoices *= 3 totalChoices *= 3
tech.cancelTechCount++ tech.cancelTechCount++
@@ -1205,7 +1205,7 @@ const powerUps = {
for (let i = 1; i < m.fieldUpgrades.length; i++) { //skip field emitter for (let i = 1; i < m.fieldUpgrades.length; i++) { //skip field emitter
if (i !== m.fieldMode) options.push(i); 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) { if (tech.isCancelTech && tech.cancelTechCount === 1) {
totalChoices *= 3 totalChoices *= 3
tech.cancelTechCount++ tech.cancelTechCount++
@@ -1285,7 +1285,7 @@ const powerUps = {
} }
} }
//set total choices //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) { if (tech.isCancelTech && tech.cancelTechCount === 1) {
totalChoices *= 3 totalChoices *= 3
tech.cancelTechCount++ tech.cancelTechCount++

View File

@@ -141,7 +141,7 @@ const tech = {
if (tech.tech[index].isLost) tech.tech[index].isLost = false; //give specific 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.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) { if (tech.isDamageFieldTech && tech.tech[index].isFieldTech) {
tech.damage *= 1.2 tech.damage *= 1.3
// simulation.inGameConsole(`<strong class='color-d'>damage</strong> <span class='color-symbol'>*=</span> ${1.05}`) // simulation.inGameConsole(`<strong class='color-d'>damage</strong> <span class='color-symbol'>*=</span> ${1.05}`)
simulation.inGameConsole(`<span class='color-var'>tech</span>.damage *= ${1.1} //hidden-variable theory`); simulation.inGameConsole(`<span class='color-var'>tech</span>.damage *= ${1.1} //hidden-variable theory`);
} }
@@ -2550,9 +2550,9 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { 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() { effect() {
tech.isMobBlockFling = true tech.isMobBlockFling = true
}, },
@@ -2570,7 +2570,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { 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", requires: "mass driver, printer, not pilot wave, tokamak",
effect() { effect() {
@@ -3089,8 +3089,28 @@ const tech = {
} }
}, },
{ {
name: "torpor", name: "fluoroantimonic acid",
description: "if a mob has <strong>not died</strong> in the last <strong>5</strong> seconds<br><strong>0.3x</strong> <strong class='color-defense'>damage taken</strong>", description: "if your <strong class='color-h'>health</strong> is above <strong>100</strong><br><strong>1.35x</strong> <strong class='color-d'>damage</strong>",
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 `<strong>2x</strong> <strong class='color-d'>damage</strong><br>while your <strong class='color-h'>health</strong> is at maximum`
},
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3100,10 +3120,10 @@ const tech = {
}, },
requires: "", requires: "",
effect() { effect() {
tech.isHarmReduceNoKill = true; tech.isMaxHealthDamage = true;
}, },
remove() { remove() {
tech.isHarmReduceNoKill = false; tech.isMaxHealthDamage = false;
} }
}, },
{ {
@@ -3147,10 +3167,8 @@ const tech = {
} }
}, },
{ {
name: "control theory", name: "torpor",
descriptionFunction() { description: "if a mob has <strong>not died</strong> in the last <strong>5</strong> seconds<br><strong>0.3x</strong> <strong class='color-defense'>damage taken</strong>",
return `<strong>2x</strong> <strong class='color-d'>damage</strong><br>while your <strong class='color-h'>health</strong> is at maximum`
},
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3160,10 +3178,10 @@ const tech = {
}, },
requires: "", requires: "",
effect() { effect() {
tech.isMaxHealthDamage = true; tech.isHarmReduceNoKill = true;
}, },
remove() { remove() {
tech.isMaxHealthDamage = false; tech.isHarmReduceNoKill = false;
} }
}, },
{ {
@@ -3255,7 +3273,7 @@ const tech = {
{ {
name: "ergodicity", name: "ergodicity",
descriptionFunction() { descriptionFunction() {
return `<strong>0.50x</strong> <strong class='color-h'>healing</strong> from ${powerUps.orb.heal()}<br><strong>1.7x</strong> <strong class='color-d'>damage</strong>` return `<strong>0.5x</strong> <strong class='color-h'>healing</strong> from ${powerUps.orb.heal()}<br><strong>1.7x</strong> <strong class='color-d'>damage</strong>`
}, },
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -3291,24 +3309,6 @@ const tech = {
tech.isHalfHeals = false; tech.isHalfHeals = false;
} }
}, },
{
name: "fluoroantimonic acid",
description: "if your <strong class='color-h'>health</strong> is above <strong>100</strong><br><strong>1.35x</strong> <strong class='color-d'>damage</strong>",
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", name: "induction brake",
descriptionFunction() { descriptionFunction() {
@@ -8328,12 +8328,12 @@ const tech = {
damage: 1.4, damage: 1.4,
effect() { effect() {
tech.damage *= this.damage tech.damage *= this.damage
tech.aimDamage = 1.42 tech.slowFireDamage = 1.42
b.setFireCD(); b.setFireCD();
}, },
remove() { remove() {
if (this.count && m.alive) tech.damage /= this.damage if (this.count && m.alive) tech.damage /= this.damage
tech.aimDamage = 1 tech.slowFireDamage = 1
b.setFireCD(); b.setFireCD();
} }
}, },
@@ -8406,9 +8406,9 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { 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() { effect() {
tech.isHarmReduce = true tech.isHarmReduce = true
}, },
@@ -8811,7 +8811,7 @@ const tech = {
}, },
{ {
name: "hidden-variable theory", name: "hidden-variable theory",
description: `<strong>1.2x</strong> <strong class='color-d'>damage</strong> after you <strong class='color-choice'><span>ch</span><span>oo</span><span>se</span></strong> ${powerUps.orb.fieldTech()}`, description: `<strong>1.3x</strong> <strong class='color-d'>damage</strong> after you <strong class='color-choice'><span>ch</span><span>oo</span><span>se</span></strong> ${powerUps.orb.fieldTech()}`,
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -8828,28 +8828,52 @@ const tech = {
tech.isDamageFieldTech = false tech.isDamageFieldTech = false
} }
}, },
// { {
// name: "surfing", name: "Bells theorem",
// description: `while player is inside the pilot wave field<br><strong>1.5x</strong> field radius and no field energy drain`, description: `<strong>pilot wave</strong> is always <strong>on</strong><br>and has no <strong class='color-f'>energy</strong> cost`,
// isFieldTech: true, isFieldTech: true,
// maxCount: 1, maxCount: 1,
// count: 0, count: 0,
// frequency: 4, frequency: 4,
// frequencyDefault: 4, frequencyDefault: 4,
// allowed() { allowed() {
// return m.fieldMode === 8 return m.fieldMode === 8 && !tech.isHarmReduce
// }, },
// requires: "pilot wave", requires: "pilot wave, not degenerate matter",
// effect() { effect() {
// tech.isSurfing = true tech.isNoPilotCost = true
// }, m.fieldUpgrades[8].drain = 0
// remove() { if (m.fieldMode === 8) m.fieldFire = true;
// tech.isSurfing = false
// } },
// }, remove() {
tech.isNoPilotCost = false
m.fieldUpgrades[8].drain = 1
if (m.fieldMode === 8) m.fieldFire = false
}
},
{
name: "principle of locality",
description: `<strong>0.9x</strong> <strong class='color-defense'>damage taken</strong> while inside <strong>pilot wave</strong><br><div class="circle-grid tech"></div>, <div class="circle-grid gun"></div>, and <div class="circle-grid field"></div> have <strong>-2</strong> <strong class='color-choice'><span>ch</span><span>oi</span><span>ces</span></strong>`,
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", name: "WIMPs",
description: `at the exit to each <strong>level</strong> spawn ${powerUps.orb.research(4)}<br>and a dangerous particle that slowly <strong>chases</strong> you`, description: `at the exit to each <strong>level</strong> spawn ${powerUps.orb.research(5)}<br>and a dangerous particle that slowly <strong>chases</strong> you`,
isFieldTech: true, isFieldTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
@@ -8862,7 +8886,7 @@ const tech = {
effect() { effect() {
tech.wimpCount++ tech.wimpCount++
spawn.WIMP() 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() { remove() {
tech.wimpCount = 0 tech.wimpCount = 0
@@ -12127,7 +12151,7 @@ const tech = {
bonusEnergy: null, bonusEnergy: null,
// healGiveMaxEnergy: null, // healGiveMaxEnergy: null,
healMaxEnergyBonus: 0, //not null healMaxEnergyBonus: 0, //not null
aimDamage: null, slowFireDamage: null,
isNoFireDefense: null, isNoFireDefense: null,
isNoFireDamage: null, isNoFireDamage: null,
duplicateChance: null, duplicateChance: null,
@@ -12369,5 +12393,6 @@ const tech = {
mineralDamage: null, mineralDamage: null,
negativeMassCost: null, negativeMassCost: null,
beamCollimator: null, beamCollimator: null,
isSurfing: null, isInPilot: null,
isNoPilotCost: null,
} }

View File

@@ -1,47 +1,33 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
pilot wave effect rework pilot wave tech: Bells theorem - field is always on for no energy cost
it's easier to surf on blocks controlled by pilot wave pilot wave tech: principle of locality - 0.9x damage taken while inside pilot wave field, -2 choices
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...
ghoster mobs have 2x->1.5x extra density and health hidden-variable theory 1.2->1.3 damage per field tech
exploder mobs no longer have a chance for a shield WIMPS spawn 4->5 research per level
2.5x explode damage, 1.3x health
added a red aura to show they explode on contact bug fixes
spawnerBossCulture changed visual look to be a flashing transparent red outline fixed exploit with final tech power up on subway level
2x explode damage
laser mobs no longer explode, 1.5x density/mass
******************************************************** BUGS ******************************************************** ******************************************************** 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 ***************************************************** *********************************************************** 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 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 tech - benefit in the first 20 seconds of the level
plasma globe - it should not explode on map contact, but instead shrink? plasma globe - it should not explode on map contact, but instead shrink?
only explode on mouse release 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. mob - moves around, but then stops and makes porcupine spikes for 2 seconds, then moves again.
maybe use hopper movement? maybe use hopper movement?