sentry tech

tech: cordyceps - sporangium infect mobs, making them fight for you as zombies

tech: blast ball - mines fire super balls
tech: extended magazine - sentry fires 50% more shots
  sentry works with foam, nails, or super balls

dark patterns - stacks to 9
  38->15% damage, 53->15% JUNK
electronegativity - stacks to 9
  0.12->0.1% damage per energy

bug fixes
This commit is contained in:
landgreen
2023-01-01 09:55:17 -08:00
parent 4b195589d5
commit 802cd90220
15 changed files with 452 additions and 596 deletions

BIN
img/blast ball.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
img/extended magazine.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -2714,58 +2714,31 @@ const b = {
range: 700 - 300 * tech.isFoamMine, range: 700 - 300 * tech.isFoamMine,
beforeDmg() {}, beforeDmg() {},
onEnd() { onEnd() {
if (tech.isFoamMine) { if (this.isArmed && !tech.isMineSentry) {
for (let i = 0; i < 14; i++) { if (tech.isFoamMine) {
const radius = 13 + 8 * Math.random() //send 14 in random directions slowly
const velocity = { for (let i = 0; i < 12; i++) {
x: 5.5 * Math.random(), const radius = 13 + 8 * Math.random()
y: 0 const velocity = { x: 0.5 + 5.5 * Math.random(), y: 0 }
b.foam(this.position, Vector.rotate(velocity, this.angle + 1.57 + 3 * (Math.random() - 0.5)), radius) //6.28 * Math.random()
} }
b.foam(this.position, Vector.rotate(velocity, this.angle + 1.57 + 3 * (Math.random() - 0.5)), radius) //6.28 * Math.random() //send 40 targeted
} let count = 0
let cycle = () => {
let count = 0 if (count < 50) {
let cycle = () => { if (!simulation.paused && !simulation.isChoosing) { //!(simulation.cycle % 1) &&
if (count < 40) { count++
if (!simulation.paused && !simulation.isChoosing) { //!(simulation.cycle % 1) && b.targetedFoam(this.position)
count++
const targets = [] //target nearby mobs
for (let i = 0, len = mob.length; i < len; i++) {
if (
Vector.magnitude(Vector.sub(this.position, mob[i].position)) < this.range + mob[i].radius + 300 &&
!mob[i].isBadTarget && //|| mob[i].isMobBullet
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
!mob[i].isInvulnerable
) {
// targets.push(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, dist / 50))) //predict where the mob will be in a few cycles
targets.push(mob[i]) //predict where the mob will be in a few cycles
}
}
if (targets.length > 0) { // aim near a random target in array
const index = Math.floor(Math.random() * targets.length) //pick random target from list
const radius = 7 + 10 * Math.random()
const SPEED = 23 + 6 * Math.random() - radius * 0.3 + 0.5 * targets[index].speed
const predict = Vector.mult(targets[index].velocity, Vector.magnitude(Vector.sub(this.position, targets[index].position)) / 60)
const where = Vector.add(targets[index].position, predict)
const velocity = Vector.mult(Vector.normalise(Vector.sub(where, this.position)), SPEED)
b.foam(this.position, Vector.rotate(velocity, 0.2 * (Math.random() - 0.5)), radius)
} else {
const radius = 7 + 10 * Math.random()
const velocity = {
x: 10 + 8 * Math.random(),
y: 0
}
b.foam(this.position, Vector.rotate(velocity, this.angle + 1.57 + 2.8 * (Math.random() - 0.5)), radius) //6.28 * Math.random()
} }
requestAnimationFrame(cycle);
} }
requestAnimationFrame(cycle);
} }
requestAnimationFrame(cycle)
} else if (tech.isSuperMine) {
b.targetedBall(this.position, 22 + 2 * tech.extraSuperBalls)
} else {
b.targetedNail(this.position, 22, 40 + 10 * Math.random(), 1200, true, 2.2) //targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) {
} }
requestAnimationFrame(cycle)
} else if (this.isArmed && !tech.isMineSentry) {
b.targetedNail(this.position, tech.isMineSentry ? 7 : 22, 40 + 10 * Math.random(), 1200, true, 2.2) //targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) {
} }
}, },
do() { do() {
@@ -2779,8 +2752,7 @@ const b = {
y: 0 y: 0
}) })
Matter.Body.setAngle(this, Math.atan2(collide[i].tangent.y, collide[i].tangent.x)) Matter.Body.setAngle(this, Math.atan2(collide[i].tangent.y, collide[i].tangent.x))
//move until touching map again after rotation for (let j = 0; j < 10; j++) { //move until touching map again after rotation
for (let j = 0; j < 10; j++) {
if (Matter.Query.collides(this, map).length > 0) { //touching map if (Matter.Query.collides(this, map).length > 0) { //touching map
if (angle > -0.2 || angle < -1.5) { //don't stick to level ground if (angle > -0.2 || angle < -1.5) { //don't stick to level ground
Matter.Body.setVelocity(this, { Matter.Body.setVelocity(this, {
@@ -2798,7 +2770,6 @@ const b = {
Matter.Body.setAngularVelocity(this, 0) Matter.Body.setAngularVelocity(this, 0)
} }
this.arm(); this.arm();
//sometimes the mine can't attach to map and it just needs to be reset //sometimes the mine can't attach to map and it just needs to be reset
setTimeout(() => { setTimeout(() => {
if (Matter.Query.collides(this, map).length === 0 || Matter.Query.point(map, this.position).length > 0) { if (Matter.Query.collides(this, map).length === 0 || Matter.Query.point(map, this.position).length > 0) {
@@ -2809,8 +2780,7 @@ const b = {
}, 100); }, 100);
break break
} }
//move until you are touching the wall Matter.Body.setPosition(this, Vector.add(this.position, Vector.mult(collide[i].normal, 2))) //move until you are touching the wall
Matter.Body.setPosition(this, Vector.add(this.position, Vector.mult(collide[i].normal, 2)))
} }
break break
} }
@@ -2848,13 +2818,25 @@ const b = {
) { ) {
if (tech.isStun) b.AoEStunEffect(this.position, this.range + mob[i].radius + random); //AoEStunEffect(where, range, cycles = 90 + 60 * Math.random()) { if (tech.isStun) b.AoEStunEffect(this.position, this.range + mob[i].radius + random); //AoEStunEffect(where, range, cycles = 90 + 60 * Math.random()) {
if (tech.isMineSentry) { if (tech.isMineSentry) {
this.lookFrequency = 6 this.lookFrequency = 15 + 10 * (tech.oneSuperBall && tech.isSuperMine) + Math.floor(3 * Math.random())
this.endCycle = simulation.cycle + 1020 // this.endCycle = Infinity
this.shots = tech.sentryAmmo
this.do = function() { //overwrite the do method for this bullet this.do = function() { //overwrite the do method for this bullet
this.force.y += this.mass * 0.002; //extra gravity this.force.y += this.mass * 0.002; //extra gravity
if (!(simulation.cycle % this.lookFrequency)) { //find mob targets if (!(simulation.cycle % this.lookFrequency)) { //find mob targets
this.endCycle -= 5 if (tech.isFoamMine) {
b.targetedNail(this.position, 1, 45 + 5 * Math.random(), 1100, false, 2.3) //targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) { this.shots -= 0.6 * b.targetedFoam(this.position, 1, 21 + 7 * Math.random(), 1200, false)
b.targetedFoam(this.position, 1, 21 + 7 * Math.random(), 1200, false)
} else if (tech.isSuperMine) {
const cost = tech.oneSuperBall ? 2 : 0.7
this.shots -= cost * b.targetedBall(this.position, 1, 42 + 12 * Math.random(), 1200, false)
for (let i = 0, len = tech.extraSuperBalls / 4; i < len; i++) {
if (Math.random() < 0.33) b.targetedBall(this.position, 1, 42 + 12 * Math.random(), 1200, false)
}
} else {
this.shots -= b.targetedNail(this.position, 1, 45 + 5 * Math.random(), 1100, false, 2.3) //targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) {
}
if (this.shots < 0) this.endCycle = 0
if (!(simulation.cycle % (this.lookFrequency * 6))) { if (!(simulation.cycle % (this.lookFrequency * 6))) {
simulation.drawList.push({ simulation.drawList.push({
x: this.position.x, x: this.position.x,
@@ -3769,7 +3751,7 @@ const b = {
bullet[me] = Bodies.polygon(where.x, where.y, 12, radius, b.fireAttributes(dir, false)); bullet[me] = Bodies.polygon(where.x, where.y, 12, radius, b.fireAttributes(dir, false));
Composite.add(engine.world, bullet[me]); //add bullet to world Composite.add(engine.world, bullet[me]); //add bullet to world
Matter.Body.setVelocity(bullet[me], velocity); Matter.Body.setVelocity(bullet[me], velocity);
Matter.Body.setDensity(bullet[me], 0.0001 + 0.001 * tech.superHarm); Matter.Body.setDensity(bullet[me], 0.0008 + 0.0008 * tech.superHarm);
bullet[me].endCycle = simulation.cycle + Math.floor(300 + 90 * Math.random()); bullet[me].endCycle = simulation.cycle + Math.floor(300 + 90 * Math.random());
bullet[me].minDmgSpeed = 0; bullet[me].minDmgSpeed = 0;
bullet[me].restitution = 1; bullet[me].restitution = 1;
@@ -3786,7 +3768,7 @@ const b = {
bullet[me].collidePlayerDo = function() { bullet[me].collidePlayerDo = function() {
if (Matter.Query.collides(this, [player]).length) { if (Matter.Query.collides(this, [player]).length) {
this.endCycle = 0 this.endCycle = 0
let dmg = 0.03 * this.mass * tech.superHarm let dmg = 0.02 * this.mass * tech.superHarm
m.damage(dmg); m.damage(dmg);
simulation.drawList.push({ //add dmg to draw queue simulation.drawList.push({ //add dmg to draw queue
x: this.position.x, x: this.position.x,
@@ -3811,24 +3793,81 @@ const b = {
} }
bullet[me].beforeDmg = function(who) { bullet[me].beforeDmg = function(who) {
if (tech.oneSuperBall) mobs.statusStun(who, 120) // (2.3) * 2 / 14 ticks (2x damage over 7 seconds) 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) { if (tech.isFoamBall) {
for (let i = 0, len = 6 * this.mass; i < len; i++) { for (let i = 0, len = 6 * this.mass; i < len; i++) {
const radius = 5 + 8 * Math.random() 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 }
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) b.foam(this.position, Vector.rotate(velocity, 6.28 * Math.random()), radius)
} }
this.endCycle = 0 this.endCycle = 0
} }
}; };
}, },
targetedBall(position, num = 1, speed = 42 + 12 * Math.random(), range = 1200, isRandomAim = true) {
let shotsFired = 0
const targets = [] //target nearby mobs
for (let i = 0, len = mob.length; i < len; i++) {
const dist = Vector.magnitude(Vector.sub(position, mob[i].position));
if (
dist < range + mob[i].radius &&
!mob[i].isBadTarget &&
Matter.Query.ray(map, position, mob[i].position).length === 0 &&
Matter.Query.ray(body, position, mob[i].position).length === 0 &&
!mob[i].isInvulnerable
) {
targets.push(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, dist / 60))) //predict where the mob will be in a few cycles
}
}
const radius = (11 + 10 * tech.oneSuperBall) * tech.bulletSize
for (let i = 0; i < num; i++) {
if (targets.length > 0) { // aim near a random target in array
const index = Math.floor(Math.random() * targets.length)
const SPREAD = 160 / targets.length
const WHERE = {
x: targets[index].x + SPREAD * (Math.random() - 0.5),
y: targets[index].y + SPREAD * (Math.random() - 0.5)
}
b.superBall(position, Vector.mult(Vector.normalise(Vector.sub(WHERE, position)), speed), radius)
shotsFired++
} else if (isRandomAim) { // aim in random direction
const ANGLE = 2 * Math.PI * Math.random()
b.superBall(position, { x: speed * Math.cos(ANGLE), y: speed * Math.sin(ANGLE) }, radius)
}
}
return shotsFired
},
targetedFoam(position, num = 1, speed = 21 + 7 * Math.random(), range = 1200, isRandomAim = true) {
let shotsFired = 0
const targets = [] //target nearby mobs
for (let i = 0, len = mob.length; i < len; i++) {
const dist = Vector.magnitude(Vector.sub(position, mob[i].position));
if (
dist < range + mob[i].radius &&
!mob[i].isBadTarget && //|| mob[i].isMobBullet
Matter.Query.ray(map, position, mob[i].position).length === 0 &&
!mob[i].isInvulnerable
) {
targets.push(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, dist / 60))) //predict where the mob will be in a few cycles
}
}
for (let i = 0; i < num; i++) {
if (targets.length > 0) { // aim near a random target in array
const SPREAD = 160 / targets.length
const index = Math.floor(Math.random() * targets.length)
const radius = 11 + 12 * Math.random()
const where = {
x: targets[index].x + SPREAD * (Math.random() - 0.5),
y: targets[index].y + SPREAD * (Math.random() - 0.5)
}
b.foam(position, Vector.mult(Vector.normalise(Vector.sub(where, position)), speed - radius * 0.25), radius)
shotsFired++
} else if (isRandomAim) { // aim in random direction
const ANGLE = 2 * Math.PI * Math.random()
b.foam(position, { x: speed * Math.cos(ANGLE), y: speed * Math.sin(ANGLE) }, 8 + 11 * Math.random())
}
}
return shotsFired
},
// plasmaBall(position, velocity, radius) { // plasmaBall(position, velocity, radius) {
// // radius *= Math.sqrt(tech.bulletSize) // // radius *= Math.sqrt(tech.bulletSize)
// const me = bullet.length; // const me = bullet.length;
@@ -4186,6 +4225,7 @@ const b = {
} }
}, },
targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) { targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) {
let shotsFired = 0
const targets = [] //target nearby mobs const targets = [] //target nearby mobs
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
const dist = Vector.magnitude(Vector.sub(position, mob[i].position)); const dist = Vector.magnitude(Vector.sub(position, mob[i].position));
@@ -4208,14 +4248,17 @@ const b = {
y: targets[index].y + SPREAD * (Math.random() - 0.5) y: targets[index].y + SPREAD * (Math.random() - 0.5)
} }
b.nail(position, Vector.mult(Vector.normalise(Vector.sub(WHERE, position)), speed), damage) b.nail(position, Vector.mult(Vector.normalise(Vector.sub(WHERE, position)), speed), damage)
shotsFired++
} else if (isRandomAim) { // aim in random direction } else if (isRandomAim) { // aim in random direction
const ANGLE = 2 * Math.PI * Math.random() const ANGLE = 2 * Math.PI * Math.random()
b.nail(position, { b.nail(position, {
x: speed * Math.cos(ANGLE), x: speed * Math.cos(ANGLE),
y: speed * Math.sin(ANGLE) y: speed * Math.sin(ANGLE)
}, damage) }, damage)
shotsFired++
} }
} }
return shotsFired
}, },
crit(mob, bullet) { crit(mob, bullet) {
if (!mob.shield && Vector.dot(Vector.normalise(Vector.sub(mob.position, bullet.position)), Vector.normalise(bullet.velocity)) > 0.999 - 1 / mob.radius) { if (!mob.shield && Vector.dot(Vector.normalise(Vector.sub(mob.position, bullet.position)), Vector.normalise(bullet.velocity)) > 0.999 - 1 / mob.radius) {
@@ -4263,9 +4306,9 @@ const b = {
bullet[me].dmg = tech.isNailRadiation ? 0 : dmg bullet[me].dmg = tech.isNailRadiation ? 0 : dmg
bullet[me].beforeDmg = function(who) { //beforeDmg is rewritten with ice crystal tech bullet[me].beforeDmg = function(who) { //beforeDmg is rewritten with ice crystal tech
if (tech.isNailRadiation) mobs.statusDoT(who, dmg * (tech.isFastRadiation ? 1.3 : 0.44), tech.isSlowRadiation ? 360 : (tech.isFastRadiation ? 60 : 180)) // one tick every 30 cycles if (tech.isNailRadiation) mobs.statusDoT(who, dmg * (tech.isFastRadiation ? 1.3 : 0.44), tech.isSlowRadiation ? 360 : (tech.isFastRadiation ? 60 : 180)) // one tick every 30 cycles
if (tech.isNailCrit) { if (tech.isNailCrit) { //makes bullet do explosive damage if it hits center
if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 1 / who.radius) { if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 1 / who.radius) {
b.explosion(this.position, 150 + 30 * Math.random()); //makes bullet do explosive damage at end b.explosion(this.position, 80 + 90 * (b.activeGun === 0) + 30 * Math.random()); //larger explosions for human aimed nail gun, smaller for auto aimed sources, like bots, and mine
} }
} }
this.ricochet(who) this.ricochet(who)
@@ -7463,6 +7506,15 @@ const b = {
ammo: 0, ammo: 0,
ammoPack: 1.7, ammoPack: 1.7,
have: false, have: false,
nameString(suffix = "") {
if (tech.isFoamMine) {
return `<strong>foam</strong>`
} else if (tech.isSuperMine) {
return `<strong>super ball${suffix}</strong>`
} else {
return `<strong>nail${suffix}</strong>`
}
},
do() { do() {
if (!input.field && input.down && !tech.isLaserMine) { if (!input.field && input.down && !tech.isLaserMine) {
const cycles = 60 //30 const cycles = 60 //30

View File

@@ -18,7 +18,7 @@ const level = {
// simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode // simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode
// simulation.isHorizontalFlipped = true // simulation.isHorizontalFlipped = true
// tech.giveTech("performance") // tech.giveTech("performance")
// level.difficultyIncrease(30 * 4) //30 is near max on hard //60 is near max on why // level.difficultyIncrease(10 * 4) //30 is near max on hard //60 is near max on why
// m.maxHealth = m.health = 100 // m.maxHealth = m.health = 100
// tech.isRerollDamage = true // tech.isRerollDamage = true
// powerUps.research.changeRerolls(10) // powerUps.research.changeRerolls(10)
@@ -28,15 +28,16 @@ const level = {
// m.setField("perfect diamagnetism") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch // m.setField("perfect diamagnetism") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch
// simulation.molecularMode = 2 // simulation.molecularMode = 2
// m.damage(0.1); // m.damage(0.1);
// 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("mine") //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.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 // b.guns[0].ammo = 10000
// tech.giveTech("cordyceps") // tech.giveTech("blast ball")
// tech.giveTech("Zectron") // tech.giveTech("elephants toothpaste")
// tech.giveTech("sentry gun")
// for (let i = 0; i < 1; ++i) tech.giveTech("super ball") // for (let i = 0; i < 1; ++i) tech.giveTech("super ball")
// tech.isFoamBall = true // tech.isFoamBall = true
// for (let i = 0; i < 1; ++i) tech.giveTech("incendiary ammunition") // for (let i = 0; i < 1; ++i) tech.giveTech("super ball")
// for (let i = 0; i < 2; i++) tech.giveTech("unified field theory") // for (let i = 0; i < 1; i++) tech.giveTech("irradiated nails")
// for (let i = 0; i < 1; i++) tech.giveTech("colony") // for (let i = 0; i < 1; i++) tech.giveTech("colony")
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "tech"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "tech");
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "boost"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "boost");
@@ -47,7 +48,8 @@ const level = {
// spawn.starter(1900, -500, 25) // spawn.starter(1900, -500, 25)
// spawn.sneaker(1900, -500, 25) // spawn.sneaker(1900, -500, 25)
// spawn.hopper(2538, -950) // spawn.hopper(2538, -950)
// for (let i = 0; i < 2; ++i) spawn.starter(1000 + 1000 * Math.random(), -500 + 300 * Math.random()) // spawn.zombie(1000 + 1000 * Math.random(), -500 + 300 * Math.random(), 30, 5, "white") // zombie(x, y, radius, sides, color)
// for (let i = 0; i < 20; ++i) spawn.starter(1000 + 1000 * Math.random(), -500 + 300 * Math.random())
// tech.addJunkTechToPool(2) // tech.addJunkTechToPool(2)
// tech.tech[322].frequency = 100 // tech.tech[322].frequency = 100
// spawn.tetherBoss(1900, -500, { x: 1900, y: -500 }) // spawn.tetherBoss(1900, -500, { x: 1900, y: -500 })

View File

@@ -1194,7 +1194,7 @@ const mobs = {
if (this.isDropPowerUp) { if (this.isDropPowerUp) {
if (this.isSoonZombie) { //spawn zombie on death if (this.isSoonZombie) { //spawn zombie on death
this.leaveBody = false; this.leaveBody = false;
let count = 45 //delay spawn cycles let count = 5 //delay spawn cycles
let cycle = () => { let cycle = () => {
if (count > 0) { if (count > 0) {
if (m.alive) requestAnimationFrame(cycle); if (m.alive) requestAnimationFrame(cycle);

View File

@@ -1992,7 +1992,7 @@ const m = {
// //
const angleReduction = 0.1 + (Math.PI / 2 - Math.min(Math.PI / 2, Math.abs(m.angle + Math.PI / 2))) const angleReduction = 0.1 + (Math.PI / 2 - Math.min(Math.PI / 2, Math.abs(m.angle + Math.PI / 2)))
if (player.velocity.y > 1) { if (player.velocity.y > 1) {
player.force.y -= angleReduction * (tech.isBigField ? 0.87 : 0.7) * player.mass * simulation.g; player.force.y -= angleReduction * (tech.isBigField ? 0.9 : 0.7) * player.mass * simulation.g;
Matter.Body.setVelocity(player, { Matter.Body.setVelocity(player, {
x: player.velocity.x, x: player.velocity.x,
y: 0.98 * player.velocity.y y: 0.98 * player.velocity.y

View File

@@ -645,13 +645,20 @@ const powerUps = {
}, },
buildColumns(totalChoices, type) { buildColumns(totalChoices, type) {
let width let width
if (canvas.width < 1500) { if (canvas.width < 1710) {
width = "340px" width = "285px"
} else if (canvas.width < 1950) { } else if (canvas.width < 1950) {
width = "360px" width = "340px"
} else { } else {
width = "384px" width = "384px"
} }
// if (canvas.width < 1500) {
// width = "340px"
// } else if (canvas.width < 1950) {
// width = "360px"
// } else {
// width = "384px"
// }
let text = "" let text = ""
if (localSettings.isHideImages || canvas.width < 1200) { if (localSettings.isHideImages || canvas.width < 1200) {
document.getElementById("choose-grid").style.gridTemplateColumns = width document.getElementById("choose-grid").style.gridTemplateColumns = width
@@ -1150,7 +1157,7 @@ const powerUps = {
powerUps.research.currentRerollCount = 0 powerUps.research.currentRerollCount = 0
if (tech.isTechDamage && who.name === "tech") m.damage(0.1) if (tech.isTechDamage && who.name === "tech") m.damage(0.1)
if (tech.isMassEnergy) m.energy += 2; if (tech.isMassEnergy) m.energy += 2;
if (tech.isMineDrop && bullet.length < 150 && Math.random() < 0.6) { if (tech.isMineDrop && bullet.length < 150 && Math.random() < 0.5) {
if (tech.isLaserMine && input.down) { if (tech.isLaserMine && input.down) {
b.laserMine(who.position) b.laserMine(who.position)
} else { } else {

View File

@@ -447,9 +447,10 @@ const simulation = {
} }
} }
if (tech.crouchAmmoCount) tech.crouchAmmoCount = 1 //this prevents hacking the tech by switching guns if (tech.crouchAmmoCount) tech.crouchAmmoCount = 1 //this prevents hacking the tech by switching guns
if (b.inventory.length > 0) {
b.activeGun = b.inventory[b.inventoryGun]; b.activeGun = b.inventory[b.inventoryGun];
if (b.guns[b.activeGun].charge) b.guns[b.activeGun].charge = 0; //if switching into foam set charge to 0 if (b.guns[b.activeGun].charge) b.guns[b.activeGun].charge = 0; //if switching into foam set charge to 0
}
simulation.updateGunHUD(); simulation.updateGunHUD();
simulation.boldActiveGunHUD(); simulation.boldActiveGunHUD();
}, },
@@ -895,7 +896,7 @@ const simulation = {
if (tech.isMutualism && !tech.isEnergyHealth) { if (tech.isMutualism && !tech.isEnergyHealth) {
for (let i = 0; i < bullet.length; i++) { for (let i = 0; i < bullet.length; i++) {
if (bullet[i].isMutualismActive) { if (bullet[i].isMutualismActive) {
m.health += 0.01 + 0.01 * ((bullet[i].isSpore || bullet[i].isFlea) ? 0: 1) m.health += 0.01 + 0.01 * ((bullet[i].isSpore || bullet[i].isFlea) ? 0 : 1)
if (m.health > m.maxHealth) m.health = m.maxHealth; if (m.health > m.maxHealth) m.health = m.maxHealth;
m.displayHealth(); m.displayHealth();
} }
@@ -1168,18 +1169,6 @@ const simulation = {
m.energy -= 0.1 * simulation.difficultyMode m.energy -= 0.1 * simulation.difficultyMode
} }
if (isNaN(player.position.x)) m.death(); if (isNaN(player.position.x)) m.death();
// if (tech.isEnergyDamage) {
// document.getElementById("tech-capacitor").innerHTML = `(+${(m.energy/0.05).toFixed(0)}%)`
// }
// if (tech.restDamage) {
// if (player.speed < 1) {
// document.getElementById("tech-rest").innerHTML = `(+20%)`
// } else {
// document.getElementById("tech-rest").innerHTML = `(+0%)`
// }
// }
if (m.lastKillCycle + 300 > m.cycle) { //effects active for 5 seconds after killing a mob if (m.lastKillCycle + 300 > m.cycle) { //effects active for 5 seconds after killing a mob
if (tech.isEnergyRecovery && m.immuneCycle < m.cycle) m.energy += m.maxEnergy * 0.05 if (tech.isEnergyRecovery && m.immuneCycle < m.cycle) m.energy += m.maxEnergy * 0.05
if (tech.isHealthRecovery) m.addHealth(0.005 * m.maxHealth) if (tech.isHealthRecovery) m.addHealth(0.005 * m.maxHealth)

View File

@@ -1542,14 +1542,15 @@ const spawn = {
zombie(x, y, radius, sides, color) { //mob that attacks other mobs zombie(x, y, radius, sides, color) { //mob that attacks other mobs
mobs.spawn(x, y, sides, radius, color); mobs.spawn(x, y, sides, radius, color);
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.damageReduction = 0 //take NO damage until targeting player, but also slowly lose health me.damageReduction = 0 //take NO damage, but also slowly lose health
Matter.Body.setDensity(me, 0.0001) // normal density is 0.001 // this reduces life by half and decreases knockback
me.isZombie = true me.isZombie = true
me.isBadTarget = true; me.isBadTarget = true;
me.isDropPowerUp = false; me.isDropPowerUp = false;
me.showHealthBar = false; me.showHealthBar = false;
me.stroke = "#83a" me.stroke = "#83a"
me.accelMag = 0.0015 me.accelMag = 0.001
me.frictionAir = 0.01 me.frictionAir = 0.005
me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.mob me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.mob
me.seeAtDistance2 = 1000000 //1000 vision range me.seeAtDistance2 = 1000000 //1000 vision range
// me.onDeath = function() { // me.onDeath = function() {
@@ -1577,39 +1578,36 @@ const spawn = {
me.mobSearchIndex = 0; me.mobSearchIndex = 0;
me.target = null me.target = null
me.lookForMobTargets = function() { me.lookForMobTargets = function() {
if (!(simulation.cycle % 10)) { if (this.target === null && mob.length > 1 && !(simulation.cycle % this.seePlayerFreq)) { //find mob targets
if (this.target === null) { //if you have no target let closeDist = Infinity;
this.mobSearchIndex++ //look for a different mob index every time for (let i = 0, len = mob.length; i < len; ++i) {
if (this.mobSearchIndex > mob.length - 1) this.mobSearchIndex = 0
if ( if (
mob.length > 1 && !mob[i].isZombie &&
!mob[this.mobSearchIndex].isZombie && !mob[i].isUnblockable &&
(Vector.magnitudeSquared(Vector.sub(this.position, mob[this.mobSearchIndex].position)) < this.seeAtDistance2 && Matter.Query.ray(map, this.position, mob[this.mobSearchIndex].position).length === 0) Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
Matter.Query.ray(body, this.position, mob[i].position).length === 0
// !mob[i].isBadTarget &&
// !mob[i].isInvulnerable &&
// (Vector.magnitudeSquared(Vector.sub(this.position, mob[this.mobSearchIndex].position)) < this.seeAtDistance2)
) { ) {
this.target = mob[this.mobSearchIndex] const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position));
} else if (Math.random() < 0.005 * player.speed && (Vector.magnitudeSquared(Vector.sub(this.position, player.position)) < this.seeAtDistance2 || Matter.Query.ray(map, this.position, player.position).length === 0)) { if (DIST < closeDist) {
this.target = player closeDist = DIST;
this.isBadTarget = false; this.target = mob[i]
this.damageReduction = 0.5 }
me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob
} }
} }
} } else if (
//chance to forget target !(simulation.cycle % this.memory) &&
if (!(simulation.cycle % this.memory) && this.target) { this.target &&
if ( (!this.target.alive || Matter.Query.ray(map, this.position, this.target.position).length !== 0)
(this.target && this.target !== player && !this.target.alive) || ) {
Vector.magnitudeSquared(Vector.sub(this.position, this.target.position)) > this.seeAtDistance2 || this.target = null //chance to forget target
Matter.Query.ray(map, this.position, this.target.position).length !== 0
) {
this.target = null
}
} }
} }
me.zombieHealthBar = function() { me.zombieHealthBar = function() {
this.health -= 0.0005 //decay this.health -= 0.0004 //decay
if ((this.health < 0.01 || isNaN(this.health)) && this.alive) this.death(); if ((this.health < 0.01 || isNaN(this.health)) && this.alive) this.death();
const h = this.radius * 0.3; const h = this.radius * 0.3;
const w = this.radius * 2; const w = this.radius * 2;
const x = this.position.x - w / 2; const x = this.position.x - w / 2;
@@ -1624,14 +1622,18 @@ const spawn = {
if (this.hitCD < simulation.cycle) { if (this.hitCD < simulation.cycle) {
if (this.target) { if (this.target) {
this.force = Vector.mult(Vector.normalise(Vector.sub(this.target.position, this.position)), this.accelMag * this.mass) this.force = Vector.mult(Vector.normalise(Vector.sub(this.target.position, this.position)), this.accelMag * this.mass)
if (this.speed > 6) { // speed cap instead of friction to give more agility } else { //wonder around
Matter.Body.setVelocity(this, { this.torque += 0.0000003 * this.inertia;
x: this.velocity.x * 0.97, const mag = 0.00015 * this.mass
y: this.velocity.y * 0.97 this.force.x += mag * Math.cos(this.angle)
}); this.force.y += mag * Math.sin(this.angle)
} }
if (this.speed > 6) { // speed cap instead of friction to give more agility
Matter.Body.setVelocity(this, {
x: this.velocity.x * 0.93,
y: this.velocity.y * 0.93
});
} }
const hit = (who) => { const hit = (who) => {
if (!who.isZombie && who.damageReduction) { if (!who.isZombie && who.damageReduction) {
this.hitCD = simulation.cycle + 15 this.hitCD = simulation.cycle + 15
@@ -1641,7 +1643,7 @@ const spawn = {
this.force.y -= force.y; this.force.y -= force.y;
this.target = null //look for a new target this.target = null //look for a new target
const dmg = 0.2 * m.dmgScale const dmg = 1.3 * m.dmgScale
who.damage(dmg); who.damage(dmg);
who.locatePlayer(); who.locatePlayer();
simulation.drawList.push({ simulation.drawList.push({
@@ -1662,8 +1664,6 @@ const spawn = {
} }
} }
} }
// me.onDamage = function(dmg) {
// }
}, },
starter(x, y, radius = Math.floor(15 + 20 * Math.random())) { //easy mob for on level 1 starter(x, y, radius = Math.floor(15 + 20 * Math.random())) { //easy mob for on level 1
mobs.spawn(x, y, 8, radius, "#9ccdc6"); mobs.spawn(x, y, 8, radius, "#9ccdc6");
@@ -5736,9 +5736,9 @@ const spawn = {
me.collisionFilter.mask = cat.map | cat.body | cat.bullet | cat.mob //can't touch player me.collisionFilter.mask = cat.map | cat.body | cat.bullet | cat.mob //can't touch player
me.showHealthBar = false; me.showHealthBar = false;
me.memory = 30; me.memory = 30;
me.vanishesLeft = 2+simulation.difficultyMode me.vanishesLeft = 2 + simulation.difficultyMode
me.onDamage = function() { me.onDamage = function() {
if (this.vanishesLeft>0 && this.health < 0.1){ //if health is below 10% teleport to a random spot on player history, heal, and cloak if (this.vanishesLeft > 0 && this.health < 0.1) { //if health is below 10% teleport to a random spot on player history, heal, and cloak
this.vanishesLeft-- this.vanishesLeft--
// const scale = 0.95; // const scale = 0.95;
@@ -5746,21 +5746,21 @@ const spawn = {
// this.radius *= scale; // this.radius *= scale;
//flash screen to hide vanish //flash screen to hide vanish
for(let i=0; i<8; i++){ for (let i = 0; i < 8; i++) {
simulation.drawList.push({ simulation.drawList.push({
x: this.position.x, x: this.position.x,
y: this.position.y, y: this.position.y,
radius: 3000, radius: 3000,
color: `rgba(0, 0, 0,${1-0.1*i})`, color: `rgba(0, 0, 0,${1-0.1*i})`,
time: (i+1)*3 time: (i + 1) * 3
}); });
} }
//teleport to near the end of player history //teleport to near the end of player history
const index = Math.floor( (m.history.length-1)*(0.66+0.2*Math.random() )) const index = Math.floor((m.history.length - 1) * (0.66 + 0.2 * Math.random()))
let history = m.history[(m.cycle - index) % 600] let history = m.history[(m.cycle - index) % 600]
Matter.Body.setPosition(this, history.position) Matter.Body.setPosition(this, history.position)
Matter.Body.setVelocity(this, {x: 0,y: 0}); Matter.Body.setVelocity(this, { x: 0, y: 0 });
this.seePlayer.recall = 0 this.seePlayer.recall = 0
this.cloak(); this.cloak();
this.health = 1; this.health = 1;
@@ -5774,7 +5774,7 @@ const spawn = {
this.collisionFilter.mask = cat.map | cat.body | cat.bullet | cat.mob //can't touch player this.collisionFilter.mask = cat.map | cat.body | cat.bullet | cat.mob //can't touch player
this.damageReduction = 0.04 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) this.damageReduction = 0.04 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
} }
} }
me.deCloak = function() { me.deCloak = function() {
if (this.isCloaked) { if (this.isCloaked) {
this.damageReduction = 0.4 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) this.damageReduction = 0.4 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
@@ -5828,13 +5828,13 @@ const spawn = {
me.memory = 240; me.memory = 240;
me.isVanished = false; me.isVanished = false;
me.onDamage = function() { me.onDamage = function() {
if (!this.isVanished && this.health < 0.1){ //if health is below 10% teleport to a random spot on player history, heal, and cloak if (!this.isVanished && this.health < 0.1 && !this.isStunned && !this.isSlowed) { //if health is below 10% teleport to a random spot on player history, heal, and cloak
this.health = 1; this.health = 1;
this.isVanished = true this.isVanished = true
this.cloak(); this.cloak();
//teleport to near the end of player history //teleport to near the end of player history
Matter.Body.setPosition(this, m.history[Math.floor((m.history.length-1)*(0.66+0.33*Math.random()))].position) Matter.Body.setPosition(this, m.history[Math.floor((m.history.length - 1) * (0.66 + 0.33 * Math.random()))].position)
Matter.Body.setVelocity(this, {x: 0,y: 0}); Matter.Body.setVelocity(this, { x: 0, y: 0 });
} }
}; };
me.cloak = function() { me.cloak = function() {
@@ -5847,7 +5847,7 @@ const spawn = {
} }
me.do = function() { me.do = function() {
this.gravity(); this.gravity();
this.seePlayerByHistory(15); this.seePlayerByHistory(25);
this.checkStatus(); this.checkStatus();
this.attraction(); this.attraction();
//draw //draw

View File

@@ -236,7 +236,7 @@ const tech = {
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots() if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
if (tech.isLowEnergyDamage) dmg *= 1 + 0.7 * Math.max(0, 1 - m.energy) if (tech.isLowEnergyDamage) dmg *= 1 + 0.7 * Math.max(0, 1 - m.energy)
if (tech.isEnergyDamage) dmg *= 1 + m.energy * 0.125; if (tech.energyDamage) dmg *= 1 + m.energy * 0.1 * tech.energyDamage;
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.007 if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.007
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2 if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165) if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165)
@@ -396,7 +396,7 @@ const tech = {
{ {
name: "arsenal", name: "arsenal",
descriptionFunction() { descriptionFunction() {
return `<strong>+22%</strong> <strong class='color-d'>damage</strong> per unequipped <strong class='color-g'>gun</strong> <em>(${(22 * Math.max(0, b.inventory.length-1)).toFixed(0)}%)</em><br>&nbsp;` return `<strong>+22%</strong> <strong class='color-d'>damage</strong> per unequipped <strong class='color-g'>gun</strong> <em>(${(22 * Math.max(0, b.inventory.length-1)).toFixed(0)}%)</em>`
}, },
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -414,7 +414,7 @@ const tech = {
{ {
name: "active cooling", name: "active cooling",
descriptionFunction() { descriptionFunction() {
return `<strong>+28%</strong> <em>fire rate</em> per unequipped <strong class='color-g'>gun</strong> <em>(${(28 * Math.max(0, b.inventory.length-1)).toFixed(0)}%)</em><br>&nbsp;` return `<strong>+28%</strong> <em>fire rate</em> per unequipped <strong class='color-g'>gun</strong> <em>(${(28 * Math.max(0, b.inventory.length-1)).toFixed(0)}%)</em>`
}, //<br>but not including your equipped <strong class='color-g'>gun</strong>` }, }, //<br>but not including your equipped <strong class='color-g'>gun</strong>` },
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -886,7 +886,7 @@ const tech = {
{ {
name: "anti-shear topology", name: "anti-shear topology",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Topology' class="link">anti-shear topology</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Topology' class="link">anti-shear topology</a>`,
description: "<strong>+30%</strong> projectile <strong>duration</strong><br>&nbsp;", //<br><em style = 'font-size: 83%'>drone spore worm flea missile foam wave neutron ice</em>", description: "<strong>+30%</strong> projectile <strong>duration</strong>", //<br><em style = 'font-size: 83%'>drone spore worm flea missile foam wave neutron ice</em>",
maxCount: 3, maxCount: 3,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -1019,7 +1019,7 @@ const tech = {
}, },
{ {
name: "reaction inhibitor", name: "reaction inhibitor",
description: "<strong>-12%</strong> maximum mob <strong>health</strong><br>&nbsp;", //<strong class='color-h'>health</strong> description: "<strong>-12%</strong> maximum mob <strong>health</strong>", //<strong class='color-h'>health</strong>
maxCount: 3, maxCount: 3,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -1084,7 +1084,7 @@ const tech = {
{ {
name: "nail-bot", name: "nail-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">nail-bot</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">nail-bot</a>`,
description: "a <strong class='color-bot'>bot</strong> fires <strong>nails</strong> at mobs in line of sight<br>&nbsp;", description: "a <strong class='color-bot'>bot</strong> fires <strong>nails</strong> at mobs in line of sight",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -1142,7 +1142,7 @@ const tech = {
{ {
name: "foam-bot", name: "foam-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">foam-bot</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">foam-bot</a>`,
description: "a <strong class='color-bot'>bot</strong> fires <strong>foam</strong> at nearby mobs<br>&nbsp;", description: "a <strong class='color-bot'>bot</strong> fires <strong>foam</strong> at nearby mobs",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -1683,7 +1683,7 @@ const tech = {
}, },
{ {
name: "mass driver", name: "mass driver",
description: "<strong>+300%</strong> <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong><br>&nbsp;", description: "<strong>+300%</strong> <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -2345,7 +2345,7 @@ const tech = {
{ {
name: "mass-energy equivalence", name: "mass-energy equivalence",
// description: "<strong class='color-f'>energy</strong> protects you instead of <strong class='color-h'>health</strong><br>√ of <strong class='color-defense'>defense</strong> <strong>reduction</strong> reduces max <strong class='color-f'>energy</strong>", // description: "<strong class='color-f'>energy</strong> protects you instead of <strong class='color-h'>health</strong><br>√ of <strong class='color-defense'>defense</strong> <strong>reduction</strong> reduces max <strong class='color-f'>energy</strong>",
description: "<strong class='color-f'>energy</strong> protects you instead of <strong class='color-h'>health</strong><br>exponentially <strong>reduced</strong> <strong class='color-defense'>defense</strong> <em>(x^0.1)</em>", description: "<strong class='color-f'>energy</strong> protects you instead of <strong class='color-h'>health</strong><br>exponentially <strong>reduced</strong> <strong class='color-defense'>defense</strong> <em>(~ x^0.1)</em>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -2411,10 +2411,10 @@ const tech = {
{ {
name: "electronegativity", name: "electronegativity",
descriptionFunction() { descriptionFunction() {
return `<strong>+1%</strong> <strong class='color-d'>damage</strong> per <strong>8</strong> stored <strong class='color-f'>energy</strong><br><em>(${(12.5*m.energy).toFixed(0)}%)</em>` return `<strong>+0.1%</strong> <strong class='color-d'>damage</strong> per current stored <strong class='color-f'>energy</strong><br><em>(+${(10*m.energy).toFixed(0)}%)</em>`
}, },
// description: "<strong>+1%</strong> <strong class='color-d'>damage</strong> per <strong>8</strong> stored <strong class='color-f'>energy</strong>", // description: "<strong>+1%</strong> <strong class='color-d'>damage</strong> per <strong>8</strong> stored <strong class='color-f'>energy</strong>",
maxCount: 1, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
@@ -2423,10 +2423,10 @@ const tech = {
}, },
requires: "", requires: "",
effect() { effect() {
tech.isEnergyDamage = true tech.energyDamage++
}, },
remove() { remove() {
tech.isEnergyDamage = false; tech.energyDamage = 0;
} }
}, },
{ {
@@ -2585,7 +2585,7 @@ const tech = {
}, },
{ {
name: "energy conservation", name: "energy conservation",
description: "<strong>5%</strong> of <strong class='color-d'>damage</strong> done recovered as <strong class='color-f'>energy</strong><br>&nbsp;", description: "<strong>5%</strong> of <strong class='color-d'>damage</strong> done recovered as <strong class='color-f'>energy</strong>",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3447,8 +3447,8 @@ const tech = {
}, },
{ {
name: "dark patterns", name: "dark patterns",
description: "<strong>+38%</strong> <strong class='color-d'>damage</strong><br><strong>+53%</strong> <strong class='color-junk'>JUNK</strong> to <strong class='color-m'>tech</strong> pool", description: "<strong>+15%</strong> <strong class='color-d'>damage</strong><br><strong>+15%</strong> <strong class='color-junk'>JUNK</strong> to <strong class='color-m'>tech</strong> pool",
maxCount: 1, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
@@ -3456,10 +3456,10 @@ const tech = {
return true return true
}, },
requires: "", requires: "",
damage: 1.38, damage: 1.15,
effect() { effect() {
tech.damage *= this.damage tech.damage *= this.damage
this.refundAmount += tech.addJunkTechToPool(0.53) this.refundAmount += tech.addJunkTechToPool(0.15)
}, },
refundAmount: 0, refundAmount: 0,
remove() { remove() {
@@ -3511,7 +3511,7 @@ const tech = {
}, },
{ {
name: "eternalism", name: "eternalism",
description: "<strong>+34%</strong> <strong class='color-d'>damage</strong><br><strong>time</strong> can't be <strong>paused</strong> <em>(time can be dilated)</em>", description: "<strong>+30%</strong> <strong class='color-d'>damage</strong><br><strong>time</strong> can't be <strong>paused</strong> <em>(time can be dilated)</em>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3520,7 +3520,7 @@ const tech = {
return !tech.isPauseSwitchField && !tech.isPauseEjectTech && !tech.isWormHolePause return !tech.isPauseSwitchField && !tech.isPauseEjectTech && !tech.isWormHolePause
}, },
requires: "not unified field theory, paradigm shift, invariant", requires: "not unified field theory, paradigm shift, invariant",
damage: 1.34, damage: 1.3,
effect() { effect() {
tech.damage *= this.damage tech.damage *= this.damage
tech.isNoDraftPause = true tech.isNoDraftPause = true
@@ -3845,7 +3845,7 @@ const tech = {
}, },
{ {
name: "correlated damage", name: "correlated damage",
description: "<strong class='color-dup'>duplication</strong> increases <strong class='color-d'>damage</strong><br>&nbsp;", description: "<strong class='color-dup'>duplication</strong> increases <strong class='color-d'>damage</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -4153,7 +4153,7 @@ const tech = {
}, },
{ {
name: "needle gun", name: "needle gun",
description: "<strong>nail gun</strong> and <strong>shotgun</strong> fire mob piercing <strong>needles</strong><br>&nbsp;", description: "<strong>nail gun</strong> and <strong>shotgun</strong> fire mob piercing <strong>needles</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4211,7 +4211,7 @@ const tech = {
}, },
{ {
name: "rivet gun", name: "rivet gun",
description: "<strong>nail gun</strong> and <strong>shotgun</strong> slowly lob a heavy <strong>rivet</strong><br>&nbsp;", description: "<strong>nail gun</strong> and <strong>shotgun</strong> slowly lob a heavy <strong>rivet</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4337,7 +4337,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isMineDrop + tech.isNailBotUpgrade + tech.fragments + tech.nailsDeathMob + (tech.haveGunCheck("super balls") + (tech.haveGunCheck("mine") && !(tech.isLaserMine || tech.isFoamMine)) + (tech.haveGunCheck("nail gun")) + tech.isNeedles + tech.isNailShot + tech.isRivets) * 2 > 1 return tech.isMineDrop + tech.isNailBotUpgrade + tech.fragments + tech.nailsDeathMob + (tech.haveGunCheck("super balls") + (tech.haveGunCheck("mine") && !(tech.isFoamMine || tech.isSuperMine)) + (tech.haveGunCheck("nail gun")) + tech.isNeedles + tech.isNailShot + tech.isRivets) * 2 > 1
}, },
requires: "nails, nail gun, rivets, shotgun, super balls, mine", requires: "nails, nail gun, rivets, shotgun, super balls, mine",
effect() { effect() {
@@ -4356,9 +4356,9 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.isNailShot || tech.isNeedles || tech.isNailBotUpgrade || tech.haveGunCheck("nail gun") || tech.isRivets) && !tech.isIncendiary && !tech.isCritKill return (tech.isNailShot || tech.isNeedles || tech.isNailBotUpgrade || tech.haveGunCheck("nail gun") || tech.isRivets || (tech.haveGunCheck("mine") && !(tech.isFoamMine || tech.isSuperMine))) && !tech.isIncendiary && !tech.isCritKill
}, },
requires: "nail gun, needles, nails, rivets, not incendiary, stress concentration", requires: "nail gun, mine, needles, nails, rivets, not incendiary, stress concentration",
effect() { effect() {
tech.isNailCrit = true tech.isNailCrit = true
}, },
@@ -4376,7 +4376,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isMineDrop || tech.isNailBotUpgrade || tech.fragments || tech.nailsDeathMob || (tech.haveGunCheck("mine") && !(tech.isLaserMine || tech.isFoamMine)) || (tech.haveGunCheck("nail gun") && !tech.isShieldPierce) || (tech.haveGunCheck("shotgun") && (tech.isNeedles || tech.isNailShot)) return tech.isMineDrop || tech.isNailBotUpgrade || tech.fragments || tech.nailsDeathMob || (tech.haveGunCheck("mine") && !(tech.isFoamMine || tech.isSuperMine)) || (tech.haveGunCheck("nail gun") && !tech.isShieldPierce) || (tech.haveGunCheck("shotgun") && (tech.isNeedles || tech.isNailShot))
}, },
requires: "nail gun, nails, rivets, mine, not ceramic needles", requires: "nail gun, nails, rivets, mine, not ceramic needles",
effect() { effect() {
@@ -4468,7 +4468,7 @@ const tech = {
}, },
{ {
name: "Newtons 3rd law", name: "Newtons 3rd law",
description: "<strong>+66%</strong> <strong>shotgun</strong> <strong><em>fire rate</em></strong> and <strong>recoil</strong><br>&nbsp;", description: "<strong>+66%</strong> <strong>shotgun</strong> <strong><em>fire rate</em></strong> and <strong>recoil</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4508,7 +4508,7 @@ const tech = {
{ {
name: "nail-shot", name: "nail-shot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Nail_(fastener)' class="link">nail-shot</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Nail_(fastener)' class="link">nail-shot</a>`,
description: "<strong>shotgun</strong> drives a long clip of <strong>nails</strong><br>&nbsp;", description: "<strong>shotgun</strong> drives a long clip of <strong>nails</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4528,7 +4528,7 @@ const tech = {
{ {
name: "foam-shot", name: "foam-shot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Foam' class="link">foam-shot</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Foam' class="link">foam-shot</a>`,
description: "<strong>shotgun</strong> sprays sticky <strong>foam</strong> bubbles<br>&nbsp;", description: "<strong>shotgun</strong> sprays sticky <strong>foam</strong> bubbles",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4548,7 +4548,7 @@ const tech = {
{ {
name: "ice-shot", name: "ice-shot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Ice-nine_(disambiguation)' class="link">ice-shot</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Ice-nine_(disambiguation)' class="link">ice-shot</a>`,
description: "<strong>shotgun</strong> grows freezing <strong class='color-s'>ice IX</strong> crystals<br>&nbsp;", description: "<strong>shotgun</strong> grows freezing <strong class='color-s'>ice IX</strong> crystals",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4567,7 +4567,7 @@ const tech = {
}, },
{ {
name: "freezer burn", name: "freezer burn",
description: "mobs <strong class='color-s'>frozen</strong> while below <strong>33%</strong> durability <strong>die</strong><br>&nbsp;", description: "mobs <strong class='color-s'>frozen</strong> while below <strong>33%</strong> durability <strong>die</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4669,7 +4669,7 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { 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.superHarm) || (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.isSuperMine) && !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", requires: "shotgun, super balls, rivets, drones, not irradiated drones, burst drones, polyurethane, Zectron",
effect() { effect() {
@@ -4679,6 +4679,44 @@ const tech = {
tech.isIncendiary = false; tech.isIncendiary = false;
} }
}, },
{
name: "Zectron",
description: `<strong>+80%</strong> <strong>super ball</strong> density and <strong class='color-d'>damage</strong>, but<br>after colliding with <strong>super balls</strong> <strong>lose</strong> <strong class='color-h'>health</strong>`,
isGunTech: true,
maxCount: 9,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("super balls") || tech.isSuperMine) && !tech.isIncendiary
},
requires: "super balls not incendiary ammunition",
effect() {
tech.superHarm++
},
remove() {
tech.superHarm = 0
}
},
{
name: "polyurethane foam",
description: "<strong>super balls</strong> and <strong>harpoons</strong> colliding with <strong>mobs</strong><br>catalyzes a reaction that yields <strong>foam</strong> bubbles",
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("super balls") || tech.isSuperMine) || (tech.haveGunCheck("harpoon") && !tech.fragments)
},
requires: "super balls, harpoon, not fragmentation",
effect() {
tech.isFoamBall = true;
},
remove() {
tech.isFoamBall = false;
}
},
{ {
name: "autocannon", name: "autocannon",
description: "fire <strong>+1</strong> extra <strong>super ball</strong><br><strong>balls</strong> are quickly released in same direction", description: "fire <strong>+1</strong> extra <strong>super ball</strong><br><strong>balls</strong> are quickly released in same direction",
@@ -4706,39 +4744,20 @@ const tech = {
} }
} }
}, },
{
name: "Zectron",
description: `<strong>+80%</strong> <strong>super ball</strong> density and <strong class='color-d'>damage</strong>, but<br>after colliding with <strong>super balls</strong> <strong>lose</strong> <strong class='color-h'>health</strong>`,
isGunTech: true,
maxCount: 9,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("super balls") && !tech.isIncendiary
},
requires: "super balls not incendiary ammunition",
effect() {
tech.superHarm++
},
remove() {
tech.superHarm = 0
}
},
{ {
name: "super duper", name: "super duper",
description: `randomly fire <strong>+0</strong>, <strong>+1</strong>, or <strong>+2</strong> extra <strong>super balls</strong><br>&nbsp;`, description: `randomly fire <strong>+0</strong>, <strong>+1</strong>, <strong>+2</strong>, or <strong>+3</strong> extra <strong>super balls</strong>`,
isGunTech: true, isGunTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("super balls") && !tech.oneSuperBall return (tech.haveGunCheck("super balls") || tech.isSuperMine) && !tech.oneSuperBall
}, },
requires: "super balls, not super ball", requires: "super balls, not super ball",
effect() { effect() {
tech.extraSuperBalls += 3 tech.extraSuperBalls += 4
}, },
remove() { remove() {
tech.extraSuperBalls = 0; tech.extraSuperBalls = 0;
@@ -4753,7 +4772,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("super balls") && !tech.extraSuperBalls && !tech.superBallDelay return (tech.haveGunCheck("super balls") || tech.isSuperMine) && !tech.extraSuperBalls && !tech.superBallDelay
}, },
requires: "super balls, not super duper or autocannon", requires: "super balls, not super duper or autocannon",
effect() { effect() {
@@ -4771,26 +4790,6 @@ const tech = {
} }
} }
}, },
{
name: "polyurethane foam",
description: "<strong>super balls</strong> and <strong>harpoons</strong> colliding with <strong>mobs</strong><br>catalyzes a reaction that yields <strong>foam</strong> bubbles",
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("super balls") || (tech.haveGunCheck("harpoon") && !tech.fragments)
},
requires: "super balls, harpoon, not fragmentation",
effect() {
tech.isFoamBall = true;
},
remove() {
tech.isFoamBall = false;
}
},
//
{ {
name: "phase velocity", name: "phase velocity",
description: "wave particles <strong>propagate</strong> faster as <strong>solids</strong><br><strong>+35%</strong> wave <strong class='color-d'>damage</strong>", description: "wave particles <strong>propagate</strong> faster as <strong>solids</strong><br><strong>+35%</strong> wave <strong class='color-d'>damage</strong>",
@@ -5145,7 +5144,7 @@ const tech = {
}, },
{ {
name: "ammonium nitrate", name: "ammonium nitrate",
description: "<strong>+24%</strong> <strong class='color-e'>explosive</strong> <strong class='color-d'>damage</strong>, radius<br>&nbsp;", description: "<strong>+24%</strong> <strong class='color-e'>explosive</strong> <strong class='color-d'>damage</strong>, radius",
isGunTech: true, isGunTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
@@ -5508,7 +5507,7 @@ const tech = {
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
// return (tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles) || (tech.haveGunCheck("mines")) // return (tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles) || (tech.haveGunCheck("mines"))
return tech.isMineDrop || tech.isNailBotUpgrade || tech.fragments || tech.nailsDeathMob || (tech.haveGunCheck("mine") && !(tech.isLaserMine || tech.isFoamMine)) || (tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles) || (tech.haveGunCheck("shotgun") && (tech.isNeedles || tech.isNailShot) && !tech.isRivets && !tech.isNeedles) return tech.isMineDrop || tech.isNailBotUpgrade || tech.fragments || tech.nailsDeathMob || (tech.haveGunCheck("mine") && !(tech.isLaserMine || tech.isFoamMine || tech.isSuperMine)) || (tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles) || (tech.haveGunCheck("shotgun") && (tech.isNeedles || tech.isNailShot) && !tech.isRivets && !tech.isNeedles)
}, },
// //
requires: "nail gun, not rotary cannon, rivets, or needles", requires: "nail gun, not rotary cannon, rivets, or needles",
@@ -5521,7 +5520,7 @@ const tech = {
}, },
{ {
name: "booby trap", name: "booby trap",
description: "<strong>60%</strong> chance to drop a <strong>mine</strong> from <strong>power ups</strong><br><strong>+46%</strong> <strong class='color-junk'>JUNK</strong> to <strong class='color-m'>tech</strong> pool", description: "<strong>50%</strong> chance to drop a <strong>mine</strong> from <strong>power ups</strong><br><strong>+36%</strong> <strong class='color-junk'>JUNK</strong> to <strong class='color-m'>tech</strong> pool",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5537,7 +5536,7 @@ const tech = {
x: 0, x: 0,
y: 0 y: 0
}, 0) }, 0)
this.refundAmount += tech.addJunkTechToPool(0.46) this.refundAmount += tech.addJunkTechToPool(0.36)
}, },
refundAmount: 0, refundAmount: 0,
remove() { remove() {
@@ -5550,16 +5549,16 @@ const tech = {
}, },
{ {
name: "elephants toothpaste", name: "elephants toothpaste",
description: "<strong>mines</strong> catalyze a reaction<br>that yields <strong>foam</strong> bubbles", description: "instead of nails <strong>mines</strong> catalyze a reaction<br>that yields <strong>foam</strong> bubbles",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("mine") && !tech.isMineSentry return tech.haveGunCheck("mine") && !tech.isSuperMine && !tech.isRicochet && !tech.isNailRadiation && !tech.isNailCrit
}, },
requires: "mines, not sentry", requires: "mines, not blast ball, ricochet, irradiated nails, supercritical fission",
effect() { effect() {
tech.isFoamMine = true; tech.isFoamMine = true;
}, },
@@ -5567,6 +5566,27 @@ const tech = {
tech.isFoamMine = false; tech.isFoamMine = false;
} }
}, },
{
name: "blast ball",
descriptionFunction() {
return `instead of nails <strong>mines</strong> fire bouncy ${b.guns[10].nameString('s')}`
},
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("mine") && !tech.isFoamMine && !tech.isRicochet && !tech.isNailRadiation && !tech.isNailCrit
},
requires: "mines, not elephants toothpaste, ricochet, irradiated nails, supercritical fission",
effect() {
tech.isSuperMine = true;
},
remove() {
tech.isSuperMine = false;
}
},
{ {
name: "laser-mines", name: "laser-mines",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Laser' class="link">laser-mines</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Laser' class="link">laser-mines</a>`,
@@ -5588,8 +5608,10 @@ const tech = {
} }
}, },
{ {
name: "sentry", name: "sentry gun",
description: "instead of detonating, <strong>mines</strong> <strong>target</strong> mobs<br>with a stream of nails for about <strong>17</strong> seconds", descriptionFunction() {
return `<strong>mines</strong> fire one ${b.guns[10].nameString()} at a time<br><strong>mines</strong> fire <strong>50%</strong> more ${b.guns[10].nameString('s')}`
},
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5606,6 +5628,27 @@ const tech = {
tech.isMineSentry = false; tech.isMineSentry = false;
} }
}, },
{
name: "extended magazine",
descriptionFunction() {
return `sentry <strong>mines</strong> fire <strong>50%</strong> more ${b.guns[10].nameString('s')}`
},
isGunTech: true,
maxCount: 9,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("mine") && tech.isMineSentry
},
requires: "mines, sentry",
effect() {
tech.sentryAmmo += 17;
},
remove() {
tech.sentryAmmo = 33;
}
},
{ {
name: "mycelial fragmentation", name: "mycelial fragmentation",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Fungus' class="link">mycelial fragmentation</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Fungus' class="link">mycelial fragmentation</a>`,
@@ -5626,25 +5669,28 @@ const tech = {
tech.isSporeGrowth = false tech.isSporeGrowth = false
} }
}, },
// { {
// name: "cordyceps", name: "cordyceps",
// description: "mobs infected by <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong><br><strong>resurrect</strong> and attack other mobs", // descriptionFunction() {
// isGunTech: true, // return `mobs infected by ${b.guns[6].nameString('s')} have a <strong>5%</strong> chance<br>to <strong>resurrect</strong> and attack other mobs`
// maxCount: 1, // },
// count: 0, description: "<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> <strong>infect</strong> mobs they attach to<br><strong>infected</strong> mobs <strong>resurrect</strong> and attack other mobs",
// frequency: 2, isGunTech: true,
// frequencyDefault: 2, maxCount: 1,
// allowed() { count: 0,
// return tech.haveGunCheck("spores") frequency: 2,
// }, frequencyDefault: 2,
// requires: "spores", allowed() {
// effect() { return tech.haveGunCheck("spores")
// tech.isZombieMobs = true },
// }, requires: "spores",
// remove() { effect() {
// tech.isZombieMobs = false tech.isZombieMobs = true
// } },
// }, remove() {
tech.isZombieMobs = false
}
},
{ {
name: "colony", name: "colony",
description: "<strong>+50%</strong> <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> discharge<br><strong>40%</strong> chance to discharge something different", description: "<strong>+50%</strong> <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> discharge<br><strong>40%</strong> chance to discharge something different",
@@ -5805,7 +5851,7 @@ const tech = {
}, },
{ {
name: "siphonaptera", name: "siphonaptera",
description: "<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> and <strong>shotgun</strong> hatch <strong class='color-p' style='letter-spacing: -0.8px;'>fleas</strong><br>&nbsp;", description: "<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> and <strong>shotgun</strong> hatch <strong class='color-p' style='letter-spacing: -0.8px;'>fleas</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5825,7 +5871,7 @@ const tech = {
}, },
{ {
name: "nematodes", name: "nematodes",
description: "<strong>shotgun</strong> and <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> hatch <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong><br>&nbsp;", description: "<strong>shotgun</strong> and <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> hatch <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -6209,7 +6255,7 @@ const tech = {
}, },
{ {
name: "surface tension", name: "surface tension",
description: "<strong>+43%</strong> <strong>foam</strong> <strong class='color-d'>damage</strong><br>&nbsp;", description: "<strong>+43%</strong> <strong>foam</strong> <strong class='color-d'>damage</strong>",
isGunTech: true, isGunTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
@@ -6417,7 +6463,7 @@ const tech = {
}, },
{ {
name: "alternator", name: "alternator",
description: "<strong>+90%</strong> <strong>harpoon</strong> <strong class='color-f'>energy</strong> efficiency<br>&nbsp;", description: "<strong>+90%</strong> <strong>harpoon</strong> <strong class='color-f'>energy</strong> efficiency",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -6652,7 +6698,7 @@ const tech = {
}, },
{ {
name: "relativistic momentum", name: "relativistic momentum",
description: "<strong class='color-laser'>lasers</strong> push <strong>mobs</strong> and <strong class='color-block'>blocks</strong><br>&nbsp;", description: "<strong class='color-laser'>lasers</strong> push <strong>mobs</strong> and <strong class='color-block'>blocks</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -6737,7 +6783,7 @@ const tech = {
}, },
{ {
name: "specular reflection", name: "specular reflection",
description: "<strong>+2</strong> <strong class='color-laser'>laser</strong> beam reflections<br>&nbsp;", description: "<strong>+2</strong> <strong class='color-laser'>laser</strong> beam reflections",
isGunTech: true, isGunTech: true,
maxCount: 3, maxCount: 3,
count: 0, count: 0,
@@ -6756,7 +6802,7 @@ const tech = {
}, },
{ {
name: "diffraction grating", name: "diffraction grating",
description: `<strong>+1</strong> diverging <strong class='color-laser'>laser</strong> <strong class='color-g'>gun</strong> beam<br>&nbsp;`, description: `<strong>+1</strong> diverging <strong class='color-laser'>laser</strong> <strong class='color-g'>gun</strong> beam`,
isGunTech: true, isGunTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
@@ -7794,7 +7840,7 @@ const tech = {
}, },
{ {
name: "time crystals", name: "time crystals",
description: "<strong>+200%</strong> passive <strong class='color-f'>energy</strong> generation<br>&nbsp;", description: "<strong>+200%</strong> passive <strong class='color-f'>energy</strong> generation",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -8415,7 +8461,7 @@ const tech = {
const loop = () => { const loop = () => {
if ((simulation.isChoosing) && m.alive && !build.isExperimentSelection) { if ((simulation.isChoosing) && m.alive && !build.isExperimentSelection) {
const dmg = Math.floor(27 * Math.random()) * 0.01 const dmg = Math.floor(27 * Math.random()) * 0.01
this.text = `<strong style = "font-family: 'Courier New', monospace;">+${(dmg*100).toFixed(0).padStart(2, '0')}%</strong> <strong class='color-d'>damage</strong><br>&nbsp;` this.text = `<strong style = "font-family: 'Courier New', monospace;">+${(dmg*100).toFixed(0).padStart(2, '0')}%</strong> <strong class='color-d'>damage</strong>`
this.damage = 1 + dmg this.damage = 1 + dmg
if (document.getElementById(`damage-JUNK-id${this.id}`)) document.getElementById(`damage-JUNK-id${this.id}`).innerHTML = this.text if (document.getElementById(`damage-JUNK-id${this.id}`)) document.getElementById(`damage-JUNK-id${this.id}`).innerHTML = this.text
setTimeout(() => { setTimeout(() => {
@@ -8542,7 +8588,7 @@ const tech = {
}, },
{ {
name: "meteor shower", name: "meteor shower",
description: "take a shower, but meteors instead of water<br>&nbsp;", description: "take a shower, but meteors instead of water",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8688,7 +8734,7 @@ const tech = {
// }, // },
{ {
name: "discount", name: "discount",
description: "get 3 random <strong class='color-junk'>JUNK</strong><strong class='color-m'>tech</strong> for the price of 1!<br>&nbsp;", description: "get 3 random <strong class='color-junk'>JUNK</strong><strong class='color-m'>tech</strong> for the price of 1!",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8757,7 +8803,7 @@ const tech = {
}, },
{ {
name: "harvest", name: "harvest",
description: "convert all the mobs on this level into <strong class='color-ammo'>ammo</strong><br>&nbsp;", description: "convert all the mobs on this level into <strong class='color-ammo'>ammo</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8824,7 +8870,7 @@ const tech = {
}, },
{ {
name: "palantír", name: "palantír",
description: `see far away lands<br>&nbsp;`, description: `see far away lands`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8855,7 +8901,7 @@ const tech = {
}, },
{ {
name: "motion sickness", name: "motion sickness",
description: `disable camera smoothing<br>&nbsp;`, description: `disable camera smoothing`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8888,7 +8934,7 @@ const tech = {
}, },
{ {
name: "facsimile", name: "facsimile",
description: `inserts a copy of your current level into the level list<br>&nbsp;`, description: `inserts a copy of your current level into the level list`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8924,7 +8970,7 @@ const tech = {
}, },
{ {
name: "bounce", name: "bounce",
description: "you bounce off things. It's annoying, but not that bad.<br>&nbsp;", description: "you bounce off things. It's annoying, but not that bad.",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8942,7 +8988,7 @@ const tech = {
}, },
{ {
name: "mouth", name: "mouth",
description: "mobs have a non functional mouth<br>&nbsp;", description: "mobs have a non functional mouth",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8988,7 +9034,7 @@ const tech = {
}, },
{ {
name: "all-stars", name: "all-stars",
description: "make all mobs look like stars<br>&nbsp;", description: "make all mobs look like stars",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9049,7 +9095,7 @@ const tech = {
// }, // },
{ {
name: "true colors", name: "true colors",
description: `set all power ups to their real world colors<br>&nbsp;`, description: `set all power ups to their real world colors`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9264,7 +9310,7 @@ const tech = {
}, },
{ {
name: "not a bug", name: "not a bug",
description: "initiate a totally safe game crash for 10 seconds<br>&nbsp;", description: "initiate a totally safe game crash for 10 seconds",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9291,7 +9337,7 @@ const tech = {
}, },
{ {
name: "spinor", name: "spinor",
description: "the direction you aim is determined by your position<br>&nbsp;", description: "the direction you aim is determined by your position",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9320,7 +9366,7 @@ const tech = {
}, },
{ {
name: "p-zombie", name: "p-zombie",
description: "set your <strong class='color-h'>health</strong> to <strong>1</strong><br>all mobs die and <strong>resurrect</strong> as zombies", description: "set your <strong class='color-h'>health</strong> to <strong>1</strong><br>all mobs, not bosses, die and <strong>resurrect</strong> as zombies",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9342,7 +9388,7 @@ const tech = {
}, },
{ {
name: "decomposers", name: "decomposers",
description: "after they die <strong>mobs</strong> leave behind <strong>spawns</strong><br>&nbsp;", description: "after they die <strong>mobs</strong> leave behind <strong>spawns</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9361,7 +9407,7 @@ const tech = {
}, },
{ {
name: "panopticon", name: "panopticon",
description: "<strong>mobs</strong> can always see you<br>&nbsp;", description: "<strong>mobs</strong> can always see you",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9433,20 +9479,6 @@ const tech = {
if (this.count) m.look = m.lookDefault if (this.count) m.look = m.lookDefault
} }
}, },
{
name: "iFrames",
description: "you are <strong>invulnerable</strong><br>when you aren't taking damage",
maxCount: 1,
count: 0,
frequency: 0,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {},
remove() {}
},
{ {
name: "disintegrated armament", name: "disintegrated armament",
description: "spawn a <strong class='color-g'>gun</strong><br><strong>remove</strong> your active <strong class='color-g'>gun</strong>", description: "spawn a <strong class='color-g'>gun</strong><br><strong>remove</strong> your active <strong class='color-g'>gun</strong>",
@@ -9499,7 +9531,7 @@ const tech = {
}, },
{ {
name: "encryption", name: "encryption",
description: "secure <strong class='color-m'>tech</strong> information<br>&nbsp;", description: "secure <strong class='color-m'>tech</strong> information",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9549,7 +9581,7 @@ const tech = {
}, },
{ {
name: "score", name: "score",
description: "Add a score to n-gon!<br>&nbsp;", description: "Add a score to n-gon!",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9588,7 +9620,7 @@ const tech = {
}, },
{ {
name: "music", name: "music",
description: "add music to n-gon<br>&nbsp;", description: "add music to n-gon",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9605,7 +9637,7 @@ const tech = {
}, },
{ {
name: "performance", name: "performance",
description: "display performance stats to n-gon<br>&nbsp;", description: "display performance stats to n-gon",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9661,7 +9693,7 @@ const tech = {
}, },
{ {
name: "defragment", name: "defragment",
description: "set the <strong class='flicker'>frequency</strong> of finding <strong class='color-junk'>JUNK</strong><strong class='color-m'>tech</strong> to zero<br>&nbsp;", description: "set the <strong class='flicker'>frequency</strong> of finding <strong class='color-junk'>JUNK</strong><strong class='color-m'>tech</strong> to zero",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9701,7 +9733,7 @@ const tech = {
// }, // },
{ {
name: "pitch", name: "pitch",
description: "oscillate the pitch of your world<br>&nbsp;", description: "oscillate the pitch of your world",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9738,7 +9770,7 @@ const tech = {
}, },
{ {
name: "lighter", name: "lighter",
description: `ctx.globalCompositeOperation = "lighter"<br>&nbsp;`, description: `ctx.globalCompositeOperation = "lighter"`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9755,7 +9787,7 @@ const tech = {
}, },
{ {
name: "rewind", name: "rewind",
description: "every 10 seconds <strong class='color-rewind'>rewind</strong> <strong>2</strong> seconds<br>&nbsp;", description: "every 10 seconds <strong class='color-rewind'>rewind</strong> <strong>2</strong> seconds",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9778,7 +9810,7 @@ const tech = {
}, },
{ {
name: "undo", name: "undo",
description: "every 4 seconds <strong class='color-rewind'>rewind</strong> <strong>1/2</strong> a second<br>&nbsp;", description: "every 4 seconds <strong class='color-rewind'>rewind</strong> <strong>1/2</strong> a second",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9798,7 +9830,7 @@ const tech = {
}, },
{ {
name: "energy to mass conversion", name: "energy to mass conversion",
description: "convert your <strong class='color-f'>energy</strong> into <strong class='color-block'>blocks</strong><br>&nbsp;", description: "convert your <strong class='color-f'>energy</strong> into <strong class='color-block'>blocks</strong>",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9830,7 +9862,7 @@ const tech = {
}, },
{ {
name: "level.nextLevel()", name: "level.nextLevel()",
description: "advance to the next level<br>&nbsp;", description: "advance to the next level",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9916,7 +9948,7 @@ const tech = {
}, },
{ {
name: "missile launching system", name: "missile launching system",
description: "fire missiles for the next 120 seconds<br>&nbsp;", description: "fire missiles for the next 120 seconds",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9941,7 +9973,7 @@ const tech = {
}, },
{ {
name: "grenade production", name: "grenade production",
description: "drop a grenade every 2 seconds<br>&nbsp;", description: "drop a grenade every 2 seconds",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9994,7 +10026,7 @@ const tech = {
// }, // },
{ {
name: "Sleipnir", name: "Sleipnir",
description: "grow more legs<br>&nbsp;", description: "grow more legs",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10081,7 +10113,7 @@ const tech = {
}, },
{ {
name: "🐱", name: "🐱",
description: "🐈<br>&nbsp;", description: "🐈",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10181,7 +10213,7 @@ const tech = {
}, },
{ {
name: "posture", name: "posture",
description: "stand a bit taller<br>&nbsp;", description: "stand a bit taller",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10200,7 +10232,7 @@ const tech = {
}, },
{ {
name: "rhythm", name: "rhythm",
description: "you oscillate up and down<br>&nbsp;", description: "you oscillate up and down",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10221,7 +10253,7 @@ const tech = {
}, },
{ {
name: "pareidolia", name: "pareidolia",
description: "don't<br>&nbsp;", description: "don't",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10290,7 +10322,7 @@ const tech = {
}, },
{ {
name: "prism", name: "prism",
description: "you cycle through different <strong>colors</strong><br>&nbsp;", description: "you cycle through different <strong>colors</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10444,7 +10476,7 @@ const tech = {
}, },
{ {
name: "growth hacking", name: "growth hacking",
description: "increase combat <strong>difficulty</strong> by <strong>1 level</strong><br>&nbsp;", description: "increase combat <strong>difficulty</strong> by <strong>1 level</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10461,7 +10493,7 @@ const tech = {
}, },
{ {
name: "stun", name: "stun",
description: "<strong>stun</strong> all mobs for up to <strong>8</strong> seconds<br>&nbsp;", description: "<strong>stun</strong> all mobs for up to <strong>8</strong> seconds",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10506,7 +10538,7 @@ const tech = {
}, },
{ {
name: "re-research", name: "re-research",
description: `<strong>eject</strong> all your ${powerUps.orb.research(1)}<br>&nbsp;`, description: `<strong>eject</strong> all your ${powerUps.orb.research(1)}`,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10544,7 +10576,7 @@ const tech = {
}, },
{ {
name: "black hole cluster", name: "black hole cluster",
description: `spawn <strong>30</strong> nearby <strong>black holes</strong><br>&nbsp;`, description: `spawn <strong>30</strong> nearby <strong>black holes</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -11049,7 +11081,7 @@ const tech = {
isVacuumBomb: null, isVacuumBomb: null,
renormalization: null, renormalization: null,
fragments: null, fragments: null,
isEnergyDamage: null, energyDamage: null,
botSpawner: null, botSpawner: null,
isBotSpawnerReset: null, isBotSpawnerReset: null,
isSporeFollow: null, isSporeFollow: null,
@@ -11323,5 +11355,7 @@ const tech = {
isGunChoice: null, isGunChoice: null,
railChargeRate: null, railChargeRate: null,
superHarm: null, superHarm: null,
isZombieMobs: null isZombieMobs: null,
isSuperMine: null,
sentryAmmo: null,
} }

294
style.css
View File

@@ -85,7 +85,6 @@ td {
.key-input { .key-input {
padding: 3px 8px; padding: 3px 8px;
border: 2px solid #333; border: 2px solid #333;
/* border-radius: 50px; */
background-color: #fff; background-color: #fff;
text-align: center; text-align: center;
} }
@@ -98,7 +97,6 @@ td {
width: 15px; width: 15px;
padding: 0px 2px; padding: 0px 2px;
border: 2px solid #333; border: 2px solid #333;
/* border-radius: 50px; */
background-color: #fff; background-color: #fff;
text-align: center; text-align: center;
} }
@@ -165,21 +163,15 @@ summary {
top: 50%; top: 50%;
left: 50%; left: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
padding: 10px 1px; padding: 10px 1px;
/* gap: 1px; */
margin: 0px; margin: 0px;
border: 0px; border: 0px;
z-index: 12; z-index: 12;
max-height: 99vh; max-height: 99vh;
font-size: 1.3em; font-size: 1.3em;
display: grid; display: grid;
grid-template-columns: repeat(3, 384px); grid-template-columns: repeat(3, 384px);
align-items: stretch; align-items: stretch;
/* align-items: start; */
/* align-content: start; */
/* grid-auto-rows: minmax(auto, 140px); */
visibility: hidden; visibility: hidden;
opacity: 0; opacity: 0;
transition: opacity 0.25s linear; transition: opacity 0.25s linear;
@@ -192,13 +184,9 @@ summary {
} }
.choose-grid-module { .choose-grid-module {
/* padding: 5px; */
line-height: 160%; line-height: 160%;
/* border-radius: 8px; */
background-color: #fafcfd; background-color: #fafcfd;
font-size: 0.75em; font-size: 0.75em;
/* border: 1px #444 solid; */
/* box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.25); */
} }
.choose-grid-module:hover { .choose-grid-module:hover {
@@ -216,15 +204,11 @@ summary {
.pause-grid { .pause-grid {
padding: 2px; padding: 2px;
margin: 0px; margin: 0px;
display: none; display: none;
grid-template-columns: 384px; grid-template-columns: 384px;
/* grid-template-columns: repeat(auto-fit, minmax(310px, 1fr)); */
grid-auto-rows: minmax(auto, auto); grid-auto-rows: minmax(auto, auto);
align-content: start; align-content: start;
align-items: start; align-items: start;
/* align-content: space-between; */
/* gap: 10px; */
z-index: 2; z-index: 2;
font-size: 1.3em; font-size: 1.3em;
} }
@@ -259,19 +243,9 @@ summary {
} }
.pause-grid-module { .pause-grid-module {
/* margin: -1px;
padding: 10px;
line-height: 160%; line-height: 160%;
border: 1px #333 solid;
border-radius: 8px;
background-color: #fff;
font-size: 0.65em; */
/* padding: 5px; */
line-height: 160%;
/* border-radius: 8px; */
background-color: #fafcfd; background-color: #fafcfd;
font-size: 0.75em; font-size: 0.75em;
/* border: 2px #444 solid; */
} }
.pause-eject .card-text { .pause-eject .card-text {
@@ -281,24 +255,14 @@ summary {
#experiment-grid { #experiment-grid {
display: flex; display: flex;
justify-content: center; justify-content: center;
/* align-content: space-between; */
/* align-items: start; */
/* align-items: stretch; */
/* padding-top: 10px; */
/* padding: 16px; */
padding: 10px 1px; padding: 10px 1px;
margin: 0px; margin: 0px;
border: 0px; border: 0px;
background-color: var(--build-bg-color); background-color: var(--build-bg-color);
/* background-color: #444; */
display: none; display: none;
/* grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); */
grid-template-columns: repeat(auto-fit, 384px); grid-template-columns: repeat(auto-fit, 384px);
grid-auto-flow: row; grid-auto-flow: row;
grid-auto-rows: minmax(auto, auto); grid-auto-rows: minmax(auto, auto);
/* gap: 1px; */
position: relative; position: relative;
bottom: 0px; bottom: 0px;
z-index: 10; z-index: 10;
@@ -311,14 +275,9 @@ summary {
} }
.experiment-grid-module { .experiment-grid-module {
/* padding: 0.1em; */
/* padding: 5px; */
line-height: 160%; line-height: 160%;
/* border-radius: 8px; */
background-color: #fafcfd; background-color: #fafcfd;
font-size: 0.75em; font-size: 0.75em;
/* border: 1px #444 solid; */
/* margin: -0.5px; */
} }
.experiment-grid-hide { .experiment-grid-hide {
@@ -337,28 +296,22 @@ summary {
} }
.card-background { .card-background {
/* width:288; */
height:340px; height:340px;
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
display: flex; display: flex;
justify-content:flex-end; justify-content:flex-end;
flex-direction: column; flex-direction: column;
/* margin: 5px; */
} }
.card-text { .card-text {
background-color: rgba(255,255,255,1); background-color: rgba(255,255,255,1);
/* border-radius: 8px; */
/* padding: 11px 13px; */
padding: 0.5em 1em; padding: 0.5em 1em;
/* border-top: 1px solid var(--build-bg-color); */
border: 1px solid #444; border: 1px solid #444;
margin-top: -1px; margin-top: -1px;
margin-right: -1px; margin-right: -1px;
font-size: 0.92em; font-size: 0.92em;
min-height: 88px; min-height: 88px;
/* height:78px; */
} }
.cancel-card { .cancel-card {
text-align: center; text-align: center;
@@ -369,7 +322,6 @@ summary {
margin-top: -1px; margin-top: -1px;
margin-right: -1px; margin-right: -1px;
padding: 1px; padding: 1px;
line-height: 160%; line-height: 160%;
background-color: #fafcfd; background-color: #fafcfd;
} }
@@ -385,10 +337,39 @@ summary {
} }
/* media rules for smaller screens /* keeps 5 columns at 1440px */
4->3 at 1550 @media (1710px <= width < 1950px) {
*/ .experiment-grid-module, .choose-grid-module, .pause-grid-module {
@media (1500px <= width < 1950px) { line-height: 143%;
font-size: 0.68em;
}
#experiment-grid, #choose-grid, .pause-grid{
grid-template-columns: repeat(auto-fit, 340px);
}
.card-background{
height:290px;
}
.card-text {
min-height: 75px;
}
}
@media (width < 1710px) {
.experiment-grid-module, .choose-grid-module, .pause-grid-module {
line-height: 139%;
font-size: 0.58em;
}
#experiment-grid, #choose-grid, .pause-grid{
grid-template-columns: repeat(auto-fit, 285px);
}
.card-background{
height:240px;
}
.card-text {
min-height: 64px;
}
}
/* keeps 4 columns at 1440px */
/* @media (1500px <= width < 1950px) {
.experiment-grid-module, .choose-grid-module, .pause-grid-module { .experiment-grid-module, .choose-grid-module, .pause-grid-module {
line-height: 150%; line-height: 150%;
font-size: 0.72em; font-size: 0.72em;
@@ -417,59 +398,6 @@ summary {
.card-text { .card-text {
min-height: 75px; min-height: 75px;
} }
}
/* default
.experiment-grid-module {
line-height: 160%;
font-size: 0.75em;
}
.card-background {
height:340px;
}
#experiment-grid{
grid-template-columns: repeat(auto-fit, 384px);
}
*/
/* .no-image-cards{
border: 1px solid #444;
} */
/* .card-text:hover {
background-color: #efeff5;
} */
/* .build-field-selected {
background-color: hsl(193, 100%, 75%);
}
.build-field-selected:hover {
background-color: hsl(193, 100%, 68%);
}
.build-gun-selected {
background-color: hsl(218, 100%, 81%);
}
.build-gun-selected:hover {
background-color: hsl(218, 100%, 76%);
}
.build-tech-selected .card-text{
background-color: hsl(253, 100%, 84%);
}
.build-tech-selected:hover .card-text{
background-color: hsl(253, 100%, 81%);
} */
/* .experiment-grid-module:hover .card-text:not(.build-tech-selected, .build-field-selected, .build-gun-selected) {
background-color: #efeff5;
} */ } */
.experiment-grid-module:hover .card-text { .experiment-grid-module:hover .card-text {
@@ -495,17 +423,13 @@ summary {
} }
.experiment-grid-disabled { .experiment-grid-disabled {
/* opacity: 0.5; */
background-color: var(--build-bg-color); background-color: var(--build-bg-color);
/* color: rgba(0, 0, 0, 0.9); */
color: #000; color: #000;
opacity: 0.25; opacity: 0.25;
/* transition: background-color 1s, color 1s; */
} }
.experiment-grid-disabled[data-descr] { .experiment-grid-disabled[data-descr] {
position: relative; position: relative;
/* opacity: 0; */
} }
.experiment-grid-disabled[data-descr]:hover::after { .experiment-grid-disabled[data-descr]:hover::after {
@@ -535,7 +459,6 @@ summary {
padding: 10px; padding: 10px;
border-radius: 8px; border-radius: 8px;
border: 2px #333 solid; border: 2px #333 solid;
/* background-color: #eee; */
background-color: #fff; background-color: #fff;
} }
@@ -670,12 +593,9 @@ summary {
transition: opacity 0.25s; transition: opacity 0.25s;
pointer-events: none; pointer-events: none;
user-select: none; user-select: none;
/* white-space: pre;
font-family: 'Menlo', 'Monaco', monospace; */
} }
/* color for in game console output */ /* color for in game console output */
.color-text { .color-text {
color: #000; color: #000;
} }
@@ -697,32 +617,6 @@ summary {
background-color: #ff0; background-color: #ff0;
padding: 3px; padding: 3px;
} }
/* colors for pause, selection and experiment */
/* #text-log {
z-index: 2;
position: absolute;
bottom: 4px;
left: 6px;
line-height: 130%;
font-size: 1.2em;
color: rgb(237, 15, 148);
transition: opacity 1s;
pointer-events: none;
user-select: none;
}
.color-text {
color: rgb(0, 164, 164);
}
.color-symbol {
color: #fff;
}
*/
.color-f { .color-f {
color: #0ad; color: #0ad;
@@ -769,44 +663,11 @@ summary {
} }
.color-dup { .color-dup {
/* color: hsl(243, 100%, 38%); */
font-variant: small-caps; font-variant: small-caps;
letter-spacing: 1px; letter-spacing: 1px;
text-shadow: 1.5px -1.5px hsla(243, 100%, 38%, 0.2); text-shadow: 1.5px -1.5px hsla(243, 100%, 38%, 0.2);
/* text-decoration: underline; */
} }
/* .mob {
text-shadow: 0px 1px, 1px 0px, 1px 1px;
} */
/* @keyframes bounce-munch {
0% {
vertical-align: -40px;
}
50% {
vertical-align: 4px;
}
100% {
vertical-align: 40px;
}
} */
/* .color-bot { */
/* background-color: #eee; */
/* color: #555; */
/* letter-spacing: -1.5px; */
/* text-transform: uppercase; */
/* font-variant: all-caps; */
/* text-decoration: underline solid; */
/* border: 1px solid #000; */
/* padding: 10px; */
/* border-radius: 10%; */
/* font-family: Lucida Console, Courier, monospace; */
/* color: #777; */
/* } */
.color-cloaked { .color-cloaked {
letter-spacing: 2px; letter-spacing: 2px;
animation: cloak 6s linear infinite alternate; animation: cloak 6s linear infinite alternate;
@@ -832,10 +693,6 @@ summary {
.color-laser { .color-laser {
color: #f02; color: #f02;
/* color: #000bff; */
/* color: #83f; */
/* text-shadow: 0px 0px 2px rgba(255, 0, 119, 0.3); */
/* text-shadow: 0px 0px 1.5px rgba(0, 0, 0, 1), 0px 0px 5px rgba(255, 0, 0, 1); */
font-weight: 100; font-weight: 100;
letter-spacing: -0.8px; letter-spacing: -0.8px;
} }
@@ -852,12 +709,9 @@ summary {
.color-worm { .color-worm {
color: #fff; color: #fff;
text-shadow: 1px 0px 2px #234; text-shadow: 1px 0px 2px #234;
/* letter-spacing: 2px; */
} }
.color-defense { .color-defense {
/* color: */
/* text-shadow: #FC0 1px 0 10px; */
background-color: hsla(227, 9%, 71%, 0.279); background-color: hsla(227, 9%, 71%, 0.279);
padding: 2px; padding: 2px;
border-radius: 4px; border-radius: 4px;
@@ -882,18 +736,9 @@ summary {
.color-junk { .color-junk {
letter-spacing: 1px; letter-spacing: 1px;
/* font-weight: 100; */
font-family: Lucida Console, Courier, monospace; font-family: Lucida Console, Courier, monospace;
/* transform: rotate(-90deg); */
} }
/* .color-rewind {
background-image: linear-gradient(to left, #fff, #bbb);
border-radius: 5px;
padding: 2px;
letter-spacing: 1px;
} */
.color-r { .color-r {
color: #f7b; color: #f7b;
letter-spacing: 1px; letter-spacing: 1px;
@@ -993,20 +838,6 @@ summary {
margin-bottom: -0.5px; margin-bottom: -0.5px;
} }
/* .circle-grid-shadow {
width: 43px;
height: 43px;
border-radius: 50%;
display: inline-block;
margin-bottom: -15px;
} */
/* .circle-gun-tech {
box-shadow: 0 0 0 3px #025;
} */
@keyframes pulse { @keyframes pulse {
0% { 0% {
border-radius: 0%; border-radius: 0%;
@@ -1017,31 +848,14 @@ summary {
} }
} }
/* .circle-grid-gun {
width: 10px;
height: 10px;
border-radius: 50%;
display: inline-block;
margin-bottom: 0px;
background: #025;
box-shadow: 0 0 0 8px hsl(253, 80%, 67%);
} */
.field { .field {
background-color: #0cf; background-color: #0cf;
} }
.tech { .tech {
/* background: rgb(116, 102, 238); */
/* background: hsl(253, 57%, 52%); */
background-color: hsl(255, 100%, 71%); background-color: hsl(255, 100%, 71%);
/* background: hsl(282, 100%, 64%); */
} }
/* .grey {
background: #afb6c2;
} */
.gun { .gun {
background-color: rgb(0, 80, 218); background-color: rgb(0, 80, 218);
} }
@@ -1051,7 +865,6 @@ summary {
} }
.research { .research {
/* #f84 #f99*/
background-color: #f7b; background-color: #f7b;
} }
@@ -1059,7 +872,6 @@ summary {
animation: alt 8s linear infinite alternate; animation: alt 8s linear infinite alternate;
font-weight: 400; font-weight: 400;
letter-spacing: 1px; letter-spacing: 1px;
/* color: rgba(0, 0, 0, 0.5) */
} }
@keyframes alt { @keyframes alt {
@@ -1096,35 +908,11 @@ summary {
} }
.color-coupling { .color-coupling {
/* animation: coupling 1000ms linear infinite alternate; */
/* animation: vibrate 500ms linear infinite alternate;
display: inline-block; */
/* text-shadow: 0px 0px 2px #0cf; */
/* text-shadow: 0px 0px 1.5px #0cf; */
text-shadow: 0px 0px 1.5px #0cf; text-shadow: 0px 0px 1.5px #0cf;
/* color: hsl(255, 82%, 59%); */
letter-spacing: 1px; letter-spacing: 1px;
font-weight: 100; font-weight: 100;
} }
/* @keyframes coupling{
0%{
letter-spacing: 0.5px;
}
100%{
letter-spacing: 1px;
}
}
@keyframes vibrate{
0% {
transform: translateY(-0.25px)
}
100% {
transform: translateY(0.25px)
}
} */
.box { .box {
padding: 3px 8px 3px 8px; padding: 3px 8px 3px 8px;
border: 2px solid #444; border: 2px solid #444;
@@ -1157,13 +945,11 @@ summary {
} }
.entanglement { .entanglement {
/* color: #456; */
font-size: 1.1em; font-size: 1.1em;
font-weight: 100; font-weight: 100;
text-align: center; text-align: center;
letter-spacing: 10px; letter-spacing: 10px;
border: none; border: none;
/* border-radius: 50%; */
background-color: #efeff5; background-color: #efeff5;
} }
.flipX { .flipX {
@@ -1299,16 +1085,4 @@ summary {
.link:hover { .link:hover {
text-decoration: underline; text-decoration: underline;
/* color: #0ad; */ }
}
/* #console {
font-family: monospace;
font-size: 1.5em;
width: 300px;
height: 50px;
position: absolute;
bottom: 10px;
right: 10px;
z-index: 3;
} */

View File

@@ -1,29 +1,29 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
card images and text scale based on browser width for smaller screens tech: cordyceps - sporangium infect mobs, making them fight for you as zombies
tech Zectron - super ball can damage you, but they do more damage to mobs tech: blast ball - mines fire super balls
superBall bullets are converted to run off generic b.superBall() tech: extended magazine - sentry fires 50% more shots
sentry works with foam, nails, or super balls
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 dark patterns - stacks to 9
sneakBoss - a large sneaker that can hide several times before it dies 38->15% damage, 53->15% JUNK
electronegativity - stacks to 9
0.12->0.1% damage per energy
bug fixes bug fixes
*********************************************************** TODO ***************************************************** *********************************************************** TODO *****************************************************
tech: cordyceps - sporangium infect mobs, making them fight for you super-bot
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?
Now that super balls are generic maybe something else should produce them tech - shotgun triple shot, but a bit longer of a delay
super-bot
molecular fabricator - how to aim? tech - after standing wave runs out of energy from blocking, gain a buff
shotgun - too similar to super ball gun buff: defense, damage?
make super balls with Zectron deflectable with field
but is there a simple way to do this?
set mob health bar colors based on status effects? set mob health bar colors based on status effects?
make mob damage immunity a mob status effect? make mob damage immunity a mob status effect?
@@ -87,6 +87,8 @@ hookBoss fires a hook that pulls player towards it
finalBoss finalBoss
add synergies between modes: add synergies between modes:
new modes: new modes:
something that needs to be killed quickly
if you don't kill it boss gets a shield
rotating quadrant immunity shield, can't take damage from that quadrant rotating quadrant immunity shield, can't take damage from that quadrant
maybe also attack player near that quadrant maybe also attack player near that quadrant
but how to tell the angle of incoming damage but how to tell the angle of incoming damage
@@ -1136,7 +1138,7 @@ possible names for tech
******************************************************** CARS IMAGES ******************************************************** ******************************************************** CARS IMAGES ********************************************************
process: discord midjourney prompts -> "pixelmator pro" -> adjust color, repair, scale to 384x256, export PNG -> webP? -> place in /img folder 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 make n-gon a progressive web app to manage image downloads, cache
wave function collapse opens the pause menu after it triggers alternate reality 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 this is actually good, maybe reuse this code to get pause menu to open at any time
@@ -1155,16 +1157,12 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
***major themes missing*** ***major themes missing***
***maybe redo*** ***maybe redo***
dynamical systems dynamical systems
harpoon gun
Eiichiro Oda --niji
nail-bot nail-bot
homeostasis homeostasis
heuristics heuristics
thermal runaway - infrared maybe? thermal runaway - infrared maybe?
redo the energy tech images with by Laurie Greasley redo the energy tech images with by Laurie Greasley
now that you can use --ar 3:2 --stylize 1000 and photo repair now that you can use --ar 3:2 --stylize 1000 and photo repair
in general too many black background
redo fractal tech with white background
***past style themes*** ***past style themes***
field emitter - isometric, clean white robot spherical gun turret on bird legs, blender 3d, style of artstation and behance, Disney Pixar, cute field emitter - isometric, clean white robot spherical gun turret on bird legs, blender 3d, style of artstation and behance, Disney Pixar, cute
standing wave - concentric transparent blue geometric circles science standing wave - concentric transparent blue geometric circles science