diff --git a/.DS_Store b/.DS_Store
index 857abb7..caebfc0 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index 796fe50..6117f35 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -445,17 +445,17 @@ const b = {
}
}
},
- pulse(charge, angle = m.angle) {
+ pulse(charge, angle = m.angle, where = m.pos) {
let best;
let explosionRadius = 6 * charge
let range = 5000
const path = [{
- x: m.pos.x + 20 * Math.cos(angle),
- y: m.pos.y + 20 * Math.sin(angle)
+ x: where.x + 20 * Math.cos(angle),
+ y: where.y + 20 * Math.sin(angle)
},
{
- x: m.pos.x + range * Math.cos(angle),
- y: m.pos.y + range * Math.sin(angle)
+ x: where.x + range * Math.cos(angle),
+ y: where.y + range * Math.sin(angle)
}
];
const vertexCollision = function(v1, v1End, domain) {
@@ -4477,7 +4477,6 @@ const b = {
this.do = () => {};
if (tech.isPulseLaser) {
this.fire = () => {
-
const drain = 0.01 * tech.isLaserDiode / b.fireCD
if (m.energy > drain) {
m.energy -= m.fieldRegen
@@ -4487,26 +4486,58 @@ const b = {
}
}
}
- this.do = () => {
- if (this.charge > 0) {
- //draw charge level
- ctx.fillStyle = `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})`;
- ctx.beginPath();
- ctx.arc(m.pos.x, m.pos.y, 4.2 * Math.sqrt(this.charge), 0, 2 * Math.PI);
- ctx.fill();
- if (!input.fire) {
- m.fireCDcycle = m.cycle + 10; // cool down
- if (tech.beamSplitter) {
- const divergence = m.crouch ? 0.2 : 0.5
- const angle = m.angle - tech.beamSplitter * divergence / 2
- for (let i = 0; i < 1 + tech.beamSplitter; i++) b.pulse(this.charge, angle + i * divergence)
- } else {
- b.pulse(1.75 * this.charge, m.angle)
+ if (tech.historyLaser) {
+ this.do = () => {
+ const len = 1 + 2 * tech.historyLaser
+ const spacing = Math.ceil(40 - 9 * tech.historyLaser)
+ if (this.charge > 0) {
+ //draw charge level
+ ctx.fillStyle = `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})`;
+ ctx.beginPath();
+ const mag = 4.5 * Math.sqrt(this.charge)
+ for (let i = 0; i < len; i++) {
+ const history = m.history[(m.cycle - i * spacing) % 600]
+ const off = history.yOff - 24.2859
+ ctx.moveTo(history.position.x, history.position.y - off);
+ ctx.ellipse(history.position.x, history.position.y - off, mag, mag * 0.5, history.angle, 0, 2 * Math.PI)
+ }
+ ctx.fill();
+ //fire
+ if (!input.fire) {
+ m.fireCDcycle = m.cycle + 10; // cool down
+ for (let i = 1; i < len; i++) {
+ const history = m.history[(m.cycle - i * spacing) % 600]
+ const off = history.yOff - 24.2859
+ b.pulse(1.4 * this.charge, history.angle, { x: history.position.x, y: history.position.y - off })
+ }
+ this.charge = 0;
}
- this.charge = 0;
}
- }
- };
+ };
+ } else {
+ this.do = () => {
+ if (this.charge > 0) {
+ //draw charge level
+ ctx.fillStyle = `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})`;
+ ctx.beginPath();
+ ctx.arc(m.pos.x, m.pos.y, 4.2 * Math.sqrt(this.charge), 0, 2 * Math.PI);
+ ctx.fill();
+ //fire
+ if (!input.fire) {
+ m.fireCDcycle = m.cycle + 10; // cool down
+ if (tech.beamSplitter) {
+ const divergence = m.crouch ? 0.2 : 0.5
+ const angle = m.angle - tech.beamSplitter * divergence / 2
+ for (let i = 0; i < 1 + tech.beamSplitter; i++) b.pulse(this.charge, angle + i * divergence)
+ } else {
+ b.pulse(1.75 * this.charge, m.angle)
+ }
+ this.charge = 0;
+ }
+ }
+ };
+ }
+
} else if (tech.beamSplitter) {
this.fire = this.fireSplit
} else if (tech.historyLaser) {
@@ -4532,13 +4563,9 @@ const b = {
b.laser();
}
},
- // laser(where = {
- // x: m.pos.x + 20 * Math.cos(m.angle),
- // y: m.pos.y + 20 * Math.sin(m.angle)
- // }, whereEnd = {
- // x: where.x + 3000 * Math.cos(m.angle),
- // y: where.y + 3000 * Math.sin(m.angle)
- // }, dmg = tech.laserDamage, reflections = tech.laserReflections, isThickBeam = false, push = 1) {
+ firePulse() {
+
+ },
fireSplit() {
if (m.energy < tech.laserFieldDrain) {
m.fireCDcycle = m.cycle + 100; // cool down if out of energy
diff --git a/js/level.js b/js/level.js
index 8c89ef4..b9ad736 100644
--- a/js/level.js
+++ b/js/level.js
@@ -12,17 +12,19 @@ const level = {
start() {
if (level.levelsCleared === 0) { //this code only runs on the first level
// simulation.enableConstructMode() //used to build maps in testing mode
- // level.difficultyIncrease(90)
+ // level.difficultyIncrease(30)
// simulation.zoomScale = 1000;
// simulation.setZoom();
// m.setField("metamaterial cloaking")
// b.giveGuns("wave beam")
+ // b.giveGuns("laser")
// tech.isExplodeRadio = true
- // tech.giveTech("phase velocity")
+ // tech.giveTech("pulse")
+ // for (let i = 0; i < 1; i++) tech.giveTech("crystallizer")
// for (let i = 0; i < 3; i++) tech.giveTech("packet length")
// for (let i = 0; i < 3; i++) tech.giveTech("bound state")
// for (let i = 0; i < 3; i++) tech.giveTech("propagation")
- // for (let i = 0; i < 3; i++) tech.giveTech("amplitude")
+ // for (let i = 0; i < 9; i++) tech.giveTech("slow light")
level.intro(); //starting level
// level.testing(); //not in rotation
diff --git a/js/mob.js b/js/mob.js
index ec836b2..d596e86 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -1053,6 +1053,11 @@ const mobs = {
this.alive = false; //triggers mob removal in mob[i].replace(i)
if (this.isDropPowerUp) {
+
+ if (tech.iceIXOnDeath && this.isSlowed && Math.random() > 0.5) {
+ for (let i = 0, len = 3 * Math.sqrt(this.mass) * tech.iceIXOnDeath; i < len; i++) b.iceIX(3, Math.random() * 2 * Math.PI, this.position)
+ }
+
if (tech.deathSpawnsFromBoss || (tech.deathSpawns && this.isDropPowerUp)) {
const spawns = tech.deathSpawns + tech.deathSpawnsFromBoss
const len = Math.min(12, spawns * Math.ceil(Math.random() * simulation.difficulty * spawns))
diff --git a/js/powerup.js b/js/powerup.js
index e313e9b..c82dd6b 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -115,7 +115,9 @@ const powerUps = {
if (tech.isDeathAvoid && document.getElementById("tech-anthropic")) {
document.getElementById("tech-anthropic").innerHTML = `-${powerUps.research.count}`
}
- if (tech.renormalization && Math.random() < 0.37 && amount < 0) powerUps.spawn(m.pos.x, m.pos.y, "research");
+ if (tech.renormalization && Math.random() < 0.37 && amount < 0) {
+ for (let i = 0, len = -amount; i < len; i++) powerUps.spawn(m.pos.x, m.pos.y, "research");
+ }
if (tech.isRerollHaste) {
if (powerUps.research.count === 0) {
tech.researchHaste = 0.66;
@@ -532,7 +534,8 @@ const powerUps = {
powerUps.spawn(x, y, "gun");
return;
}
- if (Math.random() < 0.0027 * (22 - tech.totalCount)) { //a new tech has a low chance for each not acquired tech up to 25
+ // if (Math.random() < 0.0027 * (22 - tech.totalCount)) { //a new tech has a low chance for each not acquired tech up to 25
+ if (Math.random() < 0.005 * (10 - level.levelsCleared)) { //a new tech has a low chance that decreases in later levels
powerUps.spawn(x, y, "tech");
return;
}
diff --git a/js/spawn.js b/js/spawn.js
index fcdf5a6..bc15deb 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -606,7 +606,7 @@ const spawn = {
me.seeAtDistance2 = 200000 //1400000;
me.cellMassMax = 70
me.stroke = "transparent"
- me.collisionFilter.mask = cat.player | cat.bullet | cat.body //| cat.map //"rgba(255,60,0,0.3)"
+ me.collisionFilter.mask = cat.player | cat.bullet //| cat.body //| cat.map //"rgba(255,60,0,0.3)"
// Matter.Body.setDensity(me, 0.0014) // normal density is 0.001
Matter.Body.setAngularVelocity(me, 0.12 * (Math.random() - 0.5))
// spawn.shield(me, x, y, 1);
@@ -687,7 +687,7 @@ const spawn = {
me.seeAtDistance2 = 1000000;
me.accelMag = 0.0005 * simulation.accelScale;
Matter.Body.setDensity(me, 0.00035); //normal is 0.001
- me.collisionFilter.mask = cat.bullet | cat.player | cat.body
+ me.collisionFilter.mask = cat.bullet | cat.player //| cat.body
me.memory = Infinity;
me.seePlayerFreq = 30
me.lockedOn = null;
@@ -3168,7 +3168,7 @@ const spawn = {
me.memory = Infinity;
me.frictionAir = 0.01;
me.accelMag = 0.00004 * simulation.accelScale;
- me.collisionFilter.mask = cat.player | cat.bullet | cat.body
+ me.collisionFilter.mask = cat.player | cat.bullet //| cat.body
spawn.shield(me, x, y, 1);
const rangeInnerVsOuter = Math.random()
diff --git a/js/tech.js b/js/tech.js
index f224164..befd668 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -877,7 +877,7 @@
count: 0,
frequency: 2,
allowed() {
- return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner && !tech.isMobBlockFling
+ return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
requires: "an explosive damage source, no other mob death tech",
effect: () => {
@@ -887,6 +887,23 @@
tech.isExplodeMob = false;
}
},
+ {
+ name: "crystallizer",
+ description: "after frozen mobs die
they have a chance shatter into ice IX crystals",
+ maxCount: 9,
+ count: 0,
+ frequency: 2,
+ allowed() {
+ return (tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
+ },
+ requires: "a localized freeze effect, no other mob death tech",
+ effect() {
+ tech.iceIXOnDeath++
+ },
+ remove() {
+ tech.iceIXOnDeath = 0
+ }
+ },
{
name: "impact shear",
description: "mobs release a nail when they die
nails target nearby mobs",
@@ -894,7 +911,7 @@
count: 0,
frequency: 2,
allowed() {
- return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling
+ return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
requires: "no other mob death tech",
effect: () => {
@@ -911,7 +928,7 @@
count: 0,
frequency: 2,
allowed() {
- return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling
+ return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
requires: "no other mob death tech",
effect() {
@@ -988,7 +1005,7 @@
frequency: 1,
isBotTech: true,
allowed() {
- return !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isExplodeMob && !tech.isMobBlockFling
+ return !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isExplodeMob && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
requires: "no other mob death tech",
effect() {
@@ -1504,7 +1521,7 @@
frequency: 4,
frequencyDefault: 4,
allowed() {
- return tech.throwChargeRate > 1 && !tech.nailsDeathMob && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner
+ return tech.throwChargeRate > 1 && !tech.nailsDeathMob && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.iceIXOnDeath
},
requires: "mass driver, no other mob death tech",
effect() {
@@ -4460,7 +4477,7 @@
count: 0,
frequency: 2,
allowed() {
- return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser && !tech.isWideLaser
+ return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isWideLaser
},
requires: "laser, not specular reflection, diffraction grating, diffuse beam",
effect() {
@@ -4488,7 +4505,7 @@
count: 0,
frequency: 2,
allowed() {
- return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser && !tech.historyLaser
+ return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser
},
requires: "laser, not specular reflection, not diffuse",
effect() {
@@ -6622,5 +6639,6 @@
waveBeamSpeed: null,
wavePacketAmplitude: null,
waveLengthRange: null,
- isCollisionRealitySwitch: null
+ isCollisionRealitySwitch: null,
+ iceIXOnDeath: null
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 5595e0b..ab4fbd9 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,13 +1,11 @@
******************************************************** NEXT PATCH ********************************************************
-new COMMUNITY LEVEL vats by Dablux on discord!
-(also the community map order wasn't randomizing right and was giving an extra level before the final boss)
+
******************************************************** BUGS ********************************************************
-
(once) CPT gun only rewound 0.25 seconds
- after a randomize run (non-unityary)
+ after a randomize run (non-unitary)
had enough energy
increase the width on the grid by a few pixels so that very small screens or people with odd fonts don't goto a new line
@@ -39,25 +37,11 @@ is there a way to check if the player is stuck inside the map or block
(repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping
******************************************************** TODO ********************************************************
-make all of a packet have the same angle
- also position? but how
-spawn the entire packet in an instant
-
-wave tech: delay similar to quantum foam
- firing makes the entire packet, but with a delay?
-wave tech: dispersion - add noise and damage to waves
-wave tech: chirp - amplitude and damage increases towards the end of the wavePacket
-wave tech: wave bullets are removed after doing damage, but they do something
- more damage, explode, freeze,
-
-taking damage randomizes your run
power ups disappear after 3-5 seconds
only apply to drops from killing mobs
+duplication 20%
-tech: mobs that die while frozen produce ice-IX bullets
-
tech: picking up heal power ups when at full health does harm equal to the heal values
benefit on pick up:
get ammo