flip-flop

tech: flip-flip - does nothing, except toggle on collisions
tech: NOR gate - when flip-flip is ON take 0 harm from collisions
tech: NAND gate - when flip-flip is ON do 55.5% damage
tech: transistor - when flip-flop is ON regen 22 energy/s, when OFF drain 3.1 energy /s
tech: shift registers - set flip-flop to ON with a new level
This commit is contained in:
landgreen
2021-02-28 08:03:47 -08:00
parent 542815478e
commit e3ef0f00e3
11 changed files with 252 additions and 181 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -2446,7 +2446,7 @@ const b = {
// lookFrequency: 56 + Math.floor(17 * Math.random()) - isUpgraded * 20, // lookFrequency: 56 + Math.floor(17 * Math.random()) - isUpgraded * 20,
lastLookCycle: simulation.cycle + 60 * Math.random(), lastLookCycle: simulation.cycle + 60 * Math.random(),
acceleration: 0.005 * (1 + 0.5 * Math.random()), acceleration: 0.005 * (1 + 0.5 * Math.random()),
range: 70 * (1 + 0.3 * Math.random()), range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(),
endCycle: Infinity, endCycle: Infinity,
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
@@ -2497,7 +2497,7 @@ const b = {
lookFrequency: 70, lookFrequency: 70,
cd: 0, cd: 0,
delay: 90, delay: 90,
range: 80, range: 70 + 3 * b.totalBots(),
endCycle: Infinity, endCycle: Infinity,
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
@@ -2552,7 +2552,7 @@ const b = {
cd: 0, cd: 0,
delay: 100, delay: 100,
acceleration: 0.005 * (1 + 0.5 * Math.random()), acceleration: 0.005 * (1 + 0.5 * Math.random()),
range: 70 * (1 + 0.3 * Math.random()), range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(),
endCycle: Infinity, endCycle: Infinity,
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
@@ -2602,7 +2602,7 @@ const b = {
frictionAir: 0.008 * (1 + 0.3 * Math.random()), frictionAir: 0.008 * (1 + 0.3 * Math.random()),
restitution: 0.5 * (1 + 0.5 * Math.random()), restitution: 0.5 * (1 + 0.5 * Math.random()),
acceleration: 0.0015 * (1 + 0.3 * Math.random()), acceleration: 0.0015 * (1 + 0.3 * Math.random()),
playerRange: 150 + Math.floor(30 * Math.random()), playerRange: 140 + Math.floor(30 * Math.random()) + 2 * b.totalBots(),
offPlayer: { offPlayer: {
x: 0, x: 0,
y: 0, y: 0,
@@ -2613,7 +2613,7 @@ const b = {
range: (700 + 400 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()), range: (700 + 400 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()),
drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4, drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4,
drain: 0.56 - 0.42 * tech.isLaserBotUpgrade, drain: 0.56 - 0.42 * tech.isLaserBotUpgrade,
laserDamage: 0.55 + 0.39 * tech.isLaserBotUpgrade, laserDamage: 0.6 + 0.43 * tech.isLaserBotUpgrade,
endCycle: Infinity, endCycle: Infinity,
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
@@ -2653,9 +2653,10 @@ const b = {
} }
//randomize position relative to player //randomize position relative to player
if (Math.random() < 0.15) { if (Math.random() < 0.15) {
const range = 110 + 4 * b.totalBots()
this.offPlayer = { this.offPlayer = {
x: 120 * (Math.random() - 0.5), x: range * (Math.random() - 0.5),
y: 120 * (Math.random() - 0.5) - 20, y: range * (Math.random() - 0.5) - 20,
} }
} }
} }

View File

@@ -108,20 +108,21 @@ function collisionChecks(event) {
m.damage(dmg); m.damage(dmg);
return return
} }
if (tech.isFlipFlop) {
if (tech.isFlipFlopHarm) { if (tech.isFlipFlopOn) {
if (!tech.isFlipFlopHarmImmune) { tech.isFlipFlopOn = false
tech.isFlipFlopHarmImmune = true if (document.getElementById("tech-flip-flop")) document.getElementById("tech-flip-flop").innerHTML = ` = <strong>OFF</strong>`
if (document.getElementById("tech-flip-flop")) document.getElementById("tech-flip-flop").innerHTML = ` = <strong>on</strong>` m.eyeFillColor = 'transparent'
m.damage(dmg * 1.25); //damage triggers immune to next hit with extra 10% damage if (!tech.isFlipFlopHarm) m.damage(dmg);
} else { } else {
tech.isFlipFlopHarmImmune = false //immune to damage this hit, lose immunity for next hit tech.isFlipFlopOn = true //immune to damage this hit, lose immunity for next hit
if (document.getElementById("tech-flip-flop")) document.getElementById("tech-flip-flop").innerHTML = ` = <strong>off</strong>` if (document.getElementById("tech-flip-flop")) document.getElementById("tech-flip-flop").innerHTML = ` = <strong>ON</strong>`
m.eyeFillColor = m.fieldMeterColor //'#0cf'
m.damage(dmg);
} }
} else { } else {
m.damage(dmg); //normal damage m.damage(dmg); //normal damage
} }
if (tech.isPiezo) m.energy += 20.48; if (tech.isPiezo) m.energy += 20.48;
if (tech.isBayesian) powerUps.ejectTech() if (tech.isBayesian) powerUps.ejectTech()
if (mob[k].onHit) mob[k].onHit(k); if (mob[k].onHit) mob[k].onHit(k);

View File

@@ -31,7 +31,7 @@ const level = {
// tech.giveTech("missile-bot") // tech.giveTech("missile-bot")
// for (let i = 0; i < 5; i++) // for (let i = 0; i < 5; i++)
// tech.giveTech("nail-bot") // tech.giveTech("nail-bot")
// for (let i = 0; i < 2; i++) tech.giveTech("foam-bot") // for (let i = 0; i < 54; i++) tech.giveTech("foam-bot")
// for (let i = 0; i < 15; i++) tech.giveTech("plasma jet") // for (let i = 0; i < 15; i++) tech.giveTech("plasma jet")
// tech.isBlockPowerUps = true; // tech.isBlockPowerUps = true;
// m.shipMode() // m.shipMode()
@@ -56,10 +56,10 @@ const level = {
// level.basement(); //fan level // level.basement(); //fan level
// level.stronghold() //fan level // level.stronghold() //fan level
// for (let i = 0; i < 150; i++) tech.addLoreTechToPool(); for (let i = 0; i < 150; i++) tech.addLoreTechToPool();
// powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "tech"); // powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "tech");
// tech.giveTech("undefined") // tech.giveTech("undefined")
// lore.techCount = 10 // lore.techCount = 7
// localSettings.loreCount = 1; // localSettings.loreCount = 1;
// simulation.isCheating = false //true; // simulation.isCheating = false //true;
// localSettings.loreCount = 1; // localSettings.loreCount = 1;
@@ -95,31 +95,25 @@ const level = {
simulation.makeTextLog(`simulation.amplitude <span class='color-symbol'>=</span> ${Math.random()}`); simulation.makeTextLog(`simulation.amplitude <span class='color-symbol'>=</span> ${Math.random()}`);
m.switchWorlds() m.switchWorlds()
simulation.trails() simulation.trails()
for (let i = 0; i < 2; i++) powerUps.spawn(m.pos.x + Math.random() * 10, m.pos.y + Math.random() * 10, "tech", false); for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "tech", false);
} }
if (tech.isHealLowHealth) { if (tech.isHealLowHealth) {
const len = Math.floor((m.maxHealth - m.health) / 0.5) const len = Math.floor((m.maxHealth - m.health) / 0.5)
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false);
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal", false);
// powerUps.heal.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), 50);
}
} }
if (tech.isPerpetualReroll) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "research", false); if (tech.isPerpetualReroll) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "research", false);
if (tech.isPerpetualAmmo) { if (tech.isPerpetualAmmo) {
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo", false); for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "ammo", false);
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo", false);
} }
if (tech.isPerpetualHeal) { if (tech.isPerpetualHeal) {
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal", false); for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false);
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal", false);
} }
if (tech.isPerpetualStun) { if (tech.isPerpetualStun) {
for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 780) for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 780)
} }
if (tech.isFlipFlopHarm && tech.isFlipFlopLevelReset && !tech.isFlipFlopHarmImmune) { if (tech.isFlipFlopHarm && tech.isFlipFlopLevelReset && !tech.isFlipFlopOn) {
tech.isFlipFlopHarmImmune = true tech.isFlipFlopOn = true
// if (document.getElementById("tech-flip-flop")) document.getElementById("tech-flip-flop").innerHTML = ` = <strong>on</strong>` simulation.makeTextLog(`tech.isFlipFlopOn <span class='color-symbol'>=</span> true`);
simulation.makeTextLog(`tech.isFlipFlopHarmImmune <span class='color-symbol'>=</span> true`);
} }
}, },
custom() {}, custom() {},

