only 3 bosses

several tech now have fewer requirements to unlock
some normal tech is now considered gun tech (mostly explosion stuff)
snakeBoss tails, stay attached to each other
"snakeBoss", "blockBoss", "powerupBoss" are now the only bosses for the random boss list

bug fixes
This commit is contained in:
landgreen
2021-12-08 20:48:18 -08:00
parent 92457703d5
commit 4137d719da
9 changed files with 656 additions and 603 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -99,7 +99,7 @@
<summary>settings</summary> <summary>settings</summary>
<div style="line-height: 150%;" class="details-div"> <div style="line-height: 150%;" class="details-div">
<label for="difficulty-select" title="effects: number of mobs, damage done by mobs, damage done to mobs, mob speed, heal effects">combat difficulty:</label> <label for="difficulty-select" title="effects: number of mobs, damage done by mobs, damage done to mobs, mob speed, heal effects">combat difficulty:</label>
<select name="difficulty-select" id="difficulty-select"> <select name="difficulty-select" id="difficulty-select" style="background-color: #fff">
<option value="1">easy</option> <option value="1">easy</option>
<option value="2" selected>normal</option> <option value="2" selected>normal</option>
<option value="4">hard</option> <option value="4">hard</option>

View File

@@ -3532,22 +3532,22 @@ const b = {
}, },
randomBot(where = player.position, isKeep = true, isLaser = true) { randomBot(where = player.position, isKeep = true, isLaser = true) {
if (Math.random() < 0.166 && isLaser) { if (Math.random() < 0.166 && isLaser) {
b.laserBot(where) b.laserBot(where, isKeep)
if (isKeep) tech.laserBotCount++; if (isKeep) tech.laserBotCount++;
} else if (Math.random() < 0.2) { } else if (Math.random() < 0.2) {
b.dynamoBot(where) b.dynamoBot(where, isKeep)
if (isKeep) tech.dynamoBotCount++; if (isKeep) tech.dynamoBotCount++;
} else if (Math.random() < 0.25) { } else if (Math.random() < 0.25) {
b.orbitBot(where); b.orbitBot(where, isKeep);
if (isKeep) tech.orbitBotCount++; if (isKeep) tech.orbitBotCount++;
} else if (Math.random() < 0.33) { } else if (Math.random() < 0.33) {
b.nailBot(where) b.nailBot(where, isKeep)
if (isKeep) tech.nailBotCount++; if (isKeep) tech.nailBotCount++;
} else if (Math.random() < 0.5) { } else if (Math.random() < 0.5) {
b.foamBot(where) b.foamBot(where, isKeep)
if (isKeep) tech.foamBotCount++; if (isKeep) tech.foamBotCount++;
} else { } else {
b.boomBot(where) b.boomBot(where, isKeep)
if (isKeep) tech.boomBotCount++; if (isKeep) tech.boomBotCount++;
} }
}, },

View File

