diff --git a/js/bullet.js b/js/bullet.js index 84d9e6d..d13d80d 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -177,7 +177,7 @@ const b = { time: game.drawTime }); let dist, sub, knock; - let dmg = b.dmgScale * radius * 0.009; + let dmg = radius * 0.01; const alertRange = 100 + radius * 2; //alert range //add alert to draw queue @@ -194,17 +194,15 @@ const b = { dist = Vector.magnitude(sub); if (dist < radius) { - if (mod.isImmuneExplosion) { - mech.energy += Math.max(radius * 0.0003, 0.15) - } else { - mech.damage(radius * 0.0002); //normal player damage from explosions + if (!(mod.isImmuneExplosion && mech.energy > 0.75)) { + mech.damage(radius * 0.0001); //normal player damage from explosions mech.drop(); } - knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * player.mass / 30); + knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * player.mass * 0.015); player.force.x += knock.x; player.force.y += knock.y; } else if (dist < alertRange) { - knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * player.mass / 55); + knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * player.mass * 0.008); player.force.x += knock.x; player.force.y += knock.y; } @@ -214,11 +212,11 @@ const b = { sub = Vector.sub(where, body[i].position); dist = Vector.magnitude(sub); if (dist < radius) { - knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg) * body[i].mass) / 18); + knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg) * body[i].mass) * 0.022); body[i].force.x += knock.x; body[i].force.y += knock.y; } else if (dist < alertRange) { - knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg) * body[i].mass) / 40); + knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg) * body[i].mass) * 0.013); body[i].force.x += knock.x; body[i].force.y += knock.y; } @@ -229,11 +227,11 @@ const b = { sub = Vector.sub(where, powerUp[i].position); dist = Vector.magnitude(sub); if (dist < radius) { - knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg) * powerUp[i].mass) / 30); + knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg) * powerUp[i].mass) * 0.015); powerUp[i].force.x += knock.x; powerUp[i].force.y += knock.y; } else if (dist < alertRange) { - knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg) * powerUp[i].mass) / 45); + knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg) * powerUp[i].mass) * 0.01); powerUp[i].force.x += knock.x; powerUp[i].force.y += knock.y; } @@ -248,16 +246,16 @@ const b = { if (dist < radius) { if (mob[i].shield) dmg *= 3 //balancing explosion dmg to shields if (Matter.Query.ray(map, mob[i].position, where).length > 0) dmg *= 0.5 //reduce damage if a wall is in the way - mob[i].damage(dmg * damageScale); + mob[i].damage(dmg * damageScale * b.dmgScale); mob[i].locatePlayer(); - knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg * damageScale) * mob[i].mass) / 50); + knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg * damageScale) * mob[i].mass) * 0.01); mob[i].force.x += knock.x; mob[i].force.y += knock.y; radius *= 0.95 //reduced range for each additional explosion target - damageScale *= 0.85 //reduced damage for each additional explosion target + damageScale *= 0.87 //reduced damage for each additional explosion target } else if (!mob[i].seePlayer.recall && dist < alertRange) { mob[i].locatePlayer(); - knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg * damageScale) * mob[i].mass) / 80); + knock = Vector.mult(Vector.normalise(sub), (-Math.sqrt(dmg * damageScale) * mob[i].mass) * 0.006); mob[i].force.x += knock.x; mob[i].force.y += knock.y; } @@ -910,7 +908,8 @@ const b = { this.target = null this.collisionFilter.category = cat.bullet; this.collisionFilter.mask = cat.mob //| cat.mobShield //cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield - if (mod.isFoamGrowOnDeath) { + if (mod.isFoamGrowOnDeath && bullet.length < 300) { + console.log(bullet.length) let targets = [] for (let i = 0, len = mob.length; i < len; i++) { const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)); @@ -933,6 +932,7 @@ const b = { } } } + } } } @@ -1360,8 +1360,9 @@ const b = { const sub = Vector.sub(this.lockedOn.position, this.position) const DIST = Vector.magnitude(sub); const unit = Vector.normalise(sub) - const DRAIN = 0.0016 - 0.0008 * this.isUpgraded - if (DIST < mod.isPlasmaRange * 550 && mech.energy > DRAIN) { + const DRAIN = 0.002 + if (DIST < mod.isPlasmaRange * 500 && mech.energy > DRAIN) { + console.log('fire') mech.energy -= DRAIN; if (mech.energy < 0) { mech.fieldCDcycle = mech.cycle + 120; @@ -1369,7 +1370,7 @@ const b = { } //calculate laser collision let best; - let range = mod.isPlasmaRange * (140 + 300 * Math.sqrt(Math.random())) + let range = mod.isPlasmaRange * (120 + 300 * Math.sqrt(Math.random())) const path = [{ x: this.position.x, y: this.position.y diff --git a/js/game.js b/js/game.js index 116bc30..f2f1f17 100644 --- a/js/game.js +++ b/js/game.js @@ -761,9 +761,9 @@ const game = { }); } } - if (game.difficultyMode === 2) mech.damage(0.3); + if (game.difficultyMode === 2) mech.damage(0.25); if (game.difficultyMode === 1) mech.damage(0.1); - mech.energy = 0; + mech.energy = 0.01; } } diff --git a/js/level.js b/js/level.js index 8d39759..b340093 100644 --- a/js/level.js +++ b/js/level.js @@ -51,9 +51,11 @@ const level = { mech.maxHealth += 0.05 * powerUps.totalPowerUps if (powerUps.totalPowerUps) game.makeTextLog(" max health increased by " + (0.05 * powerUps.totalPowerUps * 100).toFixed(0) + "%", 300) } - if (mod.isHealLowHealth && mech.health < 0.8 * mech.maxHealth * Math.sqrt(game.healScale)) { - mech.health = mech.maxHealth * game.healScale - mech.displayHealth(); + if (mod.isHealLowHealth) { + const len = Math.floor((mech.maxHealth - mech.health) / 0.5) + for (let i = 0; i < len; i++) { + powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false); + } } }, custom() {}, @@ -412,10 +414,14 @@ const level = { powerUps.addRerollToLevel() //needs to run after mobs are spawned }, sewers() { - const rotor = level.rotor(5100, 2425, -0.001) + const rotor = level.rotor(5100, 2475, -0.001) const button = level.button(6600, 2675) const hazard = level.hazard(4550, 2750, 4550, 150) - + const balance1 = level.spinner(300, -395, 25, 390, 0.001) //entrance + const balance2 = level.spinner(2605, 500, 390, 25, 0.005) //falling + const balance3 = level.spinner(2608, 1900, 584, 25, 0.005) //falling + const balance4 = level.spinner(9300, 2205, 25, 380, 0.001) //exit + console.log(balance1) level.custom = () => { button.query(); button.draw(); @@ -425,6 +431,17 @@ const level = { level.playerExitCheck(); }; level.customTopLayer = () => { + ctx.fillStyle = "#233" + ctx.beginPath(); + ctx.arc(balance1.pointA.x, balance1.pointA.y, 9, 0, 2 * Math.PI); + ctx.moveTo(balance2.pointA.x, balance2.pointA.y) + ctx.arc(balance2.pointA.x, balance2.pointA.y, 9, 0, 2 * Math.PI); + ctx.moveTo(balance3.pointA.x, balance3.pointA.y) + ctx.arc(balance3.pointA.x, balance3.pointA.y, 9, 0, 2 * Math.PI); + ctx.moveTo(balance4.pointA.x, balance4.pointA.y) + ctx.arc(balance4.pointA.x, balance4.pointA.y, 9, 0, 2 * Math.PI); + ctx.fill(); + hazard.draw(); }; @@ -440,26 +457,26 @@ const level = { spawn.debris(4575, 2550, 1600, 9); //16 debris per level spawn.debris(7000, 2550, 2000, 7); //16 debris per level - level.fill.push({ - x: 9300, - y: 2200, - width: 600, - height: 400, - color: "rgba(0,255,255,0.1)" - }); + // level.fill.push({ + // x: 9325, + // y: 2200, + // width: 575, + // height: 400, + // color: "rgba(0,255,255,0.1)" + // }); level.fillBG.push({ x: 9300, y: 2200, width: 600, height: 400, - color: "hsl(138, 10%, 80%)" //c4f4f4 + color: "hsl(175, 15%, 76%)" //c4f4f4 }); spawn.mapRect(-500, -600, 200, 800); //left entrance wall spawn.mapRect(-400, -600, 3550, 200); //ceiling spawn.mapRect(-400, 0, 3000, 200); //floor - spawn.mapRect(300, -500, 50, 400); //right entrance wall - spawn.bodyRect(312, -100, 25, 100); + // spawn.mapRect(300, -500, 50, 400); //right entrance wall + // spawn.bodyRect(312, -100, 25, 100); spawn.bodyRect(1450, -300, 150, 50); const xPos = shuffle([600, 1250, 2000]); @@ -473,15 +490,23 @@ const level = { spawn.mapRect(3050, -600, 200, 800); //right down tube wall spawn.mapRect(3100, 0, 1200, 200); //tube right exit ceiling spawn.mapRect(4200, 0, 200, 1900); - spawn.mapRect(3000, 400, 1000, 1250); - spawn.mapRect(3000, 1925, 1000, 150); - spawn.mapRect(3100, 1875, 800, 100); - spawn.mapRect(3100, 1600, 800, 100); - spawn.mapRect(3100, 350, 800, 100); - spawn.mapRect(3100, 2025, 800, 100); - spawn.mapRect(2400, 0, 200, 1950); //left down tube wall + spawn.mapVertex(3500, 1000, "-500 -500 -400 -600 400 -600 500 -500 500 500 400 600 -400 600 -500 500"); + spawn.mapVertex(3600, 1940, "-400 -40 -350 -90 350 -90 400 -40 400 40 350 90 -350 90 -400 40"); + spawn.mapRect(3925, 2288, 310, 50); + spawn.mapRect(3980, 2276, 200, 50); + + spawn.mapRect(2625, 2288, 650, 50); + spawn.mapRect(2700, 2276, 500, 50); + // spawn.mapRect(3000, 400, 1000, 1250); + // spawn.mapRect(3000, 1925, 1000, 150); + // spawn.mapRect(3100, 1875, 800, 100); + // spawn.mapRect(3100, 1600, 800, 100); + // spawn.mapRect(3100, 350, 800, 100); + // spawn.mapRect(3100, 2025, 800, 100); + + spawn.mapRect(2400, 0, 200, 1925); //left down tube wall spawn.mapRect(600, 2300, 3750, 200); spawn.bodyRect(3800, 275, 125, 125); @@ -490,8 +515,8 @@ const level = { spawn.mapRect(600, 1700, 2000, 200); //bottom left room ceiling spawn.mapRect(500, 1700, 200, 800); //left wall - spawn.mapRect(1775, 2225, 550, 125); - spawn.mapRect(675, 1875, 325, 150); + spawn.mapRect(675, 1875, 325, 150, 0.5); + spawn.mapRect(4450, 2900, 4900, 200); //boss room floor spawn.mapRect(4150, 2600, 400, 500); @@ -508,7 +533,7 @@ const level = { spawn.mapRect(9100, 1700, 900, 500); //exit spawn.mapRect(9100, 2600, 900, 500); spawn.mapRect(9900, 1700, 200, 1400); //back wall - spawn.mapRect(9300, 2150, 50, 250); + // spawn.mapRect(9300, 2150, 50, 250); spawn.mapRect(9300, 2590, 650, 25); spawn.mapRect(9700, 2580, 100, 50); @@ -772,7 +797,7 @@ const level = { // spawn.mapRect(-100, -410, 100, 30); spawn.mapRect(-300, -800, 500, 50); spawn.mapRect(150, -800, 50, 110); - spawn.bodyRect(170, -690, 14, 175, 1, spawn.propsFriction); //door to exit room + spawn.bodyRect(170, -690, 14, 180, 1, spawn.propsFriction); //door to exit room spawn.mapRect(-300, -400, 500, 100); //far left starting ceiling level.fill.push({ x: -250, @@ -2289,7 +2314,7 @@ const level = { basement() { // player made level by Francois 👑 from discord let button, door, buttonDoor, buttonPlateformEnd, doorPlateform let isLevelReversed = Math.random(); - if (isLevelReversed < 0.1) { + if (isLevelReversed < 0.7) { isLevelReversed = false; } else { isLevelReversed = true; @@ -2841,7 +2866,35 @@ const level = { World.add(engine.world, consBB[i]); } }, - platform(x, y, width, height, speed) { + spinner(x, y, width, height, density = 0.001) { + x = x + width / 2 + y = y + height / 2 + const who = body[body.length] = Bodies.rectangle(x, y, width, height, { + collisionFilter: { + category: cat.body, + mask: cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet //cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet + }, + isNotHoldable: true, + frictionAir: 0.001, + friction: 1, + frictionStatic: 1, + restitution: 0, + }); + + Matter.Body.setDensity(who, density) + const constraint = Constraint.create({ //fix rotor in place, but allow rotation + pointA: { + x: x, + y: y + }, + bodyB: who, + stiffness: 1, + damping: 1 + }); + World.add(engine.world, constraint); + return constraint + }, + platform(x, y, width, height, speed = 0, density = 0.001) { x = x + width / 2 y = y + height / 2 const who = body[body.length] = Bodies.rectangle(x, y, width, height, { @@ -2856,6 +2909,7 @@ const level = { restitution: 0, }); + Matter.Body.setDensity(who, density) const constraint = Constraint.create({ //fix rotor in place, but allow rotation pointA: { x: x, @@ -2870,23 +2924,10 @@ const level = { position: who.position, speed: speed, } - - // constraint.move = function () { - // if (this.plat.position.y > 350) { - // this.plat.speed = speed - // } else if (this.plat.position.y < -2435) { - // this.plat.speed = -speed - // } - // this.plat.position = { - // x: this.plat.position.x, - // y: this.plat.position.y + this.plat.speed - // } - // this.pointA = this.plat.position - // } constraint.pauseUntilCycle = 0 //to to pause platform at top and bottom return constraint }, - rotor(x, y, rotate = 0, radius = 900, width = 50, density = 0.0005) { + rotor(x, y, rotate = 0, radius = 800, width = 40, density = 0.0005) { const rotor1 = Matter.Bodies.rectangle(x, y, width, radius, { density: density, isNotHoldable: true diff --git a/js/mods.js b/js/mods.js index c2b96c6..30f0937 100644 --- a/js/mods.js +++ b/js/mods.js @@ -77,7 +77,7 @@ const mod = { if (mod.isAcidDmg && mech.health > 1) dmg *= 1.4; if (mod.isRest && player.speed < 1) dmg *= 1.20; if (mod.isEnergyDamage) dmg *= 1 + mech.energy / 5.5; - if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.006 + if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.005 if (mod.isRerollDamage) dmg *= 1 + 0.05 * powerUps.reroll.rerolls if (mod.isOneGun && b.inventory.length < 2) dmg *= 1.22 return dmg * mod.slowFire @@ -954,7 +954,7 @@ const mod = { }, { name: "negentropy", - description: `at the start of each level
heal a percent of maximum health`, + description: `at the start of each level
spawn a heal for every 50% missing health`, maxCount: 1, count: 0, allowed() { @@ -1315,7 +1315,7 @@ const mod = { }, { name: "microstates", - description: "increase damage by 6%
for every 10 active bullets", + description: "increase damage by 5%
for every 10 active bullets", maxCount: 1, count: 0, allowed() { @@ -1622,11 +1622,11 @@ const mod = { }, { name: "electric reactive armor", - description: "explosions give you energy
instead of harming you", + description: "explosions do no harm
while your energy is above 75%", maxCount: 1, count: 0, allowed() { - return mod.haveGunCheck("missiles") || mod.haveGunCheck("flak") || mod.haveGunCheck("grenades") || mod.haveGunCheck("vacuum bomb") || mod.haveGunCheck("pulse") || mod.isMissileField || mod.isExplodeMob + return mod.haveGunCheck("missiles") || mod.haveGunCheck("flak") || mod.haveGunCheck("grenades") || mod.haveGunCheck("vacuum bomb") || (mod.haveGunCheck("pulse") && mech.maxEnergy > 1) || mod.isMissileField || mod.isExplodeMob }, requires: "an explosive gun", effect: () => { @@ -1953,7 +1953,7 @@ const mod = { allowed() { return game.fpsCapDefault > 45 && mod.haveGunCheck("rail gun") && !mod.isSlowFPS }, - requires: "rail gun && FPS above 45", + requires: "rail gun and FPS above 45", effect() { mod.isRailTimeSlow = true; }, diff --git a/js/spawn.js b/js/spawn.js index 2530998..3228e14 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -81,8 +81,8 @@ const spawn = { } } }, - //"shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", - randomLevelBoss(x, y, options = ["powerUpBoss"]) { + + randomLevelBoss(x, y, options = ["shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss"]) { // other bosses: suckerBoss, laserBoss, tetherBoss, snakeBoss //all need a particular level to work so they are not included spawn[options[Math.floor(Math.random() * options.length)]](x, y) }, diff --git a/todo.txt b/todo.txt index 836a69f..06ad809 100644 --- a/todo.txt +++ b/todo.txt @@ -1,10 +1,14 @@ -power up level boss: adjustments + +added rotating platforms to sewers level +mod negentropy: now spawns a heal power up for every 50% missing health at the start of a level + +all explosions do about 10% more damage +knock back no longer gets weaker at high levels +mod - electric reactive armor now gives explosion damage immunity when your energy is above 75% ************** TODO - n-gon ************** -level concept: several stationary platforms that are free to rotate, but with some air friction - -foam isFoamGrowOnDeath causes performance issues when too many mobs die fast +level element: a hanging chain of connected blocks give mobs more animal-like behaviors like rain world mobs play, look for food, explore @@ -67,7 +71,6 @@ minigun: high caliber - rework portals: portal while holding block sometimes send player back to original portal only seems to happen with the bottom right block - extend to bodies (mobs?) use buttons to turn on and off? level boss: fires a line intersection in a random direction every few seconds. @@ -128,6 +131,7 @@ redblobgames.com/articles/visibility could apply to explosions, neutron bomb, player LOS possible names for mods + holonomy - parallel transport of a vector leads to movement (applies to curved space) Hypergolic - A hypergolic propellant combination used in a rocket engine is one whose components spontaneously ignite when they come into contact with each other. have a mob apply a positive status effect on other mobs,