diff --git a/img/ammo.webp b/img/ammo.webp new file mode 100644 index 0000000..782d63d Binary files /dev/null and b/img/ammo.webp differ diff --git a/img/heals.webp b/img/heals.webp new file mode 100644 index 0000000..d92dcd9 Binary files /dev/null and b/img/heals.webp differ diff --git a/img/mass production.webp b/img/mass production.webp new file mode 100644 index 0000000..b8cf5f8 Binary files /dev/null and b/img/mass production.webp differ diff --git a/img/research.webp b/img/research.webp new file mode 100644 index 0000000..99ac396 Binary files /dev/null and b/img/research.webp differ diff --git a/js/bullet.js b/js/bullet.js index ef2a272..a117aae 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -912,7 +912,7 @@ const b = { x: m.Vx / 2 + speed * Math.cos(angle), y: m.Vy / 2 + speed * Math.sin(angle) }); - bullet[me].endCycle = simulation.cycle + Math.floor(m.crouch ? 120 : 80) * tech.isBulletsLastLonger; + bullet[me].endCycle = simulation.cycle + Math.floor(m.crouch ? 120 : 80) * tech.bulletsLastLonger; bullet[me].restitution = 0.4; bullet[me].do = function () { this.force.y += this.mass * 0.0025; //extra gravity for harder arcs @@ -939,7 +939,7 @@ const b = { }); Composite.add(engine.world, bullet[me]); //add bullet to world - bullet[me].endCycle = simulation.cycle + 70 * tech.isBulletsLastLonger; + bullet[me].endCycle = simulation.cycle + 70 * tech.bulletsLastLonger; bullet[me].frictionAir = 0.07; const MAG = 0.015 bullet[me].thrust = { @@ -973,7 +973,7 @@ const b = { y: m.Vy / 2 + speed * Math.sin(angle) }); Composite.add(engine.world, bullet[me]); //add bullet to world - bullet[me].endCycle = simulation.cycle + 70 * tech.isBulletsLastLonger; + bullet[me].endCycle = simulation.cycle + 70 * tech.bulletsLastLonger; bullet[me].frictionAir = 0.07; bullet[me].suckCycles = 40 const MAG = 0.015 @@ -1096,7 +1096,7 @@ const b = { speed = 35 // speed = m.crouch ? 43 : 32 - bullet[me].endCycle = simulation.cycle + 70 * tech.isBulletsLastLonger; + bullet[me].endCycle = simulation.cycle + 70 * tech.bulletsLastLonger; if (m.crouch) { speed += 9 bullet[me].endCycle += 20; @@ -1124,7 +1124,7 @@ const b = { bullet[me].minDmgSpeed = 0; bullet[me].damageRadius = 100; bullet[me].maxDamageRadius = 450 * size + 130 * tech.isNeutronSlow //+ 150 * Math.random() - bullet[me].radiusDecay = (0.81 + 0.15 * tech.isNeutronSlow) / tech.isBulletsLastLonger + bullet[me].radiusDecay = (0.81 + 0.15 * tech.isNeutronSlow) / tech.bulletsLastLonger bullet[me].stuckTo = null; bullet[me].stuckToRelativePosition = null; if (tech.isRPG) { @@ -1546,7 +1546,7 @@ const b = { b.targetedNail(this.vertices[2], tech.fragments * Math.floor(2 + Math.random())) } if (tech.isFoamBall) { - for (let i = 0, len = 4 * this.mass; i < len; i++) { + for (let i = 0, len = 3 * this.mass; i < len; i++) { const radius = 5 + 8 * Math.random() const velocity = { x: Math.max(0.5, 2 - radius * 0.1), @@ -2192,7 +2192,7 @@ const b = { } } if (tech.isFoamBall) { - for (let i = 0, len = Math.min(50, 3 + 4 * Math.sqrt(this.mass)); i < len; i++) { + for (let i = 0, len = Math.min(50, 2.5 + 3 * Math.sqrt(this.mass)); i < len; i++) { const radius = 5 + 8 * Math.random() const velocity = { x: Math.max(0.5, 2 - radius * 0.1), y: 0 } b.foam(this.position, Vector.rotate(velocity, 6.28 * Math.random()), radius) @@ -2410,7 +2410,7 @@ const b = { frictionAir: 0.045, dmg: 0, //damage done in addition to the damage from momentum classType: "bullet", - endCycle: simulation.cycle + Math.floor((230 + 40 * Math.random()) * tech.isBulletsLastLonger + 120 * tech.isMissileBiggest + 60 * tech.isMissileBig), + endCycle: simulation.cycle + Math.floor((230 + 40 * Math.random()) * tech.bulletsLastLonger + 120 * tech.isMissileBiggest + 60 * tech.isMissileBig), collisionFilter: { category: cat.bullet, mask: cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield @@ -3215,7 +3215,7 @@ const b = { category: cat.bullet, mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body }, - endCycle: simulation.cycle + Math.floor((600 + Math.floor(Math.random() * 420)) * tech.isBulletsLastLonger), + endCycle: simulation.cycle + Math.floor((600 + Math.floor(Math.random() * 420)) * tech.bulletsLastLonger), minDmgSpeed: 0, playerOffPosition: { //used when moving towards player to keep spores separate x: 100 * (Math.random() - 0.5), @@ -3227,7 +3227,7 @@ const b = { if (!who.alive) { for (let i = 0; i < 3; i++) { //spawn 3 more b.worm(this.position) - bullet[bullet.length - 1].endCycle = Math.min(simulation.cycle + Math.floor(420 * tech.isBulletsLastLonger), this.endCycle + 180 + Math.floor(60 * Math.random())) //simulation.cycle + Math.floor(420 * tech.isBulletsLastLonger) + bullet[bullet.length - 1].endCycle = Math.min(simulation.cycle + Math.floor(420 * tech.bulletsLastLonger), this.endCycle + 180 + Math.floor(60 * Math.random())) //simulation.cycle + Math.floor(420 * tech.bulletsLastLonger) } } this.endCycle = 0; //bullet ends cycle after doing damage @@ -3332,7 +3332,7 @@ const b = { category: cat.bullet, mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body }, - endCycle: simulation.cycle + Math.floor((540 + Math.floor(Math.random() * 420)) * tech.isBulletsLastLonger), + endCycle: simulation.cycle + Math.floor((540 + Math.floor(Math.random() * 420)) * tech.bulletsLastLonger), minDmgSpeed: 0, playerOffPosition: { //used when moving towards player to keep spores separate x: 100 * (Math.random() - 0.5), @@ -3449,7 +3449,7 @@ const b = { const me = bullet.length; const THRUST = 0.0018 const RADIUS = 18 - const SCALE = 1 - 0.12 / tech.isBulletsLastLonger + const SCALE = 1 - 0.12 / tech.bulletsLastLonger bullet[me] = Bodies.polygon(where.x, where.y, 3, RADIUS, { angle: dir - Math.PI, // inertia: Infinity, @@ -3459,7 +3459,7 @@ const b = { restitution: 0.9, dmg: 1.3, //damage done in addition to the damage from momentum lookFrequency: 14 + Math.floor(8 * Math.random()), - endCycle: simulation.cycle + 65 * tech.isBulletsLastLonger + Math.floor(25 * Math.random()), + endCycle: simulation.cycle + 65 * tech.bulletsLastLonger + Math.floor(25 * Math.random()), classType: "bullet", collisionFilter: { category: cat.bullet, @@ -3534,7 +3534,7 @@ const b = { restitution: 0, density: 0.0005, // 0.001 is normal density lookFrequency: 19 + Math.floor(7 * Math.random()), - endCycle: simulation.cycle + Math.floor((900 * tech.isBulletsLastLonger + 420 * Math.random()) + Math.max(0, 150 - bullet.length)), // 13 - 19s + endCycle: simulation.cycle + Math.floor((900 * tech.bulletsLastLonger + 420 * Math.random()) + Math.max(0, 150 - bullet.length)), // 13 - 19s classType: "bullet", collisionFilter: { category: cat.bullet, @@ -3664,7 +3664,7 @@ const b = { const SCALE = 2.25 Matter.Body.scale(who, SCALE, SCALE); who.lookFrequency = 30 + Math.floor(11 * Math.random()); - who.endCycle += 3000 * tech.droneCycleReduction * tech.isBulletsLastLonger + who.endCycle += 3000 * tech.droneCycleReduction * tech.bulletsLastLonger deliveryCount-- } } @@ -3690,7 +3690,7 @@ const b = { density: 0.0005, // 0.001 is normal density dmg: 0.34 + 0.12 * tech.isDroneTeleport + 0.15 * tech.isDroneFastLook, //damage done in addition to the damage from momentum lookFrequency: (tech.isDroneFastLook ? 20 : 70) + Math.floor(17 * Math.random()), - endCycle: simulation.cycle + Math.floor((950 + 400 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 5 * RADIUS + Math.max(0, 150 - bullet.length), + endCycle: simulation.cycle + Math.floor((950 + 400 * Math.random()) * tech.bulletsLastLonger * tech.droneCycleReduction) + 5 * RADIUS + Math.max(0, 150 - bullet.length), classType: "bullet", isDrone: true, collisionFilter: { @@ -3870,7 +3870,7 @@ const b = { const SCALE = 2.25 Matter.Body.scale(this, SCALE, SCALE); this.lookFrequency = 30 + Math.floor(11 * Math.random()); - this.endCycle += 3000 * tech.droneCycleReduction * tech.isBulletsLastLonger + this.endCycle += 3000 * tech.droneCycleReduction * tech.bulletsLastLonger } break; } @@ -3902,7 +3902,7 @@ const b = { const SCALE = 2.25 Matter.Body.scale(this, SCALE, SCALE); this.lookFrequency = 30 + Math.floor(11 * Math.random()); - this.endCycle += 3000 * tech.droneCycleReduction * tech.isBulletsLastLonger + this.endCycle += 3000 * tech.droneCycleReduction * tech.bulletsLastLonger // this.frictionAir = 0 } break; @@ -3960,7 +3960,7 @@ const b = { restitution: 0.4 + 0.199 * Math.random(), dmg: 0, //0.24 damage done in addition to the damage from momentum and radiation lookFrequency: 120 + Math.floor(23 * Math.random()), - endCycle: simulation.cycle + Math.floor((900 + 110 * Math.random()) * tech.isBulletsLastLonger / tech.droneRadioDamage) + 5 * RADIUS + Math.max(0, 150 - 2 * bullet.length), + endCycle: simulation.cycle + Math.floor((900 + 110 * Math.random()) * tech.bulletsLastLonger / tech.droneRadioDamage) + 5 * RADIUS + Math.max(0, 150 - 2 * bullet.length), classType: "bullet", isDrone: true, collisionFilter: { @@ -4113,7 +4113,7 @@ const b = { const SCALE = 2.25 Matter.Body.scale(this, SCALE, SCALE); this.lookFrequency = 30 + Math.floor(11 * Math.random()); - this.endCycle += 1000 * tech.isBulletsLastLonger + this.endCycle += 1000 * tech.bulletsLastLonger this.maxRadioRadius *= 1.25 } break; @@ -4146,7 +4146,7 @@ const b = { const SCALE = 2.25 Matter.Body.scale(this, SCALE, SCALE); this.lookFrequency = 30 + Math.floor(11 * Math.random()); - this.endCycle += 1000 * tech.isBulletsLastLonger + this.endCycle += 1000 * tech.bulletsLastLonger this.maxRadioRadius *= 1.25 } break; @@ -4244,7 +4244,7 @@ const b = { bullet[me].beforeDmg = function (who) { if (tech.oneSuperBall) mobs.statusStun(who, 120) // (2.3) * 2 / 14 ticks (2x damage over 7 seconds) if (tech.isFoamBall) { - for (let i = 0, len = 6 * this.mass; i < len; i++) { + for (let i = 0, len = 5 * this.mass; i < len; i++) { const radius = 5 + 8 * Math.random() const velocity = { x: Math.max(0.5, 2 - radius * 0.1), y: 0 } b.foam(this.position, Vector.rotate(velocity, 6.28 * Math.random()), radius) @@ -4360,7 +4360,7 @@ const b = { // frictionAir: 0.003, // dmg: 0, //damage on impact // damage: 0, //damage done over time - // scale: 1 - 0.006 / tech.isBulletsLastLonger, + // scale: 1 - 0.006 / tech.bulletsLastLonger, // classType: "bullet", // collisionFilter: { // category: cat.bullet, @@ -4432,7 +4432,7 @@ const b = { // // Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9) // if (this.target.isShielded) { // this.target.damage(m.dmgScale * this.damage, true); //shield damage bypass - // const SCALE = 1 - 0.004 / tech.isBulletsLastLonger //shrink if mob is shielded + // const SCALE = 1 - 0.004 / tech.bulletsLastLonger //shrink if mob is shielded // Matter.Body.scale(this, SCALE, SCALE); // this.radius *= SCALE; // } else { @@ -4523,7 +4523,7 @@ const b = { frictionAir: 0.003, dmg: 0, //damage on impact damage: tech.foamDamage * (tech.isFastFoam ? 2.8 : 1) * (tech.isBulletTeleport ? 1.53 : 1), //damage done over time - scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1), + scale: 1 - 0.006 / tech.bulletsLastLonger * (tech.isFastFoam ? 1.65 : 1), classType: "bullet", collisionFilter: { category: cat.bullet, @@ -4602,7 +4602,7 @@ const b = { // Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9) if (this.target.isShielded) { this.target.damage(m.dmgScale * this.damage, true); //shield damage bypass - const SCALE = 1 - 0.004 / tech.isBulletsLastLonger //shrink if mob is shielded + const SCALE = 1 - 0.004 / tech.bulletsLastLonger //shrink if mob is shielded Matter.Body.scale(this, SCALE, SCALE); this.radius *= SCALE; } else { @@ -5566,11 +5566,11 @@ const b = { restitution: 0.6 * (1 + 0.5 * Math.random()), dmg: 0, // 0.14 //damage done in addition to the damage from momentum minDmgSpeed: 2, - lookFrequency: 17 + Math.floor(7 * Math.random()) - 10 * tech.isSoundBotUpgrade, + lookFrequency: 17 + Math.floor(7 * Math.random()) - 5 * tech.isSoundBotUpgrade, cd: 0, fireCount: 0, - fireLimit: 5 + 3 * tech.isSoundBotUpgrade, - delay: Math.floor((90 + (tech.isSoundBotUpgrade ? 0 : 90)) * b.fireCDscale),// + 30 - 20 * tech.isFoamBotUpgrade,//20 + Math.floor(85 * b.fireCDscale) - 20 * tech.isFoamBotUpgrade, + fireLimit: 5 + 2 * tech.isSoundBotUpgrade, + delay: Math.floor((120 + (tech.isSoundBotUpgrade ? 0 : 70)) * b.fireCDscale),// + 30 - 20 * tech.isFoamBotUpgrade,//20 + Math.floor(85 * b.fireCDscale) - 20 * tech.isFoamBotUpgrade, acceleration: 0.005 * (1 + 0.5 * Math.random()), range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(), //how far from the player the bot will move endCycle: Infinity, @@ -5594,7 +5594,7 @@ const b = { arc: halfArc * 2, radius: 25, resonanceCount: 0, - dmg: (tech.isUpgraded ? 3 : 1.5) * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.5 : 1), + dmg: (tech.isUpgraded ? 4 : 1.5) * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.5 : 1), }) }, fire() { @@ -5634,7 +5634,7 @@ const b = { ctx.strokeStyle = "rgba(0,0,0,0.6)" //"000"; ctx.lineWidth = 2 * tech.wavePacketDamage ctx.beginPath(); - const end = 1200 * tech.isBulletsLastLonger + const end = 1200 * Math.sqrt(tech.bulletsLastLonger) //this does less damage than the player phonon waves 2.3 -> 2 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)) @@ -5649,7 +5649,7 @@ const b = { if (!who.isShielded) { who.force.x += 0.01 * (Math.random() - 0.5) * who.mass who.force.y += 0.01 * (Math.random() - 0.5) * who.mass - Matter.Body.setVelocity(who, { x: who.velocity.x * 0.95, y: who.velocity.y * 0.95 }); + Matter.Body.setVelocity(who, { x: who.velocity.x * 0.98, y: who.velocity.y * 0.98 }); let vertices = who.vertices; const vibe = 50 + who.radius * 0.15 ctx.moveTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5)); @@ -5687,8 +5687,8 @@ const b = { for (let j = 0, len = Math.min(30, hits.length); j < len; j++) { const who = hits[j].body //make them shake around - who.force.x += 0.01 * (Math.random() - 0.5) * who.mass - who.force.y += (0.01 * (Math.random() - 0.5) - simulation.g * 0.25) * who.mass //remove force of gravity + who.force.x += 0.005 * (Math.random() - 0.5) * who.mass + who.force.y += (0.005 * (Math.random() - 0.5) - simulation.g * 0.1) * who.mass //remove force of gravity let vertices = who.vertices; const vibe = 25 ctx.moveTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5)); @@ -6742,13 +6742,13 @@ const b = { x: SPEED * Math.cos(dir), y: SPEED * Math.sin(dir) }); - bullet[me].endCycle = simulation.cycle + 40 * tech.isBulletsLastLonger + bullet[me].endCycle = simulation.cycle + 40 * tech.bulletsLastLonger bullet[me].minDmgSpeed = 15 if (tech.isShotgunReversed) Matter.Body.setDensity(bullet[me], 0.0015) // bullet[me].restitution = 0.4 bullet[me].frictionAir = 0.034; bullet[me].do = function () { - const scale = 1 - 0.034 / tech.isBulletsLastLonger + const scale = 1 - 0.034 / tech.bulletsLastLonger Matter.Body.scale(this, scale, scale); }; } @@ -6820,7 +6820,7 @@ const b = { const me = bullet.length; bullet[me] = Bodies.rectangle(m.pos.x + 50 * Math.cos(m.angle), m.pos.y + 50 * Math.sin(m.angle), 17, 4, b.fireAttributes(dir)); const end = END + Math.random() * 4 - bullet[me].endCycle = 2 * end * tech.isBulletsLastLonger + simulation.cycle + bullet[me].endCycle = 2 * end * tech.bulletsLastLonger + simulation.cycle const speed = 25 * end / END const dirOff = dir + (Math.random() - 0.5) * spread Matter.Body.setVelocity(bullet[me], { @@ -7066,7 +7066,7 @@ const b = { ctx.strokeStyle = "rgba(0,0,0,0.6)" //"000"; ctx.lineWidth = 2 * tech.wavePacketDamage ctx.beginPath(); - const end = 700 * Math.sqrt(tech.isBulletsLastLonger) + const end = 700 * Math.sqrt(tech.bulletsLastLonger) const damage = 2.3 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.43 : 1) * (tech.isInfiniteWaveAmmo ? 0.75 : 1) //damage is lower for large radius mobs, since they feel the waves longer for (let i = this.waves.length - 1; i > -1; i--) { @@ -7163,7 +7163,7 @@ const b = { ctx.strokeStyle = "rgba(0,0,0,0.6)" //"000"; ctx.lineWidth = 2 * tech.wavePacketDamage ctx.beginPath(); - const end = 1100 * tech.isBulletsLastLonger + const end = 1100 * tech.bulletsLastLonger const damage = 2.3 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.4 : 1) * (tech.isInfiniteWaveAmmo ? 0.75 : 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)) @@ -7270,7 +7270,7 @@ const b = { // } }, fireTransverse() { - totalCycles = Math.floor((3.5) * 35 * tech.waveReflections * tech.isBulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5)) + totalCycles = Math.floor((3.5) * 35 * tech.waveReflections * tech.bulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5)) const me = bullet.length; bullet[me] = Bodies.polygon(m.pos.x + 25 * Math.cos(m.angle), m.pos.y + 25 * Math.sin(m.angle), 5, 4, { angle: m.angle, diff --git a/js/level.js b/js/level.js index 85cc774..62d16ad 100644 --- a/js/level.js +++ b/js/level.js @@ -10,7 +10,7 @@ const level = { // playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"], //see level.populateLevels: (intro, ... , reservoir or factory, reactor, ... , gauntlet, final) added later playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock"], - communityLevels: ["gauntlet", "stronghold", "basement", "crossfire", "vats", "run", "ngon", "house", "perplex", "coliseum", "tunnel", "islands", "temple", "dripp", "biohazard", "stereoMadness", "yingYang", "staircase", "fortress", "commandeer", "clock", "buttonbutton", "downpour", "superNgonBros", "underpass", "cantilever", "dojo"], + communityLevels: ["gauntlet", "stronghold", "basement", "crossfire", "vats", "run", "ngon", "house", "perplex", "coliseum", "tunnel", "islands", "temple", "dripp", "biohazard", "stereoMadness", "yingYang", "staircase", "fortress", "commandeer", "clock", "buttonbutton", "downpour", "superNgonBros", "underpass", "cantilever", "dojo", "tlinat", "ruins"], trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon"], levels: [], start() { @@ -37,8 +37,8 @@ const level = { // tech.giveTech("von Neumann probe") // tech.giveTech("path integration") // tech.giveTech("cordyceps") - // for (let i = 0; i < 1; ++i) tech.giveTech("sympathetic resonance") - // for (let i = 0; i < 1; ++i) tech.giveTech("sound-bot") + // for (let i = 0; i < 1; ++i) tech.giveTech("mass production") + // for (let i = 0; i < 2; ++i) tech.giveTech("sound-bot") // for (let i = 0; i < 1; ++i) tech.giveTech("foam-bot") // for (let i = 0; i < 1; ++i) tech.giveTech("nail-bot") // for (let i = 0; i < 1; ++i) tech.giveTech("sound-bot upgrade") @@ -61,7 +61,7 @@ const level = { // spawn.tetherBoss(1900, -500, { x: 1900, y: -500 }) // for (let i = 0; i < 40; ++i) tech.giveTech() - level[simulation.isTraining ? "walk" : "intro"]() //normal starting level ************************************************ + level[simulation.isTraining ? "walk" : "intro"]() //normal starting level ************************************************** // simulation.isAutoZoom = false; //look in close // simulation.zoomScale *= 0.5; @@ -4251,10 +4251,7 @@ const level = { let isDoorLeft, isDoorRight, x, y doCustom = [] doCustomTopLayer = [] - offset = { - x: 0, - y: 0 - } + offset = { x: 0, y: 0 } const mobSpawnChance = 0 // Math.random() < chance + 0.07 * simulation.difficulty enterOptions = [ (x = offset.x, y = offset.y) => { //lasers @@ -10790,9 +10787,9 @@ const level = { spawn.randomLevelBoss(x, y, ["historyBoss"]); tech.isScaleMobsWithDuplication = false } else if (tech.isResearchBoss) { - if (powerUps.research.count > 3) { - powerUps.research.changeRerolls(-4) - simulation.makeTextLog(`m.research -= 4
${powerUps.research.count}`) + if (powerUps.research.count > 2) { + powerUps.research.changeRerolls(-3) + simulation.makeTextLog(`m.research -= 3
${powerUps.research.count}`) } else { tech.addJunkTechToPool(0.49) } @@ -13778,10 +13775,10 @@ const level = { spawn.historyBoss(x, y) tech.isScaleMobsWithDuplication = false } else if (tech.isResearchBoss) { - if (powerUps.research.count > 3) { - powerUps.research.changeRerolls(-4) + if (powerUps.research.count > 2) { + powerUps.research.changeRerolls(-3) simulation.makeTextLog( - `m.research -= 4
${powerUps.research.count}` + `m.research -= 3
${powerUps.research.count}` ) } else { tech.addJunkTechToPool(0.49) @@ -16409,7 +16406,6 @@ const level = { level.custom = () => { level.exit.drawAndCheck(); - level.enter.draw(); }; level.customTopLayer = () => { @@ -21437,8 +21433,8 @@ const level = { ctx.strokeStyle = "rgba(0,0,0,0.6)" //"000"; ctx.lineWidth = 2 * tech.wavePacketDamage ctx.beginPath(); - // const end = 1100 * tech.isBulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1767 - const end = 1100 * tech.isBulletsLastLonger * Math.pow(0.93, tech.waveReflections) //should equal about 1767 + // const end = 1100 * tech.bulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1767 + const end = 1100 * tech.bulletsLastLonger * Math.pow(0.93, tech.waveReflections) //should equal about 1767 const damage = 0.0005 * simulation.dmgScale//normal damage for m basically shreds m, so had to nerf this 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)) @@ -24619,8 +24615,8 @@ const level = { ctx.strokeStyle = "rgba(0,0,0,0.6)" //"000"; ctx.lineWidth = 2 * tech.wavePacketDamage ctx.beginPath(); - // const end = 1100 * tech.isBulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1767 - const end = 1100 * tech.isBulletsLastLonger * Math.pow(0.93, tech.waveReflections) //should equal about 1767 + // const end = 1100 * tech.bulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1767 + const end = 1100 * tech.bulletsLastLonger * Math.pow(0.93, tech.waveReflections) //should equal about 1767 const damage = 0.0005 * simulation.dmgScale//normal damage for m basically shreds m, so had to nerf this 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)) @@ -26052,6 +26048,1449 @@ const level = { boss.showHealthBar = true; powerUps.addResearchToLevel() //needs to run after mobs are spawned }, + tlinat() { // _Destined_ formerly Richard0820#2652 + simulation.makeTextLog(`tlinat by Richard0820`); + + simulation.fallHeight = Infinity; + level.setPosToSpawn(0, -1000); + level.exit.x = 5100; + level.exit.y = 3770; + spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); + spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20); + level.defaultZoom = 2500 + simulation.zoomTransition(level.defaultZoom) + document.body.style.backgroundColor = "#d8dadf"; + let teleportIndex = 0; + let footIndex = 0; + simulation.makeTextLog(`Walk right to tp to maze
Exit is at the bottom left`) + Matter.Body.scale(player.parts[3], 2, 2); + level.custom = () => { + level.exit.drawAndCheck(); + level.enter.draw(); + if (player.position.y > 100000) { + Matter.Body.setPosition(player, { + x: 5100, + y: -5925 + }) + } + if (player.position.x > 2500 && teleportIndex == 0) { + Matter.Body.setPosition(player, { + x: 5100, + y: -5925 + }) + teleportIndex++; + for (let i = 0; i < map.length; i++) { + if (Math.random() < 0.75) { //75% chance + spawn.ghoster(map[i].position.x, map[i].position.y) + } + } + simulation.makeTextLog(`Watch out for ghosters
Peace ✌️`) + } + if ( //check + player.position.x > level.exit.x && + player.position.x < level.exit.x + 100 && + player.position.y > level.exit.y - 150 && + player.position.y < level.exit.y - 0 && + player.velocity.y < 0.15 && + footIndex == 0 + ) { + footIndex++; + Matter.Body.scale(player.parts[3], 1 / 2, 1 / 2); + } + //ctx.drawImage(image, 1650 - 750, -2450, 725, 725) + }; + level.customTopLayer = () => { + if (player.position.x > -1200 && player.position.x < 4500) { //does not render when in the maze + drawText(2000, -3000, "JOIN OUR DISCORD SERVER"); + ctx.fillStyle = "black" + ctx.fillRect(1725, -2375, 25, 175); + ctx.fillRect(1725, -2375, 175, 25); + ctx.fillRect(1875, -2375, 25, 175); + ctx.fillRect(1725, -2225, 175, 25); + ctx.fillRect(1800, -2325, 25, 25); + ctx.fillRect(1775, -2325, 75, 75); + ctx.fillRect(1925, -2350, 50, 25); + ctx.fillRect(1950, -2350, 25, 25); + ctx.fillRect(1950, -2375, 25, 100); + ctx.fillRect(1925, -2300, 50, 25); + ctx.fillRect(1925, -2250, 25, 50); + ctx.fillRect(1975, -2275, 25, 75); + ctx.fillRect(1975, -2325, 50, 25); + ctx.fillRect(2000, -2350, 25, 75); + ctx.fillRect(2000, -2350, 100, 25); + ctx.fillRect(2075, -2375, 25, 50); + ctx.fillRect(2125, -2375, 25, 25); + ctx.fillRect(2175, -2375, 25, 175); + ctx.fillRect(2175, -2225, 175, 25); + ctx.fillRect(2325, -2375, 25, 175); + ctx.fillRect(2175, -2375, 175, 25); + ctx.fillRect(2225, -2300, 25, 25); + ctx.fillRect(2225, -2325, 75, 75); + ctx.fillRect(2025, -2275, 25, 25); + ctx.fillRect(2050, -2300, 25, 25); + ctx.fillRect(2100, -2300, 50, 50); + ctx.fillRect(2050, -2250, 75, 25); + ctx.fillRect(2075, -2250, 25, 50); + ctx.fillRect(1725, -2175, 125, 25); + ctx.fillRect(1800, -2175, 50, 50); + ctx.fillRect(1875, -2175, 100, 25); + ctx.fillRect(1725, -2125, 25, 175); + ctx.fillRect(1725, -2125, 50, 25); + ctx.fillRect(1725, -2075, 75, 50); + ctx.fillRect(1775, -2100, 25, 75); + ctx.fillRect(1775, -2075, 50, 25); + ctx.fillRect(1825, -2050, 25, 50); + ctx.fillRect(1800, -2025, 50, 25); + ctx.fillRect(1775, -2000, 25, 25); + ctx.fillRect(1800, -1975, 25, 25); + ctx.fillRect(1975, -2175, 25, 25); + ctx.fillRect(1900, -2175, 25, 150); + ctx.fillRect(1875, -2025, 25, 25); + ctx.fillRect(1925, -2025, 25, 25); + ctx.fillRect(1900, -2000, 25, 25); + ctx.fillRect(1875, -1975, 25, 25); + ctx.fillRect(1950, -2000, 25, 25); + ctx.fillRect(1925, -1975, 75, 50); + ctx.fillRect(1925, -1925, 25, 25); + ctx.fillRect(2025, -2225, 25, 75); + ctx.fillRect(2125, -2225, 25, 50); + ctx.fillRect(1875, -2125, 50, 25); + ctx.fillRect(1850, -2075, 125, 25); + ctx.fillRect(1950, -2175, 25, 125); + ctx.fillRect(1950, -2100, 75, 25); + ctx.fillRect(2000, -2125, 25, 75); + ctx.fillRect(1975, -2050, 25, 25); + ctx.fillRect(2025, -2050, 25, 25); + ctx.fillRect(2000, -2125, 75, 25); + ctx.fillRect(2050, -2125, 25, 50); + ctx.fillRect(2050, -2100, 50, 25); + ctx.fillRect(2075, -2175, 50, 50); + ctx.fillRect(2100, -2150, 25, 50); + ctx.fillRect(2100, -2075, 25, 25); + ctx.fillRect(2125, -2100, 50, 25); + ctx.fillRect(2150, -2175, 25, 100); + ctx.fillRect(2100, -2150, 75, 25); + ctx.fillRect(1725, -1925, 25, 175); + ctx.fillRect(1725, -1925, 175, 25); + ctx.fillRect(1875, -1925, 25, 175); + ctx.fillRect(1725, -1775, 175, 25); + ctx.fillRect(1775, -1875, 75, 75); + ctx.fillRect(1925, -1875, 25, 125); + ctx.fillRect(1925, -1775, 75, 25); + ctx.fillRect(1925, -1875, 125, 25); + ctx.fillRect(2025, -1875, 25, 100); + ctx.fillRect(1975, -1900, 25, 75); + ctx.fillRect(1975, -1900, 50, 25); + ctx.fillRect(2000, -1925, 100, 25); + ctx.fillRect(2050, -2025, 50, 25); + ctx.fillRect(2050, -2025, 25, 50); + ctx.fillRect(2025, -2000, 50, 25); + ctx.fillRect(2025, -2000, 25, 50); + ctx.fillRect(2025, -1825, 75, 25); + ctx.fillRect(2075, -1825, 25, 50); + ctx.fillRect(2100, -1775, 25, 25); + ctx.fillRect(2075, -1875, 25, 25); + ctx.fillRect(2100, -1850, 50, 25); + ctx.fillRect(2125, -1975, 25, 150); + ctx.fillRect(2150, -2125, 50, 25); + ctx.fillRect(2200, -2175, 25, 50); + ctx.fillRect(2200, -2150, 50, 25); + ctx.fillRect(2225, -2150, 25, 50); + ctx.fillRect(2250, -2175, 25, 25); + ctx.fillRect(2300, -2175, 25, 25); + ctx.fillRect(2325, -2150, 25, 25); + ctx.fillRect(2275, -2125, 25, 25); + ctx.fillRect(2175, -2075, 100, 25); + ctx.fillRect(2300, -2075, 50, 25); + ctx.fillRect(2125, -2050, 125, 25); + ctx.fillRect(2225, -2075, 25, 75); + ctx.fillRect(2175, -2050, 25, 50); + ctx.fillRect(2150, -2050, 25, 75); + ctx.fillRect(2075, -1975, 200, 25); + ctx.fillRect(2225, -1975, 25, 200); + ctx.fillRect(2175, -1925, 25, 25); + ctx.fillRect(2125, -1875, 150, 25); + ctx.fillRect(2250, -1900, 25, 50); + ctx.fillRect(2275, -1925, 75, 25); + ctx.fillRect(2325, -2025, 25, 125); + ctx.fillRect(2275, -2025, 75, 25); + ctx.fillRect(2300, -2025, 50, 50); + ctx.fillRect(2175, -1875, 25, 50); + ctx.fillRect(2125, -1800, 150, 25); + ctx.fillRect(2275, -1825, 25, 25); + ctx.fillRect(2300, -1850, 50, 25); + ctx.fillRect(2325, -1850, 25, 50); + ctx.fillRect(2300, -1800, 25, 50); + ctx.fillRect(2275, -1775, 75, 25); + } + }; + spawn.mapRect(-1000, -950, 5950, 100); + spawn.mapRect(-1325, -3450, 100, 2575); + spawn.mapRect(-1325, -950, 350, 100); + spawn.mapRect(4850, -3400, 100, 2550); + spawn.mapRect(-1325, -3450, 6275, 100); + maze(10000, -1000, 10000, 10000, 50); + + function maze(x, y, width, height, cells) { + const cellWidth = width / cells; + const cellHeight = height / cells; + const startX = x - (width / 2); + const startY = y - (height / 2); + const matrix = []; + for (let i = 0; i < cells; i++) { + matrix[i] = []; + for (let j = 0; j < cells; j++) { + matrix[i][j] = 1; + } + } + const stack = []; + + function carveMaze(x, y) { + matrix[x][y] = 0; + const directions = [{ + dx: 0, + dy: -1 + }, // Up + { + dx: 1, + dy: 0 + }, // Right + { + dx: 0, + dy: 1 + }, // Down + { + dx: -1, + dy: 0 + } // Left + ]; + directions.sort(() => Math.random() - 0.5); + for (const direction of directions) { + const nextX = x + direction.dx * 2; + const nextY = y + direction.dy * 2; + if (nextX >= 0 && nextX < cells && nextY >= 0 && nextY < cells && matrix[nextX][nextY] === 1) { + matrix[x + direction.dx][y + direction.dy] = 0; + matrix[nextX][nextY] = 0; + stack.push({ + x: x + direction.dx, + y: y + direction.dy + }); + carveMaze(nextX, nextY); + } + } + } + carveMaze(0, 0); + matrix[cells - 1][cells - 1] = 1; + for (let i = -1; i < cells + 1; i++) { + let startCol = -1; + let endCol = -1; + for (let j = -1; j < cells + 1; j++) { + if (i >= 0 && i < cells && j >= 0 && j < cells && matrix[i][j] === 1) { + if (startCol === -1) { + startCol = j; + } + endCol = j; + } else { + if (startCol !== -1) { + const rectX = startX + i * cellWidth; + const rectY = startY + startCol * cellHeight; + const rectWidth = cellWidth; + const rectHeight = (endCol - startCol + 1) * cellHeight; + if (rectHeight !== cellHeight) { + spawn.mapRect(rectX, rectY, rectWidth, rectHeight); + } + startCol = -1; + endCol = -1; + } + } + } + } + for (let j = -1; j < cells + 1; j++) { + let startRow = -1; + let endRow = -1; + for (let i = -1; i < cells + 1; i++) { + if (i >= 0 && i < cells && j >= 0 && j < cells && matrix[i][j] === 1) { + if (startRow === -1) { + startRow = i; + } + endRow = i; + } else { + if (startRow !== -1) { + const rectX = startX + startRow * cellWidth; + const rectY = startY + j * cellHeight; + const rectWidth = (endRow - startRow + 1) * cellWidth; + const rectHeight = cellHeight; + if (rectWidth !== cellWidth) { + spawn.mapRect(rectX, rectY, rectWidth, rectHeight); + } + startRow = -1; + endRow = -1; + } + } + } + } + spawn.mapRect(startX - cellWidth, startY - cellHeight, cellWidth * cells, cellHeight) + spawn.mapRect(startX - cellWidth, startY - cellHeight, cellWidth, cellHeight * cells) + spawn.mapRect(startX + (cells - 1) * cellWidth, startY - cellHeight, cellWidth, cellHeight * (cells + 1)) + spawn.mapRect(startX - cellWidth, startY + (cells - 1) * cellHeight, cellWidth * (cells + 1), cellHeight) + return matrix; + } + + function countAdjacentWalls(matrix, x, y) { + let count = 0; + const directions = [{ + dx: 0, + dy: -1 + }, // Up + { + dx: 1, + dy: 0 + }, // Right + { + dx: 0, + dy: 1 + }, // Down + { + dx: -1, + dy: 0 + } // Left + ]; + for (const direction of directions) { + const neighborX = x + direction.dx; + const neighborY = y + direction.dy; + if (neighborX >= 0 && neighborX < matrix.length && neighborY >= 0 && neighborY < matrix[0].length && matrix[neighborX][neighborY] === 1) { + count++; + } + } + return count; + } + function drawText(x, y, letters) { + const blockSize = 50; + const padding = -30; + const lettersData = { + 'J': [' #### ', ' # ', ' # ', ' # ', ' # # ', ' # # ', ' ## ',], + 'I': [' # ', ' # ', ' # ', ' # ', ' # ', ' # ', ' # ',], + 'N': [' # # ', ' ## # ', ' ## # ', ' # ## ', ' # ## ', ' # # ', ' # # ',], + ' ': [' ', ' ', ' ', ' ', ' ', ' ', ' ',], + 'O': [' ## ', ' # # ', ' # # ', ' # # ', ' # # ', ' # # ', ' ## ',], + 'U': [' # # ', ' # # ', ' # # ', ' # # ', ' # # ', ' # # ', ' ### ',], + 'R': [' #### ', ' # #', ' #### ', ' # # ', ' # # ', ' # #', ' # #',], + 'D': [' ### ', ' # ## ', ' # # ', ' # # ', ' # # ', ' # ## ', ' ### ',], + 'S': [' #### ', ' # ', ' # ', ' ### ', ' ## ', ' # ', ' ##### ',], + 'C': [' ##### ', ' # ', ' # ', ' # ', ' # ', ' # ', ' ##### ',], + 'V': [' # # ', ' # # ', ' # # ', ' # # ', ' # # ', ' # # ', ' # ',], + 'E': [' ##### ', ' # ', ' # ', ' ##### ', ' # ', ' # ', ' ##### ',], + }; + const drawBlock = (x, y) => { + ctx.fillStyle = "black" + ctx.fillRect(x, y, blockSize, blockSize); + }; + const drawLetter = (letter, x, y) => { + const letterData = lettersData[letter]; + if (letterData) { + for (let row = 0; row < letterData.length; row++) { + const rowData = letterData[row]; + for (let col = 0; col < rowData.length; col++) { + const char = rowData[col]; + if (char === '#') { + const blockX = x + (col * (blockSize + padding)); + const blockY = y + (row * (blockSize + padding)); + drawBlock(blockX, blockY); + } + } + } + } + }; + for (let i = 0; i < letters.length; i++) { + const char = letters[i]; + const letterX = x + (i * (blockSize * 5)) - Math.abs(x * 1.5); // Adjust spacing between letters + const letterY = y; + drawLetter(char, letterX, letterY); + } + } + }, + ruins() { // by SiddhUPe + // simulation.enableConstructMode() + simulation.makeTextLog(`ruins by SiddhUPe`); + + level.setPosToSpawn(0, -50); //normal spawn + level.exit.x = 19531; + level.exit.y = 882 + 70; + spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); //bump for level entrance + spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20); //bump for level exit + level.defaultZoom = 1800 + simulation.zoomTransition(level.defaultZoom) + document.body.style.backgroundColor = "#d8dadf"; + // color.map = "#444" //custom map color + + + level.customTopLayer = () => { }; + spawn.mapRect(875, 0, 1000, 100); + spawn.mapRect(1825, -400, 50, 225); + spawn.mapRect(1825, -400, 675, 50); + spawn.mapRect(1825, 0, 675, 100); + spawn.mapRect(2500, -575, 50, 225); + spawn.mapRect(2500, -575, 850, 50); + spawn.mapRect(2500, -100, 875, 175); + spawn.mapRect(2500, 75, 875, 25); + spawn.mapRect(3350, -575, 25, 50); + spawn.mapRect(2450, -50, 75, 75); + spawn.mapRect(2425, -25, 25, 25); + spawn.mapRect(2475, -75, 25, 25); + spawn.mapRect(3375, -575, 75, 325); + spawn.mapRect(3375, -100, 75, 300); + spawn.mapRect(3450, -50, 25, 250); + spawn.mapRect(3475, -25, 25, 225); + spawn.mapRect(3500, 0, 25, 200); + spawn.mapRect(3525, 25, 25, 175); + spawn.mapRect(3550, 75, 25, 125); + spawn.mapRect(3550, 50, 25, 150); + spawn.mapRect(3575, 75, 25, 125); + spawn.mapRect(3600, 100, 25, 100); + spawn.mapRect(3625, 150, 25, 50); + spawn.mapRect(2875, -1375, 350, 75); + spawn.mapRect(3150, -1375, 75, 350); + spawn.mapRect(3100, -1300, 50, 50); + spawn.mapRect(3075, -1300, 25, 25); + spawn.mapRect(3125, -1250, 25, 25); + spawn.mapRect(2825, -1375, 50, 125); + spawn.mapRect(3100, -1025, 125, 50); + spawn.mapRect(2800, -1350, 25, 75); + spawn.mapRect(3125, -975, 75, 25); + spawn.mapRect(3225, -1350, 25, 300); + spawn.mapRect(2875, -1400, 275, 25); + spawn.mapRect(2900, -1425, 225, 25); + spawn.mapRect(3250, -1325, 25, 250); + spawn.mapRect(2875, -1300, 25, 25); + spawn.mapRect(3125, -1050, 50, 25); + spawn.mapRect(5325, 800, 50, 225); + spawn.mapRect(5325, 975, 300, 50); + spawn.mapRect(5375, 925, 50, 50); + spawn.mapRect(5375, 900, 25, 25); + spawn.mapRect(5425, 950, 25, 25); + spawn.mapRect(5325, 775, 100, 25); + spawn.mapRect(5625, 925, 25, 100); + spawn.mapRect(5350, 800, 50, 25); + spawn.mapRect(5600, 950, 25, 50); + spawn.mapRect(5300, 800, 25, 175); + spawn.mapRect(5400, 1025, 225, 25); + spawn.mapRect(5450, 1050, 125, 25); + spawn.mapRect(5275, 850, 25, 100); + spawn.mapRect(5350, 750, 50, 25); + spawn.mapRect(5650, 950, 25, 50); + spawn.mapRect(16775, -975, 275, 50); + spawn.mapRect(17000, -975, 50, 200); + spawn.mapRect(16775, -975, 25, 100); + spawn.mapRect(17000, -775, 50, 50); + spawn.mapRect(16975, -725, 75, 25); + spawn.mapRect(16950, -925, 50, 50); + spawn.mapRect(16925, -925, 75, 25); + spawn.mapRect(17000, -925, 25, 75); + spawn.mapRect(16975, -925, 25, 50); + spawn.mapRect(16975, -925, 25, 75); + spawn.mapRect(16800, -1000, 200, 25); + spawn.mapRect(16850, -1025, 100, 25); + spawn.mapRect(17050, -925, 25, 200); + spawn.mapRect(17075, -925, 25, 150); + spawn.mapRect(16775, -925, 50, 25); + spawn.mapRect(17000, -750, 25, 25); + spawn.mapRect(16975, -750, 25, 50); + spawn.mapRect(16950, -725, 75, 25); + spawn.mapRect(9475, -1150, 50, 200); + spawn.mapRect(9475, -1150, 25, 25); + spawn.mapRect(9475, -1150, 300, 50); + spawn.mapRect(9725, -1150, 25, 25); + spawn.mapRect(9725, -1150, 50, 200); + spawn.mapRect(9500, -975, 25, 25); + spawn.mapRect(9500, -975, 75, 25); + spawn.mapRect(9700, -975, 25, 25); + spawn.mapRect(9675, -975, 75, 25); + spawn.mapRect(9525, -1175, 200, 25); + spawn.mapRect(9550, -1200, 150, 100); + spawn.mapRect(9450, -1125, 50, 150); + spawn.mapRect(9750, -1125, 50, 150); + spawn.mapRect(9525, -1100, 50, 50); + spawn.mapRect(9675, -1100, 50, 50); + spawn.mapRect(9575, -1100, 25, 25); + spawn.mapRect(9650, -1100, 25, 25); + spawn.mapRect(9500, -1050, 50, 25); + spawn.mapRect(9700, -1100, 25, 75); + spawn.mapRect(11925, -1175, 75, 275); + spawn.mapRect(11925, -1175, 475, 75); + spawn.mapRect(12325, -1175, 75, 275); + spawn.mapRect(11925, -925, 175, 25); + spawn.mapRect(12225, -925, 175, 25); + spawn.mapRect(11950, -925, 125, 50); + spawn.mapRect(12275, -925, 100, 50); + spawn.mapRect(11925, -1200, 475, 25); + spawn.mapRect(11975, -1225, 375, 25); + spawn.mapRect(12000, -1225, 50, 25); + spawn.mapRect(12000, -1275, 325, 75); + spawn.mapRect(11900, -1175, 50, 250); + spawn.mapRect(12375, -1175, 50, 250); + spawn.mapRect(11900, -1150, 50, 150); + spawn.mapRect(11875, -1150, 50, 200); + spawn.mapRect(12375, -1150, 75, 200); + spawn.mapRect(11975, -1100, 50, 25); + spawn.mapRect(12300, -1100, 75, 25); + spawn.mapRect(12300, -950, 25, 50); + spawn.mapRect(12000, -950, 25, 75); + + spawn.mapRect(3625, 125, 25, 50); + spawn.mapRect(3650, 150, 25, 50); + spawn.mapRect(3675, 175, 25, 25); + spawn.mapRect(3450, -75, 25, 50); + spawn.mapRect(3475, -50, 25, 125); + spawn.mapRect(3500, -25, 25, 125); + spawn.mapRect(3500, 0, 50, 125); + spawn.mapRect(3550, 25, 25, 125); + spawn.mapRect(3575, 50, 25, 125); + spawn.mapRect(3600, 75, 25, 75); + spawn.mapRect(3600, 100, 50, 75); + spawn.mapRect(3650, 125, 25, 75); + spawn.mapRect(3675, 150, 25, 50); + spawn.mapRect(3675, 150, 75, 450); + spawn.mapRect(3675, 525, 700, 75); + spawn.mapRect(4300, 150, 75, 450); + mover = level.mover(3375, -100, 75, 100); + pool = level.hazard(3750, 200, 550, 325); + spawn.mapRect(-150, -225, 75, 325); + spawn.mapRect(-150, -325, 425, 100); + spawn.mapRect(-100, -400, 300, 75); + spawn.mapRect(-25, -475, 150, 75); + spawn.mapRect(200, -350, 25, 50); + spawn.mapRect(-50, -425, 25, 100); + spawn.mapRect(-125, -350, 25, 100); + spawn.mapRect(100, -425, 50, 125); + spawn.mapRect(1875, -450, 625, 50); + spawn.mapRect(1950, -500, 550, 50); + spawn.mapRect(2025, -525, 475, 25); + spawn.mapRect(2025, -550, 525, 25); + spawn.mapRect(2125, -575, 400, 25); + spawn.mapRect(2125, -600, 1325, 50); + spawn.mapRect(2475, -550, 950, 200); + spawn.mapRect(1825, -350, 100, 175); + spawn.mapRect(3350, -375, 25, 125); + spawn.mapRect(1850, -425, 50, 25); + spawn.mapRect(1925, -475, 125, 25); + spawn.mapRect(2000, -525, 125, 25); + spawn.mapRect(2100, -575, 200, 25); + spawn.mapRect(2400, -650, 725, 75); + spawn.mapRect(2500, -675, 475, 75); + spawn.mapRect(2625, -725, 225, 100); + spawn.mapRect(2675, -750, 125, 25); + spawn.mapRect(2600, -700, 25, 50); + spawn.mapRect(2850, -700, 25, 75); + spawn.mapRect(3075, -625, 75, 50); + spawn.mapRect(2375, -625, 50, 75); + spawn.mapRect(1900, -350, 100, 75); + spawn.mapRect(1925, -300, 50, 50); + spawn.mapRect(1975, -350, 75, 50); + spawn.mapRect(3325, -350, 50, 25); + spawn.mapRect(150, -25, 1425, 50); + spawn.mapRect(175, 75, 1200, 50); + spawn.mapRect(400, -25, 575, 25); + spawn.mapRect(425, -50, 750, 75); + spawn.mapRect(1250, -50, 125, 100); + spawn.mapRect(1175, -50, 100, 25); + spawn.mapRect(725, 100, 500, 50); + spawn.mapRect(625, -75, 300, 50); + spawn.mapRect(250, -25, 225, 25); + spawn.mapRect(1400, 75, 225, 50); + spawn.mapRect(950, -75, 200, 25); + spawn.mapRect(1200, -75, 125, 25); + spawn.mapRect(425, -50, 100, 25); + spawn.mapRect(450, -75, 100, 50); + spawn.mapRect(250, -50, 125, 50); + spawn.mapRect(250, 125, 125, 25); + spawn.mapRect(475, 100, 100, 50); + spawn.mapRect(650, 125, 25, 25); + spawn.mapRect(675, 100, 75, 50); + spawn.mapRect(825, 125, 200, 50); + spawn.mapRect(-75, 75, 325, 50); + spawn.mapRect(0, 100, 175, 50); + spawn.mapRect(775, -100, 275, 50); + spawn.mapRect(2475, 0, 925, 125); + spawn.mapRect(2500, 50, 875, 100); + spawn.mapRect(2550, 100, 775, 75); + spawn.mapRect(2625, 150, 600, 50); + spawn.mapRect(3225, 125, 275, 75); + spawn.mapRect(1750, -225, 150, 50); + spawn.mapRect(1800, -275, 50, 75); + spawn.mapRect(1775, -250, 75, 75); + spawn.mapRect(3200, -625, 250, 50); + spawn.mapRect(3275, -650, 75, 25); + spawn.mapRect(3175, -625, 25, 25); + spawn.mapRect(3250, -700, 100, 100); + spawn.mapRect(3200, -650, 75, 50); + spawn.mapRect(3225, -675, 75, 100); + spawn.mapRect(3325, -675, 50, 100); + spawn.mapRect(3375, -650, 25, 75); + spawn.mapRect(1575, -25, 100, 25); + spawn.mapRect(1450, 100, 125, 50); + spawn.mapRect(250, -300, 50, 50); + spawn.mapRect(275, -275, 50, 25); + spawn.mapRect(200, -275, 125, 50); + spawn.mapRect(3725, 200, 50, 375); + spawn.mapRect(3750, 275, 50, 300); + spawn.mapRect(3800, 350, 25, 200); + spawn.mapRect(3825, 425, 25, 150); + spawn.mapRect(3850, 500, 25, 75); + spawn.mapRect(4275, 250, 50, 325); + spawn.mapRect(4250, 300, 50, 300); + spawn.mapRect(4225, 375, 75, 200); + spawn.mapRect(4200, 450, 75, 150); + spawn.mapRect(4175, 500, 75, 75); + spawn.mapRect(3950, 500, 150, 50); + spawn.mapRect(4000, 500, 50, 25); + spawn.mapRect(3875, 500, 425, 25); + spawn.mapRect(3625, 200, 50, 75); + spawn.mapRect(3575, 200, 50, 25); + spawn.mapRect(3675, 275, 25, 25); + spawn.mapRect(3650, 275, 25, 25); + spawn.mapRect(3600, 200, 25, 50); + spawn.mapRect(2600, 175, 25, 25); + spawn.mapRect(2700, 175, 425, 100); + spawn.mapRect(2650, 200, 75, 50); + spawn.mapRect(3100, 200, 75, 50); + spawn.mapRect(2675, 250, 25, 25); + spawn.mapRect(2625, 200, 100, 25); + spawn.mapRect(3150, 200, 75, 25); + spawn.mapRect(3175, 225, 25, 25); + spawn.mapRect(3775, 250, 25, 50); + spawn.mapRect(3800, 275, 25, 125); + spawn.mapRect(3800, 325, 50, 225); + spawn.mapRect(3875, 400, 25, 200); + spawn.mapRect(3825, 425, 50, 125); + spawn.mapRect(3850, 375, 25, 100); + spawn.mapRect(3900, 450, 25, 75); + spawn.mapRect(3925, 475, 25, 50); + spawn.mapRect(3450, -600, 25, 325); + spawn.mapRect(3475, -575, 25, 275); + spawn.mapRect(3500, -525, 25, 200); + spawn.mapRect(3525, -500, 25, 150); + spawn.mapRect(3550, -475, 25, 100); + spawn.mapRect(2725, 250, 350, 50); + spawn.mapRect(2750, 275, 300, 50); + spawn.mapRect(3150, 250, 25, 25); + spawn.mapRect(4325, 150, 975, 75); + spawn.mapRect(4375, 225, 900, 25); + spawn.mapRect(4375, 175, 875, 100); + spawn.mapRect(4375, 225, 850, 75); + spawn.mapRect(4375, 225, 825, 100); + spawn.mapRect(4375, 275, 800, 75); + spawn.mapRect(4350, 325, 800, 50); + spawn.mapRect(4375, 350, 750, 50); + spawn.mapRect(4375, 350, 725, 75); + spawn.mapRect(4350, 375, 725, 75); + spawn.mapRect(4350, 400, 700, 75); + spawn.mapRect(4350, 425, 675, 75); + spawn.mapRect(4350, 475, 650, 50); + spawn.mapRect(4375, 500, 600, 50); + spawn.mapRect(4375, 500, 575, 75); + spawn.mapRect(4375, 550, 550, 50); + spawn.mapRect(4425, 125, 775, 75); + spawn.mapRect(5300, 175, 75, 50); + spawn.mapRect(4475, 100, 150, 25); + spawn.mapRect(4825, 125, 300, 25); + spawn.mapRect(4800, 100, 250, 25); + spawn.mapRect(5100, 100, 50, 25); + spawn.mapRect(4650, 100, 75, 25); + spawn.mapRect(5475, 225, 125, 300); + spawn.mapRect(5450, 275, 25, 125); + spawn.mapRect(5450, 450, 25, 75); + spawn.mapRect(5425, 325, 25, 75); + spawn.mapRect(5425, 475, 25, 50); + spawn.mapRect(5575, 250, 50, 150); + spawn.mapRect(5575, 450, 50, 50); + spawn.mapRect(5475, 525, 125, 25); + spawn.mapRect(5500, 550, 75, 25); + spawn.mapRect(5525, 575, 25, 25); + spawn.mapRect(3675, 575, 1050, 50); + spawn.mapRect(4175, 600, 250, 50); + spawn.mapRect(3850, 625, 100, 25); + spawn.mapRect(3700, 625, 75, 25); + spawn.mapRect(4050, 625, 50, 25); + spawn.mapRect(4500, 625, 225, 25); + spawn.mapRect(5725, 150, 75, 225); + spawn.mapRect(5700, 175, 25, 150); + spawn.mapRect(5775, 250, 50, 100); + spawn.mapRect(5950, 325, 75, 75); + spawn.mapRect(5925, 375, 25, 25); + spawn.mapRect(6000, 350, 50, 50); + spawn.mapRect(6125, 425, 1050, 75); + spawn.mapRect(6425, 0, 750, 75); + spawn.mapRect(6400, 25, 50, 50); + spawn.mapRect(6500, -25, 675, 75); + spawn.mapRect(6550, -25, 275, 25); + spawn.mapRect(6475, -25, 125, 75); + spawn.mapRect(6450, -25, 100, 100); + spawn.mapRect(6475, -75, 700, 75); + spawn.mapRect(6500, -75, 75, 25); + spawn.mapRect(6500, -125, 675, 125); + spawn.mapRect(6525, -150, 650, 125); + spawn.mapRect(6550, -175, 625, 50); + spawn.mapRect(6900, -200, 275, 75); + spawn.mapRect(6925, -250, 250, 175); + spawn.mapRect(6950, -275, 225, 75); + spawn.mapRect(6975, -300, 200, 50); + spawn.mapRect(7025, -325, 125, 125); + spawn.mapRect(6400, 50, 75, 175); + spawn.mapRect(6450, 50, 100, 100); + spawn.mapRect(6475, 150, 25, 25); + spawn.mapRect(6550, 75, 25, 25); + spawn.mapRect(6375, 75, 25, 150); + spawn.mapRect(6350, 100, 25, 75); + spawn.mapRect(6650, 50, 225, 50); + spawn.mapRect(6975, 75, 75, 25); + spawn.mapRect(6625, -175, 225, 25); + spawn.mapRect(6675, -200, 275, 25); + spawn.mapRect(6750, -225, 250, 25); + spawn.mapRect(6200, 475, 575, 50); + spawn.mapRect(6925, 500, 125, 25); + spawn.mapRect(6325, 400, 475, 25); + spawn.mapRect(6950, 400, 200, 25); + spawn.mapRect(7100, 75, 75, 100); + spawn.mapRect(7075, 75, 25, 25); + spawn.mapRect(7175, -300, 1650, 350); + spawn.mapRect(7325, -700, 100, 450); + spawn.mapRect(7600, -700, 100, 450); + spawn.mapRect(7900, -700, 100, 450); + spawn.mapRect(8200, -700, 100, 425); + spawn.mapRect(8500, -700, 100, 425); + spawn.mapRect(7275, -825, 1375, 125); + spawn.mapRect(7400, -700, 50, 25); + spawn.mapRect(7575, -700, 50, 25); + spawn.mapRect(7875, -700, 150, 25); + spawn.mapRect(8175, -700, 150, 25); + spawn.mapRect(8475, -700, 150, 25); + spawn.mapRect(7300, -325, 150, 75); + spawn.mapRect(7575, -325, 150, 75); + spawn.mapRect(7875, -325, 150, 75); + spawn.mapRect(8175, -325, 150, 75); + spawn.mapRect(8475, -325, 150, 75); + spawn.mapRect(7700, -700, 25, 25); + spawn.mapRect(7300, -700, 75, 25); + spawn.mapRect(7150, 50, 75, 50); + spawn.mapRect(7175, 100, 25, 25); + spawn.mapRect(7225, 50, 25, 25); + spawn.mapRect(7300, -850, 1325, 75); + spawn.mapRect(7325, -875, 1275, 50); + spawn.mapRect(7375, -900, 1200, 25); + spawn.mapRect(7350, -900, 25, 25); + spawn.mapRect(7375, -900, 200, 25); + + spawn.mapRect(7375, -925, 1175, 25); + spawn.mapRect(7400, -950, 1125, 25); + spawn.mapRect(7425, -975, 1075, 25); + spawn.mapRect(7450, -1000, 1025, 25); + spawn.mapRect(7675, -1050, 525, 50); + spawn.mapRect(7700, -1050, 100, 25); + spawn.mapRect(7700, -1075, 450, 25); + spawn.mapRect(7725, -1100, 400, 25); + spawn.mapRect(7775, -1125, 300, 25); + spawn.mapRect(7650, -1025, 75, 25); + spawn.mapRect(8200, -1025, 25, 25); + spawn.mapRect(8825, -275, 25, 300); + spawn.mapRect(8825, -225, 50, 125); + spawn.mapRect(8850, -50, 25, 75); + spawn.mapRect(7150, 425, 100, 425); + spawn.mapRect(7150, 775, 1600, 100); + spawn.mapRect(8750, 400, 75, 475); + spawn.mapRect(8825, 400, 25, 475); + spawn.mapRect(7225, 450, 50, 325); + spawn.mapRect(7250, 500, 50, 275); + spawn.mapRect(7300, 550, 25, 225); + spawn.mapRect(7325, 600, 25, 175); + spawn.mapRect(7350, 650, 25, 125); + spawn.mapRect(7375, 675, 25, 100); + spawn.mapRect(7400, 700, 25, 75); + spawn.mapRect(7425, 725, 25, 50); + spawn.mapRect(7450, 750, 25, 25); + spawn.mapRect(8725, 425, 50, 375); + spawn.mapRect(8700, 450, 75, 375); + spawn.mapRect(8675, 475, 100, 375); + spawn.mapRect(8650, 500, 125, 375); + spawn.mapRect(8600, 525, 100, 350); + spawn.mapRect(8575, 550, 100, 275); + spawn.mapRect(8550, 575, 150, 250); + spawn.mapRect(8525, 625, 100, 225); + spawn.mapRect(8500, 675, 100, 125); + spawn.mapRect(8625, 825, 25, 25); + spawn.mapRect(8475, 700, 75, 75); + spawn.mapRect(8450, 725, 50, 50); + spawn.mapRect(8425, 750, 100, 25); + wastepool = level.hazard(7250, 575, 1450, 200); + spawn.mapRect(7375, 0, 250, 75); + spawn.mapRect(7700, 0, 725, 75); + spawn.mapRect(8575, 50, 150, 25); + spawn.mapRect(7750, 50, 475, 50); + spawn.mapRect(7425, 50, 175, 50); + spawn.mapRect(8600, 50, 50, 50); + spawn.mapRect(7200, 850, 875, 50); + spawn.mapRect(8225, 850, 125, 50); + spawn.mapRect(8475, 850, 275, 50); + spawn.mapRect(7300, 875, 375, 50); + spawn.mapRect(7925, 875, 100, 50); + spawn.mapRect(8525, 875, 125, 50); + spawn.mapRect(8250, 875, 75, 50); + spawn.mapRect(7800, 900, 50, 25); + spawn.mapRect(8125, 875, 50, 50); + spawn.mapRect(8075, 875, 50, 50); + spawn.mapRect(7125, 500, 25, 325); + spawn.mapRect(7100, 475, 25, 300); + spawn.mapRect(7075, 600, 50, 125); + spawn.mapRect(7075, 500, 50, 25); + spawn.mapRect(8850, 425, 75, 450); + spawn.mapRect(8925, 475, 75, 400); + spawn.mapRect(9000, 550, 75, 325); + spawn.mapRect(9075, 650, 75, 25); + spawn.mapRect(9075, 625, 75, 250); + spawn.mapRect(9150, 675, 75, 200); + spawn.mapRect(9225, 750, 75, 125); + spawn.mapRect(8925, 450, 25, 25); + spawn.mapRect(9000, 500, 25, 75); + spawn.mapRect(9000, 525, 25, 100); + spawn.mapRect(9000, 525, 50, 100); + spawn.mapRect(9050, 575, 50, 100); + spawn.mapRect(9075, 600, 50, 75); + spawn.mapRect(9150, 650, 25, 100); + spawn.mapRect(9225, 725, 50, 100); + spawn.mapRect(9225, 700, 25, 100); + spawn.mapRect(9300, 800, 1375, 75); + spawn.mapRect(9300, 775, 25, 50); + spawn.mapRect(9425, 775, 200, 25); + spawn.mapRect(9500, 875, 200, 25); + spawn.mapRect(9725, 825, 200, 75); + spawn.mapRect(10000, 850, 125, 50); + spawn.mapRect(10225, 850, 400, 50); + spawn.mapRect(9775, 775, 125, 25); + spawn.mapRect(10100, 775, 75, 75); + spawn.mapRect(10275, 750, 225, 75); + spawn.mapRect(9975, 775, 25, 50); + spawn.mapRect(10000, 775, 25, 50); + spawn.mapRect(10025, 775, 25, 75); + spawn.mapRect(10675, 775, 50, 100); + spawn.mapRect(10725, 725, 50, 150); + spawn.mapRect(10775, 650, 50, 225); + spawn.mapRect(10825, 575, 50, 300); + spawn.mapRect(10875, 500, 50, 375); + spawn.mapRect(10925, 425, 275, 450); + spawn.mapRect(11200, 500, 50, 375); + spawn.mapRect(11250, 575, 50, 300); + spawn.mapRect(11300, 650, 50, 225); + spawn.mapRect(11350, 725, 50, 150); + spawn.mapRect(11400, 775, 50, 100); + spawn.mapRect(10700, 750, 75, 75); + spawn.mapRect(10775, 700, 25, 25); + spawn.mapRect(10750, 700, 75, 75); + spawn.mapRect(10800, 625, 125, 75); + spawn.mapRect(10850, 550, 125, 50); + spawn.mapRect(10900, 475, 150, 75); + spawn.mapRect(11125, 475, 100, 50); + spawn.mapRect(11200, 550, 75, 50); + spawn.mapRect(11275, 625, 50, 75); + spawn.mapRect(11325, 700, 50, 75); + spawn.mapRect(11375, 750, 50, 75); + spawn.mapRect(11550, 225, 1525, 75); + spawn.mapRect(11450, 825, 1625, 50); + spawn.mapRect(11450, 800, 1625, 75); + spawn.mapRect(11525, -350, 50, 650); + spawn.mapRect(11850, -350, 50, 650); + spawn.mapRect(12225, -350, 50, 650); + spawn.mapRect(12600, -350, 50, 650); + spawn.mapRect(13000, -350, 75, 650); + spawn.mapRect(11525, -200, 1525, 50); + spawn.mapRect(11525, 50, 1550, 50); + spawn.mapRect(11525, -400, 1550, 50); + spawn.mapRect(11575, -425, 1450, 50); + spawn.mapRect(11625, -450, 1325, 75); + spawn.mapRect(11700, -475, 1175, 75); + spawn.mapRect(11725, -500, 1125, 75); + spawn.mapRect(11825, -400, 100, 75); + spawn.mapRect(11825, 200, 100, 75); + spawn.mapRect(12200, -375, 100, 50); + spawn.mapRect(12200, 200, 100, 75); + spawn.mapRect(12575, 200, 100, 75); + spawn.mapRect(12575, -375, 100, 50); + spawn.mapRect(11500, 825, 50, 25); + spawn.mapRect(11550, 775, 175, 25); + spawn.mapRect(11525, 875, 250, 25); + spawn.mapRect(11875, 750, 225, 50); + spawn.mapRect(11950, 850, 375, 50); + spawn.mapRect(12500, 775, 250, 75); + spawn.mapRect(12750, 850, 175, 50); + + + // books + spawn.bodyRect(11575, -300, 25, 100); + spawn.bodyRect(11600, -300, 25, 100); + spawn.bodyRect(11625, -300, 25, 100); + spawn.bodyRect(11650, -300, 25, 100); + spawn.bodyRect(11675, -300, 25, 100); + spawn.bodyRect(11700, -300, 25, 100); + spawn.bodyRect(11725, -300, 25, 100); + spawn.bodyRect(11750, -300, 25, 100); + spawn.bodyRect(11775, -300, 25, 100); + spawn.bodyRect(11800, -300, 25, 100); + spawn.bodyRect(11825, -300, 25, 100); + spawn.bodyRect(11900, -50, 25, 100); + spawn.bodyRect(11925, -50, 25, 100); + spawn.bodyRect(11950, -50, 25, 100); + spawn.bodyRect(11975, -50, 50, 100); + spawn.bodyRect(12025, -50, 50, 100); + spawn.bodyRect(12075, -50, 25, 100); + spawn.bodyRect(12100, -50, 50, 100); + spawn.bodyRect(12150, -50, 25, 100); + spawn.bodyRect(12175, -50, 25, 100); + spawn.bodyRect(12200, -50, 25, 100); + spawn.bodyRect(11900, -300, 25, 100); + spawn.bodyRect(11925, -300, 25, 100); + spawn.bodyRect(11950, -225, 75, 25); + spawn.bodyRect(12650, -50, 25, 100); + spawn.bodyRect(12675, -50, 25, 100); + spawn.bodyRect(12725, -50, 25, 100); + spawn.bodyRect(12750, -50, 50, 100); + spawn.bodyRect(12650, -275, 25, 75); + spawn.bodyRect(12675, -275, 25, 75); + spawn.bodyRect(12700, -275, 50, 75); + spawn.bodyRect(12750, -275, 25, 75); + spawn.bodyRect(12775, -275, 25, 75); + spawn.bodyRect(12800, -275, 25, 75); + spawn.bodyRect(12825, -275, 25, 75); + spawn.bodyRect(12850, -275, 50, 75); + spawn.bodyRect(12900, -275, 50, 75); + spawn.bodyRect(12950, -275, 50, 75); + spawn.mapRect(12200, 775, 175, 50); + spawn.mapRect(11550, 250, 1500, 75); + spawn.mapRect(11575, 275, 1450, 75); + spawn.mapRect(11600, 325, 1400, 50); + spawn.mapRect(11625, 350, 1350, 50); + spawn.mapRect(11725, 375, 1150, 50); + spawn.mapRect(11900, 400, 800, 50); + spawn.mapRect(12100, 425, 425, 50); + spawn.mapRect(12125, 475, 375, 25); + spawn.mapRect(12200, 475, 225, 50); + spawn.mapRect(11475, -400, 50, 700); + spawn.mapRect(11450, -375, 50, 625); + spawn.mapRect(11425, -350, 100, 600); + spawn.mapRect(11400, -300, 75, 525); + spawn.mapRect(11375, -250, 100, 400); + spawn.mapRect(11350, -150, 50, 200); + spawn.mapRect(13075, 825, 25, 50); + spawn.mapRect(13100, 850, 25, 25); + spawn.mapRect(13200, 700, 100, 225); + spawn.mapRect(13300, 775, 25, 100); + spawn.mapRect(13325, 825, 25, 50); + spawn.mapRect(13175, 775, 25, 125); + spawn.mapRect(13225, 675, 50, 25); + spawn.mapRect(13225, 925, 50, 25); + spawn.mapRect(9250, 75, 1400, 150); + spawn.mapRect(9250, -225, 150, 300); + spawn.mapRect(9250, -275, 575, 50); + spawn.mapRect(9675, -225, 150, 300); + spawn.mapRect(9325, -325, 400, 50); + spawn.mapRect(9400, -350, 250, 25); + spawn.mapRect(9475, -375, 125, 25); + spawn.mapRect(9825, -225, 150, 300); + spawn.mapRect(10225, -225, 150, 300); + spawn.mapRect(9825, -275, 550, 50); + spawn.mapRect(9900, -325, 375, 50); + spawn.mapRect(9950, -350, 275, 25); + spawn.mapRect(10000, -375, 175, 25); + spawn.mapRect(10350, -275, 50, 375); + spawn.mapRect(10400, -250, 25, 325); + spawn.mapRect(10425, -225, 25, 375); + spawn.mapRect(10450, -200, 25, 325); + spawn.mapRect(10475, -175, 25, 350); + spawn.mapRect(10500, -150, 25, 300); + spawn.mapRect(10525, -125, 25, 300); + spawn.mapRect(10550, -100, 25, 225); + spawn.mapRect(10575, -75, 25, 200); + spawn.mapRect(10600, -50, 25, 150); + spawn.mapRect(10625, -25, 25, 175); + spawn.mapRect(9225, -225, 25, 450); + spawn.mapRect(9200, -175, 25, 400); + spawn.mapRect(9175, -150, 50, 375); + spawn.mapRect(9150, -125, 50, 350); + spawn.mapRect(9400, -175, 25, 275); + spawn.mapRect(9425, -125, 25, 200); + spawn.mapRect(9650, -175, 25, 250); + spawn.mapRect(9625, -125, 25, 275); + spawn.mapRect(9975, -175, 25, 300); + spawn.mapRect(10000, -125, 25, 250); + spawn.mapRect(10200, -175, 25, 300); + spawn.mapRect(10175, -125, 25, 225); + spawn.mapRect(9325, 225, 225, 25); + spawn.mapRect(9675, 225, 250, 50); + spawn.mapRect(10075, 225, 200, 25); + spawn.mapRect(10400, 200, 175, 50); + spawn.mapRect(13425, 675, 1425, 100); + spawn.mapRect(13450, 725, 375, 75); + spawn.mapRect(13850, 775, 225, 50); + spawn.mapRect(14150, 750, 300, 50); + spawn.mapRect(14575, 750, 200, 75); + spawn.mapRect(13550, 800, 150, 25); + spawn.mapRect(14250, 800, 225, 25); + spawn.mapRect(13425, 275, 1425, 100); + spawn.mapRect(13475, 250, 1325, 75); + spawn.mapRect(13550, 225, 1125, 75); + spawn.mapRect(13600, 200, 1025, 25); + spawn.mapRect(13650, 150, 925, 50); + spawn.mapRect(13725, 100, 775, 100); + spawn.mapRect(13825, 50, 525, 100); + spawn.mapRect(13900, 0, 350, 75); + spawn.mapRect(13975, -25, 175, 75); + spawn.mapRect(13875, 25, 50, 50); + spawn.mapRect(13800, 75, 75, 50); + spawn.mapRect(13700, 125, 75, 50); + spawn.mapRect(13625, 200, 50, 25); + spawn.mapRect(13650, 175, 25, 25); + spawn.mapRect(13625, 175, 125, 75); + spawn.mapRect(14350, 75, 25, 50); + spawn.mapRect(14250, 0, 25, 75); + spawn.mapRect(14275, 50, 25, 50); + spawn.mapRect(14275, 25, 25, 75); + spawn.mapRect(14500, 125, 25, 75); + spawn.mapRect(14575, 175, 25, 75); + spawn.mapRect(13475, 650, 400, 50); + spawn.mapRect(13975, 675, 75, 25); + spawn.mapRect(14000, 650, 50, 50); + spawn.mapRect(14150, 625, 675, 100); + spawn.mapRect(14325, 625, 100, 25); + spawn.mapRect(14300, 600, 325, 25); + spawn.mapRect(13525, 325, 375, 100); + spawn.mapRect(13975, 375, 400, 25); + spawn.mapRect(14500, 325, 100, 75); + spawn.mapRect(14850, 675, 50, 200); + spawn.mapRect(14875, 700, 50, 175); + spawn.mapRect(14925, 725, 50, 150); + spawn.mapRect(14975, 750, 50, 125); + spawn.mapRect(15025, 775, 50, 100); + spawn.mapRect(15075, 750, 1150, 100); + spawn.mapRect(15100, 825, 225, 50); + spawn.mapRect(15500, 850, 225, 25); + spawn.mapRect(15925, 775, 275, 100); + spawn.mapRect(15775, 825, 50, 50); + spawn.mapRect(15225, 250, 1050, 125); + spawn.mapRect(15250, 200, 1000, 50); + spawn.mapRect(15275, 175, 950, 50); + spawn.mapRect(15300, 150, 900, 50); + spawn.mapRect(15325, 125, 850, 25); + spawn.mapRect(15350, 100, 800, 25); + spawn.mapRect(15375, 75, 750, 25); + spawn.mapRect(15400, 50, 700, 100); + spawn.mapRect(15425, 25, 650, 75); + spawn.mapRect(15450, 0, 600, 50); + spawn.mapRect(15475, -25, 550, 75); + spawn.mapRect(15500, -50, 500, 75); + spawn.mapRect(15525, -75, 450, 75); + spawn.mapRect(15550, -100, 400, 75); + spawn.mapRect(15575, -125, 350, 75); + spawn.mapRect(15600, -150, 300, 50); + spawn.mapRect(15625, -175, 250, 50); + spawn.mapRect(15650, -200, 200, 25); + spawn.mapRect(15675, -225, 150, 75); + spawn.mapRect(15700, -250, 100, 75); + spawn.mapRect(16275, 250, 25, 125); + spawn.mapRect(16250, 225, 25, 25); + spawn.mapRect(15200, 250, 25, 125); + spawn.mapRect(15225, 225, 25, 25); + spawn.mapRect(15275, 350, 175, 50); + spawn.mapRect(15550, 350, 425, 75); + spawn.mapRect(16100, 375, 175, 25); + spawn.mapRect(14700, -375, 50, 325); + spawn.mapRect(14700, -425, 375, 50); + spawn.mapRect(14750, -375, 125, 100); + spawn.mapRect(14750, -275, 75, 75); + spawn.mapRect(14850, -375, 100, 50); + spawn.mapRect(14825, -275, 25, 25); + spawn.mapRect(14950, -375, 25, 25); + spawn.mapRect(14875, -325, 25, 25); + spawn.mapRect(14725, -200, 50, 25); + spawn.mapRect(14700, -75, 100, 25); + spawn.mapRect(15050, -425, 25, 100); + spawn.mapRect(14725, -450, 325, 25); + spawn.mapRect(14775, -475, 225, 25); + spawn.mapRect(14825, -500, 125, 25); + spawn.mapRect(14675, -350, 25, 100); + spawn.mapRect(14675, -175, 25, 75); + spawn.mapRect(14850, 325, 25, 50); + spawn.mapRect(5700, -725, 375, 50); + spawn.mapRect(6025, -725, 50, 325); + spawn.mapRect(5775, -675, 250, 25); + spawn.mapRect(6000, -675, 25, 225); + spawn.mapRect(5950, -650, 50, 75); + spawn.mapRect(5900, -650, 75, 25); + spawn.mapRect(6000, -575, 25, 25); + spawn.mapRect(6050, -700, 50, 275); + spawn.mapRect(5925, -625, 75, 25); + spawn.mapRect(5775, -750, 100, 25); + spawn.mapRect(5950, -750, 100, 25); + spawn.mapRect(5675, -725, 25, 150); + spawn.mapRect(5975, -400, 100, 25); + spawn.mapRect(5650, -700, 25, 75); + spawn.mapRect(5700, -675, 25, 50); + spawn.mapRect(5700, -600, 25, 25); + spawn.mapRect(15275, 750, 225, 25); + spawn.mapRect(15225, 725, 250, 25); + spawn.mapRect(15675, 725, 275, 100); + spawn.mapRect(16075, 725, 125, 50); + spawn.pulsar(5775.349354333542, -594.9058498351887) + spawn.pulsar(5852.915433009502, -545.5679375496002) + spawn.pulsar(5921.99534574469, -480.69487503053097) + spawn.mapRect(3725, -975, 1525, 100); + spawn.mapRect(3750, -650, 300, 75); + spawn.mapRect(4300, -650, 300, 75); + spawn.mapRect(4950, -650, 300, 75); + spawn.mapRect(5250, -975, 75, 400); + spawn.mapRect(3725, -975, 75, 400); + spawn.mapRect(4325, -600, 250, 50); + spawn.mapRect(4350, -550, 200, 25); + spawn.mapRect(3800, -575, 225, 25); + spawn.mapRect(3825, -550, 175, 25); + spawn.mapRect(4975, -600, 275, 50); + spawn.mapRect(5025, -550, 175, 25); + spawn.mapRect(3800, -1025, 1450, 50); + spawn.mapRect(3875, -1075, 1275, 50); + spawn.mapRect(3975, -1125, 1000, 50); + spawn.mapRect(3950, -1100, 50, 25); + spawn.mapRect(3850, -1050, 150, 25); + spawn.mapRect(3775, -1000, 200, 25); + spawn.mapRect(5225, -975, 75, 25); + spawn.mapRect(4950, -1100, 75, 125); + spawn.mapRect(5100, -1050, 75, 75); + spawn.mapRect(5225, -1000, 50, 100); + spawn.mapRect(4350, -675, 150, 75); + spawn.mapRect(4525, -650, 50, 25); + spawn.mapRect(4550, -675, 50, 75); + spawn.mapRect(3825, -650, 50, 25); + spawn.mapRect(3825, -675, 150, 50); + spawn.mapRect(4025, -675, 25, 100); + spawn.mapRect(4950, -675, 75, 50); + spawn.mapRect(5075, -675, 75, 75); + spawn.mapRect(5200, -675, 75, 50); + spawn.pulsar(4068.196906578167, -653.550201356403) + spawn.pulsar(4147.672553167598, -651.0093457935446) + spawn.pulsar(4228.863663369247, -653.4768859607283) + spawn.pulsar(4619.092688319791, -657.3942377732394) + spawn.pulsar(4724.821759138369, -653.4213864043036) + spawn.pulsar(4873.583205330713, -657.4103118310311) + spawn.pulsar(3871.920598597728, -804.0595760512573) + spawn.pulsar(4053.019377134256, -778.0061810623848) + spawn.pulsar(4211.732836201937, -780.4633597161928) + spawn.pulsar(4380.7768131190005, -776.3400515412312) + spawn.pulsar(4533.031170401828, -791.1397513503708) + spawn.pulsar(4663.577749297493, -789.0488615794887) + spawn.pulsar(4965.48351658387, -809.0025104385204) + spawn.pulsar(5122.782442346123, -810.2526936643312) + spawn.mapRect(3700, -875, 25, 250); + spawn.mapRect(5325, -900, 25, 250); + spawn.mapRect(5325, -850, 50, 150); + spawn.mapRect(5375, -825, 25, 75); + spawn.pulsar(14786.058375868968, -140.5759223979466) + spawn.pulsar(14862.320083571307, -177.02507110101413) + spawn.pulsar(14888.982047411475, -216.4856450590454) + spawn.pulsar(14950.503812885598, -280.9333882582806) + spawn.pulsar(15003.202057456116, -316.6767970823471) + spawn.spinner(759.4093972764956, -356.0541595435453) + spawn.spinner(1467.1412487475097, -617.4326431210314) + spawn.mapRect(11850, 775, 50, 50); + spawn.mapRect(12075, 775, 50, 50); + spawn.mapRect(16225, 750, 75, 325); + spawn.mapRect(16300, 775, 50, 325); + spawn.mapRect(16350, 800, 50, 275); + spawn.mapRect(16375, 825, 50, 200); + spawn.mapRect(16450, 875, 25, 150); + spawn.mapRect(16450, 875, 25, 225); + spawn.mapRect(16400, 875, 50, 150); + spawn.mapRect(16225, 1025, 250, 75); + spawn.mapRect(16475, 925, 25, 175); + spawn.mapRect(16500, 975, 25, 125); + spawn.mapRect(16525, 1025, 25, 50); + spawn.mapRect(16425, 1075, 150, 25); + spawn.mapRect(16225, 1100, 1175, 75); + spawn.mapRect(17200, 1050, 25, 50); + spawn.mapRect(17225, 950, 25, 200); + spawn.mapRect(17250, 800, 25, 300); + spawn.mapRect(17275, 725, 25, 400); + spawn.mapRect(17300, 750, 75, 400); + spawn.mapRect(17300, 725, 100, 450); + spawn.mapRect(16300, 250, 1075, 125); + spawn.mapRect(16450, -75, 100, 400); + spawn.mapRect(17100, -75, 100, 400); + spawn.mapRect(16425, 200, 150, 50); + spawn.mapRect(17075, 200, 150, 50); + spawn.mapRect(16425, -75, 150, 25); + spawn.mapRect(17075, -75, 150, 50); + spawn.mapRect(16425, -50, 150, 50); + spawn.mapRect(16575, -75, 525, 50); + spawn.mapRect(17075, -50, 150, 50); + spawn.mapRect(16550, -100, 550, 25); + spawn.mapRect(16575, -125, 500, 75); + spawn.mapRect(16600, -150, 450, 75); + spawn.mapRect(16625, -175, 400, 75); + spawn.mapRect(16675, -200, 275, 50); + spawn.mapRect(16750, -225, 125, 100); + spawn.mapRect(19700, 675, 50, 325); + spawn.mapRect(19725, 700, 50, 250); + spawn.mapRect(19750, 750, 25, 175); + spawn.mapRect(16775, -25, 100, 275); + spawn.mapRect(16750, -25, 150, 25); + spawn.mapRect(16750, 225, 150, 50); + spawn.pulsar(3037.797768861211, -1242.9871362505041) + spawn.pulsar(3070.307596879197, -1219.5627538123044) + spawn.pulsar(3111.2633762820287, -1107.7297980154415) + spawn.pulsar(5417.516810698634, 842.824851834252) + spawn.pulsar(5484.672534515589, 883.9519420960905) + spawn.pulsar(5588.5457723826075, 907.389646857348) + spawn.pulsar(16845.139047921595, -885.6942536135854) + spawn.pulsar(16892.187197333486, -849.5235136465661) + spawn.pulsar(16912.323783455256, -764.5275187038021) + powerUps.spawn(2571.591711269197, -145.6717604789277, 'heal') + powerUps.spawn(4415.693974666946, -15.077304620299628, 'heal') + powerUps.spawn(7505.795753124317, -360.0330849392626, 'heal') + powerUps.spawn(7809.5145838152075, -388.5517653996709, 'heal') + powerUps.spawn(8049.726318297545, 534.4543327703304, 'heal') + powerUps.spawn(8514.444440033667, 551.0268033205841, 'heal') + powerUps.spawn(8927.146055851512, 407.25359241772685, 'heal') + powerUps.spawn(9730.170170158563, 463.5594890235955, 'ammo') + powerUps.spawn(9998.34942087522, 434.9511651200589, 'ammo') + powerUps.spawn(10119.083720019844, 437.4195779326937, 'ammo') + powerUps.spawn(10346.197135080345, 423.1868836972815, 'ammo') + powerUps.spawn(1853.3194789931017, -36.87254038474242, 'ammo') + powerUps.spawn(4491.396397908616, 40.2862012621236, 'ammo') + powerUps.spawn(4954.207518897743, 50.27790416201856, 'ammo') + spawn.mapRect(9125, -50, 75, 275); + spawn.mapRect(9100, 0, 50, 225); + spawn.mapRect(9075, 75, 75, 150); + spawn.mapRect(9050, 150, 125, 50); + spawn.mapRect(9050, 200, 225, 25); + mover1 = level.mover(4000, -1125, 975, 25); + mover2 = level.mover(15675, 725, 275, 25); + spawn.mapRect(15025, -375, 25, 25); + spawn.mapRect(12200, -150, 100, 25); + spawn.mapRect(11825, -150, 100, 25); + spawn.mapRect(11825, 75, 100, 50); + spawn.mapRect(12200, 75, 100, 50); + spawn.mapRect(12575, 100, 75, 25); + spawn.mapRect(12625, 50, 50, 75); + spawn.mapRect(12600, -175, 75, 50); + spawn.mapRect(12575, -175, 75, 50); + spawn.mapRect(14125, 650, 75, 25); + spawn.mapRect(13875, 375, 50, 25); + spawn.mapRect(13300, -525, 325, 50); + spawn.mapRect(13575, -525, 50, 250); + spawn.mapRect(13550, -300, 75, 25); + spawn.mapRect(13300, -525, 25, 75); + spawn.mapRect(13525, -475, 50, 50); + spawn.mapRect(13500, -475, 100, 25); + spawn.mapRect(13550, -475, 25, 100); + spawn.mapRect(13325, -550, 275, 25); + spawn.mapRect(13350, -575, 200, 25); + spawn.mapRect(13625, -500, 25, 175); + spawn.mapRect(13650, -450, 25, 75); + spawn.mapRect(13500, 375, 75, 25); + spawn.mapRect(15550, -950, 50, 225); + spawn.mapRect(15575, -750, 75, 25); + spawn.mapRect(15550, -950, 375, 50); + spawn.mapRect(15925, -950, 50, 225); + spawn.mapRect(15875, -750, 100, 25); + spawn.mapRect(15575, -1000, 375, 75); + spawn.mapRect(15625, -1050, 250, 100); + spawn.mapRect(15600, -1025, 75, 50); + spawn.mapRect(15875, -1000, 25, 25); + spawn.mapRect(15825, -1025, 75, 75); + spawn.mapRect(15700, -1100, 125, 50); + spawn.mapRect(15650, -1075, 75, 50); + spawn.mapRect(15800, -1075, 50, 75); + spawn.mapRect(15575, -725, 50, 25); + spawn.mapRect(15900, -725, 50, 25); + spawn.mapRect(15525, -925, 25, 175); + spawn.mapRect(15950, -925, 50, 200); + spawn.mapRect(15500, -875, 25, 75); + spawn.mapRect(16000, -875, 25, 75); + spawn.mapRect(15600, -900, 50, 75); + spawn.mapRect(15650, -900, 25, 25); + spawn.mapRect(15600, -825, 25, 25); + spawn.mapRect(15875, -900, 50, 50); + spawn.mapRect(15850, -925, 75, 50); + spawn.mapRect(15925, -875, 25, 25); + spawn.mapRect(15925, -850, 25, 25); + spawn.mapRect(15900, -875, 50, 50); + bigpool = level.hazard(9075, 575, 1950, 250); + spawn.mapRect(16000, -775, 25, 50); + spawn.mapRect(16000, -800, 25, 25); + spawn.mapRect(15500, -825, 25, 75); + spawn.mapRect(15475, -850, 75, 75); + spawn.mapRect(16000, -850, 50, 100); + spawn.mapRect(10775, -450, 50, 200); + spawn.mapRect(10775, -275, 100, 25); + spawn.mapRect(11100, -450, 50, 200); + spawn.mapRect(11050, -275, 75, 25); + spawn.mapRect(10775, -450, 375, 25); + spawn.mapRect(10825, -475, 275, 25); + spawn.mapRect(10875, -500, 150, 25); + spawn.mapRect(10900, -525, 100, 25); + spawn.mapRect(10750, -425, 25, 150); + spawn.mapRect(11150, -400, 25, 125); + spawn.mapRect(10725, -400, 50, 100); + spawn.mapRect(11150, -375, 50, 75); + spawn.mapRect(10800, -250, 50, 25); + spawn.mapRect(10825, -425, 50, 50); + spawn.mapRect(10875, -425, 25, 25); + spawn.mapRect(10825, -375, 25, 25); + spawn.mapRect(11050, -425, 50, 50); + spawn.mapRect(11025, -425, 25, 25); + spawn.mapRect(11075, -375, 25, 25); + spawn.mapRect(950, -1075, 50, 200); + spawn.mapRect(950, -1125, 300, 50); + spawn.mapRect(1000, -1075, 50, 50); + spawn.mapRect(1050, -1075, 25, 25); + spawn.mapRect(975, -1025, 50, 25); + spawn.mapRect(975, -1150, 250, 25); + spawn.mapRect(1000, -1175, 200, 25); + spawn.mapRect(900, -1075, 50, 175); + spawn.mapRect(875, -1050, 25, 125); + spawn.mapRect(950, -875, 125, 25); + spawn.mapRect(1250, -1125, 25, 125); + spawn.mapRect(975, -850, 75, 25); + spawn.mapRect(1250, -1100, 50, 75); + spawn.mapRect(925, -900, 50, 25); + spawn.mapRect(1050, -1200, 100, 25); + spawn.mapRect(1225, -1000, 50, 25); + spawn.mapRect(16375, 350, 900, 50); + spawn.mapRect(16400, 375, 850, 50); + spawn.mapRect(16425, 400, 800, 50); + spawn.mapRect(16475, 425, 675, 50); + spawn.mapRect(16625, 475, 375, 25); + spawn.mapRect(16650, 500, 325, 25); + spawn.mapRect(16675, 500, 275, 50); + spawn.mapRect(17400, 775, 25, 325); + spawn.mapRect(17425, 825, 25, 225); + spawn.mapRect(16200, 900, 25, 225); + spawn.mapRect(16175, 925, 25, 125); + spawn.mapRect(16150, 975, 25, 25); + spawn.mapRect(16400, 1150, 850, 50); + spawn.mapRect(16475, 1175, 650, 50); + spawn.mapRect(16575, 1225, 450, 25); + spawn.sneaker(7895.471733263175, 257.75477496554186) + spawn.sneaker(8109.4934675858085, 349.44686618726473) + spawn.sneaker(7525.886813944122, 391.9511482895349) + spawn.sneaker(8076.43795816953, 441.14947363958373) + spawn.pulsar(1064.583377612331, -976.2077284446908) + spawn.pulsar(1158.3436115513837, -1054.4975368803214) + spawn.pulsar(10966.055009228428, -373.8481911663377) + spawn.pulsar(10913.989668763379, -261.59108542627166) + spawn.pulsar(13454.158594286884, -402.8270664336466) + spawn.pulsar(13360.079608974078, -246.97797933698774) + spawn.pulsar(13497.913481830354, -251.68317759640576) + spawn.pulsar(15687.09056963911, -850.8426925141155) + spawn.pulsar(15829.058084589731, -785.4134546702737) + spawn.pulsar(15674.313958480483, -685.0594164868394) + spawn.pulsar(15819.881465281747, -686.4370174238113) + spawn.sneakBoss(18189.441342796745, 537.6633241821036) + thirdpool = level.hazard(16425, 925, 925, 200); + spawn.mapRect(17675, -525, 75, 725); + spawn.mapRect(17625, -475, 75, 650); + spawn.mapRect(17575, -425, 75, 575); + spawn.mapRect(17700, -525, 1125, 75); + spawn.mapRect(17675, 175, 1125, 75); + spawn.mapRect(18775, -525, 75, 775); + spawn.mapRect(18825, -475, 75, 675); + spawn.mapRect(18900, -450, 50, 625); + spawn.mapRect(18950, -400, 50, 500); + spawn.mapRect(17750, -575, 1000, 50); + spawn.mapRect(17775, -625, 950, 50); + spawn.mapRect(17800, -675, 900, 75); + spawn.mapRect(17825, -725, 850, 125); + spawn.mapRect(17850, -750, 800, 25); + spawn.mapRect(17750, 125, 50, 50); + spawn.mapRect(17750, 100, 25, 25); + spawn.mapRect(17800, 150, 25, 25); + spawn.mapRect(17750, -450, 75, 75); + spawn.mapRect(17750, -400, 25, 50); + spawn.mapRect(17800, -450, 50, 25); + spawn.mapRect(18750, -450, 25, 25); + spawn.mapRect(18725, -450, 50, 50); + spawn.mapRect(18700, -475, 25, 25); + spawn.mapRect(18725, -450, 25, 25); + spawn.mapRect(18700, -450, 75, 25); + spawn.mapRect(18750, -425, 25, 50); + spawn.mapRect(18725, 125, 75, 75); + spawn.mapRect(18700, 150, 50, 50); + spawn.mapRect(18750, 100, 75, 50); + spawn.mapRect(17850, 150, 850, 50); + spawn.mapRect(17825, 150, 25, 50); + spawn.mapRect(17550, -350, 25, 450); + spawn.mapRect(19000, -325, 25, 400); + spawn.mapRect(18000, -775, 475, 25); + spawn.mapRect(18025, -800, 425, 75); + spawn.mapRect(18050, -825, 375, 75); + spawn.mapRect(18075, -850, 325, 50); + spawn.mapRect(18100, -875, 275, 100); + spawn.mapRect(18125, -900, 225, 75); + spawn.mapRect(18150, -925, 175, 75); + spawn.mapRect(17275, 750, 1775, 125); + spawn.mapRect(17475, 725, 450, 50); + spawn.mapRect(18200, 725, 200, 50); + spawn.mapRect(18650, 725, 225, 75); + spawn.shieldingBoss(18253.51035871325, -131.1707821125636) + // spawn.blockBoss(12604.846253470663, 607.6074958800299) + spawn.mapRect(17725, 250, 1025, 25); + spawn.mapRect(17775, 275, 925, 25); + spawn.mapRect(17800, 300, 875, 25); + spawn.mapRect(17850, 325, 775, 25); + spawn.mapRect(17375, 275, 25, 75); + spawn.mapRect(19050, 750, 25, 275); + spawn.mapRect(19075, 775, 25, 250); + spawn.mapRect(19100, 800, 25, 225); + spawn.mapRect(19125, 850, 25, 175); + spawn.mapRect(19150, 875, 25, 150); + spawn.mapRect(19175, 925, 25, 100); + spawn.mapRect(19200, 950, 25, 75); + spawn.mapRect(19000, 850, 100, 175); + spawn.mapRect(19050, 975, 650, 50); + spawn.mapRect(19425, 650, 275, 50); + spawn.mapRect(19675, 650, 50, 375); + spawn.mapRect(19050, 1025, 625, 25); + spawn.mapRect(19075, 1050, 575, 25); + spawn.mapRect(19250, 1100, 200, 25); + spawn.mapRect(19175, 1075, 375, 25); + spawn.mapRect(19450, 625, 225, 25); + spawn.mapRect(19500, 600, 150, 50); + spawn.mapRect(19625, 700, 50, 50); + spawn.mapRect(19600, 700, 25, 25); + spawn.mapRect(19650, 750, 25, 25); + spawn.mapRect(19400, 650, 25, 100); + spawn.mapRect(19375, 675, 25, 50); + spawn.mapRect(17600, 875, 250, 25); + spawn.mapRect(18100, 850, 375, 50); + spawn.mapRect(18650, 875, 325, 25); + + pooldunker = level.mover(7175, 425, 50, 25); + level.custom = () => { + level.exit.drawAndCheck(); + pooldunker.VxGoal = 90; + pooldunker.push(); + mover.VxGoal = 45; + mover.push(); + level.enter.draw(); + pool.query(); + wastepool.query(); + thirdpool.query(); + mover1.VxGoal = 12; + mover1.push(); + mover2.VxGoal = 24; + mover2.push(); + bigpool.query(); + + for (i = 0; i < mob.length; i++) { if (mob[i].isBoss == false) { mob[i].damageReduction = 0.13 } } + }; + + spawn.mapRect(-100, 0, 1000, 100); + powerUps.addResearchToLevel() //needs to run after mobs are spawned + }, // ******************************************************************************************************** // ******************************************************************************************************** // ***************************************** training levels ********************************************** diff --git a/js/powerup.js b/js/powerup.js index 87b8a1e..ac88dc6 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -922,13 +922,13 @@ const powerUps = { if (botTech.length > 0) { //pick random bot tech // const choose = botTech[Math.floor(Math.random() * botTech.length)]; // const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : ""; - // text += `
⭓▸●■   ${tech.tech[choose].name} ${isCount}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` + // text += `
⭓▸●■   ${tech.tech[choose].name} ${isCount}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` const choose = botTech[Math.floor(Math.random() * botTech.length)]; const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count + 1}x)` : ""; const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` text += `
-
⭓▸●■   ${tech.tech[choose].name} ${techCountText}
+
⭓▸●■   ${tech.tech[choose].name} ${techCountText}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` } } @@ -987,13 +987,13 @@ const powerUps = { if (botTech.length > 0) { //pick random bot tech // const choose = botTech[Math.floor(Math.random() * botTech.length)]; // const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : ""; - // text += `
⭓▸●■   ${tech.tech[choose].name} ${isCount}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` + // text += `
⭓▸●■   ${tech.tech[choose].name} ${isCount}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` const choose = botTech[Math.floor(Math.random() * botTech.length)]; const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count + 1}x)` : ""; const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` text += `
-
⭓▸●■   ${tech.tech[choose].name} ${techCountText}
+
⭓▸●■   ${tech.tech[choose].name} ${techCountText}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` } } @@ -1093,17 +1093,39 @@ const powerUps = { if (botTech.length > 0) { //pick random bot tech // const choose = botTech[Math.floor(Math.random() * botTech.length)]; // const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : ""; - // text += `
⭓▸●■   ${tech.tech[choose].name} ${isCount}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` + // text += `
⭓▸●■   ${tech.tech[choose].name} ${isCount}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` const choose = botTech[Math.floor(Math.random() * botTech.length)]; const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count + 1}x)` : ""; const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` text += `
-
⭓▸●■   ${tech.tech[choose].name} ${techCountText}
+
⭓▸●■   ${tech.tech[choose].name} ${techCountText}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` } } - + if (tech.isMassProduction) { + // const techOptions = [] //make an array of bot options + // for (let i = 0, len = tech.tech.length; i < len; i++) { + // if (tech.tech[i].isMassProduction) techOptions.push(i) + // } + // if (techOptions.length > 0) { //pick random bot tech + // const choose = techOptions[Math.floor(Math.random() * techOptions.length)]; + // const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` + // text += `
+ //
+ //
${tech.tech[choose].name}
+ // ${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` + // } + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].isMassProduction) { + const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[i].name}.webp');"` + text += `
+
+
${tech.tech[i].name}
+ ${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() : tech.tech[i].description}
` + } + } + } if (tech.isExtraGunField) { if (Math.random() > 0.5 && b.inventory.length < b.guns.length) { let gunOptions = []; diff --git a/js/spawn.js b/js/spawn.js index 742454d..c17d75b 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -117,9 +117,9 @@ const spawn = { tech.isScaleMobsWithDuplication = false return true } else if (tech.isResearchBoss) { - if (powerUps.research.count > 3) { - powerUps.research.changeRerolls(-4) - simulation.makeTextLog(`m.research -= 4
${powerUps.research.count}`) + if (powerUps.research.count > 2) { + powerUps.research.changeRerolls(-3) + simulation.makeTextLog(`m.research -= 3
${powerUps.research.count}`) } else { tech.addJunkTechToPool(0.49) } diff --git a/js/tech.js b/js/tech.js index a148f69..d59345a 100644 --- a/js/tech.js +++ b/js/tech.js @@ -1169,10 +1169,10 @@ const tech = { allowed: () => true, requires: "", effect() { - tech.isBulletsLastLonger += 0.3 + tech.bulletsLastLonger += 0.3 }, remove() { - tech.isBulletsLastLonger = 1; + tech.bulletsLastLonger = 1; } }, { @@ -1520,7 +1520,7 @@ const tech = { { name: "sound-bot upgrade", link: `sound-bot upgrade`, - description: "convert your bots to sound-bots
+200% wave fire rate and +100% damage", + description: "convert your bots to sound-bots
+150% wave fire rate and +150% damage", maxCount: 1, count: 0, frequency: 3, @@ -3452,6 +3452,70 @@ const tech = { } } }, + { + name: "mass production", + description: `tech always have +3 choices to spawn
${powerUps.orb.research(5)} ${powerUps.orb.ammo(8)} or   ${powerUps.orb.heal(8)}`, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { return true }, + requires: "", + effect() { + tech.isMassProduction = true + }, + remove() { + tech.isMassProduction = false + } + }, + { + name: "research", + description: `spawn ${powerUps.orb.research(5)}`, + maxCount: 1, + count: 0, + frequency: 0, + frequencyDefault: 0, + isNonRefundable: true, + isMassProduction: true, + allowed() { return true }, + requires: "", + effect() { + powerUps.spawnDelay("research", 5); + }, + remove() { } + }, + { + name: "ammo", + description: `spawn ${powerUps.orb.ammo(8)}`, + maxCount: 1, + count: 0, + frequency: 0, + frequencyDefault: 0, + isNonRefundable: true, + isMassProduction: true, + allowed() { return true }, + requires: "", + effect() { + powerUps.spawnDelay("ammo", 8); + }, + remove() { } + }, + { + name: "heals", + description: `spawn ${powerUps.orb.heal(8)}`, + maxCount: 1, + count: 0, + frequency: 0, + frequencyDefault: 0, + isNonRefundable: true, + isMassProduction: true, + allowed() { return true }, + requires: "mass production", + effect() { + powerUps.spawnDelay("heal", 8); + }, + remove() { } + }, { name: "pseudoscience", description: "when selecting a power up, research 3 times
for free, but add 1-4% JUNK to the tech pool", @@ -3632,15 +3696,15 @@ const tech = { { name: "abiogenesis", // description: `use ${powerUps.orb.research(4)}(or 49% JUNK to the tech pool if you can't) to add a 2nd boss to each level`, - description: `as a level begins spawn a 2nd boss using ${powerUps.orb.research(4)}
(+49% JUNK to the tech pool if you can't pay)
`, + description: `as a level begins spawn a 2nd boss using ${powerUps.orb.research(3)}
(+49% JUNK to the tech pool if you can't pay)
`, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return (build.isExperimentSelection || powerUps.research.count > 3) && !tech.isDuplicateBoss + return (build.isExperimentSelection || powerUps.research.count > 2) && !tech.isDuplicateBoss }, - requires: "at least 4 research, not parthenogenesis", + requires: "at least 3 research, not parthenogenesis", effect() { tech.isResearchBoss = true; }, @@ -6440,7 +6504,7 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return tech.haveGunCheck("drones", false) && !tech.isDroneRespawn && tech.isBulletsLastLonger === 1 && !tech.isDronesTravel && (build.isExperimentSelection || powerUps.research.count > 1) + return tech.haveGunCheck("drones", false) && !tech.isDroneRespawn && tech.bulletsLastLonger === 1 && !tech.isDronesTravel && (build.isExperimentSelection || powerUps.research.count > 1) }, requires: "drones, not drone repair, anti-shear topology, autonomous navigation", effect() { @@ -11244,9 +11308,7 @@ const tech = { frequencyDefault: 2, isLore: true, // isExperimentHide: true, - allowed() { - return !build.isExperimentSelection - }, + allowed() { return !build.isExperimentSelection }, requires: "NOT EXPERIMENT MODE", effect() { if (localSettings.loreCount > lore.conversation.length - 1) { //reward for people done with lore chapters (or on the final chapter) @@ -11341,7 +11403,7 @@ const tech = { energySiphon: null, healthDrain: null, crouchAmmoCount: null, - isBulletsLastLonger: null, + bulletsLastLonger: null, isImmortal: null, sporesOnDeath: null, isImmuneExplosion: null, @@ -11677,5 +11739,6 @@ const tech = { isFoamCavitation: null, isHealAttract: null, isLaserField: null, - isHealBrake: null + isHealBrake: null, + isMassProduction: null, } \ No newline at end of file diff --git a/lib/decomp.min.js b/lib/decomp.min.js deleted file mode 100644 index 72d4f28..0000000 --- a/lib/decomp.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.decomp=e()}}(function(){return function e(f,o,n){function d(t,l){if(!o[t]){if(!f[t]){var u="function"==typeof require&&require;if(!l&&u)return u(t,!0);if(i)return i(t,!0);throw new Error("Cannot find module '"+t+"'")}var p=o[t]={exports:{}};f[t][0].call(p.exports,function(e){var o=f[t][1][e];return d(o?o:e)},p,p.exports,e,f,o,n)}return o[t].exports}for(var i="function"==typeof require&&require,t=0;t=0&&1>=u&&p>=0&&1>=p}function i(e,f,o){return(f[0]-e[0])*(o[1]-e[1])-(o[0]-e[0])*(f[1]-e[1])}function t(e,f,o){return i(e,f,o)>0}function l(e,f,o){return i(e,f,o)>=0}function u(e,f,o){return i(e,f,o)<0}function p(e,f,o){return i(e,f,o)<=0}function s(e,f,o,n){if(n){var d=F,t=G;d[0]=f[0]-e[0],d[1]=f[1]-e[1],t[0]=o[0]-f[0],t[1]=o[1]-f[1];var l=d[0]*t[0]+d[1]*t[1],u=Math.sqrt(d[0]*d[0]+d[1]*d[1]),p=Math.sqrt(t[0]*t[0]+t[1]*t[1]),s=Math.acos(l/(u*p));return n>s}return 0===i(e,f,o)}function c(e,f){var o=f[0]-e[0],n=f[1]-e[1];return o*o+n*n}function y(e,f){var o=e.length;return e[0>f?f%o+o:f%o]}function a(e){e.length=0}function m(e,f,o,n){for(var d=o;n>d;d++)e.push(f[d])}function r(e){for(var f=0,o=e,n=1;no[f][0])&&(f=n);return t(y(e,f-1),y(e,f),y(e,f+1))?!1:(w(e),!0)}function w(e){for(var f=[],o=e.length,n=0;n!==o;n++)f.push(e.pop());for(var n=0;n!==o;n++)e[n]=f[n]}function b(e,f){return u(y(e,f-1),y(e,f),y(e,f+1))}function g(e,f,o){var d,i,t=H,u=I;if(l(y(e,f+1),y(e,f),y(e,o))&&p(y(e,f-1),y(e,f),y(e,o)))return!1;i=c(y(e,f),y(e,o));for(var s=0;s!==e.length;++s)if((s+1)%e.length!==f&&s!==f&&l(y(e,f),y(e,o),y(e,s+1))&&p(y(e,f),y(e,o),y(e,s))&&(t[0]=y(e,f),t[1]=y(e,o),u[0]=y(e,s),u[1]=y(e,s+1),d=n(t,u),c(y(e,f),d)f)for(var i=f;o>=i;i++)d.push(e[i]);else{for(var i=0;o>=i;i++)d.push(e[i]);for(var i=f;i0?k(e,f):[e]}function k(e,f){if(0===f.length)return[e];if(f instanceof Array&&f.length&&f[0]instanceof Array&&2===f[0].length&&f[0][0]instanceof Array){for(var o=[e],n=0;nn;n++)if(d(o[f],o[f+1],o[n],o[n+1]))return!1;for(f=1;fi)return console.warn("quickDecomp: max level ("+i+") reached."),f;for(var G=0;Gv&&(j=v,r=w,q=H))),t(y(E,G+1),y(E,G),y(E,H+1))&&p(y(E,G+1),y(E,G),y(E,H))&&(w=z(y(E,G+1),y(E,G),y(E,H),y(E,H+1)),t(y(E,G-1),y(E,G),w)&&(v=c(E[G],w),g>v&&(g=v,a=w,k=H)));if(q===(k+1)%e.length)w[0]=(r[0]+a[0])/2,w[1]=(r[1]+a[1])/2,n.push(w),k>G?(m(C,E,G,k+1),C.push(w),D.push(w),0!==q&&m(D,E,q,E.length),m(D,E,0,G+1)):(0!==G&&m(C,E,G,E.length),m(C,E,0,k+1),C.push(w),D.push(w),m(D,E,q,G+1));else{if(q>k&&(k+=e.length),h=Number.MAX_VALUE,q>k)return f;for(var H=q;k>=H;++H)l(y(E,G-1),y(E,G),y(E,H))&&p(y(E,G+1),y(E,G),y(E,H))&&(v=c(y(E,G),y(E,H)),h>v&&x(E,G,H)&&(h=v,B=H%e.length));B>G?(m(C,E,G,B+1),0!==B&&m(D,E,B,F.length),m(D,E,0,G+1)):(0!==G&&m(C,E,G,F.length),m(C,E,0,B+1),m(D,E,B,G+1))}return C.length3&&n>=0;--n)s(y(e,n-1),y(e,n),y(e,n+1),f)&&(e.splice(n%e.length,1),o++);return o}function C(e,f){for(var o=e.length-1;o>=1;--o)for(var n=e[o],d=o-1;d>=0;--d)E(n,e[d],f)&&e.splice(o,1)}function D(e,f,o){return o=o||0,Math.abs(e-f)<=o}function E(e,f,o){return D(e[0],f[0],o)&&D(e[1],f[1],o)}f.exports={decomp:h,quickDecomp:A,isSimple:q,removeCollinearPoints:B,removeDuplicatePoints:C,makeCCW:r};var F=[],G=[],H=[],I=[]},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/todo.txt b/todo.txt index 67fd3ac..d759548 100644 --- a/todo.txt +++ b/todo.txt @@ -1,53 +1,16 @@ ******************************************************** NEXT PATCH ************************************************** -new community level: dojo by weird_pusheen +new community levels: + tlinat by Richard0820 + ruins by SiddhUPe -sound-bot: makes phonon waves - - updated tech -drone repair -> von Neumann probe - if a drones ends near a block it will use that block to repair -quantum eraser -> metamaterial absorber: for each mob left alive after you exit a level there is a 17% chance to spawn a power up -uncertainty principle: extended to super balls -aperture: camera zooms in and out along with the skin animation - - balanced tech: -cordyceps: zombies are much smarter, faster, do more damage, and last longer -negative entropy -> self-assembly: 1 heal per 33->25% missing health on each new level -renormalization: 44 -> 46% and +3% JUNK tech to pool -parasitism: 60 -> 83% damage -non-renewables: 67 -> 78% damage -ground state: 200 -> 266 max energy -dark patterns: 17 -> 22% damage and JUNK -eternalism: 30 -> 24% damage -stimulated emission 15 -> 17% duplication -nitinol 30 -> 22% defense - -bug fixes +tech: mass production - tech have +3 choices to spawn ammo, research, or heals *********************************************************** TODO ***************************************************** make a mob similar to slasher because it's just a very well made mob. -sound-bot: makes phonon waves - works with - other bot tech - done? - phonon - no - frequency - no - bound state - no - phase velocity - no - isotropic - no - maybe, but reduce fire rate? - - uncertainty principle - done - propagation - done - amplitude - done - sympathetic resonance - done - mechanical resonance - done - -remove reflection from phonon? - but return it with isotropic? - super-bot: fires super balls tech - only allow 1,2 turrets at time. spawning a new mine removes the oldest mine @@ -61,15 +24,6 @@ tech: after a needle hits a mobs reset your fire CD? 2x damage for each consecutive mob hit? -tech: mass production - add a few selection options to all tech, gun, fields to do something: - this would work similar to the tech that adds a bot themed tech to every tech choice - options - spawn: ammo, heals, research, coupling? - random amounts? - make each option a full tech with images? - - - improve flatland performance? mob non-combat behaviors, like Rain World @@ -1145,7 +1099,7 @@ possible names for tech hypergraph 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 - nonlocal: maybe use for pilot wave + nonlocal, nonlocality: maybe use for pilot wave fine-tuned universe nonperturbative D-branes @@ -1170,6 +1124,7 @@ possible names for tech negative entropy memetics magnetorquers - produce spin by pushing on earth's magnetic field + ******************************************************** CARS IMAGES ********************************************************