diff --git a/.DS_Store b/.DS_Store index 6b8e825..babae7a 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index d47fdfe..9728ed8 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1108,6 +1108,7 @@ const b = { }, harpoon(where, target, angle = m.angle, harpoonLength = 1, isReturn = false, totalCycles = 15) { const me = bullet.length; + const returnRadius = 100 * Math.sqrt(harpoonLength) bullet[me] = Bodies.fromVertices(where.x, where.y, [{ x: -40 * harpoonLength, y: 2, index: 0, isInternal: false }, { x: -40 * harpoonLength, y: -2, index: 1, isInternal: false }, { x: 50 * harpoonLength, y: -3, index: 3, isInternal: false }, { x: 30 * harpoonLength, y: 2, index: 4, isInternal: false }], { cycle: 0, angle: angle, @@ -1192,7 +1193,7 @@ const b = { } }, returnToPlayer() { - if (Vector.magnitude(Vector.sub(this.position, m.pos)) < 100) { //near player + if (Vector.magnitude(Vector.sub(this.position, m.pos)) < returnRadius) { //near player this.endCycle = 0; if (m.cycle + 25 * b.fireCDscale < m.fireCDcycle) m.fireCDcycle = m.cycle + 25 * b.fireCDscale //lower cd to 25 if it is above 25 //recoil on catching @@ -2793,7 +2794,7 @@ const b = { inertia: Infinity, frictionAir: 0.003, dmg: 0, //damage on impact - damage: (tech.isFastFoam ? 0.039 : 0.011) * (tech.isBulletTeleport ? 1.5 : 1), //damage done over time + damage: (tech.isFastFoam ? 0.039 : 0.011) * (tech.isBulletTeleport ? 1.43 : 1), //damage done over time scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1), classType: "bullet", collisionFilter: { @@ -4416,7 +4417,7 @@ const b = { ctx.lineWidth = 2 * tech.wavePacketDamage ctx.beginPath(); const end = 700 * Math.sqrt(tech.isBulletsLastLonger) / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1060 - const damage = 2 * b.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.5 : 1) //damage is lower for large radius mobs, since they feel the waves longer + const damage = 2 * b.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.43 : 1) //damage is lower for large radius mobs, since they feel the waves longer for (let i = this.waves.length - 1; i > -1; i--) { //draw wave @@ -4506,7 +4507,7 @@ const b = { ctx.lineWidth = 2 * tech.wavePacketDamage ctx.beginPath(); const end = 1100 * tech.isBulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1767 - const damage = 2 * b.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.5 : 1) //damage is lower for large radius mobs, since they feel the waves longer + const damage = 2 * b.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.43 : 1) //damage is lower for large radius mobs, since they feel the waves longer for (let i = this.waves.length - 1; i > -1; i--) { const v1 = Vector.add(this.waves[i].position, Vector.mult(this.waves[i].unit1, this.waves[i].radius)) @@ -4621,7 +4622,7 @@ const b = { slow: 0, amplitude: (input.down ? 5 : 10) * ((this.wavePacketCycle % 2) ? -1 : 1) * Math.sin((this.wavePacketCycle + 1) * 0.088), //0.0968 //0.1012 //0.11 //0.088 //shorten wave packet minDmgSpeed: 0, - dmg: b.dmgScale * tech.waveBeamDamage * tech.wavePacketDamage * (tech.isBulletTeleport ? 1.5 : 1), //also control damage when you divide by mob.mass + dmg: b.dmgScale * tech.waveBeamDamage * tech.wavePacketDamage * (tech.isBulletTeleport ? 1.43 : 1), //also control damage when you divide by mob.mass classType: "bullet", collisionFilter: { category: 0, @@ -5088,7 +5089,7 @@ const b = { //look for closest mob in player's LoS const dir = { x: Math.cos(m.angle), y: Math.sin(m.angle) }; //make a vector for the player's direction of length 1; used in dot product const length = tech.isLargeHarpoon ? 1 + 0.09 * Math.sqrt(this.ammo) : 1 - const totalCycles = 7 * (tech.isFilament ? 1 + 0.009 * Math.min(100, this.ammo) : 1) + const totalCycles = 7 * (tech.isFilament ? 1 + 0.009 * Math.min(100, this.ammo) : 1) * Math.sqrt(length) if (input.down) { for (let i = 0, len = mob.length; i < len; ++i) { if (mob[i].alive && !mob[i].isBadTarget && Matter.Query.ray(map, m.pos, mob[i].position).length === 0) { diff --git a/js/index.js b/js/index.js index 389770c..b3f02fd 100644 --- a/js/index.js +++ b/js/index.js @@ -695,6 +695,7 @@ const input = { function cleanText(text) { return text.replace('Key', '').replace('Digit', '') } + if (!input.key.fire) input.key.fire = "KeyF" document.getElementById("key-fire").innerHTML = cleanText(input.key.fire) document.getElementById("key-field").innerHTML = cleanText(input.key.field) document.getElementById("key-up").innerHTML = cleanText(input.key.up) diff --git a/js/level.js b/js/level.js index 6cd0819..a194bae 100644 --- a/js/level.js +++ b/js/level.js @@ -23,6 +23,7 @@ const level = { // tech.giveTech("all-stars") // for (let i = 0; i < 3; i++) tech.giveTech("super sized") // for (let i = 0; i < 9; i++) tech.giveTech("MIRV") + // tech.isCancelDuplication = true level.intro(); //starting level // level.testing(); //not in rotation, used for testing @@ -2293,7 +2294,7 @@ const level = { spawn.mapRect(5050, -100, 50, 150); spawn.mapRect(4850, -275, 50, 175); // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why - spawn.starter(1900, -500, 200) //big boy + // spawn.starter(1900, -500, 200) //big boy // spawn.blockGroup(1900, -500) // for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40); // spawn.laserBombingBoss(1900, -500) @@ -2312,11 +2313,11 @@ const level = { // spawn.laserBombingBoss(1600, -500) // spawn.laserTargetingBoss(1600, -500) // spawn.laserBoss(1600, -500) - // spawn.cellBossCulture(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.snakeBoss(1200, -500) // spawn.suckerBoss(2900, -500) // spawn.randomMob(1600, -500) }, diff --git a/js/mob.js b/js/mob.js index f487880..0c63e09 100644 --- a/js/mob.js +++ b/js/mob.js @@ -1141,7 +1141,7 @@ const mobs = { this.leaveBody = false; // no body since it turned into the bot } if (tech.isAddRemoveMaxHealth) { - if (this.isBoss) { + if (this.isBoss && this.isDropPowerUp) { for (let i = 0; i < 2; i++) powerUps.spawn(this.position.x, this.position.y, "tech", false) //exit } else { const amount = 0.01 diff --git a/js/player.js b/js/player.js index fe855c2..c0977c2 100644 --- a/js/player.js +++ b/js/player.js @@ -2027,7 +2027,7 @@ const m = { }, { name: "time dilation", - description: "use energy to stop time
move and fire while time is stopped
mobs do 50% harm while time is stopped", + description: "use energy to stop time
while time is stopped you can move and fire
and collisions do 50% less harm", effect: () => { // m.fieldMeterColor = "#000" m.fieldFire = true; @@ -2108,7 +2108,7 @@ const m = { }, { name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency" - description: "when not firing activate a cloaking effect
+333% damage if a mob hasn't recently died
mobs do 50% harm while you're cloaked", + description: "when not firing activate a cloaking effect
+333% damage if a mob hasn't recently died
collisions do 50% less harm when cloaked", effect: () => { m.fieldFire = true; m.fieldMeterColor = "#333"; @@ -2156,12 +2156,12 @@ const m = { } if (tech.isCloakStun) { //stun nearby mobs after exiting cloak let isMobsAround = false - const stunRange = m.fieldDrawRadius * 1.4 - const drain = 0.1 + const stunRange = m.fieldDrawRadius * 1.5 + const drain = 0.15 const stunTime = 180 if (m.energy > drain) { for (let i = 0, len = mob.length; i < len; ++i) { - if (Vector.magnitude(Vector.sub(mob[i].position, m.pos)) < stunRange && Matter.Query.ray(map, mob[i].position, m.pos).length === 0) { + if (Vector.magnitude(Vector.sub(mob[i].position, m.pos)) < stunRange && Matter.Query.ray(map, mob[i].position, m.pos).length === 0 && !mob[i].isBadTarget) { isMobsAround = true mobs.statusStun(mob[i], stunTime) } @@ -2172,7 +2172,7 @@ const m = { x: m.pos.x, y: m.pos.y, radius: stunRange, - color: "hsla(0,50%,100%,0.8)", + color: "hsla(0,50%,100%,0.7)", time: 7 }); } @@ -2213,7 +2213,7 @@ const m = { let inPlayer = Matter.Query.region(mob, player.bounds) if (inPlayer.length > 0) { for (let i = 0; i < inPlayer.length; i++) { - if (m.energy > 0 && inPlayer[i].shield) m.energy -= 0.012; + if (m.energy > 0 && inPlayer[i].shield) m.energy -= 0.014; } } } else { diff --git a/js/powerup.js b/js/powerup.js index 524d383..40887f0 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -173,7 +173,6 @@ const powerUps = { break } } - ctx.globalAlpha = 0.4 * Math.sin(m.cycle * 0.25) + 0.6 for (let i = 0, len = powerUp.length; i < len; ++i) { ctx.beginPath(); @@ -258,6 +257,8 @@ const powerUps = { if (tech.isCancelDuplication) { tech.cancelCount++ tech.maxDuplicationEvent() + simulation.makeTextLog(`tech.duplicationChance() += ${0.045}`) + simulation.circleFlare(0.045); } if (tech.isCancelRerolls) { for (let i = 0, len = 5 + 5 * Math.random(); i < len; i++) { diff --git a/js/simulation.js b/js/simulation.js index bb4519a..0679ecd 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -256,7 +256,41 @@ const simulation = { } } }, - lastLogTime: 0, + circleFlare(dup, loops = 100) { + boltNum = dup * 300 + const bolts = [] + colors = [powerUps.research.color, powerUps.ammo.color, powerUps.heal.color, powerUps.tech.color, powerUps.field.color, powerUps.gun.color] + for (let i = 0; i < boltNum; ++i) { + const mag = 4 + 20 * Math.random() + const angle = 2 * Math.PI * Math.random() + bolts.push({ + x: m.pos.x, + y: m.pos.y, + Vx: mag * Math.cos(angle), + Vy: mag * Math.sin(angle), + color: colors[Math.floor(Math.random() * colors.length)] + }) + } + let count = 0 + loop = () => { //draw electricity + if (count++ < loops) requestAnimationFrame(loop) + for (let i = 0, len = bolts.length; i < len; ++i) { + bolts[i].x += bolts[i].Vx + bolts[i].y += bolts[i].Vy + if (Math.random() < 0.2) { + simulation.drawList.push({ + x: bolts[i].x, + y: bolts[i].y, + radius: 1.5 + 5 * Math.random(), + // color: "rgba(0,155,155,0.7)", + color: bolts[i].color, + time: Math.floor(9 + 25 * Math.random() * Math.random()) + }); + } + } + } + requestAnimationFrame(loop) + }, // lastLogTimeBig: 0, boldActiveGunHUD() { if (b.inventory.length > 0) { @@ -314,6 +348,7 @@ const simulation = { } document.getElementById("tech").innerHTML = text }, + lastLogTime: 0, isTextLogOpen: true, // diff --git a/js/spawn.js b/js/spawn.js index ed660b2..3b53316 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -1477,15 +1477,15 @@ const spawn = { y: this.velocity.y * 0.99 }); } - // this.seePlayerCheckByDistance() - if (!(simulation.cycle % this.seePlayerFreq)) { - if (this.distanceToPlayer2() < this.seeAtDistance2) { // ignore cloak for black holes - this.locatePlayer(); - if (!this.seePlayer.yes) this.seePlayer.yes = true; - } else if (this.seePlayer.recall) { - this.lostPlayer(); - } - } + this.seePlayerCheckByDistance() + // if (!(simulation.cycle % this.seePlayerFreq)) { + // if (this.distanceToPlayer2() < this.seeAtDistance2) { // ignore cloak for black holes + // this.locatePlayer(); + // if (!this.seePlayer.yes) this.seePlayer.yes = true; + // } else if (this.seePlayer.recall) { + // this.lostPlayer(); + // } + // } this.checkStatus(); if (this.seePlayer.recall) { //eventHorizon waves in and out diff --git a/js/tech.js b/js/tech.js index 8468a8c..0358128 100644 --- a/js/tech.js +++ b/js/tech.js @@ -3079,6 +3079,7 @@ effect() { tech.duplicateChance += 0.1 powerUps.setDupChance(); //needed after adjusting duplication chance + if (!build.isExperimentSelection) simulation.circleFlare(0.1); tech.addJunkTechToPool(30) }, remove() { @@ -3100,7 +3101,8 @@ requires: "below 100% duplication chance", effect: () => { tech.isStimulatedEmission = true - powerUps.setDupChance(); //needed after adjusting duplication chance + powerUps.setDupChance(0.17); //needed after adjusting duplication chance + if (!build.isExperimentSelection) simulation.circleFlare(0.17); }, remove() { tech.isStimulatedEmission = false @@ -3121,6 +3123,7 @@ effect: () => { tech.isPowerUpsVanish = true powerUps.setDupChance(); //needed after adjusting duplication chance + if (!build.isExperimentSelection) simulation.circleFlare(0.13); }, remove() { tech.isPowerUpsVanish = false @@ -4891,7 +4894,7 @@ }, { name: "uncertainty principle", - description: "foam and wave particle positions are random
increase their damage by 50%", + description: "foam and wave particle positions are random
increase their damage by 43%", isGunTech: true, maxCount: 1, count: 0, @@ -6055,7 +6058,7 @@ effect() { tech.cloakDuplication = 0.42 powerUps.setDupChance(); //needed after adjusting duplication chance - + if (!build.isExperimentSelection) simulation.circleFlare(0.42); }, remove() { tech.cloakDuplication = 0 @@ -6304,6 +6307,7 @@ effect() { tech.wormDuplicate = 0.14 powerUps.setDupChance(); //needed after adjusting duplication chance + if (!build.isExperimentSelection) simulation.circleFlare(0.14); for (let i = 0; i < 4; i++) { if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) } diff --git a/todo.txt b/todo.txt index b8de4b6..e7eeb9b 100644 --- a/todo.txt +++ b/todo.txt @@ -1,14 +1,9 @@ ******************************************************** NEXT PATCH ************************************************** -pausing time or being cloaked gives you 50% harm reduction from mob collisions - -no-cloning theorem duplication => down to 42%, but no longer removes 1% on bosses -dazzler => drains 25%->10% energy, and it has a 15% bigger radius -boson composite => only drains energy when you touch shields - -'F' key lets you fire, and it can be rebound to other keys - might be some bugs here, I didn't do much testing +blackhole mobs can no longer see past stealth +adding dup chance has graphics now +bug fixes ******************************************************** TODO ********************************************************