level elevators
This commit is contained in:
13
js/bullet.js
13
js/bullet.js
@@ -41,6 +41,15 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
removeAllGuns() {
|
||||||
|
b.inventory = []; //removes guns and ammo
|
||||||
|
for (let i = 0, len = b.guns.length; i < len; ++i) {
|
||||||
|
b.guns[i].count = 0;
|
||||||
|
b.guns[i].have = false;
|
||||||
|
if (b.guns[i].ammo != Infinity) b.guns[i].ammo = 0;
|
||||||
|
}
|
||||||
|
b.activeGun = null;
|
||||||
|
},
|
||||||
bulletRemove() { //run in main loop
|
bulletRemove() { //run in main loop
|
||||||
//remove bullet if at end cycle for that bullet
|
//remove bullet if at end cycle for that bullet
|
||||||
let i = bullet.length;
|
let i = bullet.length;
|
||||||
@@ -750,7 +759,8 @@ const b = {
|
|||||||
Matter.Body.scale(this, SCALE, SCALE);
|
Matter.Body.scale(this, SCALE, SCALE);
|
||||||
this.lookFrequency = 30;
|
this.lookFrequency = 30;
|
||||||
this.endCycle = game.cycle + Math.floor((1100 + 420 * Math.random()) * mod.isBulletsLastLonger) * 2 //set to double a normal lifespan
|
this.endCycle = game.cycle + Math.floor((1100 + 420 * Math.random()) * mod.isBulletsLastLonger) * 2 //set to double a normal lifespan
|
||||||
// this.dmg *= 1.5;
|
this.dmg *= 1.5;
|
||||||
|
this.frictionAir *= 0.9
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1487,6 +1497,7 @@ const b = {
|
|||||||
// **************************************************************************************************
|
// **************************************************************************************************
|
||||||
// **************************************************************************************************
|
// **************************************************************************************************
|
||||||
giveGuns(gun = "random", ammoPacks = 6) {
|
giveGuns(gun = "random", ammoPacks = 6) {
|
||||||
|
if (mod.isOneGun) b.removeAllGuns();
|
||||||
if (gun === "random") {
|
if (gun === "random") {
|
||||||
//find what guns player doesn't have
|
//find what guns player doesn't have
|
||||||
options = []
|
options = []
|
||||||
|
|||||||
@@ -496,14 +496,7 @@ const game = {
|
|||||||
player.force.y += player.mass * mech.gravity;
|
player.force.y += player.mass * mech.gravity;
|
||||||
},
|
},
|
||||||
reset() { //run on first run, and each later run after you die
|
reset() { //run on first run, and each later run after you die
|
||||||
b.inventory = []; //removes guns and ammo
|
b.removeAllGuns();
|
||||||
for (let i = 0, len = b.guns.length; i < len; ++i) {
|
|
||||||
b.guns[i].count = 0;
|
|
||||||
b.guns[i].have = false;
|
|
||||||
if (b.guns[i].ammo != Infinity) b.guns[i].ammo = 0;
|
|
||||||
}
|
|
||||||
b.activeGun = null;
|
|
||||||
|
|
||||||
mod.setupAllMods(); //sets mods to default values
|
mod.setupAllMods(); //sets mods to default values
|
||||||
b.setFireCD();
|
b.setFireCD();
|
||||||
game.updateModHUD();
|
game.updateModHUD();
|
||||||
|
|||||||
395
js/level.js
395
js/level.js
@@ -21,8 +21,8 @@ const level = {
|
|||||||
// b.giveGuns("maser")
|
// b.giveGuns("maser")
|
||||||
// mech.setField("plasma torch")
|
// mech.setField("plasma torch")
|
||||||
|
|
||||||
// level.testing();
|
|
||||||
level.intro(); //starting level
|
level.intro(); //starting level
|
||||||
|
// level.testing();
|
||||||
// level.testChamber()
|
// level.testChamber()
|
||||||
// level.sewers();
|
// level.sewers();
|
||||||
// level.satellite();
|
// level.satellite();
|
||||||
@@ -61,150 +61,16 @@ const level = {
|
|||||||
//******************************************************************************************************************
|
//******************************************************************************************************************
|
||||||
//******************************************************************************************************************
|
//******************************************************************************************************************
|
||||||
//******************************************************************************************************************
|
//******************************************************************************************************************
|
||||||
portal(centerA, angleA, centerB, angleB) {
|
|
||||||
const width = 50
|
|
||||||
const height = 150
|
|
||||||
const mapWidth = 200
|
|
||||||
const unitA = Matter.Vector.rotate({
|
|
||||||
x: 1,
|
|
||||||
y: 0
|
|
||||||
}, angleA)
|
|
||||||
const unitB = Matter.Vector.rotate({
|
|
||||||
x: 1,
|
|
||||||
y: 0
|
|
||||||
}, angleB)
|
|
||||||
|
|
||||||
draw = function () {
|
|
||||||
ctx.beginPath(); //portal
|
|
||||||
sensor = this.vertices;
|
|
||||||
ctx.moveTo(sensor[0].x, sensor[0].y);
|
|
||||||
for (let i = 1; i < sensor.length; ++i) {
|
|
||||||
ctx.lineTo(sensor[i].x, sensor[i].y);
|
|
||||||
}
|
|
||||||
ctx.fillStyle = this.color
|
|
||||||
ctx.fill();
|
|
||||||
}
|
|
||||||
query = function () {
|
|
||||||
if (Matter.Query.collides(this, [player]).length === 0) { //not touching player
|
|
||||||
if (player.isInPortal === this) player.isInPortal = null
|
|
||||||
} else if (player.isInPortal !== this) { //touching player
|
|
||||||
if (mech.buttonCD_jump === mech.cycle) player.force.y = 0 // undo a jump right before entering the portal
|
|
||||||
mech.buttonCD_jump = 0 //disable short jumps when letting go of jump key
|
|
||||||
//teleport
|
|
||||||
player.isInPortal = this.portalPair
|
|
||||||
if (this.portalPair.angle % (Math.PI / 2)) { //if left, right up or down
|
|
||||||
Matter.Body.setPosition(player, this.portalPair.portal.position);
|
|
||||||
} else { //if at some odd angle
|
|
||||||
Matter.Body.setPosition(player, this.portalPair.position);
|
|
||||||
}
|
|
||||||
//rotate velocity
|
|
||||||
let mag
|
|
||||||
if (this.portalPair.angle !== 0 && this.portalPair.angle !== Math.PI) { //portal that fires the player up
|
|
||||||
mag = Math.max(10, Math.min(50, player.velocity.y * 0.8)) + 11
|
|
||||||
} else {
|
|
||||||
mag = Math.max(3, Math.min(50, Vector.magnitude(player.velocity)))
|
|
||||||
}
|
|
||||||
let v = Vector.mult(this.portalPair.unit, mag)
|
|
||||||
Matter.Body.setVelocity(player, v);
|
|
||||||
// move bots to follow player
|
|
||||||
for (let i = 0; i < bullet.length; i++) {
|
|
||||||
if (bullet[i].isBot) {
|
|
||||||
Matter.Body.setPosition(bullet[i], this.portalPair.portal.position);
|
|
||||||
Matter.Body.setVelocity(bullet[i], {
|
|
||||||
x: 0,
|
|
||||||
y: 0
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//remove block if touching
|
|
||||||
touching = Matter.Query.collides(this, body)
|
|
||||||
if (touching.length !== 0) {
|
|
||||||
if (body.length) {
|
|
||||||
for (let i = 0; i < body.length; i++) {
|
|
||||||
if (body[i] === touching[0].bodyB) {
|
|
||||||
body.splice(i, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Matter.World.remove(engine.world, touching[0].bodyB);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const portalA = composite[composite.length] = Bodies.rectangle(centerA.x, centerA.y, width, height, {
|
|
||||||
isSensor: true,
|
|
||||||
angle: angleA,
|
|
||||||
color: "hsla(197, 100%, 50%,0.7)",
|
|
||||||
draw: draw,
|
|
||||||
});
|
|
||||||
const portalB = composite[composite.length] = Bodies.rectangle(centerB.x, centerB.y, width, height, {
|
|
||||||
isSensor: true,
|
|
||||||
angle: angleB,
|
|
||||||
color: "hsla(29, 100%, 50%, 0.7)",
|
|
||||||
draw: draw
|
|
||||||
});
|
|
||||||
const mapA = composite[composite.length] = Bodies.rectangle(centerA.x - 0.5 * unitA.x * mapWidth, centerA.y - 0.5 * unitA.y * mapWidth, mapWidth, height + 10, {
|
|
||||||
collisionFilter: {
|
|
||||||
category: cat.map,
|
|
||||||
mask: cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet //cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
|
|
||||||
},
|
|
||||||
unit: unitA,
|
|
||||||
angle: angleA,
|
|
||||||
color: game.draw.mapFill,
|
|
||||||
draw: draw,
|
|
||||||
query: query,
|
|
||||||
lastPortalCycle: 0
|
|
||||||
});
|
|
||||||
Matter.Body.setStatic(mapA, true); //make static
|
|
||||||
World.add(engine.world, mapA); //add to world
|
|
||||||
|
|
||||||
const mapB = composite[composite.length] = Bodies.rectangle(centerB.x - 0.5 * unitB.x * mapWidth, centerB.y - 0.5 * unitB.y * mapWidth, mapWidth, height + 10, {
|
|
||||||
collisionFilter: {
|
|
||||||
category: cat.map,
|
|
||||||
mask: cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet //cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
|
|
||||||
},
|
|
||||||
unit: unitB,
|
|
||||||
angle: angleB,
|
|
||||||
color: game.draw.mapFill,
|
|
||||||
draw: draw,
|
|
||||||
query: query,
|
|
||||||
lastPortalCycle: 0
|
|
||||||
});
|
|
||||||
Matter.Body.setStatic(mapB, true); //make static
|
|
||||||
World.add(engine.world, mapB); //add to world
|
|
||||||
|
|
||||||
mapA.portal = portalA
|
|
||||||
mapB.portal = portalB
|
|
||||||
mapA.portalPair = mapB
|
|
||||||
mapB.portalPair = mapA
|
|
||||||
return [portalA, portalB, mapA, mapB]
|
|
||||||
},
|
|
||||||
testChamber() {
|
testChamber() {
|
||||||
level.setPosToSpawn(0, -50); //lower start
|
level.setPosToSpawn(0, -50); //lower start
|
||||||
level.exit.y = level.enter.y - 550;
|
level.exit.y = level.enter.y - 550;
|
||||||
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
|
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
|
||||||
level.exit.x = level.enter.x;
|
level.exit.x = level.enter.x;
|
||||||
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20);
|
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20);
|
||||||
level.defaultZoom = 2000
|
level.defaultZoom = 2200
|
||||||
game.zoomTransition(level.defaultZoom)
|
game.zoomTransition(level.defaultZoom)
|
||||||
document.body.style.backgroundColor = "#d5d5d5";
|
document.body.style.backgroundColor = "#d5d5d5";
|
||||||
|
|
||||||
// level.fillBG.push({ //full map white
|
|
||||||
// x: -375,
|
|
||||||
// y: -3700,
|
|
||||||
// width: 2975,
|
|
||||||
// height: 3800,
|
|
||||||
// color: "#ddd"
|
|
||||||
// });
|
|
||||||
|
|
||||||
level.fillBG.push({ //exit room
|
|
||||||
x: -300,
|
|
||||||
y: -1000,
|
|
||||||
width: 650,
|
|
||||||
height: 500,
|
|
||||||
color: "#d4f4f4"
|
|
||||||
});
|
|
||||||
const portal = level.portal({
|
const portal = level.portal({
|
||||||
x: 2500,
|
x: 2500,
|
||||||
y: -75
|
y: -75
|
||||||
@@ -212,7 +78,6 @@ const level = {
|
|||||||
x: 2500,
|
x: 2500,
|
||||||
y: -3075
|
y: -3075
|
||||||
}, Math.PI) //left
|
}, Math.PI) //left
|
||||||
|
|
||||||
const portal2 = level.portal({
|
const portal2 = level.portal({
|
||||||
x: 75,
|
x: 75,
|
||||||
y: -2150
|
y: -2150
|
||||||
@@ -220,7 +85,6 @@ const level = {
|
|||||||
x: 1325,
|
x: 1325,
|
||||||
y: -2150
|
y: -2150
|
||||||
}, -Math.PI / 2) //up
|
}, -Math.PI / 2) //up
|
||||||
|
|
||||||
const portal3 = level.portal({
|
const portal3 = level.portal({
|
||||||
x: 1850,
|
x: 1850,
|
||||||
y: -585
|
y: -585
|
||||||
@@ -228,6 +92,7 @@ const level = {
|
|||||||
x: 2425,
|
x: 2425,
|
||||||
y: -600
|
y: -600
|
||||||
}, -2 * Math.PI / 3) //up left
|
}, -2 * Math.PI / 3) //up left
|
||||||
|
|
||||||
const hazard = level.hazard(350, -2025, 700, 10, 0.4, "hsl(0, 100%, 50%)") //laser
|
const hazard = level.hazard(350, -2025, 700, 10, 0.4, "hsl(0, 100%, 50%)") //laser
|
||||||
const hazard2 = level.hazard(1775, -2550, 150, 10, 0.4, "hsl(0, 100%, 50%)") //laser
|
const hazard2 = level.hazard(1775, -2550, 150, 10, 0.4, "hsl(0, 100%, 50%)") //laser
|
||||||
const button = level.button(2100, -2600)
|
const button = level.button(2100, -2600)
|
||||||
@@ -285,7 +150,13 @@ const level = {
|
|||||||
}]);
|
}]);
|
||||||
powerUps.chooseRandomPowerUp(powerUpPos[0].x, powerUpPos[0].y);
|
powerUps.chooseRandomPowerUp(powerUpPos[0].x, powerUpPos[0].y);
|
||||||
powerUps.chooseRandomPowerUp(powerUpPos[1].x, powerUpPos[1].y);
|
powerUps.chooseRandomPowerUp(powerUpPos[1].x, powerUpPos[1].y);
|
||||||
|
level.fillBG.push({ //exit room
|
||||||
|
x: -300,
|
||||||
|
y: -1000,
|
||||||
|
width: 650,
|
||||||
|
height: 500,
|
||||||
|
color: "#d4f4f4"
|
||||||
|
});
|
||||||
//outer wall
|
//outer wall
|
||||||
spawn.mapRect(-1400, -3800, 1100, 3900); //left map wall
|
spawn.mapRect(-1400, -3800, 1100, 3900); //left map wall
|
||||||
spawn.mapRect(2500, -2975, 1200, 2825); //right map middle wall above right portal
|
spawn.mapRect(2500, -2975, 1200, 2825); //right map middle wall above right portal
|
||||||
@@ -624,12 +495,12 @@ const level = {
|
|||||||
// spawn.sniper(1800, -120)
|
// spawn.sniper(1800, -120)
|
||||||
// spawn.sniper(2200, -120)
|
// spawn.sniper(2200, -120)
|
||||||
// spawn.cellBossCulture(1600, -500)
|
// spawn.cellBossCulture(1600, -500)
|
||||||
spawn.starter(1600, -500, 60)
|
// spawn.starter(1600, -500, 60)
|
||||||
// spawn.striker(1600, -500)
|
// spawn.striker(1600, -500)
|
||||||
// spawn.shield(mob[mob.length - 1], 1200, -500, 1);
|
// spawn.shield(mob[mob.length - 1], 1200, -500, 1);
|
||||||
|
|
||||||
// spawn.nodeBoss(1200, -500, "launcher")
|
// spawn.nodeBoss(1200, -500, "launcher")
|
||||||
// spawn.spiderBoss(1200, -500)
|
spawn.spiderBoss(1200, -500)
|
||||||
// spawn.timeSkipBoss(2900, -500)
|
// spawn.timeSkipBoss(2900, -500)
|
||||||
// spawn.randomMob(1600, -500)
|
// spawn.randomMob(1600, -500)
|
||||||
},
|
},
|
||||||
@@ -819,10 +690,27 @@ const level = {
|
|||||||
spawn.wireHead();
|
spawn.wireHead();
|
||||||
},
|
},
|
||||||
satellite() {
|
satellite() {
|
||||||
|
const elevator = level.platform(4210, -1325, 380, 30, -10)
|
||||||
level.custom = () => {
|
level.custom = () => {
|
||||||
level.playerExitCheck();
|
level.playerExitCheck();
|
||||||
};
|
};
|
||||||
level.customTopLayer = () => {};
|
level.customTopLayer = () => {
|
||||||
|
//elevator move
|
||||||
|
if (elevator.pauseUntilCycle < game.cycle && !mech.isBodiesAsleep) {
|
||||||
|
if (elevator.plat.position.y > -1275) { //bottom
|
||||||
|
elevator.plat.speed = -10
|
||||||
|
elevator.pauseUntilCycle = game.cycle + 90
|
||||||
|
} else if (elevator.plat.position.y < -3455) { //top
|
||||||
|
elevator.plat.speed = 30
|
||||||
|
elevator.pauseUntilCycle = game.cycle + 90
|
||||||
|
}
|
||||||
|
elevator.plat.position = {
|
||||||
|
x: elevator.plat.position.x,
|
||||||
|
y: elevator.plat.position.y + elevator.plat.speed
|
||||||
|
}
|
||||||
|
elevator.pointA = elevator.plat.position
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
level.setPosToSpawn(-50, -50); //normal spawn
|
level.setPosToSpawn(-50, -50); //normal spawn
|
||||||
level.exit.x = -100;
|
level.exit.x = -100;
|
||||||
@@ -952,32 +840,35 @@ const level = {
|
|||||||
});
|
});
|
||||||
spawn.mapRect(3925, -300, 425, 50);
|
spawn.mapRect(3925, -300, 425, 50);
|
||||||
spawn.mapRect(4700, -375, 425, 50);
|
spawn.mapRect(4700, -375, 425, 50);
|
||||||
spawn.mapRect(4000, -1300, 1050, 100);
|
// spawn.mapRect(4000, -1300, 1050, 100);
|
||||||
|
spawn.mapRect(4000, -1300, 200, 100);
|
||||||
|
spawn.mapRect(4600, -1300, 450, 100);
|
||||||
|
|
||||||
//steep stairs
|
//steep stairs
|
||||||
spawn.mapRect(4100, -1700, 100, 100);
|
// spawn.mapRect(4100, -1700, 100, 100);
|
||||||
spawn.mapRect(4200, -2050, 100, 450);
|
// spawn.mapRect(4200, -2050, 100, 450);
|
||||||
spawn.mapRect(4300, -2400, 100, 800);
|
// spawn.mapRect(4300, -2400, 100, 800);
|
||||||
spawn.mapRect(4400, -2750, 100, 1150);
|
// spawn.mapRect(4400, -2750, 100, 1150);
|
||||||
spawn.mapRect(4500, -3100, 100, 1500);
|
// spawn.mapRect(4500, -3100, 100, 1500);
|
||||||
|
spawn.mapRect(4100, -2250, 100, 650);
|
||||||
|
spawn.mapRect(4100, -3450, 100, 650); //left top shelf
|
||||||
spawn.mapRect(4600, -3450, 100, 1850);
|
spawn.mapRect(4600, -3450, 100, 1850);
|
||||||
spawn.mapRect(4100, -3450, 100, 700); //left top shelf
|
// spawn.mapRect(4200, -3450, 100, 400); //left top shelf
|
||||||
spawn.mapRect(4200, -3450, 100, 400); //left top shelf
|
// spawn.mapRect(4300, -3450, 100, 100); //left top shelf
|
||||||
spawn.mapRect(4300, -3450, 100, 100); //left top shelf
|
|
||||||
level.fill.push({
|
level.fill.push({
|
||||||
x: 4100,
|
x: 4100,
|
||||||
y: -3450,
|
y: -3450,
|
||||||
width: 500,
|
|
||||||
height: 1750,
|
|
||||||
color: "rgba(0,20,40,0.1)"
|
|
||||||
});
|
|
||||||
level.fill.push({
|
|
||||||
x: 4100,
|
|
||||||
y: -1600,
|
|
||||||
width: 600,
|
width: 600,
|
||||||
height: 300,
|
height: 2250,
|
||||||
color: "rgba(0,20,40,0.13)"
|
color: "rgba(0,20,40,0.13)"
|
||||||
});
|
});
|
||||||
|
// level.fill.push({
|
||||||
|
// x: 4100,
|
||||||
|
// y: -1600,
|
||||||
|
// width: 600,
|
||||||
|
// height: 300,
|
||||||
|
// color: "rgba(0,20,40,0.13)"
|
||||||
|
// });
|
||||||
|
|
||||||
spawn.randomSmallMob(4400, -3500);
|
spawn.randomSmallMob(4400, -3500);
|
||||||
spawn.randomSmallMob(4800, -800);
|
spawn.randomSmallMob(4800, -800);
|
||||||
@@ -1221,11 +1112,15 @@ const level = {
|
|||||||
powerUps.addRerollToLevel() //needs to run after mobs are spawned
|
powerUps.addRerollToLevel() //needs to run after mobs are spawned
|
||||||
},
|
},
|
||||||
aerie() {
|
aerie() {
|
||||||
|
// const elevator = level.platform(4112, -2300, 280, 50)
|
||||||
|
|
||||||
level.custom = () => {
|
level.custom = () => {
|
||||||
level.playerExitCheck();
|
level.playerExitCheck();
|
||||||
};
|
};
|
||||||
level.customTopLayer = () => {};
|
level.customTopLayer = () => {
|
||||||
// game.setZoom(3000);
|
// elevator.move()
|
||||||
|
};
|
||||||
|
|
||||||
// game.difficulty = 4; //for testing to simulate possible mobs spawns
|
// game.difficulty = 4; //for testing to simulate possible mobs spawns
|
||||||
level.defaultZoom = 2100
|
level.defaultZoom = 2100
|
||||||
game.zoomTransition(level.defaultZoom)
|
game.zoomTransition(level.defaultZoom)
|
||||||
@@ -1270,14 +1165,14 @@ const level = {
|
|||||||
x: 3700,
|
x: 3700,
|
||||||
y: -3150,
|
y: -3150,
|
||||||
width: 1100,
|
width: 1100,
|
||||||
height: 900,
|
height: 950,
|
||||||
color: "rgba(0,0,0,0.1)"
|
color: "rgba(0,0,0,0.1)"
|
||||||
});
|
});
|
||||||
|
|
||||||
//background
|
//background
|
||||||
level.fillBG.push({
|
level.fillBG.push({
|
||||||
x: 4200,
|
x: 4200,
|
||||||
y: -2250,
|
y: -2200,
|
||||||
width: 100,
|
width: 100,
|
||||||
height: 2600,
|
height: 2600,
|
||||||
color: "#c7c7ca"
|
color: "#c7c7ca"
|
||||||
@@ -2561,6 +2456,52 @@ const level = {
|
|||||||
World.add(engine.world, consBB[i]);
|
World.add(engine.world, consBB[i]);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
platform(x, y, width, height, speed) {
|
||||||
|
x = x + width / 2
|
||||||
|
y = y + height / 2
|
||||||
|
const who = body[body.length] = Bodies.rectangle(x, y, width, height, {
|
||||||
|
collisionFilter: {
|
||||||
|
category: cat.body,
|
||||||
|
mask: cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet //cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
|
||||||
|
},
|
||||||
|
inertia: Infinity, //prevents rotation
|
||||||
|
isNotSticky: true,
|
||||||
|
isNotHoldable: true,
|
||||||
|
friction: 1,
|
||||||
|
frictionStatic: 1,
|
||||||
|
restitution: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
const constraint = Constraint.create({ //fix rotor in place, but allow rotation
|
||||||
|
pointA: {
|
||||||
|
x: x,
|
||||||
|
y: y
|
||||||
|
},
|
||||||
|
bodyB: who,
|
||||||
|
stiffness: 0.1,
|
||||||
|
damping: 0.3
|
||||||
|
});
|
||||||
|
World.add(engine.world, constraint);
|
||||||
|
constraint.plat = {
|
||||||
|
position: who.position,
|
||||||
|
speed: speed,
|
||||||
|
}
|
||||||
|
|
||||||
|
// constraint.move = function () {
|
||||||
|
// if (this.plat.position.y > 350) {
|
||||||
|
// this.plat.speed = speed
|
||||||
|
// } else if (this.plat.position.y < -2435) {
|
||||||
|
// this.plat.speed = -speed
|
||||||
|
// }
|
||||||
|
// this.plat.position = {
|
||||||
|
// x: this.plat.position.x,
|
||||||
|
// y: this.plat.position.y + this.plat.speed
|
||||||
|
// }
|
||||||
|
// this.pointA = this.plat.position
|
||||||
|
// }
|
||||||
|
constraint.pauseUntilCycle = 0 //to to pause platform at top and bottom
|
||||||
|
return constraint
|
||||||
|
},
|
||||||
rotor(x, y, rotate = 0, radius = 900, width = 50, density = 0.0005) {
|
rotor(x, y, rotate = 0, radius = 900, width = 50, density = 0.0005) {
|
||||||
const rotor1 = Matter.Bodies.rectangle(x, y, width, radius, {
|
const rotor1 = Matter.Bodies.rectangle(x, y, width, radius, {
|
||||||
density: density,
|
density: density,
|
||||||
@@ -2678,6 +2619,125 @@ const level = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
portal(centerA, angleA, centerB, angleB) {
|
||||||
|
const width = 50
|
||||||
|
const height = 150
|
||||||
|
const mapWidth = 200
|
||||||
|
const unitA = Matter.Vector.rotate({
|
||||||
|
x: 1,
|
||||||
|
y: 0
|
||||||
|
}, angleA)
|
||||||
|
const unitB = Matter.Vector.rotate({
|
||||||
|
x: 1,
|
||||||
|
y: 0
|
||||||
|
}, angleB)
|
||||||
|
|
||||||
|
draw = function () {
|
||||||
|
ctx.beginPath(); //portal
|
||||||
|
sensor = this.vertices;
|
||||||
|
ctx.moveTo(sensor[0].x, sensor[0].y);
|
||||||
|
for (let i = 1; i < sensor.length; ++i) {
|
||||||
|
ctx.lineTo(sensor[i].x, sensor[i].y);
|
||||||
|
}
|
||||||
|
ctx.fillStyle = this.color
|
||||||
|
ctx.fill();
|
||||||
|
}
|
||||||
|
query = function () {
|
||||||
|
if (Matter.Query.collides(this, [player]).length === 0) { //not touching player
|
||||||
|
if (player.isInPortal === this) player.isInPortal = null
|
||||||
|
} else if (player.isInPortal !== this) { //touching player
|
||||||
|
if (mech.buttonCD_jump === mech.cycle) player.force.y = 0 // undo a jump right before entering the portal
|
||||||
|
mech.buttonCD_jump = 0 //disable short jumps when letting go of jump key
|
||||||
|
//teleport
|
||||||
|
player.isInPortal = this.portalPair
|
||||||
|
if (this.portalPair.angle % (Math.PI / 2)) { //if left, right up or down
|
||||||
|
Matter.Body.setPosition(player, this.portalPair.portal.position);
|
||||||
|
} else { //if at some odd angle
|
||||||
|
Matter.Body.setPosition(player, this.portalPair.position);
|
||||||
|
}
|
||||||
|
//rotate velocity
|
||||||
|
let mag
|
||||||
|
if (this.portalPair.angle !== 0 && this.portalPair.angle !== Math.PI) { //portal that fires the player up
|
||||||
|
mag = Math.max(10, Math.min(50, player.velocity.y * 0.8)) + 11
|
||||||
|
} else {
|
||||||
|
mag = Math.max(3, Math.min(50, Vector.magnitude(player.velocity)))
|
||||||
|
}
|
||||||
|
let v = Vector.mult(this.portalPair.unit, mag)
|
||||||
|
Matter.Body.setVelocity(player, v);
|
||||||
|
// move bots to follow player
|
||||||
|
for (let i = 0; i < bullet.length; i++) {
|
||||||
|
if (bullet[i].isBot) {
|
||||||
|
Matter.Body.setPosition(bullet[i], this.portalPair.portal.position);
|
||||||
|
Matter.Body.setVelocity(bullet[i], {
|
||||||
|
x: 0,
|
||||||
|
y: 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//remove block if touching
|
||||||
|
touching = Matter.Query.collides(this, body)
|
||||||
|
if (touching.length !== 0) {
|
||||||
|
if (body.length) {
|
||||||
|
for (let i = 0; i < body.length; i++) {
|
||||||
|
if (body[i] === touching[0].bodyB) {
|
||||||
|
body.splice(i, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Matter.World.remove(engine.world, touching[0].bodyB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const portalA = composite[composite.length] = Bodies.rectangle(centerA.x, centerA.y, width, height, {
|
||||||
|
isSensor: true,
|
||||||
|
angle: angleA,
|
||||||
|
color: "hsla(197, 100%, 50%,0.7)",
|
||||||
|
draw: draw,
|
||||||
|
});
|
||||||
|
const portalB = composite[composite.length] = Bodies.rectangle(centerB.x, centerB.y, width, height, {
|
||||||
|
isSensor: true,
|
||||||
|
angle: angleB,
|
||||||
|
color: "hsla(29, 100%, 50%, 0.7)",
|
||||||
|
draw: draw
|
||||||
|
});
|
||||||
|
const mapA = composite[composite.length] = Bodies.rectangle(centerA.x - 0.5 * unitA.x * mapWidth, centerA.y - 0.5 * unitA.y * mapWidth, mapWidth, height + 10, {
|
||||||
|
collisionFilter: {
|
||||||
|
category: cat.map,
|
||||||
|
mask: cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet //cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
|
||||||
|
},
|
||||||
|
unit: unitA,
|
||||||
|
angle: angleA,
|
||||||
|
color: game.draw.mapFill,
|
||||||
|
draw: draw,
|
||||||
|
query: query,
|
||||||
|
lastPortalCycle: 0
|
||||||
|
});
|
||||||
|
Matter.Body.setStatic(mapA, true); //make static
|
||||||
|
World.add(engine.world, mapA); //add to world
|
||||||
|
|
||||||
|
const mapB = composite[composite.length] = Bodies.rectangle(centerB.x - 0.5 * unitB.x * mapWidth, centerB.y - 0.5 * unitB.y * mapWidth, mapWidth, height + 10, {
|
||||||
|
collisionFilter: {
|
||||||
|
category: cat.map,
|
||||||
|
mask: cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet //cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
|
||||||
|
},
|
||||||
|
unit: unitB,
|
||||||
|
angle: angleB,
|
||||||
|
color: game.draw.mapFill,
|
||||||
|
draw: draw,
|
||||||
|
query: query,
|
||||||
|
lastPortalCycle: 0
|
||||||
|
});
|
||||||
|
Matter.Body.setStatic(mapB, true); //make static
|
||||||
|
World.add(engine.world, mapB); //add to world
|
||||||
|
|
||||||
|
mapA.portal = portalA
|
||||||
|
mapB.portal = portalB
|
||||||
|
mapA.portalPair = mapB
|
||||||
|
mapB.portalPair = mapA
|
||||||
|
return [portalA, portalB, mapA, mapB]
|
||||||
|
},
|
||||||
hazard(x, y, width, height, damage = 0.0005, color = "hsla(160, 100%, 35%,0.75)") {
|
hazard(x, y, width, height, damage = 0.0005, color = "hsla(160, 100%, 35%,0.75)") {
|
||||||
return {
|
return {
|
||||||
min: {
|
min: {
|
||||||
@@ -2694,11 +2754,18 @@ const level = {
|
|||||||
isOn: true,
|
isOn: true,
|
||||||
query() {
|
query() {
|
||||||
if (this.isOn && this.height > 0 && Matter.Query.region([player], this).length && !mech.isStealth) {
|
if (this.isOn && this.height > 0 && Matter.Query.region([player], this).length && !mech.isStealth) {
|
||||||
if (damage < 0.01) {
|
if (damage < 0.02) {
|
||||||
mech.damage(damage)
|
mech.damage(damage)
|
||||||
} else if (mech.immuneCycle < mech.cycle) {
|
} else if (mech.immuneCycle < mech.cycle) {
|
||||||
mech.immuneCycle = mech.cycle + mod.collisionImmuneCycles;
|
mech.immuneCycle = mech.cycle + mod.collisionImmuneCycles;
|
||||||
mech.damage(damage)
|
mech.damage(damage)
|
||||||
|
game.drawList.push({ //add dmg to draw queue
|
||||||
|
x: player.position.x,
|
||||||
|
y: player.position.y,
|
||||||
|
radius: damage * 1500,
|
||||||
|
color: game.mobDmgColor,
|
||||||
|
time: 20
|
||||||
|
});
|
||||||
}
|
}
|
||||||
const drain = 0.005
|
const drain = 0.005
|
||||||
if (mech.energy > drain) mech.energy -= drain
|
if (mech.energy > drain) mech.energy -= drain
|
||||||
|
|||||||
22
js/mods.js
22
js/mods.js
@@ -79,12 +79,28 @@ const mod = {
|
|||||||
if (mod.isEnergyDamage) dmg *= 1 + mech.energy / 5.5;
|
if (mod.isEnergyDamage) dmg *= 1 + mech.energy / 5.5;
|
||||||
if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.006
|
if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.006
|
||||||
if (mod.isRerollDamage) dmg *= 1 + 0.05 * powerUps.reroll.rerolls
|
if (mod.isRerollDamage) dmg *= 1 + 0.05 * powerUps.reroll.rerolls
|
||||||
|
if (mod.isOneGun && b.inventory.length < 2) dmg *= 1.25
|
||||||
return dmg * mod.slowFire
|
return dmg * mod.slowFire
|
||||||
},
|
},
|
||||||
totalBots() {
|
totalBots() {
|
||||||
return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount + mod.boomBotCount + mod.plasmaBotCount
|
return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount + mod.boomBotCount + mod.plasmaBotCount
|
||||||
},
|
},
|
||||||
mods: [{
|
mods: [{
|
||||||
|
name: "integrated armament",
|
||||||
|
description: "increase <strong class='color-d'>damage</strong> by <strong>25%</strong><br>your inventory can only hold <strong>1 gun</strong>",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return b.inventory.length < 2
|
||||||
|
},
|
||||||
|
requires: "no more than 1 gun",
|
||||||
|
effect() {
|
||||||
|
mod.isOneGun = true;
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
mod.isOneGun = false;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
name: "capacitor",
|
name: "capacitor",
|
||||||
// nameInfo: "<span id='mod-capacitor'></span>",
|
// nameInfo: "<span id='mod-capacitor'></span>",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>1%</strong><br>for every <strong>5.5%</strong> stored <strong class='color-f'>energy</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>1%</strong><br>for every <strong>5.5%</strong> stored <strong class='color-f'>energy</strong>",
|
||||||
@@ -1804,7 +1820,7 @@ const mod = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "harvester",
|
name: "harvester",
|
||||||
description: "when <strong>drones</strong> pick up <strong>power ups</strong><br> improve drone size, lifespan, and vision rate",
|
description: "when a <strong>drone</strong> picks up a <strong>power up</strong><br> improve its size, duration, and vision rate",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -2471,6 +2487,6 @@ const mod = {
|
|||||||
isRerollBots: null,
|
isRerollBots: null,
|
||||||
isRailTimeSlow: null,
|
isRailTimeSlow: null,
|
||||||
isBotUpgrade: null,
|
isBotUpgrade: null,
|
||||||
isDroneGrab: null
|
isDroneGrab: null,
|
||||||
// isMaxHealthRemove: null
|
isOneGun: null
|
||||||
}
|
}
|
||||||
@@ -498,12 +498,12 @@ const powerUps = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
spawnStartingPowerUps(x, y) { //used for map specific power ups, mostly to give player a starting gun
|
spawnStartingPowerUps(x, y) { //used for map specific power ups, mostly to give player a starting gun
|
||||||
if (level.levelsCleared < 5) {
|
if (level.levelsCleared < 6) {
|
||||||
if (b.inventory.length === 0) {
|
if (b.inventory.length === 0) {
|
||||||
powerUps.spawn(x, y, "gun", false);
|
powerUps.spawn(x, y, "gun", false);
|
||||||
} else if (mod.totalCount === 0) {
|
} else if (mod.totalCount === 0) {
|
||||||
powerUps.spawn(x, y, "mod", false); //starting gun
|
powerUps.spawn(x, y, "mod", false); //starting gun
|
||||||
} else if (b.inventory.length < 2) {
|
} else if (b.inventory.length < 2 && Math.random() < 0.5) {
|
||||||
powerUps.spawn(x, y, "gun", false);
|
powerUps.spawn(x, y, "gun", false);
|
||||||
} else {
|
} else {
|
||||||
powerUps.spawnRandomPowerUp(x, y);
|
powerUps.spawnRandomPowerUp(x, y);
|
||||||
|
|||||||
30
js/spawn.js
30
js/spawn.js
@@ -652,6 +652,7 @@ const spawn = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
spiderBoss(x, y, radius = 60 + Math.ceil(Math.random() * 10)) {
|
spiderBoss(x, y, radius = 60 + Math.ceil(Math.random() * 10)) {
|
||||||
|
const isDaddyLongLegs = Math.random() < 0.3
|
||||||
let targets = [] //track who is in the node boss, for shields
|
let targets = [] //track who is in the node boss, for shields
|
||||||
mobs.spawn(x, y, 6, radius, "#b386e8");
|
mobs.spawn(x, y, 6, radius, "#b386e8");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
@@ -692,7 +693,8 @@ const spawn = {
|
|||||||
});
|
});
|
||||||
cons[len2].length = 100 + 1.5 * radius;
|
cons[len2].length = 100 + 1.5 * radius;
|
||||||
me.cons2 = cons[len2];
|
me.cons2 = cons[len2];
|
||||||
// Matter.Body.setDensity(me, 0.001); //extra dense //normal is 0.001 //makes effective life much larger
|
if (isDaddyLongLegs) Matter.Body.setDensity(me, 0.005); //extra dense //normal is 0.001 //makes effective life much larger
|
||||||
|
|
||||||
me.onDeath = function () {
|
me.onDeath = function () {
|
||||||
this.removeCons();
|
this.removeCons();
|
||||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||||
@@ -705,7 +707,7 @@ const spawn = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
radius = 22 // radius of each node mob
|
radius = 22 // radius of each node mob
|
||||||
const sideLength = 100 // distance between each node mob
|
const sideLength = isDaddyLongLegs ? 50 : 100 // distance between each node mob
|
||||||
const nodes = 6
|
const nodes = 6
|
||||||
const angle = 2 * Math.PI / nodes
|
const angle = 2 * Math.PI / nodes
|
||||||
|
|
||||||
@@ -713,23 +715,23 @@ const spawn = {
|
|||||||
|
|
||||||
for (let i = 0; i < nodes; ++i) {
|
for (let i = 0; i < nodes; ++i) {
|
||||||
spawn.stabber(x + sideLength * Math.sin(i * angle), y + sideLength * Math.cos(i * angle), radius, 12);
|
spawn.stabber(x + sideLength * Math.sin(i * angle), y + sideLength * Math.cos(i * angle), radius, 12);
|
||||||
// const who = mob[mob.length - 1]
|
if (isDaddyLongLegs) Matter.Body.setDensity(mob[mob.length - 1], 0.005); //extra dense //normal is 0.001 //makes effective life much larger
|
||||||
// who.frictionAir = 0.06
|
|
||||||
// who.accelMag = 0.005 * game.accelScale
|
|
||||||
|
|
||||||
targets.push(mob[mob.length - 1].id) //track who is in the node boss, for shields
|
targets.push(mob[mob.length - 1].id) //track who is in the node boss, for shields
|
||||||
}
|
}
|
||||||
//spawn shield for entire boss
|
//spawn shield around all nodes
|
||||||
spawn.bossShield(targets, x, y, sideLength + 1 * radius + nodes * 5 - 25);
|
if (!isDaddyLongLegs) spawn.bossShield(targets, x, y, sideLength + 1 * radius + nodes * 5 - 25);
|
||||||
spawn.allowShields = true;
|
spawn.allowShields = true;
|
||||||
|
|
||||||
spawn.constrain2AdjacentMobs(nodes + 1, 0.05, true); //loop mobs together
|
const attachmentStiffness = isDaddyLongLegs ? 0.0001 : 0.05
|
||||||
|
if (!isDaddyLongLegs) spawn.constrain2AdjacentMobs(nodes + 2, attachmentStiffness, true); //loop mobs together
|
||||||
for (let i = 0; i < nodes; ++i) { //attach to center mob
|
for (let i = 0; i < nodes; ++i) { //attach to center mob
|
||||||
consBB[consBB.length] = Constraint.create({
|
consBB[consBB.length] = Constraint.create({
|
||||||
bodyA: me,
|
bodyA: me,
|
||||||
bodyB: mob[mob.length - i - 1],
|
bodyB: mob[mob.length - i - 1],
|
||||||
stiffness: 0.05
|
stiffness: attachmentStiffness,
|
||||||
|
damping: 0.01
|
||||||
});
|
});
|
||||||
|
console.log(consBB[consBB.length - 1])
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
timeSkipBoss(x, y, radius = 55) {
|
timeSkipBoss(x, y, radius = 55) {
|
||||||
@@ -1072,10 +1074,9 @@ const spawn = {
|
|||||||
me.onDeath = function () {
|
me.onDeath = function () {
|
||||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||||
};
|
};
|
||||||
me.rotateVelocity = Math.min(0.0054, 0.0022 * game.accelScale * game.accelScale) * (level.levelsCleared > 8 ? 1 : -1)
|
me.rotateVelocity = Math.min(0.005, 0.002 * game.accelScale * game.accelScale) * (level.levelsCleared > 8 ? 1 : -1)
|
||||||
me.do = function () {
|
me.do = function () {
|
||||||
this.fill = '#' + Math.random().toString(16).substr(-6); //flash colors
|
this.fill = '#' + Math.random().toString(16).substr(-6); //flash colors
|
||||||
|
|
||||||
if (!mech.isBodiesAsleep) {
|
if (!mech.isBodiesAsleep) {
|
||||||
//check if slowed
|
//check if slowed
|
||||||
let slowed = false
|
let slowed = false
|
||||||
@@ -1090,7 +1091,6 @@ const spawn = {
|
|||||||
Matter.Body.setAngle(me, this.count * this.rotateVelocity)
|
Matter.Body.setAngle(me, this.count * this.rotateVelocity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// this.torque -= this.inertia * 0.0000025 / (4 + this.health);
|
// this.torque -= this.inertia * 0.0000025 / (4 + this.health);
|
||||||
Matter.Body.setVelocity(this, {
|
Matter.Body.setVelocity(this, {
|
||||||
x: 0,
|
x: 0,
|
||||||
@@ -2041,7 +2041,7 @@ const spawn = {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
bossShield(targets, x, y, radius) {
|
bossShield(targets, x, y, radius, stiffness = 0.4) {
|
||||||
const nodes = targets.length
|
const nodes = targets.length
|
||||||
mobs.spawn(x, y, 9, radius, "rgba(220,220,255,0.9)");
|
mobs.spawn(x, y, 9, radius, "rgba(220,220,255,0.9)");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
@@ -2057,7 +2057,7 @@ const spawn = {
|
|||||||
consBB[consBB.length] = Constraint.create({
|
consBB[consBB.length] = Constraint.create({
|
||||||
bodyA: me,
|
bodyA: me,
|
||||||
bodyB: mob[mob.length - i - 2],
|
bodyB: mob[mob.length - i - 2],
|
||||||
stiffness: 0.4,
|
stiffness: stiffness,
|
||||||
damping: 0.1
|
damping: 0.1
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
25
todo.txt
25
todo.txt
@@ -1,6 +1,12 @@
|
|||||||
|
mod - 25% damage but you can only have one gun
|
||||||
|
added an elevator to the aerie map
|
||||||
|
25% chance for spider boss to go daddy long legs mode
|
||||||
|
|
||||||
************** TODO - n-gon **************
|
************** TODO - n-gon **************
|
||||||
|
|
||||||
|
level boss: fires a line intersection in a random direction every few seconds.
|
||||||
|
the last two intersections have a destructive laser between them.
|
||||||
|
|
||||||
new gun - deploy a turret that last for 20 seconds
|
new gun - deploy a turret that last for 20 seconds
|
||||||
fire nails at nearby targets once a second.
|
fire nails at nearby targets once a second.
|
||||||
use mine code and bot code
|
use mine code and bot code
|
||||||
@@ -9,7 +15,11 @@ minigun: high caliber - rework
|
|||||||
slow down the bullets even more and increase the size?
|
slow down the bullets even more and increase the size?
|
||||||
remove and actually make a full gun like this?
|
remove and actually make a full gun like this?
|
||||||
|
|
||||||
gun: hit scan bullets?
|
moving map platform
|
||||||
|
button activation
|
||||||
|
elevator on aerie
|
||||||
|
|
||||||
|
door controlled by a button
|
||||||
|
|
||||||
portals:
|
portals:
|
||||||
portal while holding block sometimes send player back to original portal
|
portal while holding block sometimes send player back to original portal
|
||||||
@@ -17,28 +27,17 @@ portals:
|
|||||||
extend to bodies (mobs?)
|
extend to bodies (mobs?)
|
||||||
use buttons to turn on and off?
|
use buttons to turn on and off?
|
||||||
|
|
||||||
mod: heals are twice as effective
|
|
||||||
actually make heals larger
|
|
||||||
maybe replace heals trigger twice with this?
|
|
||||||
|
|
||||||
mod: stunned mobs take extra damage
|
|
||||||
who stuns - super ball, phase decoherence mod, neutron bomb mod, pulse mod, perfect diamagnetism mod
|
|
||||||
check damage order for super ball, pulse
|
|
||||||
|
|
||||||
mod: using a reroll gives you, a heal or ammo
|
|
||||||
|
|
||||||
level boss: boss that dies and comes back to life but with one less side until it hits 3 sides
|
level boss: boss that dies and comes back to life but with one less side until it hits 3 sides
|
||||||
change color too (hsl)
|
change color too (hsl)
|
||||||
boss shrinks and moves faster after each death
|
boss shrinks and moves faster after each death
|
||||||
|
|
||||||
mechanic: lose max health instead of taking fatal damage
|
|
||||||
|
|
||||||
map: laboratory
|
map: laboratory
|
||||||
rooms with switches that change physics
|
rooms with switches that change physics
|
||||||
gravity room
|
gravity room
|
||||||
portal room
|
portal room
|
||||||
laser room
|
laser room
|
||||||
radiation room
|
radiation room
|
||||||
|
a button that spawns a heal.
|
||||||
|
|
||||||
map: observatory
|
map: observatory
|
||||||
button controls rotation of telescope
|
button controls rotation of telescope
|
||||||
|
|||||||
Reference in New Issue
Block a user