diff --git a/.DS_Store b/.DS_Store index c3946eb..582b8e5 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index 73b8760..dd3c909 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -452,7 +452,7 @@ const b = { }, pulse(energy, angle = m.angle) { let best; - let explosionRadius = 1400 * energy + let explosionRadius = 1300 * energy let range = 3000 const path = [{ x: m.pos.x + 20 * Math.cos(angle), @@ -537,7 +537,7 @@ const b = { }; } } - if (best.who) b.explosion(path[1], explosionRadius, true) + if (best.who) b.explosion(path[1], explosionRadius) if (tech.isPulseStun) { const range = 100 + 2000 * energy @@ -661,7 +661,7 @@ const b = { }; } } - if (best.who) b.explosion(path[1], explosionRadius, true) + if (best.who) b.explosion(path[1], explosionRadius) //draw laser beam ctx.beginPath(); diff --git a/js/level.js b/js/level.js index 4f61e6e..dcd6afa 100644 --- a/js/level.js +++ b/js/level.js @@ -12,7 +12,7 @@ const level = { start() { if (level.levelsCleared === 0) { //this code only runs on the first level // simulation.enableConstructMode() //used to build maps in testing mode - // level.difficultyIncrease(25) + // level.difficultyIncrease(125) // simulation.zoomScale = 1000; // simulation.setZoom(); // m.setField("nano-scale manufacturing") @@ -822,9 +822,9 @@ const level = { } //float if (player.velocity.y > 5) player.force.y -= 0.95 * player.mass * simulation.g - const slowY = (player.velocity.y > 0) ? Math.max(0.4, 1 - 0.001 * player.velocity.y * player.velocity.y) : Math.max(0.98, 1 - 0.001 * Math.abs(player.velocity.y)) //down : up + const slowY = (player.velocity.y > 0) ? Math.max(0.8, 1 - 0.002 * player.velocity.y * player.velocity.y) : Math.max(0.98, 1 - 0.001 * Math.abs(player.velocity.y)) //down : up Matter.Body.setVelocity(player, { - x: Math.max(0.6, 1 - 0.07 * Math.abs(player.velocity.x)) * player.velocity.x, + x: Math.max(0.95, 1 - 0.036 * Math.abs(player.velocity.x)) * player.velocity.x, y: slowY * player.velocity.y }); } @@ -1221,7 +1221,7 @@ const level = { }; level.customTopLayer = () => {}; - level.setPosToSpawn(0, -750); //normal spawn + level.setPosToSpawn(0, -475); //normal spawn spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); level.exit.x = 6500; level.exit.y = -230; @@ -1241,7 +1241,11 @@ const level = { spawn.mapRect(-950, 0, 8200, 800); //ground spawn.mapRect(-950, -1200, 800, 1400); //left wall spawn.mapRect(-950, -1800, 8200, 800); //roof - spawn.mapRect(-250, -700, 1000, 900); // shelf + // spawn.mapRect(-250, -700, 1000, 900); // shelf + // spawn.mapRect(-250, -350, 600, 550); + spawn.mapRect(175, -700, 575, 950); + spawn.mapRect(-250, -425, 600, 650); + spawn.mapRect(-250, -1200, 1000, 250); // shelf roof powerUps.spawnStartingPowerUps(600, -800); @@ -1619,6 +1623,8 @@ const level = { spawn.mapRect(300, -375, 50, 225); spawn.bodyRect(312, -150, 25, 140); spawn.mapRect(300, -10, 50, 50); + spawn.mapVertex(1555, 0, "625 0 75 0 200 -100 500 -100"); //entrance ramp + //upper entrance / exit spawn.mapRect(-400, -1050, 750, 50); @@ -1692,16 +1698,22 @@ const level = { //mobs spawn.randomMob(1075, -3500, -0.3); // spawn.randomMob(-75, -3425, 0.2); - spawn.randomMob(1475, -225, -0.3); - spawn.randomMob(2075, -150, -0.2); + // spawn.randomMob(1475, -225, -0.3); + // spawn.randomMob(2075, -150, -0.2); spawn.randomMob(2175, -700, -0.2); spawn.randomMob(-75, -850, -0.1); - spawn.randomMob(1300, -600, -0.1); + // spawn.randomMob(1300, -600, -0.1); spawn.randomMob(550, -3400, 0); spawn.randomMob(0, -1175, 0.5); spawn.randomMob(-75, -1150, 0.5); spawn.randomMob(1075, -625, 0.5); - spawn.randomMob(1725, -575, 0.5); + // spawn.randomMob(1725, -575, 0.5); + spawn.randomMob(800, -3400, -0.3); + spawn.randomMob(1225, -3375, -0.2); + spawn.randomMob(1200, -1125, -0.1); + spawn.randomMob(2050, -950, 0.5); + + if (simulation.difficulty > 40) { spawn.randomMob(2300, -2775, -0.5); spawn.randomMob(600, -925, -0.5); @@ -1842,6 +1854,7 @@ const level = { spawn.mapRect(9300, 2590, 650, 25); spawn.mapRect(9700, 2580, 100, 50); + spawn.randomGroup(1300, 2100, 0.1); spawn.randomMob(8300, 2100, 0.1); spawn.randomSmallMob(2575, -75, 0.1); //entrance @@ -1850,7 +1863,7 @@ const level = { spawn.randomMob(2425, 2150, 0.1); spawn.randomSmallMob(3500, 250, 0.2); spawn.randomMob(3800, 2175, 0.2); - spawn.randomSmallMob(1100, -300, 0.2); //entrance + spawn.randomSmallMob(2500, -275, 0.2); //entrance spawn.randomMob(4450, 2500, 0.2); spawn.randomMob(6350, 2525, 0.2); spawn.randomGroup(9200, 2400, 0.3); @@ -1891,7 +1904,8 @@ const level = { } }; - level.setPosToSpawn(-50, -50); //normal spawn + level.setPosToSpawn(-100, 210); //normal spawn + spawn.mapRect(-150, 240, 100, 30); level.exit.x = -100; level.exit.y = -425; spawn.mapRect(level.exit.x, level.exit.y + 15, 100, 50); //exit bump @@ -1907,14 +1921,13 @@ const level = { document.body.style.backgroundColor = "#dbdcde"; //spawn start building - spawn.mapRect(-300, -800, 50, 800); - spawn.mapRect(-100, -20, 100, 30); + spawn.mapRect(-350, -800, 100, 1100); // spawn.mapRect(-300, -10, 500, 50); spawn.mapRect(150, -510, 50, 365); - spawn.bodyRect(170, -130, 14, 145, 1, spawn.propsFriction); //door to starting room + spawn.bodyRect(170, -140, 20, 163, 1, spawn.propsFriction); //door to starting room + spawn.mapVertex(175, 200, "625 0 300 0 425 -300 500 -300"); //entrance ramp // spawn.mapRect(-300, 0, 1000, 300); //ground - spawn.mapVertex(-18, 145, "625 0 0 0 0 -300 500 -300"); //entrance ramp - spawn.mapRect(-300, 250, 6300, 300); //deeper ground + spawn.mapRect(-350, 250, 6350, 300); //deeper ground spawn.bodyRect(2100, 50, 80, 80); spawn.bodyRect(2000, 50, 60, 60); // spawn.bodyRect(1650, 50, 300, 200); @@ -1923,10 +1936,10 @@ const level = { //exit building // spawn.mapRect(-100, -410, 100, 30); - spawn.mapRect(-300, -800, 500, 50); + spawn.mapRect(-350, -850, 550, 100); spawn.mapRect(150, -800, 50, 110); spawn.bodyRect(170, -690, 14, 180, 1, spawn.propsFriction); //door to exit room - spawn.mapRect(-300, -400, 500, 100); //far left starting ceiling + spawn.mapRect(-300, -400, 500, 150); //far left starting ceiling level.fill.push({ x: -250, y: -400, @@ -2050,10 +2063,10 @@ const level = { spawn.randomMob(5750, 125, 0.4); spawn.randomMob(5900, -1500, 0.4); spawn.randomMob(4700, -800, 0.4); - spawn.randomMob(1400, -400, 0.3); + spawn.randomMob(1400, 200, 0.3); spawn.randomMob(2850, 175, 0.4); spawn.randomMob(2000, -2800, 0.4); - spawn.randomMob(2200, -500, 0.4); + spawn.randomMob(2400, -400, 0.4); spawn.randomMob(4475, -3550, 0.3); spawn.randomGroup(5000, -2150, 1); spawn.randomGroup(3700, -4100, 0.3); @@ -2277,12 +2290,15 @@ const level = { spawn.spawnStairs(3800, 0, 3, 150, 206); //stairs top exit spawn.mapRect(3400, -275, 450, 275); //exit platform + + + spawn.randomSmallMob(2200, -1775); spawn.randomSmallMob(4000, -825); - spawn.randomSmallMob(-350, -2400); + spawn.randomSmallMob(-350, -3400); spawn.randomMob(4250, -1350, 0.8); spawn.randomMob(2550, -1350, 0.8); - spawn.randomMob(1225, -2400, 0.3); + spawn.randomMob(1875, -1075, 0.3); spawn.randomMob(1120, -1200, 0.3); spawn.randomMob(3000, -1150, 0.2); spawn.randomMob(3200, -1150, 0.3); @@ -2291,11 +2307,11 @@ const level = { spawn.randomMob(3600, -1800, 0.1); spawn.randomMob(5200, -100, 0.3); spawn.randomMob(5275, -900, 0.2); - spawn.randomMob(900, -2125, 0.3); + spawn.randomMob(0, -1075, 0.3); spawn.randomGroup(600, -1575, 0); spawn.randomGroup(2225, -1325, 0.4); spawn.randomGroup(4900, -1200, 0); - if (simulation.difficulty > 3) spawn.randomLevelBoss(3200, -2050); + if (simulation.difficulty > 3) spawn.randomLevelBoss(3200, -1900); powerUps.addRerollToLevel() //needs to run after mobs are spawned if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) spawn.randomLevelBoss(2175, -2425); }, @@ -2441,9 +2457,12 @@ const level = { spawn.mapRect(4250, -3700, 50, 300); spawn.mapRect(3700, -3250, 1100, 100); + + spawn.randomGroup(350, -500, 1) spawn.randomSmallMob(-225, 25); - spawn.randomSmallMob(1000, -1100); + spawn.randomSmallMob(2100, -900); + spawn.randomSmallMob(4000, -250); spawn.randomSmallMob(4450, -3000); spawn.randomSmallMob(5600, 100); @@ -2454,7 +2473,8 @@ const level = { spawn.randomMob(3900, -2700, 0.8); spawn.randomMob(3600, -500, 0.8); spawn.randomMob(3400, -200, 0.8); - spawn.randomMob(1650, -1300, 0.7) + // spawn.randomMob(1650, -1300, 0.7) + spawn.randomMob(425, 0, 0.7); spawn.randomMob(4100, -50, 0.7); spawn.randomMob(4100, -50, 0.5); spawn.randomMob(1700, -50, 0.3) @@ -2639,7 +2659,9 @@ const level = { spawn.bodyRect(1425, -1110, 115, 25, 0.9); //block on far left building spawn.bodyRect(1540, -1110, 300, 25, 0.9); //block on far left building - spawn.randomSmallMob(1300, -70); + + spawn.randomMob(-100, -1300, 0.5); + spawn.randomSmallMob(1850, -600); spawn.randomSmallMob(3200, -100); spawn.randomSmallMob(4450, -100); spawn.randomSmallMob(2700, -475); @@ -2653,7 +2675,7 @@ const level = { spawn.randomMob(1690, -2250, 0.25); spawn.randomMob(2200, -600, 0.2); spawn.randomMob(850, -1300, 0.25); - spawn.randomMob(-100, -900, -0.2); + spawn.randomMob(-100, -1700, -0.2); spawn.randomGroup(3700, -1500, 0.4); spawn.randomGroup(1700, -900, 0.4); if (simulation.difficulty > 3) spawn.randomLevelBoss(2600, -2300); @@ -2666,7 +2688,7 @@ const level = { }; level.customTopLayer = () => {}; - level.setPosToSpawn(0, -700); //normal spawn + level.setPosToSpawn(-300, -700); //normal spawn spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); level.exit.x = -4275; level.exit.y = -2805; @@ -2771,9 +2793,12 @@ const level = { spawn.mapRect(-2225, 0, 2475, 150); spawn.mapRect(175, -1000, 75, 1100); - spawn.mapRect(-175, -985, 25, 175); - spawn.bodyRect(-170, -810, 14, 160, 1, spawn.propsFriction); //door to starting room - spawn.mapRect(-600, -650, 825, 50); + // spawn.mapRect(-175, -985, 50, 175); + spawn.mapRect(-600, -1075, 50, 475); + // spawn.bodyRect(-170, -810, 14, 160, 1, spawn.propsFriction); //door to starting room + // spawn.mapRect(-600, -650, 825, 50); + // spawn.mapRect(-600, -1075, 75, 475); + spawn.mapRect(-600, -650, 625, 50); spawn.mapRect(-1300, -650, 500, 50); spawn.mapRect(-175, -250, 425, 300); spawn.bodyRect(-75, -300, 50, 50); @@ -3036,29 +3061,29 @@ const level = { //mobs spawn.randomSmallMob(-1125, 550); - spawn.randomSmallMob(-2325, 800); spawn.randomSmallMob(-2950, -50); + spawn.randomMob(-2025, 175, 0.3); + spawn.randomMob(-2325, 450, 0.3); + spawn.randomMob(-2925, 675, 0.2); + spawn.randomMob(-2700, 300, 0.1); + spawn.randomMob(-2500, 300, 0.1); + spawn.randomMob(-2075, -425, 0.1); + spawn.randomMob(-1550, -725, 0.1); + spawn.randomMob(375, 1100, 0); + spawn.randomMob(-1575, 1100, 0); spawn.randomSmallMob(825, 300); - spawn.randomSmallMob(-900, 825); - spawn.randomMob(-2025, 175, 0.6); - spawn.randomMob(-2325, 450, 0.6); - spawn.randomMob(-2925, 675, 0.5); - spawn.randomMob(-2700, 300, 0.2); - spawn.randomMob(-2500, 300, 0.2); - spawn.randomMob(-2075, -425, 0.2); - spawn.randomMob(-1550, -725, 0.2); - spawn.randomMob(375, 1100, 0.1); - spawn.randomMob(-1425, -100, 0.1); - spawn.randomMob(-800, -750, 0); - spawn.randomMob(400, -350, 0); - spawn.randomMob(650, 1300, 0); - spawn.randomMob(-750, -150, 0); - spawn.randomMob(475, 300, 0); - spawn.randomMob(-75, -700, 0); - spawn.randomMob(900, -200, -0.1); - spawn.randomGroup(-125, 275, -0.2); - spawn.randomGroup(-825, 1000, 0.2); + spawn.randomMob(-800, -1750, 0); + spawn.randomMob(400, -750, -0.1); + spawn.randomMob(650, 1300, -0.1); + spawn.randomMob(-2450, 1050, -0.1); + spawn.randomMob(500, 400, -0.1); + spawn.randomMob(-75, -1700, -0.1); + spawn.randomMob(900, -800, -0.2); + spawn.randomGroup(-75, 1050, -0.1); + spawn.randomGroup(-900, 1000, 0.2); spawn.randomGroup(-1300, -1100, -0.3); + spawn.randomSmallMob(-2325, 800); + spawn.randomSmallMob(-900, 825); if (simulation.difficulty > 3) { if (Math.random() < 0.25) { @@ -3067,9 +3092,8 @@ const level = { spawn.snakeBoss(-1000 + Math.random() * 2500, -1300); //boss snake with head } } - powerUps.addRerollToLevel() //needs to run after mobs are spawned - if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) spawn.randomLevelBoss(300, -800); + powerUps.addRerollToLevel() //needs to run after mobs are spawned }, office() { let button, door @@ -3077,8 +3101,8 @@ const level = { button = level.button(525, 0) door = level.door(1362, -200, 25, 200, 195) level.setPosToSpawn(1375, -1550); //normal spawn - level.exit.x = 3250; - level.exit.y = -530; + level.exit.x = 3288; + level.exit.y = -630; // spawn.randomSmallMob(3550, -550); level.fillBG.push({ x: 3050, @@ -3090,7 +3114,7 @@ const level = { } else { //reverse direction, start in bottom right button = level.button(3800, 0) door = level.door(3012, -200, 25, 200, 195) - level.setPosToSpawn(3250, -550); //normal spawn + level.setPosToSpawn(3337, -650); //normal spawn level.exit.x = 1375; level.exit.y = -1530; // spawn.bodyRect(3655, -650, 40, 150); //door @@ -3103,7 +3127,6 @@ const level = { }); } - level.custom = () => { button.query(); button.draw(); @@ -3122,7 +3145,6 @@ const level = { level.defaultZoom = 1400 simulation.zoomTransition(level.defaultZoom) spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 50); //ground bump wall - spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); document.body.style.backgroundColor = "#e0e5e0"; @@ -3216,19 +3238,22 @@ const level = { spawn.mapRect(3000, -1000, 50, 800); //left wall spawn.mapRect(3000 + 2000 - 50, -1300, 50, 1100); //right wall spawn.mapRect(4150, -600, 350, 150); //table - spawn.mapRect(3650, -1300, 50, 650); //exit wall + spawn.mapRect(3650, -1300, 50, 700); //exit wall spawn.mapRect(3650, -1300, 1350, 50); //exit wall - spawn.bodyRect(3665, -650, 20, 150); //door + spawn.bodyRect(3665, -600, 20, 100); //door + // spawn.mapRect(3150, -550, 300, 75); + // spawn.mapRect(3225, -600, 175, 75); + spawn.mapRect(3150, -550, 375, 75); + spawn.mapRect(3225, -600, 225, 75); spawn.mapRect(3000, -2000 * 0.5, 700, 50); //exit roof spawn.mapRect(3000, -2000 * 0.25, 2000 - 300, 50); //1st floor spawn.spawnStairs(3000 + 2000 - 50, 0, 4, 250, 350, true); //stairs ground - spawn.randomSmallMob(4575, -560, 1); spawn.randomSmallMob(1315, -880, 1); spawn.randomSmallMob(800, -600); - spawn.randomSmallMob(-100, -1600); + // spawn.randomSmallMob(-100, -1600); spawn.randomMob(4100, -225, 0.8); spawn.randomMob(-250, -700, 0.8); spawn.randomMob(4500, -225, 0.15); diff --git a/js/mob.js b/js/mob.js index 0a2a7a0..666355d 100644 --- a/js/mob.js +++ b/js/mob.js @@ -312,7 +312,7 @@ const mobs = { if ( this.distanceToPlayer2() < this.seeAtDistance2 && Matter.Query.ray(map, this.position, this.mPosRange()).length === 0 && - Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 && + // Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 && !m.isCloak ) { this.foundPlayer(); @@ -365,7 +365,7 @@ const mobs = { if ( this.distanceToPlayer2() < this.seeAtDistance2 && Matter.Query.ray(map, this.position, this.mPosRange()).length === 0 && - Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 && + // Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 && !m.isCloak ) { this.foundPlayer(); diff --git a/js/powerup.js b/js/powerup.js index 40e4874..a2b8575 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -16,7 +16,9 @@ const powerUps = { m.setField(index) simulation.makeTextLog(`m.setField("${m.fieldUpgrades[m.fieldMode].name}")`); } else if (type === "tech") { - powerUps.lastTechIndex = index + setTimeout(() => { + powerUps.lastTechIndex = index + }, 100); tech.giveTech(index) simulation.makeTextLog(`tech.giveTech("${tech.tech[index].name}")`); } @@ -342,7 +344,6 @@ const powerUps = { // text += `
  ${tech.tech[choose].name}
