ergodicity, tooltips

tech requirement info UI updated in experiment mode

tech: ergodicity - remove heal power ups and heal tech,  reduce difficulty by 2 levels
This commit is contained in:
landgreen
2021-03-19 19:15:52 -07:00
parent 1aa4afb280
commit 69b416b203
10 changed files with 254 additions and 110 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -2023,13 +2023,13 @@ const b = {
// y: m.Vy / 2 + speed * Math.sin(dir) // y: m.Vy / 2 + speed * Math.sin(dir)
// }); // });
}, },
drone(speed = 1) { drone(where = { x: m.pos.x + 30 * Math.cos(m.angle) + 20 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 20 * (Math.random() - 0.5) }, speed = 1) {
const me = bullet.length; const me = bullet.length;
const THRUST = tech.isFastDrones ? 0.0023 : 0.0015 const THRUST = tech.isFastDrones ? 0.0023 : 0.0015
// const FRICTION = tech.isFastDrones ? 0.008 : 0.0005 // const FRICTION = tech.isFastDrones ? 0.008 : 0.0005
const dir = m.angle + 0.4 * (Math.random() - 0.5); const dir = m.angle + 0.4 * (Math.random() - 0.5);
const RADIUS = (4.5 + 3 * Math.random()) const RADIUS = (4.5 + 3 * Math.random())
bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle) + Math.random(), m.pos.y + 30 * Math.sin(m.angle) + Math.random(), 8, RADIUS, { bullet[me] = Bodies.polygon(where.x, where.y, 8, RADIUS, {
angle: dir, angle: dir,
inertia: Infinity, inertia: Infinity,
friction: 0.05, friction: 0.05,
@@ -2037,7 +2037,7 @@ const b = {
restitution: 1, restitution: 1,
dmg: 0.24, //damage done in addition to the damage from momentum dmg: 0.24, //damage done in addition to the damage from momentum
lookFrequency: 80 + Math.floor(23 * Math.random()), lookFrequency: 80 + Math.floor(23 * Math.random()),
endCycle: simulation.cycle + Math.floor((960 + 420 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 130 + RADIUS * 5, endCycle: simulation.cycle + Math.floor((950 + 420 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 140 + RADIUS * 5,
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
category: cat.bullet, category: cat.bullet,
@@ -4034,10 +4034,10 @@ const b = {
have: false, have: false,
fire() { fire() {
if (m.crouch) { if (m.crouch) {
b.drone(45) b.drone({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 45)
m.fireCDcycle = m.cycle + Math.floor(13 * b.fireCD); // cool down m.fireCDcycle = m.cycle + Math.floor(13 * b.fireCD); // cool down
} else { } else {
b.drone(1) b.drone()
m.fireCDcycle = m.cycle + Math.floor(6 * b.fireCD); // cool down m.fireCDcycle = m.cycle + Math.floor(6 * b.fireCD); // cool down
} }
} }

View File

@@ -341,7 +341,9 @@ const build = {
techID.setAttribute("onClick", `javascript: build.choosePowerUp(this,${i},'tech')`); techID.setAttribute("onClick", `javascript: build.choosePowerUp(this,${i},'tech')`);
} }
} else { } else {
techID.innerHTML = `<div class="grid-title"> ${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>` // techID.innerHTML = `<div class="grid-title"> ${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>`
// techID.innerHTML = `<div class="grid-title"> ${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>`
techID.innerHTML = `<div class="grid-title">${tech.tech[i].name}</div>${tech.tech[i].description}</div>`
if (!techID.classList.contains("experiment-grid-disabled")) { if (!techID.classList.contains("experiment-grid-disabled")) {
techID.classList.add("experiment-grid-disabled"); techID.classList.add("experiment-grid-disabled");
techID.onclick = null techID.onclick = null
@@ -403,7 +405,8 @@ const build = {
text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title"><div class="circle-grid tech"></div> &nbsp; ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>` text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title"><div class="circle-grid tech"></div> &nbsp; ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
} }
} else { } else {
text += `<div id="tech-${i}" class="experiment-grid-module experiment-grid-disabled"><div class="grid-title">${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>` // text += `<div id="tech-${i}" class="experiment-grid-module "><div class="grid-title">${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>`
text += `<div id="tech-${i}" class="experiment-grid-module experiment-grid-disabled"><div class="grid-title"> ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
} }
} }
} }
@@ -415,6 +418,14 @@ const build = {
document.getElementById("difficulty-select").value = document.getElementById("difficulty-select-experiment").value document.getElementById("difficulty-select").value = document.getElementById("difficulty-select-experiment").value
localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
}); });
//add tooltips
for (let i = 0, len = tech.tech.length; i < len; i++) {
if (document.getElementById(`tech-${i}`)) {
document.getElementById(`tech-${i}`).setAttribute('data-descr', tech.tech[i].requires); //add tooltip
// document.getElementById(`tech-${i}`).setAttribute('title', tech.tech[i].requires); //add tooltip
}
}
}, },
reset() { reset() {
build.isExperimentSelection = true; build.isExperimentSelection = true;

View File

@@ -1102,7 +1102,7 @@ const level = {
// simulation.difficulty = 30 // simulation.difficulty = 30
// spawn.starter(1900, -500, 200) //big boy // spawn.starter(1900, -500, 200) //big boy
// spawn.pulsar(1900, -500) spawn.exploder(1900, -500)
// spawn.pulsarBoss(1900, -500) // spawn.pulsarBoss(1900, -500)
// spawn.historyBoss(1900, -500) // spawn.historyBoss(1900, -500)
// spawn.ghoster(2900, -500) // spawn.ghoster(2900, -500)
@@ -1115,7 +1115,7 @@ const level = {
// spawn.streamBoss(1600, -500) // spawn.streamBoss(1600, -500)
// spawn.orbitalBoss(1600, -500) // spawn.orbitalBoss(1600, -500)
// spawn.cellBossCulture(1600, -500) // spawn.cellBossCulture(1600, -500)
spawn.shieldingBoss(1600, -500) // spawn.shieldingBoss(1600, -500)
// spawn.beamer(1200, -500) // spawn.beamer(1200, -500)
// spawn.shield(mob[mob.length - 1], 1800, -120, 1); // spawn.shield(mob[mob.length - 1], 1800, -120, 1);

View File

@@ -478,7 +478,7 @@ const m = {
} }
}, },
addHealth(heal) { addHealth(heal) {
if (!tech.isEnergyHealth) { if (!tech.isEnergyHealth && !tech.isNoHeals) {
m.health += heal * simulation.healScale; m.health += heal * simulation.healScale;
if (m.health > m.maxHealth) m.health = m.maxHealth; if (m.health > m.maxHealth) m.health = m.maxHealth;
m.displayHealth(); m.displayHealth();
@@ -633,7 +633,7 @@ const m = {
if (tech.isDroneOnDamage) { //chance to build a drone on damage from tech if (tech.isDroneOnDamage) { //chance to build a drone on damage from tech
const len = Math.min((dmg - 0.06 * Math.random()) * 40, 40) / tech.droneEnergyReduction const len = Math.min((dmg - 0.06 * Math.random()) * 40, 40) / tech.droneEnergyReduction
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
if (Math.random() < 0.5) b.drone() //spawn drone if (Math.random() < 0.5) b.drone({ x: m.pos.x + 30 * Math.cos(m.angle) + 100 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 100 * (Math.random() - 0.5) }) //spawn drone
} }
} }
@@ -735,9 +735,6 @@ const m = {
// document.getElementById("health").style.transition = "width 1s ease-out" // document.getElementById("health").style.transition = "width 1s ease-out"
// } // }
}, },
hitMob(i, dmg) {
//prevents damage happening too quick
},
buttonCD: 0, //cool down for player buttons buttonCD: 0, //cool down for player buttons
drawLeg(stroke) { drawLeg(stroke) {
// if (simulation.mouseInGame.x > m.pos.x) { // if (simulation.mouseInGame.x > m.pos.x) {
@@ -1567,7 +1564,7 @@ const m = {
b.iceIX(1) b.iceIX(1)
} else { } else {
m.energy -= 0.45 * tech.droneEnergyReduction; m.energy -= 0.45 * tech.droneEnergyReduction;
b.drone(1) b.drone()
} }
} }

View File

@@ -680,6 +680,7 @@ const powerUps = {
if ( if (
(!tech.isSuperDeterminism || (target === 'tech' || target === 'heal' || target === 'ammo')) && (!tech.isSuperDeterminism || (target === 'tech' || target === 'heal' || target === 'ammo')) &&
!(tech.isEnergyNoAmmo && target === 'ammo') && !(tech.isEnergyNoAmmo && target === 'ammo') &&
!(tech.isNoHeals || target === 'heal') &&
(!simulation.isNoPowerUps || (target === 'research' || target === 'heal' || target === 'ammo')) (!simulation.isNoPowerUps || (target === 'research' || target === 'heal' || target === 'ammo'))
) { ) {
powerUps.directSpawn(x, y, target, moving, mode, size) powerUps.directSpawn(x, y, target, moving, mode, size)

View File

@@ -650,7 +650,7 @@ const spawn = {
mobs.spawn(x, y, 8, radius, "rgb(255,150,100)"); //"#2c9790" mobs.spawn(x, y, 8, radius, "rgb(255,150,100)"); //"#2c9790"
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
// Matter.Body.setDensity(me, 0.0007); //extra dense //normal is 0.001 //makes effective life much lower // Matter.Body.setDensity(me, 0.0007); //extra dense //normal is 0.001 //makes effective life much lower
me.friction = 0; me.friction = 0.1;
me.frictionAir = 0; me.frictionAir = 0;
me.accelMag = 0.001 * Math.sqrt(simulation.accelScale); me.accelMag = 0.001 * Math.sqrt(simulation.accelScale);
me.g = me.accelMag * 0.6; //required if using 'gravity' me.g = me.accelMag * 0.6; //required if using 'gravity'
@@ -2537,7 +2537,7 @@ const spawn = {
spawn.shield(me, x, y, 1); spawn.shield(me, x, y, 1);
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random()) spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
Matter.Body.setDensity(me, 0.01); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.008); //extra dense //normal is 0.001 //makes effective life much larger
me.onDeath = function() { me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y) powerUps.spawnBossPowerUp(this.position.x, this.position.y)
// this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed // this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed
@@ -2727,6 +2727,49 @@ const spawn = {
this.attraction(); this.attraction();
}; };
}, },
// exploder(x, y, radius = 40 + Math.ceil(Math.random() * 50)) {
// mobs.spawn(x, y, 4, radius, "rgb(255,0,0)");
// let me = mob[mob.length - 1];
// me.onHit = function() { //run this function on hitting player
// this.explode();
// };
// me.g = 0.0003; //required if using 'gravity'
// me.seePlayerFreq = 50 + Math.floor(Math.random() * 20)
// me.do = function() {
// this.gravity();
// if (!(simulation.cycle % this.seePlayerFreq)) {
// if (
// this.distanceToPlayer2() < this.seeAtDistance2 &&
// Matter.Query.ray(map, this.position, this.mPosRange()).length === 0 &&
// Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 &&
// !m.isCloak
// ) {
// this.foundPlayer();
// } else if (this.seePlayer.recall) {
// for (let i = 0; i < 20; i++) {
// let history = m.history[(m.cycle - 30 * i) % 600]
// if (Matter.Query.ray(map, this.position, history.position).length === 0) {
// this.seePlayer.recall = this.memory + Math.round(this.memory * Math.random()); //seconds before mob falls a sleep
// this.seePlayer.position.x = history.position.x;
// this.seePlayer.position.y = history.position.y;
// ctx.beginPath();
// ctx.moveTo(this.position.x, this.position.y);
// ctx.lineTo(history.position.x, history.position.y);
// ctx.lineWidth = 5;
// ctx.strokeStyle = "#000";
// ctx.stroke();
// break
// }
// }
// this.lostPlayer();
// }
// }
// this.checkStatus();
// this.attraction();
// };
// },
exploder(x, y, radius = 40 + Math.ceil(Math.random() * 50)) { exploder(x, y, radius = 40 + Math.ceil(Math.random() * 50)) {
mobs.spawn(x, y, 4, radius, "rgb(255,0,0)"); mobs.spawn(x, y, 4, radius, "rgb(255,0,0)");
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];

View File

@@ -417,7 +417,7 @@
allowed() { allowed() {
return tech.isCrouchAmmo && !tech.isEnergyHealth return tech.isCrouchAmmo && !tech.isEnergyHealth
}, },
requires: "desublimated ammunition<br>not mass-energy equivalence", requires: "desublimated ammunition, not mass-energy",
effect() { effect() {
tech.isTurret = true tech.isTurret = true
}, },
@@ -640,7 +640,7 @@
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb
}, },
requires: "drones, spores, missiles, foam<br>wave beam, neutron bomb", requires: "drones, spores, missiles, foam, wave beam, neutron bomb",
effect() { effect() {
tech.isBulletsLastLonger += 0.3 tech.isBulletsLastLonger += 0.3
}, },
@@ -722,6 +722,7 @@
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
isBadRandomOption: true,
allowed() { allowed() {
return !tech.isRewindGrenade && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField) return !tech.isRewindGrenade && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField)
}, },
@@ -1329,9 +1330,9 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.throwChargeRate > 1 return tech.throwChargeRate > 1 && !tech.isNoHeals
}, },
requires: "mass driver", requires: "mass driver, not ergodicity",
effect() { effect() {
tech.isBlockPowerUps = true tech.isBlockPowerUps = true
}, },
@@ -1390,11 +1391,9 @@
} }
}, { }, {
name: "flip-flop", name: "flip-flop",
description: `if <strong>flip-flop</strong> is <strong class="color-flop">ON</strong>, collisions set it to <strong class="color-flop">OFF</strong> description: `unlock advanced <strong class='color-m'>tech</strong> that runs if flip-flop is <strong class="color-flop">ON</strong><br><strong>flip-flop</strong> toggles <strong class="color-flop">ON</strong> and <strong class="color-flop">OFF</strong> after a collision`,
<br>if <strong>flip-flop</strong> is <strong class="color-flop">OFF</strong>, collisions set it to <strong class="color-flop">ON</strong>`, // description: `if <strong>flip-flop</strong> is <strong class="color-flop">ON</strong>, collisions set it to <strong class="color-flop">OFF</strong>
// description: `<strong>collisions</strong> toggle flip-flop <strong>ON</strong> and <strong>OFF</strong> // <br>if <strong>flip-flop</strong> is <strong class="color-flop">OFF</strong>, collisions set it to <strong class="color-flop">ON</strong>`,
// <br><strong>ON</strong>: 0 collision <strong class='color-harm'>harm</strong>, <strong>OFF</strong>: <strong>25%</strong> extra <strong class='color-harm'>harm</strong>`,
// on your next <strong>collision</strong> take <strong>0</strong> <strong class='color-harm'>harm</strong>
nameInfo: "<span id = 'tech-flip-flop'></span>", nameInfo: "<span id = 'tech-flip-flop'></span>",
addNameInfo() { addNameInfo() {
setTimeout(function() { setTimeout(function() {
@@ -1419,40 +1418,42 @@
effect() { effect() {
tech.isFlipFlop = true //do you have this tech? tech.isFlipFlop = true //do you have this tech?
tech.isFlipFlopOn = true //what is the state of flip-Flop? tech.isFlipFlopOn = true //what is the state of flip-Flop?
m.draw = () => { if (!m.isShipMode) {
ctx.fillStyle = m.fillColor; m.draw = () => {
m.walk_cycle += m.flipLegs * m.Vx; ctx.fillStyle = m.fillColor;
m.walk_cycle += m.flipLegs * m.Vx;
//draw body //draw body
ctx.save(); ctx.save();
ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5 ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5
ctx.translate(m.pos.x, m.pos.y); ctx.translate(m.pos.x, m.pos.y);
m.calcLeg(Math.PI, -3); m.calcLeg(Math.PI, -3);
m.drawLeg("#4a4a4a"); m.drawLeg("#4a4a4a");
m.calcLeg(0, 0); m.calcLeg(0, 0);
m.drawLeg("#333"); m.drawLeg("#333");
ctx.rotate(m.angle); ctx.rotate(m.angle);
ctx.beginPath(); ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI); ctx.arc(0, 0, 30, 0, 2 * Math.PI);
let grd = ctx.createLinearGradient(-30, 0, 30, 0); let grd = ctx.createLinearGradient(-30, 0, 30, 0);
grd.addColorStop(0, m.fillColorDark); grd.addColorStop(0, m.fillColorDark);
grd.addColorStop(1, m.fillColor); grd.addColorStop(1, m.fillColor);
ctx.fillStyle = grd; ctx.fillStyle = grd;
ctx.fill(); ctx.fill();
ctx.arc(15, 0, 4, 0, 2 * Math.PI); ctx.arc(15, 0, 4, 0, 2 * Math.PI);
ctx.strokeStyle = "#333"; ctx.strokeStyle = "#333";
ctx.lineWidth = 2; ctx.lineWidth = 2;
ctx.stroke(); ctx.stroke();
//draw eye //draw eye
ctx.beginPath(); ctx.beginPath();
ctx.arc(15, 0, 3.5, 0, 2 * Math.PI); ctx.arc(15, 0, 3.5, 0, 2 * Math.PI);
ctx.fillStyle = m.eyeFillColor; ctx.fillStyle = m.eyeFillColor;
ctx.fill() ctx.fill()
ctx.restore(); ctx.restore();
m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
}
} }
}, },
remove() { remove() {
@@ -1705,7 +1706,7 @@
allowed() { allowed() {
return !tech.isEnergyHealth && (m.harmReduction() < 1 || tech.isFlipFlopHarm) return !tech.isEnergyHealth && (m.harmReduction() < 1 || tech.isFlipFlopHarm)
}, },
requires: "not mass-energy equivalence, some harm reduction", requires: "not mass-energy, some harm reduction",
effect() { effect() {
tech.isPiezo = true; tech.isPiezo = true;
m.energy += 20.48; m.energy += 20.48;
@@ -1767,9 +1768,9 @@
count: 0, count: 0,
frequency: 1, frequency: 1,
allowed() { allowed() {
return tech.isEnergyHealth return tech.isEnergyHealth && !tech.isNoHeals
}, },
requires: "mass-energy equivalence", requires: "mass-energy equivalence, not ergodicity",
effect() { effect() {
tech.healGiveMaxEnergy = true; //tech.healMaxEnergyBonus given from heal power up tech.healGiveMaxEnergy = true; //tech.healMaxEnergyBonus given from heal power up
powerUps.heal.color = "#0ae" powerUps.heal.color = "#0ae"
@@ -1945,9 +1946,9 @@
frequency: 1, frequency: 1,
isHealTech: true, isHealTech: true,
allowed() { allowed() {
return !tech.isEnergyHealth return !tech.isEnergyHealth && !tech.isNoHeals
}, },
requires: "not mass-energy equivalence", requires: "not mass-energy equivalence, ergodicity",
effect() { effect() {
tech.isHealthRecovery = true; tech.isHealthRecovery = true;
}, },
@@ -2027,9 +2028,9 @@
frequency: 1, frequency: 1,
isHealTech: true, isHealTech: true,
allowed() { allowed() {
return !tech.isEnergyHealth && tech.damageFromTech() > 1 return !tech.isEnergyHealth && tech.damageFromTech() > 1 && !tech.isNoHeals
}, },
requires: "some increased damage, not mass-energy equivalence", requires: "some increased damage, not mass-energy equivalence, ergodicity",
effect() { effect() {
tech.healthDrain += 0.03; tech.healthDrain += 0.03;
}, },
@@ -2059,9 +2060,9 @@
count: 0, count: 0,
frequency: 1, frequency: 1,
allowed() { allowed() {
return !tech.isEnergyHealth return !tech.isEnergyHealth && !tech.isNoHeals
}, },
requires: "not mass-energy equivalence", requires: "not mass-energy equivalence, ergodicity",
effect() { effect() {
tech.bonusHealth += 0.5 tech.bonusHealth += 0.5
m.addHealth(0.50) m.addHealth(0.50)
@@ -2079,9 +2080,9 @@
count: 0, count: 0,
frequency: 1, frequency: 1,
allowed() { allowed() {
return !tech.isEnergyHealth && !tech.isDroneGrab return !tech.isEnergyHealth && !tech.isDroneGrab && !tech.isNoHeals
}, },
requires: "not mass-energy equivalence, not drone harvester", requires: "not mass-energy equivalence, not drone harvester, ergodicity",
effect() { effect() {
tech.isArmorFromPowerUps = true; //tracked by tech.armorFromPowerUps tech.isArmorFromPowerUps = true; //tracked by tech.armorFromPowerUps
}, },
@@ -2114,9 +2115,9 @@
frequency: 1, frequency: 1,
isHealTech: true, isHealTech: true,
allowed() { allowed() {
return m.health > 0.1 && (m.maxHealth > 1 || tech.isArmorFromPowerUps) return m.health > 0.1 && (m.maxHealth > 1 || tech.isArmorFromPowerUps) && !tech.isNoHeals
}, },
requires: "increased max health", requires: "increased max health, not ergodicity",
effect() { effect() {
tech.isHealLowHealth = true; tech.isHealLowHealth = true;
}, },
@@ -2131,9 +2132,9 @@
frequency: 1, frequency: 1,
isHealTech: true, isHealTech: true,
allowed() { allowed() {
return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth && !tech.isNoHeals
}, },
requires: "not mass-energy equivalence", requires: "not mass-energy equivalence, ergodicity",
effect() { effect() {
tech.largerHeals++; tech.largerHeals++;
}, },
@@ -2149,9 +2150,9 @@
frequency: 1, frequency: 1,
isNonRefundable: true, isNonRefundable: true,
allowed() { allowed() {
return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isNoHeals
}, },
requires: "", requires: "health > 70%, not ergodicity",
effect() { effect() {
for (let i = 0; i < 12; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal"); for (let i = 0; i < 12; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal");
for (let i = 0, len = tech.tech.length; i < len; i++) { for (let i = 0, len = tech.tech.length; i < len; i++) {
@@ -2335,7 +2336,7 @@
allowed() { allowed() {
return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste
}, },
requires: "not superdeterminism or Ψ(t) collapse<br>no research", requires: "not superdeterminism or Ψ(t) collapse, no research",
effect: () => { effect: () => {
tech.manyWorlds = true; tech.manyWorlds = true;
}, },
@@ -2650,28 +2651,6 @@
remove() { remove() {
tech.isMineDrop = false; tech.isMineDrop = false;
} }
}, {
name: "dark patterns",
description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>18</strong> <strong class='color-j'>JUNK</strong> <strong class='color-m'>tech</strong> to the potential pool",
maxCount: 1,
count: 0,
frequency: 1,
allowed() {
return level.onLevel < 8 && level.onLevel > 0
},
requires: "between levels 1 and 7",
effect() {
level.difficultyDecrease(simulation.difficultyMode)
simulation.makeTextLog(`simulation.difficultyMode<span class='color-symbol'>--</span>`)
tech.addJunkTechToPool(18)
// for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i])
},
remove() {
if (this.count > 0) {
tech.removeJunkTechFromPool(18)
level.difficultyIncrease(simulation.difficultyMode)
}
}
}, { }, {
name: "unified field theory", name: "unified field theory",
description: `in the <strong>pause</strong> menu, change your <strong class='color-f'>field</strong><br>by <strong>clicking</strong> on your <strong class='color-f'>field's</strong> box`, description: `in the <strong>pause</strong> menu, change your <strong class='color-f'>field</strong><br>by <strong>clicking</strong> on your <strong class='color-f'>field's</strong> box`,
@@ -2792,6 +2771,50 @@
for (let i = 0; i < 5; i++) powerUps.removeRandomTech() for (let i = 0; i < 5; i++) powerUps.removeRandomTech()
} }
}, },
{
name: "dark patterns",
description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>18</strong> <strong class='color-j'>JUNK</strong> <strong class='color-m'>tech</strong> to the potential pool",
maxCount: 1,
count: 0,
frequency: 1,
allowed() {
return level.onLevel < 8 && level.onLevel > 0
},
requires: "between levels 1 and 7",
effect() {
level.difficultyDecrease(simulation.difficultyMode)
simulation.makeTextLog(`simulation.difficultyMode <span class='color-symbol'>--</span>`)
tech.addJunkTechToPool(18)
// for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i])
},
remove() {
if (this.count > 0) {
tech.removeJunkTechFromPool(18)
level.difficultyIncrease(simulation.difficultyMode)
}
}
}, {
name: "ergodicity",
description: "reduce combat <strong>difficulty</strong> by <strong>2 levels</strong><br>all <strong class='color-h'>healing</strong> has <strong>no</strong> effect",
maxCount: 1,
count: 0,
frequency: 1,
allowed() {
return level.onLevel > 1
},
requires: "past levels 1",
effect() {
tech.isNoHeals = true;
level.difficultyDecrease(simulation.difficultyMode * 2)
simulation.makeTextLog(`simulation.difficultyMode <span class='color-symbol'>-=</span> 2`)
},
remove() {
tech.isNoHeals = false;
if (this.count > 0) {
level.difficultyIncrease(simulation.difficultyMode * 2)
}
}
},
//************************************************** //**************************************************
//************************************************** gun //************************************************** gun
//************************************************** tech //************************************************** tech
@@ -3053,7 +3076,7 @@
allowed() { allowed() {
return (tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + tech.isNailShot + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce)) * 2 > 1) && !tech.isIceCrystals return (tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + tech.isNailShot + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce)) * 2 > 1) && !tech.isIceCrystals
}, },
requires: "nails, rivets, nonceramic needles, not ice crystals", requires: "nails, rivets, not ceramic needles, not ice crystals",
effect() { effect() {
tech.isNailRadiation = true; tech.isNailRadiation = true;
}, },
@@ -3606,7 +3629,7 @@
} }
}, { }, {
name: "reduced tolerances", name: "reduced tolerances",
description: "reduce all <strong>drone</strong> production costs by <strong>66%</strong><br>reduce the average <strong>drone</strong> lifetime by <strong>45%</strong>", description: "reduce all <strong>drone</strong> production costs by <strong>66%</strong><br>reduce the average <strong>drone</strong> lifetime by <strong>40%</strong>",
isGunTech: true, isGunTech: true,
maxCount: 3, maxCount: 3,
count: 0, count: 0,
@@ -3616,7 +3639,7 @@
}, },
requires: "drones", requires: "drones",
effect() { effect() {
tech.droneCycleReduction = Math.pow(0.55, 1 + this.count) tech.droneCycleReduction = Math.pow(0.6, 1 + this.count)
tech.droneEnergyReduction = Math.pow(0.333, 1 + this.count) tech.droneEnergyReduction = Math.pow(0.333, 1 + this.count)
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * Math.pow(3, this.count) if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * Math.pow(3, this.count)
@@ -3923,7 +3946,7 @@
allowed() { allowed() {
return tech.haveGunCheck("laser") && tech.isWideLaser return tech.haveGunCheck("laser") && tech.isWideLaser
}, },
requires: "laser, not specular reflection<br>not diffraction grating", requires: "laser, not specular reflection, not diffraction grating",
effect() { effect() {
tech.wideLaser += 2 tech.wideLaser += 2
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
@@ -4707,9 +4730,29 @@
// }, // },
// remove() {} // remove() {}
// }, // },
{
name: "disintegrated armament",
description: "spawn a <strong class='color-g'>gun</strong><br><strong>remove</strong> your active <strong class='color-g'>gun</strong>",
maxCount: 1,
count: 0,
frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return b.inventory.length > 0
},
requires: "at least 1 gun",
effect() {
if (b.activeGun && b.inventory.length > 0) b.removeGun(b.guns[b.activeGun].name)
simulation.makeGunHUD()
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "gun");
},
remove() {}
},
{ {
name: "probability", name: "probability",
description: "increase the <strong class='flicker'>frequency</strong><br>of a random <strong class='color-m'>tech</strong> by <strong>100</strong>", description: "increase the <strong class='flicker'>frequency</strong><br>of one random <strong class='color-m'>tech</strong> by <strong>100</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -4871,6 +4914,30 @@
document.getElementById("health-bg").style.left = "86px" document.getElementById("health-bg").style.left = "86px"
}, },
remove() {} remove() {}
}, {
name: "repartitioning",
description: "set the <strong class='flicker'>frequency</strong> of finding normal <strong class='color-m'>tech</strong> to <strong>0</strong><br>spawn 5 <strong class='color-m'>tech</strong>",
maxCount: 1,
count: 0,
frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0, len = tech.tech.length; i < len; i++) {
if (tech.tech[i].isJunk) {
tech.tech[i].frequency = 1
} else {
tech.tech[i].frequency = 0
}
}
for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x, m.pos.y, "tech");
},
remove() {}
}, { }, {
name: "defragment", name: "defragment",
description: "set the <strong class='flicker'>frequency</strong> of finding <strong class='color-j'>JUNK</strong> <strong class='color-m'>tech</strong> to zero", description: "set the <strong class='flicker'>frequency</strong> of finding <strong class='color-j'>JUNK</strong> <strong class='color-m'>tech</strong> to zero",
@@ -5825,5 +5892,6 @@
isMetaAnalysis: null, isMetaAnalysis: null,
isFoamAttract: null, isFoamAttract: null,
droneCycleReduction: null, droneCycleReduction: null,
droneEnergyReduction: null droneEnergyReduction: null,
isNoHeals: null
} }

View File

@@ -300,13 +300,29 @@ summary {
.experiment-grid-disabled { .experiment-grid-disabled {
/* opacity: 0.5; */ /* opacity: 0.5; */
background-color: var(--build-bg-color); background-color: var(--build-bg-color);
color: rgba(0, 0, 0, 0.2); /* color: rgba(0, 0, 0, 0.9); */
color: #000;
opacity: 0.25;
/* transition: background-color 1s, color 1s; */ /* transition: background-color 1s, color 1s; */
} }
.experiment-grid-disabled:hover { .experiment-grid-disabled[data-descr] {
/* background-color: #fff; */ position: relative;
/* opacity: 0; */
}
.experiment-grid-disabled[data-descr]:hover::after {
content: '\a \00a0 \00a0 \00a0 REQUIRES:\a''\00a0 \00a0 \00a0 'attr(data-descr);
white-space: pre-wrap;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: var(--build-bg-color); background-color: var(--build-bg-color);
z-index: 1;
opacity: 1;
transition: opacity 0.5s ease;
} }
#info { #info {

View File

@@ -1,8 +1,8 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
fixed and renamed the new drone tech (it wasn't working right) tech requirement info UI updated in experiment mode
level bosses will do about 50% less damage on collisions, but they will take about 33% more to kill tech: ergodicity - remove heal power ups and heal tech, reduce difficulty by 2 levels
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
@@ -36,13 +36,22 @@ fix door.isOpen actually meaning isClosed?
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
damage circles when you have MEE should be field color reset on experiment menu should clear power ups and bullets
give pulsars attraction if with in distance range
should blocks block mob vision?
mobs will attack player in the starting room though...
Matter.Query.ray(map, this.position, this.mPosRange()).length === 0 &&
Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 &&
mob vision: look at player history mob vision: look at player history
build a new type of attraction for mobs build a new type of attraction for mobs
if mobs can't see player, they check to see if they can see where the player was in the history if mobs can't see player, they check to see if they can see where the player was in the history
if mobs can't see player, they could check to see if they can find player in the past if mobs can't see player, they could check to see if they can find player in the past
https://abitawake.com/news/articles/enemy-ai-chasing-a-player-without-navigation2d-or-a-star-pathfinding https://abitawake.com/news/articles/enemy-ai-chasing-a-player-without-navigation2d-or-a-star-pathfinding
write find in spawn undo exploder, but commented out
tech: chitin - take 50% less damage, reduce harm reduction by 5% after each collision tech: chitin - take 50% less damage, reduce harm reduction by 5% after each collision
@@ -308,7 +317,6 @@ n-gon outreach ideas
possible names for tech possible names for tech
strange loop strange loop
perturbation theory
holonomy - parallel transport of a vector leads to movement (applies to curved space) holonomy - parallel transport of a vector leads to movement (applies to curved space)
hypergolic - A hypergolic propellant combination used in a rocket engine is one whose components spontaneously ignite when they come into contact with each other. hypergolic - A hypergolic propellant combination used in a rocket engine is one whose components spontaneously ignite when they come into contact with each other.
uncertainty principle uncertainty principle