superfluidity
This commit is contained in:
561
js/level.js
561
js/level.js
@@ -13,18 +13,16 @@ const level = {
|
||||
// game.enableConstructMode() //used to build maps in testing mode
|
||||
// level.difficultyIncrease(9)
|
||||
// mech.isStealth = true;
|
||||
// mod.giveMod("plasma-bot");
|
||||
// mod.giveMod("nail-bot");
|
||||
// mod.giveMod("laser-bot");
|
||||
// mod.giveMod("boom-bot");
|
||||
// mod.giveMod("supply chain");
|
||||
// b.giveGuns("pulse")
|
||||
b.giveGuns("ice IX")
|
||||
// mech.setField("plasma torch")
|
||||
|
||||
level.intro(); //starting level
|
||||
// level.bossRoom1()
|
||||
// level.testing();
|
||||
// level.stronghold()
|
||||
// level.template()
|
||||
// level.bosses();
|
||||
// level.stronghold()
|
||||
// level.satellite();
|
||||
// level.skyscrapers();
|
||||
// level.aerie();
|
||||
@@ -32,6 +30,7 @@ const level = {
|
||||
// level.warehouse();
|
||||
// level.highrise();
|
||||
// level.office();
|
||||
|
||||
} else {
|
||||
spawn.setSpawnList(); //picks a couple mobs types for a themed random mob spawns
|
||||
// spawn.pickList = ["focuser", "focuser"]
|
||||
@@ -61,245 +60,86 @@ const level = {
|
||||
|
||||
if (mod.isArmorFromPowerUps) {
|
||||
// for (let i = 0; i < powerUps.totalPowerUps; i++) {}
|
||||
mech.maxHealth += 0.04 * powerUps.totalPowerUps
|
||||
if (powerUps.totalPowerUps) game.makeTextLog("<span style='font-size:115%;'> max health increased by " + (0.04 * powerUps.totalPowerUps * 100).toFixed(0) + "%</span>", 300)
|
||||
mech.maxHealth += 0.05 * powerUps.totalPowerUps
|
||||
if (powerUps.totalPowerUps) game.makeTextLog("<span style='font-size:115%;'> max health increased by " + (0.05 * powerUps.totalPowerUps * 100).toFixed(0) + "%</span>", 300)
|
||||
}
|
||||
},
|
||||
isBuildRun: false,
|
||||
difficultyIncrease(num = 1) {
|
||||
// if (level.isBuildRun) num++
|
||||
for (let i = 0; i < num; i++) {
|
||||
game.difficulty++
|
||||
game.dmgScale += 0.21; //damage done by mobs increases each level
|
||||
b.dmgScale *= 0.91; //damage done by player decreases each level
|
||||
game.accelScale *= 1.027 //mob acceleration increases each level
|
||||
game.lookFreqScale *= 0.974 //mob cycles between looks decreases each level
|
||||
game.CDScale *= 0.964 //mob CD time decreases each level
|
||||
}
|
||||
game.healScale = 1 / (1 + game.difficulty * 0.09) //a higher denominator makes for lower heals // mech.health += heal * game.healScale;
|
||||
},
|
||||
difficultyDecrease(num = 1) { //used in easy mode for game.reset()
|
||||
for (let i = 0; i < num; i++) {
|
||||
game.difficulty--
|
||||
game.dmgScale -= 0.21; //damage done by mobs increases each level
|
||||
if (game.dmgScale < 0.1) game.dmgScale = 0.1;
|
||||
b.dmgScale /= 0.91; //damage done by player decreases each level
|
||||
game.accelScale /= 1.027 //mob acceleration increases each level
|
||||
game.lookFreqScale /= 0.974 //mob cycles between looks decreases each level
|
||||
game.CDScale /= 0.964 //mob CD time decreases each level
|
||||
}
|
||||
if (game.difficulty < 1) game.difficulty = 0;
|
||||
game.healScale = 1 / (1 + game.difficulty * 0.09)
|
||||
},
|
||||
difficultyText(mode = document.getElementById("difficulty-select").value) {
|
||||
if (mode === "0") {
|
||||
return "easy"
|
||||
} else if (mode === "1") {
|
||||
return "normal"
|
||||
} else if (mode === "2") {
|
||||
return "hard"
|
||||
} else if (mode === "4") {
|
||||
return "why"
|
||||
}
|
||||
},
|
||||
levelAnnounce() {
|
||||
if (level.levelsCleared === 0) {
|
||||
document.title = "n-gon: intro (" + level.difficultyText() + ")";
|
||||
} else {
|
||||
document.title = "n-gon: L" + (level.levelsCleared) + " " + level.levels[level.onLevel] + " (" + level.difficultyText() + ")";
|
||||
}
|
||||
},
|
||||
custom() {}, //each level runs it's own custom code (level exits, ...)
|
||||
nextLevel() {
|
||||
level.levelsCleared++;
|
||||
level.onLevel++; //cycles map to next level
|
||||
if (level.onLevel > level.levels.length - 1) level.onLevel = 0;
|
||||
|
||||
level.difficultyIncrease(game.difficultyMode) //increase difficulty based on modes
|
||||
if (game.isEasyMode && level.levelsCleared % 2) level.difficultyDecrease(1);
|
||||
game.clearNow = true; //triggers in game.clearMap to remove all physics bodies and setup for new map
|
||||
},
|
||||
playerExitCheck() {
|
||||
if (
|
||||
player.position.x > level.exit.x &&
|
||||
player.position.x < level.exit.x + 100 &&
|
||||
player.position.y > level.exit.y - 150 &&
|
||||
player.position.y < level.exit.y - 40 &&
|
||||
player.velocity.y < 0.1
|
||||
) {
|
||||
level.nextLevel()
|
||||
}
|
||||
},
|
||||
setPosToSpawn(xPos, yPos) {
|
||||
mech.spawnPos.x = mech.pos.x = xPos;
|
||||
mech.spawnPos.y = mech.pos.y = yPos;
|
||||
level.enter.x = mech.spawnPos.x - 50;
|
||||
level.enter.y = mech.spawnPos.y + 20;
|
||||
mech.transX = mech.transSmoothX = canvas.width2 - mech.pos.x;
|
||||
mech.transY = mech.transSmoothY = canvas.height2 - mech.pos.y;
|
||||
mech.Vx = mech.spawnVel.x;
|
||||
mech.Vy = mech.spawnVel.y;
|
||||
player.force.x = 0;
|
||||
player.force.y = 0;
|
||||
Matter.Body.setPosition(player, mech.spawnPos);
|
||||
Matter.Body.setVelocity(player, mech.spawnVel);
|
||||
},
|
||||
enter: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
draw() {
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(level.enter.x, level.enter.y + 30);
|
||||
ctx.lineTo(level.enter.x, level.enter.y - 80);
|
||||
ctx.bezierCurveTo(level.enter.x, level.enter.y - 170, level.enter.x + 100, level.enter.y - 170, level.enter.x + 100, level.enter.y - 80);
|
||||
ctx.lineTo(level.enter.x + 100, level.enter.y + 30);
|
||||
ctx.lineTo(level.enter.x, level.enter.y + 30);
|
||||
ctx.fillStyle = "#ccc";
|
||||
ctx.fill();
|
||||
}
|
||||
},
|
||||
exit: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
draw() {
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(level.exit.x, level.exit.y + 30);
|
||||
ctx.lineTo(level.exit.x, level.exit.y - 80);
|
||||
ctx.bezierCurveTo(level.exit.x, level.exit.y - 170, level.exit.x + 100, level.exit.y - 170, level.exit.x + 100, level.exit.y - 80);
|
||||
ctx.lineTo(level.exit.x + 100, level.exit.y + 30);
|
||||
ctx.lineTo(level.exit.x, level.exit.y + 30);
|
||||
ctx.fillStyle = "#0ff";
|
||||
ctx.fill();
|
||||
}
|
||||
},
|
||||
fillBG: [],
|
||||
drawFillBGs() {
|
||||
for (let i = 0, len = level.fillBG.length; i < len; ++i) {
|
||||
const f = level.fillBG[i];
|
||||
ctx.fillStyle = f.color;
|
||||
ctx.fillRect(f.x, f.y, f.width, f.height);
|
||||
}
|
||||
},
|
||||
fill: [],
|
||||
drawFills() {
|
||||
for (let i = 0, len = level.fill.length; i < len; ++i) {
|
||||
const f = level.fill[i];
|
||||
ctx.fillStyle = f.color;
|
||||
ctx.fillRect(f.x, f.y, f.width, f.height);
|
||||
}
|
||||
},
|
||||
queryList: [], //queries do actions on many objects in regions
|
||||
checkQuery() {
|
||||
let bounds, action, info;
|
||||
|
||||
function isInZone(targetArray) {
|
||||
let results = Matter.Query.region(targetArray, bounds);
|
||||
for (let i = 0, len = results.length; i < len; ++i) {
|
||||
level.queryActions[action](results[i], info);
|
||||
}
|
||||
}
|
||||
for (let i = 0, len = level.queryList.length; i < len; ++i) {
|
||||
bounds = level.queryList[i].bounds;
|
||||
action = level.queryList[i].action;
|
||||
info = level.queryList[i].info;
|
||||
for (let j = 0, l = level.queryList[i].groups.length; j < l; ++j) {
|
||||
isInZone(level.queryList[i].groups[j]);
|
||||
}
|
||||
}
|
||||
},
|
||||
//oddly query regions can't get smaller than 50 width?
|
||||
addQueryRegion(x, y, width, height, action, groups = [
|
||||
[player], body, mob, powerUp, bullet
|
||||
], info) {
|
||||
level.queryList[level.queryList.length] = {
|
||||
bounds: {
|
||||
min: {
|
||||
x: x,
|
||||
y: y
|
||||
},
|
||||
max: {
|
||||
x: x + width,
|
||||
y: y + height
|
||||
}
|
||||
},
|
||||
action: action,
|
||||
groups: groups,
|
||||
info: info
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
bossRoom1() {
|
||||
level.custom = () => {
|
||||
level.playerExitCheck();
|
||||
};
|
||||
},
|
||||
queryActions: {
|
||||
bounce(target, info) {
|
||||
//jerky fling upwards
|
||||
Matter.Body.setVelocity(target, {
|
||||
x: info.Vx + (Math.random() - 0.5) * 6,
|
||||
y: info.Vy
|
||||
});
|
||||
target.torque = (Math.random() - 0.5) * 2 * target.mass;
|
||||
},
|
||||
boost(target, yVelocity) {
|
||||
// if (target.velocity.y < 0) {
|
||||
// mech.undoCrouch();
|
||||
// mech.enterAir();
|
||||
mech.buttonCD_jump = 0; // reset short jump counter to prevent short jumps on boosts
|
||||
mech.hardLandCD = 0 // disable hard landing
|
||||
if (target.velocity.y > 30) {
|
||||
Matter.Body.setVelocity(target, {
|
||||
x: target.velocity.x + (Math.random() - 0.5) * 2,
|
||||
y: -23 //gentle bounce if coming down super fast
|
||||
});
|
||||
} else {
|
||||
Matter.Body.setVelocity(target, {
|
||||
x: target.velocity.x + (Math.random() - 0.5) * 2,
|
||||
y: yVelocity
|
||||
});
|
||||
}
|
||||
level.setPosToSpawn(0, -50); //normal spawn
|
||||
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
|
||||
level.exit.x = 1500;
|
||||
level.exit.y = -1875;
|
||||
level.defaultZoom = 1800
|
||||
game.zoomTransition(level.defaultZoom)
|
||||
document.body.style.backgroundColor = "#dcdcde";
|
||||
// powerUps.spawnStartingPowerUps(1475, -1175);
|
||||
// spawn.debris(750, -2200, 3700, 16); //16 debris per level
|
||||
// level.fill.push({ //foreground
|
||||
// x: 2500,
|
||||
// y: -1100,
|
||||
// width: 450,
|
||||
// height: 250,
|
||||
// color: "rgba(0,0,0,0.1)"
|
||||
// });
|
||||
// level.fillBG.push({ //background
|
||||
// x: 1300,
|
||||
// y: -1800,
|
||||
// width: 750,
|
||||
// height: 1800,
|
||||
// color: "#d4d4d7"
|
||||
// });
|
||||
|
||||
},
|
||||
force(target, info) {
|
||||
if (target.velocity.y < 0) {
|
||||
//gently force up if already on the way up
|
||||
target.force.x += info.Vx * target.mass;
|
||||
target.force.y += info.Vy * target.mass;
|
||||
} else {
|
||||
target.force.y -= 0.0007 * target.mass; //gently fall in on the way down
|
||||
}
|
||||
},
|
||||
antiGrav(target) {
|
||||
target.force.y -= 0.0011 * target.mass;
|
||||
},
|
||||
death(target) {
|
||||
target.death();
|
||||
}
|
||||
spawn.mapRect(-100, 0, 1000, 100);
|
||||
// spawn.bodyRect(1540, -1110, 300, 25, 0.9);
|
||||
// spawn.boost(4150, 0, 1300);
|
||||
// spawn.randomSmallMob(1300, -70);
|
||||
// spawn.randomMob(2650, -975, 0.8);
|
||||
// spawn.randomBoss(1700, -900, 0.4);
|
||||
// if (game.difficulty > 3) spawn.randomLevelBoss(2200, -1300);
|
||||
},
|
||||
addToWorld() {
|
||||
//needs to be run to put bodies into the world
|
||||
for (let i = 0; i < body.length; i++) {
|
||||
//body[i].collisionFilter.group = 0;
|
||||
if (body[i] !== mech.holdingTarget) {
|
||||
body[i].collisionFilter.category = cat.body;
|
||||
body[i].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet
|
||||
}
|
||||
body[i].classType = "body";
|
||||
World.add(engine.world, body[i]); //add to world
|
||||
}
|
||||
for (let i = 0; i < map.length; i++) {
|
||||
//map[i].collisionFilter.group = 0;
|
||||
map[i].collisionFilter.category = cat.map;
|
||||
map[i].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet;
|
||||
Matter.Body.setStatic(map[i], true); //make static
|
||||
World.add(engine.world, map[i]); //add to world
|
||||
}
|
||||
for (let i = 0; i < cons.length; i++) {
|
||||
World.add(engine.world, cons[i]);
|
||||
}
|
||||
for (let i = 0; i < consBB.length; i++) {
|
||||
World.add(engine.world, consBB[i]);
|
||||
}
|
||||
template() {
|
||||
level.custom = () => {
|
||||
level.playerExitCheck();
|
||||
};
|
||||
level.setPosToSpawn(0, -50); //normal spawn
|
||||
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
|
||||
level.exit.x = 1500;
|
||||
level.exit.y = -1875;
|
||||
level.defaultZoom = 1800
|
||||
game.zoomTransition(level.defaultZoom)
|
||||
document.body.style.backgroundColor = "#dcdcde";
|
||||
// powerUps.spawnStartingPowerUps(1475, -1175);
|
||||
// spawn.debris(750, -2200, 3700, 16); //16 debris per level
|
||||
// level.fill.push({ //foreground
|
||||
// x: 2500,
|
||||
// y: -1100,
|
||||
// width: 450,
|
||||
// height: 250,
|
||||
// color: "rgba(0,0,0,0.1)"
|
||||
// });
|
||||
// level.fillBG.push({ //background
|
||||
// x: 1300,
|
||||
// y: -1800,
|
||||
// width: 750,
|
||||
// height: 1800,
|
||||
// color: "#d4d4d7"
|
||||
// });
|
||||
|
||||
spawn.mapRect(-100, 0, 1000, 100);
|
||||
// spawn.bodyRect(1540, -1110, 300, 25, 0.9);
|
||||
// spawn.boost(4150, 0, 1300);
|
||||
// spawn.randomSmallMob(1300, -70);
|
||||
// spawn.randomMob(2650, -975, 0.8);
|
||||
// spawn.randomBoss(1700, -900, 0.4);
|
||||
// if (game.difficulty > 3) spawn.randomLevelBoss(2200, -1300);
|
||||
},
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
testing() {
|
||||
level.custom = () => {
|
||||
level.playerExitCheck();
|
||||
@@ -358,14 +198,14 @@ const level = {
|
||||
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump
|
||||
spawn.boost(1500, 0, 900);
|
||||
|
||||
// spawn.bomberBoss(2900, -500)
|
||||
spawn.bomberBoss(2900, -500)
|
||||
// spawn.launcherBoss(1200, -500)
|
||||
// spawn.laserTargetingBoss(1600, -400)
|
||||
// spawn.spawner(1600, -500)
|
||||
// spawn.sniper(1700, -120, 50)
|
||||
spawn.sniper(1400, -120)
|
||||
spawn.sniper(1800, -120)
|
||||
spawn.sniper(2200, -120)
|
||||
// spawn.sniper(1400, -120)
|
||||
// spawn.sniper(1800, -120)
|
||||
// spawn.sniper(2200, -120)
|
||||
// spawn.cellBossCulture(1600, -500)
|
||||
// spawn.shooter(1600, -500)
|
||||
// spawn.striker(1600, -500)
|
||||
@@ -2056,4 +1896,239 @@ const level = {
|
||||
|
||||
if (game.difficulty > 3) spawn.randomLevelBoss(1850, -1400, 1);
|
||||
},
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
//******************************************************************************************************************
|
||||
isBuildRun: false,
|
||||
difficultyIncrease(num = 1) {
|
||||
// if (level.isBuildRun) num++
|
||||
for (let i = 0; i < num; i++) {
|
||||
game.difficulty++
|
||||
game.dmgScale += 0.21; //damage done by mobs increases each level
|
||||
b.dmgScale *= 0.91; //damage done by player decreases each level
|
||||
game.accelScale *= 1.027 //mob acceleration increases each level
|
||||
game.lookFreqScale *= 0.974 //mob cycles between looks decreases each level
|
||||
game.CDScale *= 0.964 //mob CD time decreases each level
|
||||
}
|
||||
game.healScale = 1 / (1 + game.difficulty * 0.09) //a higher denominator makes for lower heals // mech.health += heal * game.healScale;
|
||||
},
|
||||
difficultyDecrease(num = 1) { //used in easy mode for game.reset()
|
||||
for (let i = 0; i < num; i++) {
|
||||
game.difficulty--
|
||||
game.dmgScale -= 0.21; //damage done by mobs increases each level
|
||||
if (game.dmgScale < 0.1) game.dmgScale = 0.1;
|
||||
b.dmgScale /= 0.91; //damage done by player decreases each level
|
||||
game.accelScale /= 1.027 //mob acceleration increases each level
|
||||
game.lookFreqScale /= 0.974 //mob cycles between looks decreases each level
|
||||
game.CDScale /= 0.964 //mob CD time decreases each level
|
||||
}
|
||||
if (game.difficulty < 1) game.difficulty = 0;
|
||||
game.healScale = 1 / (1 + game.difficulty * 0.09)
|
||||
},
|
||||
difficultyText(mode = document.getElementById("difficulty-select").value) {
|
||||
if (mode === "0") {
|
||||
return "easy"
|
||||
} else if (mode === "1") {
|
||||
return "normal"
|
||||
} else if (mode === "2") {
|
||||
return "hard"
|
||||
} else if (mode === "4") {
|
||||
return "why"
|
||||
}
|
||||
},
|
||||
levelAnnounce() {
|
||||
if (level.levelsCleared === 0) {
|
||||
document.title = "n-gon: intro (" + level.difficultyText() + ")";
|
||||
} else {
|
||||
document.title = "n-gon: L" + (level.levelsCleared) + " " + level.levels[level.onLevel] + " (" + level.difficultyText() + ")";
|
||||
}
|
||||
},
|
||||
custom() {}, //each level runs it's own custom code (level exits, ...)
|
||||
nextLevel() {
|
||||
level.levelsCleared++;
|
||||
level.onLevel++; //cycles map to next level
|
||||
if (level.onLevel > level.levels.length - 1) level.onLevel = 0;
|
||||
|
||||
level.difficultyIncrease(game.difficultyMode) //increase difficulty based on modes
|
||||
if (game.isEasyMode && level.levelsCleared % 2) level.difficultyDecrease(1);
|
||||
game.clearNow = true; //triggers in game.clearMap to remove all physics bodies and setup for new map
|
||||
if (mod.isHealLowHealth && mech.health < mech.maxHealth * 0.5) {
|
||||
mech.health = mech.maxHealth * 0.5
|
||||
mod.onHealthChange();
|
||||
mech.displayHealth();
|
||||
}
|
||||
},
|
||||
playerExitCheck() {
|
||||
if (
|
||||
player.position.x > level.exit.x &&
|
||||
player.position.x < level.exit.x + 100 &&
|
||||
player.position.y > level.exit.y - 150 &&
|
||||
player.position.y < level.exit.y - 40 &&
|
||||
player.velocity.y < 0.1
|
||||
) {
|
||||
level.nextLevel()
|
||||
}
|
||||
},
|
||||
setPosToSpawn(xPos, yPos) {
|
||||
mech.spawnPos.x = mech.pos.x = xPos;
|
||||
mech.spawnPos.y = mech.pos.y = yPos;
|
||||
level.enter.x = mech.spawnPos.x - 50;
|
||||
level.enter.y = mech.spawnPos.y + 20;
|
||||
mech.transX = mech.transSmoothX = canvas.width2 - mech.pos.x;
|
||||
mech.transY = mech.transSmoothY = canvas.height2 - mech.pos.y;
|
||||
mech.Vx = mech.spawnVel.x;
|
||||
mech.Vy = mech.spawnVel.y;
|
||||
player.force.x = 0;
|
||||
player.force.y = 0;
|
||||
Matter.Body.setPosition(player, mech.spawnPos);
|
||||
Matter.Body.setVelocity(player, mech.spawnVel);
|
||||
},
|
||||
enter: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
draw() {
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(level.enter.x, level.enter.y + 30);
|
||||
ctx.lineTo(level.enter.x, level.enter.y - 80);
|
||||
ctx.bezierCurveTo(level.enter.x, level.enter.y - 170, level.enter.x + 100, level.enter.y - 170, level.enter.x + 100, level.enter.y - 80);
|
||||
ctx.lineTo(level.enter.x + 100, level.enter.y + 30);
|
||||
ctx.lineTo(level.enter.x, level.enter.y + 30);
|
||||
ctx.fillStyle = "#ccc";
|
||||
ctx.fill();
|
||||
}
|
||||
},
|
||||
exit: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
draw() {
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(level.exit.x, level.exit.y + 30);
|
||||
ctx.lineTo(level.exit.x, level.exit.y - 80);
|
||||
ctx.bezierCurveTo(level.exit.x, level.exit.y - 170, level.exit.x + 100, level.exit.y - 170, level.exit.x + 100, level.exit.y - 80);
|
||||
ctx.lineTo(level.exit.x + 100, level.exit.y + 30);
|
||||
ctx.lineTo(level.exit.x, level.exit.y + 30);
|
||||
ctx.fillStyle = "#0ff";
|
||||
ctx.fill();
|
||||
}
|
||||
},
|
||||
fillBG: [],
|
||||
drawFillBGs() {
|
||||
for (let i = 0, len = level.fillBG.length; i < len; ++i) {
|
||||
const f = level.fillBG[i];
|
||||
ctx.fillStyle = f.color;
|
||||
ctx.fillRect(f.x, f.y, f.width, f.height);
|
||||
}
|
||||
},
|
||||
fill: [],
|
||||
drawFills() {
|
||||
for (let i = 0, len = level.fill.length; i < len; ++i) {
|
||||
const f = level.fill[i];
|
||||
ctx.fillStyle = f.color;
|
||||
ctx.fillRect(f.x, f.y, f.width, f.height);
|
||||
}
|
||||
},
|
||||
queryList: [], //queries do actions on many objects in regions
|
||||
checkQuery() {
|
||||
let bounds, action, info;
|
||||
|
||||
function isInZone(targetArray) {
|
||||
let results = Matter.Query.region(targetArray, bounds);
|
||||
for (let i = 0, len = results.length; i < len; ++i) {
|
||||
level.queryActions[action](results[i], info);
|
||||
}
|
||||
}
|
||||
for (let i = 0, len = level.queryList.length; i < len; ++i) {
|
||||
bounds = level.queryList[i].bounds;
|
||||
action = level.queryList[i].action;
|
||||
info = level.queryList[i].info;
|
||||
for (let j = 0, l = level.queryList[i].groups.length; j < l; ++j) {
|
||||
isInZone(level.queryList[i].groups[j]);
|
||||
}
|
||||
}
|
||||
},
|
||||
//oddly query regions can't get smaller than 50 width?
|
||||
addQueryRegion(x, y, width, height, action, groups = [
|
||||
[player], body, mob, powerUp, bullet
|
||||
], info) {
|
||||
level.queryList[level.queryList.length] = {
|
||||
bounds: {
|
||||
min: {
|
||||
x: x,
|
||||
y: y
|
||||
},
|
||||
max: {
|
||||
x: x + width,
|
||||
y: y + height
|
||||
}
|
||||
},
|
||||
action: action,
|
||||
groups: groups,
|
||||
info: info
|
||||
};
|
||||
},
|
||||
queryActions: {
|
||||
bounce(target, info) {
|
||||
//jerky fling upwards
|
||||
Matter.Body.setVelocity(target, {
|
||||
x: info.Vx + (Math.random() - 0.5) * 6,
|
||||
y: info.Vy
|
||||
});
|
||||
target.torque = (Math.random() - 0.5) * 2 * target.mass;
|
||||
},
|
||||
boost(target, yVelocity) {
|
||||
mech.buttonCD_jump = 0; // reset short jump counter to prevent short jumps on boosts
|
||||
mech.hardLandCD = 0 // disable hard landing
|
||||
if (target.velocity.y > 30) {
|
||||
Matter.Body.setVelocity(target, {
|
||||
x: target.velocity.x + (Math.random() - 0.5) * 2,
|
||||
y: -23 //gentle bounce if coming down super fast
|
||||
});
|
||||
} else {
|
||||
Matter.Body.setVelocity(target, {
|
||||
x: target.velocity.x + (Math.random() - 0.5) * 2,
|
||||
y: yVelocity
|
||||
});
|
||||
}
|
||||
|
||||
},
|
||||
force(target, info) {
|
||||
if (target.velocity.y < 0) { //gently force up if already on the way up
|
||||
target.force.x += info.Vx * target.mass;
|
||||
target.force.y += info.Vy * target.mass;
|
||||
} else {
|
||||
target.force.y -= 0.0007 * target.mass; //gently fall in on the way down
|
||||
}
|
||||
},
|
||||
antiGrav(target) {
|
||||
target.force.y -= 0.0011 * target.mass;
|
||||
},
|
||||
death(target) {
|
||||
target.death();
|
||||
}
|
||||
},
|
||||
addToWorld() { //needs to be run to put bodies into the world
|
||||
for (let i = 0; i < body.length; i++) {
|
||||
//body[i].collisionFilter.group = 0;
|
||||
if (body[i] !== mech.holdingTarget) {
|
||||
body[i].collisionFilter.category = cat.body;
|
||||
body[i].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet
|
||||
}
|
||||
body[i].classType = "body";
|
||||
World.add(engine.world, body[i]); //add to world
|
||||
}
|
||||
for (let i = 0; i < map.length; i++) {
|
||||
//map[i].collisionFilter.group = 0;
|
||||
map[i].collisionFilter.category = cat.map;
|
||||
map[i].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet;
|
||||
Matter.Body.setStatic(map[i], true); //make static
|
||||
World.add(engine.world, map[i]); //add to world
|
||||
}
|
||||
for (let i = 0; i < cons.length; i++) {
|
||||
World.add(engine.world, cons[i]);
|
||||
}
|
||||
for (let i = 0; i < consBB.length; i++) {
|
||||
World.add(engine.world, consBB[i]);
|
||||
}
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user