diff --git a/img/Zectron.webp b/img/Zectron.webp new file mode 100644 index 0000000..89ebe0f Binary files /dev/null and b/img/Zectron.webp differ diff --git a/img/colony.webp b/img/colony.webp index 5a6cfee..2d721ab 100644 Binary files a/img/colony.webp and b/img/colony.webp differ diff --git a/img/cordyceps.webp b/img/cordyceps.webp new file mode 100644 index 0000000..1449780 Binary files /dev/null and b/img/cordyceps.webp differ diff --git a/img/gauge.webp b/img/gauge.webp index d5c4df4..a4f5231 100644 Binary files a/img/gauge.webp and b/img/gauge.webp differ diff --git a/img/mutualism.webp b/img/mutualism.webp index e1fb494..5431c72 100644 Binary files a/img/mutualism.webp and b/img/mutualism.webp differ diff --git a/img/mycelial fragmentation.webp b/img/mycelial fragmentation.webp index 7c8f807..ba06c78 100644 Binary files a/img/mycelial fragmentation.webp and b/img/mycelial fragmentation.webp differ diff --git a/img/nematodes.webp b/img/nematodes.webp index 3fba87f..26c7a33 100644 Binary files a/img/nematodes.webp and b/img/nematodes.webp differ diff --git a/img/path integration.webp b/img/path integration.webp index 7eeb22b..1cf8f34 100644 Binary files a/img/path integration.webp and b/img/path integration.webp differ diff --git a/img/siphonaptera.webp b/img/siphonaptera.webp index afb816d..1b55f51 100644 Binary files a/img/siphonaptera.webp and b/img/siphonaptera.webp differ diff --git a/js/bullet.js b/js/bullet.js index f9c658a..23fc47a 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1860,7 +1860,7 @@ const b = { if (tech.isFoamBall) { for (let i = 0, len = Math.min(50, 3 + 4 * Math.sqrt(this.mass)); i < len; i++) { const radius = 5 + 8 * Math.random() - const velocity = {x: Math.max(0.5, 2 - radius * 0.1),y: 0} + const velocity = { x: Math.max(0.5, 2 - radius * 0.1), y: 0 } b.foam(this.position, Vector.rotate(velocity, 6.28 * Math.random()), radius) } } @@ -3763,71 +3763,71 @@ const b = { y: speed * Math.sin(dir) }); }, - superBall(where, velocity, radius){ - let dir = m.angle - const me = bullet.length; - bullet[me] = Bodies.polygon(where.x,where.y, 12, radius, b.fireAttributes(dir, false)); - Composite.add(engine.world, bullet[me]); //add bullet to world - Matter.Body.setVelocity(bullet[me], velocity); - Matter.Body.setDensity(bullet[me], 0.0001 + 0.001 * tech.isSuperHarm); - bullet[me].endCycle = simulation.cycle + Math.floor(300 + 90 * Math.random()); - bullet[me].minDmgSpeed = 0; - bullet[me].restitution = 1; - bullet[me].friction = 0; - if (tech.isIncendiary) { - bullet[me].do = function() { - this.force.y += this.mass * 0.0012; - if (Matter.Query.collides(this, map).length) { - b.explosion(this.position, this.mass * 280); //makes bullet do explosive damage at end - this.endCycle = 0 - } - }; - } else if (tech.isSuperHarm){ - bullet[me].collidePlayerDo = function(){ - if (Matter.Query.collides(this, [player]).length) { - this.endCycle = 0 - let dmg = 0.03 - m.damage(dmg); - simulation.drawList.push({ //add dmg to draw queue - x: this.position.x, - y: this.position.y, - radius: Math.sqrt(dmg) * 200, - color: simulation.mobDmgColor, - time: simulation.drawTime*2 - }); - } - } - bullet[me].cycle= 0 - bullet[me].do = function() { - this.cycle++ - if (this.cycle > 60) this.do = this.collidePlayerDo - this.force.y += this.mass * 0.0012; - }; - } else { - bullet[me].do = function() { - this.cycle++ - this.force.y += this.mass * 0.0012; - }; + superBall(where, velocity, radius) { + let dir = m.angle + const me = bullet.length; + bullet[me] = Bodies.polygon(where.x, where.y, 12, radius, b.fireAttributes(dir, false)); + Composite.add(engine.world, bullet[me]); //add bullet to world + Matter.Body.setVelocity(bullet[me], velocity); + Matter.Body.setDensity(bullet[me], 0.0001 + 0.001 * tech.superHarm); + bullet[me].endCycle = simulation.cycle + Math.floor(300 + 90 * Math.random()); + bullet[me].minDmgSpeed = 0; + bullet[me].restitution = 1; + bullet[me].friction = 0; + if (tech.isIncendiary) { + bullet[me].do = function() { + this.force.y += this.mass * 0.0012; + if (Matter.Query.collides(this, map).length) { + b.explosion(this.position, this.mass * 280); //makes bullet do explosive damage at end + this.endCycle = 0 } - bullet[me].beforeDmg = function(who) { - if (tech.oneSuperBall) mobs.statusStun(who, 120) // (2.3) * 2 / 14 ticks (2x damage over 7 seconds) - // if (tech.isIncendiary) { - // b.explosion(this.position, this.mass * (240+70 * Math.random()) ); //makes bullet do explosive damage at end - // this.endCycle = 0 - // } - if (tech.isFoamBall) { - for (let i = 0, len = 6 * this.mass; i < len; i++) { - const radius = 5 + 8 * Math.random() - // const velocity = { x: Math.max(2, 10 - radius * 0.25), y: 0 } - const velocity = { - x: Math.max(0.5, 2 - radius * 0.1), - y: 0 - } - b.foam(this.position, Vector.rotate(velocity, 6.28 * Math.random()), radius) - } - this.endCycle = 0 + }; + } else if (tech.superHarm) { + bullet[me].collidePlayerDo = function() { + if (Matter.Query.collides(this, [player]).length) { + this.endCycle = 0 + let dmg = 0.03 * this.mass * tech.superHarm + m.damage(dmg); + simulation.drawList.push({ //add dmg to draw queue + x: this.position.x, + y: this.position.y, + radius: Math.sqrt(dmg) * 200, + color: simulation.mobDmgColor, + time: simulation.drawTime * 2 + }); + } + } + bullet[me].cycle = 0 + bullet[me].do = function() { + this.cycle++ + if (this.cycle > 6) this.do = this.collidePlayerDo + this.force.y += this.mass * 0.0012; + }; + } else { + bullet[me].do = function() { + this.cycle++ + this.force.y += this.mass * 0.0012; + }; + } + bullet[me].beforeDmg = function(who) { + if (tech.oneSuperBall) mobs.statusStun(who, 120) // (2.3) * 2 / 14 ticks (2x damage over 7 seconds) + // if (tech.isIncendiary) { + // b.explosion(this.position, this.mass * (240+70 * Math.random()) ); //makes bullet do explosive damage at end + // this.endCycle = 0 + // } + if (tech.isFoamBall) { + for (let i = 0, len = 6 * this.mass; i < len; i++) { + const radius = 5 + 8 * Math.random() + // const velocity = { x: Math.max(2, 10 - radius * 0.25), y: 0 } + const velocity = { + x: Math.max(0.5, 2 - radius * 0.1), + y: 0 } - }; + b.foam(this.position, Vector.rotate(velocity, 6.28 * Math.random()), radius) + } + this.endCycle = 0 + } + }; }, // plasmaBall(position, velocity, radius) { // // radius *= Math.sqrt(tech.bulletSize) @@ -6177,9 +6177,9 @@ const b = { m.fireCDcycle = m.cycle + Math.floor((input.down ? 27 : 19) * b.fireCDscale); // cool down const speed = input.down ? 43 : 36 b.superBall({ - x:m.pos.x + 30 * Math.cos(m.angle), - y:m.pos.y + 30 * Math.sin(m.angle) - },{ + x: m.pos.x + 30 * Math.cos(m.angle), + y: m.pos.y + 30 * Math.sin(m.angle) + }, { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }, 21 * tech.bulletSize) @@ -6192,9 +6192,9 @@ const b = { let dir = m.angle - SPREAD * (num - 1) / 2; for (let i = 0; i < num; i++) { b.superBall({ - x:m.pos.x + 30 * Math.cos(dir), - y:m.pos.y + 30 * Math.sin(dir) - },{ + x: m.pos.x + 30 * Math.cos(dir), + y: m.pos.y + 30 * Math.sin(dir) + }, { x: speed * Math.cos(dir), y: speed * Math.sin(dir) }, 11 * tech.bulletSize) @@ -6211,9 +6211,9 @@ const b = { function cycle() { count++ b.superBall({ - x:m.pos.x + 30 * Math.cos(m.angle), - y:m.pos.y + 30 * Math.sin(m.angle) - },{ + x: m.pos.x + 30 * Math.cos(m.angle), + y: m.pos.y + 30 * Math.sin(m.angle) + }, { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }, 11 * tech.bulletSize) @@ -6816,7 +6816,7 @@ const b = { this.stuckTo = mobCollisions[0].bodyA if (tech.isZombieMobs) this.stuckTo.isSoonZombie = true if (this.stuckTo.isVerticesChange) { - this.stuckToRelativePosition = {x: 0, y: 0} + this.stuckToRelativePosition = { x: 0, y: 0 } } else { //find the relative position for when the mob is at angle zero by undoing the mobs rotation this.stuckToRelativePosition = Vector.rotate(Vector.sub(this.position, this.stuckTo.position), -this.stuckTo.angle) @@ -6936,8 +6936,8 @@ const b = { }, () => { //super ball const speed = 36 - const angle = 2*Math.PI*Math.random() - b.superBall(this.position,{ + const angle = 2 * Math.PI * Math.random() + b.superBall(this.position, { x: speed * Math.cos(angle), y: speed * Math.sin(angle) }, 11 * tech.bulletSize) diff --git a/js/index.js b/js/index.js index d65b6e4..9ccae2f 100644 --- a/js/index.js +++ b/js/index.js @@ -157,7 +157,6 @@ window.addEventListener('load', () => { simulation.molecularMode = Number(set[property]) const i = 4 //update experiment text m.fieldUpgrades[i].description = m.fieldUpgrades[i].setDescription() - // document.getElementById(`field-${i}`).innerHTML = `
  ${build.nameLink(m.fieldUpgrades[i].name)}
${m.fieldUpgrades[i].description}` document.getElementById(`field-${i}`).innerHTML = `
  ${build.nameLink(m.fieldUpgrades[i].name)}
${m.fieldUpgrades[i].description}
` @@ -325,7 +324,8 @@ const build = { if (tech.plasmaBotCount) botText += `
plasma-bots: ${tech.plasmaBotCount}` if (tech.missileBotCount) botText += `
missile-bots: ${tech.missileBotCount}` - let text = `
+ let text = `
+ copy build url PAUSED @@ -349,13 +349,13 @@ ${botText} mouse: (${simulation.mouseInGame.x.toFixed(1)}, ${simulation.mouseInGame.y.toFixed(1)})
tech: ${tech.totalCount}   research: ${powerUps.research.count} velocity: (${player.velocity.x.toFixed(3)}, ${player.velocity.y.toFixed(3)}) -${junkCount ? `
JUNK: ${(junkCount / totalCount * 100).toFixed(1)}% `: ""} +${junkCount ? `
JUNK: ${(junkCount / totalCount * 100).toFixed(1)}% `: ""}

level: ${level.levelsCleared} ${level.levels[level.onLevel]} (${level.difficultyText()})
seed: ${Math.initialSeed}   ${m.cycle} cycles
mobs: ${mob.length}   blocks: ${body.length}   bullets: ${bullet.length}   power ups: ${powerUp.length} ${simulation.isCheating ? "

lore disabled": ""} -
`; +
`; // deaths: ${mobs.mobDeaths}   if (tech.isPauseSwitchField && !simulation.isChoosing) { const style = localSettings.isHideImages ? `style="height:auto;"` : `style="background-image: url('img/field/${m.fieldUpgrades[m.fieldMode].name}${m.fieldMode === 0 ? Math.floor(Math.random()*10) : ""}.webp');"` @@ -588,7 +588,7 @@ ${simulation.isCheating ? "

lore disabled": ""} }, populateGrid() { //background-color:var(--build-bg-color); let text = ` -
+
diff --git a/js/level.js b/js/level.js index 5a9fcc4..c694ce2 100644 --- a/js/level.js +++ b/js/level.js @@ -28,11 +28,11 @@ const level = { // m.setField("perfect diamagnetism") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch // simulation.molecularMode = 2 // m.damage(0.1); - // b.giveGuns("nail gun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser + // b.giveGuns("super balls") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser // b.giveGuns("spores") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser // b.guns[0].ammo = 10000 - // tech.giveTech("Zectron") // tech.giveTech("cordyceps") + // tech.giveTech("Zectron") // for (let i = 0; i < 1; ++i) tech.giveTech("super ball") // tech.isFoamBall = true // for (let i = 0; i < 1; ++i) tech.giveTech("incendiary ammunition") diff --git a/js/player.js b/js/player.js index 78f1a2d..6246d82 100644 --- a/js/player.js +++ b/js/player.js @@ -2974,7 +2974,7 @@ const m = { }, { name: "metamaterial cloaking", - description: "when not firing activate cloaking
after decloaking +333% damage for up to 2 s
generate 6 energy per second", + description: "when not firing activate cloaking
after decloaking +333% damage for 2 s
generate 6 energy per second", effect: () => { m.fieldFire = true; m.fieldMeterColor = "#333"; diff --git a/js/powerup.js b/js/powerup.js index 8863f29..45db754 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -620,21 +620,21 @@ const powerUps = { if (tech.isSuperDeterminism) { return `
` } else if (tech.isCancelTech) { - return `
randomize
` + return `
randomize
` } else { - return `
cancel
` + return `
cancel
` } }, researchText(type) { let text = "" if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) { - text += `
` // style = "margin-left: 192px; margin-right: -192px;" + text += `
` // style = "margin-left: 192px; margin-right: -192px;" tech.junkResearchNumber = Math.ceil(4 * Math.random()) text += `
` - for (let i = 0; i < tech.junkResearchNumber; i++) text += `
` + for (let i = 0; i < tech.junkResearchNumber; i++) text += `
` text += `
  pseudoscience
` } else if (powerUps.research.count > 0) { - text += `
` // style = "margin-left: 192px; margin-right: -192px;" + text += `
` // style = "margin-left: 192px; margin-right: -192px;" text += `
` for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `
` text += `
  ${tech.isResearchReality?"alternate reality": "research"}
` @@ -644,21 +644,29 @@ const powerUps = { return text }, buildColumns(totalChoices, type) { + let width + if (canvas.width < 1500) { + width = "340px" + } else if (canvas.width < 1950) { + width = "360px" + } else { + width = "384px" + } let text = "" if (localSettings.isHideImages || canvas.width < 1200) { - document.getElementById("choose-grid").style.gridTemplateColumns = "384px" + document.getElementById("choose-grid").style.gridTemplateColumns = width text += powerUps.cancelText(type) text += powerUps.researchText(type) } else if (totalChoices === 2) { - document.getElementById("choose-grid").style.gridTemplateColumns = "384px 384px" + document.getElementById("choose-grid").style.gridTemplateColumns = `repeat(2, ${width})` text += powerUps.researchText(type) text += powerUps.cancelText(type) } else if (totalChoices === 1) { - document.getElementById("choose-grid").style.gridTemplateColumns = "384px" + document.getElementById("choose-grid").style.gridTemplateColumns = width text += powerUps.cancelText(type) text += powerUps.researchText(type) } else { - document.getElementById("choose-grid").style.gridTemplateColumns = "384px 384px 384px" + document.getElementById("choose-grid").style.gridTemplateColumns = `repeat(3, ${width})` text += "
" text += powerUps.researchText(type) text += powerUps.cancelText(type) diff --git a/js/tech.js b/js/tech.js index f4b2565..665fe8b 100644 --- a/js/tech.js +++ b/js/tech.js @@ -299,7 +299,7 @@ const tech = { }, tech: [{ name: "ordnance", - description: "double the frequency of finding guntech
spawn a gun and +7% JUNK to tech pool", + description: "double the frequency of finding guntech
spawn a gun and +7% JUNK to tech pool", maxCount: 1, count: 0, frequency: 1, @@ -509,7 +509,7 @@ const tech = { { name: "supply chain", descriptionFunction() { - return `double your current ammo
+4% JUNK to tech pool` + return `double your current ammo
+4% JUNK to tech pool` }, maxCount: 9, count: 0, @@ -2512,7 +2512,7 @@ const tech = { }, { name: "overcharge", - description: "+66 maximum energy
+6% JUNK to tech pool", + description: "+66 maximum energy
+6% JUNK to tech pool", maxCount: 9, count: 0, frequency: 1, @@ -2538,7 +2538,7 @@ const tech = { }, { name: "Maxwells demon", - description: "energy above your max decays 96% slower
+5% JUNK to tech pool", + description: "energy above your max decays 96% slower
+5% JUNK to tech pool", maxCount: 1, count: 0, frequency: 2, @@ -2846,7 +2846,7 @@ const tech = { { name: "adiabatic healing", descriptionFunction() { - return `${powerUps.orb.heal()} have +100% effect
+5% JUNK to tech pool` + return `${powerUps.orb.heal()} have +100% effect
+5% JUNK to tech pool` }, maxCount: 3, count: 0, @@ -3234,7 +3234,7 @@ const tech = { }, { name: "pseudoscience", - description: "when selecting a power up, research 3 times
for free, but add 1-4% JUNK to the tech pool", + description: "when selecting a power up, research 3 times
for free, but add 1-4% JUNK to the tech pool", maxCount: 1, count: 0, frequency: 1, @@ -3292,7 +3292,7 @@ const tech = { { name: "emergence", description: "tech, fields, and guns have +1 choice
+8% damage", - // description: "tech, fields, and guns have +2 choices
+3% JUNK to tech pool", + // description: "tech, fields, and guns have +2 choices
+3% JUNK to tech pool", maxCount: 9, count: 0, frequency: 1, @@ -3319,7 +3319,7 @@ const tech = { { name: "path integral", link: `path integral`, - description: "your next tech choice has all possible options
+5% JUNK to tech pool", + description: "your next tech choice has all possible options
+5% JUNK to tech pool", maxCount: 1, count: 0, frequency: 1, @@ -3410,8 +3410,8 @@ const tech = { }, { name: "abiogenesis", - // description: `use ${powerUps.orb.research(4)}(or 49% JUNK to the tech pool if you can't) to add a 2nd boss to each level`, - description: `as a level begins spawn a 2nd boss using ${powerUps.orb.research(4)}
(+49% JUNK to the tech pool if you can't pay)
`, + // description: `use ${powerUps.orb.research(4)}(or 49% JUNK to the tech pool if you can't) to add a 2nd boss to each level`, + description: `as a level begins spawn a 2nd boss using ${powerUps.orb.research(4)}
(+49% JUNK to the tech pool if you can't pay)
`, maxCount: 1, count: 0, frequency: 2, @@ -3429,7 +3429,7 @@ 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 JUNKtech you instead get a
random normal tech and spawn ${powerUps.orb.research(2)}`, maxCount: 1, count: 0, frequency: 1, @@ -3447,7 +3447,7 @@ const tech = { }, { name: "dark patterns", - description: "+38% damage
+53% JUNK to tech pool", + description: "+38% damage
+53% JUNK to tech pool", maxCount: 1, count: 0, frequency: 1, @@ -3776,7 +3776,7 @@ const tech = { }, { name: "replication", - description: "+10% chance to duplicate spawned power ups
+33% JUNK to tech pool", + description: "+10% chance to duplicate spawned power ups
+33% JUNK to tech pool", maxCount: 9, count: 0, frequency: 1, @@ -4669,7 +4669,7 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIceShot && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles) || (tech.haveGunCheck("super balls") && !tech.isFoamBall && !tech.isSuperHarm) || (tech.isRivets && !tech.isNailCrit) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 3) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport) + return (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIceShot && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles) || (tech.haveGunCheck("super balls") && !tech.isFoamBall && !tech.superHarm) || (tech.isRivets && !tech.isNailCrit) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 3) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport) }, requires: "shotgun, super balls, rivets, drones, not irradiated drones, burst drones, polyurethane, Zectron", effect() { @@ -4708,9 +4708,9 @@ const tech = { }, { name: "Zectron", - description: `+100% super ball density and damage
after colliding with super balls lose health`, + description: `+80% super ball density and damage, but
after colliding with super balls lose health`, isGunTech: true, - maxCount: 1, + maxCount: 9, count: 0, frequency: 2, frequencyDefault: 2, @@ -4719,10 +4719,10 @@ const tech = { }, requires: "super balls not incendiary ammunition", effect() { - tech.isSuperHarm = true + tech.superHarm++ }, remove() { - tech.isSuperHarm = false + tech.superHarm = 0 } }, { @@ -5521,7 +5521,7 @@ const tech = { }, { name: "booby trap", - description: "60% chance to drop a mine from power ups
+46% JUNK to tech pool", + description: "60% chance to drop a mine from power ups
+46% JUNK to tech pool", isGunTech: true, maxCount: 1, count: 0, @@ -5626,25 +5626,25 @@ const tech = { tech.isSporeGrowth = false } }, - { - name: "cordyceps", - description: "mobs infected by sporangium
resurrect and attack other mobs", - isGunTech: true, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return tech.haveGunCheck("spores") - }, - requires: "spores", - effect() { - tech.isZombieMobs = true - }, - remove() { - tech.isZombieMobs = false - } - }, + // { + // name: "cordyceps", + // description: "mobs infected by sporangium
resurrect and attack other mobs", + // isGunTech: true, + // maxCount: 1, + // count: 0, + // frequency: 2, + // frequencyDefault: 2, + // allowed() { + // return tech.haveGunCheck("spores") + // }, + // requires: "spores", + // effect() { + // tech.isZombieMobs = true + // }, + // remove() { + // tech.isZombieMobs = false + // } + // }, { name: "colony", description: "+50% sporangium discharge
40% chance to discharge something different", @@ -5712,7 +5712,7 @@ const tech = { { name: "junk DNA", descriptionFunction() { - return `+53% ${b.guns[6].nameString()} damage per JUNKtech (${(53*tech.junkCount).toFixed(0)}%)
+50% JUNK to tech pool` + return `+53% ${b.guns[6].nameString()} damage per JUNKtech (${(53*tech.junkCount).toFixed(0)}%)
+50% JUNK to tech pool` }, isGunTech: true, maxCount: 1, @@ -5739,7 +5739,7 @@ const tech = { // { // name: "junk DNA", // //increase damage by 10% for each JUNK tech percent in the tech pool, remove all JUNK tech, - // descriptionFunction() { return `+50% ${b.guns[6].nameString()} damage
+15% JUNK to tech pool` }, + // descriptionFunction() { return `+50% ${b.guns[6].nameString()} damage
+15% JUNK to tech pool` }, // isGunTech: true, // maxCount: 1, // count: 0, @@ -5863,7 +5863,9 @@ const tech = { }, { name: "path integration", - description: "drones, spores, fleas, and worms
travel with you through levels", + descriptionFunction() { + return `drones and ${b.guns[6].nameString("s")}
travel with you through levels` + }, isGunTech: true, maxCount: 1, count: 0, @@ -6520,7 +6522,7 @@ const tech = { { name: "UHMWPE", descriptionFunction() { - return `+${(b.guns[9].ammo).toFixed(0)}% harpoon rope length
(1/80 of harpoon ammo)` + return `+${(b.guns[9].ammo*1.25).toFixed(0)}% harpoon rope length
(1/80 of harpoon ammo)` }, isGunTech: true, maxCount: 1, @@ -8363,7 +8365,7 @@ const tech = { // }, { name: "swap meet", - description: "normal tech become JUNK
and JUNK become normal tech", + description: "normal tech become JUNK
and JUNK become normal tech", maxCount: 1, count: 0, frequency: 0, @@ -8412,7 +8414,7 @@ const tech = { const delay = 333 const loop = () => { if ((simulation.isChoosing) && m.alive && !build.isExperimentSelection) { - const dmg = Math.floor(33 * Math.random()) * 0.01 + const dmg = Math.floor(27 * Math.random()) * 0.01 this.text = `+${(dmg*100).toFixed(0).padStart(2, '0')}% damage
 ` this.damage = 1 + dmg if (document.getElementById(`damage-JUNK-id${this.id}`)) document.getElementById(`damage-JUNK-id${this.id}`).innerHTML = this.text @@ -8686,7 +8688,7 @@ const tech = { // }, { name: "discount", - description: "get 3 random JUNKtech for the price of 1!
 ", + description: "get 3 random JUNKtech for the price of 1!
 ", maxCount: 1, count: 0, frequency: 0, @@ -9324,13 +9326,13 @@ const tech = { frequency: 0, isNonRefundable: true, isJunk: true, - allowed() {return true}, + allowed() { return true }, requires: "", effect() { m.health = 0.01 //set health to 1 m.displayHealth(); for (let i = mob.length - 1; i > -1; i--) { //replace mobs with zombies - if (mob[i].isDropPowerUp && !mob[i].isBoss && mob[i].alive) { + if (mob[i].isDropPowerUp && !mob[i].isBoss && mob[i].alive) { mob[i].isSoonZombie = true mob[i].death() } @@ -9431,6 +9433,20 @@ const tech = { if (this.count) m.look = m.lookDefault } }, + { + name: "iFrames", + description: "you are invulnerable
when you aren't taking damage", + maxCount: 1, + count: 0, + frequency: 0, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() {}, + remove() {} + }, { name: "disintegrated armament", description: "spawn a gun
remove your active gun", @@ -9645,7 +9661,7 @@ const tech = { }, { name: "defragment", - description: "set the frequency of finding JUNKtech to zero
 ", + description: "set the frequency of finding JUNKtech to zero
 ", maxCount: 1, count: 0, frequency: 0, @@ -9857,7 +9873,7 @@ const tech = { }, { name: "expert system", - description: "spawn a tech power up
+64% JUNK to tech pool", + description: "spawn a tech power up
+64% JUNK to tech pool", maxCount: 9, count: 0, frequency: 0, @@ -10772,7 +10788,7 @@ const tech = { }, { name: "tinker", - description: "permanently unlock JUNKtech in experiment mode
this effect is stored for future visits", + description: "permanently unlock JUNKtech in experiment mode
this effect is stored for future visits", maxCount: 1, count: 0, frequency: 0, @@ -11306,6 +11322,6 @@ const tech = { buffedGun: 0, isGunChoice: null, railChargeRate: null, - isSuperHarm: null, + superHarm: null, isZombieMobs: null } \ No newline at end of file diff --git a/style.css b/style.css index 6475be7..7b7565c 100644 --- a/style.css +++ b/style.css @@ -177,6 +177,7 @@ summary { display: grid; grid-template-columns: repeat(3, 384px); align-items: stretch; + /* align-items: start; */ /* align-content: start; */ /* grid-auto-rows: minmax(auto, 140px); */ visibility: hidden; @@ -221,6 +222,7 @@ summary { /* grid-template-columns: repeat(auto-fit, minmax(310px, 1fr)); */ grid-auto-rows: minmax(auto, auto); align-content: start; + align-items: start; /* align-content: space-between; */ /* gap: 10px; */ z-index: 2; @@ -264,7 +266,7 @@ summary { border-radius: 8px; background-color: #fff; font-size: 0.65em; */ - padding: 5px; + /* padding: 5px; */ line-height: 160%; /* border-radius: 8px; */ background-color: #fafcfd; @@ -280,6 +282,8 @@ summary { display: flex; justify-content: center; /* align-content: space-between; */ + /* align-items: start; */ + /* align-items: stretch; */ /* padding-top: 10px; */ /* padding: 16px; */ padding: 10px 1px; @@ -307,7 +311,8 @@ summary { } .experiment-grid-module { - padding: 5px; + /* padding: 0.1em; */ + /* padding: 5px; */ line-height: 160%; /* border-radius: 8px; */ background-color: #fafcfd; @@ -322,6 +327,7 @@ summary { .grid-title { padding-bottom: 6px; + padding-top: 4px; font-size: 1.4em; font-weight: 600; } @@ -337,19 +343,22 @@ summary { background-repeat: no-repeat; display: flex; justify-content:flex-end; - flex-direction: column; - padding:0px; + flex-direction: column; + /* margin: 5px; */ } .card-text { background-color: rgba(255,255,255,1); /* border-radius: 8px; */ - padding: 11px 13px; + /* padding: 11px 13px; */ + padding: 0.5em 1em; /* border-top: 1px solid var(--build-bg-color); */ border: 1px solid #444; margin-top: -1px; margin-right: -1px; font-size: 0.92em; + min-height: 88px; + /* height:78px; */ } .cancel-card { text-align: center; @@ -360,6 +369,9 @@ summary { margin-top: -1px; margin-right: -1px; padding: 1px; + + line-height: 160%; + background-color: #fafcfd; } .research-card { font-size: 1.1em; @@ -368,36 +380,42 @@ summary { margin-top: -1px; margin-right: -1px; padding: 1px 0px 1px 10px; + line-height: 160%; + background-color: #fafcfd; } /* media rules for smaller screens 4->3 at 1550 */ -@media (width < 0px) { - .experiment-grid-module { - line-height: 140%; - font-size: 0.65em; +@media (1500px <= width < 1950px) { + .experiment-grid-module, .choose-grid-module, .pause-grid-module { + line-height: 150%; + font-size: 0.72em; } - .choose-grid-module{ - line-height: 140%; - font-size: 0.65em; - } - .pause-grid-module { - line-height: 140%; - font-size: 0.65em; + #experiment-grid, #choose-grid, .pause-grid{ + grid-template-columns: repeat(auto-fit, 360px); } .card-background{ - height:270px; + height:315px; } - #experiment-grid{ - grid-template-columns: repeat(auto-fit, 360px); + .card-text { + min-height: 82px; } - #choose-grid{ - grid-template-columns: repeat(auto-fit, 360px); +} +@media (width < 1500px) { + .experiment-grid-module, .choose-grid-module, .pause-grid-module { + line-height: 143%; + font-size: 0.68em; } - .pause-grid{ - grid-template-columns: repeat(auto-fit, 360px); + #experiment-grid, #choose-grid, .pause-grid{ + grid-template-columns: repeat(auto-fit, 340px); + } + .card-background{ + height:290px; + } + .card-text { + min-height: 75px; } } @@ -855,15 +873,14 @@ summary { } .color-cancel { background-color: #fafcfd; - border: 2px #444 solid; - padding: 4px; - border-radius: 4px; + border: 0.15em #444 solid; + padding: 0.2em; + border-radius: 0.2em; font-weight: 800; - line-height: 160%; font-size: 1em; } -.color-j { +.color-junk { letter-spacing: 1px; /* font-weight: 100; */ font-family: Lucida Console, Courier, monospace; @@ -907,6 +924,11 @@ summary { margin-bottom: -0.3em; } +.junk { + background-color: hsl(254, 44%, 75%); + border-radius: 25%; +} + .research-circle { width: 0.9em; height: 0.9em; @@ -983,11 +1005,7 @@ summary { box-shadow: 0 0 0 3px #025; } */ -.junk { - background-color: hsl(254, 44%, 75%); - border-radius: 25%; - /* animation: 3s linear infinite alternate pulse; */ -} + @keyframes pulse { 0% { diff --git a/todo.txt b/todo.txt index a9099a4..514c3ff 100644 --- a/todo.txt +++ b/todo.txt @@ -1,34 +1,29 @@ ******************************************************** NEXT PATCH ************************************************** -adjust card size based on window width for smaller screens - switched from px to em css units for many elements - -some image updates -single column power up choice for small screens or no image setting +card images and text scale based on browser width for smaller screens tech Zectron - super ball can damage you, but they do more damage to mobs superBall bullets are converted to run off generic b.superBall() - !!still needs testing for balance -tech: cordyceps - sporangium infect mobs, making them fight for you - zombies might attack player if there are no mob targets - !!still needs testing for balance - -sneakers - after taking damage if sneakers are low on life they teleport to a random point on the player history and sneak attack again +sneakers - after taking damage if sneakers are low on life they teleport to a random point from the player's history and they sneak attack again sneakBoss - a large sneaker that can hide several times before it dies bug fixes *********************************************************** TODO ***************************************************** +tech: cordyceps - sporangium infect mobs, making them fight for you + zombies might attack player if there are no mob targets + !! needs to explore when there are no targets + !! mechanics are confusing + !! still needs testing for balance + it's targeting player even when there are mobs tech - all mobs return as zombies? -set media rules for smaller screens - should fit 4 tech per row on my laptop - smaller card size - set font to 0.8em - set card width to 384*0.8 - and set background images to fit +Now that super balls are generic maybe something else should produce them + super-bot + molecular fabricator - how to aim? + shotgun - too similar to super ball gun set mob health bar colors based on status effects? make mob damage immunity a mob status effect? @@ -36,7 +31,6 @@ set mob health bar colors based on status effects? physics notes: add link to double slit content https://www.youtube.com/watch?v=v_uBaBuarEM - tech: rail gun area damage effect, but for all harpoon mode laser momentum pushed back on player? @@ -1162,6 +1156,7 @@ if pause is pressed while selecting power ups, display pause menu on top of sele ***maybe redo*** dynamical systems harpoon gun + Eiichiro Oda --niji nail-bot homeostasis heuristics