diff --git a/.DS_Store b/.DS_Store index 8271bdb..fe1ba07 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/index.html b/index.html index 9969afa..25ede8b 100644 --- a/index.html +++ b/index.html @@ -183,7 +183,7 @@ - Chat about n-gon in the discord.
Let me know about ideas, or bugs. + Chat about n-gon in the discord.
Let me know about ideas, or bugs.


diff --git a/js/bullet.js b/js/bullet.js index 53a46cf..b4af594 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -430,18 +430,18 @@ const b = { m.energy -= 0.15 m.damage(0.01 * harm); //remove 99% of the damage 1-0.99 // console.log(Math.max(0, Math.min(0.15 - 0.01 * player.speed, 0.15))) - knock = Vector.mult(Vector.normalise(sub), 0.6 * player.mass * Math.max(0, Math.min(0.15 - 0.002 * player.speed, 0.15)) * tech.implosion); + knock = Vector.mult(Vector.normalise(sub), -0.6 * player.mass * Math.max(0, Math.min(0.15 - 0.002 * player.speed, 0.15))); player.force.x = knock.x; // not += so crazy forces can't build up with MIRV player.force.y = knock.y - 0.3; //some extra vertical kick } else { if (simulation.dmgScale) m.damage(harm); - knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg) * player.mass * 0.013 * tech.implosion); + knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * player.mass * 0.013); 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 * 0.005 * tech.implosion); + knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * player.mass * 0.005); player.force.x += knock.x; player.force.y += knock.y; } @@ -453,7 +453,7 @@ 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 * 0.022 * tech.implosion); + 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; if (tech.isBlockExplode) { @@ -468,7 +468,7 @@ const b = { }, 150 + 300 * Math.random()); } } else if (dist < alertRange) { - knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg) * body[i].mass * 0.011 * tech.implosion); + knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * body[i].mass * 0.011); body[i].force.x += knock.x; body[i].force.y += knock.y; } @@ -480,11 +480,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 * 0.013 * tech.implosion); + knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * powerUp[i].mass * 0.013); 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 * 0.007 * tech.implosion); + knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * powerUp[i].mass * 0.007); powerUp[i].force.x += knock.x; powerUp[i].force.y += knock.y; } @@ -501,12 +501,10 @@ const b = { 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 * m.dmgScale); mob[i].locatePlayer(); + knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg * damageScale) * mob[i].mass * (mob[i].isBoss ? 0.003 : 0.01)); if (tech.isExplosionStun) { mobs.statusStun(mob[i], 120) - knock *= 0.1 - } - knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg * damageScale) * mob[i].mass * (mob[i].isBoss ? 0.005 : 0.01) * tech.implosion); - if (!mob[i].isInvulnerable) { + } else if (!mob[i].isInvulnerable) { mob[i].force.x += knock.x; mob[i].force.y += knock.y; } @@ -514,12 +512,10 @@ const b = { 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 * (mob[i].isBoss ? 0.002 : 0.006) * tech.implosion); + knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg * damageScale) * mob[i].mass * (mob[i].isBoss ? 0 : 0.006)); if (tech.isExplosionStun) { mobs.statusStun(mob[i], 60) - knock *= 0.1 - } - if (!mob[i].isInvulnerable) { + } else if (!mob[i].isInvulnerable) { mob[i].force.x += knock.x; mob[i].force.y += knock.y; } @@ -773,10 +769,10 @@ const b = { const cycle = () => { if (simulation.paused || m.isBodiesAsleep) { requestAnimationFrame(cycle) } else { count++ - if (count < 60 && m.alive) requestAnimationFrame(cycle); - if (!(count % 8)) { + if (count < 110 && m.alive) requestAnimationFrame(cycle); + if (!(count % 10)) { const unit = Vector.rotate({ x: 1, y: 0 }, 6.28 * Math.random()) - b.explosion(Vector.add(where, Vector.mult(unit, size * (count * 0.011 + 0.03 * Math.random()))), size * (0.5 + Math.random() * 0.35), `hsla(${360*Math.random()},100%,66%,0.6)`); //makes bullet do explosive damage at end + b.explosion(Vector.add(where, Vector.mult(unit, size * (count * 0.01 + 0.02 * Math.random()))), size * (0.4 + Math.random() * 0.35), `hsla(${360*Math.random()},100%,66%,0.6)`); //makes bullet do explosive damage at end } } } @@ -791,7 +787,7 @@ const b = { if (count < 21 && m.alive) requestAnimationFrame(cycle); if (count % 2) { const unit = Vector.rotate({ x: 1, y: 0 }, curl * 6.28 * count / 18 + off) - b.explosion(Vector.add(where, Vector.mult(unit, size * 0.8)), size * 0.75, color); //makes bullet do explosive damage at end + b.explosion(Vector.add(where, Vector.mult(unit, size * 0.75)), size * 0.7, color); //makes bullet do explosive damage at end } } } @@ -800,6 +796,48 @@ const b = { let count = 0 requestAnimationFrame(cycle); }, + fireFlower(where, size) { //can occur after grenades detonate + // size *= b.explosionRange() + const range = size * Math.sqrt(b.explosionRange()) + const cycle = () => { + if (simulation.paused || m.isBodiesAsleep) { requestAnimationFrame(cycle) } else { + if (count < 30 && m.alive) requestAnimationFrame(cycle); + if (count === 0) { + const color = `hsla(${360*Math.random()},100%,66%,0.6)` + b.explosion(where, size * 0.8, color); + } + if (count === 8) { + const color = `hsla(${360*Math.random()},100%,66%,0.6)` + for (let i = 0, len = 6; i < len; i++) { + const unit = Vector.rotate({ x: 1, y: 0 }, 6.28 * i / len) + b.explosion(Vector.add(where, Vector.mult(unit, 1.2 * range)), size * 0.6, color); //makes bullet do explosive damage at end + } + } + if (count === 16) { + const color = `hsla(${360*Math.random()},100%,66%,0.6)` + for (let i = 0, len = 10; i < len; i++) { + const unit = Vector.rotate({ x: 1, y: 0 }, 6.28 * i / len) + b.explosion(Vector.add(where, Vector.mult(unit, 1.75 * range)), size * 0.45, color); //makes bullet do explosive damage at end + } + } + count++ + } + } + let count = 0 + requestAnimationFrame(cycle); + }, + grenadeEnd() { + if (tech.isCircleExplode) { + b.starburst(this.position, this.explodeRad) + } else if (tech.isPetalsExplode) { + b.fireFlower(this.position, this.explodeRad) + } else if (tech.isClusterExplode) { + b.fireworks(this.position, this.explodeRad) + } else { + b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end + } + if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random())) + }, grenade() { }, @@ -808,17 +846,8 @@ const b = { const me = bullet.length; bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false)); Matter.Body.setDensity(bullet[me], 0.0003); - bullet[me].explodeRad = (tech.implosion ? 375 : 300) * size + 100 * tech.isBlockExplode; - bullet[me].onEnd = function() { - if (tech.isCircleExplode) { - b.starburst(this.position, this.explodeRad) - } else if (tech.isClusterExplode) { - b.fireworks(this.position, this.explodeRad) - } else { - b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end - } - if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random())) - } + bullet[me].explodeRad = 300 * size + 100 * tech.isBlockExplode; + bullet[me].onEnd = b.grenadeEnd bullet[me].minDmgSpeed = 1; bullet[me].beforeDmg = function() { this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion @@ -839,16 +868,8 @@ const b = { const me = bullet.length; bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false)); Matter.Body.setDensity(bullet[me], 0.0003); - bullet[me].explodeRad = (tech.implosion ? 375 : 300) * size + 100 * tech.isBlockExplode; - bullet[me].onEnd = function() { - if (tech.isCircleExplode) { - b.starburst(this.position, this.explodeRad) - } else if (tech.isClusterExplode) { - b.fireworks(this.position, this.explodeRad) - } - b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end - if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random())) - } + bullet[me].explodeRad = 300 * size + 100 * tech.isBlockExplode; + bullet[me].onEnd = b.grenadeEnd bullet[me].minDmgSpeed = 1; bullet[me].beforeDmg = function() { this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion @@ -879,28 +900,18 @@ const b = { const me = bullet.length; bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false)); Matter.Body.setDensity(bullet[me], 0.0003); - bullet[me].explodeRad = (tech.implosion ? 425 : 350) * size + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100 - bullet[me].onEnd = function() { - if (tech.isCircleExplode) { - b.starburst(this.position, this.explodeRad) - } else if (tech.isClusterExplode) { - b.fireworks(this.position, this.explodeRad) - } - b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end - if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random())) - } + bullet[me].explodeRad = 350 * size + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100 + bullet[me].onEnd = b.grenadeEnd bullet[me].minDmgSpeed = 1; bullet[me].beforeDmg = function() { this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion }; speed = input.down ? 46 : 32 - Matter.Body.setVelocity(bullet[me], { x: m.Vx / 2 + speed * Math.cos(angle), y: m.Vy / 2 + speed * Math.sin(angle) }); Composite.add(engine.world, bullet[me]); //add bullet to world - bullet[me].endCycle = simulation.cycle + 70; bullet[me].frictionAir = 0.07; const MAG = 0.015 @@ -961,16 +972,8 @@ const b = { const me = bullet.length; bullet[me] = Bodies.circle(where.x, where.y, 20, b.fireAttributes(angle, false)); Matter.Body.setDensity(bullet[me], 0.0002); - bullet[me].explodeRad = (tech.implosion ? 425 : 350) * size + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100 - bullet[me].onEnd = function() { - if (tech.isCircleExplode) { - b.starburst(this.position, this.explodeRad) - } else if (tech.isClusterExplode) { - b.fireworks(this.position, this.explodeRad) - } - b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end - if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random())) - } + bullet[me].explodeRad = 350 * size + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100 + bullet[me].onEnd = b.grenadeEnd bullet[me].beforeDmg = function() { this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion }; @@ -1056,15 +1059,12 @@ const b = { if (tech.isRPG) { const SCALE = 2 Matter.Body.scale(bullet[me], SCALE, SCALE); - speed = input.down ? 25 : 15 // speed = input.down ? 43 : 32 - Matter.Body.setVelocity(bullet[me], { x: m.Vx / 2 + speed * Math.cos(angle), y: m.Vy / 2 + speed * Math.sin(angle) }); - const MAG = 0.005 bullet[me].thrust = { x: bullet[me].mass * MAG * Math.cos(angle), @@ -5643,7 +5643,7 @@ const b = { ctx.lineTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5)); } } - this.waves[i].radius += tech.waveBeamSpeed * this.waves[i].expanding //expand / move + this.waves[i].radius += 0.9 * tech.waveBeamSpeed * this.waves[i].expanding //expand / move // if (this.waves[i].radius > end) this.waves.splice(i, 1) //end if (this.waves[i].radius > end) { this.waves[i].expanding = -1 @@ -5738,7 +5738,7 @@ const b = { } // ctx.stroke(); //draw vibes - this.waves[i].radius += tech.waveBeamSpeed * 2 * this.waves[i].expanding //expand / move + this.waves[i].radius += tech.waveBeamSpeed * 1.8 * this.waves[i].expanding //expand / move if (this.waves[i].radius > end) { this.waves[i].expanding = -1 this.waves[i].reflection-- @@ -5857,9 +5857,9 @@ const b = { let waveSpeedMap = 0.1 let waveSpeedBody = 0.25 if (tech.isPhaseVelocity) { - waveSpeedMap = 3 - waveSpeedBody = 1.9 - bullet[me].dmg *= 1.15 + waveSpeedMap = 3.5 + waveSpeedBody = 2 + bullet[me].dmg *= 1.2 } if (tech.waveReflections) { bullet[me].reflectCycle = totalCycles / tech.waveReflections //tech.waveLengthRange diff --git a/js/level.js b/js/level.js index 4822128..93c7754 100644 --- a/js/level.js +++ b/js/level.js @@ -15,16 +15,16 @@ const level = { levels: [], start() { if (level.levelsCleared === 0) { //this code only runs on the first level - // simulation.isHorizontalFlipped = true - // m.setField("perfect diamagnetism") - // b.giveGuns("grenades") - // tech.giveTech("rule 30") - // tech.giveTech("cherenkov radiation") + // // simulation.isHorizontalFlipped = true + // m.setField("wormhole") + // b.giveGuns("matter wave") + // tech.giveTech("chain reaction") + // tech.giveTech("fireworks") // tech.giveTech("flame test") // tech.giveTech("pyrotechnics") // for (let i = 0; i < 10; i++) tech.giveTech("replication") - // tech.giveTech("decoherence") - // tech.giveTech("pneumatic actuator") + // tech.giveTech("acetone peroxide") + // for (let i = 0; i < 10; i++) tech.giveTech("ammonium nitrate") // for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "tech"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "research"); // for (let i = 0; i < 15; i++) tech.giveTech() @@ -2652,7 +2652,7 @@ const level = { // spawn.slashBoss(1900, -500) // spawn.launcherBoss(3200, -500) // spawn.laserTargetingBoss(1700, -500) - // spawn.powerUpBoss(1900, -500) + spawn.powerUpBoss(1900, -500) // spawn.powerUpBossBaby(3200, -500) // spawn.snakeBoss(1700, -500) // spawn.streamBoss(3200, -500) @@ -2663,7 +2663,7 @@ const level = { // spawn.blinkBoss(1700, -500) // spawn.snakeSpitBoss(3200, -500) // spawn.laserBombingBoss(1700, -500) - spawn.launcherBoss(3200, -500) + // spawn.launcherBoss(3200, -500) // spawn.blockBoss(1700, -500) // spawn.blinkBoss(3200, -500) // spawn.spiderBoss(1700, -500) diff --git a/js/tech.js b/js/tech.js index 5e64ae0..ed6e33e 100644 --- a/js/tech.js +++ b/js/tech.js @@ -301,7 +301,7 @@ const tech = { } }, tech: [{ - name: "gun sciences", + name: "ordnance", description: "triple the frequency of finding guntech
spawn a gun", maxCount: 1, count: 0, @@ -4396,7 +4396,7 @@ const tech = { // { name: "phase velocity", - description: "matter wave propagates faster through solids
increase matter wave damage by 15%", + description: "matter wave propagates faster through solids
increase matter wave damage by 20%", // description: "matter wave propagates faster through solids
up by 3000% in the map and 760% in blocks", isGunTech: true, maxCount: 1, @@ -4471,7 +4471,7 @@ const tech = { tech.waveBeamDamage += 1.5 * 0.37 //this sets base matter wave damage }, remove() { - tech.waveBeamSpeed = 10; + tech.waveBeamSpeed = 12; tech.waveBeamDamage = 1.5 //this sets base matter wave damage } }, @@ -4789,25 +4789,25 @@ const tech = { // }, { name: "controlled explosion", - description: `use ${powerUps.orb.research(3)} to dynamically reduce all
explosions until they do no harm`, + description: `use ${powerUps.orb.research(4)} to dynamically reduce all
explosions until they do no harm`, isGunTech: true, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 2) && (tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)) + return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 3) && (tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)) }, requires: "an explosive damage source, not electric reactive armor", effect: () => { tech.isSmartRadius = true; - for (let i = 0; i < 3; i++) { + for (let i = 0; i < 4; i++) { if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) } }, remove() { tech.isSmartRadius = false; - if (this.count > 0) powerUps.research.changeRerolls(3) + if (this.count > 0) powerUps.research.changeRerolls(4) } }, { @@ -4891,25 +4891,6 @@ const tech = { b.setGrenadeMode() } }, - { - name: "implosion", - description: "explosions pull objects towards them
increase grenade radius and damage 25%", - isGunTech: true, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return tech.haveGunCheck("grenades") && !tech.isExplodeRadio && !tech.isNeutronBomb - }, - requires: "grenades, not iridium-192, neutron bomb", - effect: () => { - tech.implosion = 1; - }, - remove() { - tech.implosion = -1; - } - }, { name: "chain reaction", description: "increase grenade radius and damage 33%
blocks caught in explosions also explode", @@ -4938,9 +4919,9 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("grenades") && !tech.isNeutronBomb + return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && !tech.isCircleExplode && !tech.isPetalsExplode }, - requires: "grenades, not neutron bomb", + requires: "grenades, not neutron bomb, pyrotechnics, fireworks", effect() { tech.isClusterExplode = true; }, @@ -4957,9 +4938,9 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && tech.isClusterExplode + return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && !tech.isClusterExplode && !tech.isPetalsExplode }, - requires: "grenades, flame test, not neutron bomb", + requires: "grenades, not neutron bomb, flame test, fireworks", effect() { tech.isCircleExplode = true; }, @@ -4967,6 +4948,25 @@ const tech = { tech.isCircleExplode = false; } }, + { + name: "fireworks", + description: "when grenades detonate they release
colorful rings petals of explosions", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && !tech.isClusterExplode && !tech.isCircleExplode + }, + requires: "grenades, not neutron bomb, pyrotechnics, flame test", + effect() { + tech.isPetalsExplode = true; + }, + remove() { + tech.isPetalsExplode = false; + } + }, { name: "neutron bomb", description: "grenades are irradiated with Cf-252
does damage, harm, and drains energy", @@ -10185,7 +10185,7 @@ const tech = { isNoDraftPause: null, isFoamPressure: null, foamDamage: null, - implosion: null, isClusterExplode: null, - isCircleExplode: null + isCircleExplode: null, + isPetalsExplode: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index 07b16e9..8fa9723 100644 --- a/todo.txt +++ b/todo.txt @@ -1,44 +1,22 @@ ******************************************************** NEXT PATCH ************************************************** -grenade tech: flame test - grenades release a cluster of smaller explosions -grenade tech: pyrotechnics - grenades release a circle of smaller explosions -grenade tech: implosion - explosions pull things in, not out, +25% to grenade explosion damage and radius -chain reaction no longer requires vacuum bomb -bosses and mobs have much less knock back from explosions - invulnerable mobs have no knock back +grenade now has 3 fireworks options, you can only have 1 at a time + flame test, fireworks, pyrotechnics +implosion has been removed +controlled explosion 3->4 research -alternator harpoon/grapple/railgun energy drain reduced by 100->60% -bots no longer unlock tech until you upgrade to a bot type -JUNK tech rule 30 is now sometimes rule 90 instead -disabled testing for why? mode - -wave beam - amplitude 50->37% damage - propagation 50->37% damage -worms - annelids 10-120% -> about 37% damage -radiation - nuclear transmutation stacks 9x - gives 70->47% damage per stack -explosions - ammonium nitrate 27->24% damage and radius +base matter wave moves 20% faster +gun science renamed ordnance +bug fixes ******************************************************** TODO ******************************************************** buff early matter wave without phonon -some grenade tech made all the bosses go away and not drop anything - check: fireworks, vacuum, stun, chain reaction, implosion - more fireworks themed grenade tech - shotting star - fire a series of explosions higher and higher up, also increase radius with height - star burst - 5 explosions in star shape - delay - explosion in same place - pulse - 30s of lasers + shooting star - fire a series of explosions higher and higher up, also increase radius with height -merge mines and grenades? tech - neutron bombs deal 100% more damage, but finishes detonating much faster tech - neutron bombs will explode into a small iridum explosion after it expires