diff --git a/js/bullet.js b/js/bullet.js
index d3ba176..c30b4b6 100644
--- a/js/bullet.js
+++ b/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
//remove bullet if at end cycle for that bullet
let i = bullet.length;
@@ -750,7 +759,8 @@ const b = {
Matter.Body.scale(this, SCALE, SCALE);
this.lookFrequency = 30;
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;
}
@@ -1487,6 +1497,7 @@ const b = {
// **************************************************************************************************
// **************************************************************************************************
giveGuns(gun = "random", ammoPacks = 6) {
+ if (mod.isOneGun) b.removeAllGuns();
if (gun === "random") {
//find what guns player doesn't have
options = []
diff --git a/js/game.js b/js/game.js
index ba1973f..15bf367 100644
--- a/js/game.js
+++ b/js/game.js
@@ -496,14 +496,7 @@ const game = {
player.force.y += player.mass * mech.gravity;
},
reset() { //run on first run, and each later run after you die
- 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;
-
+ b.removeAllGuns();
mod.setupAllMods(); //sets mods to default values
b.setFireCD();
game.updateModHUD();
diff --git a/js/level.js b/js/level.js
index 91aa2bb..44e2eda 100644
--- a/js/level.js
+++ b/js/level.js
@@ -21,8 +21,8 @@ const level = {
// b.giveGuns("maser")
// mech.setField("plasma torch")
- // level.testing();
level.intro(); //starting level
+ // level.testing();
// level.testChamber()
// level.sewers();
// 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() {
level.setPosToSpawn(0, -50); //lower start
level.exit.y = level.enter.y - 550;
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
level.exit.x = level.enter.x;
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20);
- level.defaultZoom = 2000
+ level.defaultZoom = 2200
game.zoomTransition(level.defaultZoom)
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({
x: 2500,
y: -75
@@ -212,7 +78,6 @@ const level = {
x: 2500,
y: -3075
}, Math.PI) //left
-
const portal2 = level.portal({
x: 75,
y: -2150
@@ -220,7 +85,6 @@ const level = {
x: 1325,
y: -2150
}, -Math.PI / 2) //up
-
const portal3 = level.portal({
x: 1850,
y: -585
@@ -228,6 +92,7 @@ const level = {
x: 2425,
y: -600
}, -2 * Math.PI / 3) //up left
+
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 button = level.button(2100, -2600)
@@ -285,7 +150,13 @@ const level = {
}]);
powerUps.chooseRandomPowerUp(powerUpPos[0].x, powerUpPos[0].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
spawn.mapRect(-1400, -3800, 1100, 3900); //left map wall
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(2200, -120)
// spawn.cellBossCulture(1600, -500)
- spawn.starter(1600, -500, 60)
+ // spawn.starter(1600, -500, 60)
// spawn.striker(1600, -500)
// spawn.shield(mob[mob.length - 1], 1200, -500, 1);
// spawn.nodeBoss(1200, -500, "launcher")
- // spawn.spiderBoss(1200, -500)
+ spawn.spiderBoss(1200, -500)
// spawn.timeSkipBoss(2900, -500)
// spawn.randomMob(1600, -500)
},
@@ -819,10 +690,27 @@ const level = {
spawn.wireHead();
},
satellite() {
+ const elevator = level.platform(4210, -1325, 380, 30, -10)
level.custom = () => {
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.exit.x = -100;
@@ -952,32 +840,35 @@ const level = {
});
spawn.mapRect(3925, -300, 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
- spawn.mapRect(4100, -1700, 100, 100);
- spawn.mapRect(4200, -2050, 100, 450);
- spawn.mapRect(4300, -2400, 100, 800);
- spawn.mapRect(4400, -2750, 100, 1150);
- spawn.mapRect(4500, -3100, 100, 1500);
+ // spawn.mapRect(4100, -1700, 100, 100);
+ // spawn.mapRect(4200, -2050, 100, 450);
+ // spawn.mapRect(4300, -2400, 100, 800);
+ // spawn.mapRect(4400, -2750, 100, 1150);
+ // 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(4100, -3450, 100, 700); //left top shelf
- spawn.mapRect(4200, -3450, 100, 400); //left top shelf
- spawn.mapRect(4300, -3450, 100, 100); //left top shelf
+ // spawn.mapRect(4200, -3450, 100, 400); //left top shelf
+ // spawn.mapRect(4300, -3450, 100, 100); //left top shelf
level.fill.push({
x: 4100,
y: -3450,
- width: 500,
- height: 1750,
- color: "rgba(0,20,40,0.1)"
- });
- level.fill.push({
- x: 4100,
- y: -1600,
width: 600,
- height: 300,
+ height: 2250,
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(4800, -800);
@@ -1221,11 +1112,15 @@ const level = {
powerUps.addRerollToLevel() //needs to run after mobs are spawned
},
aerie() {
+ // const elevator = level.platform(4112, -2300, 280, 50)
+
level.custom = () => {
level.playerExitCheck();
};
- level.customTopLayer = () => {};
- // game.setZoom(3000);
+ level.customTopLayer = () => {
+ // elevator.move()
+ };
+
// game.difficulty = 4; //for testing to simulate possible mobs spawns
level.defaultZoom = 2100
game.zoomTransition(level.defaultZoom)
@@ -1270,14 +1165,14 @@ const level = {
x: 3700,
y: -3150,
width: 1100,
- height: 900,
+ height: 950,
color: "rgba(0,0,0,0.1)"
});
//background
level.fillBG.push({
x: 4200,
- y: -2250,
+ y: -2200,
width: 100,
height: 2600,
color: "#c7c7ca"
@@ -2561,6 +2456,52 @@ const level = {
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) {
const rotor1 = Matter.Bodies.rectangle(x, y, width, radius, {
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)") {
return {
min: {
@@ -2694,11 +2754,18 @@ const level = {
isOn: true,
query() {
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)
} else if (mech.immuneCycle < mech.cycle) {
mech.immuneCycle = mech.cycle + mod.collisionImmuneCycles;
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
if (mech.energy > drain) mech.energy -= drain
diff --git a/js/mods.js b/js/mods.js
index f80e840..0d9b88f 100644
--- a/js/mods.js
+++ b/js/mods.js
@@ -79,12 +79,28 @@ const mod = {
if (mod.isEnergyDamage) dmg *= 1 + mech.energy / 5.5;
if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.006
if (mod.isRerollDamage) dmg *= 1 + 0.05 * powerUps.reroll.rerolls
+ if (mod.isOneGun && b.inventory.length < 2) dmg *= 1.25
return dmg * mod.slowFire
},
totalBots() {
return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount + mod.boomBotCount + mod.plasmaBotCount
},
mods: [{
+ name: "integrated armament",
+ description: "increase damage by 25%
your inventory can only hold 1 gun",
+ 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",
// nameInfo: "",
description: "increase damage by 1%
for every 5.5% stored energy",
@@ -1804,7 +1820,7 @@ const mod = {
},
{
name: "harvester",
- description: "when drones pick up power ups
improve drone size, lifespan, and vision rate",
+ description: "when a drone picks up a power up
improve its size, duration, and vision rate",
maxCount: 1,
count: 0,
allowed() {
@@ -2471,6 +2487,6 @@ const mod = {
isRerollBots: null,
isRailTimeSlow: null,
isBotUpgrade: null,
- isDroneGrab: null
- // isMaxHealthRemove: null
+ isDroneGrab: null,
+ isOneGun: null
}
\ No newline at end of file
diff --git a/js/powerup.js b/js/powerup.js
index 664f682..f4a1be1 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -498,12 +498,12 @@ const powerUps = {
}
},
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) {
powerUps.spawn(x, y, "gun", false);
} else if (mod.totalCount === 0) {
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);
} else {
powerUps.spawnRandomPowerUp(x, y);
diff --git a/js/spawn.js b/js/spawn.js
index ff8eb26..b0db144 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -652,6 +652,7 @@ const spawn = {
}
},
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
mobs.spawn(x, y, 6, radius, "#b386e8");
let me = mob[mob.length - 1];
@@ -692,7 +693,8 @@ const spawn = {
});
cons[len2].length = 100 + 1.5 * radius;
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 () {
this.removeCons();
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
@@ -705,7 +707,7 @@ const spawn = {
};
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 angle = 2 * Math.PI / nodes
@@ -713,23 +715,23 @@ const spawn = {
for (let i = 0; i < nodes; ++i) {
spawn.stabber(x + sideLength * Math.sin(i * angle), y + sideLength * Math.cos(i * angle), radius, 12);
- // const who = mob[mob.length - 1]
- // who.frictionAir = 0.06
- // who.accelMag = 0.005 * game.accelScale
-
+ if (isDaddyLongLegs) Matter.Body.setDensity(mob[mob.length - 1], 0.005); //extra dense //normal is 0.001 //makes effective life much larger
targets.push(mob[mob.length - 1].id) //track who is in the node boss, for shields
}
- //spawn shield for entire boss
- spawn.bossShield(targets, x, y, sideLength + 1 * radius + nodes * 5 - 25);
+ //spawn shield around all nodes
+ if (!isDaddyLongLegs) spawn.bossShield(targets, x, y, sideLength + 1 * radius + nodes * 5 - 25);
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
consBB[consBB.length] = Constraint.create({
bodyA: me,
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) {
@@ -1072,10 +1074,9 @@ const spawn = {
me.onDeath = function () {
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 () {
this.fill = '#' + Math.random().toString(16).substr(-6); //flash colors
-
if (!mech.isBodiesAsleep) {
//check if slowed
let slowed = false
@@ -1090,7 +1091,6 @@ const spawn = {
Matter.Body.setAngle(me, this.count * this.rotateVelocity)
}
}
-
// this.torque -= this.inertia * 0.0000025 / (4 + this.health);
Matter.Body.setVelocity(this, {
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
mobs.spawn(x, y, 9, radius, "rgba(220,220,255,0.9)");
let me = mob[mob.length - 1];
@@ -2057,7 +2057,7 @@ const spawn = {
consBB[consBB.length] = Constraint.create({
bodyA: me,
bodyB: mob[mob.length - i - 2],
- stiffness: 0.4,
+ stiffness: stiffness,
damping: 0.1
});
}
diff --git a/todo.txt b/todo.txt
index 94dba5d..7ee5642 100644
--- a/todo.txt
+++ b/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 **************
+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
fire nails at nearby targets once a second.
use mine code and bot code
@@ -9,7 +15,11 @@ minigun: high caliber - rework
slow down the bullets even more and increase the size?
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:
portal while holding block sometimes send player back to original portal
@@ -17,28 +27,17 @@ portals:
extend to bodies (mobs?)
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
change color too (hsl)
boss shrinks and moves faster after each death
-mechanic: lose max health instead of taking fatal damage
-
map: laboratory
rooms with switches that change physics
gravity room
portal room
laser room
radiation room
+ a button that spawns a heal.
map: observatory
button controls rotation of telescope