diff --git a/js/bullet.js b/js/bullet.js index 67ad315..7650726 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -97,10 +97,10 @@ const b = { simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`); m.fireCDcycle = m.cycle + 30; //fire cooldown if (tech.isAmmoFromHealth) { - const amount = 0.01 + const amount = 0.02 if (tech.isEnergyHealth) { - if (m.maxEnergy > amount) { - tech.healMaxEnergyBonus -= amount + if (m.maxEnergy > amount * 2) { + tech.healMaxEnergyBonus -= amount * 2 m.setMaxEnergy(); for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 50 * (Math.random() - 0.5), m.pos.y + 50 * (Math.random() - 0.5), "ammo"); } diff --git a/js/level.js b/js/level.js index e142752..6c262f8 100644 --- a/js/level.js +++ b/js/level.js @@ -18,18 +18,18 @@ const level = { // simulation.enableConstructMode() //used to build maps in testing mode // simulation.isHorizontalFlipped = true // tech.giveTech("performance") - // level.difficultyIncrease(6 * 4) //30 is near max on hard //60 is near max on why + // level.difficultyIncrease(13 * 4) //30 is near max on hard //60 is near max on why // m.maxHealth = m.health = 100 // tech.isRerollDamage = true - // powerUps.research.changeRerolls(50) + // powerUps.research.changeRerolls(500) // m.immuneCycle = Infinity //you can't take damage // tech.tech[297].frequency = 100 // m.couplingChange(5) - // m.setField("pilot wave") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave + // m.setField("standing wave") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave // simulation.molecularMode = 2 // m.damage(0.1); // b.giveGuns("nail gun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser - // b.guns[0].ammo = 1000000 + // b.guns[0].ammo = 10000 // for (let i = 0; i < 1; ++i) tech.giveTech("needle gun") // tech.giveTech("pressure vessel") @@ -47,7 +47,7 @@ const level = { // tech.addJunkTechToPool(0.5) // tech.tech[322].frequency = 100 // spawn.tetherBoss(1900, -500, { x: 1900, y: -500 }) - // for (let i = 0; i < 36; ++i) tech.giveTech() + // for (let i = 0; i < 40; ++i) tech.giveTech() // for (let i = 0; i < 13; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research"); if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************ // for (let i = 0; i < 4; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech"); @@ -58,13 +58,13 @@ const level = { // lore.techCount = 2 // simulation.isCheating = false //true; // level.levelsCleared = 10 - // mobs.mobDeaths = 200 // localSettings.loreCount = 7 //this sets what conversation is heard // if (localSettings.isAllowed) localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage // level.onLevel = -1 //this sets level.levels[level.onLevel] = undefined which is required to run the conversation // level.null() // localSettings.isHuman = true // tech.isNoDraftPause = false //disable pause + // mobs.mobDeaths = 200 // for (let i = 0; i < 13; i++) level.nextLevel(); //jump to final boss // lore.unlockTesting(); @@ -3139,7 +3139,7 @@ const level = { slime.levelRise(0.1) ctx.fillStyle = "rgba(0,255,255,0.1)" - ctx.fillRect(5400, -550, 300, 350) + ctx.fillRect(5385, -550, 300, 250) }; level.setPosToSpawn(0, -250); //normal spawn @@ -3152,18 +3152,7 @@ const level = { simulation.zoomTransition(level.defaultZoom) document.body.style.backgroundColor = "#ddd"; - powerUps.spawn(1675, -50, "ammo"); - powerUps.spawn(3350, -75, "ammo"); - powerUps.spawn(3925, -50, "ammo"); - powerUps.spawn(4250, -75, "ammo"); - powerUps.spawn(4550, -75, "ammo"); - powerUps.spawn(5025, -50, "ammo"); - powerUps.spawn(4725, -50, "ammo"); - powerUps.spawn(4975, -350, "ammo"); - powerUps.spawn(5125, -350, "ammo"); - powerUps.spawn(5075, -425, "ammo"); - powerUps.spawn(5050, -400, "ammo"); - powerUps.spawn(5075, -425, "ammo"); + for (let i = 0; i < 16; i++) powerUps.spawn(4600 + 40 * i, -30, "ammo"); spawn.mapRect(-1950, 0, 8200, 1800); //ground spawn.mapRect(-1950, -1500, 1800, 1900); //left wall @@ -3181,7 +3170,7 @@ const level = { spawn.mapRect(5400, -300, 400, 400); //right wall spawn.mapRect(5700, -3300, 1800, 5100); //right wall spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump - spawn.mapRect(5425, -650, 375, 450); //blocking exit + spawn.mapRect(5403, -650, 400, 450); //blocking exit // spawn.secondaryBossChance(4800, -500) //no bonus bosses on final level if (mobs.mobDeaths < level.levelsCleared && !simulation.isCheating) { //pacifist run @@ -3203,7 +3192,7 @@ const level = { slime.query(); slime.levelRise(0.1) ctx.fillStyle = "rgba(0,255,255,0.1)" - ctx.fillRect(-5400 - 300, -550, 300, 350) + ctx.fillRect(-5385 - 300, -550, 300, 250) }; } if (mobs.mobDeaths < level.levelsCleared && localSettings.loreCount > 5 && !simulation.isCheating) { diff --git a/js/mob.js b/js/mob.js index a3590df..4759662 100644 --- a/js/mob.js +++ b/js/mob.js @@ -1228,7 +1228,7 @@ const mobs = { // }); //wrapping in animation frame prevents errors, probably // } } - if (tech.isEnergyLoss) m.energy *= 0.75; + if (tech.isEnergyLoss) m.energy *= 0.8; powerUps.spawnRandomPowerUp(this.position.x, this.position.y); m.lastKillCycle = m.cycle; //tracks the last time a kill was made, mostly used in simulation.checks() mobs.mobDeaths++ diff --git a/js/player.js b/js/player.js index e4e4829..4c8e58c 100644 --- a/js/player.js +++ b/js/player.js @@ -2715,7 +2715,7 @@ const m = { //draw field everywhere ctx.globalCompositeOperation = "saturation" ctx.fillStyle = "#ccc"; - ctx.fillRect(-100000, -100000, 200000, 200000) + ctx.fillRect(-50000, -50000, 100000, 100000) ctx.globalCompositeOperation = "source-over" //stop time m.isBodiesAsleep = true; @@ -3173,7 +3173,8 @@ const m = { name: "pilot wave", //
blocks can't collide with intangible mobs //field radius decreases out of line of sight - description: "use energy to guide blocks
unlock tech from other fields
generate 6 energy per second", + //unlock tech from other fields + description: "use energy to guide blocks
tech, fields, and guns have +1 choice
generate 6 energy per second", effect: () => { m.fieldMeterColor = "#333" m.eyeFillColor = m.fieldMeterColor diff --git a/js/powerup.js b/js/powerup.js index 013ea25..0a1b836 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -650,7 +650,7 @@ const powerUps = { for (let i = 0; i < b.guns.length; i++) { if (!b.guns[i].have) options.push(i); } - let totalChoices = Math.min(options.length, tech.isDeterminism ? 1 : 2 + tech.extraChoices) + let totalChoices = Math.min(options.length, (tech.isDeterminism ? 1 : 2) + tech.extraChoices + (m.fieldUpgrades[m.fieldMode].name === "pilot wave")) if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay function removeOption(index) { for (let i = 0; i < options.length; i++) { @@ -787,7 +787,7 @@ const powerUps = { for (let i = 1; i < m.fieldUpgrades.length; i++) { //skip field emitter if (i !== m.fieldMode) options.push(i); } - let totalChoices = Math.min(options.length, tech.isDeterminism ? 1 : 2 + tech.extraChoices) + let totalChoices = Math.min(options.length, (tech.isDeterminism ? 1 : 2) + tech.extraChoices + (m.fieldUpgrades[m.fieldMode].name === "pilot wave")) if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay function removeOption(index) { @@ -946,7 +946,7 @@ const powerUps = { } //set total choices - let totalChoices = tech.isDeterminism ? 1 : 3 + tech.extraChoices + let totalChoices = (tech.isDeterminism ? 1 : 3) + tech.extraChoices + (m.fieldUpgrades[m.fieldMode].name === "pilot wave") if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay if (optionLengthNoDuplicates < totalChoices + 1) { //if not enough options for all the choices // console.log('if not enough options for all the choices') diff --git a/js/spawn.js b/js/spawn.js index e4100a6..3e1558d 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -367,7 +367,7 @@ const spawn = { me.cycle = 1; Matter.Body.setDensity(me, 0.2); //extra dense //normal is 0.001 //makes effective life much larger - me.damageReduction = 0.16 + me.damageReduction = 0.12 me.startingDamageReduction = me.damageReduction me.nextHealthThreshold = 0.999 me.invulnerableCount = 0 @@ -380,7 +380,7 @@ const spawn = { if (this.health === 1) me.cycle = 1; //reset fight this.health = this.nextHealthThreshold - 0.01 this.nextHealthThreshold = Math.floor(this.health * 4) / 4 //0.75,0.5,0.25 - this.invulnerableCount = 200 + 10 * simulation.difficultyMode //how long does invulnerable time last + this.invulnerableCount = 220 + 10 * simulation.difficultyMode //how long does invulnerable time last this.isInvulnerable = true this.damageReduction = 0 } @@ -408,15 +408,23 @@ const spawn = { } } me.damageReductionDecay = function() { //slowly make the boss take more damage over time //damageReduction resets with each invulnerability phase - //only decay once a second //only decay if the player has done damage in the last 4 seconds - if (!(me.cycle % 60) && this.lastDamageCycle + 240 > this.cycle) this.damageReduction *= 1.02 - // console.log(this.damageReduction) + if (!(me.cycle % 60) && this.lastDamageCycle + 240 > this.cycle) this.damageReduction *= 1.015 //only decay once a second //only decay if the player has done damage in the last 4 seconds } me.maxMobs = 400 me.mode = [{ + name: "boulders", + spawnRate: 120 - 6 * simulation.difficultyMode, + do() { + if (!(me.cycle % this.spawnRate) && mob.length < me.maxMobs) { + me.boulder(me.position.x, me.position.y + 250) + } + }, + enter() {}, + exit() {}, + }, { name: "mobs", whoSpawn: spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)], - spawnRate: 300 - 12 * simulation.difficultyMode, + spawnRate: 240 - 20 * simulation.difficultyMode, do() { if (!(me.cycle % this.spawnRate) && mob.length < me.maxMobs) { me.torque += 0.000015 * me.inertia; //spin @@ -435,13 +443,14 @@ const spawn = { }, { name: "hoppers", - spawnRate: 400 - 14 * simulation.difficultyMode, + spawnRate: 420 - 16 * simulation.difficultyMode, do() { if (!(me.cycle % this.spawnRate) && mob.length < me.maxMobs) { me.torque += 0.00002 * me.inertia; //spin for (let i = 0; i < 6; i++) { const vertex = me.vertices[i] - spawn.hopBullet(vertex.x + 50 * (Math.random() - 0.5), vertex.y + 50 * (Math.random() - 0.5)); + spawn.hopBullet(vertex.x + 50 * (Math.random() - 0.5), vertex.y + 50 * (Math.random() - 0.5), 13 + Math.ceil(Math.random() * 8)); //hopBullet(x, y, radius = 10 + Math.ceil(Math.random() * 8)) + Matter.Body.setDensity(mob[mob.length - 1], 0.002); //normal is 0.001 const velocity = Vector.mult(Vector.perp(Vector.normalise(Vector.sub(me.position, vertex))), -18) //give the mob a rotational velocity as if they were attached to a vertex Matter.Body.setVelocity(mob[mob.length - 1], { x: me.velocity.x + velocity.x, @@ -455,14 +464,14 @@ const spawn = { }, { name: "seekers", - spawnRate: 60 - 2 * simulation.difficultyMode, + spawnRate: 60 - 3 * simulation.difficultyMode, do() { if (!(me.cycle % this.spawnRate) && mob.length < me.maxMobs) { //spawn seeker const index = Math.floor((me.cycle % 360) / 60) - spawn.seeker(me.vertices[index].x, me.vertices[index].y, 20 * (0.5 + Math.random()), 9); //give the bullet a rotational velocity as if they were attached to a vertex + spawn.seeker(me.vertices[index].x, me.vertices[index].y, 18 * (0.5 + Math.random())); //seeker(x, y, radius = 8, sides = 6) const who = mob[mob.length - 1] Matter.Body.setDensity(who, 0.00003); //normal is 0.001 - who.timeLeft = 720 + 15 * simulation.difficulty //* (0.8 + 0.4 * Math.random()); + who.timeLeft = 720 + 30 * simulation.difficulty //* (0.8 + 0.4 * Math.random()); who.accelMag = 0.0004 * simulation.accelScale; //* (0.8 + 0.4 * Math.random()) who.frictionAir = 0.01 //* (0.8 + 0.4 * Math.random()); } @@ -473,7 +482,7 @@ const spawn = { { name: "mines", bombCycle: 0, - bombInterval: 36 - 2 * simulation.difficultyMode, + bombInterval: 34 - 2 * simulation.difficultyMode, do() { const yOff = 120 this.bombCycle++ @@ -535,7 +544,7 @@ const spawn = { }, { name: "orbiters", - spawnRate: 26 - 2 * simulation.difficultyMode, + spawnRate: 30 - 2 * simulation.difficultyMode, do() { if (!(me.cycle % this.spawnRate) && mob.length < me.maxMobs) { const speed = (0.01 + 0.0005 * simulation.difficultyMode) * ((Math.random() < 0.5) ? 0.85 : -1.15) @@ -548,20 +557,20 @@ const spawn = { }, { name: "laser", - spinForce: 0.00000015, + spinForce: 0.00000012, // * (Math.random() < 0.5 ? -1 : 1), fadeCycle: 0, //fades in over 4 seconds do() { this.fadeCycle++ if (this.fadeCycle > 0) { me.torque += this.spinForce * me.inertia; //spin //0.00000015 - if (this.fadeCycle > 360) this.fadeCycle = -120 + 2 * simulation.difficultyMode * simulation.difficultyMode //turn laser off and reset + if (this.fadeCycle > 360) this.fadeCycle = -150 + 2 * simulation.difficultyMode * simulation.difficultyMode //turn laser off and reset ctx.strokeStyle = "#50f"; ctx.setLineDash([70 + 300 * Math.random(), 55 * Math.random()]); ctx.lineWidth = 1.5; ctx.beginPath(); if (this.fadeCycle < 120) { //damage scales up over 2 seconds to give player time to move as it fades in const scale = this.fadeCycle / 120 - const dmg = (this.fadeCycle < 60) ? 0 : 0.15 * simulation.dmgScale * scale + const dmg = this.fadeCycle < 60 ? 0 : 0.13 * simulation.dmgScale * scale me.lasers(me.vertices[0], me.angle + Math.PI / 6, dmg); me.lasers(me.vertices[1], me.angle + 3 * Math.PI / 6, dmg); me.lasers(me.vertices[2], me.angle + 5 * Math.PI / 6, dmg); @@ -622,8 +631,8 @@ const spawn = { //when player is inside event horizon if (Vector.magnitude(Vector.sub(me.position, player.position)) < this.eventHorizon) { if (m.immuneCycle < m.cycle) { - if (m.energy > 0) m.energy -= 0.02 - if (m.energy < 0.05 && m.immuneCycle < m.cycle) m.damage(0.0004 * simulation.dmgScale); + if (m.energy > 0) m.energy -= 0.018 + if (m.energy < 0.05 && m.immuneCycle < m.cycle) m.damage(0.0003 * simulation.dmgScale); } const angle = Math.atan2(player.position.y - me.position.y, player.position.x - me.position.x); player.force.x -= 0.0017 * Math.cos(angle) * player.mass * (m.onGround ? 1.7 : 1); @@ -669,9 +678,9 @@ const spawn = { // exit() {}, // }, ] - shuffle(me.mode); + shuffle(me.mode); //THIS SHOULDN'T BE COMMENTED OUT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! me.do = function() { - this.fill = '#' + Math.random().toString(16).substr(-6); //flash colors + this.fill = `hsl(${360 * Math.sin(this.cycle * 0.011)},${80 + 20 * Math.sin(this.cycle * 0.004)}%,${60 + 20 * Math.sin(this.cycle * 0.009)}%)` if (this.health < 1) { this.cycle++; this.checkStatus(); @@ -679,12 +688,12 @@ const spawn = { this.spawnBoss(); this.damageReductionDecay(); for (let i = 0; i < this.totalModes; i++) this.mode[i].do() - // this.mode[3].do() - // this.mode[4].do() - // this.mode[7].do() } + // this.cycle++; + // this.mode[0].do() + // this.mode[7].do() }; - me.spawnRate = 4300 - 30 * simulation.difficultyMode * simulation.difficultyMode + me.spawnRate = 4800 - 30 * simulation.difficultyMode * simulation.difficultyMode me.spawnBoss = function() { //if the fight lasts too long start spawning bosses if (!(me.cycle % this.spawnRate) && this.health < 1) { this.spawnRate = Math.max(300, this.spawnRate - 10 * simulation.difficultyMode * simulation.difficultyMode) //reduce the timer each time a boss spawns @@ -707,7 +716,74 @@ const spawn = { player.force.x += magX * player.mass * (player.position.x > this.position.x ? 1 : -1) player.force.y -= magY * player.mass } + me.boulder = function(x, y) { + mobs.spawn(x, y, 6, Math.floor(50 + 50 * Math.random()), this.fill); + let boss = this + let me = mob[mob.length - 1]; + me.stroke = "transparent"; + me.onHit = function() { + this.timeLeft = 0 + }; + me.explodeRange = 500 + me.onDeath = function() { //explode + simulation.drawList.push({ //draw explosion + x: this.position.x, + y: this.position.y, + radius: this.explodeRange, + color: this.fill, + time: 8 + }); + let sub, knock + sub = Vector.sub(player.position, this.position); + if (Vector.magnitude(sub) < this.explodeRange) { //player knock back + m.damage(0.05); + knock = Vector.mult(Vector.normalise(sub), player.mass * 0.1); + player.force.x += knock.x; + player.force.y += knock.y; + } + for (let i = 0, len = powerUp.length; i < len; ++i) { //power up knock backs + sub = Vector.sub(powerUp[i].position, this.position); + if (Vector.magnitude(sub) < this.explodeRange) { + knock = Vector.mult(Vector.normalise(sub), powerUp[i].mass * 0.1); + powerUp[i].force.x += knock.x; + powerUp[i].force.y += knock.y; + } + } + for (let i = 0, len = body.length; i < len; ++i) { //block knock backs + sub = Vector.sub(body[i].position, this.position); + if (Vector.magnitude(sub) < this.explodeRange) { + knock = Vector.mult(Vector.normalise(sub), body[i].mass * 0.1); + body[i].force.x += knock.x; + body[i].force.y += knock.y; + } + } + } + Matter.Body.setDensity(me, 0.003); //normal is 0.001 + me.timeLeft = 360; + me.g = 0.0005; //required if using this.gravity + me.frictionAir = 0.005; + me.friction = 1; + me.frictionStatic = 1 + me.restitution = 0; + me.leaveBody = false; + me.isDropPowerUp = false; + me.isBadTarget = true; + me.isMobBullet = true; + me.showHealthBar = false; + me.collisionFilter.category = cat.mobBullet; + me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet; + me.spin = me.inertia * 0.000005 * (1 + Math.random()) * (m.pos.x > me.position.x ? 1 : -1) + Matter.Body.setAngularVelocity(me, 0.1 * (1 + 0.3 * Math.random()) * (m.pos.x > me.position.x ? 1 : -1)); + Matter.Body.setVelocity(me, { x: 0, y: 10 }); + me.do = function() { + this.fill = boss.fill + this.torque += this.spin; + this.gravity(); + this.timeLimit(); + }; + } me.orbitalNoVelocity = function(who, radius, phase, speed) { //orbitals that don't include their host velocity //specifically for finalBoss + let boss = this mobs.spawn(who.position.x, who.position.y, 6, 20, "rgb(255,0,150)"); let me = mob[mob.length - 1]; me.stroke = "transparent"; @@ -721,17 +797,18 @@ const spawn = { me.collisionFilter.category = cat.mobBullet; me.collisionFilter.mask = cat.bullet; //cat.player | cat.map | cat.body me.do = function() { + this.fill = boss.fill const time = simulation.cycle * speed + phase const orbit = { x: Math.cos(time), y: Math.sin(time) } Matter.Body.setPosition(this, Vector.add(who.position, Vector.mult(orbit, radius))) if (Matter.Query.collides(this, [player]).length > 0 && !(m.isCloak && tech.isIntangible) && m.immuneCycle < m.cycle) { m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for 30 cycles - const dmg = 0.06 * simulation.dmgScale + const dmg = 0.13 * simulation.dmgScale m.damage(dmg); simulation.drawList.push({ //add dmg to draw queue x: this.position.x, y: this.position.y, - radius: dmg * 500, + radius: Math.sqrt(dmg) * 200, color: simulation.mobDmgColor, time: simulation.drawTime }); @@ -739,7 +816,7 @@ const spawn = { } }; } - me.lasers = function(where, angle, dmg = 0.14 * simulation.dmgScale) { + me.lasers = function(where, angle, dmg = 0.13 * simulation.dmgScale) { const vertexCollision = function(v1, v1End, domain) { for (let i = 0; i < domain.length; ++i) { let vertices = domain[i].vertices; @@ -1983,13 +2060,15 @@ const spawn = { // this.fill = `hsla(0,0%,${80 + 25 * Math.sin(simulation.cycle * 0.01)}%,0.3)` //steal all power ups - for (let i = 0; i < Math.min(powerUp.length, this.vertices.length); i++) { - powerUp[i].collisionFilter.mask = 0 - Matter.Body.setPosition(powerUp[i], this.vertices[i]) - Matter.Body.setVelocity(powerUp[i], { - x: 0, - y: 0 - }) + if (this.alive) { + for (let i = 0; i < Math.min(powerUp.length, this.vertices.length); i++) { + powerUp[i].collisionFilter.mask = 0 + Matter.Body.setPosition(powerUp[i], this.vertices[i]) + Matter.Body.setVelocity(powerUp[i], { + x: 0, + y: 0 + }) + } } this.seePlayerByHistory(50); this.attraction(); @@ -2108,11 +2187,12 @@ const spawn = { // Matter.Body.setPosition(powerUp[i], this.vertices[i]) // Matter.Body.setVelocity(powerUp[i], { x: 0, y: 0 }) // } - - for (let i = 0; i < Math.min(powerUp.length, this.vertices.length); i++) { - powerUp[i].collisionFilter.mask = 0 - Matter.Body.setPosition(powerUp[i], this.vertices[i]) - Matter.Body.setVelocity(powerUp[i], { x: 0, y: 0 }) + if (this.alive) { + for (let i = 0; i < Math.min(powerUp.length, this.vertices.length); i++) { + powerUp[i].collisionFilter.mask = 0 + Matter.Body.setPosition(powerUp[i], this.vertices[i]) + Matter.Body.setVelocity(powerUp[i], { x: 0, y: 0 }) + } } this.seePlayerCheckByDistance(); @@ -4937,7 +5017,7 @@ const spawn = { }; }, mine(x, y) { - mobs.spawn(x, y, 8, 10, "rgb(61, 125, 121)"); //"rgb(100,170,150)" + mobs.spawn(x, y, 8, 10, "rgb(255, 255, 255)"); //"rgb(100,170,150)" //"rgb(61, 125, 121)" let me = mob[mob.length - 1]; me.stroke = "transparent"; Matter.Body.setDensity(me, 0.0001); //normal is 0.001 @@ -7305,7 +7385,7 @@ const spawn = { simulation.drawList.push({ //add dmg to draw queue x: this.position.x, y: this.position.y, - radius: dmg * 500, + radius: Math.sqrt(dmg) * 200, color: simulation.mobDmgColor, time: simulation.drawTime }); diff --git a/js/tech.js b/js/tech.js index e8da8a8..e01119f 100644 --- a/js/tech.js +++ b/js/tech.js @@ -554,7 +554,7 @@ const tech = { }, { name: "catabolism", - descriptionFunction() { return `if you fire while out of ammo
spawn ${powerUps.orb.ammo(4)} and –1 maximum ${tech.isEnergyHealth ? "energy" : "health"}` }, + descriptionFunction() { return `if you fire while out of ammo
spawn ${powerUps.orb.ammo(4)} and ${tech.isEnergyHealth ? "–4 maximum energy" : "–2 maximum health"}` }, maxCount: 1, count: 0, frequency: 1, @@ -2412,7 +2412,7 @@ const tech = { }, { name: "exothermic process", - description: "+50% damage
after mobs die –25% energy", + description: "+50% damage
after mobs die –20% energy", maxCount: 1, count: 0, frequency: 1, @@ -3437,7 +3437,7 @@ const tech = { }, { name: "unified field theory", - description: `clicking the field box when paused cycles your field
triple the frequency of finding fieldtech
`, + description: `clicking the field box when paused cycles your field
double the frequency of finding fieldtech
`, maxCount: 1, count: 0, frequency: 1, @@ -3449,14 +3449,14 @@ const tech = { effect() { tech.isPauseSwitchField = true; for (let i = 0, len = tech.tech.length; i < len; i++) { - if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 3 + if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 2 } }, remove() { tech.isPauseSwitchField = false; if (this.count > 1) { for (let i = 0, len = tech.tech.length; i < len; i++) { - if (tech.tech[i].isFieldTech) tech.tech[i].frequency /= 3 + if (tech.tech[i].isFieldTech) tech.tech[i].frequency /= 2 } } } @@ -8548,7 +8548,8 @@ const tech = { allowed() { return true }, requires: "", effect() { - level.levels.splice(level.onLevel, 0, level.levels[level.onLevel]); + const index = Math.min(level.levels.length - 1, level.onLevel) + level.levels.splice(index, 0, level.levels[index]); }, remove() {} }, diff --git a/todo.txt b/todo.txt index 2e066a1..12bf373 100644 --- a/todo.txt +++ b/todo.txt @@ -1,24 +1,42 @@ ******************************************************** NEXT PATCH ************************************************** -finalBoss rework - (this is pretty raw, so expect a bug and balance patch soon) - finalBoss goes invulnerable a few times as it loses health - finalBoss damage reduction is higher - finalBoss damage reduction slowly decays as you do any damage to the boss - damage reduction resets to normal with each new invulnerability phase - after each invulnerability phase it randomly adds 1 more attack mode - lasers, black hole, mines, hoppers, seekers, mobs, orbiters, oscillation - -mobs die below 0.05 -> 0.01 health - might cause bugs, but testing this out +finalBoss has a new phase: "boulders" + each phase has been rebalanced + boss health is a bit higher + mob mines are white now -guns and field power ups show 3 -> 2 options +pilot wave gets +1 choice for gun,field,tech bug fixes: *********************************************************** TODO ***************************************************** -harpoon + another gun + bessemer + catabolysis + mass-energy exploit? +finalBoss + add synergies between modes: + black hole can pull in bullets + laser can hurt bullets? maybe bad idea + old mode changes + mine color needs to be move vibrant + hoppers can hop out of the slime and the door on the sides + new modes: + rotating quadrant immunity shield, can't take damage from that quadrant + maybe also attack player near that quadrant + falling object warps to ceiling after hitting floor + doesn't end, player needs to kill it + slowly grows? + slow effect zones + random placement or place over player or both! + draw white dot and an outline of area of effect + expanding circle stroke, freeze effect triggers when stroke circle hits fill circle + after 1-2 seconds freeze player if in the zone + also freeze mobs + effect that makes player have to be close to boss + hook that tries to yank the player into hitting finalBoss + does damage + pulls player into center + counter with wormhole, negative mass + player targeted unless cloaking + tech - leave one of your tech at random, find it next run store level name and position in local storage