added difficulty settings
This commit is contained in:
30
index.html
30
index.html
@@ -80,7 +80,7 @@
|
||||
<div id="controls">
|
||||
<details>
|
||||
<summary>info</summary>
|
||||
<div id="controls-div">
|
||||
<div id="details-div">
|
||||
<table>
|
||||
<tr>
|
||||
<td>FIRE</td>
|
||||
@@ -146,6 +146,34 @@
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<div id="settings">
|
||||
<details>
|
||||
<summary>settings</summary>
|
||||
<div id="details-div">
|
||||
<label for="fps-select">frames per second cap:</label>
|
||||
<select name="fps-select" id="fps-select">
|
||||
<option value="max">no fps cap</option>
|
||||
<option value="72" selected>72 fps cap</option>
|
||||
<option value="60">60 fps cap</option>
|
||||
<option value="45">45 fps cap</option>
|
||||
<option value="30">30 fps cap</option>
|
||||
<!-- <option value="15">15 fps cap</option> -->
|
||||
</select>
|
||||
<br><br>
|
||||
<label for="difficulty-select">combat difficulty:</label>
|
||||
<select name="difficulty-select" id="difficulty-select">
|
||||
<option value="easy">easy</option>
|
||||
<option value="0" selected>normal</option>
|
||||
<option value="4">hard</option>
|
||||
<option value="8">why...</option>
|
||||
</select>
|
||||
<!-- <br> <br>
|
||||
<label for="falling-damage">falling damage:</label>
|
||||
<input type="checkbox" id="falling-damage" name="falling-damage" checked> -->
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.fade-in {
|
||||
opacity: 0;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
let bullet = [];
|
||||
|
||||
const b = {
|
||||
dmgScale: null, //scales all gun damage from momentum, but not raw .dmg //this is reset in game.reset
|
||||
dmgScale: null, //scales all gun damage from momentum, but not raw .dmg //set in levels.setDifficulty
|
||||
gravity: 0.0006, //most other bodies have gravity = 0.001
|
||||
//variables use for gun mod upgrades
|
||||
modCount: null,
|
||||
@@ -133,7 +133,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
name: "fluoroantimonic acid",
|
||||
description: "Your bullets do extra chemical <span class='color-d'>damage</span> each time they make contact",
|
||||
description: "your bullets do extra chemical <span class='color-d'>damage</span> each time they make contact",
|
||||
have: false, //11
|
||||
effect: () => { //good with guns that fire many bullets at low speeds, minigun, drones, junk-bots, shotgun, superballs, wavebeam
|
||||
b.extraDmg = 0.1
|
||||
@@ -141,7 +141,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
name: "annihilation",
|
||||
description: "after you touch an enemy, they become <strong class='color-l'>light</strong><br><em>touching enemies still damages you</em>",
|
||||
description: "after you touch any enemy, they are <strong class='color-l'>annihilated</strong><br><em>touching enemies damages you, but destroys them</em>",
|
||||
have: false, //12
|
||||
effect: () => { //good with mods that heal: superconductive healing, entropy transfer
|
||||
b.annihilation = true
|
||||
@@ -149,7 +149,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
name: "superconductive healing",
|
||||
description: "<span class='color-h'>heals</span> have zero resistance, and maximum efficiency<br><span class='color-h'>heals</span> bring you to full health",
|
||||
description: "<span class='color-h'>heals</span> bring you to full health",
|
||||
have: false, //13
|
||||
effect: () => { // good with ablative synthesis, electrostatic field
|
||||
b.fullHeal = true
|
||||
|
||||
87
js/engine.js
87
js/engine.js
@@ -78,50 +78,51 @@ function mobCollisionChecks(event) {
|
||||
for (let i = 0, j = pairs.length; i != j; i++) {
|
||||
|
||||
//body + player collision
|
||||
// if (mech.damageImmune < mech.cycle) {
|
||||
// if (pairs[i].bodyA === playerBody || pairs[i].bodyA === playerHead) {
|
||||
// collidePlayer(pairs[i].bodyB)
|
||||
// } else if (pairs[i].bodyB === playerBody || pairs[i].bodyB === playerHead) {
|
||||
// collidePlayer(pairs[i].bodyA)
|
||||
// }
|
||||
// }
|
||||
if (mech.damageImmune < mech.cycle) {
|
||||
if (pairs[i].bodyA === playerBody || pairs[i].bodyA === playerHead) {
|
||||
collidePlayer(pairs[i].bodyB)
|
||||
} else if (pairs[i].bodyB === playerBody || pairs[i].bodyB === playerHead) {
|
||||
collidePlayer(pairs[i].bodyA)
|
||||
}
|
||||
}
|
||||
|
||||
// function collidePlayer(obj, speedThreshold = 12, massThreshold = 2) {
|
||||
// if (obj.classType === "body" && obj.speed > speedThreshold && obj.mass > massThreshold) { //dmg from hitting a body
|
||||
// const v = Matter.Vector.magnitude(Matter.Vector.sub(player.velocity, obj.velocity));
|
||||
// if (v > speedThreshold) {
|
||||
// mech.damageImmune = mech.cycle + 30; //player is immune to collision damage for 30 cycles
|
||||
// let dmg = Math.sqrt((v - speedThreshold + 0.1) * (obj.mass - massThreshold)) * 0.02;
|
||||
// dmg = Math.min(Math.max(dmg, 0.02), 0.2);
|
||||
// // console.log(`mass = ${obj.mass} \n`, `dmg = ${dmg}\n`, `v = ${v}\n`)
|
||||
// // console.log(v, dmg)
|
||||
// mech.damage(dmg);
|
||||
// game.drawList.push({
|
||||
// //add dmg to draw queue
|
||||
// x: pairs[i].activeContacts[0].vertex.x,
|
||||
// y: pairs[i].activeContacts[0].vertex.y,
|
||||
// radius: dmg * 500,
|
||||
// color: game.mobDmgColor,
|
||||
// time: game.drawTime
|
||||
// });
|
||||
// return;
|
||||
// }
|
||||
// } else if (obj.isStatic && player.speed > speedThreshold * 2) { //falling dmg / hitting map dmg
|
||||
// mech.damageImmune = mech.cycle + 30;
|
||||
// console.log(player.speed)
|
||||
// let dmg = Math.min(Math.max(player.speed * 0.001, 0.02), 0.2);
|
||||
// mech.damage(dmg);
|
||||
// game.drawList.push({
|
||||
// //add dmg to draw queue
|
||||
// x: pairs[i].activeContacts[0].vertex.x,
|
||||
// y: pairs[i].activeContacts[0].vertex.y,
|
||||
// radius: dmg * 500,
|
||||
// color: game.mobDmgColor,
|
||||
// time: game.drawTime
|
||||
// });
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
function collidePlayer(obj, speedThreshold = 12, massThreshold = 2) {
|
||||
if (obj.classType === "body" && obj.speed > speedThreshold && obj.mass > massThreshold) { //dmg from hitting a body
|
||||
const v = Matter.Vector.magnitude(Matter.Vector.sub(player.velocity, obj.velocity));
|
||||
if (v > speedThreshold) {
|
||||
mech.damageImmune = mech.cycle + 30; //player is immune to collision damage for 30 cycles
|
||||
let dmg = Math.sqrt((v - speedThreshold + 0.1) * (obj.mass - massThreshold)) * 0.02;
|
||||
dmg = Math.min(Math.max(dmg, 0.02), 0.2);
|
||||
// console.log(`mass = ${obj.mass} \n`, `dmg = ${dmg}\n`, `v = ${v}\n`)
|
||||
// console.log(v, dmg)
|
||||
mech.damage(dmg);
|
||||
game.drawList.push({
|
||||
//add dmg to draw queue
|
||||
x: pairs[i].activeContacts[0].vertex.x,
|
||||
y: pairs[i].activeContacts[0].vertex.y,
|
||||
radius: dmg * 500,
|
||||
color: game.mobDmgColor,
|
||||
time: game.drawTime
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
// else if (obj.isStatic && player.speed > speedThreshold * 2) { //falling dmg / hitting map dmg
|
||||
// mech.damageImmune = mech.cycle + 30;
|
||||
// console.log(player.speed)
|
||||
// let dmg = Math.min(Math.max(player.speed * 0.001, 0.02), 0.2);
|
||||
// mech.damage(dmg);
|
||||
// game.drawList.push({
|
||||
// //add dmg to draw queue
|
||||
// x: pairs[i].activeContacts[0].vertex.x,
|
||||
// y: pairs[i].activeContacts[0].vertex.y,
|
||||
// radius: dmg * 500,
|
||||
// color: game.mobDmgColor,
|
||||
// time: game.drawTime
|
||||
// });
|
||||
// return;
|
||||
// }
|
||||
}
|
||||
|
||||
//mob + (player,bullet,body) collisions
|
||||
for (let k = 0; k < mob.length; k++) {
|
||||
|
||||
50
js/game.js
50
js/game.js
@@ -1,15 +1,6 @@
|
||||
// game Object ********************************************************
|
||||
//*********************************************************************
|
||||
const game = {
|
||||
// difficulty: {
|
||||
// damageDone: 1,
|
||||
// damageTaken: 1,
|
||||
// mobQuickness: 1,
|
||||
// powerUpDropRate: 1,
|
||||
// fallingDamage: false,
|
||||
// explosiveDamage: true,
|
||||
// unlimitedAmmo: false,
|
||||
// },
|
||||
loop() {
|
||||
game.cycle++; //tracks game cycles
|
||||
mech.cycle++; //tracks player cycles //used to alow time to stop for everything, but the player
|
||||
@@ -69,21 +60,23 @@ const game = {
|
||||
},
|
||||
levelsCleared: 0,
|
||||
g: 0.001,
|
||||
dmgScale: 1,
|
||||
accelScale: 1,
|
||||
CDScale: 1,
|
||||
lookFreqScale: 1,
|
||||
dmgScale: null, //set in levels.setDifficulty
|
||||
accelScale: null, //set in levels.setDifficulty
|
||||
CDScale: null, //set in levels.setDifficulty
|
||||
lookFreqScale: null, //set in levels.setDifficulty
|
||||
onTitlePage: true,
|
||||
paused: false,
|
||||
testing: false, //testing mode: shows wireframe and some variables
|
||||
cycle: 0, //total cycles, 60 per second
|
||||
fpsCap: 72, //limits frames per second to 144/2=72, on most monitors the fps is capped at 60fps by the hardware
|
||||
fpsCap: null, //limits frames per second to 144/2=72, on most monitors the fps is capped at 60fps by the hardware
|
||||
fpsCapDefault: 72, //use to change fpsCap back to normal after a hit from a mob
|
||||
cyclePaused: 0,
|
||||
fallHeight: 3000, //below this y position the player dies
|
||||
lastTimeStamp: 0, //tracks time stamps for measuring delta
|
||||
delta: 1000 / 60, //speed of game engine //looks like it has to be 16 to match player input
|
||||
buttonCD: 0,
|
||||
isEasyMode: false,
|
||||
difficulty: null,
|
||||
// dropFPS(cap = 40, time = 15) {
|
||||
// game.fpsCap = cap
|
||||
// game.fpsInterval = 1000 / game.fpsCap;
|
||||
@@ -188,12 +181,6 @@ const game = {
|
||||
document.getElementById("text-log").style.opacity = 0;
|
||||
}
|
||||
},
|
||||
// timing: function() {
|
||||
// this.cycle++; //tracks game cycles
|
||||
// //delta is used to adjust forces on game slow down;
|
||||
// this.delta = (engine.timing.timestamp - this.lastTimeStamp) / 16.666666666666;
|
||||
// this.lastTimeStamp = engine.timing.timestamp; //track last engine timestamp
|
||||
// },
|
||||
nextGun() {
|
||||
if (b.inventory.length > 0) {
|
||||
b.inventoryGun++;
|
||||
@@ -425,14 +412,29 @@ const game = {
|
||||
mech.fieldUpgrades[0].effect(); //set to default field
|
||||
game.paused = false;
|
||||
engine.timing.timeScale = 1;
|
||||
game.dmgScale = 1;
|
||||
b.dmgScale = 0.7;
|
||||
game.fpsCap = game.fpsCapDefault;
|
||||
game.makeGunHUD();
|
||||
mech.drop();
|
||||
mech.addHealth(1);
|
||||
mech.alive = true;
|
||||
level.onLevel = 0;
|
||||
game.levelsCleared = 0;
|
||||
|
||||
//resetting difficulty
|
||||
game.dmgScale = 1;
|
||||
b.dmgScale = 0.7;
|
||||
game.accelScale = 1;
|
||||
game.lookFreqScale = 1;
|
||||
game.CDScale = 1;
|
||||
if (document.getElementById("difficulty-select").value === 'easy') {
|
||||
game.difficulty = 0;
|
||||
game.isEasyMode = true;
|
||||
level.difficultyDecrease(6);
|
||||
} else {
|
||||
game.difficulty = parseInt(document.getElementById("difficulty-select").value)
|
||||
level.difficultyIncrease(game.difficulty)
|
||||
}
|
||||
|
||||
|
||||
game.clearNow = true;
|
||||
document.getElementById("text-log").style.opacity = 0;
|
||||
document.getElementById("fade-out").style.opacity = 0;
|
||||
@@ -447,6 +449,7 @@ const game = {
|
||||
game.startGame();
|
||||
};
|
||||
document.getElementById("controls").style.display = "inline";
|
||||
document.getElementById("settings").style.display = "inline";
|
||||
document.getElementById("splash").style.display = "inline";
|
||||
document.getElementById("dmg").style.display = "none";
|
||||
document.getElementById("health-bg").style.display = "none";
|
||||
@@ -457,6 +460,7 @@ const game = {
|
||||
startGame() {
|
||||
game.onTitlePage = false;
|
||||
document.getElementById("controls").style.display = "none";
|
||||
document.getElementById("settings").style.display = "none";
|
||||
document.getElementById("splash").onclick = null; //removes the onclick effect so the function only runs once
|
||||
document.getElementById("splash").style.display = "none"; //hides the element that spawned the function
|
||||
document.getElementById("dmg").style.display = "inline";
|
||||
|
||||
16
js/index.js
16
js/index.js
@@ -174,6 +174,22 @@ document.body.addEventListener("wheel", (e) => {
|
||||
passive: true
|
||||
});
|
||||
|
||||
document.getElementById("fps-select").addEventListener("input", event => {
|
||||
let value = document.getElementById("fps-select").value
|
||||
if (value === 'max') {
|
||||
game.fpsCapDefault = 999999999;
|
||||
} else if (value === '72') {
|
||||
game.fpsCapDefault = 72
|
||||
} else if (value === '60') {
|
||||
game.fpsCapDefault = 60
|
||||
} else if (value === '45') {
|
||||
game.fpsCapDefault = 45
|
||||
} else if (value === '30') {
|
||||
game.fpsCapDefault = 30
|
||||
} else if (value === '15') {
|
||||
game.fpsCapDefault = 15
|
||||
}
|
||||
});
|
||||
|
||||
// function playSound(id) {
|
||||
// //play sound
|
||||
|
||||
85
js/level.js
85
js/level.js
@@ -11,8 +11,8 @@ const level = {
|
||||
levels: ["skyscrapers", "rooftops", "warehouse", "highrise", "office", "aerie"],
|
||||
onLevel: 0,
|
||||
start() {
|
||||
if (game.levelsCleared === 0) {
|
||||
// game.levelsCleared = 6; //for testing to simulate possible mobs spawns
|
||||
if (level.onLevel === 0) {
|
||||
// game.difficulty = 6; //for testing to simulate possible mobs spawns
|
||||
// b.giveGuns(6)
|
||||
// mech.fieldUpgrades[6].effect();
|
||||
// b.giveMod(13)
|
||||
@@ -35,12 +35,23 @@ const level = {
|
||||
level.addToWorld(); //add bodies to game engine
|
||||
game.draw.setPaths();
|
||||
},
|
||||
difficultyIncrease() {
|
||||
game.dmgScale += 0.2; //damage done by mobs increases each level
|
||||
b.dmgScale *= 0.95; //damage done by player decreases each level
|
||||
game.accelScale *= 1.05 //mob acceleration increases each level
|
||||
game.lookFreqScale *= 0.95 //mob cycles between looks decreases each level
|
||||
game.CDScale *= 0.95 //mob CD time decreases each level
|
||||
difficultyIncrease(num = 1) {
|
||||
for (let i = 0; i < num; i++) {
|
||||
game.dmgScale += 0.2; //damage done by mobs increases each level
|
||||
b.dmgScale *= 0.95; //damage done by player decreases each level
|
||||
game.accelScale *= 1.05 //mob acceleration increases each level
|
||||
game.lookFreqScale *= 0.95 //mob cycles between looks decreases each level
|
||||
game.CDScale *= 0.95 //mob CD time decreases each level
|
||||
}
|
||||
},
|
||||
difficultyDecrease(num = 1) { //used in easy mode for game.reset()
|
||||
for (let i = 0; i < num; i++) {
|
||||
game.dmgScale -= 0.2; //damage done by mobs increases each level
|
||||
b.dmgScale /= 0.95; //damage done by player decreases each level
|
||||
game.accelScale /= 1.05 //mob acceleration increases each level
|
||||
game.lookFreqScale /= 0.95 //mob cycles between looks decreases each level
|
||||
game.CDScale /= 0.95 //mob CD time decreases each level
|
||||
}
|
||||
},
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
@@ -48,10 +59,6 @@ const level = {
|
||||
//start with all guns
|
||||
game.zoomScale = 1400 //1400 is normal
|
||||
spawn.setSpawnList();
|
||||
game.levelsCleared = 3; //for testing to simulate all possible mobs spawns
|
||||
for (let i = 0; i < game.levelsCleared; i++) {
|
||||
level.difficultyIncrease()
|
||||
}
|
||||
mech.setPosToSpawn(-75, -60); //normal spawn
|
||||
level.enter.x = mech.spawnPos.x - 50;
|
||||
level.enter.y = mech.spawnPos.y + 20;
|
||||
@@ -136,8 +143,8 @@ const level = {
|
||||
|
||||
// spawn.setSpawnList();
|
||||
// spawn.setSpawnList();
|
||||
// game.levelsCleared = 7; //for testing to simulate all possible mobs spawns
|
||||
// for (let i = 0; i < game.levelsCleared; i++) {
|
||||
// game.difficulty = 7; //for testing to simulate all possible mobs spawns
|
||||
// for (let i = 0; i < game.difficulty; i++) {
|
||||
// game.dmgScale += 0.4; //damage done by mobs increases each level
|
||||
// b.dmgScale *= 0.9; //damage done by player decreases each level
|
||||
// }
|
||||
@@ -183,7 +190,7 @@ const level = {
|
||||
}
|
||||
blockDoor(710, -710);
|
||||
|
||||
spawn[spawn.pickList[0]](1500, -200, 100 + game.levelsCleared * 8);
|
||||
spawn[spawn.pickList[0]](1500, -200, 100 + game.difficulty * 8);
|
||||
spawn.mapRect(2500, -1200, 200, 750); //right wall
|
||||
blockDoor(2585, -210)
|
||||
spawn.mapRect(2500, -200, 200, 300); //right wall
|
||||
@@ -200,13 +207,13 @@ const level = {
|
||||
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump
|
||||
|
||||
for (let i = 0; i < 5; ++i) {
|
||||
if (game.levelsCleared * Math.random() > 3 * i) {
|
||||
if (game.difficulty * Math.random() > 3 * i) {
|
||||
spawn.randomBoss(2000 + 500 * (Math.random() - 0.5), -800 + 200 * (Math.random() - 0.5), Infinity);
|
||||
}
|
||||
if (game.levelsCleared * Math.random() > 2.6 * i) {
|
||||
if (game.difficulty * Math.random() > 2.6 * i) {
|
||||
spawn.randomBoss(3500 + 500 * (Math.random() - 0.5), -800 + 200 * (Math.random() - 0.5), Infinity);
|
||||
}
|
||||
if (game.levelsCleared * Math.random() > 2.4 * i) {
|
||||
if (game.difficulty * Math.random() > 2.4 * i) {
|
||||
spawn.randomBoss(5000 + 500 * (Math.random() - 0.5), -800 + 200 * (Math.random() - 0.5), Infinity);
|
||||
}
|
||||
}
|
||||
@@ -325,12 +332,16 @@ const level = {
|
||||
|
||||
mech.health = 0.25;
|
||||
mech.displayHealth();
|
||||
powerUps.spawn(-100, 0, "heal", false); //starting gun
|
||||
// powerUps.spawn(-100, 0, "heal", false); //starting gun
|
||||
powerUps.spawn(1900, -150, "heal", false); //starting gun
|
||||
powerUps.spawn(2050, -150, "heal", false); //starting gun
|
||||
// powerUps.spawn(2050, -150, "field", false); //starting gun
|
||||
powerUps.spawn(2300, -150, "gun", false); //starting gun
|
||||
|
||||
if (game.isEasyMode) {
|
||||
powerUps.spawn(2050, -150, "mod", false); //starting gun
|
||||
powerUps.spawn(2050, -150, "mod", false); //starting gun
|
||||
powerUps.spawn(-100, 0, "heal", false); //starting gun
|
||||
}
|
||||
spawn.wireFoot();
|
||||
spawn.wireFootLeft();
|
||||
spawn.wireKnee();
|
||||
@@ -526,11 +537,11 @@ const level = {
|
||||
spawn.randomBoss(2225, -1325, 0.4);
|
||||
spawn.randomBoss(4900, -1200, 0);
|
||||
//spawn.randomBoss(4850, -1250,0.7);
|
||||
if (game.levelsCleared > 4) spawn.bomber(2500, -2400, 100);
|
||||
if (game.difficulty > 4) spawn.bomber(2500, -2400, 100);
|
||||
},
|
||||
aerie() {
|
||||
// game.setZoom(3000);
|
||||
// game.levelsCleared = 4; //for testing to simulate possible mobs spawns
|
||||
// game.difficulty = 4; //for testing to simulate possible mobs spawns
|
||||
level.defaultZoom = 2100
|
||||
game.zoomTransition(level.defaultZoom)
|
||||
|
||||
@@ -625,7 +636,7 @@ const level = {
|
||||
spawn.mapRect(-300, -1000, 600, 50);
|
||||
spawn.mapRect(-300, -1300, 450, 50);
|
||||
spawn.mapRect(-300, -1300, 50, 350);
|
||||
if (!backwards && game.levelsCleared > 1) spawn.bodyRect(100, -1250, 200, 240); //remove on backwards
|
||||
if (!backwards && game.difficulty > 1) spawn.bodyRect(100, -1250, 200, 240); //remove on backwards
|
||||
//left building
|
||||
spawn.mapRect(-100, -975, 100, 975);
|
||||
spawn.mapRect(-500, 100, 1950, 400);
|
||||
@@ -699,7 +710,7 @@ const level = {
|
||||
spawn.randomBoss(350, -500, 1)
|
||||
spawn.randomBoss(4000, -350, 0.6);
|
||||
spawn.randomBoss(2750, -550, 0.1);
|
||||
if (game.levelsCleared > 2) spawn.suckerBoss(4500, -400);
|
||||
if (game.difficulty > 2) spawn.suckerBoss(4500, -400);
|
||||
|
||||
//add mini boss, giant hopper? or a black hole that spawns hoppers?
|
||||
},
|
||||
@@ -836,7 +847,7 @@ const level = {
|
||||
spawn.bodyRect(1425, -1110, 115, 25, 0.9); //block on far left building
|
||||
spawn.bodyRect(1540, -1110, 300, 25, 0.9); //block on far left building
|
||||
|
||||
if (game.levelsCleared > 2) spawn.shooterBoss(2200, -1300);
|
||||
if (game.difficulty > 2) spawn.shooterBoss(2200, -1300);
|
||||
spawn.randomSmallMob(1300, -70);
|
||||
spawn.randomSmallMob(3200, -100);
|
||||
spawn.randomSmallMob(4450, -100);
|
||||
@@ -876,7 +887,7 @@ const level = {
|
||||
spawn.debris(-2325, -1825, 2400); //20 debris per level
|
||||
spawn.debris(-2625, -600, 600, 6); //20 debris per level
|
||||
spawn.debris(-2000, -60, 1200, 6); //20 debris per level
|
||||
// if (!game.levelsCleared) powerUps.spawn(2450, -1675, "gun", false);
|
||||
// if (!game.difficulty) powerUps.spawn(2450, -1675, "gun", false);
|
||||
//background
|
||||
level.fillBG.push({
|
||||
x: -4425,
|
||||
@@ -961,7 +972,7 @@ const level = {
|
||||
|
||||
spawn.mapRect(-1850, -1150, 1050, 175);
|
||||
spawn.bodyRect(-1907, -1600, 550, 25);
|
||||
if (game.levelsCleared < 4) {
|
||||
if (game.difficulty < 4) {
|
||||
spawn.bodyRect(-1600, -125, 125, 125);
|
||||
spawn.bodyRect(-1560, -200, 75, 75);
|
||||
} else {
|
||||
@@ -996,7 +1007,7 @@ const level = {
|
||||
spawn.bodyRect(-3570, -1800, 50, 50);
|
||||
spawn.bodyRect(-2970, -2250, 50, 50);
|
||||
|
||||
if (game.levelsCleared < 4) spawn.bodyRect(-3760, -2400, 50, 50);
|
||||
if (game.difficulty < 4) spawn.bodyRect(-3760, -2400, 50, 50);
|
||||
|
||||
spawn.bodyRect(-3080, -2250, 40, 40);
|
||||
spawn.bodyRect(-3420, -650, 50, 50);
|
||||
@@ -1207,7 +1218,7 @@ const level = {
|
||||
//spawn.randomMob(1120, -1200, 0.3);
|
||||
//spawn.randomSmallMob(2200, -1775);
|
||||
|
||||
if (game.levelsCleared > 2) spawn.snaker(-1300 + Math.random() * 2000, -2200); //boss snake with head
|
||||
if (game.difficulty > 2) spawn.snaker(-1300 + Math.random() * 2000, -2200); //boss snake with head
|
||||
},
|
||||
office() {
|
||||
level.defaultZoom = 1400
|
||||
@@ -1332,7 +1343,7 @@ const level = {
|
||||
spawn.spawnStairs(3000 + 2000 - 50, 0, 4, 250, 350, true); //stairs ground
|
||||
|
||||
// tether ball
|
||||
if (game.levelsCleared > 2) {
|
||||
if (game.difficulty > 2) {
|
||||
level.fillBG.push({
|
||||
x: 2495,
|
||||
y: -500,
|
||||
@@ -1350,7 +1361,7 @@ const level = {
|
||||
stiffness: 0.00012
|
||||
});
|
||||
//chance to spawn a ring of exploding mobs around this boss
|
||||
if (game.levelsCleared > 4) spawn.nodeBoss(2850, -80, "spawns", 8, 20, 105);
|
||||
if (game.difficulty > 4) spawn.nodeBoss(2850, -80, "spawns", 8, 20, 105);
|
||||
}
|
||||
|
||||
spawn.randomSmallMob(4575, -560, 1);
|
||||
@@ -1456,8 +1467,8 @@ const level = {
|
||||
nextLevel() {
|
||||
//enter when player isn't falling
|
||||
if (player.velocity.y < 0.1) {
|
||||
game.levelsCleared++;
|
||||
if (game.levelsCleared > 1) level.difficultyIncrease()
|
||||
game.difficulty++;
|
||||
if (game.difficulty > 1) level.difficultyIncrease()
|
||||
//cycles map to next level
|
||||
level.onLevel++;
|
||||
if (level.onLevel > level.levels.length - 1) level.onLevel = 0;
|
||||
@@ -1555,10 +1566,10 @@ const level = {
|
||||
}
|
||||
},
|
||||
levelAnnounce() {
|
||||
document.title = "n-gon: L" + (game.levelsCleared) + " " + level.levels[level.onLevel];
|
||||
// game.makeTextLog(`<div style='font-size: 25px;'>level ${game.levelsCleared} </div> <div style='font-size: 32px;'>${level.levels[level.onLevel]} </div>`, 300);
|
||||
// if (game.levelsCleared === 0) text = "";
|
||||
// text = "Level " + (game.levelsCleared + 1) + ": " + spawn.pickList[0] + "s + " + spawn.pickList[1] + "s";
|
||||
document.title = "n-gon: L" + (level.onLevel) + " " + level.levels[level.onLevel];
|
||||
// game.makeTextLog(`<div style='font-size: 25px;'>level ${game.difficulty} </div> <div style='font-size: 32px;'>${level.levels[level.onLevel]} </div>`, 300);
|
||||
// if (game.difficulty === 0) text = "";
|
||||
// text = "Level " + (game.difficulty + 1) + ": " + spawn.pickList[0] + "s + " + spawn.pickList[1] + "s";
|
||||
|
||||
// text = text + " with population: ";
|
||||
// for (let i = 0, len = spawn.pickList.length; i < len; ++i) {
|
||||
|
||||
@@ -390,7 +390,7 @@ const mech = {
|
||||
}
|
||||
|
||||
function randomizeField() {
|
||||
if (game.levelsCleared * (Math.random() + 0.27) > 2) {
|
||||
if (game.difficulty * (Math.random() + 0.27) > 2) {
|
||||
mech.fieldUpgrades[Math.floor(Math.random() * (mech.fieldUpgrades.length))].effect();
|
||||
} else {
|
||||
mech.fieldUpgrades[0].effect();
|
||||
@@ -455,7 +455,7 @@ const mech = {
|
||||
}
|
||||
game.replaceTextLog = true;
|
||||
game.makeTextLog("your quantum probability has stabilized", 1000);
|
||||
document.title = "n-gon: L" + (game.levelsCleared) + " " + level.levels[level.onLevel];
|
||||
document.title = "n-gon: L" + (game.difficulty) + " " + level.levels[level.onLevel];
|
||||
}, 8000);
|
||||
|
||||
} else if (this.alive) { //normal death code here
|
||||
|
||||
@@ -185,7 +185,7 @@ const powerUps = {
|
||||
}
|
||||
},
|
||||
spawnStartingPowerUps(x, y) { //used for map specific power ups, mostly to give player a starting gun
|
||||
if (b.inventory.length < 2) {
|
||||
if (b.inventory.length < 2 || game.isEasyMode) {
|
||||
powerUps.spawn(x, y, "gun", false); //starting gun
|
||||
} else {
|
||||
powerUps.spawnRandomPowerUp(x, y);
|
||||
|
||||
46
js/spawn.js
46
js/spawn.js
@@ -27,16 +27,16 @@ const spawn = {
|
||||
spawn.pickList.push(spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)]);
|
||||
},
|
||||
randomMob(x, y, chance = 1) {
|
||||
if (Math.random() < chance + 0.09 * (game.levelsCleared - 1) && mob.length < 4 + game.levelsCleared * 1.7) {
|
||||
if (Math.random() < chance + 0.09 * (game.difficulty - 1) && mob.length < 4 + game.difficulty * 1.7) {
|
||||
const pick = this.pickList[Math.floor(Math.random() * this.pickList.length)];
|
||||
this[pick](x, y);
|
||||
}
|
||||
},
|
||||
randomSmallMob(x, y,
|
||||
num = Math.max(Math.min(Math.round(Math.random() * (game.levelsCleared - 1) * 0.45 - 0.4), 4), 0),
|
||||
num = Math.max(Math.min(Math.round(Math.random() * (game.difficulty - 1) * 0.45 - 0.4), 4), 0),
|
||||
size = 16 + Math.ceil(Math.random() * 15),
|
||||
chance = 1) {
|
||||
if (Math.random() < chance + (game.levelsCleared - 1) * 0.03 && mob.length < 4 + game.levelsCleared * 1.7) {
|
||||
if (Math.random() < chance + (game.difficulty - 1) * 0.03 && mob.length < 4 + game.difficulty * 1.7) {
|
||||
for (let i = 0; i < num; ++i) {
|
||||
const pick = this.pickList[Math.floor(Math.random() * this.pickList.length)];
|
||||
this[pick](x + Math.round((Math.random() - 0.5) * 20) + i * size * 2.5, y + Math.round((Math.random() - 0.5) * 20), size);
|
||||
@@ -44,7 +44,7 @@ const spawn = {
|
||||
}
|
||||
},
|
||||
randomBoss(x, y, chance = 1) {
|
||||
if (Math.random() < chance + (game.levelsCleared - 1) * 0.14 && game.levelsCleared !== 1 && mob.length < 4 + game.levelsCleared * 2 || chance == Infinity) {
|
||||
if (Math.random() < chance + (game.difficulty - 1) * 0.14 && game.difficulty !== 1 && mob.length < 4 + game.difficulty * 2 || chance == Infinity) {
|
||||
//choose from the possible picklist
|
||||
let pick = this.pickList[Math.floor(Math.random() * this.pickList.length)];
|
||||
//is the pick able to be a boss?
|
||||
@@ -236,7 +236,7 @@ const spawn = {
|
||||
me.accelMag = 0.001 * game.accelScale;;
|
||||
me.g = me.accelMag * 0.6; //required if using 'gravity'
|
||||
me.memory = 50;
|
||||
if (Math.random() < Math.min((game.levelsCleared - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
if (Math.random() < Math.min((game.difficulty - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
me.do = function () {
|
||||
this.healthBar();
|
||||
this.gravity();
|
||||
@@ -298,7 +298,7 @@ const spawn = {
|
||||
me.onDeath = function () {
|
||||
this.removeCons();
|
||||
};
|
||||
if (Math.random() < Math.min((game.levelsCleared - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
if (Math.random() < Math.min((game.difficulty - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
me.do = function () {
|
||||
this.healthBar();
|
||||
this.gravity();
|
||||
@@ -493,8 +493,8 @@ const spawn = {
|
||||
me.onDeath = function () {
|
||||
//applying forces to player doesn't seem to work inside this method, not sure why
|
||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||
if (game.levelsCleared > 5) {
|
||||
for (let i = 0; i < (game.levelsCleared - 3); ++i) {
|
||||
if (game.difficulty > 5) {
|
||||
for (let i = 0; i < (game.difficulty - 3); ++i) {
|
||||
spawn.sucker(this.position.x + (Math.random() - 0.5) * radius * 2, this.position.y + (Math.random() - 0.5) * radius * 2, 70 * Math.random());
|
||||
Matter.Body.setVelocity(mob[mob.length - 1], {
|
||||
x: (Math.random() - 0.5) * 70,
|
||||
@@ -580,7 +580,7 @@ const spawn = {
|
||||
me.accelMag = 0.0005 * game.accelScale;
|
||||
me.frictionStatic = 0;
|
||||
me.friction = 0;
|
||||
if (Math.random() < Math.min(0.2 + (game.levelsCleared - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
if (Math.random() < Math.min(0.2 + (game.difficulty - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
me.do = function () {
|
||||
this.healthBar();
|
||||
this.seePlayerByLookingAt();
|
||||
@@ -604,7 +604,7 @@ const spawn = {
|
||||
me.onDamage = function () {
|
||||
this.laserPos = this.position;
|
||||
};
|
||||
// if (Math.random() < Math.min(0.2 + game.levelsCleared * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
// if (Math.random() < Math.min(0.2 + game.difficulty * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
me.do = function () {
|
||||
this.healthBar();
|
||||
if (!mech.isBodiesAsleep) {
|
||||
@@ -849,7 +849,7 @@ const spawn = {
|
||||
//boss that drops bombs from above and holds a set distance from player
|
||||
mobs.spawn(x, y, 3, radius, "transparent");
|
||||
let me = mob[mob.length - 1];
|
||||
Matter.Body.setDensity(me, 0.0015 + 0.0005 * Math.sqrt(game.levelsCleared)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
Matter.Body.setDensity(me, 0.0015 + 0.0005 * Math.sqrt(game.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
|
||||
me.stroke = "rgba(255,0,200)"; //used for drawGhost
|
||||
me.seeAtDistance2 = 2000000;
|
||||
@@ -892,7 +892,7 @@ const spawn = {
|
||||
x: 0,
|
||||
y: 0
|
||||
};
|
||||
if (Math.random() < Math.min(0.15 + (game.levelsCleared - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
if (Math.random() < Math.min(0.15 + (game.difficulty - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
me.do = function () {
|
||||
this.healthBar();
|
||||
this.seePlayerByLookingAt();
|
||||
@@ -915,7 +915,7 @@ const spawn = {
|
||||
x: 0,
|
||||
y: 0
|
||||
};
|
||||
Matter.Body.setDensity(me, 0.001 + 0.0005 * Math.sqrt(game.levelsCleared)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
Matter.Body.setDensity(me, 0.001 + 0.0005 * Math.sqrt(game.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
spawn.shield(me, x, y);
|
||||
me.onDeath = function () {
|
||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||
@@ -963,7 +963,7 @@ const spawn = {
|
||||
});
|
||||
}
|
||||
};
|
||||
if (Math.random() < Math.min((game.levelsCleared - 1) * 0.1, 0.5)) spawn.shield(me, x, y);
|
||||
if (Math.random() < Math.min((game.difficulty - 1) * 0.1, 0.5)) spawn.shield(me, x, y);
|
||||
me.do = function () {
|
||||
this.healthBar();
|
||||
this.gravity();
|
||||
@@ -1013,9 +1013,9 @@ const spawn = {
|
||||
me.accelMag = 0.0012 * game.accelScale;
|
||||
me.memory = 200;
|
||||
me.laserRange = 500;
|
||||
Matter.Body.setDensity(me, 0.001 + 0.0005 * Math.sqrt(game.levelsCleared)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
Matter.Body.setDensity(me, 0.001 + 0.0005 * Math.sqrt(game.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
spawn.shield(me, x, y);
|
||||
if (Math.random() < Math.min((game.levelsCleared - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
if (Math.random() < Math.min((game.difficulty - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
me.onDeath = function () {
|
||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||
};
|
||||
@@ -1027,7 +1027,7 @@ const spawn = {
|
||||
};
|
||||
|
||||
//snake tail
|
||||
const nodes = Math.min(3 + Math.ceil(Math.random() * game.levelsCleared + 2), 8)
|
||||
const nodes = Math.min(3 + Math.ceil(Math.random() * game.difficulty + 2), 8)
|
||||
spawn.lineBoss(x + 105, y, "spawns", nodes);
|
||||
//constraint boss with first 3 mobs in lineboss
|
||||
consBB[consBB.length] = Constraint.create({
|
||||
@@ -1055,9 +1055,9 @@ const spawn = {
|
||||
me.g = 0.0001; //required if using 'gravity'
|
||||
me.accelMag = 0.002 * game.accelScale;
|
||||
me.memory = 20;
|
||||
Matter.Body.setDensity(me, 0.001 + 0.0005 * Math.sqrt(game.levelsCleared)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
Matter.Body.setDensity(me, 0.001 + 0.0005 * Math.sqrt(game.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
spawn.shield(me, x, y);
|
||||
if (Math.random() < Math.min((game.levelsCleared - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
if (Math.random() < Math.min((game.difficulty - 1) * 0.1, 0.7)) spawn.shield(me, x, y);
|
||||
|
||||
me.onDeath = function () {
|
||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||
@@ -1131,8 +1131,8 @@ const spawn = {
|
||||
x,
|
||||
y,
|
||||
spawn = "striker",
|
||||
nodes = Math.min(2 + Math.ceil(Math.random() * (game.levelsCleared + 2)), 8),
|
||||
//Math.ceil(Math.random() * 3) + Math.min(4,Math.ceil(game.levelsCleared/2)),
|
||||
nodes = Math.min(2 + Math.ceil(Math.random() * (game.difficulty + 2)), 8),
|
||||
//Math.ceil(Math.random() * 3) + Math.min(4,Math.ceil(game.difficulty/2)),
|
||||
radius = Math.ceil(Math.random() * 10) + 17, // radius of each node mob
|
||||
sideLength = Math.ceil(Math.random() * 100) + 70, // distance between each node mob
|
||||
stiffness = Math.random() * 0.03 + 0.005
|
||||
@@ -1164,8 +1164,8 @@ const spawn = {
|
||||
x,
|
||||
y,
|
||||
spawn = "striker",
|
||||
nodes = Math.min(3 + Math.ceil(Math.random() * game.levelsCleared + 2), 8),
|
||||
//Math.ceil(Math.random() * 3) + Math.min(4,Math.ceil(game.levelsCleared/2)),
|
||||
nodes = Math.min(3 + Math.ceil(Math.random() * game.difficulty + 2), 8),
|
||||
//Math.ceil(Math.random() * 3) + Math.min(4,Math.ceil(game.difficulty/2)),
|
||||
radius = Math.ceil(Math.random() * 10) + 17,
|
||||
l = Math.ceil(Math.random() * 80) + 30,
|
||||
stiffness = Math.random() * 0.06 + 0.01
|
||||
|
||||
13
style.css
13
style.css
@@ -49,7 +49,15 @@ summary {
|
||||
/* border-radius: 5px; */
|
||||
}
|
||||
|
||||
#controls-div {
|
||||
#settings {
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
right: 1px;
|
||||
z-index: 12;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
#details-div {
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
background-color: #ddd;
|
||||
@@ -258,8 +266,6 @@ em {
|
||||
background: #149;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.box {
|
||||
padding: 3px 8px 3px 8px;
|
||||
border: 2px solid #444;
|
||||
@@ -267,7 +273,6 @@ em {
|
||||
background-color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
|
||||
.wrapper {
|
||||
display: grid;
|
||||
grid-template-columns: 360px 10px;
|
||||
|
||||
Reference in New Issue
Block a user