From 860daf91601f71bc391a692c7248be0a1b34b490 Mon Sep 17 00:00:00 2001 From: landgreen Date: Sun, 29 Mar 2020 13:31:35 -0700 Subject: [PATCH] ground state mod --- js/bullets.js | 43 ++++++-- js/engine.js | 2 +- js/game.js | 19 ++-- js/level.js | 6 +- js/mobs.js | 3 +- js/player.js | 271 +++++++++++++++++++------------------------------- todo.txt | 7 ++ 7 files changed, 161 insertions(+), 190 deletions(-) diff --git a/js/bullets.js b/js/bullets.js index 2573654..81482ef 100644 --- a/js/bullets.js +++ b/js/bullets.js @@ -69,6 +69,7 @@ const b = { isModStunField: null, isModHarmDamage: null, isModAlphaRadiation: null, + modEnergyRegen: null, modOnHealthChange() { //used with acid mod if (b.isModAcidDmg && mech.health > 0.8) { b.modAcidDmg = 0.7 @@ -274,7 +275,7 @@ const b = { }, { name: "mass driver", - description: "objects do 3x more damage to mobs
charge throws in 3x less time", + description: "blocks do 3x more damage to mobs
charge throws in 3x less time", maxCount: 1, count: 0, allowed() { @@ -450,7 +451,7 @@ const b = { }, { name: "acute stress response", - description: "increase damage by 50%
no energy for 5 seconds after a mob dies", + description: "increase damage by 33%
but, after a mob dies lose 1/2 your energy", maxCount: 1, count: 0, allowed() { @@ -568,8 +569,8 @@ const b = { } }, { - name: "entanglement", - description: "13% less harm for each gun in your inventory
while your first gun is equipped", + name: "entanglement ", + description: "16% less harm for each gun in your inventory
while your first gun is equipped", maxCount: 1, count: 0, allowed() { @@ -583,9 +584,27 @@ const b = { b.isModEntanglement = false; } }, + { + name: "ground state", + description: "reduce harm by 67%
you no longer passively regenerate energy", + maxCount: 1, + count: 0, + allowed() { + return true + }, + requires: "", + effect: () => { + b.modEnergyRegen = 0; + mech.fieldRegen = b.modEnergyRegen; + }, + remove() { + b.modEnergyRegen = 0.005; + mech.fieldRegen = b.modEnergyRegen; + } + }, { name: "piezoelectricity", - description: "colliding with mobs fills your energy
10% less harm from mob collisions", + description: "colliding with mobs fills your energy
15% less harm from mob collisions", maxCount: 1, count: 0, allowed() { @@ -602,7 +621,7 @@ const b = { }, { name: "energy conservation", - description: "gain energy proportional to damage done", + description: "15% of damage done is recovered as energy", maxCount: 9, count: 0, allowed() { @@ -619,7 +638,7 @@ const b = { }, { name: "entropy exchange", - description: "heal proportional to damage done", + description: "heal for 1.5% of damage done", maxCount: 9, count: 0, allowed() { @@ -810,6 +829,10 @@ const b = { }, requires: "more than 6 mods", effect: () => { + //remove bullets //mostly to get rid of bots + for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]); + bullet = []; + let count = b.modCount if (b.isModNoAmmo) count - 6 //remove the 6 bonus mods when getting rid of leveraged investment for (let i = 0; i < count; i++) { // spawn new mods @@ -822,8 +845,6 @@ const b = { //nothing to undo } }, - - { name: "ice crystal nucleation", description: "your minigun uses energy to condense
unlimited freezing bullets from water vapor", @@ -1915,7 +1936,7 @@ const b = { lockedOn: null, isFollowMouse: true, onDmg(who) { - mobs.statusSlow(who, 30) + mobs.statusSlow(who, 60) this.endCycle = game.cycle if (b.isModAlphaRadiation) mobs.statusPoison(who, 0.1, 180) }, @@ -2302,7 +2323,7 @@ const b = { if (b.isModIceCrystals && mech.energy > 0.01) { mech.energy -= mech.fieldRegen + 0.007 bullet[me].onDmg = function (who) { - mobs.statusSlow(who, 60) + mobs.statusSlow(who, 30) }; //ice muzzleFlash ctx.fillStyle = "rgb(0,100,255)"; diff --git a/js/engine.js b/js/engine.js index 63a29bc..845460f 100644 --- a/js/engine.js +++ b/js/engine.js @@ -140,7 +140,7 @@ function collisionChecks(event) { let dmg = Math.min(Math.max(0.025 * Math.sqrt(mob[k].mass), 0.05), 0.3) * game.dmgScale; //player damage is capped at 0.3*dmgScale of 1.0 if (b.isModPiezo) { mech.energy = mech.fieldEnergyMax; - dmg *= 0.9 + dmg *= 0.85 } mech.damage(dmg); if (mob[k].onHit) mob[k].onHit(k); diff --git a/js/game.js b/js/game.js index cf28213..0f7fc92 100644 --- a/js/game.js +++ b/js/game.js @@ -145,6 +145,18 @@ const game = { // document.getElementById(b.activeGun).style.fontSize = "30px"; if (document.getElementById(b.activeGun)) document.getElementById(b.activeGun).style.opacity = "1"; } + + if (b.isModEntanglement && document.getElementById("mod-entanglement")) { + if (b.inventory[0] === b.activeGun) { + let lessDamage = 1 + for (let i = 0, len = b.inventory.length; i < len; i++) { + lessDamage *= 0.87 // 1 - 0.13 + } + document.getElementById("mod-entanglement").innerHTML = " " + ((1 - lessDamage) * 100).toFixed(0) + "%" + } else { + document.getElementById("mod-entanglement").innerHTML = " 0%" + } + } }, updateGunHUD() { for (let i = 0, len = b.inventory.length; i < len; ++i) { @@ -685,12 +697,7 @@ const game = { mech.energy += mech.fieldEnergyMax * 0.07 if (mech.energy > mech.fieldEnergyMax) mech.energy = mech.fieldEnergyMax; } - if (b.isModHealthRecovery) { - mech.addHealth(0.01) - } - if (b.isModEnergyLoss) { - mech.energy = 0.05; - } + if (b.isModHealthRecovery) mech.addHealth(0.01) } if (!(game.cycle % 420)) { //once every 7 seconds diff --git a/js/level.js b/js/level.js index d1aa8b2..61ad407 100644 --- a/js/level.js +++ b/js/level.js @@ -16,7 +16,7 @@ const level = { // level.difficultyIncrease(9) // b.giveGuns("ice IX") // mech.setField("time dilation field") - // b.giveMod("quantum immortality"); + // b.giveMod("ground state"); // b.giveMod("reflective cavity"); level.intro(); //starting level @@ -965,9 +965,9 @@ const level = { spawn.mapRect(5450, -775, 100, 875); //right building wall spawn.bodyRect(4850, -750, 300, 25, 0.8); spawn.bodyRect(3925, -1400, 100, 150, 0.8); - spawn.mapRect(3450, -1250, 1100, 50); + spawn.mapRect(3450, -1250, 1090, 50); // spawn.mapRect(3450, -1225, 50, 75); - spawn.mapRect(4500, -1225, 50, 390); + spawn.mapRect(4500, -1250, 50, 415); spawn.mapRect(3450, -725, 1500, 50); spawn.mapRect(5100, -725, 400, 50); spawn.mapRect(4500, -735, 50, 635); diff --git a/js/mobs.js b/js/mobs.js index 00ab77a..a73e967 100644 --- a/js/mobs.js +++ b/js/mobs.js @@ -985,7 +985,7 @@ const mobs = { if (this.shield) dmg *= 0.04 if (b.isModLowHealthDmg) dmg *= (3 / (2 + Math.min(mech.health, 1))) //up to 50% dmg at zero player health //if this changes all update display in modOnHealthChange() if (b.isModHarmDamage && mech.lastHarmCycle + 300 > mech.cycle) dmg *= 2; - if (b.isModEnergyLoss) dmg *= 1.5; + if (b.isModEnergyLoss) dmg *= 1.33; if (b.isModFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500 if (b.modEnergySiphon && dmg !== Infinity) mech.energy += Math.min(this.health, dmg) * b.modEnergySiphon if (b.modHealthDrain && dmg !== Infinity) mech.addHealth(Math.min(this.health, dmg) * b.modHealthDrain) @@ -1010,6 +1010,7 @@ const mobs = { this.removeConsBB(); this.alive = false; //triggers mob removal in mob[i].replace(i) if (this.dropPowerUp) { + if (b.isModEnergyLoss) mech.energy /= 2; powerUps.spawnRandomPowerUp(this.position.x, this.position.y, this.mass, radius); mech.lastKillCycle = mech.cycle; //tracks the last time a kill was made, mostly used in game.checks() if (Math.random() < b.modSporesOnDeath) { diff --git a/js/player.js b/js/player.js index acb6479..a54e3ab 100644 --- a/js/player.js +++ b/js/player.js @@ -503,12 +503,32 @@ const mech = { collisionImmuneCycle: 0, //used in engine damage(dmg) { mech.lastHarmCycle = mech.cycle - dmg *= mech.fieldDamageResistance - if (b.isModEntanglement && b.inventory[0] === b.activeGun) { - for (let i = 0, len = b.inventory.length; i < len; i++) { - dmg *= 0.87 // 1 - 0.13 + + //chance to build a drone on damage from mod + if (b.isModDroneOnDamage) { + const len = (dmg - 0.06 * Math.random()) * 40 + for (let i = 0; i < len; i++) { + if (Math.random() < 0.75) b.drone() //spawn drone } } + if (b.isModMineOnDamage && dmg > 0.005 + 0.1 * Math.random()) { + b.mine({ + x: mech.pos.x, + y: mech.pos.y - 80 + }, { + x: 0, + y: 0 + }) + } + + dmg *= mech.fieldDamageResistance + if (!b.modEnergyRegen) dmg *= 0.33 //0.22 + 0.78 * mech.energy //77% damage reduction at zero energy + if (b.isModEntanglement && b.inventory[0] === b.activeGun) { + for (let i = 0, len = b.inventory.length; i < len; i++) { + dmg *= 0.84 // 1 - 0.16 + } + } + mech.health -= dmg; if (mech.health < 0) { if (b.isModDeathAvoid && !b.isModDeathAvoidOnCD) { //&& Math.random() < 0.5 @@ -542,25 +562,6 @@ const mech = { document.getElementById("dmg").style.transition = "opacity 0s"; document.getElementById("dmg").style.opacity = 0.1 + Math.min(0.6, dmg * 4); - //chance to build a drone on damage from mod - if (b.isModDroneOnDamage) { - const len = (dmg - 0.06 * Math.random()) * 40 - for (let i = 0; i < len; i++) { - if (Math.random() < 0.75) b.drone() //spawn drone - } - } - if (b.isModMineOnDamage && dmg > 0.05 + 0.5 * Math.random()) { - b.mine({ - x: mech.pos.x, - y: mech.pos.y - 80 - }, { - x: 0, - y: 0 - }) - } - - - // freeze game and display a full screen red color if (dmg > 0.05) { if (dmg > 0.07 && mech.holdingMassScale > 0.2) mech.drop(); //drop block if holding @@ -737,7 +738,7 @@ const mech = { }, setHoldDefaults() { if (mech.energy < mech.fieldEnergyMax) mech.energy = mech.fieldEnergyMax; - mech.fieldRegen = 0.001; + mech.fieldRegen = b.modEnergyRegen; mech.fieldMeterColor = "#0cf" mech.fieldShieldingScale = 1; mech.fieldDamageResistance = 1; @@ -783,6 +784,7 @@ const mech = { }, drop() { if (mech.isHolding) { + mech.fieldCDcycle = mech.cycle + 15; mech.isHolding = false; mech.throwCharge = 0; mech.definePlayerMass() @@ -975,10 +977,7 @@ const mech = { y: powerUp[i].velocity.y * 0.11 }); if (dist2 < 5000) { //use power up if it is close enough - if (b.isModMassEnergy) { - mech.energy = mech.fieldEnergyMax * 1.5; - // mech.addHealth(0.01); - } + if (b.isModMassEnergy) mech.energy = mech.fieldEnergyMax * 1.5; Matter.Body.setVelocity(player, { //player knock back, after grabbing power up x: player.velocity.x + ((powerUp[i].velocity.x * powerUp[i].mass) / player.mass) * 0.3, y: player.velocity.y + ((powerUp[i].velocity.y * powerUp[i].mass) / player.mass) * 0.3 @@ -1109,7 +1108,7 @@ const mech = { // } // }, lookForPickUp() { //find body to pickup - mech.energy -= mech.fieldRegen; + if (mech.energy > mech.fieldRegen) mech.energy -= mech.fieldRegen; const grabbing = { targetIndex: null, targetRange: 150, @@ -1211,12 +1210,14 @@ const mech = { mech.drawHold(mech.holdingTarget); mech.holding(); mech.throwBlock(); - } else if ((keys[32] || game.mouseDownRight && mech.energy > 0.05 && mech.fieldCDcycle < mech.cycle)) { //not hold but field button is pressed - mech.drawField(); + } else if ((keys[32] || game.mouseDownRight && mech.fieldCDcycle < mech.cycle)) { //not hold but field button is pressed mech.grabPowerUp(); mech.lookForPickUp(); - mech.pushMobsFacing(); - } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle && mech.energy > 0.05) { //holding, but field button is released + if (mech.energy > 0.05) { + mech.drawField(); + mech.pushMobsFacing(); + } + } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released mech.pickUp(); } else { mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) @@ -1244,36 +1245,37 @@ const mech = { mech.drawHold(mech.holdingTarget); mech.holding(); mech.throwBlock(); - } else if ((keys[32] || game.mouseDownRight && mech.energy > 0.05 && mech.fieldCDcycle < mech.cycle)) { //not hold but field button is pressed - //draw field - if (mech.holdingTarget) { - ctx.fillStyle = "rgba(110,170,200," + (0.06 + 0.03 * Math.random()) + ")"; - ctx.strokeStyle = "rgba(110, 200, 235, " + (0.35 + 0.05 * Math.random()) + ")" - } else { - ctx.fillStyle = "rgba(110,170,200," + (0.27 + 0.2 * Math.random() - 0.1 * wave) + ")"; - ctx.strokeStyle = "rgba(110, 200, 235, " + (0.4 + 0.5 * Math.random()) + ")" - } - ctx.beginPath(); - ctx.arc(mech.pos.x, mech.pos.y, mech.fieldRange, mech.angle - Math.PI * mech.fieldArc, mech.angle + Math.PI * mech.fieldArc, false); - ctx.lineWidth = 2.5 - 1.5 * wave; - ctx.lineCap = "butt" - ctx.stroke(); - const curve = 0.57 + 0.04 * wave - const aMag = (1 - curve * 1.2) * Math.PI * mech.fieldArc - let a = mech.angle + aMag - let cp1x = mech.pos.x + curve * mech.fieldRange * Math.cos(a) - let cp1y = mech.pos.y + curve * mech.fieldRange * Math.sin(a) - ctx.quadraticCurveTo(cp1x, cp1y, mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle)) - a = mech.angle - aMag - cp1x = mech.pos.x + curve * mech.fieldRange * Math.cos(a) - cp1y = mech.pos.y + curve * mech.fieldRange * Math.sin(a) - ctx.quadraticCurveTo(cp1x, cp1y, mech.pos.x + 1 * mech.fieldRange * Math.cos(mech.angle - Math.PI * mech.fieldArc), mech.pos.y + 1 * mech.fieldRange * Math.sin(mech.angle - Math.PI * mech.fieldArc)) - ctx.fill(); - + } else if ((keys[32] || game.mouseDownRight && mech.fieldCDcycle < mech.cycle)) { //not hold but field button is pressed mech.grabPowerUp(); mech.lookForPickUp(); - mech.pushMobsFacing(); - } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle && mech.energy > 0.05) { //holding, but field button is released + if (mech.energy > 0.05) { + //draw field + if (mech.holdingTarget) { + ctx.fillStyle = "rgba(110,170,200," + (0.06 + 0.03 * Math.random()) + ")"; + ctx.strokeStyle = "rgba(110, 200, 235, " + (0.35 + 0.05 * Math.random()) + ")" + } else { + ctx.fillStyle = "rgba(110,170,200," + (0.27 + 0.2 * Math.random() - 0.1 * wave) + ")"; + ctx.strokeStyle = "rgba(110, 200, 235, " + (0.4 + 0.5 * Math.random()) + ")" + } + ctx.beginPath(); + ctx.arc(mech.pos.x, mech.pos.y, mech.fieldRange, mech.angle - Math.PI * mech.fieldArc, mech.angle + Math.PI * mech.fieldArc, false); + ctx.lineWidth = 2.5 - 1.5 * wave; + ctx.lineCap = "butt" + ctx.stroke(); + const curve = 0.57 + 0.04 * wave + const aMag = (1 - curve * 1.2) * Math.PI * mech.fieldArc + let a = mech.angle + aMag + let cp1x = mech.pos.x + curve * mech.fieldRange * Math.cos(a) + let cp1y = mech.pos.y + curve * mech.fieldRange * Math.sin(a) + ctx.quadraticCurveTo(cp1x, cp1y, mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle)) + a = mech.angle - aMag + cp1x = mech.pos.x + curve * mech.fieldRange * Math.cos(a) + cp1y = mech.pos.y + curve * mech.fieldRange * Math.sin(a) + ctx.quadraticCurveTo(cp1x, cp1y, mech.pos.x + 1 * mech.fieldRange * Math.cos(mech.angle - Math.PI * mech.fieldArc), mech.pos.y + 1 * mech.fieldRange * Math.sin(mech.angle - Math.PI * mech.fieldArc)) + ctx.fill(); + mech.pushMobsFacing(); + } + } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released mech.pickUp(); } else { mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) @@ -1297,10 +1299,17 @@ const mech = { mech.holding(); mech.throwBlock(); } else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { + mech.grabPowerUp(); + mech.lookForPickUp(180); + const DRAIN = 0.0023 if (mech.energy > DRAIN) { mech.energy -= DRAIN; - + if (mech.energy < 0) { + mech.fieldCDcycle = mech.cycle + 60; + mech.energy = 0; + mech.wakeCheck(); + } //draw field everywhere ctx.globalCompositeOperation = "saturation" // ctx.fillStyle = "rgba(100,200,230," + (0.25 + 0.06 * Math.random()) + ")"; @@ -1330,14 +1339,8 @@ const mech = { } } game.cycle--; //pause all functions that depend on game cycle increasing - - mech.grabPowerUp(); - mech.lookForPickUp(180); - } else { - mech.wakeCheck(); - mech.fieldCDcycle = mech.cycle + 120; } - } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle && mech.energy > 0.05) { //holding, but field button is released + } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released mech.wakeCheck(); mech.pickUp(); } else { @@ -1361,14 +1364,15 @@ const mech = { mech.holding(); mech.throwBlock(); } else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { //not hold but field button is pressed + mech.grabPowerUp(); + mech.lookForPickUp(); const DRAIN = 0.0005 if (mech.energy > DRAIN) { mech.energy -= DRAIN; - mech.grabPowerUp(); - mech.lookForPickUp(); - // mech.pushMobs360(); - // mech.pushMobsFacing(); - + if (mech.energy < 0) { + mech.fieldCDcycle = mech.cycle + 60; + mech.energy = 0; + } //calculate laser collision let best; let range = b.isModPlasmaRange * (175 + (mech.crouch ? 450 : 350) * Math.sqrt(Math.random())) //+ 100 * Math.sin(mech.cycle * 0.3); @@ -1503,10 +1507,8 @@ const mech = { // ctx.fillStyle = "rgba(255,0,255,0.05)" // ctx.fill(); // mech.pushBody360(100); //disabled because doesn't work at short range - } else { - mech.fieldCDcycle = mech.cycle + 120; //if out of energy } - } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle && mech.energy > 0.05) { //holding, but field button is released + } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released mech.pickUp(); } else { mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) @@ -1532,11 +1534,11 @@ const mech = { mech.holding(); mech.throwBlock(); } else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { //push away + mech.grabPowerUp(); + mech.lookForPickUp(); const DRAIN = 0.00035 if (mech.energy > DRAIN) { mech.fieldDamageResistance = 0.33; // 1 - 0.66 - mech.grabPowerUp(); - mech.lookForPickUp(); // mech.pushMobs360(); //repulse mobs @@ -1582,7 +1584,10 @@ const mech = { zeroG(powerUp, this.fieldDrawRadius); zeroG(body, this.fieldDrawRadius); } - + if (mech.energy < 0) { + mech.fieldCDcycle = mech.cycle + 60; + mech.energy = 0; + } //add extra friction for horizontal motion if (keys[65] || keys[68] || keys[37] || keys[39]) { Matter.Body.setVelocity(player, { @@ -1630,11 +1635,8 @@ const mech = { } } ctx.globalCompositeOperation = "source-over"; - } else { - //trigger cool down - mech.fieldCDcycle = mech.cycle + 120; } - } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle && mech.energy > 0.05) { //holding, but field button is released + } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released mech.pickUp(); this.fieldDrawRadius = 0 } else { @@ -1655,7 +1657,7 @@ const mech = { mech.drawHold(mech.holdingTarget); mech.holding(); mech.throwBlock(); - } else if (((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle && mech.energy > 0)) { //not hold but field button is pressed + } else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { //not hold but field button is pressed mech.grabPowerUp(); mech.lookForPickUp(); } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released @@ -1690,7 +1692,7 @@ const mech = { description: "excess energy used to build drones
2x energy regeneration", isEasyToAim: true, effect: () => { - mech.fieldRegen *= 2; + // mech.fieldRegen *= 2; mech.hold = function () { if (mech.energy > mech.fieldEnergyMax - 0.02 && mech.fieldCDcycle < mech.cycle) { if (b.isModSporeField) { @@ -1725,16 +1727,19 @@ const mech = { mech.drawHold(mech.holdingTarget); mech.holding(); mech.throwBlock(); - } else if ((keys[32] || game.mouseDownRight && mech.energy > 0.1 && mech.fieldCDcycle < mech.cycle)) { //not hold but field button is pressed - mech.drawField(); + } else if ((keys[32] || game.mouseDownRight && mech.fieldCDcycle < mech.cycle)) { //not hold but field button is pressed mech.grabPowerUp(); mech.lookForPickUp(); - mech.pushMobsFacing(); - } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle && mech.energy > 0.05) { //holding, but field button is released + if (mech.energy > 0.05) { + mech.drawField(); + mech.pushMobsFacing(); + } + } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released mech.pickUp(); } else { mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) } + mech.energy += mech.fieldRegen; mech.drawFieldMeter() } } @@ -1745,7 +1750,6 @@ const mech = { isEasyToAim: true, effect: () => { mech.fieldMeterColor = "#fff" - mech.hold = function () { mech.isStealth = false //isStealth disables most uses of foundPlayer() player.collisionFilter.mask = cat.body | cat.map | cat.mob | cat.mobBullet | cat.mobShield //normal collisions @@ -1754,10 +1758,16 @@ const mech = { mech.holding(); mech.throwBlock(); } else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { + mech.grabPowerUp(); + mech.lookForPickUp(); + const DRAIN = 0.0001 + 0.00017 * player.speed if (mech.energy > DRAIN) { mech.energy -= DRAIN; - + if (mech.energy < 0) { + mech.fieldCDcycle = mech.cycle + 60; + mech.energy = 0; + } mech.isStealth = true //isStealth disables most uses of foundPlayer() player.collisionFilter.mask = cat.map @@ -1771,9 +1781,6 @@ const mech = { ctx.lineWidth = 2; ctx.stroke(); - mech.grabPowerUp(); - mech.lookForPickUp(); - let inPlayer = Matter.Query.region(mob, player.bounds) if (inPlayer.length > 0) { for (let i = 0; i < inPlayer.length; i++) { @@ -1808,10 +1815,8 @@ const mech = { } } } - } else { - mech.fieldCDcycle = mech.cycle + 120; } - } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle && mech.energy > 0.05) { //holding, but field button is released + } else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released mech.pickUp(); } else { mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) @@ -1835,78 +1840,8 @@ const mech = { ctx.lineWidth = 1; ctx.stroke(); } - } } }, - // { - // name: "code injection field", - // description: "capture an enemy in your field for 3 seconds
rewrite thier behavior to target your enemies", - // effect: () => { - // mech.fieldMode = 7; - // mech.fieldText(); - // mech.setHoldDefaults(); - // mech.hackProgress = 0; - // mech.hold = function () { - // mech.isStealth = false //isStealth is checked in mob foundPlayer() - // player.collisionFilter.mask = 0x010011 - // if (mech.isHolding) { - // mech.hackProgress = 0 - // mech.drawHold(mech.holdingTarget); - // mech.holding(); - // mech.throwBlock(); - // } else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { - // const DRAIN = 0.0005 - // if (mech.energy > DRAIN) { - // mech.energy -= DRAIN; - - // //try to hack a mob - // for (let i = 0, len = mob.length; i < len; ++i) { - // if ( - // Vector.magnitude(Vector.sub(mob[i].position, this.pos)) < this.fieldRange && - // this.lookingAt(mob[i]) && - // Matter.Query.ray(map, mob[i].position, this.pos).length === 0 - // ) { - // if (mech.hackProgress > 180) { //hack the mob - // mech.energy = 0; - // mob[i].hackedTarget = null; - // mob[i].seePlayerFreq = Math.round((30 + 30 * Math.random()) * game.lookFreqScale) - // mob[i].do = function () { - // this.healthBar(); - // this.hacked(); - // } - // } else { //hold the mob still - // mech.hackProgress++ - // range = this.fieldRange * 0.9 - // Matter.Body.setPosition(mob[i], { - // x: mech.pos.x + range * Math.cos(mech.angle), - // y: mech.pos.y + range * Math.sin(mech.angle), - // }); - // Matter.Body.setVelocity(mob[i], player.velocity); - // } - - // } - // } - - - // mech.pushBodyFacing(); - // mech.drawField(); - // mech.grabPowerUp(); - // mech.lookForPickUp(); - // } else { - // mech.hackProgress = 0 - // mech.fieldCDcycle = mech.cycle + 120; - // } - // } else if (mech.holdingTarget && mech.fireCDcycle < mech.cycle && mech.energy > 0.05) { //holding, but field button is released - // mech.pickUp(); - // mech.hackProgress = 0 - // } else { - // mech.hackProgress = 0 - // mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) - // } - // mech.drawFieldMeter() - // } - // } - // }, ], }; \ No newline at end of file diff --git a/todo.txt b/todo.txt index 4e843fe..d19c875 100644 --- a/todo.txt +++ b/todo.txt @@ -1,3 +1,10 @@ +new mod - ground state: reduce harm by 77% but you don't regen energy +negative feedback, entanglement, fluoroantimonic acid now indicate effects with text +entanglement 13% -> 16% damage reduction +piezoelectricity 10% -> 15% harm reduction +acute stress response now does 33% damage and drains 50% energy once when a mob dies + + ************** TODO - n-gon **************