slashBoss
new boss: slasherBoss - radially waving short distance lasers aerogel 250%->150% foam damage bug fixes
This commit is contained in:
@@ -2835,7 +2835,7 @@ const b = {
|
|||||||
inertia: Infinity,
|
inertia: Infinity,
|
||||||
frictionAir: 0.003,
|
frictionAir: 0.003,
|
||||||
dmg: 0, //damage on impact
|
dmg: 0, //damage on impact
|
||||||
damage: (tech.isFastFoam ? 0.033 : 0.011) * (tech.isBulletTeleport ? 1.43 : 1), //damage done over time
|
damage: (tech.isFastFoam ? 0.0275 : 0.011) * (tech.isBulletTeleport ? 1.43 : 1), //damage done over time
|
||||||
scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1),
|
scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1),
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
|
|||||||
12
js/level.js
12
js/level.js
@@ -15,7 +15,7 @@ const level = {
|
|||||||
// localSettings.levelsClearedLastGame = 10
|
// localSettings.levelsClearedLastGame = 10
|
||||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||||
// simulation.isHorizontalFlipped = true
|
// simulation.isHorizontalFlipped = true
|
||||||
// m.setField("time dilation")
|
// m.setField("pilot wave")
|
||||||
// b.giveGuns("harpoon")
|
// b.giveGuns("harpoon")
|
||||||
// tech.giveTech("toggling harpoon")
|
// tech.giveTech("toggling harpoon")
|
||||||
// tech.giveTech("filament")
|
// tech.giveTech("filament")
|
||||||
@@ -1623,14 +1623,14 @@ const level = {
|
|||||||
spawn.mapRect(x + 550, y + -10 - 640, 900, 25); //raised floor
|
spawn.mapRect(x + 550, y + -10 - 640, 900, 25); //raised floor
|
||||||
spawn.mapRect(x + 450, y + -20 - 640, 1100, 25);
|
spawn.mapRect(x + 450, y + -20 - 640, 1100, 25);
|
||||||
spawn.mapRect(x + 450, y + -675 - 640, 1100, 25); //chamber ceiling
|
spawn.mapRect(x + 450, y + -675 - 640, 1100, 25); //chamber ceiling
|
||||||
powerUps.spawn(x + 998, y - 333 - 640, "tech", false);
|
powerUps.directSpawn(x + 998, y - 333 - 640, "tech", false);
|
||||||
spawn.mapVertex(x + 1000, y + -0, "575 0 -575 0 -450 -100 450 -100"); //base
|
spawn.mapVertex(x + 1000, y + -0, "575 0 -575 0 -450 -100 450 -100"); //base
|
||||||
} else { //lower chamber
|
} else { //lower chamber
|
||||||
spawn.mapRect(x + 400, y + -10, 1200, 50); //raised floor
|
spawn.mapRect(x + 400, y + -10, 1200, 50); //raised floor
|
||||||
spawn.mapRect(x + 450, y + -20, 1100, 50);
|
spawn.mapRect(x + 450, y + -20, 1100, 50);
|
||||||
spawn.mapRect(x + 450, y + -675, 1100, 25); //chamber ceiling
|
spawn.mapRect(x + 450, y + -675, 1100, 25); //chamber ceiling
|
||||||
spawn.mapRect(x + 550, y + -685, 900, 25);
|
spawn.mapRect(x + 550, y + -685, 900, 25);
|
||||||
powerUps.spawn(x + 998, y - 333, "tech", false);
|
powerUps.directSpawn(x + 998, y - 333, "tech", false);
|
||||||
}
|
}
|
||||||
const powerUp1 = powerUp[powerUp.length - 1]
|
const powerUp1 = powerUp[powerUp.length - 1]
|
||||||
powerUp1.holdPosition = { x: powerUp1.position.x, y: powerUp1.position.y }
|
powerUp1.holdPosition = { x: powerUp1.position.x, y: powerUp1.position.y }
|
||||||
@@ -2300,13 +2300,13 @@ const level = {
|
|||||||
// spawn.laserBombingBoss(1900, -500)
|
// spawn.laserBombingBoss(1900, -500)
|
||||||
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
|
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
|
||||||
|
|
||||||
spawn.slasher(1900, -500)
|
spawn.slashBoss(1900, -500)
|
||||||
// spawn.sneaker(1900, -500, 200)
|
// spawn.ghoster(1900, -500, 200)
|
||||||
// spawn.shield(mob[mob.length - 1], 1900, -500, 1);
|
// spawn.shield(mob[mob.length - 1], 1900, -500, 1);
|
||||||
// mob[mob.length - 1].isShielded = true
|
// mob[mob.length - 1].isShielded = true
|
||||||
// spawn.growBossCulture(1200, -500)
|
// spawn.growBossCulture(1200, -500)
|
||||||
// spawn.laserTargetingBoss(1600, -400)
|
// spawn.laserTargetingBoss(1600, -400)
|
||||||
// spawn.focuser(1600, -500)
|
// spawn.blinkBoss(1600, -500)
|
||||||
// spawn.laserTargetingBoss(1700, -120)
|
// spawn.laserTargetingBoss(1700, -120)
|
||||||
// spawn.bomberBoss(1400, -500)
|
// spawn.bomberBoss(1400, -500)
|
||||||
// spawn.laser(1800, -120)
|
// spawn.laser(1800, -120)
|
||||||
|
|||||||
@@ -2385,7 +2385,7 @@ const m = {
|
|||||||
// },
|
// },
|
||||||
{
|
{
|
||||||
name: "pilot wave",
|
name: "pilot wave",
|
||||||
description: "use <strong class='color-f'>energy</strong> to push <strong class='color-block'>blocks</strong> with your mouse<br><strong class='color-block'>blocks</strong> can <strong>collide</strong> with <strong>intangible</strong> mobs<br>field <strong>radius</strong> decreases out of <strong>line of sight</strong>",
|
description: "use <strong class='color-f'>energy</strong> to push <strong class='color-block'>blocks</strong> with your mouse<br><strong class='color-block'>blocks</strong> can't <strong>collide</strong> with <strong>intangible</strong> mobs<br>field <strong>radius</strong> decreases out of <strong>line of sight</strong>",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
m.fieldPhase = 0;
|
m.fieldPhase = 0;
|
||||||
m.fieldPosition = {
|
m.fieldPosition = {
|
||||||
|
|||||||
107
js/spawn.js
107
js/spawn.js
@@ -1,8 +1,8 @@
|
|||||||
//main object for spawning things in a level
|
//main object for spawning things in a level
|
||||||
const spawn = {
|
const spawn = {
|
||||||
nonCollideBossList: ["cellBossCulture", "bomberBoss", "powerUpBoss", "orbitalBoss", "spawnerBossCulture", "growBossCulture"],
|
nonCollideBossList: ["cellBossCulture", "bomberBoss", "powerUpBoss", "orbitalBoss", "spawnerBossCulture", "growBossCulture"],
|
||||||
randomLevelBoss(x, y, options = ["shieldingBoss", "orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "snakeBoss", "streamBoss", "pulsarBoss", "spawnerBossCulture", "grenadierBoss", "growBossCulture", "blinkBoss", "snakeSpitBoss", "laserBombingBoss", "blockBoss"]) {
|
// other bosses: suckerBoss, laserBoss, tetherBoss, //these need a particular level to work so they are not included in the random pool
|
||||||
// other bosses: suckerBoss, laserBoss, tetherBoss, //these need a particular level to work so they are not included in the random pool
|
randomLevelBoss(x, y, options = ["shieldingBoss", "orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "snakeBoss", "streamBoss", "pulsarBoss", "spawnerBossCulture", "grenadierBoss", "growBossCulture", "blinkBoss", "snakeSpitBoss", "laserBombingBoss", "blockBoss", "slashBoss"]) {
|
||||||
spawn[options[Math.floor(Math.random() * options.length)]](x, y)
|
spawn[options[Math.floor(Math.random() * options.length)]](x, y)
|
||||||
},
|
},
|
||||||
pickList: ["starter", "starter"],
|
pickList: ["starter", "starter"],
|
||||||
@@ -2644,7 +2644,6 @@ const spawn = {
|
|||||||
Composite.add(engine.world, me.constraint);
|
Composite.add(engine.world, me.constraint);
|
||||||
}, 2000); //add in a delay in case the level gets flipped left right
|
}, 2000); //add in a delay in case the level gets flipped left right
|
||||||
|
|
||||||
me.isBoss = true;
|
|
||||||
|
|
||||||
// me.startingPosition = {
|
// me.startingPosition = {
|
||||||
// x: x,
|
// x: x,
|
||||||
@@ -2655,13 +2654,15 @@ const spawn = {
|
|||||||
// me.torque -= me.inertia * 0.002
|
// me.torque -= me.inertia * 0.002
|
||||||
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
|
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
|
||||||
Matter.Body.setDensity(me, 0.03); //extra dense //normal is 0.001 //makes effective life much larger
|
Matter.Body.setDensity(me, 0.03); //extra dense //normal is 0.001 //makes effective life much larger
|
||||||
|
me.damageReduction = 0.25
|
||||||
|
me.isBoss = true;
|
||||||
|
|
||||||
// spawn.shield(me, x, y, 1); //not working, not sure why
|
// spawn.shield(me, x, y, 1); //not working, not sure why
|
||||||
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.0045, 0.0015 * simulation.accelScale * simulation.accelScale) * (level.levelsCleared > 8 ? 1 : -1) * (simulation.isHorizontalFlipped ? -1 : 1)
|
me.rotateVelocity = Math.min(0.0045, 0.0015 * simulation.accelScale * simulation.accelScale) * (level.levelsCleared > 8 ? 1 : -1) * (simulation.isHorizontalFlipped ? -1 : 1)
|
||||||
me.damageReduction = 0.25
|
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
// this.armor();
|
// this.armor();
|
||||||
this.fill = '#' + Math.random().toString(16).substr(-6); //flash colors
|
this.fill = '#' + Math.random().toString(16).substr(-6); //flash colors
|
||||||
@@ -2912,11 +2913,99 @@ const spawn = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
slashBoss(x, y, radius = 70) {
|
||||||
|
const sides = 9 + Math.floor(Math.min(12, 0.2 * simulation.difficulty))
|
||||||
|
const coolBends = [-1.8, 0, 0, 0.9, 1.2]
|
||||||
|
const bendFactor = coolBends[Math.floor(Math.random() * coolBends.length)];
|
||||||
|
mobs.spawn(x, y, sides, radius, "rgb(201,202,225)");
|
||||||
|
let me = mob[mob.length - 1];
|
||||||
|
Matter.Body.rotate(me, 2 * Math.PI * Math.random());
|
||||||
|
me.accelMag = 0.00037 * Math.sqrt(simulation.accelScale);
|
||||||
|
me.frictionAir = 0.01;
|
||||||
|
me.swordRadiusMax = 450 + 7 * simulation.difficulty;
|
||||||
|
me.laserAngle = 0;
|
||||||
|
me.swordDamage = 0.0015 * simulation.dmgScale
|
||||||
|
|
||||||
|
spawn.shield(me, x, y, 1);
|
||||||
|
Matter.Body.setDensity(me, 0.005); //extra dense //normal is 0.001 //makes effective life much larger
|
||||||
|
me.damageReduction = 0.12
|
||||||
|
me.isBoss = true;
|
||||||
|
me.onDamage = function() {};
|
||||||
|
me.onDeath = function() {
|
||||||
|
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||||
|
};
|
||||||
|
me.do = function() {
|
||||||
|
this.checkStatus();
|
||||||
|
this.seePlayerByHistory(60);
|
||||||
|
this.attraction();
|
||||||
|
//traveling laser
|
||||||
|
if (!m.isBodiesAsleep) this.laserAngle += 0.03
|
||||||
|
for (let i = 0, len = this.vertices.length; i < len; i++) {
|
||||||
|
// this.laserSword(this.vertices[1], this.angle + laserAngle);
|
||||||
|
const bend = bendFactor * Math.cos(this.laserAngle + 2 * Math.PI * i / len)
|
||||||
|
const long = this.swordRadiusMax * Math.sin(this.laserAngle + 2 * Math.PI * i / len)
|
||||||
|
if (long > 0) this.laserSword(this.vertices[i], bend + this.angle + (i + 0.5) / sides * 2 * Math.PI, Math.abs(long));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
me.laserSword = function(where, angle, length) {
|
||||||
|
const vertexCollision = function(v1, v1End, domain) {
|
||||||
|
for (let i = 0; i < domain.length; ++i) {
|
||||||
|
let vertices = domain[i].vertices;
|
||||||
|
const len = vertices.length - 1;
|
||||||
|
for (let j = 0; j < len; j++) {
|
||||||
|
results = simulation.checkLineIntersection(v1, v1End, vertices[j], vertices[j + 1]);
|
||||||
|
if (results.onLine1 && results.onLine2) {
|
||||||
|
const dx = v1.x - results.x;
|
||||||
|
const dy = v1.y - results.y;
|
||||||
|
const dist2 = dx * dx + dy * dy;
|
||||||
|
if (dist2 < best.dist2 && (!domain[i].mob || domain[i].alive)) best = { x: results.x, y: results.y, dist2: dist2, who: domain[i], v1: vertices[j], v2: vertices[j + 1] };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
results = simulation.checkLineIntersection(v1, v1End, vertices[0], vertices[len]);
|
||||||
|
if (results.onLine1 && results.onLine2) {
|
||||||
|
const dx = v1.x - results.x;
|
||||||
|
const dy = v1.y - results.y;
|
||||||
|
const dist2 = dx * dx + dy * dy;
|
||||||
|
if (dist2 < best.dist2) best = { x: results.x, y: results.y, dist2: dist2, who: domain[i], v1: vertices[0], v2: vertices[len] };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
best = { x: null, y: null, dist2: Infinity, who: null, v1: null, v2: null };
|
||||||
|
const look = { x: where.x + length * Math.cos(angle), y: where.y + length * Math.sin(angle) };
|
||||||
|
// vertexCollision(where, look, body); // vertexCollision(where, look, mob);
|
||||||
|
vertexCollision(where, look, map);
|
||||||
|
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
|
||||||
|
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
|
||||||
|
// m.immuneCycle = m.cycle + tech.collisionImmuneCycles + 60; //player is immune to damage for an extra second
|
||||||
|
m.damage(this.swordDamage);
|
||||||
|
simulation.drawList.push({ //add dmg to draw queue
|
||||||
|
x: best.x,
|
||||||
|
y: best.y,
|
||||||
|
radius: this.swordDamage * 1500,
|
||||||
|
color: "rgba(80,0,255,0.5)",
|
||||||
|
time: 20
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (best.dist2 === Infinity) best = look;
|
||||||
|
ctx.beginPath(); //draw beam
|
||||||
|
ctx.moveTo(where.x, where.y);
|
||||||
|
ctx.lineTo(best.x, best.y);
|
||||||
|
ctx.strokeStyle = "rgba(100,100,255,0.1)"; // Purple path
|
||||||
|
ctx.lineWidth = 10;
|
||||||
|
ctx.stroke();
|
||||||
|
ctx.strokeStyle = "rgba(100,100,255,0.5)"; // Purple path
|
||||||
|
ctx.lineWidth = 2;
|
||||||
|
// ctx.stroke();
|
||||||
|
ctx.setLineDash([70 + 300 * Math.random(), 55 * Math.random()]);
|
||||||
|
ctx.stroke(); // Draw it
|
||||||
|
ctx.setLineDash([]);
|
||||||
|
}
|
||||||
|
},
|
||||||
slasher(x, y, radius = 36 + Math.ceil(Math.random() * 25)) {
|
slasher(x, y, radius = 36 + Math.ceil(Math.random() * 25)) {
|
||||||
mobs.spawn(x, y, 5, radius, "rgb(201,202,225)");
|
mobs.spawn(x, y, 5, radius, "rgb(201,202,225)");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
Matter.Body.rotate(me, 2 * Math.PI * Math.random());
|
Matter.Body.rotate(me, 2 * Math.PI * Math.random());
|
||||||
me.accelMag = 0.00085 * simulation.accelScale;
|
me.accelMag = 0.0008 * simulation.accelScale;
|
||||||
me.torqueMagnitude = 0.00002 * me.inertia * (Math.random() > 0.5 ? -1 : 1);
|
me.torqueMagnitude = 0.00002 * me.inertia * (Math.random() > 0.5 ? -1 : 1);
|
||||||
me.frictionStatic = 0;
|
me.frictionStatic = 0;
|
||||||
me.friction = 0;
|
me.friction = 0;
|
||||||
@@ -2925,9 +3014,9 @@ const spawn = {
|
|||||||
me.cd = 0;
|
me.cd = 0;
|
||||||
me.swordRadius = 0;
|
me.swordRadius = 0;
|
||||||
me.swordRadiusMax = 350 + 5 * simulation.difficulty;
|
me.swordRadiusMax = 350 + 5 * simulation.difficulty;
|
||||||
me.swordRadiusGrowRate = me.swordRadiusMax * (0.02 + 0.0008 * simulation.difficulty)
|
me.swordRadiusGrowRate = me.swordRadiusMax * (0.018 + 0.0006 * simulation.difficulty)
|
||||||
me.isSlashing = false;
|
me.isSlashing = false;
|
||||||
me.swordDamage = 0.07 * simulation.dmgScale
|
me.swordDamage = 0.05 * simulation.dmgScale
|
||||||
const laserAngle = 3 * Math.PI / 5
|
const laserAngle = 3 * Math.PI / 5
|
||||||
const seeDistance2 = 200000
|
const seeDistance2 = 200000
|
||||||
spawn.shield(me, x, y);
|
spawn.shield(me, x, y);
|
||||||
@@ -3020,7 +3109,9 @@ const spawn = {
|
|||||||
ctx.stroke();
|
ctx.stroke();
|
||||||
ctx.strokeStyle = "rgba(100,100,255,0.5)"; // Purple path
|
ctx.strokeStyle = "rgba(100,100,255,0.5)"; // Purple path
|
||||||
ctx.lineWidth = 4;
|
ctx.lineWidth = 4;
|
||||||
ctx.stroke();
|
ctx.setLineDash([70 + 300 * Math.random(), 55 * Math.random()]);
|
||||||
|
ctx.stroke(); // Draw it
|
||||||
|
ctx.setLineDash([]);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
sneaker(x, y, radius = 15 + Math.ceil(Math.random() * 10)) {
|
sneaker(x, y, radius = 15 + Math.ceil(Math.random() * 10)) {
|
||||||
|
|||||||
@@ -637,7 +637,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "kinetic bombardment",
|
name: "kinetic bombardment",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by up to <strong>33%</strong><br>at a <strong>distance</strong> of 40 steps from the target",
|
description: "increase <strong class='color-d'>damage</strong> by up to <strong>33%</strong> at a <strong>distance</strong><br>of up to 50 player widths from the target",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -4932,7 +4932,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "aerogel",
|
name: "aerogel",
|
||||||
description: "<strong>foam</strong> bubbles <strong>float</strong> and dissipate <strong>50%</strong> faster<br>increase <strong>foam</strong> <strong class='color-d'>damage</strong> per second by <strong>200%</strong>",
|
description: "<strong>foam</strong> bubbles <strong>float</strong> and dissipate <strong>50%</strong> faster<br>increase <strong>foam</strong> <strong class='color-d'>damage</strong> per second by <strong>150%</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
|
|||||||
13
todo.txt
13
todo.txt
@@ -1,17 +1,18 @@
|
|||||||
******************************************************** NEXT PATCH **************************************************
|
******************************************************** NEXT PATCH **************************************************
|
||||||
|
|
||||||
new mob: slasher - it's basically a jedi
|
new boss: slasherBoss - radially waving short distance lasers
|
||||||
|
|
||||||
harpoon: +33% damage, +33% delay after firing
|
aerogel 250%->150% foam damage
|
||||||
time dilation reverted 50% -> 0% collision harm reduction
|
|
||||||
time dilation can no longer get tech: symbiosis
|
|
||||||
nano-scale: can access tokamak and discrete optimization
|
|
||||||
cache: 11x -> 13x ammo
|
|
||||||
|
|
||||||
bug fixes
|
bug fixes
|
||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** TODO ********************************************************
|
||||||
|
|
||||||
|
slasherBoss
|
||||||
|
sine wave of lasers that travel around vertexes
|
||||||
|
10+ sided
|
||||||
|
low laser damage, but it doesn't trigger damage immunity
|
||||||
|
|
||||||
slasher compute fastest direction to rotate towards player
|
slasher compute fastest direction to rotate towards player
|
||||||
cross product
|
cross product
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user