From 9012b5a968872bcc6f9aa84dfe2fb996493a534c Mon Sep 17 00:00:00 2001 From: landgreen Date: Sun, 24 Nov 2019 10:42:54 -0800 Subject: [PATCH] added plasma field, removed electrostatic field, added throwing mod --- index.html | 27 ++--- js/bullets.js | 172 ++++-------------------------- js/engine.js | 2 +- js/game.js | 3 +- js/index.js | 6 +- js/level.js | 10 +- js/player.js | 287 +++++++++++++++++++++++++++++++++++++++----------- 7 files changed, 278 insertions(+), 229 deletions(-) diff --git a/index.html b/index.html index 1b9be02..de6ab74 100644 --- a/index.html +++ b/index.html @@ -150,26 +150,25 @@
settings
- - + +

- + - +

+ +
@@ -264,6 +263,8 @@ + diff --git a/js/bullets.js b/js/bullets.js index c0dbb1b..c71690b 100644 --- a/js/bullets.js +++ b/js/bullets.js @@ -35,6 +35,8 @@ const b = { b.extraDmg = 0; b.annihilation = false; b.fullHeal = false; + mech.throwChargeRate = 2; + mech.throwChargeMax = 50; for (let i = 0; i < b.mods.length; i++) { b.mods[i].have = false; } @@ -148,13 +150,23 @@ const b = { } }, { - name: "superconductive healing", + name: "recursive healing", description: "heals bring you to full health", have: false, //13 effect: () => { // good with ablative synthesis, electrostatic field b.fullHeal = true } }, + { + name: "superconductive rail gun", + description: "throw blocks at very high speeds
to charge a throw, hold right click while holding a block
release right click to fire
", + have: false, //14 + effect: () => { // good with ablative synthesis, electrostatic field + b.fullHeal = true + mech.throwChargeRate = 4; + mech.throwChargeMax = 150; + } + }, ], giveMod(i) { b.mods[i].effect(); //give specific mod @@ -787,21 +799,20 @@ const b = { }, { name: "fléchettes", //6 - description: "fire accurate high speed needles
crouch to fire 6 needles at once", + description: "fire accurate high speed needles", ammo: 0, - ammoPack: 35, + ammoPack: 20, have: false, isStarterGun: true, fire() { function spawnFlechette(dir = mech.angle, speed, size = 1) { const me = bullet.length; - bullet[me] = Bodies.rectangle(mech.pos.x + 40 * Math.cos(dir), mech.pos.y + 40 * Math.sin(dir), 36 * size * b.modBulletSize, 2.5 * size * b.modBulletSize, b.fireAttributes(dir)); + bullet[me] = Bodies.rectangle(mech.pos.x + 40 * Math.cos(dir), mech.pos.y + 40 * Math.sin(dir), 65 * size * b.modBulletSize, 1.5 * size * b.modBulletSize, b.fireAttributes(dir)); bullet[me].endCycle = game.cycle + Math.floor(180 * b.modBulletsLastLonger); - bullet[me].dmg = 0.5 * size + b.extraDmg; + bullet[me].dmg = 0.25 * size + b.extraDmg; b.drawOneBullet(bullet[me].vertices); bullet[me].do = function () { - //low gravity - this.force.y += this.mass * 0.0002; + this.force.y += this.mass * 0.0002; //low gravity }; Matter.Body.setVelocity(bullet[me], { x: mech.Vx / 2 + speed * Math.cos(dir), @@ -811,15 +822,13 @@ const b = { } if (mech.crouch) { - mech.fireCDcycle = mech.cycle + Math.floor(60 * b.modFireRate); // cool down - // b.guns[6].ammo -= b.modNoAmmo ? Math.floor(COST / 2) : COST - for (let i = 0; i < 6; i++) { - spawnFlechette(mech.angle + 0.14 * (Math.random() - 0.5), 30 + 6 * Math.random(), 0.7) - } + spawnFlechette(mech.angle, 55, 1.2) } else { - mech.fireCDcycle = mech.cycle + Math.floor(30 * b.modFireRate); // cool down - spawnFlechette(mech.angle, 45) + for (let i = 0; i < 7; i++) { + spawnFlechette(mech.angle + 0.14 * (Math.random() - 0.5), 30 + 8 * Math.random(), 0.5) + } } + mech.fireCDcycle = mech.cycle + Math.floor(30 * b.modFireRate); // cool down } }, { @@ -1454,140 +1463,5 @@ const b = { b.drawOneBullet(bullet[me].vertices); } }, - { - name: "short range laser", //15 - description: "fire a beam of coherent light
reflects off walls at 75% intensity
uses energy instead of ammunition", - ammo: 0, - ammoPack: Infinity, - have: false, - isStarterGun: true, - fire() { - //laser drains energy as well as bullets - const FIELD_DRAIN = 0.001 - const damage = 0.3 - if (mech.fieldMeter < FIELD_DRAIN) { - mech.fireCDcycle = mech.cycle + 100; // cool down if out of energy - } else { - mech.fieldMeter -= mech.fieldRegen + FIELD_DRAIN - let best; - const color = "#f06"; - const range = 150 + 200 * Math.random() //+ 100 * Math.sin(mech.cycle * 0.3); - const dir = mech.angle // + 0.04 * (Math.random() - 0.5) - const path = [{ - x: mech.pos.x + 20 * Math.cos(dir), - y: mech.pos.y + 20 * Math.sin(dir) - }, - { - x: mech.pos.x + range * Math.cos(dir), - y: mech.pos.y + range * Math.sin(dir) - } - ]; - const vertexCollision = function (v1, v1End, domain) { - for (let i = 0; i < domain.length; ++i) { - let vertices = domain[i].vertices; - const len = vertices.length - 1; - for (let j = 0; j < len; j++) { - results = game.checkLineIntersection(v1, v1End, vertices[j], vertices[j + 1]); - if (results.onLine1 && results.onLine2) { - const dx = v1.x - results.x; - const dy = v1.y - results.y; - const dist2 = dx * dx + dy * dy; - if (dist2 < best.dist2 && (!domain[i].mob || domain[i].alive)) { - best = { - x: results.x, - y: results.y, - dist2: dist2, - who: domain[i], - v1: vertices[j], - v2: vertices[j + 1] - }; - } - } - } - results = game.checkLineIntersection(v1, v1End, vertices[0], vertices[len]); - if (results.onLine1 && results.onLine2) { - const dx = v1.x - results.x; - const dy = v1.y - results.y; - const dist2 = dx * dx + dy * dy; - if (dist2 < best.dist2 && (!domain[i].mob || domain[i].alive)) { - best = { - x: results.x, - y: results.y, - dist2: dist2, - who: domain[i], - v1: vertices[0], - v2: vertices[len] - }; - } - } - } - }; - const checkforCollisions = function () { - best = { - x: null, - y: null, - dist2: Infinity, - who: null, - v1: null, - v2: null - }; - vertexCollision(path[path.length - 2], path[path.length - 1], mob); - vertexCollision(path[path.length - 2], path[path.length - 1], map); - vertexCollision(path[path.length - 2], path[path.length - 1], body); - }; - const laserHitMob = function (dmg) { - if (best.who.alive) { - dmg *= b.dmgScale * damage; - best.who.damage(dmg); - best.who.locatePlayer(); - //draw mob damage circle - ctx.fillStyle = color; - ctx.beginPath(); - ctx.arc(path[path.length - 1].x, path[path.length - 1].y, Math.sqrt(dmg) * 100, 0, 2 * Math.PI); - ctx.fill(); - } - }; - checkforCollisions(); - if (best.dist2 != Infinity) { - //if hitting something - path[path.length - 1] = { - x: best.x, - y: best.y - }; - laserHitMob(1); - } - ctx.strokeStyle = color; - ctx.lineWidth = 1 - ctx.beginPath(); - ctx.moveTo(path[0].x, path[0].y); - ctx.lineTo(path[1].x, path[1].y); - ctx.stroke(); - ctx.strokeStyle = "rgba(255,0,60,0.1)" - ctx.lineWidth = 10 - ctx.beginPath(); - ctx.moveTo(path[0].x, path[0].y); - ctx.lineTo(path[1].x, path[1].y); - ctx.stroke(); - } - } - }, - // { - // name: "melee", //15 - // description: "rapidly fire a stream of short range bullets", - // ammo: 0, - // ammoPack: 205, - // have: false, - // isStarterGun: true, - // fire() { - // const me = bullet.length; - // const dir = mech.angle + (Math.random() - 0.5) * ((mech.crouch) ? 0.1 : 0.7); - // bullet[me] = Bodies.rectangle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 12 * b.modBulletSize, 12 * b.modBulletSize, b.fireAttributes(dir)); - // b.fireProps(mech.crouch ? 6 : 2, mech.crouch ? 30 : 20, dir, me); //cd , speed - // bullet[me].endCycle = game.cycle + Math.floor(18 * b.modBulletsLastLonger); - // bullet[me].do = function () { - - // }; - // } - // }, ] }; \ No newline at end of file diff --git a/js/engine.js b/js/engine.js index 7960aa1..a58242e 100644 --- a/js/engine.js +++ b/js/engine.js @@ -78,7 +78,7 @@ function mobCollisionChecks(event) { for (let i = 0, j = pairs.length; i != j; i++) { //body + player collision - if (mech.damageImmune < mech.cycle) { + if (game.isBodyDamage && mech.damageImmune < mech.cycle) { if (pairs[i].bodyA === playerBody || pairs[i].bodyA === playerHead) { collidePlayer(pairs[i].bodyB) } else if (pairs[i].bodyB === playerBody || pairs[i].bodyB === playerHead) { diff --git a/js/game.js b/js/game.js index f341b17..e730974 100644 --- a/js/game.js +++ b/js/game.js @@ -75,6 +75,7 @@ const game = { lastTimeStamp: 0, //tracks time stamps for measuring delta delta: 1000 / 60, //speed of game engine //looks like it has to be 16 to match player input buttonCD: 0, + isBodyDamage: true, isEasyMode: false, difficulty: null, // dropFPS(cap = 40, time = 15) { @@ -418,6 +419,7 @@ const game = { mech.addHealth(1); mech.alive = true; level.onLevel = 0; + level.levelsCleared = 0; //resetting difficulty game.dmgScale = 1; @@ -434,7 +436,6 @@ const game = { level.difficultyIncrease(game.difficulty) } - game.clearNow = true; document.getElementById("text-log").style.opacity = 0; document.getElementById("fade-out").style.opacity = 0; diff --git a/js/index.js b/js/index.js index 9883d60..981236f 100644 --- a/js/index.js +++ b/js/index.js @@ -174,7 +174,7 @@ document.body.addEventListener("wheel", (e) => { passive: true }); -document.getElementById("fps-select").addEventListener("input", event => { +document.getElementById("fps-select").addEventListener("input", () => { let value = document.getElementById("fps-select").value if (value === 'max') { game.fpsCapDefault = 999999999; @@ -191,6 +191,10 @@ document.getElementById("fps-select").addEventListener("input", event => { } }); +document.getElementById("body-damage").addEventListener("input", () => { + game.isBodyDamage = document.getElementById("body-damage").checked +}); + // function playSound(id) { // //play sound // if (false) { diff --git a/js/level.js b/js/level.js index e45a330..7230804 100644 --- a/js/level.js +++ b/js/level.js @@ -10,11 +10,12 @@ const level = { boostScale: 0.000023, levels: ["skyscrapers", "rooftops", "warehouse", "highrise", "office", "aerie"], onLevel: 0, + levelsCleared: 0, start() { - if (level.onLevel === 0) { + if (level.levelsCleared === 0) { // game.difficulty = 6; //for testing to simulate possible mobs spawns - b.giveGuns(15) - // mech.fieldUpgrades[6].effect(); + // b.giveGuns(6) + // mech.fieldUpgrades[7].effect(); // b.giveMod(13) // spawn.pickList = ["ghoster", "ghoster"] @@ -1470,6 +1471,7 @@ const level = { game.difficulty++; if (game.difficulty > 1) level.difficultyIncrease() //cycles map to next level + level.levelsCleared++; level.onLevel++; if (level.onLevel > level.levels.length - 1) level.onLevel = 0; @@ -1566,7 +1568,7 @@ const level = { } }, levelAnnounce() { - document.title = "n-gon: L" + (level.onLevel) + " " + level.levels[level.onLevel]; + document.title = "n-gon: L" + (level.levelsCleared) + " " + level.levels[level.onLevel]; // game.makeTextLog(`
level ${game.difficulty}
${level.levels[level.onLevel]}
`, 300); // if (game.difficulty === 0) text = ""; // text = "Level " + (game.difficulty + 1) + ": " + spawn.pickList[0] + "s + " + spawn.pickList[1] + "s"; diff --git a/js/player.js b/js/player.js index 6d0dcd7..ca62462 100644 --- a/js/player.js +++ b/js/player.js @@ -711,14 +711,12 @@ const mech = { this.isStealth = false; player.collisionFilter.mask = 0x010011 //0x010011 is normal this.holdingMassScale = 0.5; - this.throwChargeRate = 2; - this.throwChargeMax = 50; this.fieldFireCD = 15; this.fieldDamage = 0; // a value of 1.0 kills a small mob in 2-3 hits on level 1 this.fieldShieldingScale = 1; //scale energy loss after collision with mob this.grabRange = 175; - this.fieldArc = 0.2; - this.calculateFieldThreshold(); + this.fieldArc = 0.2; //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) + this.calculateFieldThreshold(); //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) this.jumpForce = 0.38; this.Fx = 0.015; //run Force on ground this.FxAir = 0.015; //run Force in Air @@ -802,8 +800,8 @@ const mech = { }, throw () { if ((keys[32] || game.mouseDownRight)) { - if (this.fieldMeter > 0.002) { - this.fieldMeter -= 0.002; + if (this.fieldMeter > 0.0008) { + this.fieldMeter -= 0.0008; this.throwCharge += this.throwChargeRate;; //draw charge const x = mech.pos.x + 15 * Math.cos(this.angle); @@ -1127,9 +1125,12 @@ const mech = { mech.fieldMeter -= DRAIN; //draw field everywhere - ctx.fillStyle = "rgba(110,170,200," + (0.19 + 0.16 * Math.random()) + ")"; - ctx.fillRect(-100000, -100000, 200000, 200000) + ctx.globalCompositeOperation = "saturation" + // ctx.fillStyle = "rgba(100,200,230," + (0.25 + 0.06 * Math.random()) + ")"; + ctx.fillStyle = "#ccc"; + ctx.fillRect(-100000, -100000, 200000, 200000) + ctx.globalCompositeOperation = "source-over" //stop time mech.isBodiesAsleep = true; @@ -1177,70 +1178,163 @@ const mech = { } }, { - name: "electrostatic field", - description: "field does damage on contact
blocks are thrown at a higher velocity
increased field regeneration", + name: "plasma torch", + description: "field emits a beam of destructive ionized gas
decreased shield range and efficiency", effect: () => { mech.fieldMode = 2; mech.fieldText(); mech.setHoldDefaults(); - //throw quicker and harder - mech.grabRange = 225; - mech.fieldShieldingScale = 2; - mech.fieldRegen *= 2; - mech.throwChargeRate = 3; - mech.throwChargeMax = 140; - mech.fieldDamage = 4; //passive field does extra damage - // mech.fieldArc = 0.11 - // mech.calculateFieldThreshold(); //run after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) + // mech.fieldShieldingScale = 2; + mech.grabRange = 125; + mech.fieldArc = 0.05 //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) + mech.calculateFieldThreshold(); //run after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) mech.hold = function () { if (mech.isHolding) { mech.drawHold(mech.holdingTarget); mech.holding(); mech.throw(); - } else if ((keys[32] || game.mouseDownRight) && mech.fieldMeter > 0.15) { //not hold but field button is pressed - //draw electricity - const Dx = Math.cos(mech.angle); - const Dy = Math.sin(mech.angle); - let x = mech.pos.x + 20 * Dx; - let y = mech.pos.y + 20 * Dy; - ctx.beginPath(); - ctx.moveTo(x, y); - for (let i = 0; i < 8; i++) { - x += 18 * (Dx + 2 * (Math.random() - 0.5)) - y += 18 * (Dy + 2 * (Math.random() - 0.5)) - ctx.lineTo(x, y); - } - ctx.lineWidth = 1 //0.5 + 2 * Math.random(); - ctx.strokeStyle = `rgba(100,20,50,${0.5+0.5*Math.random()})`; - ctx.stroke(); + } else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { //not hold but field button is pressed + const DRAIN = 0.0006 + if (mech.fieldMeter > DRAIN) { + mech.fieldMeter -= DRAIN; - //draw field - const range = 170; - const arc = Math.PI * 0.11 - ctx.beginPath(); - ctx.arc(mech.pos.x, mech.pos.y, range, mech.angle - arc, mech.angle + arc, false); - ctx.lineTo(mech.pos.x + 13 * Math.cos(mech.angle), mech.pos.y + 13 * Math.sin(mech.angle)); - if (mech.holdingTarget) { - ctx.fillStyle = "rgba(255,50,150," + (0.01 + mech.fieldMeter * (0.1 + 0.1 * Math.random())) + ")"; + //calculate laser collision + let best; + let range = 80 + (mech.crouch ? 500 : 300) * Math.sqrt(Math.random()) //+ 100 * Math.sin(mech.cycle * 0.3); + const dir = mech.angle // + 0.04 * (Math.random() - 0.5) + const path = [{ + x: mech.pos.x + 20 * Math.cos(dir), + y: mech.pos.y + 20 * Math.sin(dir) + }, + { + x: mech.pos.x + range * Math.cos(dir), + y: mech.pos.y + range * Math.sin(dir) + } + ]; + const vertexCollision = function (v1, v1End, domain) { + for (let i = 0; i < domain.length; ++i) { + let vertices = domain[i].vertices; + const len = vertices.length - 1; + for (let j = 0; j < len; j++) { + results = game.checkLineIntersection(v1, v1End, vertices[j], vertices[j + 1]); + if (results.onLine1 && results.onLine2) { + const dx = v1.x - results.x; + const dy = v1.y - results.y; + const dist2 = dx * dx + dy * dy; + if (dist2 < best.dist2 && (!domain[i].mob || domain[i].alive)) { + best = { + x: results.x, + y: results.y, + dist2: dist2, + who: domain[i], + v1: vertices[j], + v2: vertices[j + 1] + }; + } + } + } + results = game.checkLineIntersection(v1, v1End, vertices[0], vertices[len]); + if (results.onLine1 && results.onLine2) { + const dx = v1.x - results.x; + const dy = v1.y - results.y; + const dist2 = dx * dx + dy * dy; + if (dist2 < best.dist2 && (!domain[i].mob || domain[i].alive)) { + best = { + x: results.x, + y: results.y, + dist2: dist2, + who: domain[i], + v1: vertices[0], + v2: vertices[len] + }; + } + } + } + }; + + //check for collisions + best = { + x: null, + y: null, + dist2: Infinity, + who: null, + v1: null, + v2: null + }; + vertexCollision(path[0], path[1], mob); + vertexCollision(path[0], path[1], map); + vertexCollision(path[0], path[1], body); + if (best.dist2 != Infinity) { //if hitting something + path[path.length - 1] = { + x: best.x, + y: best.y + }; + if (best.who.alive) { + const dmg = 0.35 * b.dmgScale; //********** SCALE DAMAGE HERE ********************* + best.who.damage(dmg); + best.who.locatePlayer(); + + //push mobs away + const force = Matter.Vector.mult(Matter.Vector.normalise(Matter.Vector.sub(mech.pos, path[1])), -0.01 * Math.sqrt(best.who.mass)) + Matter.Body.applyForce(best.who, path[1], force) + // const angle = Math.atan2(player.position.y - best.who.position.y, player.position.x - best.who.position.x); + // const mass = Math.min(Math.sqrt(best.who.mass), 6); + // Matter.Body.setVelocity(best.who, { + // x: best.who.velocity.x * 0.85 - 3 * Math.cos(angle) / mass, + // y: best.who.velocity.y * 0.85 - 3 * Math.sin(angle) / mass + // }); + + //draw mob damage circle + game.drawList.push({ + x: path[1].x, + y: path[1].y, + radius: Math.sqrt(dmg) * 50, + color: "rgba(255,0,255,0.2)", + time: game.drawTime * 4 + }); + } else if (!best.who.isStatic) { + //push blocks away + const force = Matter.Vector.mult(Matter.Vector.normalise(Matter.Vector.sub(mech.pos, path[1])), -0.006 * Math.sqrt(Math.sqrt(best.who.mass))) + Matter.Body.applyForce(best.who, path[1], force) + } + } + + //draw blowtorch laser beam + ctx.strokeStyle = "rgba(255,0,255,0.1)" + ctx.lineWidth = 14 + ctx.beginPath(); + ctx.moveTo(path[0].x, path[0].y); + ctx.lineTo(path[1].x, path[1].y); + ctx.stroke(); + ctx.strokeStyle = "#f0f"; + ctx.lineWidth = 2 + ctx.beginPath(); + ctx.moveTo(path[0].x, path[0].y); + ctx.lineTo(path[1].x, path[1].y); + ctx.stroke(); + + //draw electricity + const Dx = Math.cos(mech.angle); + const Dy = Math.sin(mech.angle); + let x = mech.pos.x + 20 * Dx; + let y = mech.pos.y + 20 * Dy; + ctx.beginPath(); + ctx.moveTo(x, y); + const step = range / 10 + for (let i = 0; i < 8; i++) { + x += step * (Dx + 1.5 * (Math.random() - 0.5)) + y += step * (Dy + 1.5 * (Math.random() - 0.5)) + ctx.lineTo(x, y); + } + ctx.lineWidth = 2 * Math.random(); + ctx.stroke(); + + mech.pushMobs360(100); + mech.grabPowerUp(); + mech.lookForPickUp(); } else { - ctx.fillStyle = "rgba(255,50,150," + (0.02 + mech.fieldMeter * (0.18 + 0.18 * Math.random())) + ")"; + mech.fieldCDcycle = mech.cycle + 120; //if out of energy } - // ctx.fillStyle = "rgba(110,170,200," + (0.02 + mech.fieldMeter * (0.08 + 0.1 * Math.random())) + ")"; - // ctx.fillStyle = "rgba(110,170,200," + (0.06 + mech.fieldMeter * (0.1 + 0.18 * Math.random())) + ")"; - ctx.fill(); - - //draw random lines in field for cool effect - // eye = 15; - // ctx.beginPath(); - // ctx.moveTo(mech.pos.x + eye * Math.cos(mech.angle), mech.pos.y + eye * Math.sin(mech.angle)); - // const offAngle = mech.angle + 2 * Math.PI * mech.fieldArc * (Math.random() - 0.5); - // ctx.lineTo(mech.pos.x + range * Math.cos(offAngle), mech.pos.y + range * Math.sin(offAngle)); - // ctx.strokeStyle = "rgba(100,20,50,0.2)"; - // ctx.stroke(); - - mech.grabPowerUp(); - mech.pushMobs(); - mech.lookForPickUp(); } else if (mech.holdingTarget && mech.fireCDcycle < mech.cycle && mech.fieldMeter > 0.05) { //holding, but field button is released mech.pickUp(); } else { @@ -1460,6 +1554,79 @@ const mech = { } } }, + + // { + // name: "electrostatic field", + // description: "field does damage on contact
increased field regeneration", + // effect: () => { + // mech.fieldMode = 2; + // mech.fieldText(); + // mech.setHoldDefaults(); + // mech.grabRange = 225; + // mech.fieldShieldingScale = 2.5; + // mech.fieldRegen *= 2; + // mech.fieldDamage = 4; //passive field does extra damage + // // mech.fieldArc = 0.11 + // // mech.calculateFieldThreshold(); //run after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) + // mech.hold = function () { + // if (mech.isHolding) { + // mech.drawHold(mech.holdingTarget); + // mech.holding(); + // mech.throw(); + // } else if ((keys[32] || game.mouseDownRight) && mech.fieldMeter > 0.15) { //not hold but field button is pressed + // //draw electricity + // const Dx = Math.cos(mech.angle); + // const Dy = Math.sin(mech.angle); + // let x = mech.pos.x + 20 * Dx; + // let y = mech.pos.y + 20 * Dy; + // ctx.beginPath(); + // ctx.moveTo(x, y); + // for (let i = 0; i < 8; i++) { + // x += 18 * (Dx + 2 * (Math.random() - 0.5)) + // y += 18 * (Dy + 2 * (Math.random() - 0.5)) + // ctx.lineTo(x, y); + // } + // ctx.lineWidth = 1 //0.5 + 2 * Math.random(); + // ctx.strokeStyle = `rgba(100,20,50,${0.5+0.5*Math.random()})`; + // ctx.stroke(); + + // //draw field + // const range = 170; + // const arc = Math.PI * 0.11 + // ctx.beginPath(); + // ctx.arc(mech.pos.x, mech.pos.y, range, mech.angle - arc, mech.angle + arc, false); + // ctx.lineTo(mech.pos.x + 13 * Math.cos(mech.angle), mech.pos.y + 13 * Math.sin(mech.angle)); + // if (mech.holdingTarget) { + // ctx.fillStyle = "rgba(255,50,150," + (0.01 + mech.fieldMeter * (0.1 + 0.1 * Math.random())) + ")"; + // } else { + // ctx.fillStyle = "rgba(255,50,150," + (0.02 + mech.fieldMeter * (0.18 + 0.18 * Math.random())) + ")"; + // } + // // ctx.fillStyle = "rgba(110,170,200," + (0.02 + mech.fieldMeter * (0.08 + 0.1 * Math.random())) + ")"; + // // ctx.fillStyle = "rgba(110,170,200," + (0.06 + mech.fieldMeter * (0.1 + 0.18 * Math.random())) + ")"; + // ctx.fill(); + + // //draw random lines in field for cool effect + // // eye = 15; + // // ctx.beginPath(); + // // ctx.moveTo(mech.pos.x + eye * Math.cos(mech.angle), mech.pos.y + eye * Math.sin(mech.angle)); + // // const offAngle = mech.angle + 2 * Math.PI * mech.fieldArc * (Math.random() - 0.5); + // // ctx.lineTo(mech.pos.x + range * Math.cos(offAngle), mech.pos.y + range * Math.sin(offAngle)); + // // ctx.strokeStyle = "rgba(100,20,50,0.2)"; + // // ctx.stroke(); + + // mech.grabPowerUp(); + // mech.pushMobs(); + // mech.lookForPickUp(); + // } else if (mech.holdingTarget && mech.fireCDcycle < mech.cycle && mech.fieldMeter > 0.05) { //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.drawFieldMeter() + // } + // } + // }, + // () => { // mech.fieldMode = 7; // game.makeTextLog("Thermal Radiation Field
(right click or space bar)

field grows while active
damages all targets within range, including player
decreased field shielding efficiency

", 1200);