From 4eed719d10d3e94a18ab92e7e83dd969b89e5f2e Mon Sep 17 00:00:00 2001 From: landgreen Date: Thu, 16 Sep 2021 06:25:33 -0700 Subject: [PATCH] cache tech: cache - ammo power ups give 11x ammo, but you can't hold over 11x ammo harpoon grabs 1 power up on the way out, or in harpooned power ups are predictable they attach to the harpoon instead of using physics to move towards player bugs fixes lasers were broke, but I fixed them --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 98 +++++++++++++++++++++++++++++--------------------- js/level.js | 12 +++---- js/mob.js | 2 +- js/powerup.js | 27 +++++++++----- js/spawn.js | 34 ++++++++---------- js/tech.js | 30 +++++++++++++--- todo.txt | 28 +++++++-------- 8 files changed, 134 insertions(+), 97 deletions(-) diff --git a/.DS_Store b/.DS_Store index 07779f0242a3b67a11a142b5703aded5c68dd259..dc334b080c71eabc5ad96d84b16037a15b5ac812 100644 GIT binary patch delta 21 ccmZoMXffEJ#mscz?_?cjKSqYl)y$nD08u{%(^b diff --git a/js/bullet.js b/js/bullet.js index 88218d1..e680101 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -115,6 +115,7 @@ const b = { } }, giveGuns(gun = "random", ammoPacks = 10) { + if (tech.ammoCap) ammoPacks = 0.45 * tech.ammoCap if (tech.isOneGun) b.removeAllGuns(); if (gun === "random") { //find what guns player doesn't have @@ -131,7 +132,7 @@ const b = { for (let i = 0; i < b.guns.length; i++) { b.inventory[i] = i; b.guns[i].have = true; - b.guns[i].ammo = Math.floor(b.guns[i].ammoPack * ammoPacks); + b.guns[i].ammo = Math.ceil(b.guns[i].ammoPack * ammoPacks); } b.activeGun = 0; } else { @@ -148,7 +149,7 @@ const b = { } if (!b.guns[gun].have) b.inventory.push(gun); b.guns[gun].have = true; - b.guns[gun].ammo = Math.floor(b.guns[gun].ammoPack * ammoPacks); + b.guns[gun].ammo = Math.ceil(b.guns[gun].ammoPack * ammoPacks); if (b.activeGun === null) { b.activeGun = gun //if no active gun switch to new gun if (b.guns[b.activeGun].charge) b.guns[b.activeGun].charge = 0; //set foam charge to zero if foam is a new gun @@ -1148,7 +1149,32 @@ const b = { } }, - onEnd() {}, + caughtPowerUp: null, + dropCaughtPowerUp() { + if (this.caughtPowerUp) { + this.caughtPowerUp.collisionFilter.category = cat.powerUp + this.caughtPowerUp.collisionFilter.mask = cat.map | cat.powerUp + this.caughtPowerUp = null + } + }, + onEnd() { + if (this.caughtPowerUp && !simulation.isChoosing && (this.caughtPowerUp.name !== "heal" || m.health !== m.maxHealth || tech.isOverHeal)) { + let index = null //find index + for (let i = 0, len = powerUp.length; i < len; ++i) { + if (powerUp[i] === this.caughtPowerUp) index = i + } + if (index !== null) { + powerUps.onPickUp(this.caughtPowerUp); + this.caughtPowerUp.effect(); + Matter.Composite.remove(engine.world, this.caughtPowerUp); + powerUp.splice(index, 1); + } else { + this.dropCaughtPowerUp() + } + } else { + this.dropCaughtPowerUp() + } + }, drawString() { if (isReturn) { const where = { @@ -1183,50 +1209,37 @@ const b = { break; } } - // if you grabbed a power up, stop it near the player - // for (let i = 0, len = powerUp.length; i < len; ++i) { //near power up - // if (Vector.magnitudeSquared(Vector.sub(this.position, powerUp[i].position)) < 6000) { - // Matter.Body.setVelocity(powerUp[i], { x: 0, y: -2 }) - // break - // } - // } - - for (let i = 0, len = powerUp.length; i < len; ++i) { - if ( //use power up if it is close enough - Vector.magnitudeSquared(Vector.sub(this.position, powerUp[i].position)) < 6000 && - !simulation.isChoosing && - (powerUp[i].name !== "heal" || m.health !== m.maxHealth || tech.isOverHeal) - ) { - powerUps.onPickUp(powerUp[i]); - Matter.Body.setVelocity(player, { //player knock back, after grabbing power up - x: player.velocity.x + powerUp[i].velocity.x / player.mass * 1, - y: player.velocity.y + powerUp[i].velocity.y / player.mass * 1 - }); - powerUp[i].effect(); - Matter.Composite.remove(engine.world, powerUp[i]); - powerUp.splice(i, 1); - break; //because the array order is messed up after splice - } - } - } else { - let isPulling = false - for (let i = 0, len = powerUp.length; i < len; ++i) { //near power up - if (Vector.magnitudeSquared(Vector.sub(this.vertices[2], powerUp[i].position)) < 3000) { - Matter.Body.setVelocity(powerUp[i], this.velocity) - Matter.Body.setPosition(powerUp[i], this.vertices[2]) - isPulling = true - this.endCycle += 0.5 //it pulls back slower, so this prevents it from ending early - break //just pull 1 power up if possible - } - } if (m.energy > 0.005) m.energy -= 0.005 const sub = Vector.sub(this.position, m.pos) const rangeScale = 1 + 0.000001 * Vector.magnitude(sub) * Vector.magnitude(sub) //return faster when far from player - const returnForce = Vector.mult(Vector.normalise(sub), rangeScale * this.thrustMag * this.mass * (isPulling ? 0.6 : 1)) + const returnForce = Vector.mult(Vector.normalise(sub), rangeScale * this.thrustMag * this.mass) this.force.x -= returnForce.x this.force.y -= returnForce.y this.drawString() + this.grabPowerUp() + } + }, + grabPowerUp() { //grab power ups near the tip of the harpoon + if (this.caughtPowerUp) { + Matter.Body.setPosition(this.caughtPowerUp, Vector.add(this.vertices[2], this.velocity)) + Matter.Body.setVelocity(this.caughtPowerUp, { x: 0, y: 0 }) + } else { //&& simulation.cycle % 2 + for (let i = 0, len = powerUp.length; i < len; ++i) { + const radius = powerUp[i].circleRadius + 25 + if (Vector.magnitudeSquared(Vector.sub(this.vertices[2], powerUp[i].position)) < radius * radius) { + if (powerUp[i].name !== "heal" || m.health !== m.maxHealth || tech.isOverHeal) { + this.caughtPowerUp = powerUp[i] + Matter.Body.setVelocity(powerUp[i], { x: 0, y: 0 }) + Matter.Body.setPosition(powerUp[i], this.vertices[2]) + powerUp[i].collisionFilter.category = 0 + powerUp[i].collisionFilter.mask = 0 + this.thrustMag *= 0.6 + this.endCycle += 0.5 //it pulls back slower, so this prevents it from ending early + break //just pull 1 power up if possible + } + } + } } }, do() { @@ -1240,11 +1253,14 @@ const b = { this.force.y -= returnForce.y this.frictionAir = 0.002 this.do = () => { this.force.y += this.mass * 0.001; } + this.dropCaughtPowerUp() } else { //return to player this.do = this.returnToPlayer if (this.angularSpeed < 0.5) this.torque += this.inertia * 0.001 * (Math.random() - 0.5) //(Math.round(Math.random()) ? 1 : -1) this.collisionFilter.mask = cat.map | cat.mob | cat.mobBullet | cat.mobShield // | cat.body } + } else { + this.grabPowerUp() } } else if (this.cycle > 30) { this.frictionAir = 0.003 @@ -4730,7 +4746,7 @@ const b = { name: "mine", description: "toss a proximity mine that sticks to walls
refund undetonated mines on exiting a level", //fires nails at mobs within range ammo: 0, - ammoPack: 1.1, + ammoPack: 1.25, have: false, do() {}, fire() { diff --git a/js/level.js b/js/level.js index fad38b7..5514b23 100644 --- a/js/level.js +++ b/js/level.js @@ -2292,18 +2292,14 @@ const level = { // spawn.focuser(1600, -500) // spawn.laserTargetingBoss(1700, -120) // spawn.bomberBoss(1400, -500) - // spawn.beamer(1800, -120) - // spawn.orbitalBoss(1600, -500) - // spawn.powerUpBoss(1600, -500) - // spawn.cellBossCulture(1600, -500) + // spawn.laser(1800, -120) + // spawn.laserBombingBoss(1600, -500) // spawn.laserTargetingBoss(1600, -500) - // spawn.laser(1200, -500) - + // spawn.laserBoss(1600, -500) + // spawn.cellBossCulture(1600, -500) spawn.nodeGroup(1200, -500, "grenadier") spawn.nodeGroup(1800, -500, "grenadier") spawn.nodeGroup(1200, 0, "grenadier") - - // spawn.snakeBoss(1200, -500) // spawn.suckerBoss(2900, -500) // spawn.randomMob(1600, -500) diff --git a/js/mob.js b/js/mob.js index 0c00e86..613c8a5 100644 --- a/js/mob.js +++ b/js/mob.js @@ -532,7 +532,7 @@ const mobs = { vertexCollision(this.position, look, body); if (!m.isCloak) vertexCollision(this.position, look, [playerBody, playerHead]); // hitting player - if (best.who === player) { + if (best.who === playerBody || best.who === playerHead) { if (m.immuneCycle < m.cycle) { const dmg = 0.0012 * simulation.dmgScale; m.damage(dmg); diff --git a/js/powerup.js b/js/powerup.js index 2e7ba11..5e0aadd 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -455,23 +455,34 @@ const powerUps = { return 17; }, effect() { - if (tech.isAmmoForGun && b.inventory.length > 0 && b.activeGun) { + if (tech.isAmmoForGun && b.inventory.length > 0 && b.activeGun) { //give extra ammo to one gun only with tech logistics const target = b.guns[b.activeGun] if (target.ammo !== Infinity) { - const ammoAdded = Math.ceil((0.7 * Math.random() + 0.7 * Math.random()) * target.ammoPack) - target.ammo += ammoAdded - simulation.makeTextLog(`${target.name}.ammo += ${ammoAdded}`) + if (tech.ammoCap) { + const ammoAdded = Math.ceil(target.ammoPack * 0.7 * tech.ammoCap) //0.7 is average + target.ammo = ammoAdded + simulation.makeTextLog(`${target.name}.ammo = ${ammoAdded}`) + } else { + const ammoAdded = Math.ceil((0.7 * Math.random() + 0.7 * Math.random()) * target.ammoPack) + target.ammo += ammoAdded + simulation.makeTextLog(`${target.name}.ammo += ${ammoAdded}`) + } } } else { //give ammo to all guns in inventory for (let i = 0, len = b.inventory.length; i < len; i++) { const target = b.guns[b.inventory[i]] if (target.ammo !== Infinity) { - const ammoAdded = Math.ceil((0.5 * Math.random() + 0.4 * Math.random()) * target.ammoPack) //Math.ceil(Math.random() * target.ammoPack) - target.ammo += ammoAdded - simulation.makeTextLog(`${target.name}.ammo += ${ammoAdded}`) + if (tech.ammoCap) { + const ammoAdded = Math.ceil(target.ammoPack * 0.45 * tech.ammoCap) //0.45 is average + target.ammo = ammoAdded + simulation.makeTextLog(`${target.name}.ammo = ${ammoAdded}`) + } else { + const ammoAdded = Math.ceil((0.45 * Math.random() + 0.45 * Math.random()) * target.ammoPack) //Math.ceil(Math.random() * target.ammoPack) + target.ammo += ammoAdded + simulation.makeTextLog(`${target.name}.ammo += ${ammoAdded}`) + } } } - } simulation.updateGunHUD(); } diff --git a/js/spawn.js b/js/spawn.js index e298c93..b40cf7f 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -645,8 +645,8 @@ const spawn = { // vertexCollision(where, look, mob); vertexCollision(where, look, map); vertexCollision(where, look, body); - if (!m.isCloak) vertexCollision(where, look, [player]); - if (best.who && best.who === player && m.immuneCycle < m.cycle) { + if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]); + if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) { if (m.immuneCycle < m.cycle + 60 + tech.collisionImmuneCycles) m.immuneCycle = m.cycle + 60 + tech.collisionImmuneCycles; //player is immune to damage extra time m.damage(dmg); simulation.drawList.push({ //add dmg to draw queue @@ -2014,7 +2014,6 @@ const spawn = { mobs.spawn(x, y, 3, radius, color); let me = mob[mob.length - 1]; me.isBoss = true; - me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front Matter.Body.rotate(me, Math.random() * Math.PI * 2); me.accelMag = 0.00018 * Math.sqrt(simulation.accelScale); @@ -2025,10 +2024,7 @@ const spawn = { me.frictionStatic = 0; me.friction = 0; me.lookTorque = 0.000001 * (Math.random() > 0.5 ? -1 : 1); - me.fireDir = { - x: 0, - y: 0 - } + me.fireDir = { x: 0, y: 0 } Matter.Body.setDensity(me, 0.008); //extra dense //normal is 0.001 //makes effective life much larger spawn.shield(me, x, y, 1); spawn.spawnOrbitals(me, radius + 200 + 300 * Math.random()) @@ -2128,16 +2124,14 @@ const spawn = { if (!m.isCloak) vertexCollision(this.position, look, [playerBody, playerHead]); // hitting player - if (best.who === player) { - if (m.immuneCycle < m.cycle) { - const dmg = 0.002 * simulation.dmgScale; - m.damage(dmg); - //draw damage - ctx.fillStyle = color; - ctx.beginPath(); - ctx.arc(best.x, best.y, dmg * 10000, 0, 2 * Math.PI); - ctx.fill(); - } + if ((best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) { + const dmg = 0.002 * simulation.dmgScale; + m.damage(dmg); + //draw damage + ctx.fillStyle = color; + ctx.beginPath(); + ctx.arc(best.x, best.y, dmg * 10000, 0, 2 * Math.PI); + ctx.fill(); } //draw beam if (best.dist2 === Infinity) best = look; @@ -2258,7 +2252,7 @@ const spawn = { if (!m.isCloak) vertexCollision(this.position, look, [playerBody, playerHead]); // hitting player - if (best.who === player) { + if (best.who === playerBody || best.who === playerHead) { this.targetingCount++ if (this.targetingCount > this.targetingTime) { this.targetingCount -= 10; @@ -2763,8 +2757,8 @@ const spawn = { // vertexCollision(where, look, mob); vertexCollision(where, look, map); vertexCollision(where, look, body); - if (!m.isCloak) vertexCollision(where, look, [player]); - if (best.who && best.who === player && m.immuneCycle < m.cycle) { + if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]); + if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) { m.immuneCycle = m.cycle + tech.collisionImmuneCycles + 60; //player is immune to damage for an extra second const dmg = 0.14 * simulation.dmgScale; m.damage(dmg); diff --git a/js/tech.js b/js/tech.js index 615a17c..1495410 100644 --- a/js/tech.js +++ b/js/tech.js @@ -416,8 +416,8 @@ description: `${powerUps.orb.ammo()} give 80% more ammo
but it's only added to your current gun`, maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { return !tech.isEnergyNoAmmo }, @@ -450,6 +450,25 @@ }, remove() {} }, + { + name: "cache", + description: `${powerUps.orb.ammo()} gives 11x more ammo, but
you can't store any more ammo than that`, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !tech.isEnergyNoAmmo + }, + requires: "not exciton-lattice", + effect() { + tech.ammoCap = 11; + powerUps.ammo.effect() + }, + remove() { + tech.ammoCap = 0; + } + }, { name: "catabolism", description: `firing while out of ammo spawns ${powerUps.orb.ammo(4)}
and reduces your maximum health by 1`, @@ -473,8 +492,8 @@ description: "every other crouched shot uses no ammo
+6 JUNK to the potential tech pool", maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 1, + frequencyDefault: 1, allowed() { return true }, @@ -8120,5 +8139,6 @@ isFilament: null, // isSpear: null, isLargeHarpoon: null, - extraHarpoons: null + extraHarpoons: null, + ammoCap: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index b3cdbd1..a37f92f 100644 --- a/todo.txt +++ b/todo.txt @@ -1,17 +1,14 @@ ******************************************************** NEXT PATCH ************************************************** -gun alt fire is determined by the down key not the player crouch state - (so you can control alt fire when in the air or stuck in a tunnel) - I did this with text replace, so it could produce some bugs +tech: cache - ammo power ups give 11x ammo, but you can't hold over 11x ammo harpoon - automatically uses power ups that return to player - will aim at harder to hit targets, and possible miss - returns extra fast if it is far from the player - bullets last a bit longer so they don't despawn early - cd on miss fire lowered to 1.5s (was 3s) + grabs 1 power up on the way out, or in + harpooned power ups are predictable + they attach to the harpoon instead of using physics to move towards player bugs fixes + lasers were broke, but I fixed them ******************************************************** TODO ******************************************************** @@ -19,9 +16,15 @@ bugs fixes disable zoom progress when paused -gun: harpoon - return to player is slower for heavier harpoons +harpoon + post launch tracking: more airFriction, more thrust, harder turning + if no target found slow down and aim much better? harpoon tech + tech that buffs alt fire: + remove the string, all shots are alt fire + alt fire has a 50% chance to not use ammo? + ammo power ups are 10% more likely to spawn from dead mobs + ammo power ups give the harpoon 2x more ammo holding down fire lets the string extend farther, this can overwrite crouch mode can't have 2+ harpoons @@ -32,15 +35,11 @@ harpoon tech grappling hook? remove string in all modes, why? increase ammo - post launch tracking: more airFriction, more thrust, harder turning - if no target found slow down and aim much better? tracking so good harpoon can hit a target, circle around and hit it again doesn't seem to be good physics level:lab too much walking around and too much platforming -set blockBoss frequency to 1x not 2x - tech - explode after getting hit, but while you are immune to harm on mouse down wormhole shows a possible wormhole @@ -475,6 +474,7 @@ possible names for tech hypergraph gnarl SQUID (for superconducting quantum interference device) is a very sensitive magnetometer used to measure extremely subtle magnetic fields, based on superconducting loops containing Josephson junctions. + nuclear pasta - hard matter in neutron star a tutorial / lore intro needs to be optional so it doesn't slow experienced players