From 64f2a9f0816b2e7b6680c602e41db4bafd80c305 Mon Sep 17 00:00:00 2001 From: landgreen Date: Thu, 29 Feb 2024 19:57:16 -0800 Subject: [PATCH] laserLayerBoss laserLayerBoss - sends lasers to player's location snakes bosses - after you kill a tail piece the rest of the tails lose 5% life this makes targeting any part of the tail a viable strategy accretion disk - 5% damage for every power up on this level requires accretion unified field theory has buttons to cycle field forwards or backwards when paused iceIX range and damage increased 15% electric tech in labs level is finally nerfed drains energy, but doesn't do damage pushes player away --- img/accretion disk.webp | Bin 0 -> 40706 bytes js/bullet.js | 2 +- js/index.js | 53 ++++++--- js/level.js | 33 ++++-- js/player.js | 48 +++------ js/spawn.js | 231 ++++++++++++++++++++++++++++++++++++---- js/tech.js | 25 ++++- style.css | 2 +- todo.txt | 47 +++----- 9 files changed, 323 insertions(+), 118 deletions(-) create mode 100644 img/accretion disk.webp diff --git a/img/accretion disk.webp b/img/accretion disk.webp new file mode 100644 index 0000000000000000000000000000000000000000..d8a6013cd9a5b693fcbcc196605bc5ec212e9f19 GIT binary patch literal 40706 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�N4LVLWB+7*px7q%K0aC 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 KU76qj0000Vc5K}M literal 0 HcmV?d00001 diff --git a/js/bullet.js b/js/bullet.js index b1bc458..72ba461 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -3035,7 +3035,7 @@ const b = { const me = bullet.length; const THRUST = 0.0018 const RADIUS = 18 - const SCALE = 1 - 0.12 / tech.bulletsLastLonger + const SCALE = 1 - 0.11 / tech.bulletsLastLonger bullet[me] = Bodies.polygon(where.x, where.y, 3, RADIUS, { angle: dir - Math.PI, // inertia: Infinity, diff --git a/js/index.js b/js/index.js index 5c22bad..3c216a6 100644 --- a/js/index.js +++ b/js/index.js @@ -351,7 +351,6 @@ const build = { } } - // fade alpha for all pixels // for (let i = 0; i < data.length; i += 4) { // if (data[i + 3] > 0) { @@ -424,11 +423,8 @@ const build = { } }, pauseGrid() { - // build.pixelDraw(); - build.generatePauseLeft() //makes the left side of the pause menu with the tech build.generatePauseRight() //makes the right side of the pause menu with the tech - document.getElementById("tech").style.display = "none" document.getElementById("guns").style.display = "none" document.getElementById("field").style.display = "none" @@ -436,12 +432,8 @@ const build = { document.getElementById("health-bg").style.display = "none" document.getElementById("defense-bar").style.display = "none" document.getElementById("damage-bar").style.display = "none" - - //show in game console - // document.getElementById("text-log").style.display = "inline" simulation.lastLogTime = m.cycle //hide in game console - }, generatePauseLeft() { //used for junk estimation @@ -504,12 +496,29 @@ ${junkCount ? `
JUNK: ${(junkCount / tota ${simulation.isCheating ? "

lore disabled" : ""} `; // deaths: ${mobs.mobDeaths}   - if (tech.isPauseSwitchField && !simulation.isChoosing) { + // if (tech.isPauseSwitchField && !simulation.isChoosing) { + // const style = localSettings.isHideImages ? `style="height:auto;"` : `style="background-image: url('img/field/${m.fieldUpgrades[m.fieldMode].name}${m.fieldMode === 0 ? m.fieldUpgrades[0].imageNumber : ""}.webp');"` + // text += `
+ //
+ //
  ${build.nameLink(m.fieldUpgrades[m.fieldMode].name)}
+ // ${m.fieldUpgrades[m.fieldMode].description}
` + if ((tech.isPauseSwitchField || simulation.testing)) { //&& !simulation.isChoosing + // const fieldNameP = m.fieldUpgrades[m.fieldMode > 1 ? m.fieldMode - 1 : m.fieldUpgrades.length - 1].name + // const fieldNameN = m.fieldUpgrades[m.fieldMode === m.fieldUpgrades.length - 2 ? 1 : m.fieldMode + 1].name + //button above for previous + text += `
+
` + //button for current const style = localSettings.isHideImages ? `style="height:auto;"` : `style="background-image: url('img/field/${m.fieldUpgrades[m.fieldMode].name}${m.fieldMode === 0 ? m.fieldUpgrades[0].imageNumber : ""}.webp');"` text += `
-
+
  ${build.nameLink(m.fieldUpgrades[m.fieldMode].name)}
${m.fieldUpgrades[m.fieldMode].description}
` + //button below for next + text += `
+
` + + } else { const style = localSettings.isHideImages ? `style="height:auto;"` : `style="background-image: url('img/field/${m.fieldUpgrades[m.fieldMode].name}${m.fieldMode === 0 ? m.fieldUpgrades[0].imageNumber : ""}.webp');"` text += `
@@ -1356,7 +1365,24 @@ window.addEventListener("keydown", function (event) { document.body.style.cursor = "auto"; if (tech.isPauseSwitchField || simulation.testing) { - document.getElementById("pause-field").addEventListener("click", () => { + document.getElementById("pause-field-previous").addEventListener("click", () => { + const energy = m.energy //save current energy + if (m.fieldMode === 4 && simulation.molecularMode > 0) { + simulation.molecularMode-- + m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription() + } else { + m.setField((m.fieldMode < 2) ? m.fieldUpgrades.length - 1 : m.fieldMode - 1) //cycle to previous field, skip field emitter + if (m.fieldMode === 4) { + simulation.molecularMode = 3 + m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription() + } + } + m.energy = energy //return to current energy + document.getElementById("pause-field").style.backgroundImage = `url('img/field/${m.fieldUpgrades[m.fieldMode].name}${m.fieldMode === 0 ? Math.floor(Math.random() * 10) : ""}.webp')` + document.getElementById("pause-field").innerHTML = `
  ${build.nameLink(m.fieldUpgrades[m.fieldMode].name)}
${m.fieldUpgrades[m.fieldMode].description}
` + }); + + document.getElementById("pause-field-next").addEventListener("click", () => { const energy = m.energy //save current energy if (m.fieldMode === 4 && simulation.molecularMode < 3) { simulation.molecularMode++ @@ -1371,10 +1397,7 @@ window.addEventListener("keydown", function (event) { m.energy = energy //return to current energy // document.getElementById("pause-field").innerHTML = `
  ${m.fieldUpgrades[m.fieldMode].name}
${m.fieldUpgrades[m.fieldMode].description}` document.getElementById("pause-field").style.backgroundImage = `url('img/field/${m.fieldUpgrades[m.fieldMode].name}${m.fieldMode === 0 ? Math.floor(Math.random() * 10) : ""}.webp')` - document.getElementById("pause-field").innerHTML = ` -
-
  ${build.nameLink(m.fieldUpgrades[m.fieldMode].name)}
- ${m.fieldUpgrades[m.fieldMode].description}
` + document.getElementById("pause-field").innerHTML = `
  ${build.nameLink(m.fieldUpgrades[m.fieldMode].name)}
${m.fieldUpgrades[m.fieldMode].description}
` }); } } diff --git a/js/level.js b/js/level.js index 4e72d84..cfb4fba 100644 --- a/js/level.js +++ b/js/level.js @@ -19,8 +19,8 @@ const level = { // simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode // simulation.isHorizontalFlipped = true // tech.giveTech("performance") - // level.difficultyIncrease(3 * 2) //30 is near max on hard //60 is near max on why - // m.maxHealth = m.health = 100000000 + // level.difficultyIncrease(7 * 2) //30 is near max on hard //60 is near max on why + // m.maxHealth = m.health = 1//00000000 // m.maxEnergy = m.energy = 10000000 // tech.isRerollDamage = true // powerUps.research.changeRerolls(99999) @@ -47,7 +47,7 @@ const level = { // for (let i = 0; i < 1; i++) tech.giveTech("tungsten carbide") // m.lastKillCycle = m.cycle // for (let i = 0; i < 1; ++i) tech.giveTech("swarf") - // for (let i = 0; i < 1; ++i) tech.giveTech("CPT symmetry") + // for (let i = 0; i < 1; ++i) tech.giveTech("unified field theory") // for (let i = 0; i < 3; i++) powerUps.directSpawn(450, -50, "tech"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "research"); // for (let i = 0; i < 100; i++) powerUps.directSpawn(1750, -500, "coupling"); @@ -57,8 +57,8 @@ const level = { // for (let i = 0; i < 1; ++i) spawn.laserLayer(1400, -500) // Matter.Body.setPosition(player, { x: -200, y: -3330 }); // for (let i = 0; i < 4; ++i) spawn.laserLayer(1300, -500 + 100 * Math.random()) - // for (let i = 0; i < 3; ++i) spawn.laser(1900, -500) - // for (let i = 0; i < 1; ++i) spawn.laserBombingBoss(1900, -2500) + // for (let i = 0; i < 1; ++i) spawn.laserLayerBoss(1900, -500) + // for (let i = 0; i < 1; ++i) spawn.dragonFlyBoss(1900, -500) // spawn.beetleBoss(1900, -500, 25) // spawn.zombie(-3000, -500 + 300 * Math.random(), 30, 5, "white") // zombie(x, y, radius, sides, color) // for (let i = 0; i < 5; ++i) spawn.starter(1000 + 1000 * Math.random(), -500 + 300 * Math.random()) @@ -4996,10 +4996,7 @@ const level = { powerUps.directSpawn(x + 998, y - 333, "tech", false); } 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 } let isSpawnedMobs = false doCustom.push( () => { @@ -5014,9 +5011,23 @@ const level = { if (Vector.magnitudeSquared(Vector.sub(m.pos, powerUp1.position)) < 90000) { //zone radius is 300 //damage player and drain energy if (m.immuneCycle < m.cycle) { - m.damage(0.01); - if (m.energy > 0.1) m.energy -= 0.02 + if (m.energy < 0.02) { + //push out + // const force = Vector.mult(Vector.normalise(Vector.sub(player.position, powerUp1.position)), 0.02 * player.mass) + // player.force.x += force.x + // player.force.y += force.y + player.force.x += (player.position.x > powerUp1.position.x) ? 0.02 * player.mass : - 0.02 * player.mass + + } else { + m.energy -= 0.01 + //friction + Matter.Body.setVelocity(player, { + x: player.velocity.x * 0.45, + y: player.velocity.y * 0.98 + }); + } } + //draw electricity going towards player const unit = Vector.normalise(Vector.sub(m.pos, powerUp1.position)) let xElec = powerUp1.position.x + 40 * unit.x; diff --git a/js/player.js b/js/player.js index e0df3d5..afdab53 100644 --- a/js/player.js +++ b/js/player.js @@ -540,10 +540,10 @@ const m = { } }, baseHealth: 1, - setMaxHealth() { + setMaxHealth(isMessage) { m.maxHealth = m.baseHealth + tech.extraMaxHealth + 3 * tech.isFallingDamage + 4 * tech.isFlipFlop * tech.isFlipFlopOn * tech.isFlipFlopHealth document.getElementById("health-bg").style.width = `${Math.floor(300 * m.maxHealth)}px` - simulation.makeTextLog(`m.maxHealth = ${m.maxHealth.toFixed(2)}`) + if (isMessage) simulation.makeTextLog(`m.maxHealth = ${m.maxHealth.toFixed(2)}`) if (m.health > m.maxHealth) m.health = m.maxHealth; m.displayHealth(); }, @@ -605,10 +605,7 @@ const m = { let history = m.history[(m.cycle - steps) % 600] Matter.Body.setPosition(player, history.position); - Matter.Body.setVelocity(player, { - x: history.velocity.x, - y: history.velocity.y - }); + Matter.Body.setVelocity(player, { x: history.velocity.x, y: history.velocity.y }); m.yOff = history.yOff if (m.yOff < 48) { m.doCrouch() @@ -2125,14 +2122,8 @@ const m = { hole: { isOn: false, isReady: false, - pos1: { - x: 0, - y: 0 - }, - pos2: { - x: 0, - y: 0 - }, + pos1: { x: 0, y: 0 }, + pos2: { x: 0, y: 0 }, }, fieldArc: 0, fieldThreshold: 0, @@ -2175,20 +2166,14 @@ const m = { m.calculateFieldThreshold(); //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) m.isBodiesAsleep = true; m.wakeCheck(); - m.setMaxEnergy(); - m.setMaxHealth(); + m.setMaxEnergy(false); + m.setMaxHealth(false); m.couplingChange() m.hole = { isOn: false, isReady: false, - pos1: { - x: 0, - y: 0 - }, - pos2: { - x: 0, - y: 0 - }, + pos1: { x: 0, y: 0 }, + pos2: { x: 0, y: 0 }, } }, setMaxEnergy(isMessage = true) { @@ -3436,15 +3421,9 @@ const m = { } } else if (simulation.molecularMode === 1) { m.energy -= 0.33; - const direction = { - x: Math.cos(m.angle), - y: Math.sin(m.angle) - } + const direction = { x: Math.cos(m.angle), y: Math.sin(m.angle) } const push = Vector.mult(Vector.perp(direction), 0.08) - b.missile({ - x: m.pos.x + 30 * direction.x, - y: m.pos.y + 30 * direction.y - }, m.angle, -15) + b.missile({ x: m.pos.x + 30 * direction.x, y: m.pos.y + 30 * direction.y }, m.angle, -15) bullet[bullet.length - 1].force.x += push.x * (Math.random() - 0.5) bullet[bullet.length - 1].force.y += 0.005 + push.y * (Math.random() - 0.5) // b.missile({ x: m.pos.x, y: m.pos.y - 40 }, -Math.PI / 2 + 0.5 * (Math.random() - 0.5), 0, 1) @@ -3538,10 +3517,7 @@ const m = { radiusLimit: 10, damage: 0.8, setPositionToNose() { - const nose = { - x: m.pos.x + 10 * Math.cos(m.angle), - y: m.pos.y + 10 * Math.sin(m.angle) - } + const nose = { x: m.pos.x + 10 * Math.cos(m.angle), y: m.pos.y + 10 * Math.sin(m.angle) } Matter.Body.setPosition(this, Vector.add(nose, Vector.mult(Vector.normalise(Vector.sub(nose, m.pos)), circleRadiusScale * this.circleRadius))); }, fire() { diff --git a/js/spawn.js b/js/spawn.js index 9f7c1df..691729b 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -6,7 +6,8 @@ const spawn = { "orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "powerUpBossBaby", "streamBoss", "pulsarBoss", "spawnerBossCulture", "grenadierBoss", "growBossCulture", "blinkBoss", "snakeSpitBoss", "laserBombingBoss", "blockBoss", "revolutionBoss", "slashBoss", "shieldingBoss", - "timeSkipBoss", "dragonFlyBoss", "beetleBoss", "sneakBoss", "mantisBoss" + "timeSkipBoss", "dragonFlyBoss", "beetleBoss", "sneakBoss", "mantisBoss", + "laserLayerBoss" ], bossTypeSpawnOrder: [], //preset list of boss names calculated at the start of a run by the randomSeed bossTypeSpawnIndex: 0, //increases as the boss type cycles @@ -4216,7 +4217,7 @@ const spawn = { ctx.beginPath(); ctx.moveTo(this.lasers[i].a.x, this.lasers[i].a.y); ctx.lineTo(this.lasers[i].b.x, this.lasers[i].b.y); - ctx.lineWidth = 5 + 5 * this.lasers[i].fade; + ctx.lineWidth = 2 + 40 - 40 * this.lasers[i].fade; ctx.strokeStyle = `rgba(255,0,100,${0.02 + 0.1 * this.lasers[i].fade})`; ctx.stroke(); } @@ -4238,21 +4239,207 @@ const spawn = { this.force.x += force.x; this.force.y += force.y; } - }, - me.do = function () { - this.cycle++ - this.torque = this.lookTorque * this.inertia * 0.6; - this.seePlayerCheck(); - this.checkStatus(); - this.drift(); - //add new laser to lasers array - this.addLaser() - this.fireLaser() - // if (this.seePlayer.recall) { - // //set direction to turn to fire - // if (!(simulation.cycle % this.seePlayerFreq)) this.fireDir = Vector.normalise(Vector.sub(this.seePlayer.position, this.position)); - // } - }; + } + me.do = function () { + this.cycle++ + this.torque = this.lookTorque * this.inertia * 0.6; + this.seePlayerCheck(); + this.checkStatus(); + this.drift(); + //add new laser to lasers array + this.addLaser() + this.fireLaser() + // if (this.seePlayer.recall) { + // //set direction to turn to fire + // if (!(simulation.cycle % this.seePlayerFreq)) this.fireDir = Vector.normalise(Vector.sub(this.seePlayer.position, this.position)); + // } + }; + }, + laserLayerBoss(x, y, radius = 65) { + const color = "#f09" + mobs.spawn(x, y, 4, radius, color); + let me = mob[mob.length - 1]; + me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front + for (let i = 0; i < 4; i += 2) { + let spike = Vector.mult(Vector.normalise(Vector.sub(me.vertices[i], me.position)), radius * 2) + me.vertices[i].x = me.position.x + spike.x + me.vertices[i].y = me.position.y + spike.y + } + Matter.Body.rotate(me, Math.random() * Math.PI * 2); + me.accelMag = 0.0001 * simulation.accelScale; + + + me.isBoss = true; + me.onDeath = function () { + powerUps.spawnBossPowerUp(this.position.x, this.position.y) + }; + Matter.Body.setDensity(me, 0.03); //extra dense //normal is 0.001 //makes effective life much larger + me.damageReduction = 0.25 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) + me.startingDamageReduction = me.damageReduction + me.isInvulnerable = false + me.nextHealthThreshold = 0.75 + me.invulnerableCount = 0 + me.onDamage = function () { + if (this.health < this.nextHealthThreshold) { + this.health = this.nextHealthThreshold - 0.01 + this.nextHealthThreshold = Math.floor(this.health * 4) / 4 //0.75,0.5,0.25 + this.invulnerableCount = 120 + this.isInvulnerable = true + this.damageReduction = 0 + + // if (this.health > 0.74) this.laserLimit += 2 //increase total lasers once player gets into combat + // this.addLaser() + this.laserDelay = 130 + } + }; + me.lasers = [] //keeps track of static laser beams + // me.laserLimit = 1 + 2 * (simulation.difficultyMode < 3 ? 1 : 2) + me.laserLimit = 2 + (simulation.difficultyMode < 3 ? 1 : 2) + me.fireDelay = Math.max(75, 140 - simulation.difficulty * 0.5) + me.cycle = 0 + me.laserDelay = 210 + me.addLaser = function () { + if (this.cycle > this.laserDelay) { + this.cycle = 0 + const seeRange = 6000; + let add = (where, angle) => { + const v1 = { x: where.x + seeRange * Math.cos(angle), y: where.y + seeRange * Math.sin(angle) }; + const v2 = { x: where.x + seeRange * Math.cos(angle + Math.PI), y: where.y + seeRange * Math.sin(angle + Math.PI) }; + //find where v1,v2 hit walls and make them stop there + let best1 = vertexCollision(where, v1, [map]); + let best2 = vertexCollision(where, v2, [map]); + if (best2.who === null) { + best2.x = v2.x + best2.y = v2.y + } + if (best1.who === null) { //if the path never hits the map , just stop at seeRange + best1.x = v1.x + best1.y = v1.y + } + if (best1.y > best2.y) { //make laser beams always fire from top to bottom so they are predicable, and not stopped by blocks on the ground + const save1X = best1.x + const save1Y = best1.y + best1.x = best2.x + best1.y = best2.y + best2.x = save1X + best2.y = save1Y + } + this.lasers.push({ a: { x: best1.x, y: best1.y }, b: { x: best2.x, y: best2.y }, fade: 0 }) + } + // add(m.pos, m.angle) + add(m.pos, this.angle + Math.PI / 4 + Math.PI / 2) + add(this.position, this.angle + Math.PI / 4) + //friction to animate the mob dropping something + Matter.Body.setVelocity(this, Vector.mult(this.velocity, 0.05)); + Matter.Body.setAngularVelocity(this, this.angularVelocity * 0.05) + if (!this.seePlayer.recall && (Vector.magnitude(Vector.sub(this.position, this.driftGoal)) < 200 || 0.3 > Math.random())) { + //used in drift when can't find player + const radius = Math.random() * 1000; + const angle = Math.random() * 2 * Math.PI; + this.driftGoal = Vector.add(this.driftCenter, { x: radius * Math.cos(angle), y: radius * Math.sin(angle) }) + } + } + } + me.fireLaser = function () { + for (let i = 0; i < this.lasers.length; i++) { //fire all lasers in the array + let best = vertexCollision(this.lasers[i].a, this.lasers[i].b, m.isCloak ? [body] : [body, [playerBody, playerHead]]); //not checking map to fix not hitting player bug, this might make some lasers look strange when the map changes + if (this.lasers[i].fade > 0.99) { + if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) { // hitting player + m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage after getting hit + const dmg = 0.05 * simulation.dmgScale; + m.damage(dmg); + simulation.drawList.push({ //add dmg to draw queue + x: best.x, + y: best.y, + radius: dmg * 1500, + color: "rgba(255,0,100,0.5)", + time: 20 + }); + this.lasers.splice(i, 1) //remove this laser node + if (this.distanceToPlayer < 1000) { //mob jumps away from player + const forceMag = 0.03 * this.mass; + const angle = Math.atan2(this.seePlayer.position.y - this.position.y, this.seePlayer.position.x - this.position.x); + this.force.x -= 2 * forceMag * Math.cos(angle); + this.force.y -= 2 * forceMag * Math.sin(angle); // - 0.0007 * this.mass; //antigravity + } + } else if (best.who && best.who.classType === "body") { //hitting block + ctx.beginPath(); + ctx.moveTo(best.x, best.y); + ctx.lineTo(this.lasers[i].a.x, this.lasers[i].a.y); + ctx.strokeStyle = `rgb(255,0,100)`; + ctx.lineWidth = 2; + ctx.setLineDash([50 + 120 * Math.random(), 50 * Math.random()]); + ctx.stroke(); + ctx.setLineDash([]); + } else { //hitting nothing + ctx.beginPath(); + ctx.moveTo(this.lasers[i].b.x, this.lasers[i].b.y); + ctx.lineTo(this.lasers[i].a.x, this.lasers[i].a.y); + ctx.strokeStyle = `rgb(255,0,100)`; + ctx.lineWidth = 2; + ctx.setLineDash([50 + 120 * Math.random(), 50 * Math.random()]); + ctx.stroke(); + ctx.setLineDash([]); + } + } else {//fade in warning + this.lasers[i].fade += 0.007 + ctx.beginPath(); + ctx.moveTo(this.lasers[i].a.x, this.lasers[i].a.y); + ctx.lineTo(this.lasers[i].b.x, this.lasers[i].b.y); + ctx.lineWidth = 2 + 40 - 40 * this.lasers[i].fade; + ctx.strokeStyle = `rgba(255,0,100,${0.02 + 0.1 * this.lasers[i].fade})`; + ctx.stroke(); + if (this.lasers[i].fade > 0.99) { + this.lasers[i].fade = 1; + if (this.lasers.length > this.laserLimit) this.lasers.shift() //cap total lasers + break + } + } + } + } + me.driftCenter = { ...me.position }; //copy position with out reference so it doesn't change as mob moves + const r = Math.random() * 100; + const a = Math.random() * 2 * Math.PI; + me.driftGoal = Vector.add(me.driftCenter, { x: r * Math.cos(a), y: r * Math.sin(a) }) //updated in addLaser() + me.drift = function () { + //accelerate towards the player + if (this.seePlayer.recall) { + const force = Vector.mult(Vector.normalise(Vector.sub(this.seePlayer.position, this.position)), this.accelMag * this.mass) + this.force.x += force.x; + this.force.y += force.y; + } else { //drift + const force = Vector.mult(Vector.normalise(Vector.sub(this.driftGoal, this.position)), 0.00001 * this.mass) + // const force = Vector.mult(this.driftGoal, 0.0001 * this.mass) + this.force.x += force.x; + this.force.y += force.y; + } + this.torque = this.lookTorque * this.inertia * 0.9; + } + me.do = function () { + this.cycle++ + this.seePlayerCheck(); + this.checkStatus(); + this.drift(); + //add new laser to lasers array + this.addLaser() + this.fireLaser() + if (this.isInvulnerable) { + this.invulnerableCount-- + if (this.invulnerableCount < 0) { + this.isInvulnerable = false + this.damageReduction = this.startingDamageReduction + } + //draw invulnerable + 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 = 13 + 5 * Math.random(); + ctx.strokeStyle = `rgba(255,255,255,${0.5 + 0.2 * Math.random()})`; + ctx.stroke(); + } + }; }, laser(x, y, radius = 30) { const color = "#f00" @@ -4325,7 +4512,6 @@ const spawn = { laserBoss(x, y, radius = 30) { mobs.spawn(x, y, 3, radius, "#f00"); let me = mob[mob.length - 1]; - setTimeout(() => { //fix mob in place, but allow rotation me.constraint = Constraint.create({ pointA: { x: me.position.x, y: me.position.y }, @@ -5551,7 +5737,7 @@ const spawn = { let me = mob[mob.length - 1]; Matter.Body.setDensity(me, 0.002); //extra dense //normal is 0.001 //makes effective life much larger me.isBoss = true; - me.damageReduction = 0.2 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) + me.damageReduction = 0.25 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.accelMag = 0.0017 * Math.sqrt(simulation.accelScale); me.frictionAir = 0.01; @@ -5667,7 +5853,7 @@ const spawn = { this.isVanished = true this.cloak(); //teleport to near the end of player history - Matter.Body.setPosition(this, m.history[Math.floor((m.history.length - 1) * (0.66 + 0.33 * Math.random()))].position) + Matter.Body.setPosition(this, m.history[Math.floor((m.history.length - 1) * (0.3 + 0.4 * Math.random()))].position) Matter.Body.setVelocity(this, { x: 0, y: 0 }); this.damageReduction = 0 //immune to harm for the rest of this game cycle } @@ -7176,7 +7362,7 @@ const spawn = { let me = mob[mob.length - 1]; me.isBoss = true; Matter.Body.setDensity(me, 0.00165 + 0.00011 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger - me.startingDamageReduction = 0.14 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) + me.startingDamageReduction = 0.1 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.damageReduction = 0 me.isInvulnerable = true @@ -7283,6 +7469,9 @@ const spawn = { if (this.snakeHeadID === mob[i].id) { mob[i].isInvulnerable = false mob[i].damageReduction = mob[i].startingDamageReduction + } else if (mob[i].isSnakeTail) { + //damage all snake tails + mob[i].health *= 0.95 } } }, 500); diff --git a/js/tech.js b/js/tech.js index a62ab72..aaf08b3 100644 --- a/js/tech.js +++ b/js/tech.js @@ -231,6 +231,7 @@ const tech = { // } // } // } + if (tech.isPowerUpDamage) dmg *= 1 + 0.05 * powerUp.length if (tech.isDamageCooldown) dmg *= m.lastKillCycle + tech.isDamageCooldownTime > m.cycle ? 0.45 : 4.33 if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 1.93 if (tech.isDivisor && b.activeGun !== undefined && b.activeGun !== null && b.guns[b.activeGun].ammo % 3 === 0) dmg *= 1.77 @@ -3338,6 +3339,27 @@ const tech = { powerUps.setPowerUpMode(); }, }, + { + name: "accretion disk", + descriptionFunction() { + return `+5% damage (${5 * powerUp.length}%)
for each power up that exists on this level` + }, + maxCount: 1, + count: 0, + frequency: 3, + frequencyDefault: 3, + isHealTech: true, + allowed() { + return tech.isHealAttract + }, + requires: "accretion", + effect() { + tech.isPowerUpDamage = true + }, + remove() { + tech.isPowerUpDamage = false + }, + }, { name: "self-assembly", descriptionFunction() { @@ -4067,7 +4089,7 @@ const tech = { }, { name: "unified field theory", - description: `when paused clicking your field cycles it
double the frequency of finding fieldtech`, + description: `in the pause menu click to switch fields
double the frequency of finding fieldtech`, maxCount: 1, count: 0, frequency: 1, @@ -12166,4 +12188,5 @@ const tech = { isMobLowHealth: null, isDamageCooldown: null, isDamageCooldownTime: null, + isPowerUpDamage: null, } \ No newline at end of file diff --git a/style.css b/style.css index b254cf7..216d5f9 100644 --- a/style.css +++ b/style.css @@ -1264,7 +1264,7 @@ summary { } 100% { - background-color: rgb(200, 255, 255) + background-color: rgb(0, 204, 255) } } diff --git a/todo.txt b/todo.txt index 30494eb..e6d3a66 100644 --- a/todo.txt +++ b/todo.txt @@ -1,41 +1,24 @@ ******************************************************** NEXT PATCH ************************************************** -mob: laserLayer - leaves behind lasers that persist for a few seconds -ghoster mobs do 66% less damage, but they eject your ammo - -grappling hook tech rupture renamed swarf - fires several nails at nearby mobs, not explosions -grappling hook 6->9 energy per second -CIWS 18->10 energy -reel +40->75 energy reeling blocks -wormhole 5->7% duplication -cloaking no longer drains energy, this fixes a can't cloak bug - dazzler no longer drains energy - dazzler range reduced by 15% - dazzler stuns for 3->2 seconds -zero point energy 100->166 max energy -expansion 40->77 max energy -annihilation -33% of max energy -> 10 energy -dynamical systems is no longer a field tech 35->30 damage -tessellation is no longer a field tech 50->35 defense -yield stress removed - topological defect 80->111% damage - brittle 80->111% damage -commodities exchange 6-12 -> 10-14 power ups -heat engine 50->40% damage -flame test grenades clusters explode 40% faster -alternator uses 10->0% energy for harpoon - -finally made a shared vertexCollision function - this might cause some bugs with laser-like effects... +laserLayerBoss - sends lasers to player's location +snakes bosses - after you kill a tail piece the rest of the tails lose 5% life + this makes targeting any part of the tail a viable strategy +accretion disk - 5% damage for every power up on this level + requires accretion +unified field theory has buttons to cycle field forwards or backwards when paused +iceIX range and damage increased 15% +electric tech in labs level is finally nerfed + drains energy, but doesn't do damage + pushes player away *********************************************************** TODO ***************************************************** -increase damage for each not picked up power up on the level - -make a laserLayerBoss - add lasers on player's history +boss - tracks the position, velocity, angle of power ups, blocks, and bullets it fires + reactor only? + will rewind time + after damage threshold? + does it track player bullets? button/switch input ideas from Cocoon game pick up blocks that have a rubber band attached to a sliding switch