diff --git a/img/1st ionization energy.webp b/img/1st ionization energy.webp
index 95e17b1..5f13a56 100644
Binary files a/img/1st ionization energy.webp and b/img/1st ionization energy.webp differ
diff --git a/img/Gibbs free energy.webp b/img/Gibbs free energy.webp
index 321c317..b4b03d3 100644
Binary files a/img/Gibbs free energy.webp and b/img/Gibbs free energy.webp differ
diff --git a/img/ceramics.webp b/img/ceramics.webp
index 6cdd6e6..ca6c177 100644
Binary files a/img/ceramics.webp and b/img/ceramics.webp differ
diff --git a/img/electronegativity.webp b/img/electronegativity.webp
index 99c0822..4df69cd 100644
Binary files a/img/electronegativity.webp and b/img/electronegativity.webp differ
diff --git a/img/energy conservation.webp b/img/energy conservation.webp
index 9b52335..e825adb 100644
Binary files a/img/energy conservation.webp and b/img/energy conservation.webp differ
diff --git a/img/exothermic process.webp b/img/exothermic process.webp
index a75216f..3d79008 100644
Binary files a/img/exothermic process.webp and b/img/exothermic process.webp differ
diff --git a/img/heat engine.webp b/img/heat engine.webp
index 7394708..df299f8 100644
Binary files a/img/heat engine.webp and b/img/heat engine.webp differ
diff --git a/img/homeostasis.webp b/img/homeostasis.webp
index 9d107d3..862ae53 100644
Binary files a/img/homeostasis.webp and b/img/homeostasis.webp differ
diff --git a/img/inductive charging.webp b/img/inductive charging.webp
index e3765ea..55643bd 100644
Binary files a/img/inductive charging.webp and b/img/inductive charging.webp differ
diff --git a/img/mass-energy equivalence.webp b/img/mass-energy equivalence.webp
index b00a85b..78906ed 100644
Binary files a/img/mass-energy equivalence.webp and b/img/mass-energy equivalence.webp differ
diff --git a/img/nail-bot upgrade.webp b/img/nail-bot upgrade.webp
index fc3518a..e92c7fb 100644
Binary files a/img/nail-bot upgrade.webp and b/img/nail-bot upgrade.webp differ
diff --git a/img/nail-bot.webp b/img/nail-bot.webp
index 1b0da80..58bdd6e 100644
Binary files a/img/nail-bot.webp and b/img/nail-bot.webp differ
diff --git a/img/orbital-bot upgrade.webp b/img/orbital-bot upgrade.webp
index 010f6e1..46ff538 100644
Binary files a/img/orbital-bot upgrade.webp and b/img/orbital-bot upgrade.webp differ
diff --git a/img/orbital-bot.webp b/img/orbital-bot.webp
index 003029a..1ab8298 100644
Binary files a/img/orbital-bot.webp and b/img/orbital-bot.webp differ
diff --git a/img/overcharge.webp b/img/overcharge.webp
index 69f5712..7c20edb 100644
Binary files a/img/overcharge.webp and b/img/overcharge.webp differ
diff --git a/img/parasitism.webp b/img/parasitism.webp
index dbab55b..3db9826 100644
Binary files a/img/parasitism.webp and b/img/parasitism.webp differ
diff --git a/img/piezoelectricity.webp b/img/piezoelectricity.webp
index 25ec3fc..455fd7c 100644
Binary files a/img/piezoelectricity.webp and b/img/piezoelectricity.webp differ
diff --git a/img/repeater.webp b/img/repeater.webp
new file mode 100644
index 0000000..1be7058
Binary files /dev/null and b/img/repeater.webp differ
diff --git a/index.html b/index.html
index afe321a..ce4e267 100644
--- a/index.html
+++ b/index.html
@@ -140,8 +140,7 @@
controls
+
+
+
+
+
-
+
+
-
-
-
-
-
-
+
`
const hideStyle = `style="height:auto; border: none; background-color: transparent;"`
@@ -905,6 +905,7 @@ const input = {
document.getElementById("key-previous-gun").style.background = backgroundColor
document.getElementById("key-testing").style.background = backgroundColor
if (input.focus) input.focus.style.background = 'rgb(0, 200, 255)';
+ document.getElementById("key-num").style.background = backgroundColor //always not highlighted
},
setKeys(event) {
//check for duplicate keys
@@ -923,7 +924,8 @@ const input = {
// event.code === "Escape" ||
event.code === input.key.nextGun ||
event.code === input.key.previousGun ||
- event.code === input.key.testing
+ event.code === input.key.testing ||
+ event.code === "Digit1" || event.code === "Digit2" || event.code === "Digit3" || event.code === "Digit4" || event.code === "Digit5" || event.code === "Digit6" || event.code === "Digit7" || event.code === "Digit8" || event.code === "Digit9" || event.code === "Digit0" || event.code === "Minus" || event.code === "Equal"
)) {
switch (input.focus.id) {
case "key-fire":
@@ -1029,11 +1031,9 @@ window.addEventListener("keydown", function(event) {
input.down = true
break;
case input.key.fire:
- // event.preventDefault();
input.fire = true
break
case input.key.field:
- // event.preventDefault();
input.field = true
break
case input.key.nextGun:
@@ -1042,7 +1042,6 @@ window.addEventListener("keydown", function(event) {
case input.key.previousGun:
simulation.previousGun();
break
- // case "Escape":
case input.key.pause:
if (!simulation.isChoosing && input.isPauseKeyReady && m.alive) {
input.isPauseKeyReady = false
@@ -1160,6 +1159,47 @@ window.addEventListener("keydown", function(event) {
}
break
}
+ if (b.inventory.length > 1 && !simulation.testing) {
+ switch (event.code) {
+ case "Digit1":
+ simulation.switchToGunInInventory(0);
+ break
+ case "Digit2":
+ simulation.switchToGunInInventory(1);
+ break
+ case "Digit3":
+ simulation.switchToGunInInventory(2);
+ break
+ case "Digit4":
+ simulation.switchToGunInInventory(3);
+ break
+ case "Digit5":
+ simulation.switchToGunInInventory(4);
+ break
+ case "Digit6":
+ simulation.switchToGunInInventory(5);
+ break
+ case "Digit7":
+ simulation.switchToGunInInventory(6);
+ break
+ case "Digit8":
+ simulation.switchToGunInInventory(7);
+ break
+ case "Digit9":
+ simulation.switchToGunInInventory(8);
+ break
+ case "Digit0":
+ simulation.switchToGunInInventory(9);
+ break
+ case "Minus":
+ simulation.switchToGunInInventory(10);
+ break
+ case "Equal":
+ simulation.switchToGunInInventory(11);
+ break
+ }
+ }
+
if (simulation.testing) {
if (event.key === "X") m.death(); //only uppercase
switch (event.key.toLowerCase()) {
diff --git a/js/level.js b/js/level.js
index 964b833..1420c5e 100644
--- a/js/level.js
+++ b/js/level.js
@@ -28,24 +28,24 @@ const level = {
// m.setField("perfect diamagnetism") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch
// simulation.molecularMode = 2
// m.damage(0.1);
- // b.giveGuns("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("shotgun") //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("wave") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
// b.guns[0].ammo = 10000
- // tech.giveTech("blast ball")
- // tech.giveTech("elephants toothpaste")
- // tech.giveTech("sentry gun")
+ // tech.giveTech("needle gun")
+ // tech.giveTech("repeater")
+ // tech.giveTech("ice-shot")
// for (let i = 0; i < 1; ++i) tech.giveTech("super ball")
// tech.isFoamBall = true
- // for (let i = 0; i < 1; ++i) tech.giveTech("super ball")
+ // for (let i = 0; i < 3; ++i) tech.giveTech("repeater")
// 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 < 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, "coupling");
// level.testing();
- // spawn.shooter(1900, -500, 200)
+ // spawn.blinkBoss(1900, -500)
// spawn.sneakBoss(1900, -500)
- // spawn.starter(1900, -500, 25)
+ // spawn.starter(1900, -500, 200)
// spawn.sneaker(1900, -500, 25)
// spawn.hopper(2538, -950)
// spawn.zombie(1000 + 1000 * Math.random(), -500 + 300 * Math.random(), 30, 5, "white") // zombie(x, y, radius, sides, color)
diff --git a/js/player.js b/js/player.js
index f43270c..ca04f10 100644
--- a/js/player.js
+++ b/js/player.js
@@ -697,7 +697,7 @@ const m = {
}
m.lastHarmCycle = m.cycle
if (tech.isDroneOnDamage && bullet.length < 150) { //chance to build a drone on damage from tech
- const len = Math.min((dmg - 0.06 * Math.random()) * 40, 40) / tech.droneEnergyReduction
+ const len = Math.min((dmg - 0.06 * Math.random()) * 40, 40) / tech.droneEnergyReduction * (tech.isEnergyHealth ? 0.5 : 1)
for (let i = 0; i < len; i++) {
if (Math.random() < 0.5) b.drone({
x: m.pos.x + 30 * Math.cos(m.angle) + 100 * (Math.random() - 0.5),
diff --git a/js/powerup.js b/js/powerup.js
index 32f6d97..88ba7f9 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -769,6 +769,9 @@ const powerUps = {
} else if (parseInt(JSON.parse(elements[index + 1].getAttribute("data")).s.slice(0, -2)) < 500) { //try a different images and see if it is smaller
tech.tech[choose].url = JSON.parse(elements[index + 1].getAttribute("data")).iurl
document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
+ } else if (parseInt(JSON.parse(elements[index + 2].getAttribute("data")).s.slice(0, -2)) < 500) { //try a different images and see if it is smaller
+ tech.tech[choose].url = JSON.parse(elements[index + 2].getAttribute("data")).iurl
+ document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
}
});
} else {
diff --git a/js/simulation.js b/js/simulation.js
index 62e1923..0a41b58 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -297,6 +297,34 @@ const simulation = {
ctx.strokeStyle = "#000"; //'rgba(0,0,0,0.4)'
ctx.stroke(); // Draw it
},
+ drawCursorBasic() {
+ const size = 10;
+ ctx.beginPath();
+ ctx.moveTo(simulation.mouse.x - size, simulation.mouse.y);
+ ctx.lineTo(simulation.mouse.x + size, simulation.mouse.y);
+ ctx.moveTo(simulation.mouse.x, simulation.mouse.y - size);
+ ctx.lineTo(simulation.mouse.x, simulation.mouse.y + size);
+ ctx.lineWidth = 2;
+ ctx.strokeStyle = "#000"; //'rgba(0,0,0,0.4)'
+ ctx.stroke(); // Draw it
+ },
+ drawCursorCoolDown() {
+ const size = 10;
+ ctx.lineWidth = 2;
+ ctx.strokeStyle = "#000"; //'rgba(0,0,0,0.4)'
+ ctx.beginPath();
+ if (m.fireCDcycle > m.cycle) {
+ ctx.strokeStyle = "#777"; //'rgba(0,0,0,0.4)'
+ ctx.arc(simulation.mouse.x, simulation.mouse.y, size + 1, 0, 2 * Math.PI);
+ } else {
+ ctx.strokeStyle = "#000"; //'rgba(0,0,0,0.4)'
+ }
+ ctx.moveTo(simulation.mouse.x - size, simulation.mouse.y);
+ ctx.lineTo(simulation.mouse.x + size, simulation.mouse.y);
+ ctx.moveTo(simulation.mouse.x, simulation.mouse.y - size);
+ ctx.lineTo(simulation.mouse.x, simulation.mouse.y + size);
+ ctx.stroke(); // Draw it
+ },
drawList: [], //so you can draw a first frame of explosions.. I know this is bad
drawTime: 8, //how long circles are drawn. use to push into drawlist.time
mobDmgColor: "rgba(255,0,0,0.7)", //color when a mob damages the player // set by mass-energy tech
@@ -437,15 +465,14 @@ const simulation = {
simulation.switchGun();
}
},
- switchGun() {
- if (tech.isLongitudinal && b.guns[b.activeGun].name === "wave") {
- for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
- if (b.guns[i].name === "wave") {
- b.guns[i].waves = []; //empty array of wave bullets
- break;
- }
- }
+ switchToGunInInventory(num) {
+ if (b.inventory[num] !== undefined && b.inventoryGun !== num) {
+ b.inventoryGun = num
+ simulation.switchGun();
}
+ },
+ switchGun() {
+ if (tech.isLongitudinal && b.activeGun === 3) b.guns[3].waves = []; //empty array of wave bullets
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];
@@ -453,6 +480,12 @@ const simulation = {
}
simulation.updateGunHUD();
simulation.boldActiveGunHUD();
+ //set crosshairs
+ if (b.activeGun === 1) {
+ simulation.drawCursor = simulation.drawCursorCoolDown
+ } else {
+ simulation.drawCursor = simulation.drawCursorBasic
+ }
},
zoom: null,
zoomScale: 1000,
@@ -741,6 +774,7 @@ const simulation = {
input.endKeySensing();
b.removeAllGuns();
+ simulation.switchGun();
tech.setupAllTech(); //sets tech to default values
tech.cancelCount = 0;
@@ -881,7 +915,7 @@ const simulation = {
let count = 0;
for (i = 0, len = bullet.length; i < len; i++) { //count mines left on map
- if (bullet[i].bulletType === "mine" || bullet[i].bulletType === "laser mine") count++
+ if ((bullet[i].bulletType === "mine" || bullet[i].bulletType === "laser mine") && !bullet[i].isArmed) count++
}
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun is mine
if (b.guns[i].name === "mine") {
diff --git a/js/spawn.js b/js/spawn.js
index 345c000..a4b97a5 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -623,7 +623,7 @@ const spawn = {
{
name: "black hole",
eventHorizon: 0,
- eventHorizonRadius: 2100,
+ eventHorizonRadius: 1900,
eventHorizonCycle: 0,
do() {
this.eventHorizonCycle++
@@ -4146,7 +4146,7 @@ const spawn = {
Matter.Body.rotate(me, Math.PI * 0.1);
Matter.Body.setDensity(me, 0.002); //extra dense //normal is 0.001 //makes effective life much larger
me.isBoss = true;
- me.damageReduction = 0.03 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
+ me.damageReduction = 0.035 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.frictionStatic = 0;
me.friction = 0;
@@ -4160,7 +4160,7 @@ const spawn = {
me.grenadeDelay = 100
}
me.pulseRadius = 1.5 * Math.min(550, 200 + simulation.difficulty * 2)
- me.delay = 35 + 35 * simulation.CDScale;
+ me.delay = 55 + 35 * simulation.CDScale;
me.nextBlinkCycle = me.delay;
spawn.shield(me, x, y, 1);
me.onDamage = function() {
@@ -5058,7 +5058,7 @@ const spawn = {
if (this.phaseCycle > -1) {
Matter.Body.rotate(this, 0.02)
for (let i = 0, len = this.vertices.length; i < len; i++) { //fire a bullet from each vertex
- spawn.sniperBullet(this.vertices[i].x, this.vertices[i].y, 5, 4);
+ spawn.sniperBullet(this.vertices[i].x, this.vertices[i].y, 3, 4);
const velocity = Vector.mult(Vector.normalise(Vector.sub(this.position, this.vertices[i])), -15)
Matter.Body.setVelocity(mob[mob.length - 1], {
x: velocity.x,
@@ -5724,7 +5724,7 @@ const spawn = {
let me = mob[mob.length - 1];
Matter.Body.setDensity(me, 0.002); //extra dense //normal is 0.001 //makes effective life much larger
me.isBoss = true;
- me.damageReduction = 0.4 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
+ me.damageReduction = 0.2 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.accelMag = 0.0017 * Math.sqrt(simulation.accelScale);
me.frictionAir = 0.01;
@@ -5736,17 +5736,15 @@ const spawn = {
me.collisionFilter.mask = cat.map | cat.body | cat.bullet | cat.mob //can't touch player
me.showHealthBar = false;
me.memory = 30;
- me.vanishesLeft = 2 + simulation.difficultyMode
+ me.vanishesLeft = Math.ceil(1 + simulation.difficultyMode * 0.5)
+ me.onDeath = function() {
+ powerUps.spawnBossPowerUp(this.position.x, this.position.y)
+ };
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
this.vanishesLeft--
- // const scale = 0.95;
- // Matter.Body.scale(this, scale, scale);
- // this.radius *= scale;
-
- //flash screen to hide vanish
- for (let i = 0; i < 8; i++) {
+ for (let i = 0; i < 8; i++) { //flash screen to hide vanish
simulation.drawList.push({
x: this.position.x,
y: this.position.y,
@@ -5761,6 +5759,7 @@ const spawn = {
Matter.Body.setPosition(this, history.position)
Matter.Body.setVelocity(this, { x: 0, y: 0 });
+ this.damageReduction = 0 //immune to harm for the rest of this game cycle
this.seePlayer.recall = 0
this.cloak();
this.health = 1;
@@ -5784,6 +5783,14 @@ const spawn = {
}
}
me.do = function() {
+ if (this.damageReduction === 0) {
+ this.damageReduction = 0.04 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
+ let i = this.status.length //clear bad status effects
+ while (i--) {
+ if (this.status[i].type === "stun" || this.status[i].type === "dot") this.status.splice(i, 1);
+ }
+ this.isStunned = false;
+ }
this.gravity();
this.seePlayerByHistory(55);
this.checkStatus();
@@ -5835,6 +5842,7 @@ const spawn = {
//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.setVelocity(this, { x: 0, y: 0 });
+ this.damageReduction = 0 //immune to harm for the rest of this game cycle
}
};
me.cloak = function() {
@@ -5846,6 +5854,14 @@ const spawn = {
}
}
me.do = function() {
+ if (this.damageReduction === 0) {
+ this.damageReduction = 1 //stop being immune to harm immediately
+ let i = this.status.length //clear bad status effects
+ while (i--) {
+ if (this.status[i].type === "stun" || this.status[i].type === "dot") this.status.splice(i, 1);
+ }
+ this.isStunned = false;
+ }
this.gravity();
this.seePlayerByHistory(25);
this.checkStatus();
diff --git a/js/tech.js b/js/tech.js
index f77c8eb..b943323 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -2382,7 +2382,7 @@ const tech = {
// description: `after you collect ${powerUps.orb.heal()}
+${0.1 * tech.largerHeals} maximum
energy`,
// descriptionFunction: `convert current and future ${powerUps.orb.heal()} into
give
+${10 * tech.largerHeals} maximum
energy`,
descriptionFunction() {
- return `convert current and future
into
give
+${8 * tech.largerHeals} maximum
energy`
+ return `convert current and future
into
give
+${8 * tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)} maximum
energy`
},
maxCount: 1,
count: 0,
@@ -2585,7 +2585,7 @@ const tech = {
},
{
name: "energy conservation",
- description: "
5% of
damage done recovered as
energy",
+ description: "
4% of
damage done recovered as
energy",
maxCount: 9,
count: 0,
frequency: 1,
@@ -2595,7 +2595,7 @@ const tech = {
},
requires: "",
effect() {
- tech.energySiphon += 0.05;
+ tech.energySiphon += 0.04;
},
remove() {
tech.energySiphon = 0;
@@ -4151,6 +4151,25 @@ const tech = {
tech.needleTunnel = false
}
},
+ {
+ name: "ceramics",
+ description: `
needles and
harpoons pierce
shieldsdirectly
damaging shielded mobs`,
+ isGunTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return (!tech.isLargeHarpoon && tech.haveGunCheck("harpoon")) || tech.isNeedles
+ },
+ requires: "needle gun, harpoon, not Bessemer process",
+ effect() {
+ tech.isShieldPierce = true
+ },
+ remove() {
+ tech.isShieldPierce = false
+ }
+ },
{
name: "needle gun",
description: "
nail gun and
shotgun fire mob piercing
needles",
@@ -4505,6 +4524,25 @@ const tech = {
tech.isShotgunReversed = false;
}
},
+ {
+ name: "repeater",
+ description: "
shotgun immediately fires again for no
ammo-50% shotgun fire rate",
+ isGunTech: true,
+ maxCount: 9,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return (tech.haveGunCheck("shotgun"))
+ },
+ requires: "shotgun, not Newtons 3rd law",
+ effect() {
+ tech.shotgunExtraShots++;
+ },
+ remove() {
+ tech.shotgunExtraShots = 0
+ }
+ },
{
name: "nail-shot",
link: `
nail-shot`,
@@ -5569,7 +5607,7 @@ const tech = {
{
name: "blast ball",
descriptionFunction() {
- return `instead of nails
mines fire bouncy ${b.guns[10].nameString('s')}`
+ return `instead of nails
mines fire
bouncy balls`
},
isGunTech: true,
maxCount: 1,
@@ -6386,7 +6424,7 @@ const tech = {
},
{
name: "railgun",
- description: `
harpoons can't
retract, hold fire to charge
+50% harpoon density and
damage`,
+ description: `hold fire to charge
harpoon and release to launch
harpoons can't
retract`,
// description: `
+900% harpoon ammo, but it can't
retract+50% harpoon density and
damage`,
isGunTech: true,
maxCount: 1,
@@ -6480,25 +6518,6 @@ const tech = {
tech.isRailEnergy = false;
}
},
- {
- name: "ceramics",
- description: `
needles and
harpoons pierce
shieldsdirectly
damaging shielded mobs`,
- isGunTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- frequencyDefault: 2,
- allowed() {
- return (!tech.isLargeHarpoon && tech.haveGunCheck("harpoon")) || tech.isNeedles
- },
- requires: "needle gun, harpoon, not Bessemer process",
- effect() {
- tech.isShieldPierce = true
- },
- remove() {
- tech.isShieldPierce = false
- }
- },
{
name: "Bessemer process",
descriptionFunction() {
@@ -6535,7 +6554,7 @@ const tech = {
return (tech.isRailGun ? 5 : 1) * (2 + 2 * this.count)
},
allowed() {
- return tech.haveGunCheck("harpoon") && b.returnGunAmmo('harpoon') >= this.removeAmmo()
+ return tech.haveGunCheck("harpoon") && b.guns[9].ammo >= this.removeAmmo()
},
requires: "harpoon",
effect() {
@@ -10095,7 +10114,7 @@ const tech = {
m.drawLeg("#4a4a4a");
m.calcLeg(0, 0);
m.drawLeg("#333");
- ctx.rotate(m.angle - (m.fireCDcycle != Infinity ? m.flipLegs * 0.25 * Math.pow(Math.max(m.fireCDcycle - m.cycle, 0), 0.5) : 0));
+ ctx.rotate(m.angle - (m.fireCDcycle !== Infinity ? m.flipLegs * 0.25 * Math.pow(Math.max(m.fireCDcycle - m.cycle, 0), 0.5) : 0));
ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI);
@@ -10510,7 +10529,7 @@ const tech = {
},
{
name: "translucent",
- description: "remove your
guns and
spawn new ones
your
bullets and bots are transparent",
+ description: "spawn
3 gun power ups
your
bullets and bots are transparent",
maxCount: 1,
count: 0,
frequency: 0,
@@ -10521,18 +10540,18 @@ const tech = {
},
requires: "",
effect() {
- for (let i = 0; i < b.inventory.length; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "gun");
+ for (let i = 0; i < 3; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "gun");
- //removes guns and ammo
- b.inventory = [];
- b.activeGun = null;
- b.inventoryGun = 0;
- for (let i = 0, len = b.guns.length; i < len; ++i) {
- b.guns[i].have = false;
- if (b.guns[i].ammo !== Infinity) b.guns[i].ammo = 0;
- }
- simulation.makeGunHUD(); //update gun HUD
- b.bulletDraw = () => {};
+ // //removes guns and ammo
+ // b.inventory = [];
+ // b.activeGun = null;
+ // b.inventoryGun = 0;
+ // for (let i = 0, len = b.guns.length; i < len; ++i) {
+ // b.guns[i].have = false;
+ // if (b.guns[i].ammo !== Infinity) b.guns[i].ammo = 0;
+ // }
+ // simulation.makeGunHUD(); //update gun HUD
+ b.bulletDraw = () => {}; //make bullets invisible
},
remove() {}
},
diff --git a/style.css b/style.css
index 9653fee..6f56a5f 100644
--- a/style.css
+++ b/style.css
@@ -255,16 +255,16 @@ summary {
#experiment-grid {
display: flex;
justify-content: center;
- padding: 10px 1px;
+ padding: 0px;
margin: 0px;
border: 0px;
background-color: var(--build-bg-color);
display: none;
grid-template-columns: repeat(auto-fit, 384px);
grid-auto-flow: row;
- grid-auto-rows: minmax(auto, auto);
+ /* grid-auto-rows: minmax(auto, auto); */
position: relative;
- bottom: 0px;
+ /* bottom: 0px; */
z-index: 10;
font-size: 1.3em;
-ms-overflow-style: none; /* IE and Edge */
@@ -295,6 +295,30 @@ summary {
background-color: #efeff5;
}
+.experiment-start-box{
+ background-color: #fafcfd;
+ /* font-size: 1em; */
+ position: sticky;
+ top:0;
+ z-index: 10;
+ align-self: start;
+ width: 195px;
+ line-height: 170%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ border: 2px #333 solid;
+ border-top: 0px;
+ border-radius: 10px;
+ border-top-left-radius: 0px;
+ /* border-bottom-left-radius: 0px; */
+ border-top-right-radius: 0px;
+ padding:0.2em 0px;
+ height: 190px;
+ box-shadow: 8px 8px 7px rgba(0,0,50,0.15);
+}
+
.card-background {
height:340px;
background-size: contain;
@@ -325,6 +349,9 @@ summary {
line-height: 160%;
background-color: #fafcfd;
}
+.cancel-card:hover {
+ background-color: #efeff5;
+}
.research-card {
font-size: 1.1em;
font-weight: 100;
@@ -335,6 +362,9 @@ summary {
line-height: 160%;
background-color: #fafcfd;
}
+.research-card:hover {
+ background-color: #efeff5;
+}
/* keeps 5 columns at 1440px */
diff --git a/todo.txt b/todo.txt
index df9d758..d27446f 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,26 +1,34 @@
******************************************************** NEXT PATCH **************************************************
-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
+tech: repeater - shotgun gets another shot, and a longer fire delay
+ shotgun cross hairs show when fire is on cooldown
-dark patterns - stacks to 9
- 38->15% damage, 53->15% JUNK
-electronegativity - stacks to 9
- 0.12->0.1% damage per energy
+keys 1,2,3,4,5,6,7,8,9,0,-,= switch to a gun in your inventory
+Nerfed blinkBoss health and speed
+sneaker mobs are immune to harm for one cycles after vanishing
+experiment button new style
+new images for energy, bots
bug fixes
*********************************************************** TODO *****************************************************
-super-bot
+tech - only allow 1,2 turrets at time?
+ turrets drain energy?
+ turrets never run out of ammo
+ turrets automatically use one of your mine ammos when they run out?
+ good with multi gun builds
+ conflict with booby trap
-tech - shotgun triple shot, but a bit longer of a delay
+tech: Bose Einstein condensate - freezes enemies in pilot wave, and drains some energy?
+
+super-bot
tech - after standing wave runs out of energy from blocking, gain a buff
buff: defense, damage?
+ aoe damage like railgun
+ push mobs away
make super balls with Zectron deflectable with field
but is there a simple way to do this?
@@ -1157,12 +1165,8 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
***major themes missing***
***maybe redo***
dynamical systems
- nail-bot
- homeostasis
heuristics
- thermal runaway - infrared maybe?
- redo the energy tech images with by Laurie Greasley
- now that you can use --ar 3:2 --stylize 1000 and photo repair
+ negative feedback - too dark
***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
standing wave - concentric transparent blue geometric circles science