diff --git a/.DS_Store b/.DS_Store index 039b8fb..dd7f993 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index 5b978e2..55af9b6 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1041,10 +1041,10 @@ const b = { } //aoe damage to mobs for (let i = 0, len = mob.length; i < len; i++) { - if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.damageRadius) { + if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.damageRadius + mob[i].radius) { let dmg = b.dmgScale * 0.09 if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way - if (mob[i].shield) dmg *= 4 //x5 to make up for the /5 that shields normally take + if (mob[i].shield) dmg *= 3 //to make up for the /5 that shields normally take mob[i].damage(dmg); mob[i].locatePlayer(); if (tech.isNeutronSlow) { @@ -2211,30 +2211,31 @@ const b = { }, droneRadioactive(where = { x: m.pos.x + 30 * Math.cos(m.angle) + 20 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 20 * (Math.random() - 0.5) }, speed = 1) { const me = bullet.length; - const THRUST = tech.isFastDrones ? 0.002 : 0.0012 + const THRUST = tech.isFastDrones ? 0.002 : 0.0012 + 0.0004 * (Math.random() - 0.5) const dir = m.angle + 0.4 * (Math.random() - 0.5); const RADIUS = (4 + 1 * Math.random()) bullet[me] = Bodies.polygon(where.x, where.y, 8, RADIUS, { angle: dir, inertia: Infinity, - friction: 0.05, + friction: 0, frictionAir: 0, - restitution: 1, + restitution: 0.8 + 0.199 * Math.random(), dmg: 0.24, //damage done in addition to the damage from momentum lookFrequency: 120 + Math.floor(23 * Math.random()), - endCycle: simulation.cycle + Math.floor((900 + 400 * Math.random()) * tech.isBulletsLastLonger) + 140 + RADIUS * 5, + endCycle: simulation.cycle + Math.floor((900 + 120 * Math.random()) * tech.isBulletsLastLonger / tech.droneRadioDamage) + 140 + RADIUS * 5, classType: "bullet", collisionFilter: { category: cat.bullet, mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield //self collide }, minDmgSpeed: 0, + speedCap: 5 + 2 * Math.random(), //6 is normal lockedOn: null, isFollowMouse: true, deathCycles: 110 + RADIUS * 5, isImproved: false, radioRadius: 0, - maxRadioRadius: 400 + Math.floor(75 * Math.random()) + 80 * tech.isNeutronSlow, + maxRadioRadius: 365 + Math.floor(150 * Math.random()), beforeDmg(who) { const unit = Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), -20) //move away from target after hitting Matter.Body.setVelocity(this, { @@ -2274,46 +2275,24 @@ const b = { } //aoe damage to mobs for (let i = 0, len = mob.length; i < len; i++) { - if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.radioRadius) { - let dmg = b.dmgScale * 0.035 //neutron bombs dmg = 0.09 + if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.radioRadius + mob[i].radius) { + let dmg = b.dmgScale * 0.055 * tech.droneRadioDamage //neutron bombs dmg = 0.09 if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way - if (mob[i].shield) dmg *= 4 //x5 to make up for the /5 that shields normally take + if (mob[i].shield) dmg *= 3 // to make up for the /5 that shields normally take mob[i].damage(dmg); mob[i].locatePlayer(); - if (tech.isNeutronSlow) { - Matter.Body.setVelocity(mob[i], { - x: mob[i].velocity.x * 0.97, - y: mob[i].velocity.y * 0.97 - }); - } } } //draw ctx.beginPath(); ctx.arc(this.position.x, this.position.y, this.radioRadius, 0, 2 * Math.PI); ctx.globalCompositeOperation = "lighter" - ctx.fillStyle = `rgba(25,139,170,${0.1+0.05*Math.random()})`; + // ctx.fillStyle = `rgba(25,139,170,${0.15+0.05*Math.random()})`; + // ctx.fillStyle = `rgba(36, 207, 255,${0.1+0.05*Math.random()})`; + ctx.fillStyle = `rgba(28, 175, 217,${0.13+0.07*Math.random()})`; ctx.fill(); ctx.globalCompositeOperation = "source-over" - if (tech.isNeutronSlow) { - const slow = (who, radius = this.radioRadius * 3.2) => { - for (i = 0, len = who.length; i < len; i++) { - const sub = Vector.sub(this.position, who[i].position); - const dist = Vector.magnitude(sub); - if (dist < radius) { - Matter.Body.setVelocity(who[i], { - x: who[i].velocity.x * 0.975, - y: who[i].velocity.y * 0.975 - }); - } - } - } - slow(body, this.radioRadius) - slow([player], this.radioRadius) - } - - //normal drone actions if (simulation.cycle + this.deathCycles > this.endCycle) { //fall shrink and die this.force.y += this.mass * 0.0012; @@ -2430,7 +2409,7 @@ const b = { this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, simulation.mouseInGame)), -this.mass * THRUST) } // speed cap instead of friction to give more agility - if (this.speed > 6) { + if (this.speed > this.speedCap) { Matter.Body.setVelocity(this, { x: this.velocity.x * 0.97, y: this.velocity.y * 0.97 @@ -4383,10 +4362,10 @@ const b = { if (tech.isDroneRadioactive) { if (m.crouch) { b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 45) - m.fireCDcycle = m.cycle + Math.floor(7 * 13 * b.fireCD); // cool down + m.fireCDcycle = m.cycle + Math.floor(5 * 13 * b.fireCD); // cool down } else { b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 10) - m.fireCDcycle = m.cycle + Math.floor(7 * 6 * b.fireCD); // cool down + m.fireCDcycle = m.cycle + Math.floor(5 * 6 * b.fireCD); // cool down } } else { if (m.crouch) { diff --git a/js/level.js b/js/level.js index 768f834..6f0369a 100644 --- a/js/level.js +++ b/js/level.js @@ -13,25 +13,14 @@ const level = { start() { if (level.levelsCleared === 0) { //this code only runs on the first level // simulation.enableConstructMode() //used to build maps in testing mode - // simulation.difficulty = 20 + // level.difficultyIncrease(30) // simulation.isHorizontalFlipped = true - // level.difficultyIncrease(99) - // m.setField("nano-scale manufacturing") + // m.setField("time dilation") // b.giveGuns("grenades") // tech.giveTech("neutron bomb") - // b.giveGuns("drones") - // tech.giveTech("radioactive drones") - // tech.isRadioactiveResistance = true // for (let i = 0; i < 9; i++) tech.giveTech("spherical harmonics") - // tech.isExplodeRadio = true - // tech.giveTech("vacuum permittivity") - // tech.giveTech("quenching") - // tech.giveTech("decoherence") // tech.giveTech("supertemporal") // for (let i = 0; i < 3; i++) tech.giveTech("packet length") - // for (let i = 0; i < 3; i++) tech.giveTech("propagation") - // for (let i = 0; i < 3; i++) tech.giveTech("bound state") - // for (let i = 0; i < 9; i++) tech.giveTech("WIMPs") level.intro(); //starting level // level.labs(); @@ -969,7 +958,6 @@ const level = { if (this.height > 0 && Matter.Query.region([player], this).length) { const DRAIN = 0.003 * (tech.isRadioactiveResistance ? 0.25 : 1) + m.fieldRegen - console.log(DRAIN) if (m.energy > DRAIN) { m.energy -= DRAIN } else { @@ -2091,7 +2079,7 @@ const level = { // toggle.query(); }; - level.setPosToSpawn(0, -750); //normal spawn + level.setPosToSpawn(0, -450); //normal spawn spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); level.exit.x = 6500; level.exit.y = -230; @@ -2110,8 +2098,8 @@ const level = { spawn.mapRect(-950, 0, 8200, 800); //ground spawn.mapRect(-950, -1200, 800, 1400); //left wall spawn.mapRect(-950, -1800, 8200, 800); //roof - spawn.mapRect(-250, -700, 1000, 900); // shelf - spawn.mapRect(-250, -1200, 1000, 250); // shelf roof + spawn.mapRect(-250, -400, 1000, 600); // shelf + spawn.mapRect(-250, -1200, 1000, 550); // shelf roof // powerUps.spawnStartingPowerUps(600, -800); // for (let i = 0; i < 50; ++i) powerUps.spawn(550, -800, "research", false); // powerUps.spawn(350, -800, "gun", false); @@ -2135,16 +2123,16 @@ const level = { spawn.mapRect(6700, -1800, 800, 2600); //right wall spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump - // spawn.starter(1900, -500, 200) //big boy + spawn.starter(1900, -500, 200) //big boy // spawn.grower(1900, -500) // spawn.pulsarBoss(1900, -500) // spawn.shooterBoss(1900, -500) // spawn.historyBoss(1200, -500) // spawn.laserTargetingBoss(1600, -400) - spawn.hopper(1600, -500) + // spawn.hopper(1600, -500) // spawn.laserTargetingBoss(1700, -120) // spawn.bomberBoss(1400, -500) - spawn.hopBoss(1800, -120) + // spawn.hopBoss(1800, -120) // spawn.streamBoss(1600, -500) // spawn.orbitalBoss(1600, -500) // spawn.cellBossCulture(1600, -500) diff --git a/js/player.js b/js/player.js index 8000520..7ee8b3c 100644 --- a/js/player.js +++ b/js/player.js @@ -1683,7 +1683,7 @@ const m = { m.energy -= 0.04; b.iceIX(1) } else if (tech.isDroneRadioactive) { - m.energy -= 1; + m.energy -= 1.5; //almost 5x drain of normal drones b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 25) } else { m.energy -= 0.45 * tech.droneEnergyReduction; @@ -1916,7 +1916,7 @@ const m = { } }, { - name: "time dilation field", + name: "time dilation", description: "use energy to stop time
move and fire while time is stopped
mobs still do harm while time is stopped", effect: () => { // m.fieldMeterColor = "#000" @@ -1960,13 +1960,19 @@ const m = { sleep(mob); sleep(body); sleep(bullet); + // for (let i = 0, len = cons.length; i < len; i++) { + // Matter.Body.setVelocity(cons[i].bodyB, { + // x: 0, + // y: 0 + // }); + // } //doesn't really work, just slows down constraints - for (let i = 0, len = cons.length; i < len; i++) { - if (cons[i].stiffness !== 0) { - cons[i].storeStiffness = cons[i].stiffness; - cons[i].stiffness = 0; - } - } + // for (let i = 0, len = cons.length; i < len; i++) { + // if (cons[i].stiffness !== 0) { + // cons[i].storeStiffness = cons[i].stiffness; + // cons[i].stiffness = 0; + // } + // } simulation.cycle--; //pause all functions that depend on game cycle increasing if (tech.isTimeSkip) { diff --git a/js/tech.js b/js/tech.js index b554971..c768d8b 100644 --- a/js/tech.js +++ b/js/tech.js @@ -843,7 +843,7 @@ allowed() { return ((m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isDroneRadioactive || tech.isSporeField || tech.isMissileField || tech.isIceField)) || (tech.haveGunCheck("drones") && !tech.isDroneRadioactive) || tech.haveGunCheck("super balls") || tech.haveGunCheck("shotgun")) && !tech.isNailShot }, - requires: "super balls, shotgun, drones, not radioactive drones", + requires: "super balls, shotgun, drones, not irradiated drones", effect() { tech.isIncendiary = true }, @@ -4067,9 +4067,9 @@ frequency: 2, frequencyDefault: 2, allowed() { - return tech.isNeutronBomb || tech.isDroneRadioactive + return tech.isNeutronBomb || tech.isDroneRadioactive || tech.isExplodeRadio }, - requires: "neutron bomb or radioactive drones", + requires: "neutron bomb or irradiated drones or iridium-192", effect() { tech.isRadioactiveResistance = true }, @@ -4086,9 +4086,9 @@ frequency: 2, frequencyDefault: 2, allowed() { - return tech.isNeutronBomb || tech.isDroneRadioactive + return tech.isNeutronBomb }, - requires: "neutron bomb or radioactive drones", + requires: "neutron bomb", effect() { tech.isNeutronSlow = true }, @@ -4271,35 +4271,32 @@ } }, { - name: "radioisotope generator", - description: "irradiate drones, reduce ammo by 75%
does damage, harm, and drains energy", + name: "reduced tolerances", + description: "increase drone ammo/efficiency by 66%
reduce the average drone lifetime by 40%", isGunTech: true, - maxCount: 1, + maxCount: 3, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("drones") && tech.droneCycleReduction === 1 && !tech.isIncendiary + return !tech.isDroneRadioactive && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) }, - requires: "drone gun, not reduced tolerances or incendiary", + requires: "drones, not irradiated drones", effect() { - tech.isDroneRadioactive = true + tech.droneCycleReduction = Math.pow(0.6, 1 + this.count) + tech.droneEnergyReduction = Math.pow(0.333, 1 + this.count) for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "drones") { - b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * 0.25 - b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 0.25) + const scale = Math.pow(3, this.count + 1) + b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * scale } } }, remove() { - if (tech.isDroneRadioactive) { - tech.isDroneRadioactive = false - for (i = 0, len = b.guns.length; i < len; i++) { //find which gun - if (b.guns[i].name === "drones") { - b.guns[i].ammoPack = b.guns[i].defaultAmmoPack - b.guns[i].ammo = b.guns[i].ammo * 4 - } - } + tech.droneCycleReduction = 1 + tech.droneEnergyReduction = 1 + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack } } }, @@ -4361,35 +4358,58 @@ } }, { - name: "reduced tolerances", - description: "increase drone ammo/efficiency by 66%
reduce the average drone lifetime by 40%", + name: "irradiated drones", + description: "irradiate the space around your drones
reduce ammo/efficiency by 80%", + //
does damage, harm, and drains energy isGunTech: true, - maxCount: 3, + maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return !tech.isDroneRadioactive && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) + return tech.droneCycleReduction === 1 && !tech.isIncendiary && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) }, - requires: "drones", + requires: "drone gun, not reduced tolerances or incendiary", effect() { - tech.droneCycleReduction = Math.pow(0.6, 1 + this.count) - tech.droneEnergyReduction = Math.pow(0.333, 1 + this.count) + tech.isDroneRadioactive = true for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "drones") { - const scale = Math.pow(3, this.count + 1) - b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * scale + b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * 0.2 + b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 0.2) } } }, remove() { - tech.droneCycleReduction = 1 - tech.droneEnergyReduction = 1 - for (i = 0, len = b.guns.length; i < len; i++) { //find which gun - if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack + if (tech.isDroneRadioactive) { + tech.isDroneRadioactive = false + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "drones") { + b.guns[i].ammoPack = b.guns[i].defaultAmmoPack + b.guns[i].ammo = b.guns[i].ammo * 5 + } + } } } }, + { + name: "beta radiation", //"control rod ejection", + description: "reduce the average drone lifetime by 50%
increase radiation damage by 100%", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isDroneRadioactive + }, + requires: "irradiated drones", + effect() { + tech.droneRadioDamage = 2 + }, + remove() { + tech.droneRadioDamage = 1 + } + }, { name: "necrophoresis", description: "foam bubbles grow and split into 3 copies
when the mob they are stuck to dies", @@ -5000,12 +5020,12 @@ isFieldTech: true, maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 3, + frequencyDefault: 3, allowed() { - return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) + return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive) }, - requires: "nano-scale manufacturing, no other manufacturing", + requires: "nano-scale manufacturing, no other manufacturing, no drone tech", effect() { if (!build.isExperimentSelection) { for (let i = 0; i < 3; i++) { @@ -5024,12 +5044,12 @@ isFieldTech: true, maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 3, + frequencyDefault: 3, allowed() { - return (build.isExperimentSelection || powerUps.research.count > 2) && m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) + return (build.isExperimentSelection || powerUps.research.count > 2) && m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive) }, - requires: "nano-scale manufacturing, no other manufacturing", + requires: "nano-scale manufacturing, no other manufacturing, no drone tech", effect() { if (!build.isExperimentSelection) { for (let i = 0; i < 3; i++) { @@ -5048,12 +5068,12 @@ isFieldTech: true, maxCount: 1, count: 0, - frequency: 2, - frequencyDefault: 2, + frequency: 3, + frequencyDefault: 3, allowed() { - return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab) + return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive) }, - requires: "nano-scale manufacturing, no other manufacturing", + requires: "nano-scale manufacturing, no other manufacturing, no drone tech", effect() { if (!build.isExperimentSelection) { for (let i = 0; i < 3; i++) { @@ -5152,9 +5172,9 @@ frequency: 2, frequencyDefault: 2, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "time dilation field" + return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "time dilation" }, - requires: "pilot wave, negative mass field, time dilation field", + requires: "pilot wave, negative mass field, time dilation", effect() { tech.isFreezeMobs = true }, @@ -5269,9 +5289,9 @@ frequency: 2, frequencyDefault: 2, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "time dilation field" + return m.fieldUpgrades[m.fieldMode].name === "time dilation" }, - requires: "time dilation field", + requires: "time dilation", effect() { tech.isTimeSkip = true; b.setFireCD(); @@ -5290,9 +5310,9 @@ frequency: 2, frequencyDefault: 2, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "time dilation field" + return m.fieldUpgrades[m.fieldMode].name === "time dilation" }, - requires: "time dilation field", + requires: "time dilation", effect() { tech.fastTime = 1.40; tech.fastTimeJump = 1.11; @@ -5315,9 +5335,9 @@ frequency: 2, frequencyDefault: 2, allowed() { - return (m.fieldUpgrades[m.fieldMode].name === "time dilation field") && tech.energyRegen !== 0 + return (m.fieldUpgrades[m.fieldMode].name === "time dilation") && tech.energyRegen !== 0 }, - requires: "time dilation field, not ground state", + requires: "time dilation, not ground state", effect: () => { tech.energyRegen = 0.004; m.fieldRegen = tech.energyRegen; @@ -7246,5 +7266,6 @@ superBallDelay: null, isBlockExplode: null, isOverHeal: null, - isDroneRadioactive: null + isDroneRadioactive: null, + droneRadioDamage: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index 9fecfab..abe42bd 100644 --- a/todo.txt +++ b/todo.txt @@ -1,23 +1,21 @@ ******************************************************** NEXT PATCH ******************************************************** -tech - radioisotope generator - drones have the effect of neutron bomb, but you get less ammo -bug fix - reduced tolerances now properly gives extra ammo -water shielding now protects you from all radioactivity, but only gives 75% protection - (drones, neutron bomb, radioactive explosions, and even slime) +irradiated drones + new tech: beta radiation - double damage and half lifespan + now don't clump as often, to make the graphics look better + effective radius now includes edges of mobs, not just centers + so they work better on large radius mobs + do 50% more damage, but have a 10% smaller radius and last 3 second shorter time and 80% less ammo (was 75%) + irradiated drones can't get a slowing effect anymore + it was just too annoying + nano-scale can now unlock irradiated drone tech properly + nano-scale now drains more energy per irradiated drone, to scale with the higher ammo costs -final boss has more durability in it's final phase -final boss no longers gets knocked around as much from explosions - -level.warehouse predraw lighting for performance -bug fix on sewers where slime was doing too much harm +time dilation field is now just called "time dilation" +constraints under time dilation is less buggy, but still a bit buggy ******************************************************** BUGS ******************************************************** -slime does extra damage on flipped levels? - -using time dilatation breaks constraints - on map n-gon, toggles - player can become crouched while not touching the ground if they exit the ground while crouched a couple times people have reported the final boss dropping extra bodies on death @@ -40,10 +38,6 @@ is there a way to check if the player is stuck inside the map or block ******************************************************** LEVELS ******************************************************** -make a power up you can carry around like the heal power up when at full health - drop it on a map element to turn it on? - use it in combat? - labs - procedural generation bugs mob spawns shouldn't be based on probability? @@ -92,18 +86,11 @@ map: observatory laser beam shoots out of telescope button opens the dome -map: prison - doors linked to buttons - mobs inside the doors? - -boss levels - small levels just a boss, and maybe a few mobs - boss level for timeSkipBoss because of game instability for boss on normal levels - this might not fix issues - ******************************************************** MOBS ******************************************************** mob mechanics use the force at a location effect, like the plasma field + Matter.Body.applyForce(who, path[1], force) mob - after taking damage release seekers @@ -153,6 +140,13 @@ level boss: fires a line intersection in a random direction every few seconds. ******************************************************** TODO ******************************************************** +tech - shorter cloaking delay + +irradiated drones, get annoying when they go after mobs near the player... + should they only follow mouse? or at least show a preference for targets near mouse, not near player + +tech - 1/2 your drone ammo/efficiency double the damage? + tech foam teleports around, like a quantum wave function collapse should ammo apply to all guns, or just one of your guns? @@ -174,7 +168,7 @@ have throw charge scale with fire delay in testing mode console log the body you click on throwing a block removes the block and rewinds time 10 seconds (including health and energy) - requires CPT, CPT gun, time dilation field? + requires CPT, CPT gun, time dilation? tech plasma : plasma length increases then decreases as you hold down the field button (like stabbing with a spear) grows to 1.5 longer after 0.3 seconds, then returns to normal length over 1 second, until field is pressed again