crossfire

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
This commit is contained in:
landgreen
2021-04-17 09:55:27 -07:00
parent 058b1f94f5
commit ef63dc5494
8 changed files with 259 additions and 61 deletions

View File

@@ -178,6 +178,16 @@ const build = {
}
},
pauseGrid() {
let botText = ""
if (tech.nailBotCount) botText += `<br>nail-bots: ${tech.nailBotCount}`
if (tech.orbitBotCount) botText += `<br>orbital-bots: ${tech.orbitBotCount}`
if (tech.boomBotCount) botText += `<br>boom-bots: ${tech.boomBotCount}`
if (tech.laserBotCount) botText += `<br>laser-bots: ${tech.laserBotCount}`
if (tech.foamBotCount) botText += `<br>foam-bots: ${tech.foamBotCount}`
if (tech.dynamoBotCount) botText += `<br>dynamo-bots: ${tech.dynamoBotCount}`
if (tech.plasmaBotCount) botText += `<br>plasma-bots: ${tech.plasmaBotCount}`
if (tech.missileBotCount) botText += `<br>missile-bots: ${tech.missileBotCount}`
const harm = (1 - m.harmReduction()) * 100
let text = ""
if (!simulation.isChoosing) text += `<div class="pause-grid-module">
@@ -188,6 +198,7 @@ const build = {
<br><strong class='color-harm'>harm</strong> reduction: ${harm.toFixed(harm > 90 ? 2 : 0)}%
<br><strong><em>fire delay</em></strong> decrease: ${((1-b.fireCD)*100).toFixed(b.fireCD < 0.1 ? 2 : 0)}%
<br><strong class='color-dup'>duplication</strong> chance: ${(Math.min(1,tech.duplicationChance())*100).toFixed(0)}%
${botText}
<br>
<br><strong class='color-m'>tech</strong>: ${tech.totalCount} &nbsp; <strong class='color-r'>research</strong>: ${powerUps.research.count}
<br><strong class='color-h'>health</strong>: (${(m.health*100).toFixed(0)} / ${(m.maxHealth*100).toFixed(0)}) &nbsp; <strong class='color-f'>energy</strong>: (${(m.energy*100).toFixed(0)} / ${(m.maxEnergy*100).toFixed(0)})

View File

@@ -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);
},
};

View File

@@ -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");
}
}
}
}

View File

@@ -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

View File

@@ -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);

View File

@@ -272,7 +272,7 @@
},
{
name: "gun sciences",
description: "spawn a <strong class='color-g'>gun</strong> and </strong>double</strong> the <strong class='flicker'>frequency</strong><br>of finding <strong class='color-m'>tech</strong> for a specific <strong class='color-g'>gun</strong>",
description: "spawn a <strong class='color-g'>gun</strong> and </strong>double</strong> the <strong class='flicker'>frequency</strong><br>of finding <strong class='color-m'>tech</strong> for your <strong class='color-g'>guns</strong>",
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 <strong style = 'font-size:150%;'>×</strong> to cancel a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawns <strong>8</strong> <strong class='color-h'>heals</strong>, <strong class='color-g'>ammo</strong>, and <strong class='color-r'>research</strong>",
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;
}
},
{