diff --git a/js/bullet.js b/js/bullet.js index 229d056..960c2cc 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1847,8 +1847,8 @@ const b = { name: "nail gun", description: "use compressed air to fire a stream of nails
delay after firing decreases as you shoot", ammo: 0, - ammoPack: 60, - defaultAmmoPack: 60, + ammoPack: 55, + defaultAmmoPack: 55, recordedAmmo: 0, have: false, nextFireCycle: 0, //use to remember how longs its been since last fire, used to reset count @@ -1918,7 +1918,7 @@ const b = { if (mech.energy < 0.01) { mech.fireCDcycle = mech.cycle + 60; // cool down } else { - mech.energy -= mech.fieldRegen + 0.009 + mech.energy -= mech.fieldRegen + 0.01 } } } @@ -1929,8 +1929,8 @@ const b = { name: "shotgun", description: "fire a burst of short range bullets
crouch to reduce recoil", ammo: 0, - ammoPack: 6, - defaultAmmoPack: 6, + ammoPack: 5.5, + defaultAmmoPack: 5.5, have: false, fire() { let knock, spread @@ -2924,7 +2924,7 @@ const b = { name: "rail gun", description: "use energy to launch a high-speed dense rod
hold left mouse to charge, release to fire", ammo: 0, - ammoPack: 3.25, + ammoPack: 3.15, have: false, fire() { function pushAway(range) { //push away blocks when firing @@ -3261,6 +3261,19 @@ const b = { nextFireCycle: 0, //use to remember how longs its been since last fire, used to reset count fire() { + }, + chooseFireMethod() { + if (mod.isPulseLaser) { + this.fire = this.firePulse + } else if (mod.beamSplitter) { + this.fire = this.fireSplit + } else if (mod.historyLaser) { + this.fire = this.fireHistory + } else if (mod.isWideLaser) { + this.fire = this.fireWideBeam + } else { + this.fire = this.fireLaser + } }, fireLaser() { if (mech.energy < mod.laserFieldDrain) { @@ -3268,74 +3281,128 @@ const b = { } else { mech.fireCDcycle = mech.cycle mech.energy -= mech.fieldRegen + mod.laserFieldDrain * mod.isLaserDiode - if (mod.wideLaser) { + b.laser(); + } + }, + fireSplit() { + if (mech.energy < mod.laserFieldDrain) { + mech.fireCDcycle = mech.cycle + 100; // cool down if out of energy + } else { + mech.fireCDcycle = mech.cycle + mech.energy -= mech.fieldRegen + mod.laserFieldDrain * mod.isLaserDiode + const divergence = mech.crouch ? 0.15 : 0.2 + let dmg = 0.1 + mod.laserDamage * Math.pow(0.9, mod.laserDamage) + const where = { + x: mech.pos.x + 20 * Math.cos(mech.angle), + y: mech.pos.y + 20 * Math.sin(mech.angle) + } + b.laser(where, { + x: where.x + 3000 * Math.cos(mech.angle), + y: where.y + 3000 * Math.sin(mech.angle) + }, dmg) + for (let i = 1; i < 1 + mod.beamSplitter; i++) { + b.laser(where, { + x: where.x + 3000 * Math.cos(mech.angle + i * divergence), + y: where.y + 3000 * Math.sin(mech.angle + i * divergence) + }, dmg) + b.laser(where, { + x: where.x + 3000 * Math.cos(mech.angle - i * divergence), + y: where.y + 3000 * Math.sin(mech.angle - i * divergence) + }, dmg) + } + } + }, + fireWideBeam() { + if (mech.energy < mod.laserFieldDrain) { + mech.fireCDcycle = mech.cycle + 100; // cool down if out of energy + } else { + mech.fireCDcycle = mech.cycle + mech.energy -= mech.fieldRegen + mod.laserFieldDrain * mod.isLaserDiode + const dmg = 0.55 * mod.laserDamage // 3.5 * 0.55 = 200% more damage + const wideLaser = function(where = { + x: mech.pos.x + 20 * Math.cos(mech.angle), + y: mech.pos.y + 20 * Math.sin(mech.angle) + }, angle = mech.angle) { ctx.strokeStyle = "#f00"; ctx.lineWidth = 8 ctx.globalAlpha = 0.5; ctx.beginPath(); - const off = 7.5 - const dmg = 0.55 * mod.laserDamage // 3.5 * 0.55 = 200% more damage - const where = { - x: mech.pos.x + 20 * Math.cos(mech.angle), - y: mech.pos.y + 20 * Math.sin(mech.angle) - } b.laser(where, { - x: where.x + 3000 * Math.cos(mech.angle), - y: where.y + 3000 * Math.sin(mech.angle) + x: where.x + 3000 * Math.cos(angle), + y: where.y + 3000 * Math.sin(angle) }, dmg, 0, true) for (let i = 1; i < mod.wideLaser; i++) { let whereOff = Vector.add(where, { - x: i * off * Math.cos(mech.angle + Math.PI / 2), - y: i * off * Math.sin(mech.angle + Math.PI / 2) + x: i * off * Math.cos(angle + Math.PI / 2), + y: i * off * Math.sin(angle + Math.PI / 2) }) b.laser(whereOff, { - x: whereOff.x + 3000 * Math.cos(mech.angle), - y: whereOff.y + 3000 * Math.sin(mech.angle) + x: whereOff.x + 3000 * Math.cos(angle), + y: whereOff.y + 3000 * Math.sin(angle) }, dmg, 0, true) whereOff = Vector.add(where, { - x: i * off * Math.cos(mech.angle - Math.PI / 2), - y: i * off * Math.sin(mech.angle - Math.PI / 2) + x: i * off * Math.cos(angle - Math.PI / 2), + y: i * off * Math.sin(angle - Math.PI / 2) }) b.laser(whereOff, { - x: whereOff.x + 3000 * Math.cos(mech.angle), - y: whereOff.y + 3000 * Math.sin(mech.angle) + x: whereOff.x + 3000 * Math.cos(angle), + y: whereOff.y + 3000 * Math.sin(angle) }, dmg, 0, true) } ctx.stroke(); ctx.globalAlpha = 1; - } else if (mod.beamSplitter) { - const divergence = mech.crouch ? 0.15 : 0.2 - let dmg = 0.1 + mod.laserDamage * Math.pow(0.9, mod.laserDamage) - const where = { - x: mech.pos.x + 20 * Math.cos(mech.angle), - y: mech.pos.y + 20 * Math.sin(mech.angle) - } - b.laser(where, { - x: where.x + 3000 * Math.cos(mech.angle), - y: where.y + 3000 * Math.sin(mech.angle) - }, dmg) - for (let i = 1; i < 1 + mod.beamSplitter; i++) { - b.laser(where, { - x: where.x + 3000 * Math.cos(mech.angle + i * divergence), - y: where.y + 3000 * Math.sin(mech.angle + i * divergence) - }, dmg) - b.laser(where, { - x: where.x + 3000 * Math.cos(mech.angle - i * divergence), - y: where.y + 3000 * Math.sin(mech.angle - i * divergence) - }, dmg) - // dmg *= 0.9 - } - } else { - b.laser() } + wideLaser(); + } + }, + fireHistory() { + if (mech.energy < mod.laserFieldDrain) { + mech.fireCDcycle = mech.cycle + 100; // cool down if out of energy + } else { + mech.fireCDcycle = mech.cycle + mech.energy -= mech.fieldRegen + mod.laserFieldDrain * mod.isLaserDiode + const dmg = 0.25 * mod.laserDamage // 3.5 * 0.55 = 200% more damage + ctx.strokeStyle = "#f00"; + let spacing, len + if (mod.wideLaser === 3) { + ctx.lineWidth = 2 + spacing = 1 + len = 19 + mod.historyLaser * 10 + } else if (mod.wideLaser === 4) { + ctx.lineWidth = 3 + spacing = 1 + len = 29 + mod.historyLaser * 10 + } else { + ctx.lineWidth = 1 + spacing = 3 + len = 9 + mod.historyLaser * 10 + } + ctx.beginPath(); + b.laser({ + x: mech.pos.x + 20 * Math.cos(mech.angle), + y: mech.pos.y + 20 * Math.sin(mech.angle) + }, { + x: mech.pos.x + 3000 * Math.cos(mech.angle), + y: mech.pos.y + 3000 * Math.sin(mech.angle) + }, dmg, 0, true); + for (let i = 0; i < len; i++) { + const history = mech.history[(mech.cycle - i * spacing) % 300] + b.laser({ + x: history.position.x + 20 * Math.cos(history.angle), + y: history.position.y + 20 * Math.sin(history.angle) + }, { + x: history.position.x + 3000 * Math.cos(history.angle), + y: history.position.y + 3000 * Math.sin(history.angle) + }, dmg, 0, true); + } + ctx.stroke(); } }, firePulse() { mech.fireCDcycle = mech.cycle + Math.floor((mod.isPulseAim ? 25 : 50) * b.fireCD); // cool down let energy = 0.27 * Math.min(mech.energy, 1.5) mech.energy -= energy * mod.isLaserDiode - if (mod.beamSplitter) { energy *= 0.66 b.pulse(energy, mech.angle) diff --git a/js/game.js b/js/game.js index 26733a1..bcf5c10 100644 --- a/js/game.js +++ b/js/game.js @@ -747,6 +747,19 @@ const game = { fallCheck(mob); fallCheck(body); fallCheck(powerUp, true); + + + //check for double crouch + //crouch playerHead.position.y - player.position.y = 9.7 //positive + //standing playerHead.position.y - player.position.y = -30 //negative + if (!mech.crouch && ((playerHead.position.y - player.position.y) > 0)) { + // mech.undoCrouch() + Matter.Body.translate(playerHead, { + x: 0, + y: 40 + }); + } + // else if (mech.crouch && ((playerHead.position.y - player.position.y) < 0)) {} } } }, diff --git a/js/level.js b/js/level.js index bc5abde..e60bef3 100644 --- a/js/level.js +++ b/js/level.js @@ -17,10 +17,10 @@ const level = { // game.zoomScale = 1000; // game.setZoom(); // mech.setField("wormhole") - // b.giveGuns("rail gun") + // b.giveGuns("laser") // mod.is3Missiles = true - // mod.giveMod("dielectric polarization") - // mod.giveMod("capacitor bank") + // mod.giveMod("history laser") + // mod.giveMod("diffuse beam") level.intro(); //starting level // level.testing(); //not in rotation @@ -56,6 +56,21 @@ const level = { level.addToWorld(); //add bodies to game engine game.draw.setPaths(); b.respawnBots(); + for (let i = 0; i < 300; i++) { //reset history + mech.history[i] = { + position: { + x: mech.pos.x, + y: mech.pos.y, + }, + velocity: { + x: player.velocity.x, + y: player.velocity.y + }, + angle: mech.angle, + health: mech.health, + energy: mech.energy, + } + } if (mod.isArmorFromPowerUps) { mod.armorFromPowerUps += 0.05 * powerUps.totalPowerUps mech.setMaxHealth(); @@ -142,10 +157,10 @@ const level = { // spawn.boost(1500, 0, 900); // spawn.starter(1900, -500, 20) - // spawn.bomberBoss(2900, -500) + // spawn.sucker(2900, -500) // spawn.launcherBoss(1200, -500) // spawn.laserTargetingBoss(1600, -400) - spawn.striker(1600, -500) + // spawn.striker(1600, -500) // spawn.shooter(1700, -120) // spawn.bomberBoss(1400, -500) // spawn.sniper(1800, -120) @@ -156,7 +171,7 @@ const level = { // spawn.nodeBoss(1200, -500, "launcher") // spawn.snakeBoss(1200, -500) - // spawn.powerUpBoss(2900, -500) + spawn.powerUpBoss(2900, -500) // spawn.randomMob(1600, -500) }, template() { @@ -2957,6 +2972,13 @@ const level = { height: 475, color: BGColor }); + level.fill.push({ + x: 1800, + y: -1120, + width: 775, + height: 600, + color: BGColor + }); drawOnTheMapMapRect(3800, -270, 75, 75); drawOnTheMapMapRect(3900, -895, 500, 75); drawOnTheMapMapRect(3900, -1195, 75, 375); @@ -2981,15 +3003,6 @@ const level = { drawOnTheMapBodyRect(4850, -720, 250, 200); drawOnTheMapBodyRect(4050, -970, 25, 25); drawOnTheMapBodyRect(3075, -1245, 50, 50); - buttonSortieSalle = level.button(3000, -1745) - spawn.mapVertex(3065, -1745, "100 10 -100 10 -70 -10 70 -10"); - len = map.length - 1 - map[len].collisionFilter.category = cat.map; - map[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet; - Matter.Body.setStatic(map[len], true); //make static - World.add(engine.world, map[len]); //add to world - game.draw.setPaths() //update map graphics - portalEnHaut = level.portal({ x: 3650, y: -1470 @@ -3001,13 +3014,14 @@ const level = { spawn.randomSmallMob(2500, -2070 + Math.random(), 1); spawn.randomSmallMob(5000, -1370, 1); spawn.randomMob(5000, -645, 0.9); - spawn.randomMob(4050, 970, 0.9); + spawn.randomMob(4050, -970, 0.9); spawn.randomSmallMob(2800, -1620, 0.7); spawn.randomMob(2400, -1370, 0.5); spawn.randomMob(3725, -1320, 0.3); spawn.randomBoss(2115, -2020, 0.1) powerUps.spawn(5000, -1275, "heal"); + levelCustom2(); } ////////////////////////////////////////// @@ -3029,16 +3043,6 @@ const level = { portalEnHaut[2].query(); portalEnHaut[3].query(); rotor.rotate(); - // rotor2.rotate - buttonSortieSalle.query(); - buttonSortieSalle.draw(); - //////////// - if (buttonSortieSalle.isUp) { - doorSortieSalle.isOpen = door3isOpen; - } else { - doorSortieSalle.isOpen = false; - door3isOpen = false; - } doorSortieSalle.openClose(); level.playerExitCheck(); }; @@ -3053,6 +3057,7 @@ const level = { ctx.beginPath(); ctx.arc(balance.pointA.x, balance.pointA.y, 9, 0, 2 * Math.PI); ctx.fill(); + }; } //spawn box @@ -3091,7 +3096,7 @@ const level = { spawn.bodyRect(1700, -195, 50, 50); spawn.mapRect(450, -520, 1600, 100); //plafond 1 spawn.mapRect(450, 255, 1600, 100); //sol 1 - spawn.mapRect(2250, -95, 1450, 75); //entresol + spawn.mapRect(2250, -45, 1450, 75); //entresol spawn.mapRect(3900, -520, 2000, 100); //plafond 2 spawn.mapRect(3900, 255, 2000, 100); //sol 2 //grande salle @@ -3135,40 +3140,43 @@ const level = { spawn.randomMob(8800, -45, 0.2); spawn.randomBoss(8025, -845, 0.2); - // if (game.difficulty > 2) { - if (Math.random() < 0.2) { - // tether ball - spawn.tetherBoss(8000, 630) + if (game.difficulty > 2) { + if (Math.random() < 0.2) { + // tether ball + spawn.tetherBoss(8000, 630) + let me = mob[mob.length - 1]; + me.onDeath = function() { + this.removeCons(); //remove constraint + spawnCouloirEnHaut() + doorSortieSalle.isOpen = false; + }; + cons[cons.length] = Constraint.create({ + pointA: { + x: 8550, + y: 680 + }, + bodyB: mob[mob.length - 1], + stiffness: 0.00015 + }); + World.add(engine.world, cons[cons.length - 1]); + if (game.difficulty > 4) spawn.nodeBoss(8000, 630, "spawns", 8, 20, 105); + } else { + spawn.randomLevelBoss(8000, 630, ["shooterBoss", "launcherBoss", "laserTargetingBoss", "spiderBoss", "laserBoss", "bomberBoss"]); + let me = mob[mob.length - 1]; + me.onDeath = function() { + this.removeCons(); //remove constraint + spawnCouloirEnHaut() + doorSortieSalle.isOpen = false; + }; + } + } else { + spawn.randomLevelBoss(8000, 630, ["shooterBoss"]); let me = mob[mob.length - 1]; me.onDeath = function() { - this.removeCons(); //remove constraint - spawnCouloirEnHaut() - }; - cons[cons.length] = Constraint.create({ - pointA: { - x: 8550, - y: 680 - }, - bodyB: mob[mob.length - 1], - stiffness: 0.00015 - }); - World.add(engine.world, cons[cons.length - 1]); - if (game.difficulty > 4) spawn.nodeBoss(8000, 630, "spawns", 8, 20, 105); - } else if (game.difficulty > 3) { - spawn.randomLevelBoss(8000, 630, ["shooterBoss", "launcherBoss", "laserTargetingBoss", "spiderBoss", "laserBoss", "bomberBoss"]); - let me = mob[mob.length - 1]; - me.onDeath = function() { - this.removeCons(); //remove constraint spawnCouloirEnHaut() + doorSortieSalle.isOpen = false; }; } - // } else { - // spawn.randomLevelBoss(8000, 630, ["shooterBoss"]); - // let me = mob[mob.length - 1]; - // me.onDeath = function () { - // spawnCouloirEnHaut() - // }; - // } }, house() { const rotor = level.rotor(4315, -315, -0.0002, 120, 20, 200); diff --git a/js/mods.js b/js/mods.js index 384fee4..0b94be1 100644 --- a/js/mods.js +++ b/js/mods.js @@ -90,7 +90,7 @@ const mod = { if (mod.isEnergyLoss) dmg *= 1.5; if (mod.isAcidDmg && mech.health > 1) dmg *= 1.4; if (mod.restDamage > 1 && player.speed < 1) dmg *= mod.restDamage - if (mod.isEnergyDamage) dmg *= 1 + mech.energy / 5.5; + if (mod.isEnergyDamage) dmg *= 1 + mech.energy / 7; if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038 if (mod.isRerollDamage) dmg *= 1 + 0.04 * powerUps.reroll.rerolls if (mod.isOneGun && b.inventory.length < 2) dmg *= 1.25 @@ -117,7 +117,7 @@ const mod = { } }, { name: "capacitor", - description: "increase damage by 1%
for every 5.5% stored energy", + description: "increase damage by 1%
for every 7% stored energy", maxCount: 1, count: 0, allowed() { @@ -2518,7 +2518,7 @@ const mod = { maxCount: 9, count: 0, allowed() { - return mod.haveGunCheck("laser") && !mod.isWideLaser && !mod.isPulseLaser + return mod.haveGunCheck("laser") && !mod.isWideLaser && !mod.isPulseLaser && !mod.historyLaser }, requires: "laser, not wide beam", effect() { @@ -2538,14 +2538,20 @@ const mod = { maxCount: 9, count: 0, allowed() { - return mod.haveGunCheck("laser") && !mod.isWideLaser && !mod.isPulseAim + return mod.haveGunCheck("laser") && !mod.isWideLaser && !mod.isPulseAim && !mod.historyLaser }, requires: "laser, not specular reflection", effect() { mod.beamSplitter++ + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() + } }, remove() { mod.beamSplitter = 0 + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() + } } }, { @@ -2560,10 +2566,16 @@ const mod = { effect() { if (mod.wideLaser === 0) mod.wideLaser = 3 mod.isWideLaser = true; + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() + } }, remove() { mod.wideLaser = 0 mod.isWideLaser = false; + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() + } } }, { @@ -2577,6 +2589,9 @@ const mod = { requires: "laser, not specular reflection
not diffraction grating", effect() { mod.wideLaser = 4 + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() + } }, remove() { if (mod.isWideLaser) { @@ -2584,6 +2599,34 @@ const mod = { } else { mod.wideLaser = 0 } + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() + } + } + }, + { + name: "slow light propagation", + description: "", + maxCount: 9, + count: 0, + allowed() { + return mod.haveGunCheck("laser") && mod.laserReflections < 3 && !mod.beamSplitter && !mod.isPulseLaser + }, + requires: "laser, not specular reflection
not diffraction grating", + effect() { + this.description = `add 10 more laser beams into into your past` + //`8% chance to duplicate spawned power ups
chance to duplicate = ${mod.duplicateChance}` + mod.historyLaser++ + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() + } + }, + remove() { + this.description = "laser beam is spread into your recent past
increase total beam damage by 200%" + mod.historyLaser = 0 + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() + } } }, { @@ -2592,19 +2635,19 @@ const mod = { maxCount: 1, count: 0, allowed() { - return mod.haveGunCheck("laser") && mod.laserReflections < 3 && !mod.isWideLaser + return mod.haveGunCheck("laser") && mod.laserReflections < 3 && !mod.isWideLaser && !mod.historyLaser }, requires: "laser, not specular reflection, not diffuse", effect() { mod.isPulseLaser = true; for (i = 0, len = b.guns.length; i < len; i++) { //find which gun - if (b.guns[i].name === "laser") b.guns[i].fire = b.guns[i].firePulse + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() } }, remove() { mod.isPulseLaser = false; for (i = 0, len = b.guns.length; i < len; i++) { //find which gun - if (b.guns[i].name === "laser") b.guns[i].fire = b.guns[i].fireLaser + if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() } } }, @@ -3315,5 +3358,6 @@ const mod = { isIncendiary: null, overfillDrain: null, isNeutronSlow: null, - isRailAreaDamage: null + isRailAreaDamage: null, + historyLaser: null } \ No newline at end of file diff --git a/js/player.js b/js/player.js index 3c79341..2e82147 100644 --- a/js/player.js +++ b/js/player.js @@ -52,7 +52,7 @@ const mech = { }); World.add(engine.world, mech.holdConstraint); }, - cycle: 0, + cycle: 300, //starts at 300 cycles instead of 0 to prevent bugs with mech.history lastKillCycle: 0, lastHarmCycle: 0, width: 50, @@ -65,7 +65,6 @@ const mech = { light: 100, }, setFillColors() { - // console.log(mech.color) this.fillColor = `hsl(${mech.color.hue},${mech.color.sat}%,${mech.color.light}%)` this.fillColorDark = `hsl(${mech.color.hue},${mech.color.sat}%,${mech.color.light-20}%)` }, @@ -134,7 +133,26 @@ const mech = { legLength2: 45, transX: 0, transY: 0, + history: [], //tracks the last second of player position move() { + //tracks the last second of player information + // console.log(mech.history) + mech.history.splice(mech.cycle % 300, 1, { + position: { + x: mech.pos.x, + y: mech.pos.y, + }, + velocity: { + x: player.velocity.x, + y: player.velocity.y + }, + angle: mech.angle, + health: mech.health, + energy: mech.energy, + }); + // const back = 59 // 59 looks at 1 second ago //29 looks at 1/2 a second ago + // historyIndex = (mech.cycle - back) % 60 + mech.pos.x = player.position.x; mech.pos.y = playerBody.position.y - mech.yOff; mech.Vx = player.velocity.x; @@ -1344,26 +1362,23 @@ const mech = { mech.hold = function() { if (mech.energy > mech.maxEnergy - 0.02 && mech.fieldCDcycle < mech.cycle && !input.field) { if (mod.isSporeField) { - // mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones - const len = Math.floor(5 + 5 * Math.random()) - mech.energy -= len * 0.1; + const len = Math.floor(5 + 4 * Math.random()) + mech.energy -= len * 0.105; for (let i = 0; i < len; i++) { b.spore(mech.pos) } } else if (mod.isMissileField) { - // mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones - mech.energy -= 0.5; + mech.energy -= 0.55; b.missile({ x: mech.pos.x, y: mech.pos.y - 40 }, -Math.PI / 2, 0, 1, mod.recursiveMissiles) } else if (mod.isIceField) { - // mech.fieldCDcycle = mech.cycle + 17; // set cool down to prevent +energy from making huge numbers of drones - mech.energy -= 0.05; + mech.energy -= 0.057; b.iceIX(1) } else { - // mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones - mech.energy -= 0.35; + mech.energy -= 0.4; b.drone(1) } } + if (mech.isHolding) { mech.drawHold(mech.holdingTarget); mech.holding(); diff --git a/js/spawn.js b/js/spawn.js index 3e404d3..f9a25c1 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -749,7 +749,7 @@ const spawn = { let me = mob[mob.length - 1]; me.stroke = "transparent"; //used for drawSneaker me.eventHorizon = radius * 23; //required for blackhole - me.seeAtDistance2 = (me.eventHorizon + 200) * (me.eventHorizon + 200); //vision limit is event horizon + me.seeAtDistance2 = (me.eventHorizon + 300) * (me.eventHorizon + 300); //vision limit is event horizon me.accelMag = 0.00009 * game.accelScale; me.frictionAir = 0.025; me.collisionFilter.mask = cat.player | cat.bullet diff --git a/todo.txt b/todo.txt index 68ec275..81395e8 100644 --- a/todo.txt +++ b/todo.txt @@ -1,15 +1,19 @@ *********** NEXT PATCH *********** +balance: mod capacitor - gives 1% damage for every 7% energy (was 5.5%) +some fixes on community level detour +added a once every 7 second check to try to undo the crouch bug + (I have no idea how to crouch bug is happening, so I can't even test this fix) + +mod: slow light propagation - laser is divided into your past, and increase total damage by 200% + let me know about balance (is this too strong or too weak) ************** BUGS ************** (4+ reports before potential fix) bug - crouch and worm hole? -> crouch locked in players have extra gravity might be from the short jump code - added a line to wormhole to reset possible short jump - -(3 reports) bug - getting locked into crouch on community levels, but showing the player as still standing - maybe improper vertices for map bodies + add in a check every 5 seconds to try and fix it (intermittent, but almost every time) bug - capping the fps causes random slow downs, that can be fixed with pause @@ -21,6 +25,46 @@ ************** TODO ************** + mod - if you take damage and you have full energy remove your energy and go back in time 1 second + for time dilation field? + check to see if your previous location is clear or mobs, blocks + go back proportional to your energy + pause game, switch the game.loop to cycle backwards in player position until energy runs out + +mod plasma : plasma length increases then decreases as you hold down the field button (like stabbing with a spear) + grows to 1.5 longer after 0.3 seconds, then returns to normal length over 1 second, until field is pressed again + extra energy is drained when field is longer + +write custom dialogue for field / guns / mods used in last game + you'd have to store an array of guns/fields/mod used last game + +mod laser history + what about only works with diffuse + no energy cost increase + each stack makes each beam thicker? + separate the beam into individual nonreflecting lines each 3 cycles farther into the past + taking wider diffuse beam means more lines farther into the past? + or double thickness beam + +technology - player data logging + + mod/field - pressing field while crouched sends the player back in time + mod for time dilation? + mod - When you fire your laser also fire from where you were 1/2 a second in the past + stacking mod each stack produces another laser from farther in the past + drains extra energy + could be used in mob targeting + build a new type of attraction for mobs + if mobs can't see player, they check to see if they can see where the player was in the history + if mobs can't see player, they could check to see if they can find player in the past + mod bot - a bot follows where the player was 1 second ago + gives player a harm reduction bonus when it is near the player + +using a reroll gives 3 options for mods, and 3 options for guns/fields/mods + or 6 options for mods (rewrite mod selection to work with 1-6 options) + the second stack of 3 mods could have repeats, so you don't have to write new mod code + adjust css to make 2 columns of 3 + can't use with cardinality Laser mod: For each reflection of laser, damage increases by 10%