${tech.tech[choose].description}
` return choose } - } let text = "" if (!tech.isDeterminism) text += `
` diff --git a/js/spawn.js b/js/spawn.js index a09da2d..6404c45 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -1953,7 +1953,7 @@ const spawn = { if ( this.distanceToPlayer2() < this.seeAtDistance2 && Matter.Query.ray(map, this.position, this.mPosRange()).length === 0 && - Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 && + // Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 && !m.isCloak ) { this.foundPlayer(); @@ -2547,7 +2547,7 @@ const spawn = { spawn.shield(me, x, y, 1); spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random()) - Matter.Body.setDensity(me, 0.008); //extra dense //normal is 0.001 //makes effective life much larger + Matter.Body.setDensity(me, 0.004); //extra dense //normal is 0.001 //makes effective life much larger me.onDeath = function() { powerUps.spawnBossPowerUp(this.position.x, this.position.y) // this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed diff --git a/js/tech.js b/js/tech.js index f4230f2..a65b9b0 100644 --- a/js/tech.js +++ b/js/tech.js @@ -1392,9 +1392,7 @@ } }, { name: "flip-flop", - description: `unlock advanced tech that runs if flip-flop is ON
flip-flop toggles ON and OFF after a collision`, - // description: `if flip-flop is ON, collisions set it to OFF - //
if flip-flop is OFF, collisions set it to ON`, + description: `flip-flop toggles ON and OFF after a collision
unlock advanced tech that runs if ON`, nameInfo: "", addNameInfo() { setTimeout(function() { @@ -2742,7 +2740,7 @@ { name: "backward induction", - description: "gain all the tech options you didn't choose
from your previous tech selection", + description: "choose all the tech options you didn't choose
from your previous tech selection", maxCount: 1, count: 0, frequency: 1, @@ -2760,6 +2758,7 @@ const index = powerUps.tech.choiceLog[i] if (powerUps.tech.choiceLog[i] !== powerUps.lastTechIndex && tech.tech[index].count < tech.tech[index].maxCount && tech.tech[index].allowed()) { tech.giveTech(index) + simulation.makeTextLog(`tech.giveTech("${tech.tech[index].name}") // backward induction`); } } }, diff --git a/todo.txt b/todo.txt index 0e2b018..29fc430 100644 --- a/todo.txt +++ b/todo.txt @@ -1,8 +1,10 @@ ******************************************************** NEXT PATCH ******************************************************** -more bug fixes (many worlds, disintegrated armament) +more bug fixes (pulse color, backwards induction giving too many tech) + +mobs can now see through blocks + mobs spawns and level spawns have been adjusted to prevent getting zonked at the start of a level -tech: backward induction - gain all the tech options you didn't choose from your previous tech selection menu ******************************************************** BUGS ******************************************************** @@ -35,23 +37,27 @@ fix door.isOpen actually meaning isClosed? ******************************************************** TODO ******************************************************** -change the color of heals for ergodicity - +have junk tech drop frequency to 0 after showing up once + how to communicate that to player? + console message + look into improving mouse lag with pointer lock? https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API https://www.vsynctester.com/game.html https://news.ycombinator.com/item?id=26530272 -clarify dielectric polarization text / graphics - -tech - gain all the tech you didn't take on the last selection menu - normally 2, but synergy with cardinality - 4, and 0 with determinism - frequency to 1 - should blocks block mob vision? - mobs will attack player in the starting room though... Matter.Query.ray(map, this.position, this.mPosRange()).length === 0 && Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 && + only negative is mobs will attack player in the starting room + maybe make all doors to spawns somehow block vision + maybe start in cloaking mode + disable it a few cycles after level loads? + or disable when player moves? + ***maybe just clear spawns away from the starting room*** + ok go through each map and find issues on each map + **but first test he game with no block blocking vision** + mob vision: look at player history build a new type of attraction for mobs