bounceBoss balance and bug fixes

difficulty balance per level
  mob harm done is reduced about 2%
  player damage is increased about 2%

slasher mobs do 20% less damage
  this is because they killed me on my last run and I'm bitter
mantisBoss is invincible for a less time
Zeno's paradox removes 1/10 -> 1/12 health every 5 seconds

slow, stun, plasma, foam, neutron bomb effects now only slow mobs down to a minimum speed of about 2-4

bug fixes
  bounceBoss deals with slow effects in a less buggy way
  final boss didn't kill invincible mobs when it dies
This commit is contained in:
landgreen
2022-02-01 19:38:36 -08:00
parent 8bee75cf6e
commit 6a2ef59c7b
9 changed files with 106 additions and 64 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1094,7 +1094,7 @@ const b = {
if (mob[i].shield) dmg *= 3 //to make up for the /5 that shields normally take
mob[i].damage(dmg);
mob[i].locatePlayer();
if (tech.isNeutronSlow) {
if (tech.isNeutronSlow && mob[i].speed > 4) {
Matter.Body.setVelocity(mob[i], {
x: mob[i].velocity.x * 0.97,
y: mob[i].velocity.y * 0.97
@@ -1746,8 +1746,14 @@ const b = {
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position))
const radius = mob[i].radius + tech.extruderRange / 2
if (dist < radius * radius) {
Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x * 0.25, y: mob[i].velocity.y * 0.25 });
Matter.Body.setPosition(this, Vector.add(this.position, mob[i].velocity)) //move with the medium
if (mob[i].speed > 2) {
if (mob[i].isBoss || mob[i].isShielded) {
Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x * 0.95, y: mob[i].velocity.y * 0.95 });
} else {
Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x * 0.25, y: mob[i].velocity.y * 0.25 });
}
}
// Matter.Body.setPosition(this, Vector.add(this.position, mob[i].velocity)) //move with the medium
let dmg = this.dmg / Math.min(10, mob[i].mass)
mob[i].damage(dmg);
if (mob[i].alive) mob[i].foundPlayer();
@@ -1864,10 +1870,12 @@ const b = {
//push mobs away
const force = Vector.mult(Vector.normalise(Vector.sub(m.pos, path[1])), -0.01 * Math.min(5, best.who.mass))
Matter.Body.applyForce(best.who, path[1], force)
Matter.Body.setVelocity(best.who, { //friction
x: best.who.velocity.x * 0.7,
y: best.who.velocity.y * 0.7
});
if (best.who.speed > 4) {
Matter.Body.setVelocity(best.who, { //friction
x: best.who.velocity.x * 0.9,
y: best.who.velocity.y * 0.9
});
}
//draw mob damage circle
simulation.drawList.push({
x: path[1].x,
@@ -3097,7 +3105,12 @@ const b = {
} else {
Matter.Body.setPosition(this, Vector.add(Vector.add(rotate, this.target.velocity), this.target.position))
}
Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.9))
if (this.target.isBoss) {
if (this.target.speed > 8) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.98))
} else {
if (this.target.speed > 4) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.95))
}
Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9);
// Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9)
if (this.target.isShielded) {
@@ -4163,10 +4176,12 @@ const b = {
//push mobs away
const force = Vector.mult(Vector.normalise(Vector.sub(m.pos, path[1])), -0.01 * Math.min(5, best.who.mass))
Matter.Body.applyForce(best.who, path[1], force)
Matter.Body.setVelocity(best.who, { //friction
x: best.who.velocity.x * 0.7,
y: best.who.velocity.y * 0.7
});
if (best.who.speed > 3) {
Matter.Body.setVelocity(best.who, { //friction
x: best.who.velocity.x * 0.7,
y: best.who.velocity.y * 0.7
});
}
//draw mob damage circle
if (best.who.damageReduction) {
simulation.drawList.push({

View File

@@ -128,29 +128,29 @@ const level = {
b.dmgScale = 1; //damage done by player decreases each level
simulation.accelScale = 1 //mob acceleration increases each level
simulation.CDScale = 1 //mob CD time decreases each level
simulation.dmgScale = 0.38 * simulation.difficulty //damage done by mobs increases each level
simulation.dmgScale = 0.375 * simulation.difficulty //damage done by mobs increases each level
simulation.healScale = 1 / (1 + simulation.difficulty * 0.055) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
},
difficultyIncrease(num = 1) {
for (let i = 0; i < num; i++) {
simulation.difficulty++
b.dmgScale *= 0.917; //damage done by player decreases each level
b.dmgScale *= 0.92; //damage done by player decreases each level
if (simulation.accelScale < 6) simulation.accelScale *= 1.025 //mob acceleration increases each level
if (simulation.CDScale > 0.15) simulation.CDScale *= 0.965 //mob CD time decreases each level
}
simulation.dmgScale = 0.38 * simulation.difficulty //damage done by mobs scales with total levels
simulation.dmgScale = 0.375 * simulation.difficulty //damage done by mobs scales with total levels
simulation.healScale = 1 / (1 + simulation.difficulty * 0.055) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
// console.log(`CD = ${simulation.CDScale}`)
},
difficultyDecrease(num = 1) { //used in easy mode for simulation.reset()
for (let i = 0; i < num; i++) {
simulation.difficulty--
b.dmgScale /= 0.917; //damage done by player decreases each level
b.dmgScale /= 0.92; //damage done by player decreases each level
if (simulation.accelScale > 1) simulation.accelScale /= 1.025 //mob acceleration increases each level
if (simulation.CDScale < 1) simulation.CDScale /= 0.965 //mob CD time decreases each level
}
if (simulation.difficulty < 1) simulation.difficulty = 0;
simulation.dmgScale = 0.38 * simulation.difficulty //damage done by mobs scales with total levels
simulation.dmgScale = 0.375 * simulation.difficulty //damage done by mobs scales with total levels
if (simulation.dmgScale < 0.1) simulation.dmgScale = 0.1;
simulation.healScale = 1 / (1 + simulation.difficulty * 0.055)
},
@@ -320,8 +320,8 @@ const level = {
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
player.position.y < level.exit.y - 0 &&
player.velocity.y < 0.15
) {
level.exitCount += input.down ? 8 : 2
} else if (level.exitCount > 0) {

View File

@@ -68,12 +68,13 @@ const mobs = {
whom.isSlowed = true;
whom.status.push({
effect() {
const speedCap = 2
const drag = 0.95
Matter.Body.setVelocity(whom, {
x: Math.min(speedCap, whom.velocity.x) * drag,
y: Math.min(speedCap, whom.velocity.y) * drag
});
if (whom.speed > 2) {
const drag = 0.95
Matter.Body.setVelocity(whom, {
x: whom.velocity.x * drag,
y: whom.velocity.y * drag
});
}
Matter.Body.setAngularVelocity(whom, 0);
ctx.beginPath();
ctx.moveTo(whom.vertices[0].x, whom.vertices[0].y);
@@ -99,10 +100,12 @@ const mobs = {
},
statusStun(who, cycles = 180) {
if (!who.shield && !who.isShielded) {
Matter.Body.setVelocity(who, {
x: who.velocity.x * 0.8,
y: who.velocity.y * 0.8
});
if (who.speed > 3) {
Matter.Body.setVelocity(who, {
x: who.velocity.x * 0.8,
y: who.velocity.y * 0.8
});
}
Matter.Body.setAngularVelocity(who, who.angularVelocity * 0.8);
//remove other "stun" effects on this mob
let i = who.status.length

View File

@@ -1316,7 +1316,7 @@ const m = {
m.energy -= fieldBlockCost
if (m.energy < 0) m.energy = 0;
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
if (tech.blockingIce) {
if (tech.blockingIce && !who.isInvulnerable) {
for (let i = 0; i < fieldBlockCost * 60 * tech.blockingIce; i++) b.iceIX(3, 2 * Math.PI * Math.random(), m.pos)
}
const unit = Vector.normalise(Vector.sub(player.position, who.position))
@@ -3476,16 +3476,20 @@ const m = {
m.angle = player.angle
}
level.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
) {
level.nextLevel()
}
}
// level.exit.drawAndCheck = () => { //fix this
// 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
// ) {
// level.nextLevel()
// }
// }
m.move = () => {
m.pos.x = player.position.x;
m.pos.y = player.position.y;

View File

@@ -938,7 +938,7 @@ const simulation = {
if (!(simulation.cycle % 420)) { //once every 7 seconds
if (tech.isZeno) {
m.health *= 0.9
m.health *= 0.9167 //remove 1/12
m.displayHealth();
}
if (tech.cyclicImmunity && m.immuneCycle < m.cycle + tech.cyclicImmunity) m.immuneCycle = m.cycle + tech.cyclicImmunity; //player is immune to damage for 60 cycles

View File

@@ -397,7 +397,13 @@ const spawn = {
//damage all mobs
for (let j = 0; j < 8; j++) { //in case some mobs leave things after they die
for (let i = 0, len = mob.length; i < len; ++i) {
if (mob[i] !== this) mob[i].damage(Infinity, true);
if (mob[i] !== this) {
if (mob[i].isInvulnerable) { //disable invulnerability
mob[i].isInvulnerable = false
mob[i].damageReduction = 1
}
mob[i].damage(Infinity, true);
}
}
}
@@ -2030,7 +2036,7 @@ const spawn = {
this.cons2.length = 100 + 1.5 * this.radius;
this.isInvulnerable = false
this.invulnerabilityCountDown = 70 + Math.max(0, 70 - simulation.difficulty * 0.5)
this.invulnerabilityCountDown = 80 + Math.max(0, 70 - simulation.difficulty * 0.5)
this.damageReduction = this.startingDamageReduction
for (let i = 0; i < this.babyList.length; i++) {
if (this.babyList[i].alive) this.babyList[i].damageReduction = this.startingDamageReduction
@@ -2044,7 +2050,7 @@ const spawn = {
this.cons2.length = -200;
this.isInvulnerable = false
this.invulnerabilityCountDown = 70 + Math.max(0, 70 - simulation.difficulty)
this.invulnerabilityCountDown = 80 + Math.max(0, 70 - simulation.difficulty)
this.damageReduction = this.startingDamageReduction
for (let i = 0; i < this.babyList.length; i++) {
if (this.babyList[i].alive) this.babyList[i].damageReduction = this.startingDamageReduction
@@ -3550,6 +3556,23 @@ const spawn = {
me.fireCount = 0
// console.log(me.mass) //100
me.do = function() {
me.seePlayer.recall = 1
//maintain speed //faster in the vertical to help avoid repeating patterns
if (this.speed < 0.01) {
const unit = Vector.sub(player.position, this.position)
Matter.Body.setVelocity(this, Vector.mult(Vector.normalise(unit), 0.1));
// this.fireCount = 10 + simulation.difficulty * 0.5
// this.isInvulnerable = true
// this.damageReduction = 0
} else {
if (Math.abs(this.velocity.y) < 15) {
Matter.Body.setVelocity(this, { x: this.velocity.x, y: this.velocity.y * 1.07 });
}
if (Math.abs(this.velocity.x) < 11) {
Matter.Body.setVelocity(this, { x: this.velocity.x * 1.07, y: this.velocity.y });
}
}
if (this.isInvulnerable) {
this.fireCount--
if (this.fireCount < 0) {
@@ -3584,14 +3607,6 @@ const spawn = {
// } else if (player.position.x < this.position.x - 200) {
// this.force.x -= xMag * this.mass;
// }
//maintain speed //faster in the vertical to help avoid repeating patterns
if (Math.abs(this.velocity.y) < 15) {
Matter.Body.setVelocity(this, { x: this.velocity.x, y: this.velocity.y * 1.05 });
}
if (Math.abs(this.velocity.x) < 11) {
Matter.Body.setVelocity(this, { x: this.velocity.x * 1.05, y: this.velocity.y });
}
};
},
bounceBullet(x, y, velocity = { x: 0, y: 0 }, radius = 10, sides = 6) {
@@ -3802,7 +3817,7 @@ const spawn = {
me.swordRadiusMax = 350 + 5 * simulation.difficulty;
me.swordRadiusGrowRate = me.swordRadiusMax * (0.018 + 0.0006 * simulation.difficulty)
me.isSlashing = false;
me.swordDamage = 0.05 * simulation.dmgScale
me.swordDamage = 0.04 * simulation.dmgScale
me.laserAngle = 3 * Math.PI / 5
const seeDistance2 = 200000
spawn.shield(me, x, y);

View File

@@ -2449,7 +2449,7 @@ const tech = {
},
{
name: "Zeno's paradox",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>85%</strong>, but every <strong>5</strong> seconds<br>remove <strong>1/10</strong> of your current <strong class='color-h'>health</strong>",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>85%</strong>, but every <strong>5</strong> seconds<br>remove <strong>1/12</strong> of your current <strong class='color-h'>health</strong>",
// description: "every <strong>5</strong> seconds remove <strong>1/10</strong> of your <strong class='color-h'>health</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>90%</strong>",
maxCount: 1,
count: 0,

View File

@@ -1,23 +1,28 @@
******************************************************** NEXT PATCH **************************************************
new level: reactor - midBoss fight
it's not well balanced yet
Let me know if there are any impossible gun combinations
difficulty balance per level
mob harm done is reduced about 2%
player damage is increased about 2%
for new players the training button at the start screen now cycles colors
effect shows if you haven't cleared the first training level, and you haven't done at least a few normal runs
slasher mobs do 20% less damage
this is because they killed me on my last run and I'm bitter
mantisBoss is invincible for a less time
Zeno's paradox removes 1/10 -> 1/12 health every 5 seconds
standing wave expansion tech is 40% larger and gives 25% deflecting efficiency
ammonium nitrate gives 30 -> 27% damage and range
heuristics gives 30 -> 33% fire rate
wormhole invariant tech drains energy much slower while time is paused
slow, stun, plasma, foam, neutron bomb effects now only slow mobs down to a minimum speed of about 2-4
bug fixes
null level now longer progresses level.onLevel
bounceBoss deals with slow effects in a less buggy way
final boss didn't kill invincible mobs when it dies
******************************************************** TODO ********************************************************
tech - field power ups now give 3 field tech instead of 3 field?
run more profiles of n-gon to fix performance issues
reactor
foam hits all the bullets and makes this fight easy
give map some background graphics
it's a little short
add alternate boss