@@ -27,6 +27,7 @@ const level = {
// tech.giveTech("antiscience") // tech.giveTech("antiscience")
// for (let i = 0; i < 1; i++) tech.giveTech("reticulum") // for (let i = 0; i < 1; i++) tech.giveTech("reticulum")
// for (let i = 0; i < 2; i++) tech.giveTech("laser-bot") // for (let i = 0; i < 2; i++) tech.giveTech("laser-bot")
// tech.tech[297].frequency = 100
level.intro(); //starting level level.intro(); //starting level
// level.testing(); //not in rotation, used for testing // level.testing(); //not in rotation, used for testing
@@ -95,7 +96,7 @@ const level = {
} }
} }
if (tech.isExtraMaxEnergy) { if (tech.isExtraMaxEnergy) {
tech.healMaxEnergyBonus += 0.04 * powerUps.totalPowerUps //Math.min(0.02 * powerUps.totalPowerUps, 0.51) tech.healMaxEnergyBonus += 0.05 * powerUps.totalPowerUps //Math.min(0.02 * powerUps.totalPowerUps, 0.51)
m.setMaxEnergy(); m.setMaxEnergy();
} }
if (tech.isGunCycle) { if (tech.isGunCycle) {
@@ -2336,8 +2337,8 @@ const level = {
spawn.mapRect(4850, -275, 50, 175); spawn.mapRect(4850, -275, 50, 175);
//??? //???
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
spawn.starter(1900, -500, 200) //big boy // spawn.starter(1900, -500, 200) //big boy
// spawn.launcherOne(1700, -500) // spawn.launcherOne(1700, -500)
// spawn.launcherBoss(3200, -500) // spawn.launcherBoss(3200, -500)
@@ -2361,7 +2362,7 @@ const level = {
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40); // for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500) // for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
// spawn.slashBoss(1900, -500) // spawn.slashBoss(1900, -500)
// spawn.sucker(1900, -500) spawn.pulsar(1900, -500)
// 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)

View File

@@ -518,7 +518,7 @@ const m = {
if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33;
if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.3 if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.3
if (tech.energyRegen === 0) dmg *= 0.34 if (tech.energyRegen === 0) dmg *= 0.34
if (tech.isTurret && m.crouch) dmg *= 0.4; if (tech.isTurret && m.crouch) dmg *= 0.34;
if (tech.isEntanglement && b.inventory[0] === b.activeGun) { if (tech.isEntanglement && b.inventory[0] === b.activeGun) {
for (let i = 0, len = b.inventory.length; i < len; i++) dmg *= 0.87 // 1 - 0.15 for (let i = 0, len = b.inventory.length; i < len; i++) dmg *= 0.87 // 1 - 0.15
} }

View File

@@ -1,8 +1,9 @@
//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: ["snakeBoss"], //"cellBossCulture", "bomberBoss", "powerUpBoss", "orbitalBoss", "spawnerBossCulture", "growBossCulture"
// 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"]) { // "shieldingBoss", "orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss",, , "streamBoss", "pulsarBoss", "spawnerBossCulture", "grenadierBoss", "growBossCulture", "blinkBoss", "snakeSpitBoss", "laserBombingBoss", , "slashBoss"
randomLevelBoss(x, y, options = ["snakeBoss", "powerUpBoss", "blockBoss"]) {
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"],
@@ -2541,6 +2542,8 @@ const spawn = {
me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front
Matter.Body.rotate(me, Math.random() * Math.PI * 2); Matter.Body.rotate(me, Math.random() * Math.PI * 2);
me.radius *= 2 me.radius *= 2
// me.frictionAir = 0.02
me.vertices[1].x = me.position.x + Math.cos(me.angle) * me.radius; //make one end of the triangle longer me.vertices[1].x = me.position.x + Math.cos(me.angle) * me.radius; //make one end of the triangle longer
me.vertices[1].y = me.position.y + Math.sin(me.angle) * me.radius; me.vertices[1].y = me.position.y + Math.sin(me.angle) * me.radius;
// me.homePosition = { x: x, y: y }; // me.homePosition = { x: x, y: y };
@@ -2972,9 +2975,9 @@ const spawn = {
Matter.Body.rotate(me, 2 * Math.PI * Math.random()); Matter.Body.rotate(me, 2 * Math.PI * Math.random());
me.accelMag = 0.00038 * Math.sqrt(simulation.accelScale); me.accelMag = 0.00038 * Math.sqrt(simulation.accelScale);
me.frictionAir = 0.01; me.frictionAir = 0.01;
me.swordRadiusMax = 500 + 8 * simulation.difficulty; me.swordRadiusMax = 550 + 10 * simulation.difficulty;
me.laserAngle = 0; me.laserAngle = 0;
me.swordDamage = 0.002 * simulation.dmgScale me.swordDamage = 0.0025 * simulation.dmgScale
spawn.shield(me, x, y, 1); spawn.shield(me, x, y, 1);
Matter.Body.setDensity(me, 0.005); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.005); //extra dense //normal is 0.001 //makes effective life much larger
@@ -2984,7 +2987,49 @@ 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.startingDamageReduction = me.damageReduction
me.isInvulnerable = false
me.isNextInvulnerability = 0.75
me.invulnerabilityCountDown = 0
me.invulnerable = function() {
if (this.health < this.isNextInvulnerability) {
this.isNextInvulnerability = Math.floor(this.health * 4) / 4 //0.75,0.5,0.25
this.isInvulnerable = true
this.damageReduction = 0
this.invulnerabilityCountDown = 180
}
if (this.isInvulnerable) {
if (this.invulnerabilityCountDown > 0) {
this.invulnerabilityCountDown--
//graphics //draw a super shield?
ctx.beginPath();
let vertices = this.vertices;
ctx.moveTo(vertices[0].x, vertices[0].y);
for (let j = 1; j < vertices.length; j++) ctx.lineTo(vertices[j].x, vertices[j].y);
ctx.lineTo(vertices[0].x, vertices[0].y);
ctx.lineWidth = 20;
// ctx.fillStyle = `rgba(${Math.floor(255 * Math.random())},${Math.floor(255 * Math.random())},${Math.floor(255 * Math.random())},0.5)`
// ctx.fill();
ctx.strokeStyle = "rgba(255,255,255,0.4)";
ctx.stroke();
} else {
this.isInvulnerable = false
this.damageReduction = this.startingDamageReduction
}
}
}
me.do = function() { me.do = function() {
this.invulnerable();
this.checkStatus(); this.checkStatus();
this.seePlayerByHistory(60); this.seePlayerByHistory(60);
this.attraction(); this.attraction();
@@ -4266,7 +4311,7 @@ const spawn = {
if (mob[i].isSnakeTail && mob[i].alive) { if (mob[i].isSnakeTail && mob[i].alive) {
mob[i].isSnakeTail = false; mob[i].isSnakeTail = false;
mob[i].do = mob[i].doActive mob[i].do = mob[i].doActive
mob[i].removeConsBB(); // mob[i].removeConsBB();
} }
} }
}; };
@@ -4384,7 +4429,7 @@ const spawn = {
if (mob[i].isSnakeTail && mob[i].alive) { if (mob[i].isSnakeTail && mob[i].alive) {
mob[i].isSnakeTail = false; mob[i].isSnakeTail = false;
mob[i].do = mob[i].doActive mob[i].do = mob[i].doActive
mob[i].removeConsBB(); // mob[i].removeConsBB();
} }
} }
}; };
@@ -4438,24 +4483,24 @@ const spawn = {
mobs.spawn(x, y, 8, radius, "rgba(0,180,180,0.4)"); mobs.spawn(x, y, 8, radius, "rgba(0,180,180,0.4)");
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.collisionFilter.mask = cat.bullet | cat.player | cat.mob //| cat.body me.collisionFilter.mask = cat.bullet | cat.player | cat.mob //| cat.body
me.accelMag = 0.0004 * simulation.accelScale; me.accelMag = 0.0006 * simulation.accelScale;
me.leaveBody = false; me.leaveBody = false;
me.showHealthBar = false; me.showHealthBar = false;
me.isDropPowerUp = false; me.isDropPowerUp = false;
// Matter.Body.setDensity(me, 0.00004); //normal is 0.001 // Matter.Body.setDensity(me, 0.00004); //normal is 0.001
me.frictionAir = 0.02; me.frictionAir = 0.015;
me.isSnakeTail = true; me.isSnakeTail = true;
me.stroke = "transparent" me.stroke = "transparent"
me.onDeath = function() { me.onDeath = function() {
if (this.isSnakeTail) { //wake up tail mobs // if (this.isSnakeTail) { //wake up tail mobs
for (let i = 0; i < mob.length; i++) { // for (let i = 0; i < mob.length; i++) {
if (mob[i].isSnakeTail && mob[i].alive) { // if (mob[i].isSnakeTail && mob[i].alive) {
mob[i].isSnakeTail = false; // mob[i].isSnakeTail = false;
mob[i].do = mob[i].doActive // mob[i].do = mob[i].doActive
mob[i].removeConsBB(); // mob[i].removeConsBB();
} // }
} // }
} // }
}; };
me.do = function() { me.do = function() {
this.checkStatus(); this.checkStatus();

1111
js/tech.js

File diff suppressed because it is too large Load Diff

View File

@@ -27,6 +27,10 @@ select {
top: "-15px"; */ top: "-15px"; */
} }
select option {
background-color: #fff;
}
input { input {
/* font-family: Monaco, monospace; */ /* font-family: Monaco, monospace; */
padding: 0px 4px; padding: 0px 4px;
@@ -369,7 +373,8 @@ summary {
padding: 10px; padding: 10px;
border-radius: 8px; border-radius: 8px;
border: 2px #333 solid; border: 2px #333 solid;
background-color: #eee; /* background-color: #eee; */
background-color: #fff;
} }
#dmg { #dmg {

View File

@@ -1,30 +1,26 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
intro screen is more grey several tech now have fewer requirements to unlock
experiment button is larger and darker some normal tech is now considered gun tech (mostly explosion stuff)
snakeBoss tails, stay attached to each other
tech: nanowires - needles tunnel through blocks and map, +20% damage "snakeBoss", "blockBoss", "powerupBoss" are now the only bosses
Occam's razor gives 40->50% damage for each removed tech
determinism no longer removes the cancel button
superdeterminism now removes the cancel button and research, but doesn't remove gun and field power ups
railgun damage is doubled
regression does more damage per hit: 5->6% vs. mobs and 0.5->1% vs. bosses
bug fixes bug fixes
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
suggestion: quasarBoss: inverted pulsar boss that hits everything except where its aiming
pulsar mobs retarget too easily
also they drift around too much
intro map: diegeticly draw a mouse with field highlighted
also indicate space?
dynamically adjust drawing after picking up a gun
some boss mobs need invulnerability phases some boss mobs need invulnerability phases
maybe trigger immunity to damage for 5-10s after taking the first hit? maybe trigger immunity to damage for 5-10s after taking the first hit?
static electricity: walking on the ground does something
regen energy
build charge, and discharge to damage mobs
suggestion: particle accelerator: perfect diamagneticism accelerates projectiles passing through it, increasing their damage and velocity. Alternatively, matter wave's projectiles accelerate, with increased damage the faster they're travelling
don't in game console log scrap bots
increase mass and movement speed at the same time increase mass and movement speed at the same time
increase jump differently because it scales extra with mass increase jump differently because it scales extra with mass
@@ -34,13 +30,6 @@ increase mass and movement speed at the same time
tech selection menu choices randomize every second tech selection menu choices randomize every second
JUNK tech? JUNK tech?
needle benefit from pneumatic hammer?
all nails?
total guntech:
nail gun needle @ 4
base nail gun @ 5
new late game level that is easier if you can: platform well, jump high, immune to slime, wormhole through walls, fly fast new late game level that is easier if you can: platform well, jump high, immune to slime, wormhole through walls, fly fast
climb vertically to avoid rising slime climb vertically to avoid rising slime
populate with multiple boss mobs that can't drop tech populate with multiple boss mobs that can't drop tech