diff --git a/.DS_Store b/.DS_Store index a18c0cc..28a3b89 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index add0550..8559c37 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1365,7 +1365,7 @@ const b = { }, minDmgSpeed: 4, lookFrequency: Math.floor(7 + Math.random() * 3), - density: tech.harpoonDensity, //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed + density: tech.harpoonDensity, //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed drain: 0.004, beforeDmg(who) { if (tech.isShieldPierce && who.isShielded) { //disable shields @@ -1398,7 +1398,7 @@ const b = { this.caughtPowerUp.effect(); Matter.Composite.remove(engine.world, this.caughtPowerUp); powerUp.splice(index, 1); - if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.006 * 6 //0.006 is normal + if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.005 * 6 //0.005 is normal } else { this.dropCaughtPowerUp() } @@ -1629,7 +1629,7 @@ const b = { }, minDmgSpeed: 4, lookFrequency: Math.floor(7 + Math.random() * 3), - density: tech.harpoonDensity, //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed + density: tech.harpoonDensity, //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed beforeDmg(who) { if (tech.isShieldPierce && who.isShielded) { //disable shields who.isShielded = false @@ -1671,7 +1671,7 @@ const b = { this.caughtPowerUp.effect(); Matter.Composite.remove(engine.world, this.caughtPowerUp); powerUp.splice(index, 1); - if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.006 * 6 //0.006 is normal + if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.005 * 6 //0.006 is normal } else { this.dropCaughtPowerUp() } @@ -6153,7 +6153,7 @@ const b = { } //fire if ((!input.fire && this.charge > 0.6)) { - tech.harpoonDensity = 0.009 //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed + tech.harpoonDensity = 0.008 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed const where = { x: m.pos.x + 30 * Math.cos(m.angle), y: m.pos.y + 30 * Math.sin(m.angle) @@ -6208,7 +6208,8 @@ const b = { const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.03 : 0.06) player.force.x -= recoil.x player.force.y -= recoil.y - tech.harpoonDensity = 0.01 //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed + tech.harpoonDensity = 0.008 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed + const harpoonSize = tech.isLargeHarpoon ? 1 + 0.1 * Math.sqrt(this.ammo) : 1 if (tech.extraHarpoons) { let targetCount = 0 @@ -6412,7 +6413,7 @@ const b = { const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.015 : 0.035) player.force.x -= recoil.x player.force.y -= recoil.y - tech.harpoonDensity = 0.006 //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed + tech.harpoonDensity = 0.005 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed }, // railGun2() { // const where = { diff --git a/js/level.js b/js/level.js index da8a2f1..67d8451 100644 --- a/js/level.js +++ b/js/level.js @@ -18,7 +18,7 @@ const level = { // m.setField("metamaterial cloaking") // b.giveGuns("harpoon") // tech.giveTech("grappling hook") - // tech.giveTech("bulk modulus") + // tech.giveTech("capacitor bank") // for (let i = 0; i < 2; i++) powerUps.directSpawn(0, 0, "tech"); // for (let i = 0; i < 9; i++) tech.giveTech("dynamo-bot") // for (let i = 10; i < tech.tech.length; i++) { tech.tech[i].isBanished = true } @@ -32,7 +32,7 @@ const level = { // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why // simulation.enableConstructMode() //used to build maps in testing mode // level.reactor(); - // level.pavilion(); //not in rotation, used for testing + // level.testing(); //not in rotation, used for testing if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************ // powerUps.research.changeRerolls(3000) // for (let i = 0; i < 30; i++) powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "tech", false); @@ -113,9 +113,7 @@ const level = { for (let i = 0; i < 2; i++) powerUps.spawn(level.exit.x + 10 * (Math.random() - 0.5), level.exit.y - 100 + 10 * (Math.random() - 0.5), "tech", false) //exit // for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 90 * (Math.random() - 0.5), player.position.y + 90 * (Math.random() - 0.5), "tech", false); //start } - if (m.plasmaBall) { - m.plasmaBall.isOn = false - } + if (m.plasmaBall) m.plasmaBall.isOn = false }, trainingText(say) { simulation.lastLogTime = 0; //clear previous messages @@ -2543,11 +2541,11 @@ const level = { spawn.mapRect(4850, -275, 50, 175); //??? - level.difficultyIncrease(5) //30 is near max on hard //60 is near max on why + level.difficultyIncrease(15) //30 is near max on hard //60 is near max on why m.addHealth(Infinity) - // spawn.starter(1900, -500, 200) //big boy - for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500) + spawn.starter(1900, -500, 200) //big boy + // for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500) // spawn.slashBoss(1900, -500) // spawn.launcherBoss(3200, -500) // spawn.laserTargetingBoss(1700, -500) diff --git a/js/player.js b/js/player.js index ca03267..a32db1a 100644 --- a/js/player.js +++ b/js/player.js @@ -2103,16 +2103,12 @@ const m = { mask: 0 //cat.body | cat.map | cat.mob | cat.mobBullet | cat.mobShield }, frictionAir: 0, - // radius: 1, - // friction: 0, - // frictionStatic: 0, - // restitution: 0, alpha: 0.6, isAttached: false, isOn: false, - drain: 0.0012, + drain: 0.0015, radiusLimit: 10, - damage: 0.18, + damage: 0.4, setPositionToNose() { const nose = { x: m.pos.x + 10 * Math.cos(m.angle), y: m.pos.y + 10 * Math.sin(m.angle) } Matter.Body.setPosition(this, Vector.add(nose, Vector.mult(Vector.normalise(Vector.sub(nose, m.pos)), this.circleRadius))); @@ -2120,38 +2116,94 @@ const m = { fire() { this.isAttached = false; const speed = 4 //scale with mass? + // Matter.Body.setVelocity(this, { + // x: speed * Math.cos(m.angle), + // y: speed * Math.sin(m.angle) + // }); Matter.Body.setVelocity(this, { - x: 0.4 * player.velocity.x + speed * Math.cos(m.angle), - y: 0.2 * player.velocity.y + speed * Math.sin(m.angle) + x: player.velocity.x * 0.5 + speed * Math.cos(m.angle), + y: player.velocity.y * 0.2 + speed * Math.sin(m.angle) }); + m.plasmaBall.setPositionToNose() + }, + scale(scale) { + Matter.Body.scale(m.plasmaBall, scale, scale); //shrink fast + if (this.circleRadius < this.radiusLimit) this.isOn = false }, do() { if (this.isOn) { //collisions with map if (Matter.Query.collides(this, map).length > 0) { - const scale = Math.max(0.7, 0.99 - 1 / m.plasmaBall.circleRadius) - Matter.Body.scale(m.plasmaBall, scale, scale); //shrink fast - if (m.plasmaBall.circleRadius < m.plasmaBall.radiusLimit) this.isOn = false + this.scale(Math.max(0.9, 0.98 - 0.05 / m.plasmaBall.circleRadius)) + if (this.speed > 2.5) { + const scale = 0.96 + Matter.Body.setVelocity(this, { + x: scale * this.velocity.x, + y: scale * this.velocity.y + }); + } } //collisions with mobs const whom = Matter.Query.collides(this, mob) const dmg = this.damage * m.dmgScale for (let i = 0, len = whom.length; i < len; i++) { - if (whom[i].bodyA.alive) whom[i].bodyA.damage(dmg); - if (whom[i].bodyB.alive) whom[i].bodyB.damage(dmg); + if (whom[i].bodyA.alive) { + whom[i].bodyA.damage(dmg); + if (whom[i].bodyA.shield) this.scale(Math.max(0.9, 0.99 - 0.5 / m.plasmaBall.circleRadius)) + } + if (whom[i].bodyB.alive) { + whom[i].bodyB.damage(dmg); + if (whom[i].bodyB.shield) this.scale(Math.max(0.9, 0.99 - 0.5 / m.plasmaBall.circleRadius)) + } + } + //slowly slow down if too fast + if (this.speed > 6) { + const scale = 0.997 + Matter.Body.setVelocity(this, { + x: scale * this.velocity.x, + y: scale * this.velocity.y + }); } - - //graphics - var gradient = ctx.createRadialGradient(this.position.x, this.position.y, 0, this.position.x, this.position.y, this.circleRadius); + const radius = this.circleRadius * (0.99 + 0.02 * Math.random()) + 3 * Math.random() + const gradient = ctx.createRadialGradient(this.position.x, this.position.y, 0, this.position.x, this.position.y, radius); + this.alpha = 0.5 + 0.1 * Math.random() gradient.addColorStop(0, `rgba(255,255,255,${this.alpha})`); - gradient.addColorStop(0.2, `rgba(255,200,255,${this.alpha})`); - gradient.addColorStop(1, `rgba(255,0,255,${this.alpha})`); + gradient.addColorStop(0.18 + 0.1 * Math.random(), `rgba(255,150,255,${this.alpha})`); + gradient.addColorStop(0.95, `rgba(255,0,255,${this.alpha})`); + // gradient.addColorStop(1, `rgba(255,150,255,${this.alpha})`); ctx.fillStyle = gradient ctx.beginPath(); - ctx.arc(this.position.x, this.position.y, this.circleRadius, 0, 2 * Math.PI); + ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI); ctx.fill(); + //draw arcs + const unit = Vector.rotate({ x: 1, y: 0 }, Math.random() * 6.28) + let len = 8 + const step = this.circleRadius / len + let x = this.position.x + let y = this.position.y + ctx.beginPath(); + if (Math.random() < 0.5) { + x += step * (unit.x + 6 * (Math.random() - 0.5)) + y += step * (unit.y + 6 * (Math.random() - 0.5)) + len -= 2 + } + if (Math.random() < 0.5) { + x += step * (unit.x + 6 * (Math.random() - 0.5)) + y += step * (unit.y + 6 * (Math.random() - 0.5)) + len -= 2 + } + ctx.moveTo(x, y); + + for (let i = 0; i < len; i++) { + x += step * (unit.x + 1.9 * (Math.random() - 0.5)) + y += step * (unit.y + 1.9 * (Math.random() - 0.5)) + ctx.lineTo(x, y); + } + ctx.strokeStyle = "#88f"; + ctx.lineWidth = 2 * Math.random(); + ctx.stroke(); } }, }); @@ -2176,20 +2228,32 @@ const m = { m.plasmaBall.setPositionToNose() } } else if (m.energy > m.plasmaBall.drain) { //charge up when attached - m.energy -= m.plasmaBall.drain; - const scale = 1 + 5 * Math.pow(Math.max(1, m.plasmaBall.circleRadius), -1.5) - Matter.Body.scale(m.plasmaBall, scale, scale); //grow + + + if (tech.isCapacitor) { + m.energy -= m.plasmaBall.drain * 4; + const scale = 1 + 5 * 16 * Math.pow(Math.max(1, m.plasmaBall.circleRadius), -1.8) + Matter.Body.scale(m.plasmaBall, scale, scale); //grow + + } else { + m.energy -= m.plasmaBall.drain; + const scale = 1 + 16 * Math.pow(Math.max(1, m.plasmaBall.circleRadius), -1.8) + Matter.Body.scale(m.plasmaBall, scale, scale); //grow + } m.plasmaBall.setPositionToNose() //add friction for player when holding ball, maybe more friction in vertical - } else { m.fieldCDcycle = m.cycle + 90; m.plasmaBall.fire() } } else if (m.holdingTarget && m.fieldCDcycle < m.cycle) { //holding, but field button is released m.pickUp(); + if (m.plasmaBall.isAttached) { + m.fieldCDcycle = m.cycle + 30; + m.plasmaBall.fire() + } } else { m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) if (m.plasmaBall.isAttached) { @@ -2200,6 +2264,7 @@ const m = { m.drawFieldMeter("rgba(0, 0, 0, 0.2)") m.plasmaBall.do() + console.log(m.plasmaBall.isAttached) } @@ -2903,7 +2968,7 @@ const m = { for (let i = 0, len = body.length; i < len; ++i) { if (Vector.magnitude(Vector.sub(body[i].position, m.fieldPosition)) < m.fieldRadius && !body[i].isNotHoldable) { - const DRAIN = speed * body[i].mass * 0.000005 // * (1 + m.energy * m.energy) //drain more energy when you have more energy + const DRAIN = speed * body[i].mass * 0.0000035 // * (1 + m.energy * m.energy) //drain more energy when you have more energy if (m.energy > DRAIN) { m.energy -= DRAIN; Matter.Body.setVelocity(body[i], velocity); //give block mouse velocity @@ -2988,10 +3053,10 @@ const m = { }, { name: "wormhole", - description: "use energy to tunnel through a wormhole
wormholes attract blocks and power ups
7% chance to duplicate spawned power ups", //
bullets may also traverse wormholes + description: "use energy to tunnel through a wormhole
wormholes attract blocks and power ups
5% chance to duplicate spawned power ups", //
bullets may also traverse wormholes drain: 0, effect: function() { - m.duplicateChance = 0.07 + m.duplicateChance = 0.05 m.fieldRange = 0 powerUps.setDupChance(); //needed after adjusting duplication chance diff --git a/js/powerup.js b/js/powerup.js index fd272a0..48fd73b 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -1045,7 +1045,7 @@ const powerUps = { }, pauseEjectTech(index) { if (tech.isPauseEjectTech || simulation.testing) { - if (Math.random() < 0.04 || tech.tech[index].isFromAppliedScience) { + if (Math.random() < 0.1 || tech.tech[index].isFromAppliedScience) { tech.removeTech(index) powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); } else { diff --git a/js/tech.js b/js/tech.js index 7bd62cd..5750bf4 100644 --- a/js/tech.js +++ b/js/tech.js @@ -3070,7 +3070,7 @@ const tech = { }, { name: "paradigm shift", - description: `clicking tech while paused ejects them
4% chance to convert that tech into ${powerUps.orb.research(1)}`, + description: `clicking tech while paused ejects them
10% chance to convert that tech into ${powerUps.orb.research(1)}`, maxCount: 1, count: 0, frequency: 1, @@ -3859,7 +3859,7 @@ const tech = { }, { name: "pneumatic actuator", - description: "nail gun takes no time to ramp up
to it's shortest delay after firing", + description: "nail gun takes no time to ramp up
to its shortest delay after firing", isGunTech: true, maxCount: 1, count: 0, @@ -5430,16 +5430,16 @@ const tech = { { name: "capacitor bank", // description: "charge effects build up almost instantly
throwing blocks, foam, railgun, pulse, tokamak", - descriptionFunction() { return `charge effects build up almost instantly
throwing blocks, ${tech.haveGunCheck("foam", false) ? "foam" : "foam"}, ${tech.isRailGun ? "railgun" : "railgun"}, ${tech.isPulseLaser ? "pulse" : "pulse"}, ${tech.isTokamak ? "tokamak" : "tokamak"}` }, + descriptionFunction() { return `charge effects build up almost instantly
throwing, ${tech.haveGunCheck("foam", false) ? "foam" : "foam"}, ${tech.isPlasmaBall ? "plasma ball" : "plasma ball"}, ${tech.isRailGun ? "railgun" : "railgun"}, ${tech.isPulseLaser ? "pulse" : "pulse"}, ${tech.isTokamak ? "tokamak" : "tokamak"}` }, isGunTech: true, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return tech.blockDamage > 0.075 || tech.isRailGun || tech.haveGunCheck("foam") || tech.isTokamak || tech.isPulseLaser + return tech.blockDamage > 0.075 || tech.isRailGun || tech.haveGunCheck("foam") || tech.isTokamak || tech.isPulseLaser || tech.isPlasmaBall }, - requires: "throwing blocks, railgun, foam, pulse, tokamak", + requires: "throwing blocks, railgun, foam, pulse, tokamak, plasma ball", effect() { tech.isCapacitor = true; for (i = 0, len = b.guns.length; i < len; i++) { //find which gun @@ -5717,7 +5717,7 @@ const tech = { }, remove() { tech.isHarpoonPowerUp = false - tech.harpoonDensity = 0.006 + tech.harpoonDensity = 0.005 } }, { @@ -6654,7 +6654,7 @@ const tech = { }, remove() { tech.isPlasmaBall = false; - if (this.count) m.fieldUpgrades[m.fieldMode].set() + if (this.count && m.fieldUpgrades[m.fieldMode].name === "plasma torch") m.fieldUpgrades[m.fieldMode].set() } }, { @@ -6675,7 +6675,7 @@ const tech = { }, remove() { tech.isExtruder = false; - if (this.count) m.fieldUpgrades[m.fieldMode].set() + if (this.count && m.fieldUpgrades[m.fieldMode].name === "plasma torch") m.fieldUpgrades[m.fieldMode].set() } }, { diff --git a/todo.txt b/todo.txt index 71b40e8..18f947b 100644 --- a/todo.txt +++ b/todo.txt @@ -1,25 +1,46 @@ ******************************************************** NEXT PATCH ************************************************** +plasma ball + much more damage + new graphics + fast decay in mob shields + works with capacitor + some bug fixes -plasma ball is now live, but it's still in beta - still needs - new graphics - damage balancing - fast decay in mob shields - player angle rotation speed while firing adds to fire speed - tech upgrade to get electrical arcs that randomly damage nearby mobs - current tech synergy - capacitor bank,plasma jet(range?) - -reservoir level is less crowded, so you can dodge mobs easier - horizontal flipped version is so reenabled -pure science renamed paradigm shift -difficulty scaling for heal and mob damage reduced 2% - -some possible bug fixes, I don't know... - +paradigm shift: 4->10% chance to give research instead of tech +harpoon density: 0.006->0.005 (lower damage and knock back to mobs) +wormhole: 7->5% duplication chance +pilot wave uses less energy ******************************************************** TODO ******************************************************** +plasma ball + maybe grow faster when you have more energy + or excess energy + change size/alpha when touching mobs + explode when touching mobs like spirit bomb? + player angle rotation speed while firing adds to fire speed + tech upgrade to get electrical arcs that randomly damage nearby mobs + use plasma jet tech? + tech: black hole: gives the plasma ball gravity + plasma orb increases in size and power as it eats enemies + maybe does damage to player to grow faster? + tech that makes it explode when it expires + +bug: often game puts player position at NaN + try: + cloaking/harpoon grapple on normal, continue past beating the final boss + clues: + maybe with vanish or other special blocks and grapple hook + very high level for tech, duplication + maybe not about JUNK though + maybe on tons of bullets + maybe grappling hook, Bulk modulus + solution: just kill the player if they go NaN + vanish elements shouldn't collide with mobs + maybe they don't return if mobs are in the way? + maybe they kill mobs in the way + maybe they should go non-collide with mobs + bug: harpoon attack gave a mob really high levels of health recent events: had 3 harpoons at a time @@ -34,17 +55,6 @@ bug: maybe I can put in an event listener to reset inputs to false when you tab enemies stuck with foam receive upward force over time only form aerogel tech? -bug: often game puts player position at NaN - try: - cloaking/harpoon grapple on normal, continue past beating the final boss - clues: - maybe with vanish or other special blocks and grapple hook - very high level for tech, duplication - maybe not about JUNK though - maybe on tons of bullets - maybe grappling hook, Bulk modulus - solution: just kill the player if they go NaN - Tech: superglue Requires: foam + another gun or plasma torch or molecular assembler Foam bubbles decay 50% slower @@ -53,9 +63,10 @@ Requires: foam + another gun or plasma torch or molecular assembler Enemies stuck with foam take 25% more damage should foam bots gets this also or is that too strong - -buff pilot wave damage or lower energy drain -lower base harpoon density +tech: harpoons stick into enemies + detonate after a short delay + attaches mob to wall if possible + firing while harpoon is stuck into an enemy rips it out of them, inflicting damage and stun and pulling them towards you const ctx = canvas.getContext('2d', {‘willReadFrequently': true});