View File

@@ -1,5 +1,6 @@
const lore = { const lore = {
techCount: 0, techCount: 0,
techGoal: 7,
talkingColor: "#dff", //set color of graphic on level.null talkingColor: "#dff", //set color of graphic on level.null
anand: { anand: {
color: "#e0c", color: "#e0c",

View File

@@ -46,6 +46,7 @@ const m = {
lastHarmCycle: 0, lastHarmCycle: 0,
width: 50, width: 50,
radius: 30, radius: 30,
eyeFillColor: null,
fillColor: null, //set by setFillColors fillColor: null, //set by setFillColors
fillColorDark: null, //set by setFillColors fillColorDark: null, //set by setFillColors
color: { color: {
@@ -498,7 +499,7 @@ const m = {
if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.25 : 1.25 if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.25 : 1.25
if (tech.healthDrain) dmg *= 1 + 2.667 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage if (tech.healthDrain) dmg *= 1 + 2.667 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage
if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage
if (tech.isBlockHarm && m.isHolding) dmg *= 0.2 if (tech.isBlockHarm && m.isHolding) dmg *= 0.15
if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.0185, 0.55) if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.0185, 0.55)
if (tech.isSlowFPS) dmg *= 0.8 if (tech.isSlowFPS) dmg *= 0.8
// if (tech.isPiezo) dmg *= 0.85 // if (tech.isPiezo) dmg *= 0.85
@@ -822,10 +823,12 @@ const m = {
ctx.strokeStyle = "#333"; ctx.strokeStyle = "#333";
ctx.lineWidth = 2; ctx.lineWidth = 2;
ctx.stroke(); ctx.stroke();
// draw eye; used in flip-flop
// ctx.beginPath(); // ctx.beginPath();
// ctx.arc(15, 0, 3, 0, 2 * Math.PI); // ctx.arc(15, 0, 3, 0, 2 * Math.PI);
// ctx.fillStyle = '#0cf'; // 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
}, },
@@ -879,6 +882,7 @@ const m = {
if (m.energy < m.maxEnergy) m.energy = m.maxEnergy; if (m.energy < m.maxEnergy) m.energy = m.maxEnergy;
m.fieldRegen = tech.energyRegen; //0.001 m.fieldRegen = tech.energyRegen; //0.001
m.fieldMeterColor = "#0cf" m.fieldMeterColor = "#0cf"
m.eyeFillColor = m.fieldMeterColor
m.fieldShieldingScale = 1; m.fieldShieldingScale = 1;
m.fieldBlockCD = 10; m.fieldBlockCD = 10;
m.fieldHarmReduction = 1; m.fieldHarmReduction = 1;
@@ -1559,6 +1563,7 @@ const m = {
m.fieldFire = true; m.fieldFire = true;
m.holdingMassScale = 0.03; //can hold heavier blocks with lower cost to jumping m.holdingMassScale = 0.03; //can hold heavier blocks with lower cost to jumping
m.fieldMeterColor = "#000" m.fieldMeterColor = "#000"
m.eyeFillColor = m.fieldMeterColor
m.fieldHarmReduction = 0.5; m.fieldHarmReduction = 0.5;
m.fieldDrawRadius = 0; m.fieldDrawRadius = 0;
@@ -1676,6 +1681,7 @@ const m = {
description: "use <strong class='color-f'>energy</strong> to emit short range <strong class='color-plasma'>plasma</strong><br><strong class='color-d'>damages</strong> and <strong>pushes</strong> mobs away", description: "use <strong class='color-f'>energy</strong> to emit short range <strong class='color-plasma'>plasma</strong><br><strong class='color-d'>damages</strong> and <strong>pushes</strong> mobs away",
effect() { effect() {
m.fieldMeterColor = "#f0f" m.fieldMeterColor = "#f0f"
m.eyeFillColor = m.fieldMeterColor
m.hold = function() { m.hold = function() {
b.isExtruderOn = false b.isExtruderOn = false
if (m.isHolding) { if (m.isHolding) {
@@ -1819,7 +1825,8 @@ const m = {
description: "<strong class='color-cloaked'>cloak</strong> after not using your gun or field<br>while <strong class='color-cloaked'>cloaked</strong> mobs can't see you<br>increase <strong class='color-d'>damage</strong> by <strong>133%</strong>", description: "<strong class='color-cloaked'>cloak</strong> after not using your gun or field<br>while <strong class='color-cloaked'>cloaked</strong> mobs can't see you<br>increase <strong class='color-d'>damage</strong> by <strong>133%</strong>",
effect: () => { effect: () => {
m.fieldFire = true; m.fieldFire = true;
m.fieldMeterColor = "#fff"; m.fieldMeterColor = "#000";
m.eyeFillColor = m.fieldMeterColor
m.fieldPhase = 0; m.fieldPhase = 0;
m.isCloak = false m.isCloak = false
m.fieldDamage = 2.33 // 1 + 111/100 m.fieldDamage = 2.33 // 1 + 111/100
@@ -1944,11 +1951,11 @@ const m = {
const yOff = m.pos.y - 50 const yOff = m.pos.y - 50
ctx.fillStyle = "rgba(0, 0, 0, 0.3)"; ctx.fillStyle = "rgba(0, 0, 0, 0.3)";
ctx.fillRect(xOff, yOff, 60 * m.maxEnergy, 10); ctx.fillRect(xOff, yOff, 60 * m.maxEnergy, 10);
ctx.fillStyle = m.fieldMeterColor; ctx.fillStyle = "#fff";
ctx.fillRect(xOff, yOff, 60 * m.energy, 10); ctx.fillRect(xOff, yOff, 60 * m.energy, 10);
ctx.beginPath() ctx.beginPath()
ctx.rect(xOff, yOff, 60 * m.maxEnergy, 10); ctx.rect(xOff, yOff, 60 * m.maxEnergy, 10);
ctx.strokeStyle = "rgb(0, 0, 0)"; ctx.strokeStyle = m.fieldMeterColor;
ctx.lineWidth = 1; ctx.lineWidth = 1;
ctx.stroke(); ctx.stroke();
} }

View File

@@ -776,7 +776,14 @@ const simulation = {
//energy overfill //energy overfill
if (m.energy > m.maxEnergy) m.energy = m.maxEnergy + (m.energy - m.maxEnergy) * tech.overfillDrain //every second energy above max energy loses 25% if (m.energy > m.maxEnergy) m.energy = m.maxEnergy + (m.energy - m.maxEnergy) * tech.overfillDrain //every second energy above max energy loses 25%
if (tech.isFlipFlopEnergy) {
if (tech.isFlipFlopOn) {
m.energy += 0.22;
} else {
m.energy -= 0.031;
if (m.energy < 0) m.energy = 0
}
}
if (m.pos.y > simulation.fallHeight) { // if 4000px deep if (m.pos.y > simulation.fallHeight) { // if 4000px deep
Matter.Body.setVelocity(player, { Matter.Body.setVelocity(player, {
x: 0, x: 0,

View File

@@ -101,39 +101,62 @@ const spawn = {
// spawn.shield(me, x, y, 1); // spawn.shield(me, x, y, 1);
me.onDeath = function() { me.onDeath = function() {
//add lore level as next level if player took lore tech earlier in the game //add lore level as next level if player took lore tech earlier in the game
if (lore.techCount > 9 && !simulation.isCheating) { if (lore.techCount > (lore.techGoal - 1) && !simulation.isCheating) {
level.levels.push("null") level.levels.push("null")
level.exit.x = 5500; level.exit.x = 5500;
level.exit.y = -330; level.exit.y = -330;
simulation.makeTextLog(`<span class="lore-text">undefined</span> <span class='color-symbol'>=</span> ${lore.techCount}/10<br>level.levels.push("null")`); simulation.makeTextLog(`<span class="lore-text">undefined</span> <span class='color-symbol'>=</span> ${lore.techCount}/${lore.techGoal}<br>level.levels.push("null")`);
//remove block map element so exit is clear //remove block map element so exit is clear
Matter.World.remove(engine.world, map[map.length - 1]); Matter.World.remove(engine.world, map[map.length - 1]);
map.splice(map.length - 1, 1); map.splice(map.length - 1, 1);
simulation.draw.setPaths(); //redraw map draw path simulation.draw.setPaths(); //redraw map draw path
} else { } else {
//reset game //reset game
setTimeout(() => { let count = 0
simulation.makeTextLog(`simulation.complete()`);
let delay = 2000 function loop() {
for (let i = 0; i < 1; i += 0.01 + 0.2 * Math.random() * Math.random()) { if (!simulation.paused) {
setTimeout(function() { count++
simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> ${(i).toFixed(3)}`); if (count < 600) {
}, delay); if (!(count % 60)) simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> ${(count/60- Math.random()).toFixed(3)}`);
delay += 1000 } else if (count === 600) {
simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> 1`);
} else if (count === 720) {
simulation.makeTextLog(`<span class="lore-text">undefined</span> <span class='color-symbol'>=</span> ${lore.techCount}/${lore.techGoal}`)
} else if (count === 900) {
simulation.makeTextLog(`World.clear(engine.world)`);
} else if (count === 1140) {
m.death()
return
}
} }
setTimeout(function() { if (!simulation.testing) requestAnimationFrame(loop);
simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> 1`); }
setTimeout(() => { requestAnimationFrame(loop);
simulation.makeTextLog(`<span class="lore-text">undefined</span> <span class='color-symbol'>=</span> ${lore.techCount}/10`);
setTimeout(() => { // setTimeout(() => {
if (!simulation.paused && !simulation.testing) { // if (simulation.paused || simulation.testing) isEnding = false
simulation.makeTextLog(`World.clear(engine.world)`); // simulation.makeTextLog(`simulation.complete()`);
setTimeout(() => { m.death() }, 4000); // let delay = 2000
} // for (let i = 0; i < 1; i += 0.01 + 0.2 * Math.random() * Math.random()) {
}, 3000); // setTimeout(function() {
}, 2000); // if (!simulation.paused && !simulation.testing) simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> ${(i).toFixed(3)}`);
}, delay); // }, delay);
}, 5000); // delay += 1000
// }
// setTimeout(function() {
// if (isEnding) simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> 1`);
// setTimeout(() => {
// if (isEnding) simulation.makeTextLog(`<span class="lore-text">undefined</span> <span class='color-symbol'>=</span> ${lore.techCount}/10`);
// setTimeout(() => {
// if (isEnding) {
// if (isEnding) simulation.makeTextLog(`World.clear(engine.world)`);
// setTimeout(() => { if (isEnding) m.death() }, 4000);
// }
// }, 3000);
// }, 2000);
// }, delay);
// }, 5000);
} }
//ramp up damage //ramp up damage
for (let i = 0; i < 3; i++) level.difficultyIncrease(simulation.difficultyMode) for (let i = 0; i < 3; i++) level.difficultyIncrease(simulation.difficultyMode)

View File

@@ -95,7 +95,7 @@
haveGunCheck(name) { haveGunCheck(name) {
if ( if (
!build.isExperimentSelection && !build.isExperimentSelection &&
b.inventory > 2 && b.inventory.length > 2 &&
name !== b.guns[b.activeGun].name && name !== b.guns[b.activeGun].name &&
Math.random() > 2 - b.inventory.length * 0.5 Math.random() > 2 - b.inventory.length * 0.5
) { ) {
@@ -108,7 +108,7 @@
}, },
damageFromTech() { damageFromTech() {
let dmg = m.fieldDamage let dmg = m.fieldDamage
if (tech.isFlipFlopDamage && !tech.isFlipFlopHarmImmune) dmg *= 1.5 if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555
if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.37 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.37
if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.5 if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.5
if (tech.isTechDamage) dmg *= 2 if (tech.isTechDamage) dmg *= 2
@@ -602,9 +602,9 @@
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return 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)
}, },
requires: "an explosive damage source", requires: "an explosive damage source, not causality bombs",
effect: () => { effect: () => {
tech.isExplosionHarm = true; tech.isExplosionHarm = true;
}, },
@@ -1123,7 +1123,7 @@
}, },
{ {
name: "inelastic collision", name: "inelastic collision",
description: "while you are <strong>holding</strong> a <strong>block</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>80%</strong>", description: "while you are <strong>holding</strong> a <strong>block</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>85%</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1188,15 +1188,21 @@
}, },
{ {
name: "flip-flop", name: "flip-flop",
description: "take <strong>25%</strong> more <strong class='color-harm'>harm</strong> from a <strong>collision</strong><br>but, on your next <strong>collision</strong> take <strong>0</strong> <strong class='color-harm'>harm</strong>", description: `collisions set <strong>flip-flop</strong> to <strong class="color-flop">OFF</strong> when <strong class="color-flop">ON</strong>
<br>collisions set <strong>flip-flop</strong> to <strong class="color-flop">ON</strong> when <strong class="color-flop">OFF</strong>`,
// description: `<strong>collisions</strong> toggle flip-flop <strong>ON</strong> and <strong>OFF</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() {
if (document.getElementById("tech-flip-flop")) { if (document.getElementById("tech-flip-flop")) {
if (tech.isFlipFlopHarmImmune) { if (tech.isFlipFlopOn) {
document.getElementById("tech-flip-flop").innerHTML = ` = <strong>on</strong>` document.getElementById("tech-flip-flop").innerHTML = ` = <strong>ON</strong>`
m.eyeFillColor = m.fieldMeterColor //'#5af'
} else { } else {
document.getElementById("tech-flip-flop").innerHTML = ` = <strong>off</strong>` document.getElementById("tech-flip-flop").innerHTML = ` = <strong>OFF</strong>`
m.eyeFillColor = "transparent"
} }
} }
}, 100); }, 100);
@@ -1208,44 +1214,112 @@
}, },
requires: "", requires: "",
effect() { effect() {
tech.isFlipFlopHarm = true //do you have this tech tech.isFlipFlop = true //do you have this tech?
tech.isFlipFlopHarmImmune = false //are you immune to next collision? tech.isFlipFlopOn = true //what is the state of flip-Flop?
m.draw = () => {
ctx.fillStyle = m.fillColor;
m.walk_cycle += m.flipLegs * m.Vx;
//draw body
ctx.save();
ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5
ctx.translate(m.pos.x, m.pos.y);
m.calcLeg(Math.PI, -3);
m.drawLeg("#4a4a4a");
m.calcLeg(0, 0);
m.drawLeg("#333");
ctx.rotate(m.angle);
ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI);
let grd = ctx.createLinearGradient(-30, 0, 30, 0);
grd.addColorStop(0, m.fillColorDark);
grd.addColorStop(1, m.fillColor);
ctx.fillStyle = grd;
ctx.fill();
ctx.arc(15, 0, 4, 0, 2 * Math.PI);
ctx.strokeStyle = "#333";
ctx.lineWidth = 2;
ctx.stroke();
//draw eye
ctx.beginPath();
ctx.arc(15, 0, 3, 0, 2 * Math.PI);
ctx.fillStyle = m.eyeFillColor;
ctx.fill()
ctx.restore();
m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
}
}, },
remove() { remove() {
tech.isFlipFlopHarm = false tech.isFlipFlop = false
tech.isFlipFlopHarmImmune = false tech.isFlipFlopOn = false
}
},
{
name: "NAND gate",
description: "set <strong>flip-flip</strong> to the <strong>on</strong> state at start of a <strong>level</strong><br><em>take 0 harm on your next collision</em>",
maxCount: 1,
count: 0,
allowed() {
return tech.isFlipFlopHarm
},
requires: "flip-flop",
effect() {
tech.isFlipFlopLevelReset = true;
},
remove() {
tech.isFlipFlopLevelReset = true;
} }
}, },
{ {
name: "NOR gate", name: "NOR gate",
description: "do <strong>50%</strong> more <strong class='color-d'>damage</strong><br>while <strong>flip-flip</strong> is in the <strong>off</strong> state", description: "if <strong>flip-flop</strong> is in the <strong class='color-flop'>ON</strong> state<br>take <strong>0</strong> <strong class='color-harm'>harm</strong> from collisions with mobs",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return tech.isFlipFlopHarm return tech.isFlipFlop
},
requires: "flip-flop",
effect() {
tech.isFlipFlopHarm = true //do you have this tech
},
remove() {
tech.isFlipFlopHarm = false
}
},
{
name: "NAND gate",
description: "if <strong>flip-flop</strong> is in the <strong class='color-flop'>ON</strong> state<br>do <strong>55.5%</strong> more <strong class='color-d'>damage</strong>",
maxCount: 1,
count: 0,
allowed() {
return tech.isFlipFlop
}, },
requires: "flip-flop", requires: "flip-flop",
effect() { effect() {
tech.isFlipFlopDamage = true; tech.isFlipFlopDamage = true;
}, },
remove() { remove() {
tech.isFlipFlopDamage = true; tech.isFlipFlopDamage = false;
}
},
{
name: "transistor",
description: "if <strong>flip-flop</strong> is <strong class='color-flop'>ON</strong> regen <strong>22</strong> <strong class='color-f'>energy</strong> per second<br>if <strong>flip-flop</strong> is <strong class='color-flop'>OFF</strong> drain <strong>3.1</strong> <strong class='color-f'>energy</strong> per second",
maxCount: 1,
count: 0,
allowed() {
return tech.isFlipFlop
},
requires: "flip-flop",
effect() {
tech.isFlipFlopEnergy = true;
},
remove() {
tech.isFlipFlopEnergy = false;
}
},
{
name: "shift registers",
description: "set <strong>flip-flop</strong> to the <strong class='color-flop'>ON</strong> state<br>at the start of a <strong>level</strong>",
maxCount: 1,
count: 0,
allowed() {
return tech.isFlipFlopEnergy || tech.isFlipFlopDamage || tech.isFlipFlopHarm
},
requires: "2 flip-flop techs",
effect() {
tech.isFlipFlopLevelReset = true;
},
remove() {
tech.isFlipFlopLevelReset = false;
} }
}, },
{ {
@@ -1369,7 +1443,7 @@
maxCount: 3, maxCount: 3,
count: 0, count: 0,
allowed() { allowed() {
return tech.isRewindAvoidDeath || tech.isRewindEnergy return tech.isRewindAvoidDeath
}, },
requires: "CPT", requires: "CPT",
effect() { effect() {
@@ -1385,9 +1459,9 @@
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return tech.isRewindAvoidDeath return !tech.isExplosionHarm && tech.isRewindAvoidDeath
}, },
requires: "CPT", requires: "CPT, not acetone peroxide",
effect() { effect() {
tech.isRewindGrenade = true; tech.isRewindGrenade = true;
}, },
@@ -2108,7 +2182,7 @@
}, },
{ {
name: "replication", name: "replication",
description: "<strong>7%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>add <strong>11</strong> junk <strong class='color-m'>tech</strong> to the potential pool", description: "<strong>7%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>add <strong>12</strong> junk <strong class='color-m'>tech</strong> to the potential pool",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
allowed() { allowed() {
@@ -2118,7 +2192,7 @@
effect() { effect() {
tech.duplicateChance += 0.075 tech.duplicateChance += 0.075
simulation.draw.powerUp = simulation.draw.powerUpBonus //change power up draw simulation.draw.powerUp = simulation.draw.powerUpBonus //change power up draw
tech.addJunkTechToPool(11) tech.addJunkTechToPool(12)
tech.maxDuplicationEvent() tech.maxDuplicationEvent()
}, },
remove() { remove() {
@@ -2325,7 +2399,7 @@
}, },
{ {
name: "dark patterns", name: "dark patterns",
description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>16</strong> junk <strong class='color-m'>tech</strong> to the potential pool", description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>18</strong> junk <strong class='color-m'>tech</strong> to the potential pool",
maxCount: 1, maxCount: 1,
isNonRefundable: true, isNonRefundable: true,
isExperimentHide: true, isExperimentHide: true,
@@ -2337,7 +2411,7 @@
effect() { effect() {
level.difficultyDecrease(simulation.difficultyMode) level.difficultyDecrease(simulation.difficultyMode)
simulation.makeTextLog(`simulation.difficultyMode<span class='color-symbol'>--</span>`) simulation.makeTextLog(`simulation.difficultyMode<span class='color-symbol'>--</span>`)
tech.addJunkTechToPool(16) tech.addJunkTechToPool(18)
// for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i]) // for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i])
}, },
remove() {} remove() {}
@@ -4430,7 +4504,7 @@
if (!simulation.isCheating) { if (!simulation.isCheating) {
tech.tech.push({ tech.tech.push({
name: `undefined`, name: `undefined`,
description: `${lore.techCount+1}/10<br><em>add copies of <strong>this</strong> to the potential <strong class='color-m'>tech</strong> pool</em>`, description: `${lore.techCount+1}/${lore.techGoal}<br><em>add copies of <strong class="lore-text">this</strong> to the potential <strong class='color-m'>tech</strong> pool</em>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
isLore: true, isLore: true,
@@ -4443,11 +4517,11 @@
effect() { effect() {
setTimeout(() => { //a short delay, I can't remember why setTimeout(() => { //a short delay, I can't remember why
lore.techCount++ lore.techCount++
if (lore.techCount > 9) { if (lore.techCount > lore.techGoal - 1) {
tech.removeLoreTechFromPool(); tech.removeLoreTechFromPool();
} else { } else {
for (let i = 0; i < tech.tech.length; i++) { //set name for all unchosen copies of this tech for (let i = 0; i < tech.tech.length; i++) { //set name for all unchosen copies of this tech
if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech[i].description = `${lore.techCount+1}/10<br><em>add copies of <strong>this</strong> to the potential <strong class='color-m'>tech</strong> pool</em>` if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech[i].description = `${lore.techCount+1}/${lore.techGoal}<br><em>add copies of <strong class="lore-text">this</strong> to the potential <strong class='color-m'>tech</strong> pool</em>`
} }
for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool() for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool()
} }
@@ -5457,8 +5531,10 @@
isSwitchReality: null, isSwitchReality: null,
isResearchReality: null, isResearchReality: null,
isAnthropicDamage: null, isAnthropicDamage: null,
isFlipFlop: null,
isFlipFlopHarm: null, isFlipFlopHarm: null,
isFlipFlopHarmImmune: null, isFlipFlopOn: null,
isFlipFlopLevelReset: null, isFlipFlopLevelReset: null,
isFlipFlopDamage: null isFlipFlopDamage: null,
isFlipFlopEnergy: null
} }

View File

@@ -616,6 +616,12 @@ summary {
letter-spacing: 1px; letter-spacing: 1px;
} }
.color-flop {
text-decoration: underline;
font-weight: 100;
letter-spacing: -1px;
}
.faded { .faded {
opacity: 0.7; opacity: 0.7;
font-size: 90%; font-size: 90%;

105
todo.txt
View File

@@ -1,14 +1,19 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
possible bug fixes for the crouch lock bug tech: flip-flip - does nothing, except toggle on collisions
tech: NOR gate - when flip-flip is ON take 0 harm from collisions
tech: NAND gate - at the start of a level set flip-flop to "on" tech: NAND gate - when flip-flip is ON do 55.5% damage
tech: NOR gate - do 50% more damage when the flip-flop is in the "off" state tech: transistor - when flip-flop is ON regen 22 energy/s, when OFF drain 3.1 energy /s
tech: shift registers - set flip-flop to ON with a new level
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
mouse event e.which is deprecated
fix door.isOpen actually meaning isClosed?
(once for me, and a few times for discord) player gets stuck in crouch animation (once for me, and a few times for discord) player gets stuck in crouch animation
occured after rerolling a power up (which triggered a switchWorlds) occurred after rerolling a power up (which triggered a switchWorlds)
can't jump, move slow can't jump, move slow
m.crouch = false m.crouch = false
only fixed itself when you click fire (drones, so no recoil) only fixed itself when you click fire (drones, so no recoil)
@@ -42,12 +47,30 @@ use the floor of portal sensor on the player? to unstuck player
(repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping (repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
flip-flop: 13% dup chance while ON
tech- foam is attracted to mobs
use a gravitational attraction model?
could foam be attracted to other foam bullets too?
or foam is only attracted to foam bullets that are stuck to mobs
is this too computationally intense?
name - static cling
could also do bremsstrahlung radiation like damage on attachment
mobile requirements:
detect mobile, flip to landscape
detect no keyboard, no mouse
auto aim?
limit items to ones that don't require aiming?
tap screen regions to move (WASD)
reduce font size
tech: removes itself after a few levels tech: removes itself after a few levels
gives extra duplication for 2 levels, then removes all duplication gives extra duplication for 2 levels, then removes all duplication
use ship tech to make a mob mode use ship tech to make a mob mode
differences from ship to mob differences from ship to mob
graphics graphics
@@ -77,13 +100,6 @@ map: laboratory
portal + rotor + falling blocks = perpetual motion room portal + rotor + falling blocks = perpetual motion room
a button that spawns a heal. a button that spawns a heal.
mechanic: immune to next collision
track number of possible collisions, if number is > 0 immune and --
graphical indication? (recolor health bar while immune)
tech: after taking damage go immune to next collision
tech: at the start of each level go immune to 1 collision
copy time-like foam to other guns? copy time-like foam to other guns?
wave gun wave gun
shotgun shotgun
@@ -118,23 +134,10 @@ rename ?
health -> integrity, unity health -> integrity, unity
heal -> also integrity, unity heal -> also integrity, unity
mechanic: use gun swap as an active ability
this effect is spammable, so it needs a cost or a cooldown
tech:
trigger damage immunity for 3 seconds, but drain ammo
push away nearby mobs, but drain energy
produce ammo, but take 1 damage
bot: ice blast, long CD AOE freeze bot: ice blast, long CD AOE freeze
RPG default or tech: grenades detonate on your cursor / where your cursor was when they were fired RPG default or tech: grenades detonate on your cursor / where your cursor was when they were fired
tech: dodge chance for cloaking, harmonic fields, also pilot wave
20% chance up to 3 stacks, not additive
0.8^count
set to 100% harm reduction randomly
if (Math.random() < 0.2) damage *= 0;
in game console in game console
set highlighting rules set highlighting rules
m, tech, level are all highlighted m, tech, level are all highlighted
@@ -144,10 +147,6 @@ tech: time dilation - when you exit time dilation rewind to the state you entere
position, velocity, and health position, velocity, and health
no energy cost no energy cost
mob ability bombs/bullets that suck in player
tech that requires integrated armament
mechanic - Your energy regen is only active when field and gun have not been used for 5 seconds. mechanic - Your energy regen is only active when field and gun have not been used for 5 seconds.
be able to open up custom mode in the normal game be able to open up custom mode in the normal game
@@ -179,13 +178,6 @@ tech pilot wave: antigravity - blocks have no gravity for a few seconds after ex
maybe they bounce too? maybe they bounce too?
maybe they explode? maybe they explode?
bullet mechanic - a bullet that swims through the air
rotate the velocity vector towards the normalized facing vector
use the cross product > 0 to determine which direction to rotate the velocity
in custom make a top bar that is fixed
use media rules to make the layout look nice
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
@@ -217,26 +209,10 @@ new power up - increase damage and fire speed, for 15 seconds
how to indicate effect duration how to indicate effect duration
or just give the effect after picking up a reroll or just give the effect after picking up a reroll
tech "Solar Power": Energy regeneration is doubled while standing still
run in the 1 second check
mechanic - remove a random tech as a condition for picking up a really good mod
mechanic - do something for 2 seconds after firing
if (m.fireCDcycle + 120)
tech- do 50% more damage in close, but 50% less at a distance tech- do 50% more damage in close, but 50% less at a distance
code it like techisFarAwayDmg code it like techisFarAwayDmg
have these tech disable each other have these tech disable each other
tech- foam is attracted to mobs
use a gravitational attraction model?
could foam be attracted to other foam bullets too?
or foam is only attracted to foam bullets that are stuck to mobs
is this too computationally intense?
name - static cling
could also do bremsstrahlung radiation like damage on attachment
repeat map in vertical and horizontal space repeat map in vertical and horizontal space
or at least vertical space or at least vertical space
camera looks strange when you teleport player with a high velocity camera looks strange when you teleport player with a high velocity
@@ -262,12 +238,6 @@ look for tech that could update description text with count and tech is informat
can only use variables that change in effect() and remove() can only use variables that change in effect() and remove()
this.description = `<strong>8%</strong> chance to <strong>duplicate</strong> spawned <strong>power ups</strong><br><em>chance to duplicate = ${techduplicateChance}</em>` this.description = `<strong>8%</strong> chance to <strong>duplicate</strong> spawned <strong>power ups</strong><br><em>chance to duplicate = ${techduplicateChance}</em>`
mouse event e.which is deprecated
add some more computer / AI stuff to the level lore text
mechanic - shrink m.baseHealth in a tech or field
standing wave harmonics tech- push things away standing wave harmonics tech- push things away
push scales with mass up to about 4 push scales with mass up to about 4
has a 25% effect on shielded mobs? has a 25% effect on shielded mobs?
@@ -279,8 +249,6 @@ map element - player rotates a rotor that makes a platform go up or down
use mac automator to speed up your n-gon -> git sync use mac automator to speed up your n-gon -> git sync
fix door.isOpen actually meaning isClosed
level Boss: fractal Sierpiński triangle level Boss: fractal Sierpiński triangle
https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle
spawns a 1/2 size version of the boss, this version can also spawn a smaller version, but it is capped at some size level spawns a 1/2 size version of the boss, this version can also spawn a smaller version, but it is capped at some size level
@@ -301,20 +269,6 @@ give mobs more animal-like behaviors like rain world
mob: wall mounted guns / lasers mob: wall mounted guns / lasers
not part of randomized mob pool, customized to each level not part of randomized mob pool, customized to each level
atmosphere levels
change the pace, give the user a rest between combat
low or no combat, but more graphics
explore lore
find power ups in "wrecked" m representing previous simulations
how you could leave something in one simulation that effects a different simulation
Maybe some strange quantum physics principle.
add text for player thoughts?
simple puzzles
cool looking stuff
in the final level you see your self at the starting level, with the wires
you shoot your self to wake up?
nonaggressive mobs
level boss: fires a line intersection in a random direction every few seconds. level boss: fires a line intersection in a random direction every few seconds.
the last two intersections have a destructive laser between them. the last two intersections have a destructive laser between them.
@@ -409,6 +363,7 @@ chapter 3: why is the bot attacking things?
bots come in Infinite waves that increase game difficulty each wave bots come in Infinite waves that increase game difficulty each wave
only ending is testing mode + next level or player death only ending is testing mode + next level or player death
scientist have some lines in between each wave of mobs scientist have some lines in between each wave of mobs
after chapter 3 spawn nonaggressive mobs in future runs
chapter 4: no need to fight? chapter 4: no need to fight?
for some reason the AI started researching an escape, and began fighting its self. for some reason the AI started researching an escape, and began fighting its self.