diff --git a/index.html b/index.html
index 19afb94..9424d56 100644
--- a/index.html
+++ b/index.html
@@ -119,7 +119,7 @@
-
+
diff --git a/js/index.js b/js/index.js
index 7a1e2eb..d74f71a 100644
--- a/js/index.js
+++ b/js/index.js
@@ -178,6 +178,16 @@ const build = {
}
},
pauseGrid() {
+ let botText = ""
+ if (tech.nailBotCount) botText += `
nail-bots: ${tech.nailBotCount}`
+ if (tech.orbitBotCount) botText += `
orbital-bots: ${tech.orbitBotCount}`
+ if (tech.boomBotCount) botText += `
boom-bots: ${tech.boomBotCount}`
+ if (tech.laserBotCount) botText += `
laser-bots: ${tech.laserBotCount}`
+ if (tech.foamBotCount) botText += `
foam-bots: ${tech.foamBotCount}`
+ if (tech.dynamoBotCount) botText += `
dynamo-bots: ${tech.dynamoBotCount}`
+ if (tech.plasmaBotCount) botText += `
plasma-bots: ${tech.plasmaBotCount}`
+ if (tech.missileBotCount) botText += `
missile-bots: ${tech.missileBotCount}`
+
const harm = (1 - m.harmReduction()) * 100
let text = ""
if (!simulation.isChoosing) text += `
@@ -188,6 +198,7 @@ const build = {
harm reduction: ${harm.toFixed(harm > 90 ? 2 : 0)}%
fire delay decrease: ${((1-b.fireCD)*100).toFixed(b.fireCD < 0.1 ? 2 : 0)}%
duplication chance: ${(Math.min(1,tech.duplicationChance())*100).toFixed(0)}%
+ ${botText}
tech: ${tech.totalCount} research: ${powerUps.research.count}
health: (${(m.health*100).toFixed(0)} / ${(m.maxHealth*100).toFixed(0)}) energy: (${(m.energy*100).toFixed(0)} / ${(m.maxEnergy*100).toFixed(0)})
diff --git a/js/level.js b/js/level.js
index cc04029..6eb843d 100644
--- a/js/level.js
+++ b/js/level.js
@@ -12,7 +12,7 @@ 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(11)
+ // level.difficultyIncrease(50)
// simulation.zoomScale = 1000;
// simulation.setZoom();
// m.setField("nano-scale manufacturing")
@@ -57,6 +57,7 @@ const level = {
// level.stronghold() //community level
// level.perplex() //community level
// level.coliseum() //community level
+ // level.crossfire() //community level
// powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "tech");
// tech.giveTech("undefined")
@@ -1110,7 +1111,7 @@ const level = {
// spawn.grower(1900, -500)
// spawn.pulsarBoss(1900, -500)
// spawn.shooterBoss(1900, -500)
- spawn.shooter(2900, -500)
+ spawn.spawns(2900, -500)
// spawn.launcherBoss(1200, -500)
// spawn.laserTargetingBoss(1600, -400)
// spawn.striker(4600, -500)
@@ -4613,4 +4614,174 @@ const level = {
if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) spawn.randomLevelBoss(6600, 600, ["historyBoss", "powerUpBoss", "pulsarBoss", "orbitalBoss"]);
},
+ crossfire() {
+ //*1.5
+ //Level Setup
+ const slimePitOne = level.hazard(0, 850, 3800, 120, 25);
+ const slimePitTwo = level.hazard(4600, 430, 2000, 120, 35);
+ const slimePitThree = level.hazard(6500, 200, 1000, 170, 50);
+
+ level.custom = () => {
+ slimePitOne.query();
+ slimePitTwo.query();
+ slimePitThree.query();
+ slimePitOne.draw();
+ slimePitTwo.draw();
+ slimePitThree.draw();
+ level.playerExitCheck();
+ level.exit.draw();
+ level.enter.draw();
+ };
+ level.customTopLayer = () => {};
+
+ level.setPosToSpawn(-500, 550); //normal spawn
+ spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
+
+ level.exit.x = 10300;
+ level.exit.y = -830;
+ spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20);
+
+ level.defaultZoom = 3000
+ simulation.zoomTransition(level.defaultZoom)
+ document.body.style.backgroundColor = "#dcdcde";
+
+ //Map Elements
+ spawn.mapRect(-800, -600, 800, 200);
+ spawn.mapRect(-200, -600, 200, 800);
+ spawn.mapRect(-800, -600, 200, 800);
+ spawn.mapRect(-1000, 0, 1000, 200);
+ spawn.mapRect(-1000, 0, 200, 800);
+ spawn.mapRect(-1000, 600, 1400, 200);
+ spawn.mapRect(0, 600, 200, 400);
+ spawn.mapRect(0, 950, 4000, 100);
+ spawn.mapRect(800, 800, 600, 200);
+ spawn.mapRect(1700, 700, 500, 300);
+ spawn.mapRect(2500, 600, 400, 400);
+ spawn.mapRect(3200, 600, 1200, 200);
+ spawn.mapRect(3800, 600, 200, 800); //
+ spawn.mapRect(3800, 1200, 800, 200);
+ spawn.mapRect(4400, 400, 300, 1000);
+ spawn.mapRect(4400, 500, 2000, 100);
+ spawn.mapRect(6500, 300, 1000, 100);
+ spawn.mapRect(5000, 200, 700, 400);
+ spawn.mapRect(6000, 0, 650, 600);
+ spawn.mapRect(6900, -300, 700, 100);
+ spawn.mapRect(7400, -600, 200, 1100);
+ spawn.mapRect(7400, 300, 2600, 200);
+ spawn.mapRect(9800, -800, 200, 1300);
+ spawn.mapRect(9800, -800, 1000, 200);
+ spawn.mapRect(10600, -1400, 200, 800);
+ spawn.mapRect(9800, -1400, 200, 400);
+ spawn.mapRect(7400, -1400, 3400, 200);
+ spawn.mapRect(7400, -1600, 200, 800);
+ spawn.mapRect(5400, -1600, 2200, 200);
+ spawn.mapRect(6000, -1600, 200, 800);
+ spawn.mapRect(5400, -1600, 200, 800);
+ spawn.mapRect(4800, -1000, 1400, 200);
+ spawn.mapRect(4800, -1000, 200, 600);
+ spawn.mapRect(3800, -600, 1200, 200);
+ spawn.mapRect(3200, -800, 800, 200);
+ spawn.mapRect(3200, -800, 200, 800);
+ spawn.mapRect(3800, -800, 200, 800);
+ spawn.mapRect(-200, -200, 4200, 200);
+
+ //Boss Room Platforms
+ spawn.mapRect(7700, 100, 300, 40);
+ spawn.mapRect(8600, 0, 300, 40);
+ spawn.mapRect(9200, 100, 300, 40);
+ spawn.mapRect(9400, -200, 300, 40);
+ spawn.mapRect(8000, -200, 300, 40);
+ spawn.mapRect(8500, -400, 300, 40);
+ spawn.mapRect(9000, -600, 300, 40);
+ spawn.mapRect(9400, -800, 300, 40);
+ spawn.mapRect(8600, -1000, 300, 40);
+ spawn.mapRect(7900, -800, 300, 40);
+
+ //Mob Spawning
+ spawn.randomMob(200, 400, 0.7);
+ spawn.randomMob(1200, 400, 0.7);
+ spawn.randomMob(2000, 400, 0.7);
+ spawn.randomMob(3000, 400, 0.7);
+ spawn.randomMob(5000, 0, 0.7);
+ spawn.randomMob(5600, 0, 0.7);
+ spawn.randomMob(6200, -200, 0.7);
+ spawn.randomMob(6600, -200, 0.7);
+ spawn.randomMob(7200, -800, 0.7);
+ spawn.randomSmallMob(800, 400, 0.9);
+ spawn.randomSmallMob(1800, 400, 0.9);
+ spawn.randomSmallMob(2600, 400, 0.9);
+ spawn.randomSmallMob(5200, 0, 0.9);
+ spawn.randomSmallMob(5400, 0, 0.9);
+ spawn.randomSmallMob(6400, -200, 0.9);
+ spawn.randomGroup(3800, 400, 0.5);
+ spawn.randomGroup(4200, 400, 0.5);
+ spawn.randomGroup(4400, 200, 0.5);
+ spawn.randomGroup(7000, -800, 0.5);
+ spawn.randomGroup(7700, 300, 0.5);
+ spawn.randomGroup(9800, 300, 0.5);
+ spawn.randomGroup(7700, -1100, 0.5);
+ spawn.randomGroup(9800, -1100, 0.5);
+
+ if (simulation.difficulty > 10) {
+ spawn.randomLevelBoss(8600, -600, ["powerUpBoss", "bomberBoss", "snakeBoss", "spiderBoss", "historyBoss"]);
+ }
+ if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) {
+ spawn.randomLevelBoss(7900, -400, ["powerUpBoss", "spiderBoss", "historyBoss"]);
+ }
+
+ //Boss Spawning
+ spawn.pulsarBoss(-400, -200);
+ if (simulation.difficulty > 25) {
+ spawn.pulsarBoss(3600, -400);
+ if (simulation.difficulty > 40) {
+ spawn.pulsarBoss(4200, 1000);
+ if (simulation.difficulty > 65) {
+ spawn.pulsarBoss(5800, -1200);
+ spawn.pulsarBoss(-400, -200);
+ if (simulation.difficulty > 85) {
+ spawn.pulsarBoss(3600, -400);
+ spawn.pulsarBoss(4200, 1000);
+ if (simulation.difficulty > 115) {
+ spawn.pulsarBoss(5800, -1200);
+ spawn.pulsarBoss(-400, -200);
+ spawn.pulsarBoss(3600, -400);
+ }
+ }
+ }
+ }
+ }
+
+ //Powerup Spawning
+ powerUps.spawnStartingPowerUps(4000, 400);
+ powerUps.spawnStartingPowerUps(4400, 400);
+ powerUps.chooseRandomPowerUp(4000, 400);
+ powerUps.chooseRandomPowerUp(4000, 400);
+ powerUps.chooseRandomPowerUp(4400, 400);
+ powerUps.chooseRandomPowerUp(4400, 400);
+ powerUps.addRerollToLevel(); //needs to run after mobs are spawned
+
+ //Block Spawning
+ // spawn.bodyRect(-100, 200, 100, 400); //spawn door
+ spawn.bodyRect(7450, -800, 25, 200); //boss room door
+ spawn.bodyRect(9850, -1000, 25, 200); //end door
+ spawn.mapRect(-200, 350, 200, 450);
+
+ // spawn.mapRect(3875, -75, 50, 575);
+ spawn.mapRect(3800, -75, 200, 525);
+ spawn.mapRect(3875, 590, 50, 150);
+ spawn.mapRect(3875, 350, 50, 140);
+
+ const debrisCount = 3
+ spawn.debris(1050, 700, 400, debrisCount);
+ spawn.debris(1900, 600, 400, debrisCount);
+ spawn.debris(2700, 500, 400, debrisCount);
+ // spawn.debris(3500, 450, 400, debrisCount);
+ spawn.debris(4150, 500, 400, debrisCount);
+ spawn.debris(5300, 0, 400, debrisCount);
+ spawn.debris(6300, -100, 400, debrisCount);
+ spawn.debris(7200, -500, 400, debrisCount);
+ spawn.debris(8000, -600, 400, debrisCount);
+ spawn.debris(8700, -700, 400, debrisCount);
+ spawn.debris(9300, -900, 400, debrisCount);
+ },
};
\ No newline at end of file
diff --git a/js/powerup.js b/js/powerup.js
index d1e20ad..2feccec 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -531,30 +531,32 @@ const powerUps = {
},
randomPowerUpCounter: 0,
spawnBossPowerUp(x, y) { //boss spawns field and gun tech upgrades
- if (m.fieldMode === 0) {
- powerUps.spawn(x, y, "field")
- } else {
- powerUps.randomPowerUpCounter++;
- powerUpChance(Math.max(level.levelsCleared, 10) * 0.1)
- }
- powerUps.randomPowerUpCounter += 0.6;
- powerUpChance(Math.max(level.levelsCleared, 6) * 0.1)
-
- function powerUpChance(chanceToFail) {
- if (Math.random() * chanceToFail < powerUps.randomPowerUpCounter) {
- powerUps.randomPowerUpCounter = 0;
- if (Math.random() < 0.97) {
- powerUps.spawn(x, y, "tech")
- } else {
- powerUps.spawn(x, y, "gun")
- }
+ if (level.levels[level.onLevel] !== "final") {
+ if (m.fieldMode === 0) {
+ powerUps.spawn(x, y, "field")
} else {
- if (m.health < 0.65 && !tech.isEnergyHealth) {
- powerUps.spawn(x, y, "heal");
- powerUps.spawn(x, y, "heal");
+ powerUps.randomPowerUpCounter++;
+ powerUpChance(Math.max(level.levelsCleared, 10) * 0.1)
+ }
+ powerUps.randomPowerUpCounter += 0.6;
+ powerUpChance(Math.max(level.levelsCleared, 6) * 0.1)
+
+ function powerUpChance(chanceToFail) {
+ if (Math.random() * chanceToFail < powerUps.randomPowerUpCounter) {
+ powerUps.randomPowerUpCounter = 0;
+ if (Math.random() < 0.97) {
+ powerUps.spawn(x, y, "tech")
+ } else {
+ powerUps.spawn(x, y, "gun")
+ }
} else {
- powerUps.spawn(x, y, "ammo");
- powerUps.spawn(x, y, "ammo");
+ if (m.health < 0.65 && !tech.isEnergyHealth) {
+ powerUps.spawn(x, y, "heal");
+ powerUps.spawn(x, y, "heal");
+ } else {
+ powerUps.spawn(x, y, "ammo");
+ powerUps.spawn(x, y, "ammo");
+ }
}
}
}
diff --git a/js/simulation.js b/js/simulation.js
index ee6b480..99a7fb6 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -521,10 +521,12 @@ const simulation = {
if (simulation.isCommunityMaps) {
level.levels.push("stronghold");
level.levels.push("basement");
- // level.levels.push("detours");
+ level.levels.push("crossfire");
level.levels.push("house");
level.levels.push("perplex");
level.levels.push("coliseum");
+
+
// level.levels.push("vats");
level.levels.splice(0, 5); //remove some random levels to make up for adding the community levels
diff --git a/js/spawn.js b/js/spawn.js
index 679218a..56e8c6f 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -178,6 +178,7 @@ const spawn = {
me.onDamage = function() {};
me.cycle = 420;
me.endCycle = 780;
+ me.totalCycles = 0
me.mode = 0;
me.do = function() {
Matter.Body.setPosition(this, { //hold position
@@ -191,6 +192,7 @@ const spawn = {
this.modeDo(); //this does different things based on the mode
this.checkStatus();
this.cycle++; //switch modes÷
+ this.totalCycles++;
// if (!m.isBodiesAsleep) {
if (this.health > 0.25) {
if (this.cycle > this.endCycle) {
@@ -251,23 +253,20 @@ const spawn = {
if (!(this.cycle % this.spawnInterval) && !m.isBodiesAsleep && mob.length < 40) {
if (this.mode !== 3) Matter.Body.setAngularVelocity(this, 0.1)
//fire a bullet from each vertex
- let whoSpawn = spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)];
-
- const step = (this.health > 0.75) ? 2 : 1
- for (let i = 0, len = this.vertices.length; i < len; i += step) {
- spawn[whoSpawn](this.vertices[i].x, this.vertices[i].y);
- const velocity = Vector.mult(Vector.perp(Vector.normalise(Vector.sub(this.position, this.vertices[i]))), -18) //give the mob a rotational velocity as if they were attached to a vertex
+ const whoSpawn = spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)];
+ for (let i = 0, len = 2 + this.totalCycles / 1000; i < len; i++) {
+ const vertex = this.vertices[i % 6]
+ spawn[whoSpawn](vertex.x + 50 * (Math.random() - 0.5), vertex.y + 50 * (Math.random() - 0.5));
+ const velocity = Vector.mult(Vector.perp(Vector.normalise(Vector.sub(this.position, vertex))), -18) //give the mob a rotational velocity as if they were attached to a vertex
Matter.Body.setVelocity(mob[mob.length - 1], {
x: this.velocity.x + velocity.x,
y: this.velocity.y + velocity.y
});
}
-
- if (simulation.difficulty > 60) {
- spawn.randomLevelBoss(3000, -1100)
- if (simulation.difficulty > 100) {
- spawn.randomLevelBoss(3000, -1300)
- }
+ const len = (this.totalCycles / 400 + simulation.difficulty / 2 - 30) / 15
+ // console.log(len)
+ for (let i = 0; i < len; i++) {
+ spawn.randomLevelBoss(3000 + 2000 * (Math.random() - 0.5), -1100 + 200 * (Math.random() - 0.5))
}
}
}
@@ -2830,12 +2829,12 @@ const spawn = {
this.explode();
};
// me.stroke = "transparent"
- me.collisionFilter.mask = cat.player | cat.bullet | cat.body | cat.map
+ me.collisionFilter.mask = cat.player | cat.bullet | cat.body | cat.map | cat.mob
me.showHealthBar = false;
- Matter.Body.setDensity(me, 0.0005); //normal is 0.001
- me.g = 0.0001; //required if using 'gravity'
- me.accelMag = 0.00008 * simulation.accelScale;
- me.memory = 30;
+ Matter.Body.setDensity(me, 0.0001); //normal is 0.001
+ me.g = 0.00002; //required if using 'gravity'
+ me.accelMag = 0.00012 * simulation.accelScale;
+ // me.memory = 30;
me.leaveBody = false;
me.isDropPowerUp = false;
me.seePlayerFreq = Math.round((80 + 50 * Math.random()) * simulation.lookFreqScale);
diff --git a/js/tech.js b/js/tech.js
index a1c15f9..564c214 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -272,7 +272,7 @@
},
{
name: "gun sciences",
- description: "spawn a gun and double the frequency
of finding tech for a specific gun",
+ description: "spawn a gun and double the frequency
of finding tech for your guns",
maxCount: 1,
count: 0,
frequency: 2,
@@ -978,6 +978,7 @@
maxCount: 9,
count: 0,
frequency: 1,
+ isNonRefundable: true,
isBot: true,
isBotTech: true,
allowed() {
@@ -989,7 +990,7 @@
b.nailBot();
},
remove() {
- tech.nailBotCount -= this.count;
+ // tech.nailBotCount -= this.count;
}
},
{
@@ -1023,6 +1024,7 @@
maxCount: 9,
count: 0,
frequency: 1,
+ isNonRefundable: true,
isBot: true,
isBotTech: true,
allowed() {
@@ -1034,7 +1036,7 @@
b.foamBot();
},
remove() {
- tech.foamBotCount -= this.count;
+ // tech.foamBotCount -= this.count;
}
},
{
@@ -1068,6 +1070,7 @@
maxCount: 9,
count: 0,
frequency: 1,
+ isNonRefundable: true,
isBot: true,
isBotTech: true,
allowed() {
@@ -1079,7 +1082,7 @@
b.boomBot();
},
remove() {
- tech.boomBotCount -= this.count;
+ // tech.boomBotCount -= this.count;
}
},
{
@@ -1113,6 +1116,7 @@
maxCount: 9,
count: 0,
frequency: 1,
+ isNonRefundable: true,
isBot: true,
isBotTech: true,
allowed() {
@@ -1124,7 +1128,7 @@
b.laserBot();
},
remove() {
- tech.laserBotCount -= this.count;
+ // tech.laserBotCount -= this.count;
}
},
{
@@ -1158,6 +1162,7 @@
maxCount: 9,
count: 0,
frequency: 1,
+ isNonRefundable: true,
isBot: true,
isBotTech: true,
allowed() {
@@ -1169,7 +1174,7 @@
tech.orbitBotCount++;
},
remove() {
- tech.orbitBotCount -= this.count;
+ // tech.orbitBotCount -= this.count;
}
},
{
@@ -1213,6 +1218,7 @@
maxCount: 9,
count: 0,
frequency: 1,
+ isNonRefundable: true,
isBot: true,
isBotTech: true,
allowed() {
@@ -1224,7 +1230,7 @@
b.dynamoBot();
},
remove() {
- tech.dynamoBotCount -= this.count;
+ // tech.dynamoBotCount -= this.count;
}
},
{
@@ -2656,11 +2662,11 @@
description: "clicking × to cancel a field, tech, or gun
spawns 8 heals, ammo, and research",
maxCount: 1,
count: 0,
- frequency: 2,
+ frequency: 1,
allowed() {
- return tech.isCancelDuplication
+ return !tech.isDeterminism
},
- requires: "futures exchange",
+ requires: "not determinism",
effect() {
tech.isCancelRerolls = true
},
@@ -3586,6 +3592,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ isNonRefundable: true,
isBot: true,
isBotTech: true,
allowed() {
@@ -3597,7 +3604,7 @@
b.missileBot();
},
remove() {
- tech.missileBotCount = 0;
+ // tech.missileBotCount = 0;
}
},
{
@@ -4712,6 +4719,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ isNonRefundable: true,
isBot: true,
isBotTech: true,
allowed() {
@@ -4723,7 +4731,7 @@
b.plasmaBot();
},
remove() {
- tech.plasmaBotCount = 0;
+ // tech.plasmaBotCount = 0;
}
},
{
diff --git a/todo.txt b/todo.txt
index 16f157e..c3db8f6 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,12 +1,17 @@
******************************************************** NEXT PATCH ********************************************************
-fixed: sniper/shooter issues with aiming
-fixed: Copied build urls
+bots are now nonrefundable, so they don't display as a tech when you select them
+ this might introduce some errors, please let me know if you see something
+bot counts can be seen in pause menu
+
+the final boss will spawn progressively more mobs if you don't kill it quickly enough
+ levelBosses are also more likely to spawn on the final boss
+
+added community map - crossfire
+ by iNoobBoi
******************************************************** BUGS ********************************************************
-spawns are forming node groups, but why??
-
you have to press z once to get copy to work for simulation.enableConstructMode() sometimes
not sure how to reproduce, but it happens often on the first draw
@@ -35,9 +40,9 @@ fix door.isOpen actually meaning isClosed?
******************************************************** TODO ********************************************************
-Tech: "Spacial Continuity": 12% chance for the block resulting from a slain enemy to be thrown at the nearst mob.
+import the procedural level generation from one of the older versions of the game as one single level
-Mobs that travel through walls but get stuck on blocks are annoying
+Tech: "Spacial Continuity": 12% chance for the block resulting from a slain enemy to be thrown at the nearest mob.
tech plasma field - plasma field becomes an aoe damage field with the same radius
200% more energy drain, 100% more damage