diff --git a/img/planned obsolescence.webp b/img/planned obsolescence.webp
new file mode 100644
index 0000000..b47d928
Binary files /dev/null and b/img/planned obsolescence.webp differ
diff --git a/index.html b/index.html
index 02ba3f7..f4ad3af 100644
--- a/index.html
+++ b/index.html
@@ -47,123 +47,11 @@
training
-
@@ -1602,6 +1570,7 @@ const powerUps = {
// remove a random tech from the list of tech you have
tech.removeCount += tech.tech[choose].count
tech.tech[choose].remove();
+ tech.totalCount -= tech.tech[choose].count
tech.tech[choose].count = 0;
tech.tech[choose].isLost = true;
simulation.updateTechHUD();
@@ -1619,6 +1588,7 @@ const powerUps = {
}
// remove a random tech from the list of tech you have
tech.tech[choose].remove();
+ tech.totalCount -= tech.tech[choose].count
tech.removeCount += tech.tech[choose].count
tech.tech[choose].count = 0;
tech.tech[choose].isLost = true;
diff --git a/js/simulation.js b/js/simulation.js
index 0ae161f..f5298b2 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -830,6 +830,7 @@ const simulation = {
simulation.wipe = function () { //set wipe to normal
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
+ m.lastHit = 0
m.hole.isOn = false
simulation.paused = false;
engine.timing.timeScale = 1;
diff --git a/js/spawn.js b/js/spawn.js
index 6706fb1..850fec9 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -5530,7 +5530,7 @@ const spawn = {
me.torqueMagnitude = 0.00024 * me.inertia * (Math.random() > 0.5 ? -1 : 1);
me.delay = 70 + 70 * simulation.CDScale;
me.cd = 0;
- me.swordRadius = 0;
+ me.swordRadius = 50;
me.swordVertex = 1
me.swordRadiusMax = 1100 + 20 * simulation.difficulty;
me.swordRadiusGrowRate = me.swordRadiusMax * (0.005 + 0.0003 * simulation.difficulty)
@@ -5564,15 +5564,16 @@ const spawn = {
Matter.Query.ray(body, this.position, this.playerPosRandomY()).length === 0
) {
//find vertex farthest away from player
- let dist = 0
- for (let i = 0, len = this.vertices.length; i < len; i++) {
- const D = Vector.magnitudeSquared(Vector.sub({ x: this.vertices[i].x, y: this.vertices[i].y }, m.pos))
- if (D > dist) {
- dist = D
- this.swordVertex = i
- }
- }
- this.laserAngle = this.swordVertex / 5 * 2 * Math.PI + 0.6283
+ // let dist = 0
+ // for (let i = 0, len = this.vertices.length; i < len; i++) {
+ // const D = Vector.magnitudeSquared(Vector.sub({ x: this.vertices[i].x, y: this.vertices[i].y }, m.pos))
+ // if (D > dist) {
+ // dist = D
+ // this.swordVertex = i
+ // }
+ // }
+ // this.laserAngle = this.swordVertex / 5 * 2 * Math.PI + 0.6283
+
this.sword = this.swordGrow
Matter.Body.setVelocity(this, { x: 0, y: 0 });
Matter.Body.setAngularVelocity(this, 0)
@@ -5581,6 +5582,7 @@ const spawn = {
this.isInvulnerable = true
this.frictionAir = 1
}
+ this.laserSword(this.vertices[this.swordVertex], this.angle + this.laserAngle); //always see the tip of the sword
}
me.sword = me.swordWaiting //base function that changes during different aspects of the sword swing
me.swordGrow = function () {
@@ -5606,7 +5608,7 @@ const spawn = {
this.spinCount++
if (this.spinCount > 80) {
this.sword = this.swordWaiting
- this.swordRadius = 0
+ this.swordRadius = 50
this.accelMag = 0.001 * simulation.accelScale;
this.cd = simulation.cycle + this.delay;
this.damageReduction = this.startingDamageReduction
diff --git a/js/tech.js b/js/tech.js
index 3f2953c..6ad991b 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -151,7 +151,7 @@ const 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
tech.tech[index].effect(); //give specific tech
tech.tech[index].count++
- tech.totalCount++ //used in power up randomization
+ if (!tech.tech[index].isInstant) tech.totalCount++ //used in power up randomization
requestAnimationFrame(() => {
//move new tech to the top of the tech list
if (index > 0 && !build.isExperimentSelection) {
@@ -165,7 +165,7 @@ const tech = {
setCheating() {
if (!simulation.isCheating) {
simulation.isCheating = true;
- level.levelAnnounce();
+ document.title = "n-gon:" + level.levelAnnounce();
lore.techCount = 0;
for (let i = 0, len = tech.tech.length; i < len; i++) {
if (tech.tech[i].isLore) {
@@ -210,10 +210,10 @@ const tech = {
if (tech.isMaxHealthDamage && m.health === m.maxHealth) dmg *= 1.5
if (tech.isNoDefenseDamage && m.defense() === 1) dmg *= 2
if (tech.isImmunityDamage && m.immuneCycle > m.cycle) dmg *= 4
- if (tech.isPowerUpDamage) dmg *= 1 + 0.05 * powerUp.length
+ if (tech.isPowerUpDamage) dmg *= 1 + 0.07 * powerUp.length
if (tech.isDamageCooldown) dmg *= m.lastKillCycle + tech.isDamageCooldownTime > m.cycle ? 0.5 : 4
if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 2
- if (tech.isDivisor && b.activeGun !== undefined && b.activeGun !== null && b.guns[b.activeGun].ammo % 3 === 0) dmg *= 1.8
+ if (tech.isDivisor && b.activeGun !== undefined && b.activeGun !== null && b.guns[b.activeGun].ammo % 3 === 0) dmg *= 1.9
if (tech.isNoGroundDamage) dmg *= m.onGround ? 0.9 : 2
if (tech.isDilate) dmg *= 1.9 + 1.1 * Math.sin(m.cycle * 0.01)
if (tech.isGunChoice && tech.buffedGun === b.inventoryGun) dmg *= 1 + 0.3 * b.inventory.length
@@ -593,7 +593,7 @@ const tech = {
{
name: "ternary", //"divisor",
descriptionFunction() {
- return `
1.8x damage while your current
gunhas
ammo divisible by
3`
+ return `
1.9x damage while your
ammois evenly
divisible by
3(${((b.activeGun !== undefined && b.activeGun !== null && b.guns[b.activeGun].ammo % 3 === 0) ? "1.9" : "1")}x)` //if (tech.isDivisor && b.activeGun !== undefined && b.activeGun !== null && b.guns[b.activeGun].ammo % 3 === 0) dmg *= 1.9
},
maxCount: 1,
count: 0,
@@ -612,7 +612,7 @@ const tech = {
{
name: "integrated armament",
link: `
integrated armament`,
- description: `
1.3x damage, but new guns replace
your current gun and convert guntech`,
+ description: `
1.3x damage, but new ${powerUps.orb.gun()} replace
current ${powerUps.orb.gun()} and convert your ${powerUps.orb.gunTech()}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -630,7 +630,7 @@ const tech = {
},
{
name: "ordnance",
- description: "spawn a
gun, gain
2x guntech frequency+6% JUNKtech chance",
+ description: `spawn ${powerUps.orb.gun()} and gain
2x ${powerUps.orb.gunTech()} frequency+6% JUNK chance`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -657,7 +657,7 @@ const tech = {
{
name: "arsenal",
descriptionFunction() {
- return `
1.25x damage per unequipped
gun(${(1 + 0.25 * Math.max(0, b.inventory.length - 1)).toFixed(2)}x)`
+ return `for each unused ${powerUps.orb.gun()} in your inventory
1.25x damage (${(1 + 0.25 * Math.max(0, b.inventory.length - 1)).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -675,8 +675,8 @@ const tech = {
{
name: "active cooling",
descriptionFunction() {
- return `
1.25x fire rate per unequipped
gun(${(1 / Math.pow(0.8, Math.max(0, b.inventory.length - 1))).toFixed(2)}x)`
- }, //
but not including your equipped
gun` },
+ return `for each unused ${powerUps.orb.gun()} in your inventory
1.25x fire rate (${(1 / Math.pow(0.8, Math.max(0, b.inventory.length - 1))).toFixed(2)}x)`
+ },
maxCount: 1,
count: 0,
frequency: 1,
@@ -700,7 +700,7 @@ const tech = {
let gun = b.guns[b.inventory[tech.buffedGun]].name
info = `
this level:
${(1.3 * Math.max(0, b.inventory.length)).toFixed(2)}x damage for
${gun}`
}
- return `a new
gun is
chosen to be improved each
level1.3x damage per
gun for the
chosen gun${info}`
+ return `
a new ${powerUps.orb.gun()} in your inventory is chosen each level
if it's equipped, 1.3x damage per ${powerUps.orb.gun()} in your inventory${info}`
},
maxCount: 1,
count: 0,
@@ -721,7 +721,7 @@ const tech = {
},
{
name: "generalist",
- description: "spawn
7 guns, but you can't
switch gunsyour equipped
gun cycles after each level",
+ description: `spawn
7 ${powerUps.orb.gun()}, but you can't
switch ${powerUps.orb.gun()}
your equipped ${powerUps.orb.gun()} cycles after each level`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -729,7 +729,7 @@ const tech = {
isInstant: true,
isBadRandomOption: true,
allowed() {
- return b.inventory.length < b.guns.length - 5 && b.inventory.length > 1
+ return (b.inventory.length < b.guns.length - 5) && (b.inventory.length > 1)
},
requires: "at least 2 guns, at least 5 unclaimed guns",
effect() {
@@ -743,7 +743,7 @@ const tech = {
{
name: "ad hoc",
descriptionFunction() {
- return `spawn a ${powerUps.orb.heal()}, ${powerUps.orb.research(1)}, ${powerUps.orb.ammo(1)},
field,
gun, or
techfor each of your
guns`
+ return `spawn a ${powerUps.orb.heal()}, ${powerUps.orb.research()}, ${powerUps.orb.ammo()}, ${powerUps.orb.tech()}, ${powerUps.orb.gun()}, or ${powerUps.orb.field()}
for each ${powerUps.orb.gun()} in your inventory`
},
maxCount: 1, //random power up
count: 0,
@@ -775,7 +775,7 @@ const tech = {
},
{
name: "applied science",
- description: `get a random
guntechfor each of your
guns`, //spawn ${powerUps.orb.research(1)} and
+ description: `get a random ${powerUps.orb.gunTech()}
for each ${powerUps.orb.gun()} in your inventory`, //spawn ${powerUps.orb.research(1)} and
maxCount: 1,
count: 0,
isInstant: true,
@@ -824,7 +824,7 @@ const tech = {
{
name: "supply chain",
descriptionFunction() {
- return `spawn a
gunspawn ${powerUps.orb.ammo(1)} that will
2x your
gun's ammo`
+ return `spawn ${powerUps.orb.gun()}
spawn ${powerUps.orb.ammo()} to match your current
ammo`
},
maxCount: 9,
count: 0,
@@ -876,7 +876,7 @@ const tech = {
{
name: "Pareto efficiency",
descriptionFunction() {
- return `for each of your
gunsrandomly get
5x or
0.2x ammo per ${powerUps.orb.ammo(1)}`
+ return `for each ${powerUps.orb.gun()} in your inventory
randomly get
5x or
0.2x ammo per ${powerUps.orb.ammo(1)}`
},
maxCount: 1,
count: 0,
@@ -903,7 +903,7 @@ const tech = {
},
{
name: "logistics",
- description: `
2x ammo per ${powerUps.orb.ammo()}, but
ammo is only added to your current
gun`,
+ description: `
2x ammo per ${powerUps.orb.ammo()}, but
ammo is only added to your current ${powerUps.orb.gun()}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -1111,12 +1111,11 @@ const tech = {
tech.isFarAwayDmg = false;
}
},
-
{
name: "microstates",
link: `
microstates`,
descriptionFunction() {
- return `use ${powerUps.orb.research(3)}
1.01x damage per
bullet or
bot`
+ return `use ${powerUps.orb.research(3)}
1.01x damage per
bullet or
bot (${(1 + bullet.length * 0.01).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -1181,7 +1180,13 @@ const tech = {
},
{
name: "heuristics",
- description: "
1.3x fire rate",
+ descriptionFunction() {
+ let totalRate = 1
+ for (let i = 0; i < this.totalRate.length; i++) totalRate *= this.totalRate[i]
+ let currentRate = ""
+ if (this.count) currentRate = `
(${(totalRate).toFixed(2)}x)`
+ return `randomly gain between
1x and
1.5x fire rate` + currentRate
+ },
maxCount: 9,
count: 0,
frequency: 1,
@@ -1190,12 +1195,19 @@ const tech = {
return true
},
requires: "",
+ totalRate: [], //tracks the random damage upgrades so it can be removed and in descriptionFunction
effect() {
- tech.fireRate *= 0.77
+ const rate = (Math.floor((Math.random() * 0.5 + 1) * 100)) / 100
+ tech.fireRate /= rate
+ this.totalRate.push(rate)
b.setFireCD();
+ simulation.makeTextLog(`
tech.fireRate *= ${rate} //heuristics`);
},
remove() {
- tech.fireRate = 1;
+ if (this.count && m.alive) {
+ for (let i = 0; i < this.totalRate.length; i++) tech.fireRate *= this.totalRate[i]
+ }
+ this.totalRate.length = 0
b.setFireCD();
}
},
@@ -1214,12 +1226,12 @@ const tech = {
frequencyDefault: 1,
allowed() { return true },
requires: "",
- damage: 1.1,
damageSoFar: [], //tracks the random damage upgrades so it can be removed and in descriptionFunction
effect() {
const damage = (Math.floor((Math.random() * 0.3 + 1) * 100)) / 100
tech.damage *= damage
this.damageSoFar.push(damage)
+ simulation.makeTextLog(`
tech.damage *= ${damage} //mechatronics`);
},
remove() {
if (this.count && m.alive) for (let i = 0; i < this.damageSoFar.length; i++) tech.damage /= this.damageSoFar[i]
@@ -1416,7 +1428,6 @@ const tech = {
name: "collider",
descriptionFunction() {
return `after mobs
die existing
power upscollide to form new
power ups`
- // return `after mobs
die there is a
+33% chance to convert
${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, ${powerUps.orb.research(1)},
tech,
field,
gun into other types`
},
maxCount: 1,
@@ -1970,7 +1981,9 @@ const tech = {
},
{
name: "perimeter defense",
- description: "for each permanent
bot0.96x damage taken",
+ descriptionFunction() {
+ return `for each permanent
bot0.96x damage taken(${(0.96 ** b.totalBots()).toFixed(2)}x)`
+ },
maxCount: 1,
count: 0,
frequency: 2,
@@ -1989,7 +2002,9 @@ const tech = {
},
{
name: "network effect",
- description: "for each permanent
bot1.04x damage",
+ descriptionFunction() {
+ return `for each permanent
bot1.04x damage(${(1 + 0.04 * b.totalBots()).toFixed(2)}x)`
+ },
maxCount: 1,
count: 0,
frequency: 2,
@@ -2010,7 +2025,7 @@ const tech = {
name: "bot fabrication",
link: `
bot fabrication`,
descriptionFunction() {
- return `after you collect ${powerUps.orb.research(2 + Math.floor(0.1666 * b.totalBots()))}use them to build a
random
bot (+1 cost every 5 bots)`
+ return `after you collect ${powerUps.orb.research(2 + Math.floor(0.1666 * b.totalBots()))}use them
to build a random
bot (+1 cost every 5 bots)`
},
// description: `if you collect ${powerUps.orb.research(2)}use them to build a
random
bot (+1 cost every 5 bots)`,
maxCount: 1,
@@ -2034,7 +2049,7 @@ const tech = {
},
{
name: "open-source",
- description: `
tech,
fields, and
guns have
+1 bot
choice3x bot
tech frequency`,
+ description: `${powerUps.orb.tech()}, ${powerUps.orb.field()}, and ${powerUps.orb.gun()} have
+1 bot
choice3x bot-${powerUps.orb.tech()} frequency`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -2062,7 +2077,7 @@ const tech = {
{
name: "ersatz bots",
link: `
ersatz bots`,
- description: "
double your current permanent
botsremove
all guns in your inventory",
+ description: `
double your current permanent
botsremove
all ${powerUps.orb.gun()} in your inventory`,
maxCount: 1,
count: 0,
frequency: 2,
@@ -2258,7 +2273,7 @@ const tech = {
},
{
name: "decorrelation",
- description: "if your
gun and
field are unused for
2 seconds
0.3x damage taken",
+ description: `if your ${powerUps.orb.gun()} and ${powerUps.orb.field()} keys are
unused for
2 seconds
0.3x damage taken`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -2276,7 +2291,7 @@ const tech = {
},
{
name: "anticorrelation",
- description: "if your
gun and
field are unused for
2 seconds
2x damage",
+ description: `if your ${powerUps.orb.gun()} and ${powerUps.orb.field()} keys are
unused for
2 seconds
2x damage`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -2389,7 +2404,7 @@ const tech = {
{
name: "first derivative",
descriptionFunction() {
- return `while your
first gun is equipped
0.85x damage taken per
gun (${(0.85 ** b.inventory.length).toFixed(2)}x)`
+ return `
0.85x damage taken per ${powerUps.orb.gun()} in your inventory
while the
1st ${powerUps.orb.gun()} in your inventory is equipped
(${(0.85 ** b.inventory.length).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -2546,7 +2561,7 @@ const tech = {
{
name: "non-Newtonian armor",
link: `
non-Newtonian armor`,
- description: "after mob collisions
0.3x damage taken for
10 seconds",
+ description: "after mob
collisions0.3x damage taken for
10 seconds",
maxCount: 1,
count: 0,
frequency: 1,
@@ -2782,7 +2797,7 @@ const tech = {
},
{
name: "overcharge",
- description: "
+88 maximum
energy+4% JUNKtech chance",
+ description: "
+88 maximum
energy+4% JUNK chance",
maxCount: 9,
count: 0,
frequency: 1,
@@ -2808,7 +2823,7 @@ const tech = {
},
{
name: "Maxwells demon",
- description: "
energy above maximum decays
30x slower
+5% JUNKtech chance",
+ description: "
energy above maximum decays
30x slower
+5% JUNK chance",
maxCount: 1,
count: 0,
frequency: 2,
@@ -2975,7 +2990,7 @@ const tech = {
{
name: "instability",
descriptionFunction() {
- return `
2x damage while your
damage taken is
1.00x(damage taken = ${(m.defense()).toFixed(2)}x)`
+ return `
2x damage while your
damage taken is
1.00x(current damage taken = ${(m.defense()).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -3017,7 +3032,7 @@ const tech = {
descriptionFunction() {
// return `
0.9x damage taken for each ${name} missing
(${(Math.pow(0.1 * max, Math.max(0, max - h))).toFixed(2)}x)`
const scale = 0.2 //adjust this to control the strength of this effect
- return `reduce
damage taken for each missing ${tech.isEnergyHealth ? "
energy" : "
health"}
down to a limit of
${scale}x at
0 ${tech.isEnergyHealth ? "
energy" : "
health"}
(${(Math.pow(scale, Math.max(0, 1 - (tech.isEnergyHealth ? m.energy / m.maxEnergy : m.health / m.maxHealth)))).toFixed(2)}x)`
+ return `missing ${tech.isEnergyHealth ? "
energy" : "
health"} reduces
damage takendown to a limit of
${scale}x at
0 ${tech.isEnergyHealth ? "
energy" : "
health"}
(${(Math.pow(scale, Math.max(0, 1 - (tech.isEnergyHealth ? m.energy / m.maxEnergy : m.health / m.maxHealth)))).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -3077,7 +3092,7 @@ const tech = {
{
name: "antiscience",
descriptionFunction() {
- return `
–10 ${tech.isEnergyHealth ? "
energy" : "
health"} after picking up a
tech1.7x damage`
+ return `
–10 ${tech.isEnergyHealth ? "
energy" : "
health"} after picking up ${powerUps.orb.tech()}
1.7x damage`
},
maxCount: 1,
count: 0,
@@ -3178,7 +3193,7 @@ const tech = {
{
name: "adiabatic healing",
descriptionFunction() {
- return `
2x healing from ${powerUps.orb.heal()}
+4% JUNKtech chance`
+ return `
2x healing from ${powerUps.orb.heal()}
+4% JUNK chance`
},
maxCount: 3,
count: 0,
@@ -3266,7 +3281,7 @@ const tech = {
{
name: "accretion disk",
descriptionFunction() {
- return `
1.05x damage for each
power up on this
level(${(1 + 0.05 * powerUp.length).toFixed(2)}x)`
+ return `
1.07x damage for each
power up on this
level+5% JUNK chance
(${(1 + 0.07 * powerUp.length).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -3279,15 +3294,21 @@ const tech = {
requires: "accretion",
effect() {
tech.isPowerUpDamage = true
+ this.refundAmount += tech.addJunkTechToPool(0.05)
},
+ refundAmount: 0,
remove() {
tech.isPowerUpDamage = false
+ if (this.count > 0 && this.refundAmount > 0) {
+ tech.removeJunkTechFromPool(this.refundAmount)
+ this.refundAmount = 0
+ }
},
},
{
name: "maintenance",
descriptionFunction() {
- return `
2x healtech frequencyspawn ${powerUps.orb.heal(13)}`
+ return `
2x healing-${powerUps.orb.tech()} frequencyspawn ${powerUps.orb.heal(13)}`
},
maxCount: 1,
count: 0,
@@ -3358,7 +3379,7 @@ const tech = {
// }, 1000);
// },
descriptionFunction() {
- return `once per level, instead of
dyinguse ${powerUps.orb.research(1)} and spawn ${powerUps.orb.heal(16)}`
+ return `once per level, instead of
dying use ${powerUps.orb.research(1)} and
spawn ${powerUps.orb.heal(22)}`
},
maxCount: 1,
count: 0,
@@ -3438,8 +3459,7 @@ const tech = {
},
{
name: "many-worlds",
- // description: "each
level is an
alternate reality, where you
find a
tech at the start of each level",
- description: `at the start of each
level spawn a
techand enter an
alternate reality`,
+ description: `at the start of each
level spawn ${powerUps.orb.tech()}
and enter an
alternate reality`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3481,7 +3501,7 @@ const tech = {
},
{
name: "decoherence",
- description: `after a
boss dies spawn ${powerUps.orb.research(2)}
tech options you don't
choose won't
reoccur`,
+ description: `after a
boss dies spawn ${powerUps.orb.research(2)}
${powerUps.orb.tech()} options you don't
choose won't
reoccur`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3507,7 +3527,7 @@ const tech = {
},
{
name: "peer review",
- description: `after you
research gain
1.05x damageand
+1% JUNKtech chance`,
+ description: `after you
research gain
1.05x damageand
+1% JUNK chance`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3525,7 +3545,7 @@ const tech = {
},
{
name: "pseudoscience",
- description: "
research 2 times for
free, but
add
1% JUNKtech chance each time",
+ description: "
research 2 times for
free, but
add
1% JUNK chance each time",
maxCount: 1,
count: 0,
frequency: 1,
@@ -3543,7 +3563,7 @@ const tech = {
},
{
name: "renormalization",
- description: `
47% chance to spawn ${powerUps.orb.research(1)} after consuming ${powerUps.orb.research(1)}
+5% JUNKtech chance`,
+ description: `
47% chance to spawn ${powerUps.orb.research(1)} after consuming ${powerUps.orb.research(1)}
+5% JUNK chance`,
maxCount: 1,
count: 0,
frequency: 2,
@@ -3610,7 +3630,7 @@ const tech = {
},
{
name: "ansatz",
- description: `after choosing a
field,
tech, or
gunif you have no ${powerUps.orb.research(1)} in your inventory spawn ${powerUps.orb.research(3)}`,
+ description: `after
choosing ${powerUps.orb.field()}, ${powerUps.orb.tech()}, or ${powerUps.orb.gun()}
if you have no ${powerUps.orb.research(1)} in your inventory spawn ${powerUps.orb.research(3)}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3628,7 +3648,7 @@ const tech = {
},
{
name: "unified field theory",
- description: `when
paused you can click to
switch fields2x fieldtech frequency`,
+ description: `when
paused you can
switch ${powerUps.orb.field()} by clicking
2x ${powerUps.orb.fieldTech()} frequency`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3654,7 +3674,7 @@ const tech = {
},
{
name: "eternalism",
- description: "
1.25x damagetime can't be
paused (time can be dilated)",
+ description: `
1.25x damagetime can't be
paused (time can still be dilated)`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3675,7 +3695,7 @@ const tech = {
},
{
name: "brainstorming",
- description: "
tech choices randomizeevery
1.5 seconds for
10 seconds",
+ description: `${powerUps.orb.tech()}
choices randomizeevery
1.5 seconds for
10 seconds`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3696,7 +3716,7 @@ const tech = {
},
{
name: "cross-disciplinary",
- description: "
tech have an extra
field or
gun choice+5% chance to
duplicate spawned
power ups",
+ description: `${powerUps.orb.tech()} have an extra ${powerUps.orb.field()} or ${powerUps.orb.gun()}
choice+5% chance to
duplicate spawned
power ups`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3717,7 +3737,7 @@ const tech = {
},
{
name: "emergence",
- description: "
tech,
fields, and
guns have
+1 choice1.1x damage",
+ description: `${powerUps.orb.field()}, ${powerUps.orb.tech()}, and ${powerUps.orb.gun()} have
+1 choice1.1x damage`,
maxCount: 9,
count: 0,
frequency: 1,
@@ -3740,7 +3760,7 @@ const tech = {
{
name: "path integral",
link: `
path integral`,
- description: "your next
tech choice has all possible
options+4% JUNKtech chance",
+ description: `your next ${powerUps.orb.tech()} has all possible
choices+4% JUNK chance`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3767,7 +3787,7 @@ const tech = {
},
{
name: "determinism",
- description: "spawn
5 techonly
1 choice for
tech,
fields, and
guns",
+ description: `spawn ${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}
only
1 choice for ${powerUps.orb.field()}, ${powerUps.orb.tech()}, and ${powerUps.orb.gun()}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3789,7 +3809,7 @@ const tech = {
},
{
name: "superdeterminism",
- description: `spawn
5 techyou can't
cancel and ${powerUps.orb.research(1)} no longer
spawn`,
+ description: `spawn ${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}
you can't
cancel and ${powerUps.orb.research(1)} no longer
spawn`,
maxCount: 1,
count: 0,
frequency: 3,
@@ -3812,7 +3832,7 @@ const tech = {
{
name: "technical debt",
descriptionFunction() {
- return `
4x damage but lose
0.15x damagefor each
tech you have learned
(${(tech.totalCount > 20 ? (Math.pow(0.85, tech.totalCount - 20)) : (4 - 0.15 * tech.totalCount)).toFixed(2)}x)`
+ return `
4x damage but lose
0.15x damagefor each ${powerUps.orb.tech()} you have
(${(tech.totalCount > 20 ? (Math.pow(0.85, tech.totalCount - 20)) : (4 - 0.15 * tech.totalCount)).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -3832,13 +3852,13 @@ const tech = {
},
{
name: "meta-analysis",
- description: `if you choose a
JUNKtech you instead get a
random normal
tech and spawn ${powerUps.orb.research(2)}`,
+ description: `if you
choose a
JUNK you instead get a
random non
JUNK ${powerUps.orb.tech()} and ${powerUps.orb.research(2)}`,
maxCount: 1,
count: 0,
frequency: 1,
frequencyDefault: 1,
allowed() {
- return tech.junkChance > 0
+ return tech.junkChance > 0.1
},
requires: "some JUNK tech",
effect() {
@@ -3850,7 +3870,7 @@ const tech = {
},
{
name: "dark patterns",
- description: "
1.3x damage+15% JUNKtech chance",
+ description: "
1.3x damage+15% JUNK chance",
maxCount: 9,
count: 0,
frequency: 1,
@@ -3875,7 +3895,7 @@ const tech = {
{
name: "junk DNA",
descriptionFunction() {
- return `increase
damage by twice the
JUNKtech chance
(${(1 + 2 * tech.junkChance).toFixed(2)}x)`
+ return `increase
damage by twice the
JUNK chance
(${(1 + 2 * tech.junkChance).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -3895,7 +3915,7 @@ const tech = {
{
name: "mass production",
descriptionFunction() {
- return `
tech have extra
choices to spawn ${powerUps.orb.ammo(1)}, ${powerUps.orb.heal(1)}, or ${powerUps.orb.research(1)}
+3% chance to
duplicate spawned
power ups`
+ return `${powerUps.orb.tech()} have extra
choices to spawn ${powerUps.orb.ammo(1)}, ${powerUps.orb.heal(1)}, or ${powerUps.orb.research(1)}
+3% chance to
duplicate spawned
power ups`
},
maxCount: 1,
count: 0,
@@ -4085,7 +4105,7 @@ const tech = {
name: "fine-structure constant",
descriptionFunction() {
// return `spawn ${this.value} ${powerUps.orb.coupling(1)} that each give
+0.1 coupling-0.5 coupling after mob
collisions`//
${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per
coupling"}
- return `after a
boss dies spawn ${powerUps.orb.coupling(9)}
lose ${powerUps.orb.coupling(4)} after mob
collisions`//
${m.couplingDescription(1)} per ${powerUps.orb.coupling(1)}
+ return `after a
boss dies spawn ${powerUps.orb.coupling(9)}
lose ${powerUps.orb.coupling(3)} after mob
collisions`//
${m.couplingDescription(1)} per ${powerUps.orb.coupling(1)}
},
maxCount: 1,
count: 0,
@@ -4107,7 +4127,6 @@ const tech = {
{
name: "residual dipolar coupling",
descriptionFunction() {
- // return `clicking
cancel for a
field,
tech, or
gunspawns ${powerUps.orb.coupling(5)}that each give
+0.1 coupling`//
${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per
coupling"}
return `clicking
cancel spawns ${powerUps.orb.coupling(8)}
${m.couplingDescription(1)} per ${powerUps.orb.coupling(1)}`
},
maxCount: 1,
@@ -4128,7 +4147,7 @@ const tech = {
{
name: "commodities exchange",
descriptionFunction() {
- return `clicking
cancel for a
field,
tech, or
gunspawns
8-12 ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`
+ return `clicking
cancel for ${powerUps.orb.field()}, ${powerUps.orb.tech()}, or ${powerUps.orb.gun()}
spawns
8-12 ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`
},
maxCount: 1,
count: 0,
@@ -4148,8 +4167,7 @@ const tech = {
{
name: "options exchange",
link: `
options exchange`,
- // description: `
once per level clicking cancel will randomize
with 2x choices for fields, tech, or guns`,
- description: `clicking
cancel for
fields,
tech, or
gunswill
randomize with
3x choices, once a level`,
+ description: `clicking
cancel for ${powerUps.orb.field()}, ${powerUps.orb.tech()}, or ${powerUps.orb.gun()}
will
randomize with
3x choices, once a level`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -4169,7 +4187,7 @@ const tech = {
},
{
name: "futures exchange",
- description: "clicking
cancel for a
field,
tech, or
gungives
+5% power up
duplication chance",
+ description: `clicking
cancel for ${powerUps.orb.field()}, ${powerUps.orb.tech()}, or ${powerUps.orb.gun()}
gives
+5% power up
duplication chance`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -4189,7 +4207,7 @@ const tech = {
},
{
name: "replication",
- description: "
+10% chance to
duplicate spawned
power ups+15% JUNKtech chance",
+ description: "
+10% chance to
duplicate spawned
power ups+15% JUNK chance",
maxCount: 9,
count: 0,
frequency: 1,
@@ -4278,7 +4296,7 @@ const tech = {
},
{
name: "stimulated emission",
- description: "
+20% chance to
duplicate spawned
power ups,
collisions eject a random
tech",
+ description: `
+20% chance to
duplicate spawned
power ups,
collisions eject a random ${powerUps.orb.tech()}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -4328,7 +4346,7 @@ const tech = {
},
{
name: "strange loop",
- description: `
1.1x damageremoving this gives a random
removetech`,
+ description: `
1.1x damageremoving this gives a random
remove-${powerUps.orb.tech()}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -4415,7 +4433,7 @@ const tech = {
{
name: "externality",
descriptionFunction() {
- return `
1.1x damageremoving this spawns
${this.ammo} ${powerUps.orb.ammo(1)}`
+ return `
1.1x damageremoving this spawns
${this.ammo} ${powerUps.orb.ammo()}`
},
maxCount: 1,
count: 0,
@@ -4444,7 +4462,7 @@ const tech = {
name: "deprecated",
scale: 0.07,
descriptionFunction() {
- return `after
removing this gain
${1 + this.scale}x damage per
removed tech(${(1 + this.scale * ((this.frequency === 0 ? 0 : 1) + tech.removeCount)).toFixed(2)}x)`
+ return `after
removing this gain
${1 + this.scale}x damage per
removed ${powerUps.orb.tech()}
(${(1 + this.scale * ((this.frequency === 0 ? 0 : 1) + tech.removeCount)).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -4466,10 +4484,31 @@ const tech = {
}
}
},
+ {
+ name: "planned obsolescence",
+ descriptionFunction() {
+ return `at the start of each
level eject your oldest ${powerUps.orb.tech()}
and gain
1.1x damage each time` //
(${(tech.ejectOld).toFixed(2)}x)
+ },
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ isBadRandomOption: true,
+ allowed() {
+ return true
+ },
+ requires: "",
+ effect() {
+ tech.ejectOld = 1 //this grows
+ },
+ remove() {
+ tech.ejectOld = 0
+ }
+ },
{
name: "paradigm shift",
descriptionFunction() {
- return `when
paused clicking a
tech ejects it
–${tech.pauseEjectTech.toFixed(1)} ${tech.isEnergyHealth ? "
energy" : "
health"} cost
(1.3x cost each use)`
+ return `when
paused clicking your ${powerUps.orb.tech()}
ejects them
–${tech.pauseEjectTech.toFixed(1)} ${tech.isEnergyHealth ? "
energy" : "
health"} cost
(1.3x cost each use)`
},
maxCount: 1,
count: 0,
@@ -4489,7 +4528,7 @@ const tech = {
},
{
name: "Born rule",
- description: "
eject all your
tech",
+ description: `
eject all your ${powerUps.orb.tech()}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -4537,7 +4576,7 @@ const tech = {
{
name: "Occams razor",
descriptionFunction() {
- return `randomly
remove half your
techfor each removed
${(1 + this.damagePerRemoved).toFixed(2)}x damage (~${((this.count === 0) ? 1 + this.damagePerRemoved * 0.5 * tech.totalCount : this.damage).toFixed(2)}x)`
+ return `randomly
remove half your ${powerUps.orb.tech()}
for each removed
${(1 + this.damagePerRemoved).toFixed(2)}x damage (~${((this.count === 0) ? 1 + this.damagePerRemoved * 0.5 * tech.totalCount : this.damage).toFixed(2)}x)`
},
maxCount: 1,
count: 0,
@@ -4561,6 +4600,7 @@ const tech = {
for (let i = 0, len = pool.length * 0.5; i < len; i++) removeCount += tech.removeTech(pool[i])
this.damage = this.damagePerRemoved * removeCount
tech.damage *= (1 + this.damage)
+ simulation.makeTextLog(`
${(1 + this.damage).toFixed(2)}x damage //from Occam's razor`, 360)
},
remove() {
if (this.count && m.alive) tech.damage /= (1 + this.damage)
@@ -4568,7 +4608,7 @@ const tech = {
},
{
name: "exchange symmetry",
- description: "
remove 1 random
techspawn
2 new
guns",
+ description: `
remove a random ${powerUps.orb.tech()}
spawn ${powerUps.orb.gun()}${powerUps.orb.gun()}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -4595,7 +4635,7 @@ const tech = {
},
{
name: "Monte Carlo method",
- description: "
remove 1 random
techspawn
2 tech",
+ description: `
remove a random ${powerUps.orb.tech()}
spawn ${powerUps.orb.tech()}${powerUps.orb.tech()}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -4796,7 +4836,7 @@ const tech = {
{
name: "ice crystal nucleation",
link: `
ice crystal nucleation`,
- description: "
nail gun uses
energy to condense
unlimited
freezing ice shards",
+ description: "
nail gun uses
energy instead of
ammoto condense
freezing ice nails",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -4873,7 +4913,7 @@ const tech = {
},
{
name: "supercritical fission",
- description: "if
nails,
needles, or
rivets strike mobs
near their
center they can
explode",
+ description: "if
nails,
needles, or
rivets strike mobs
near their
center they trigger an
explosion",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5012,7 +5052,7 @@ const tech = {
{
name: "Noether violation",
link: `
Noether violation`,
- description: "
1.5x shotgun damageshotgun recoil is
reversed",
+ description: "
1.5x shotgun damageshotgun recoil is reversed",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5091,7 +5131,7 @@ const tech = {
{
name: "ice-shot",
link: `
ice-shot`,
- description: "
shotgun grows freezing
ice IX crystals",
+ description: "
shotgun condenses
ice IX crystals
that
freeze mobs",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5186,7 +5226,7 @@ const tech = {
},
{
name: "superfluidity",
- description: "
freeze effects are applied
to a small area around the target",
+ description: "
freeze effects are applied
to a small
area around the target",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5270,7 +5310,7 @@ const tech = {
},
{
name: "Zectron",
- description: `
2x super ball damage, but
after colliding with
super balls -4 energy`,
+ description: `
2x super ball damage, but
-4 energy after you collide with
super balls`,
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5586,7 +5626,7 @@ const tech = {
{
name: "missile-bot",
link: `
missile-bot`,
- description: `use ${powerUps.orb.research(1)}to trade your
missile gunfor a
bot that fires
missiles`,
+ description: `use ${powerUps.orb.research(1)}to trade your
missile ${powerUps.orb.gun()}
for a
bot that fires
missiles`,
// isGunTech: true,
isRemoveGun: true,
maxCount: 1,
@@ -5658,7 +5698,7 @@ const tech = {
},
{
name: "launch system",
- description: `
5x missile gun fire rate1.2x missile
ammo per ${powerUps.orb.ammo(1)}`,
+ description: `
5x missile fire rate1.2x missile
ammo per ${powerUps.orb.ammo(1)}`,
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5916,7 +5956,7 @@ const tech = {
},
{
name: "flame test",
- description: "after
grenades detonate they release
a colorful
cluster of small
explosions",
+ description: "after
grenades detonate they trigger
a colorful
cluster of small
explosions",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5935,7 +5975,7 @@ const tech = {
},
{
name: "pyrotechnics",
- description: "after
grenades detonate they release
a colorful
circle of
explosions",
+ description: "after
grenades detonate they trigger
a colorful
circle of
explosions",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5954,7 +5994,7 @@ const tech = {
},
{
name: "fireworks",
- description: "after
grenades detonate they release
colorful
petals of
explosions",
+ description: "after
grenades detonate they trigger
colorful
petals of
explosions",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -6092,7 +6132,7 @@ const tech = {
},
{
name: "booby trap",
- description: "
50% chance to drop a
mine from
power ups+15% JUNKtech chance",
+ description: "
50% chance to drop a
mine from
power ups+15% JUNK chance",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -6138,7 +6178,7 @@ const tech = {
{
name: "blast ball",
descriptionFunction() {
- return `instead of nails
mines fire
bouncy balls`
+ return `
mines fire
bouncy balls instead of nails`
},
isGunTech: true,
maxCount: 1,
@@ -6444,7 +6484,7 @@ const tech = {
},
{
name: "fault tolerance",
- description: `use ${powerUps.orb.research(2)}to trade your
drone gunfor
5 drones that last
forever`,
+ description: `use ${powerUps.orb.research(2)}to trade your
drone ${powerUps.orb.gun()}
for
5 drones that last
forever`,
// isGunTech: true,
isRemoveGun: true,
maxCount: 1,
@@ -6540,7 +6580,6 @@ const tech = {
{
name: "von Neumann probe", //"drone repair",
description: "after a
drone expires it will use
-4 energyand a nearby
block to
replicate itself",
- // description: "broken
drones repair if the drone
gun is active
repairing has a
25% chance to use
1 drone",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -6710,7 +6749,7 @@ const tech = {
},
{
name: "surfactant",
- description: `use ${powerUps.orb.research(2)}to trade your
foam gunfor
2 foam-bots and
foam-bot upgrade`,
+ description: `use ${powerUps.orb.research(2)}to trade your
foam ${powerUps.orb.gun()}
for
2 foam-bots and
foam-bot upgrade`,
// isGunTech: true,
isRemoveGun: true,
maxCount: 1,
@@ -6809,7 +6848,7 @@ const tech = {
},
{
name: "foam fractionation",
- description: "if you have below
300 ammo2x foam gun bubble
size",
+ description: "if you have below
300 ammo2x foam bubble
size",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -6855,7 +6894,7 @@ const tech = {
},
{
name: "pressure vessel",
- description: "build up
charge while firing
foam gunafter firing
discharge foam bubbles",
+ description: "build up
charge while firing
foamafter firing
discharge foam bubbles",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -6921,7 +6960,7 @@ const tech = {
},
{
name: "railgun",
- description: `hold fire to charge
harpoon and release to launch
harpoons can't
retract`,
+ description: `
hold and
release fire key to launch
harpoonsbut,
harpoons can't
retract`,
// description: `
+900% harpoon ammo, but it can't
retract+50% harpoon density and
damage`,
isGunTech: true,
maxCount: 1,
@@ -7147,7 +7186,7 @@ const tech = {
},
{
name: "optical amplifier",
- description: "gain
3 random
laser guntechlaser only turns
off if you have no
energy",
+ description: `gain
3 random
laser ${powerUps.orb.tech()}
laser only turns
off if you have no
energy`,
// isGunTech: true,
maxCount: 1,
count: 0,
@@ -7249,7 +7288,7 @@ const tech = {
},
{
name: "lens",
- description: "
2.5x laser gun damage if it passes
through a revolving
90° arc circular lens", //
π / 2
+ description: "
2.5x laser damage if it passes
through a revolving
90° arc circular lens", //
π / 2
isGunTech: true,
maxCount: 1,
count: 0,
@@ -7314,7 +7353,7 @@ const tech = {
},
{
name: "diffraction grating",
- description: `
+1 diverging
laser gun beam`,
+ description: `
+1 diverging
laser beam`,
isGunTech: true,
maxCount: 9,
count: 0,
@@ -7338,7 +7377,7 @@ const tech = {
{
name: "diffuse beam",
link: `
diffuse beam`,
- description: "
laser gun beam is
wider and doesn't
reflect3.2x laser damage",
+ description: "your
laser beam is
wider, but it doesn't
reflect3.2x laser damage",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -7363,7 +7402,7 @@ const tech = {
},
{
name: "output coupler",
- description: "
1.3x laser gun beam
width1.3x laser damage",
+ description: "
1.3x laser beam
width1.3x laser damage",
isGunTech: true,
maxCount: 9,
count: 0,
@@ -7388,7 +7427,7 @@ const tech = {
},
{
name: "delayed-choice",
- description: "
laser gun fires a
0.4 second
delayed beam
delayed beams do
0.7x damage",
+ description: "your
laser fires a
0.4 second
delayed beam
that does
0.7x damage",
isGunTech: true,
maxCount: 9,
count: 0,
@@ -7578,7 +7617,7 @@ const tech = {
},
{
name: "expansion",
- description: "using
standing wave field
expands its
radius+77 maximum
energy",
+ description: "using standing wave
expands its
radius+77 maximum
energy",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -7745,13 +7784,13 @@ const tech = {
{
name: "dynamic equilibrium",
descriptionFunction() {
- return `increase
damage by your last ${tech.isEnergyHealth ? "
energy" : "
health"} loss
(${(1 + tech.lastHitDamage * m.lastHit).toFixed(2)}x damage)`
+ return `increase
damage by your most recent ${tech.isEnergyHealth ? "
energy" : "
health"} loss
(${(1 + (tech.lastHitDamage === 0 ? 5 : tech.lastHitDamage) * m.lastHit).toFixed(2)}x)`
},
isFieldTech: true,
maxCount: 9,
count: 0,
frequency: 2,
- frequencyDefault: 2,
+ frequencyDefault: 200,
allowed() {
return m.fieldMode === 8 || m.fieldMode === 3
},
@@ -7765,7 +7804,7 @@ const tech = {
},
{
name: "neutronium",
- description: `
0.8x move and
jump, but
if your
field is active
0.05x damage taken`,
+ description: `
0.8x move and
jump, but
while your ${powerUps.orb.field()} is active
0.05x damage taken`,
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -7793,7 +7832,9 @@ const tech = {
},
{
name: "aerostat",
- description: `
2x damage while
off the
ground0.9x damage while
on the
ground`,
+ descriptionFunction() {
+ return `
2x damage while
off the
ground0.9x damage while
on the
ground(${(m.onGround ? 0.9 : 2).toFixed(1)}x)`
+ },
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -7848,110 +7889,9 @@ const tech = {
tech.isFlyFaster = false;
}
},
- // {
- // name: "Bose Einstein condensate",
- // description: "use
energy to
freeze mobs in your
fieldpilot wave, negative mass, time dilation",
- // isFieldTech: true,
- // maxCount: 1,
- // count: 0,
- // frequency: 2,
- // frequencyDefault: 2,
- // allowed() {
- // return m.fieldMode === 8 || m.fieldMode === 3 || (m.fieldMode === 6 && !tech.isRewindField)
- // },
- // requires: "pilot wave, negative mass, time dilation, not retrocausality",
- // effect() {
- // tech.isFreezeMobs = true
- // },
- // remove() {
- // tech.isFreezeMobs = false
- // }
- // },
-
- // {
- // name: "mycelium manufacturing",
- // link: `
mycelium manufacturing`,
- // // description: `use ${powerUps.orb.research(1)}to repurpose
molecular assemblerexcess
energy used to grow
spores`,
- // descriptionFunction() { return `use ${powerUps.orb.research(1)}to repurpose
molecular assemblerexcess
energy used to grow ${b.guns[6].nameString('s')}` },
- // isFieldTech: true,
- // maxCount: 1,
- // count: 0,
- // frequency: 3,
- // frequencyDefault: 3,
- // allowed() {
- // return (build.isExperimentSelection || powerUps.research.count > 0) && m.fieldMode === 4 && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive || tech.isDroneTeleport)
- // },
- // requires: "molecular assembler, no other manufacturing, no drone tech",
- // effect() {
- // if (!build.isExperimentSelection) {
- // for (let i = 0; i < 1; i++) {
- // if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
- // }
- // }
- // tech.isSporeField = true;
- // },
- // remove() {
- // tech.isSporeField = false;
- // if (this.count > 0) powerUps.research.changeRerolls(1)
- // }
- // },
- // {
- // name: "missile manufacturing",
- // link: `
missile manufacturing`,
- // description: `use ${powerUps.orb.research(1)}to repurpose
molecular assemblerexcess
energy used to construct
missiles`,
- // // description: "use
3 research to repurpose
assemblerexcess
energy used to construct
missiles",
- // isFieldTech: true,
- // maxCount: 1,
- // count: 0,
- // frequency: 3,
- // frequencyDefault: 3,
- // allowed() {
- // return (build.isExperimentSelection || powerUps.research.count > 0) && m.maxEnergy > 0.5 && m.fieldMode === 4 && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive || tech.isDroneTeleport || tech.isDronesTravel)
- // },
- // requires: "molecular assembler, no other manufacturing, no drone tech",
- // effect() {
- // if (!build.isExperimentSelection) {
- // for (let i = 0; i < 1; i++) {
- // if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
- // }
- // }
- // tech.isMissileField = true;
- // },
- // remove() {
- // tech.isMissileField = false;
- // if (this.count > 0) powerUps.research.changeRerolls(1)
- // }
- // },
- // {
- // name: "ice IX manufacturing",
- // link: `
ice IX manufacturing`,
- // description: `use ${powerUps.orb.research(1)}to repurpose
molecular assemblerexcess
energy used to condense
ice IX`,
- // // description: "use
3 research to repurpose
assemblerexcess
energy used to condense
ice IX",
- // isFieldTech: true,
- // maxCount: 1,
- // count: 0,
- // frequency: 3,
- // frequencyDefault: 3,
- // allowed() {
- // return (build.isExperimentSelection || powerUps.research.count > 0) && m.fieldMode === 4 && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive || tech.isDroneTeleport || tech.isDronesTravel)
- // },
- // requires: "molecular assembler, no other manufacturing, no drone tech",
- // effect() {
- // if (!build.isExperimentSelection) {
- // for (let i = 0; i < 1; i++) {
- // if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
- // }
- // }
- // tech.isIceField = true;
- // },
- // remove() {
- // tech.isIceField = false;
- // if (this.count > 0) powerUps.research.changeRerolls(1)
- // }
- // },
{
name: "additive manufacturing",
- description: "hold
crouch and use your
field to
print a
block with
1.8x density,
damage, and launch speed",
+ description: `hold
crouch and use ${powerUps.orb.field()} to
print a
block with
1.8x density,
damage, and launch speed`,
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -7974,7 +7914,7 @@ const tech = {
// description: "molecular assembler
prints one
blockto
jump off while midair",
descriptionFunction() {
const fieldName = m.fieldMode === 8 ? "pilot wave" : "molecular assembler"
- return `a second
jump in
midairwill
print a
block to
jump off`
+ return `pressing the
jump key in
midairwill
print a
block to
jump off`
// return `${fieldName}
prints a
blockto
jump off while midair`
},
isFieldTech: true,
@@ -8090,7 +8030,7 @@ const tech = {
},
{
name: "combinatorial optimization",
- description: "
1.35x damage0.7x fire rate",
+ description: "
1.4x damage0.7x fire rate",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -8100,7 +8040,7 @@ const tech = {
return m.fieldMode === 6 || m.fieldMode === 7 || m.fieldMode === 8
},
requires: "time dilation, cloaking, pilot wave",
- damage: 1.35,
+ damage: 1.4,
effect() {
tech.damage *= this.damage
tech.aimDamage = 1.42
@@ -8174,7 +8114,7 @@ const tech = {
},
{
name: "degenerate matter",
- description: "if your
field is active
0.1x damage taken",
+ description: `if your ${powerUps.orb.field()} key is active
0.1x damage taken`,
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -8194,7 +8134,7 @@ const tech = {
{
name: "plasma-bot",
link: `
plasma-bot`,
- description: `use ${powerUps.orb.research(2)}to trade your
fieldfor a
bot that uses
energy to emit
plasma`,
+ description: `use ${powerUps.orb.research(2)}to trade your ${powerUps.orb.field()}
for a
bot that uses
energy to emit
plasma`,
// isFieldTech: true,
isInstant: true,
maxCount: 1,
@@ -8259,6 +8199,30 @@ const tech = {
if (this.count > 0) powerUps.research.changeRerolls(this.count * 2)
}
},
+ {
+ name: "plasma jet",
+ link: `
plasma jet`,
+ description: `use ${powerUps.orb.research(2)}
1.5x plasma torch range`,
+ isFieldTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return (tech.plasmaBotCount || m.fieldMode === 5) && (build.isExperimentSelection || powerUps.research.count > 1) && !tech.isPlasmaBall
+ },
+ requires: "plasma torch, not plasma ball",
+ effect() {
+ tech.isPlasmaRange += 0.5;
+ for (let i = 0; i < 2; i++) {
+ if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
+ }
+ },
+ remove() {
+ tech.isPlasmaRange = 1;
+ if (this.count > 0) powerUps.research.changeRerolls(this.count * 2)
+ }
+ },
{
name: "extruder",
description: "
extrude a thin hot wire of
plasmaincreases
damage and
energy cost",
@@ -8484,7 +8448,7 @@ const tech = {
{
name: "symbiosis",
descriptionFunction() {
- return `after a
boss dies spawn ${powerUps.orb.research(4)}${powerUps.orb.heal(3)} and a
techafter a
mob dies –0.25 maximum ${tech.isEnergyHealth ? "
energy" : "
health"}`
+ return `after a
boss dies spawn ${powerUps.orb.research(4)}${powerUps.orb.heal(3)}${powerUps.orb.tech()}
after a
mob dies –0.25 maximum ${tech.isEnergyHealth ? "
energy" : "
health"}`
},
isFieldTech: true,
maxCount: 1,
@@ -8548,7 +8512,7 @@ const tech = {
{
name: "dazzler",
link: `
dazzler`,
- description: "after
decloakingstun nearby mobs for 2 second",
+ description: "after
decloakingstun nearby mobs for 2 seconds",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -8586,7 +8550,7 @@ const tech = {
},
{
name: "WIMPs",
- description: `at the end of each
level spawn ${powerUps.orb.research(4)}
and a dangerous particle that slowly
chases you`,
+ description: `at each
level's exit, spawn ${powerUps.orb.research(4)}
and a dangerous particle that slowly
chases you`,
isFieldTech: true,
maxCount: 9,
count: 0,
@@ -9062,7 +9026,7 @@ const tech = {
// },
{
name: "swap meet",
- description: "normal
tech become
JUNKand
JUNK become normal
tech",
+ description: `normal ${powerUps.orb.tech()} become
JUNKand
JUNK become normal`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -9211,7 +9175,7 @@ const tech = {
remove() { }
},
{
- name: "planned obsolescence",
+ name: "defunct",
description: "build
100 scrap
botsbots might last for
30 seconds",
maxCount: 1,
count: 0,
@@ -9324,7 +9288,7 @@ const tech = {
},
{
name: "reinforcement learning",
- description: "
10x current
tech frequency",
+ description: `
10x current
${powerUps.orb.tech()} frequency`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -9374,7 +9338,7 @@ const tech = {
},
{
name: "closed timelike curve",
- description: "spawn 5
field power ups, but every 12 seconds
teleport a second into your future or past",
+ description: `spawn ${powerUps.orb.field()}${powerUps.orb.field()}${powerUps.orb.field()}${powerUps.orb.field()}${powerUps.orb.field()}, but every 12 seconds
teleport a second into your future or past`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -9451,7 +9415,7 @@ const tech = {
// },
{
name: "discount",
- description: "get 3 random
JUNKtech for the price of 1!",
+ description: `get 3 random
JUNK${powerUps.orb.tech()} for the price of 1!`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -9492,7 +9456,7 @@ const tech = {
// },
{
name: "Higgs phase transition",
- description: "instantly spawn 5
tech, but add a chance to
remove everything with a 5 minute
half-life",
+ description: `instantly spawn ${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}, but add a chance to
remove everything with a 5 minute
half-life`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -9553,7 +9517,7 @@ const tech = {
},
{
name: "brainstorm",
- description: "the
tech choice menu
randomizesevery
0.5 seconds for
10 seconds",
+ description: `${powerUps.orb.tech()}
choices randomizeevery
0.5 seconds for
10 seconds`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -10196,7 +10160,7 @@ const tech = {
},
{
name: "disintegrated armament",
- description: "spawn a
gunremove your active
gun",
+ description: `spawn ${powerUps.orb.gun()}
remove your active ${powerUps.orb.gun()}`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -10215,7 +10179,7 @@ const tech = {
},
{
name: "probability",
- description: "
100x frequencyof one random
tech",
+ description: `
100x frequencyof a random ${powerUps.orb.tech()}`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -10246,7 +10210,7 @@ const tech = {
},
{
name: "encryption",
- description: "secure
tech information",
+ description: `secure information`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -10386,7 +10350,7 @@ const tech = {
},
{
name: "repartitioning",
- description: "set the
frequency of finding normal
tech to
0spawn 5
tech",
+ description: `set the
frequency of finding non
JUNK-${powerUps.orb.tech()} to
0spawn ${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}${powerUps.orb.tech()}`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -10410,7 +10374,7 @@ const tech = {
},
{
name: "defragment",
- description: "set the
frequency of finding
JUNKtech to zero",
+ description: "set the
frequency of finding
JUNK to zero",
maxCount: 1,
count: 0,
frequency: 0,
@@ -10676,7 +10640,7 @@ const tech = {
},
{
name: "expert system",
- description: "spawn a
tech power up
+50% JUNKtech chance",
+ description: "spawn
JUNK+50% JUNK chance",
maxCount: 9,
count: 0,
frequency: 0,
@@ -10946,24 +10910,6 @@ const tech = {
},
remove() { }
},
- // {
- // name: "microtransactions",
- // description: `when you choose a
tech you can
use ${powerUps.orb.research(1)} to buy a free in game
skin`,
- // maxCount: 1,
- // count: 0,
- // frequency: 0,
- // isJunk: true,
- // allowed() {
- // return true
- // },
- // requires: "",
- // effect() {
- // tech.isMicroTransactions = true
- // },
- // remove() {
- // tech.isMicroTransactions = false
- // }
- // },
{
name: "ship",
description: "fly around with no legs",
@@ -11098,7 +11044,7 @@ const tech = {
},
{
name: "translucent",
- description: "spawn
3 gun power ups
your
bullets and bots are transparent",
+ description: `spawn ${powerUps.orb.gun()}${powerUps.orb.gun()}${powerUps.orb.gun()}
your
bullets and bots are transparent`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -11459,7 +11405,7 @@ const tech = {
},
{
name: "planetesimals",
- description: `play
planetesimals (an asteroids-like game)clear
levels in
planetesimals to spawn
techif you
die in
planetesimals you
die in
n-gon`,
+ description: `play
planetesimals (an asteroids-like game)clear
levels in
planetesimals to spawn ${powerUps.orb.tech()}
if you
die in
planetesimals you
die in
n-gon`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -11494,7 +11440,7 @@ const tech = {
},
{
name: "tinker",
- description: "
permanently unlock
JUNKtech in experiment mode
this effect is stored for future visits",
+ description: `
permanently unlock
JUNK${powerUps.orb.tech()} in experiment mode
this effect is stored for future visits`,
maxCount: 1,
count: 0,
frequency: 0,
@@ -11643,10 +11589,6 @@ const tech = {
this.description = `
null is open at level.final()
`
} else {
this.frequency += lore.techGoal * 2
- // 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}/${lore.techGoal}
add copies of this to the potential tech pool`
- // }
- // for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool()
this.description = `
uncaught error:${Math.max(0, lore.techGoal - lore.techCount)} more required for access to
null`
}
}, 1);
@@ -11658,46 +11600,8 @@ const tech = {
}
}
],
- // addLoreTechToPool() { //adds lore tech to tech pool
- // if (!simulation.isCheating) {
- // tech.tech.push({
- // name: `undefined`,
- // description: `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`,
- // maxCount: 1,
- // count: 0,
- // frequency: 2,
- // isLore: true,
- // isInstant: true,
- // isExperimentHide: true,
- // allowed() {
- // return true
- // },
- // requires: "",
- // effect() {
- // setTimeout(() => { //a short delay, I can't remember why
- // lore.techCount++
- // if (lore.techCount > lore.techGoal - 1) {
- // // tech.removeLoreTechFromPool();
- // for (let i = tech.tech.length - 1; i > 0; i--) {
- // if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1)
- // }
- // } else {
- // 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}/${lore.techGoal}
add copies of this to the potential tech pool`
- // }
- // for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool()
- // }
- // }, 1);
- // },
- // remove() {}
- // })
- // }
- // },
- // junk: [
-
- // ],
//variables use for gun tech upgrades
- fireRate: null,
+ fireRate: 1, //initializes to 1
bulletSize: null,
energySiphon: null,
healSpawn: null,
@@ -12049,4 +11953,5 @@ const tech = {
isMaxHealthDefense: null,
isNoDefenseDamage: null,
isMaxHealthDamage: null,
+ ejectOld: null,
}
\ No newline at end of file
diff --git a/style.css b/style.css
index 347b57b..5ccb90b 100644
--- a/style.css
+++ b/style.css
@@ -184,15 +184,11 @@ summary {
scrollbar-width: none;
}
-
-
-
.choose-grid-no-images {
border-radius: 8px;
border: 10px solid #444;
gap: 10px;
background-color: #444;
- /* padding: 10px 1px; */
position: absolute;
top: 50%;
left: 50%;
@@ -222,9 +218,6 @@ summary {
line-height: 160%;
background-color: var(--card-color);
font-size: 0.75em;
- /* transform-style: preserve-3d;
- transition: transform 2s;
- transform: rotateX(180deg); */
}
.choose-grid-module:hover {
@@ -259,9 +252,7 @@ summary {
overflow: auto;
max-height: 100vh;
-ms-overflow-style: none;
- /* IE and Edge */
scrollbar-width: none;
- /* Firefox */
padding: 1px;
}
@@ -276,21 +267,9 @@ summary {
overflow: auto;
max-height: 100vh;
-ms-overflow-style: none;
- /* IE and Edge */
scrollbar-width: none;
- /* Firefox */
}
-/* .pause-console { */
-/* padding: 10px; */
-/* margin: 10px; */
-/* border-radius: 10px; */
-/* line-height: 140%; */
-/* font-size: 1em; */
-/* padding: 10px; */
-/* margin: -5px 0; */
-/* } */
-
#pause-grid-left::-webkit-scrollbar {
display: none;
}
@@ -581,6 +560,10 @@ summary {
z-index: 12;
font-size: 1.5em;
transition: opacity 5s ease-in;
+
+ /* border: 1.5px #333 solid; */
+ /* border-radius: 8px; */
+ /* background-color: #fff; */
}
.details-div {
@@ -588,20 +571,9 @@ summary {
border-radius: 8px;
border: 2px #333 solid;
background-color: #fff;
- /* box-shadow: 8px 8px 6px rgba(0, 0, 60, 0.11); */
}
-
-
-
-
-
-
-
-
-
-
#dmg {
position: absolute;
z-index: 2;
@@ -757,6 +729,7 @@ summary {
/* transition: opacity 0.15s; */
pointer-events: none;
user-select: none;
+ /* font-family: monospace; */
}
.color-text {
@@ -998,13 +971,27 @@ summary {
}
.circle-grid {
- width: 1.35em;
- height: 1.35em;
+ width: 1.32em;
+ height: 1.32em;
border-radius: 50%;
display: inline-block;
margin-bottom: -0.3em;
}
+.circle-grid-big {
+ /* width: 1.7em;
+ height: 1.7em;
+ border-radius: 50%;
+ display: inline-block;
+ margin-bottom: -0.5em -0.5em -0.5em -0.5em; */
+ width: 1.32em;
+ height: 1.32em;
+ border-radius: 50%;
+ display: inline-block;
+ margin-bottom: -0.3em;
+ transform: scale(1.5);
+}
+
.circle-grid-instant {
width: 1.1em;
height: 1.1em;
@@ -1660,7 +1647,7 @@ summary {
}
.pause-details {
- background-color: hsl(240, 18%, 93%);
+ background-color: #e2e9ec;
border: 1px solid #333;
border-radius: 5px;
padding: 7px;
diff --git a/todo.txt b/todo.txt
index 34a2108..974162a 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,53 +1,40 @@
******************************************************** NEXT PATCH **************************************************
-snakeBoss - boss with a tail that grows longer after damage or eating power ups
- maybe have it eat blocks too?
+replaced tech, field, and gun text with orbs
+ orbs length scale with px->em
+cleaned up simulation variables text in pause menu
+some minor tech description changes
+total tech count no longer includes instant tech or removed tech
-trying out putting actual system error messages directly into the in-game console
+tech: planned obsolescence - at the start of each level eject your oldest tech and gain 1.1 damage
-charmed baryons: 0.66->0.8x movement
-grappling hook field: 0.6->0.5 damage taken
+heuristics 1.3 -> between 1 and 1.5 fire rate
+combinatorial optimization 1.35->1.4 damage
-******************************************************* DESIGN ******************************************************
+difficulty reduction per level
+ 0.85->0.87x damage done
+ 1.23->1.22 damage taken
-priorities
- synergies between tech
- difficult to achieve synergies that feel so powerful they are game breaking / changing
- randomized content that adds repeatability
- bosses, mobs, levels, tech
- graphical indicators of tech effects and quantity
- subtle lore woven into unexpected places
+******************************************************** BUGS ********************************************************
-add more randomize sub level map content
- left/right sides of lock
- small lab rooms
+ants marching outline on splash screen doesn't sync right on safari
-list of powerful synergies
- CPT + high energy regen
- research + bot fabrication + ersatz bots + various bot upgrades
- harpoon + high fire rate + alternator + time dilation
- duplication 100%
- interest + coupling, research + (peer review? or Bayesian statistics)
- electronegativity and high energy?
- electronegativity + anyon + duplication + Maxwells demon + interest + pair production
- chain reaction + invulnerable + Abelian group + parasitism = clear all mobs on level
+player can become crouched while not touching the ground if they exit the ground while crouched
+
+fix door.isClosing actually meaning isClosed?
*********************************************************** TODO *****************************************************
+tech - at the start of each new level eject the oldest tech you have and gain 10% damage
+
+
+
merge multiple power ups of the same type if nearby
5-10 ammo, research, coupling can merge to form a slightly larger power up version
check for merger possibility every 60 seconds?
adjust mass spawns to just spawn larger power ups versions and change?
spawnDelay
-white laser
- what to name? not much in wikipedia
- goes through shields?
- damage, energy cost
- 3+ closely overlapping beams (but reflecting, not like diffusion)
- tech.laserColor = "#fff"
- tech.laserColorAlpha = "rgba(255, 255, 255, 0.5)"
-
tech: atomic pile - lose 1 health if you are above the maximum energy
generate energy for each nearby mob?
do damage?
@@ -56,9 +43,6 @@ tech: atomic pile - lose 1 health if you are above the maximum energy
field tech: molecular assembler - every time you spawn a drone/spore/... become immune to damage for time
scales with how much energy was used to spawn drone/...
-make some explosions have less knock back?
- annoying with flame test, boom bot?
-
figure out how to put instructions for controls in background on initial level
mouse smooth makes the text position jitter when it moves sub pixels
hide the jitter with artificial jitter to make it seem intentional
@@ -154,8 +138,6 @@ make sure healing isn't effected by simulation.healScale
instead heal orb size should be scaled
but the ratio between size and heal shouldn't be effected
-tech - destroys a random tech each new level and gains +damage each time
-
boss - tracks the position, velocity, angle of power ups, blocks, and bullets it fires
reactor only?
will rewind time
@@ -992,77 +974,6 @@ n-gon outreach ideas
hacker news - show hacker news post
twitch - lets play
-******************************************************** BUGS ********************************************************
-
-bug: maybe I can put in an event listener to reset inputs to false when you tab out to prevent key sticking
-
-bug - url sharing still broken sometimes
-
-tech upgrade to anthropic principle to make it trigger at 50% life and 0% once per map
-
-bug? cloaking field doesn't show energy over max
-
-run more profiles of n-gon to fix performance issues
-
-bug - death while paused crashes game?
-
-bug: possibly clearing away all bullets causes a problem
- bullet.js 255 (.do() is missing)
- I died and quantum immortality triggered (I had needles and ice-IX)
- game crashed but recovered
-
-vanish element bug, crashes on touching element, happens for 1 person maybe with junk tech?
-
-safari issues
- once: can't pick up blocks
- fixed on new map
- cloaking field
- once: after damage, locked into slow time mode
- fixed on damage
- 3 times player head graphics not rotating
- left/right leg flip broke
- walk leg direction, legs are walking backwards
- happened maybe after power up selection menu??
- cloaking field(at least once)
- aiming still works
- fixed on new map, although flip still broken (is flip a separate issue?)
- flip fixed on new game
-
-sharing builds as html doesn't work for long lists...
- it shouldn't be sharing undefined at all
- probably some other problems too
- (this might be fixed...)
-
-blocks on buttons teleport into the button endlessly if they are being slowly floated away
- maybe add a cooldown?
- can't reproduce
-
-ants marching outline doesn't sync right on safari anymore.
-
-door to exit in level: vats does nothing
- did I do that?
-
-death while in power up selection menu doesn't reset properly
- of course it's not possible to die in this menu unless you use testing and shift+X
-
-player can become crouched while not touching the ground if they exit the ground while crouched
-
-a couple times people have reported the final boss dropping extra bodies on death
-
-blue triangle boss can move backwards and aim away from you if set up properly
- issues with dot product probably, but might not be worth fixing
-
-mouse event e.which is deprecated
-
-fix door.isClosing actually meaning isClosed?
-
-make it so that when you are immune to harm you can either jump on mobs or you pass through them
-
-is there a way to check if the player is stuck inside the map or block
- trigger a short term non-collide if that occurs
-
-(intermittent, but almost every time) bug - capping the fps causes random slow downs, that can be fixed with pause
-
******************************************************** LEVELS ********************************************************
map: observatory
@@ -1210,6 +1121,72 @@ add sounds
// tone(445.50)
// tone(495)
+******************************************************** IMAGES ********************************************************
+
+process: discord midjourney prompts -> "pixelmator pro" adjust color, repair, scale to 384x256, export PNG -> webP? -> place in /img folder
+make n-gon a progressive web app to manage image downloads, cache
+wave function collapse opens the pause menu after it triggers alternate reality
+ this is actually good, maybe reuse this code to get pause menu to open at any time
+if pause is pressed while selecting power ups, display pause menu on top of selection menu
+***styles***
+ try --- Pastel drawing, Psychedelic art, Arabesque (cool patterns), knolling (everything spread out and placed on a flat mat)
+ try taking screen shots of fields graphics and feeding them into midJourney V4
+ technology stuff --- Dan Matutina (cute complex technology),
+ Katsuhiro Otomo (intricate space technology), Tsutomu Nihei (black and white detailed future tech)
+ infographics of all know multiverses. 1980s Japanese graphic design, dimensional astrolabe,
+ Japanese poster graphics, Ralph McQuarrie (looks like star wars), Simon Stålenhag (retro-futuristic), Yoshiyuki Tomino (detailed anime future technology)
+ isometric: low-poly, box cutout, made in blender, Materials: matte clay
+ subtractive sculpture
+ kinetic sculpture
+ quantum stuff -- Hypertorus, Glowing Opal Pearlescent, Physics, Hydro-Dipping Hydrodipped, Vija Celmins, Matt Molloy (photo of golden waves in the sky)
+***maybe redo***
+ laser
+ supercritical fission
+***past style themes***
+ base prompt for player on 5.2: clean white robot spherical turret on bird legs test chamber
+ standing wave - a 3-D cyan transparent nested concentric aligned centered sphere with rings
+ by Philippe Starck
+ perfect diamagnetism - physics magnetic field chalk diagram
+ time dilation - graphic of a hyperbolic equation Luminogram
+ negative mass - Blacklight painting by Moebius
+ plasma torch - by Dan Mumford
+
+ metamaterial cloaking - Scientific photography by Miki Asai, by Bruce Munro
+ molecular assembler - by Laurie Greasley 16-bit Isometric
+ wormhole - by Tim White
+ pilot wave - none
+
+ nail gun - Screenprint
+ shotgun - blueprint by Dan McPharlin
+ grenades, missiles, explosions - vibrant fireball explosion sonic shockwave ring art by Victo Ngai --ar 3:2 --v 5 --s 750
+ spores - turquoise black spores on a white background full color scientific anatomy by Ernst Haeckel
+ drones - insect quadcopter tilt-shift photography
+ super balls - By Akari Toriyama
+ wave - sound wave oscilloscope by Paul Catherall, concentric circles by Paul Catherall
+ Barbara Takenaga's painting depicting a clean sound wave on aoscilloscope device --ar 3:2 --v 5
+ foam - black blobs Ink doodle
+ harpoon - iron harpoon on a rope weapon art white background by Eiichiro Oda --no fish --ar 3:2 --v 5 --s 750
+ mine - by Dan McPharlin
+ laser - complex optical scientific equipment
+ knolling photography
+
+ guns, ammo - isometric clean pixel art image cutaway of , style of tekkonkinkreet
+ defensive - Paper cutout
+ bots - hovering drone by Laurie Greasley 16-bit Isometric
+ generic energy tech - by Laurie Greasley
+ duplication, cancel - by Kazumasa Nagai
+ anti-shear topology, fracture analysis, shear stress - Chemigram
+ ON/OFF - ASCII art
+ block throwing - Bauhaus style
+ tech that adds JUNK - by Choi Jeong-hwa
+ ice IX - microscope images of ice crystals
+ tech that spawns health - glowing green balls by Enki Bilal
+ invulnerable - by Nick Veasey (photos that look like x-rays)
+ alternate reality - Fractal art
+ tech choice - mandala tile Mosaic
+ time, CPT, pause - by Lee Bontecou
+ boost, coupling power ups tech - cyan electron orbiting a black nucleus electric field as bas-relief //(by Kazumasa Nagai)
+ radioactive - volumetric atomic nucleus diagram by Paul Catherall
******************************************************** LORE ********************************************************
@@ -1279,75 +1256,32 @@ possible names for tech
Casimir effect - attractive force between two close conductive plates
difference engine - early calculator/computer
cyanoacrylate - superglue use for a slowing effect?
- hysteresis - the dependence of the state of a system on its history
superposition - something with waves overlapping
+ math terms - integral, derivative, Laplace transform, inflection point
+ quasicrystals - something with low friction, maybe defense?
+ Coalescence - things merging together like clouds. maybe mergin power ups?
+ trihydrogen cation - common molecule in space, dark matter tech?
-******************************************************** IMAGES ********************************************************
-
-process: discord midjourney prompts -> "pixelmator pro" adjust color, repair, scale to 384x256, export PNG -> webP? -> place in /img folder
-make n-gon a progressive web app to manage image downloads, cache
-wave function collapse opens the pause menu after it triggers alternate reality
- this is actually good, maybe reuse this code to get pause menu to open at any time
-if pause is pressed while selecting power ups, display pause menu on top of selection menu
-***styles***
- try --- Pastel drawing, Psychedelic art, Arabesque (cool patterns), knolling (everything spread out and placed on a flat mat)
- try taking screen shots of fields graphics and feeding them into midJourney V4
- technology stuff --- Dan Matutina (cute complex technology),
- Katsuhiro Otomo (intricate space technology), Tsutomu Nihei (black and white detailed future tech)
- infographics of all know multiverses. 1980s Japanese graphic design, dimensional astrolabe,
- Japanese poster graphics, Ralph McQuarrie (looks like star wars), Simon Stålenhag (retro-futuristic), Yoshiyuki Tomino (detailed anime future technology)
- isometric: low-poly, box cutout, made in blender, Materials: matte clay
- subtractive sculpture
- kinetic sculpture
- quantum stuff -- Hypertorus, Glowing Opal Pearlescent, Physics, Hydro-Dipping Hydrodipped, Vija Celmins, Matt Molloy (photo of golden waves in the sky)
-***maybe redo***
- laser
- supercritical fission
-***past style themes***
- base prompt for player on 5.2: clean white robot spherical turret on bird legs test chamber
- standing wave - a 3-D cyan transparent nested concentric aligned centered sphere with rings
- by Philippe Starck
- perfect diamagnetism - physics magnetic field chalk diagram
- time dilation - graphic of a hyperbolic equation Luminogram
- negative mass - Blacklight painting by Moebius
- plasma torch - by Dan Mumford
-
- metamaterial cloaking - Scientific photography by Miki Asai, by Bruce Munro
- molecular assembler - by Laurie Greasley 16-bit Isometric
- wormhole - by Tim White
- pilot wave - none
-
- nail gun - Screenprint
- shotgun - blueprint by Dan McPharlin
- grenades, missiles, explosions - vibrant fireball explosion sonic shockwave ring art by Victo Ngai --ar 3:2 --v 5 --s 750
- spores - turquoise black spores on a white background full color scientific anatomy by Ernst Haeckel
- drones - insect quadcopter tilt-shift photography
- super balls - By Akari Toriyama
- wave - sound wave oscilloscope by Paul Catherall, concentric circles by Paul Catherall
- Barbara Takenaga's painting depicting a clean sound wave on aoscilloscope device --ar 3:2 --v 5
- foam - black blobs Ink doodle
- harpoon - iron harpoon on a rope weapon art white background by Eiichiro Oda --no fish --ar 3:2 --v 5 --s 750
- mine - by Dan McPharlin
- laser - complex optical scientific equipment
- knolling photography
-
- guns, ammo - isometric clean pixel art image cutaway of , style of tekkonkinkreet
- defensive - Paper cutout
- bots - hovering drone by Laurie Greasley 16-bit Isometric
- generic energy tech - by Laurie Greasley
- duplication, cancel - by Kazumasa Nagai
- anti-shear topology, fracture analysis, shear stress - Chemigram
- ON/OFF - ASCII art
- block throwing - Bauhaus style
- tech that adds JUNK - by Choi Jeong-hwa
- ice IX - microscope images of ice crystals
- tech that spawns health - glowing green balls by Enki Bilal
- invulnerable - by Nick Veasey (photos that look like x-rays)
- alternate reality - Fractal art
- tech choice - mandala tile Mosaic
- time, CPT, pause - by Lee Bontecou
- boost, coupling power ups tech - cyan electron orbiting a black nucleus electric field as bas-relief //(by Kazumasa Nagai)
- radioactive - volumetric atomic nucleus diagram by Paul Catherall
+******************************************************* DESIGN ******************************************************
+priorities
+ synergies between tech
+ difficult to achieve synergies that feel so powerful they are game breaking / changing
+ randomized content that adds repeatability
+ bosses, mobs, levels, tech
+ graphical indicators of tech effects and quantity
+ subtle lore woven into unexpected places
+add more randomize sub level map content
+ left/right sides of lock
+ small lab rooms
+list of powerful synergies
+ CPT + high energy regen
+ research + bot fabrication + ersatz bots + various bot upgrades
+ harpoon + high fire rate + alternator + time dilation
+ duplication 100%
+ interest + coupling, research + (peer review? or Bayesian statistics)
+ electronegativity and high energy?
+ electronegativity + anyon + duplication + Maxwells demon + interest + pair production
+ chain reaction + invulnerable + Abelian group + parasitism = clear all mobs on level