images removed

images have been disabled
  I think they don't fit stylistically

 new power up: level WARP
  it shows up when you enter testing mode on the initial level
interferometer horizontal laser now moves with the elevator
LaunchSite community map updated

some minor bug fixes
This commit is contained in:
landgreen
2024-10-07 19:21:14 -07:00
parent a47ef97dbc
commit a8c6c0ea0e
6 changed files with 216 additions and 139 deletions

View File

@@ -53,9 +53,9 @@
<details id = 'settings-details'>
<summary>settings</summary>
<div style="line-height: 150%;" class="details-div">
<input onclick="build.showImages('settings')" type="checkbox" id="hide-images" name="hide-images" style="width:17px; height:17px;">
<!-- <input onclick="build.showImages('settings')" type="checkbox" id="hide-images" name="hide-images" style="width:17px; height:17px;">
<label for="hide-images" title="hide images for fields, guns, and tech">hide images</label>
<br>
<br> -->
<input onclick="build.hideHUD('settings')" type="checkbox" id="hide-hud" name="hide-hud" style="width:17px; height:17px;">
<label for="hide-hud" title="hide: tech, damage taken, damage, in game console, new level animation">minimal HUD</label>
<br>

View File

@@ -1830,8 +1830,9 @@ if (localSettings.isAllowed && !localSettings.isEmpty) {
localSettings.loreCount = 0; //this sets what conversation is heard
if (localSettings.isAllowed) localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
}
if (localSettings.isHideImages === undefined) localSettings.isHideImages = true //default to hide images
document.getElementById("hide-images").checked = localSettings.isHideImages
// if (localSettings.isHideImages === undefined) localSettings.isHideImages = true //default to hide images
// document.getElementById("hide-images").checked = localSettings.isHideImages
localSettings.isHideImages = true //no images
if (localSettings.isHideHUD === undefined) localSettings.isHideHUD = true
document.getElementById("hide-hud").checked = localSettings.isHideHUD
@@ -1876,7 +1877,7 @@ if (localSettings.isAllowed && !localSettings.isEmpty) {
if (localSettings.isAllowed) localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
document.getElementById("community-maps").checked = localSettings.isCommunityMaps
simulation.isCommunityMaps = localSettings.isCommunityMaps
document.getElementById("hide-images").checked = localSettings.isHideImages
// document.getElementById("hide-images").checked = localSettings.isHideImages
document.getElementById("fps-select").value = localSettings.fpsCapDefault
document.getElementById("banned").value = localSettings.banList
}

View File

@@ -8,8 +8,8 @@ const level = {
defaultZoom: 1400,
onLevel: -1,
levelsCleared: 0,
//see level.populateLevels: (initial, ... , (reservoir, factory, or gravityInterferometer), reactor, ... , subway, final) added later
playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock", "towers", "flocculation", "gravityObservatory"],
uniqueLevels: ["initial", "reservoir", "factory", "interferometer", "reactor", "subway", "final"], //see level.populateLevels: (initial, ... , (reservoir, factory, or interferometer), reactor, ... , subway, final) added later
playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock", "towers", "flocculation", "gravitron"],
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", "tlinat", "ruins", "ace", "crimsonTowers", "LaunchSite", "shipwreck", "unchartedCave", "dojo", "arena", "soft", "flappyGon", "rings", "trial"],
trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon"],
levels: [],
@@ -56,10 +56,10 @@ const level = {
// requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("field coupling") });
// for (let i = 0; i < 1; i++) tech.giveTech("interest")
// m.lastKillCycle = m.cycle
// for (let i = 0; i < 4; i++) powerUps.directSpawn(450, -50, "tech");
// for (let i = 0; i < 1; i++) powerUps.directSpawn(450, -50, "warp");
// for (let i = 0; i < 7; i++) powerUps.directSpawn(m.pos.x + 200, m.pos.y - 250, "research", false);
// spawn.bodyRect(575, -700, 150, 150); //block mob line of site on testing
// level.gravityInterferometer();
// level.interferometer();
level[simulation.isTraining ? "walk" : "initial"]() //normal starting level **************************************************
@@ -778,8 +778,9 @@ const level = {
}
level.levels = shuffle(level.levels); //shuffles order of maps with seeded random
level.levels.length = 9 //remove any extra levels past 9
pick = ["gravityInterferometer", "factory", "reservoir"]
pick = ["interferometer", "factory", "reservoir"]
level.levels.splice(Math.floor(Math.seededRandom(level.levels.length * 0.6, level.levels.length)), 0, pick[Math.floor(Math.random() * pick.length)]); //add level to the back half of the randomized levels list
level.levels.splice(Math.floor(Math.seededRandom(level.levels.length * 0.6, level.levels.length)), 0, "reactor"); //add level to the back half of the randomized levels list
if (!build.isExperimentSelection || (build.hasExperimentalMode && !simulation.isCheating)) { //experimental mode is endless, unless you only have an experiment Tech
level.levels.unshift("initial"); //add level to the start of the randomized levels list
@@ -3041,7 +3042,13 @@ const level = {
wires.lineTo(2355, -690)
wires.lineTo(2600, -690)
let isSpawnedWarp = false
level.custom = () => {
if (!isSpawnedWarp && simulation.testing) {
isSpawnedWarp = true
powerUps.directSpawn(m.pos.x, -900, "warp")
// powerUps.directSpawn(2100, -1200, "warp")
}
//working on a message using text
// ctx.font = "50px Arial";
// ctx.fillStyle = "rgba(0,0,0,0.3)"
@@ -7049,7 +7056,7 @@ const level = {
}
},
gravityInterferometer() {
interferometer() {
level.isVerticalFLipLevel = true
mobs.maxMobBody = 20 //normally 40, but set to 10 to avoid too much clutter
simulation.fallHeight = 4000
@@ -7084,8 +7091,8 @@ const level = {
frictionAir: 1,
classType: "body",
holdX: 1762,
maxHeight: -1600,
minHeight: 100,
maxHeight: -1580,
minHeight: 130,
verticalForce: 0.03,
isUp: false,
drag: 0.01,
@@ -7182,13 +7189,13 @@ const level = {
lasers.push(level.laser({ x: -100, y: 1990 }, { x: -100, y: -2000 })) ////x, y, width, height, damage = 0.002)
spawn.mapRect(-112, 1990, 25, 25); //laser entrance
balance.push(level.rotor(-1250, 1700, 400, 25, 0.01, 0, 0.5)) //balance(x, y, width, height, density = 0.001, angle = 0, frictionAir = 0.001, angularVelocity = 0, rotationForce = 0.0005) {
balance.push(level.rotor(-750, 1700, 400, 25, 0.01, Math.PI / 2, 0.5))
balance.push(level.rotor(-275, 1650, 550, 32, 0.01, 0, 0.5))
balance.push(level.rotor(-1250, 1755, 400, 25, 0.01, 0, 0.5)) //balance(x, y, width, height, density = 0.001, angle = 0, frictionAir = 0.001, angularVelocity = 0, rotationForce = 0.0005) {
balance.push(level.rotor(-750, 1755, 400, 25, 0.01, Math.PI / 2, 0.5))
balance.push(level.rotor(-275, 1675, 550, 32, 0.01, 0, 0.5))
lasers.push(level.laser({ x: -1625, y: -850 }, { x: 1980, y: -850 })) ////x, y, width, height, damage = 0.002)
spawn.mapRect(1980, -862, 25, 25); //laser entrance
balance.push(level.rotor(1000, -910, 550, 32, 0.01, 0, 0.5))
// spawn.mapRect(1980, -862, 25, 25); //laser entrance
// balance.push(level.rotor(1000, -910, 550, 32, 0.01, 0, 0.5))
//left side
//level entrance
@@ -7206,7 +7213,6 @@ const level = {
spawn.mapVertex(-850, 840, "-225 -475 0 -500 225 -475 225 475 -225 475");
spawn.mapVertex(-350, 840, "-225 -475 0 -500 225 -475 225 475 -225 475");
//lower right side
//far right wall ledges
spawn.mapRect(1925, -1700, 200, 200);
@@ -7233,14 +7239,12 @@ const level = {
spawn.mapRect(475, 1987, 550, 50);
//ceiling zone
spawn.mapRect(1200, -1625, 400, 25);
spawn.mapRect(-75, -1625, 1075, 25);
spawn.mapRect(1200, -1600, 400, 25);
spawn.mapRect(-75, -1725, 1075, 25);
spawn.mapRect(-575, -1625, 450, 25);
spawn.mapRect(-1075, -1850, 450, 25);
spawn.mapRect(325, -1825, 575, 25);
spawn.mapRect(-1075, -1425, 450, 25);
spawn.mapRect(-1675, -1588, 550, 25);
}
let buildVerticalFLippedMap = function () { // flip Y with this -> spawn.mapRect(x, -y - h, w, h);
buttons.push(level.button(-1895, 1600, 126, true, true, "hsl(330, 100%, 50%)"))
@@ -7267,14 +7271,13 @@ const level = {
lasers.push(level.laser({ x: -100, y: -1990 }, { x: -100, y: 2000 })) ////x, y, width, height, damage = 0.002)
spawn.mapRect(-112, -1990 - 25, 25, 25); //laser entrance
balance.push(level.rotor(-1250, -1700 - 25, 400, 25, 0.01, 0, 0.5)) //balance(x, y, width, height, density = 0.001, angle = 0, frictionAir = 0.001, angularVelocity = 0, rotationForce = 0.0005) {
balance.push(level.rotor(-750, -1700 - 25, 400, 25, 0.01, Math.PI / 2, 0.5))
balance.push(level.rotor(-250, -1650 - 32, 500, 32, 0.01, 0, 0.5))
balance.push(level.rotor(-1250, -1755 - 25, 400, 25, 0.01, 0, 0.5)) //balance(x, y, width, height, density = 0.001, angle = 0, frictionAir = 0.001, angularVelocity = 0, rotationForce = 0.0005) {
balance.push(level.rotor(-750, -1755 - 25, 400, 25, 0.01, Math.PI / 2, 0.5))
balance.push(level.rotor(-250, -1675 - 32, 500, 32, 0.01, 0, 0.5))
lasers.push(level.laser({ x: -1625, y: 850 }, { x: 1980, y: 850 })) ////x, y, width, height, damage = 0.002)
spawn.mapRect(1980, 862 - 25, 25, 25); //laser entrance
balance.push(level.rotor(1000, 910 - 32, 550, 32, 0.01, 0, 0.5))
// spawn.mapRect(1980, 862 - 25, 25, 25); //laser entrance
// balance.push(level.rotor(1000, 910 - 32, 550, 32, 0.01, 0, 0.5))
//left side
//level entrance
@@ -7313,11 +7316,11 @@ const level = {
spawn.mapRect(475, -1987 - 50, 550, 50);
//ceiling zone
spawn.mapRect(1200, 1625 - 25, 400, 25);
spawn.mapRect(-75, 1625 - 25, 1075, 25);
spawn.mapRect(1200, 1575, 400, 25);
spawn.mapRect(-75, 1700, 1075, 25);
spawn.mapRect(-575, 1625 - 25, 450, 25);
spawn.mapRect(-1075, 1850 - 25, 450, 25);
spawn.mapRect(325, 1825 - 25, 575, 25);
spawn.mapRect(-1075, 1425 - 25, 450, 25);
spawn.mapRect(-1675, 1588 - 25, 550, 25);
}
@@ -7386,6 +7389,10 @@ const level = {
buildNormalMap()
level.custom = () => {
elevator.move()
// console.log(elevator)
lasers[lasers.length - 1].look.y = elevator.position.y
lasers[lasers.length - 1].position.y = elevator.position.y
for (let i = 0; i < buttons.length; i++) {
buttons[i].draw()
if (buttons[i].isUp && !isFlipping) {
@@ -7500,13 +7507,17 @@ const level = {
ctx.fillRect(-2025, 2025 - 450, 400, 450);
//shadows
ctx.fillStyle = "rgba(0,0,0,0.08)"
ctx.fillRect(-2025, -2075, 900, 775);
ctx.fillRect(-1075, -2025, 450, 725);
ctx.fillRect(-575, -2025, 450, 725);
ctx.fillRect(175, -250 - 725, 325, 725);
ctx.fillRect(650, -350 - 975, 475, 975);
ctx.fillRect(375, -1650 - 400, 750, 400);
//ceiling
ctx.fillStyle = "rgba(0,0,0,0.04)"
ctx.fillRect(1225, 2025 - 425, 350, 425);
ctx.fillRect(-50, 2025 - 425, 1025, 425);
ctx.fillRect(1225, 2025 - 450, 350, 450);
ctx.fillRect(-50, 1700, 1025, 325);
ctx.fillRect(-550, 2025 - 425, 400, 425);
ctx.fillRect(-1050, 2025 - 625, 400, 625);
ctx.fillRect(-1625, 2025 - 450, 475, 450);
@@ -7514,13 +7525,17 @@ const level = {
ctx.fillRect(-2025, -2025, 400, 450);
//shadows
ctx.fillStyle = "rgba(0,0,0,0.08)"
ctx.fillRect(-2025, 1300, 900, 775);
ctx.fillRect(-1075, 1300, 450, 725);
ctx.fillRect(-575, 1300, 450, 725);
ctx.fillRect(175, 250, 325, 725);
ctx.fillRect(650, 350, 475, 975);
ctx.fillRect(375, 1650, 750, 400);
//ceiling
ctx.fillStyle = "rgba(0,0,0,0.04)"
ctx.fillRect(1225, -2025, 350, 425);
ctx.fillRect(-50, -2025, 1025, 425);
ctx.fillRect(1225, -2025, 350, 450);
ctx.fillRect(-50, -2025, 1025, 325);
ctx.fillRect(-550, -2025, 400, 425);
ctx.fillRect(-1050, -2025, 400, 625);
ctx.fillRect(-1625, -2025, 475, 450);
@@ -7569,7 +7584,7 @@ const level = {
spawn.randomLevelBoss(-875, -200);
powerUps.addResearchToLevel() //needs to run after mobs are spawned
},
gravityObservatory() {
gravitron() {
mobs.maxMobBody = 25 //normally 40, but set lower to avoid too much clutter
level.isVerticalFLipLevel = true
simulation.fallHeight = 4000
@@ -7778,13 +7793,13 @@ const level = {
buildNormalMap()
level.custom = () => {
//stuff floats near buttons
if ((player.position.x > -3505 && player.position.x < -3075) ||
(player.position.x > 0 && player.position.x < 425) ||
(player.position.x > 3575)) {
if (player.position.y > 0) {
player.force.y -= 0.8 * simulation.g * player.mass
}
}
// if ((player.position.x > -3505 && player.position.x < -3075) ||
// (player.position.x > 0 && player.position.x < 425) ||
// (player.position.x > 3575)) {
// if (player.position.y > 0) {
// player.force.y -= 0.8 * simulation.g * player.mass
// }
// }
for (let i = 0; i < body.length; i++) {
if ((body[i].position.x > -3505 && body[i].position.x < -3075) ||
(body[i].position.x > 0 && body[i].position.x < 425) ||
@@ -31644,6 +31659,7 @@ const level = {
level.setPosToSpawn(0, -50); //normal spawn
const elevatortoggle = level.toggle(13650, 3000)
let newMobsSpawned = false;
let leverTimer = 0;
level.exit.x = 11900;
level.exit.y = -800;
const boost1 = level.boost(12050, 200, 1000)
@@ -31670,6 +31686,24 @@ const level = {
powerUps.spawn(8650, 2000, "ammo")
level.custom = () => {
ctx.fillStyle = `rgba(68, 68, 68)`
ctx.fillRect(11450, 700, 50, 125);
ctx.fillRect(11425, 750, 75, 75);
if (newMobsSpawned) {
// ctx.fillStyle = `#00FFFF22`;
ctx.fillStyle = `rgba(0, 255, 255, ${leverTimer / 5})`
ctx.fillRect(11500, 700, 450, 2375 + 100)
ctx.fill()
ctx.fillStyle = `#00f2ff`
ctx.fillRect(11500 + Math.floor(Math.random() * 450), 700, 5, 2375 + 100)
ctx.fillRect(11500 + Math.floor(Math.random() * 450), 700, 5, 2375 + 100)
ctx.fill()
if (m.pos.x > 11500 && m.pos.x < 11950 && m.pos.y > 800 && m.pos.y < 2700) {
player.force.y -= m.mass * simulation.g + (input.down ? 0 : 0.012 * 4);
}
}
//light rain
ctx.beginPath()
ctx.fillStyle = "rgba(30,150,117,255)"
@@ -31687,8 +31721,8 @@ const level = {
elevatortoggle.query();
if (elevatortoggle.isOn) {
elevator1.move();
if (newMobsSpawned == false) {
leverTimer += 0.0125;
//last room mobs
spawn.randomSmallMob(11723.3, -127.5);
spawn.randomSmallMob(10525.2, 727.5);
@@ -31698,9 +31732,12 @@ const level = {
spawn.randomGroup(11066.3, 560.4, 0.4);
newMobsSpawned = true;
}
};
if (leverTimer > 0 && leverTimer < 1) {
leverTimer += 0.0125
}
ctx.fillStyle = "rgba(0,0,0,0.3)"
ctx.beginPath()
ctx.moveTo(5150, 1050)
@@ -31730,6 +31767,7 @@ const level = {
ctx.lineTo(12050, -280)
ctx.lineTo(11950, -280)
ctx.fill()
//ladder
ctx.fillRect(12065, -770, 20, 870)
ctx.fillRect(12115, -770, 20, 870)
@@ -31749,11 +31787,6 @@ const level = {
ctx.fillRect(12055, 0, 90, 15)
ctx.fillRect(12055, 60, 90, 15)
//elevator line
ctx.fillStyle = "rgba(0,0,0,0.8)"
ctx.fillRect(11724, 800, 1, 3500)
//post rocket shadows
ctx.fillStyle = "rgba(0,0,0,0.3)"
ctx.fillRect(10000, 510, 50, 700)
@@ -31773,6 +31806,7 @@ const level = {
ctx.lineTo(5700, 2300)
ctx.lineTo(5884.8, 380.1)
ctx.fill()
//boss room shadow
ctx.fillRect(11950, 2000, 5000, 1100)
ctx.fillRect(12150, -25, 3000, 250)
@@ -31781,7 +31815,6 @@ const level = {
level.exit.drawAndCheck();
level.enter.draw();
}
level.customTopLayer = () => {
@@ -31790,19 +31823,16 @@ const level = {
} else {
ctx.fillStyle = `rgba(68, 68, 68, 68)`
}
ctx.fillRect(12150, -30, 1600, 1000)
mover.draw();
//vanishing platform
vanisher.query();
//rocket
ctx.fillStyle = "rgba(202,88,0,1)"
ctx.fillRect(6800, -1000, 600, 2800)
//ctx.beginPath()
ctx.beginPath()
ctx.moveTo(7400, -998)//base right
ctx.lineTo(7350, -1400)//1/3rd up
@@ -31819,18 +31849,21 @@ const level = {
ctx.fillRect(6800, 1700, 600, 300)
ctx.fillRect(6450, -400, 250, 2100)
ctx.fillRect(7500, -400, 250, 2100)
//right engine
ctx.beginPath()
ctx.moveTo(6450, -398)//base right
ctx.lineTo(6575, -900)//peak
ctx.lineTo(6700, -398)//baseleft
ctx.fill()
//right engine
ctx.beginPath()
ctx.moveTo(7500, -398)//base right
ctx.lineTo(7625, -900)//peak
ctx.lineTo(7750, -398)//baseleft
ctx.fill()
//right wing
ctx.beginPath()
ctx.moveTo(6910, 450)
@@ -31839,6 +31872,7 @@ const level = {
ctx.lineTo(6250, 1600)
ctx.lineTo(6780, 1030)
ctx.fill()
//left wing
ctx.beginPath()
ctx.moveTo((7100 - 6910) + 7100, 450)
@@ -31859,8 +31893,8 @@ const level = {
ctx.lineTo(6900, 2)//baseleft
ctx.fill()
ctx.fillStyle = "rgba(0,0,0,1)"
//right wing outline
ctx.fillStyle = "rgba(0,0,0,1)"
ctx.beginPath()
ctx.moveTo((7100 - 6250) + 7100, 1700)
ctx.lineTo((7100 - 6250) + 7100, 1600)
@@ -31869,6 +31903,7 @@ const level = {
ctx.lineTo((7100 - 6800) + 7100, 1030)
ctx.lineTo((7100 - 6290) + 7100, 1600)
ctx.fill()
//left wing outline
ctx.beginPath()
ctx.moveTo(6250, 1700)
@@ -31878,16 +31913,24 @@ const level = {
ctx.lineTo(6800, 1030)
ctx.lineTo(6290, 1600)
ctx.fill()
ctx.fillRect(6800, 2000, 600, 50)
ctx.fillRect(6850, 2050, 500, 150)
//light
if (elevatortoggle.isOn) {
ctx.fillStyle = `rgba(242, 255, 0, ${3 * Math.sqrt(leverTimer) / 10})`
ctx.beginPath()
ctx.moveTo(13070, 2012)
ctx.lineTo(12930, 2012)
ctx.lineTo(12230, 2700)
ctx.lineTo(13770, 2700)
ctx.fill()
}
//shadows
ctx.fillStyle = "rgba(0,0,0,0.3)"
//ctx.fillRect(-272, -580, 1700, 600)
ctx.beginPath()
ctx.moveTo(1800, -400)
ctx.lineTo(2500, 300)
@@ -31901,16 +31944,10 @@ const level = {
ctx.lineTo(1522.9, 2431.8)
ctx.lineTo(983.5, 887.3)
ctx.fill()
//ctx.rect(6800, 0, 600, 1800)
//move elevator
//elevator1.move();
//elevator2.move();
};
//GEOMETRY
//vanishing platform
var vanisher = level.vanish(10250, 201, 500, 20);
@@ -31925,20 +31962,14 @@ const level = {
spawn.mapRect(9500, -1500, 500, 2300);
//-9000, +2000
spawn.mapRect(2500, 0, 3200, 500);
spawn.mapRect(5700, 0, 500, 2300);
spawn.mapRect(1800, 1100, 800, 2600);
spawn.mapRect(2600, 1660, 1800, 2040);
spawn.mapRect(1800, -495, 200, 100);
spawn.mapVertex(2400, -230, "0 10 900 510 800 510 750 510 0 110");
//stairs
spawn.mapRect(2600, 1150, 50, 550);
spawn.mapRect(2650, 1200, 50, 500);
spawn.mapRect(2700, 1250, 50, 450);
@@ -31956,10 +31987,8 @@ const level = {
spawn.mapRect(4685, 1300, 50, 550);
spawn.mapRect(4400, 2000, 550, 50);
spawn.mapRect(5150, 1000, 550, 50);
spawn.mapVertex(5500, 1550, "0 0 -500 600 100 0 -400 600");
//second room
spawn.mapRect(8000, 0, 1500, 2300);
spawn.mapRect(6200, 2200, 1800, 100);
@@ -31980,6 +32009,9 @@ const level = {
spawn.mapRect(10900, 2050, 400, 50);
spawn.mapRect(10950, 2000, 550, 700);
//light
spawn.mapRect(12925, 2000, 150, 12);
//roof over stairs
spawn.mapRect(9500, 1200, 1000, 500);
spawn.mapRect(9500, 2200, 500, 100);
@@ -32005,10 +32037,9 @@ const level = {
spawn.mapRect(11800, -1500, 350, 400);
spawn.mapRect(12150, -1500, 3000, 1500);
spawn.mapRect(13700, 0, 2000, 800);
spawn.mapRect(13200, 550, 50, 300);
//MOBS
//mobs in first room
@@ -32024,9 +32055,6 @@ const level = {
spawn.randomMob(13381.7, 2437.2, 0.8);
spawn.randomGroup(10472.4, 2079.0, 0.4);
//boss room
spawn.randomLevelBoss(12786, 2461, ["launcherBoss", "laserTargetingBoss", "blinkBoss", "streamBoss", "historyBoss", "grenadierBoss", "blockBoss", "revolutionBoss", "slashBoss"]);
spawn.mapRect(13500, 3000, 500, 400);
@@ -32035,11 +32063,6 @@ const level = {
//extra boss
spawn.randomLevelBoss(12808.8, 527.0, ["blinkBoss"]);
//elavators
const elevator1 = level.elevator(11500, 2680, 450, 20, 800, 0.0025, { up: 0.1, down: 0.2 }) //x, y, width, height, maxHeight, force = 0.003, friction = { up: 0.01, down: 0.2 }) {
//const elevator2 = level.elevator(11500, 1821, 20, 675, 1121, 0.0025, { up: 0.1, down: 0.2 }) //x, y, width, height, maxHeight, force = 0.003, friction = { up: 0.01, down: 0.2 }) {
//const elevator1 = level.elevator(-1625, -90, 310, 800, -2000, 0.0025, { up: 0.1, down: 0.2 }) //x, y, width, height, maxHeight, force = 0.003, friction = { up: 0.01, down: 0.2 }) {
@@ -32053,6 +32076,7 @@ const level = {
// if (simulation.difficulty > 1) spawn.randomLevelBoss(2200, -1300);
// spawn.secondaryBossChance(100, -1500)
powerUps.addResearchToLevel() //needs to run after mobs are spawned
},
shipwreck() {
simulation.inGameConsole(`<strong>shipwreck</strong> by <span class='color-var'>3xionDev</span>`);

View File

@@ -373,8 +373,9 @@ const powerUps = {
document.getElementById("choose-grid").classList.remove('choose-grid');
document.getElementById("choose-grid").style.gridTemplateColumns = "800px"//adjust this to increase the width of the whole menu, but mostly the center column
let lore = localSettings.loreCount > 0 ? "lore.unlockTesting() //press T to enter testing" : ""
let text = `<div class="grid-container" style = "font-size:1rem;"><pre> <strong>//console commands</strong>
let text = `<div class="grid-container" style = "font-size:1rem;padding: 0px;"><pre> <strong>//console commands</strong>
powerUps.instructions.effect() //reproduce this message
powerUps.warp.effect() //warp to any level
tech.giveTech("name") //replace "name" with tech name
m.setField("name") //standing wave perfect diamagnetism negative mass molecular assembler plasma torch time dilation metamaterial cloaking pilot wave wormhole grappling hook
b.giveGuns("name") //nail gun shotgun super balls wave missiles grenades spores drones foam harpoon mine laser
@@ -386,14 +387,18 @@ const powerUps = {
m.maxEnergy = 1 //set max energy
simulation.enableConstructMode() //press T to build with mouse
${lore}
powerUps.spawn(m.pos.x, m.pos.y, "name") //tech gun field heal ammo research coupling boost instructions entanglement
Matter.Body.setPosition(player, simulation.mouseInGame);
spawn.bodyRect(simulation.mouseInGame.x, simulation.mouseInGame.y, 50, 50)
spawn.randomLevelBoss(simulation.mouseInGame.x, simulation.mouseInGame.y)
<strong>chrome</strong> <strong>firefox</strong>
spawn.randomLevelBoss(simulation.mouseInGame.x, simulation.mouseInGame.y)
powerUps.spawn(m.pos.x, m.pos.y, "name") //tech gun field heal ammo research coupling boost instructions entanglement
//this URL downloads newest version of n-gon
https://codeload.github.com/landgreen/n-gon/zip/refs/heads/master
<strong>chrome</strong> <strong>firefox</strong>
<strong>Win/Linux:</strong> Ctrl + Shift + J Ctrl + Shift + J
<strong>Mac:</strong> Cmd + Option + J Cmd + Shift + J</pre></div>
<div class="choose-grid-module" id="exit" style="text-align: center;font-size: 1.3rem;">exit</div>`
<strong>Mac:</strong> Cmd + Option + J Cmd + Shift + J</pre></div><div class="choose-grid-module" id="exit" style="text-align: center;font-size: 1.3rem;">exit</div>`
document.getElementById("choose-grid").innerHTML = text
//show level info
document.getElementById("choose-grid").style.opacity = "1"
@@ -413,6 +418,77 @@ const powerUps = {
});
},
},
warp: {
name: "warp",
color: "rgb(110,155,160)",
size() {
return 30
},
load(name) {
level.levels[level.onLevel + 1] = name
powerUps.warp.exit()
level.nextLevel();
// simulation.clearNow = true
},
exit() {
level.unPause()
document.body.style.cursor = "none";
//reset hide image style
if (localSettings.isHideImages) {
document.getElementById("choose-grid").classList.add('choose-grid-no-images');
document.getElementById("choose-grid").classList.remove('choose-grid');
} else {
document.getElementById("choose-grid").classList.add('choose-grid');
document.getElementById("choose-grid").classList.remove('choose-grid-no-images');
}
},
effect() {
requestAnimationFrame(() => { //add a background behind the power up menu
ctx.fillStyle = `rgba(150,150,150,0.9)`;
ctx.fillRect(0, 0, canvas.width, canvas.height);
});
powerUps.animatePowerUpGrab('rgba(0, 0, 0,0.6)')
if (!simulation.paused) {
simulation.paused = true;
simulation.isChoosing = true; //stops p from un pausing on key down
document.body.style.cursor = "auto";
document.getElementById("choose-grid").style.pointerEvents = "auto";
document.getElementById("choose-grid").style.transitionDuration = "0s";
}
//build level info
document.getElementById("choose-grid").classList.add('choose-grid-no-images');
document.getElementById("choose-grid").classList.remove('choose-grid');
document.getElementById("choose-grid").style.gridTemplateColumns = "200px"//adjust this to increase the width of the whole menu, but mostly the center column
let levelChoices = `<div class="choose-grid-module" style="font-size: 1.5rem;color:rgb(110,155,160);text-align:center;"><strong>WARP</strong></div>`
levelChoices += `<div class="choose-grid-module" style="font-size: 1rem;color:rgb(110,155,160);background-color:#444;text-align:center;">level.uniqueLevels</div>`
for (let i = 0; i < level.uniqueLevels.length; i++) {
levelChoices += `<div class="choose-grid-module" style="font-size: 1rem;padding-left:5px;" onclick="powerUps.warp.load('${level.uniqueLevels[i]}')">${level.uniqueLevels[i]}</div>` //id="uniqueLevels-warp-${i}"
}
levelChoices += `<div class="choose-grid-module" style="color:rgb(110,155,160);background-color:#444;text-align:center;">level.playableLevels</div>`
for (let i = 0; i < level.playableLevels.length; i++) {
levelChoices += `<div class="choose-grid-module" style="padding-left:5px;" onclick="powerUps.warp.load('${level.playableLevels[i]}')">${level.playableLevels[i]}</div>`
}
levelChoices += `<div class="choose-grid-module" style="color:rgb(110,155,160);background-color:#444;text-align:center;">level.communityLevels</div>`
for (let i = 0; i < level.communityLevels.length; i++) {
levelChoices += `<div class="choose-grid-module" style="padding-left:5px;" onclick="powerUps.warp.load('${level.communityLevels[i]}')">${level.communityLevels[i]}</div>`
}
levelChoices += `<div class="choose-grid-module" style="color:rgb(110,155,160);background-color:#444;text-align:center;">level.trainingLevels</div>`
for (let i = 0; i < level.trainingLevels.length; i++) {
levelChoices += `<div class="choose-grid-module" style="padding-left:5px;" onclick="powerUps.warp.load('${level.trainingLevels[i]}')">${level.trainingLevels[i]}</div>`
}
let text = `${levelChoices} <div class="choose-grid-module" id="exit" style="font-size: 1.4rem;color:rgb(110,155,160);text-align:right;padding-right:5px;"><strong>exit</strong></div>`
document.getElementById("choose-grid").innerHTML = text
//show level info
document.getElementById("choose-grid").style.opacity = "1"
document.getElementById("choose-grid").style.transitionDuration = "0.3s"; //how long is the fade in on
document.getElementById("choose-grid").style.visibility = "visible"
document.getElementById("exit").addEventListener("click", () => {
powerUps.warp.exit()
});
},
},
difficulty: {
name: "difficulty",
color: "#000",

View File

@@ -1560,7 +1560,7 @@ const tech = {
{
name: "enthalpy",
descriptionFunction() {
return `after mobs <strong>die</strong><br>they have an <strong>8%</strong> chance to spawn ${powerUps.orb.heal(1)}`
return `<strong>8%</strong> chance to spawn ${powerUps.orb.heal(1)} after mobs <strong>die</strong>`
},
maxCount: 9,
count: 0,
@@ -1642,7 +1642,7 @@ const tech = {
{
name: "scrap refit",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Scrap' class="link">scrap refit</a>`,
description: "after mobs <strong>die</strong><br>reset scrap <strong class='color-bot'>bots</strong> to <strong>15</strong> seconds of operation",
description: "after mobs <strong>die</strong> reset scrap <strong class='color-bot'>bots</strong><br>to <strong>15</strong> seconds of operation",
maxCount: 1,
count: 0,
frequency: 3,
@@ -1662,7 +1662,7 @@ const tech = {
{
name: "nail-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">nail-bot</a>`,
description: "construct a <strong class='color-bot'>bot</strong> fires <strong>nails</strong> at mobs in line of sight",
description: "construct a <strong class='color-bot'>bot</strong> that fires <strong>nails</strong> at mobs",
maxCount: 9,
count: 0,
frequency: 1,
@@ -1720,7 +1720,7 @@ const tech = {
{
name: "foam-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">foam-bot</a>`,
description: "construct a <strong class='color-bot'>bot</strong> sprays sticky <strong>foam</strong> at nearby mobs",
description: "construct a <strong class='color-bot'>bot</strong> that sprays sticky <strong>foam</strong> at mobs",
maxCount: 9,
count: 0,
frequency: 1,
@@ -1778,7 +1778,7 @@ const tech = {
{
name: "sound-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">sound-bot</a>`,
description: "construct a <strong class='color-bot'>bot</strong> emits expanding<br>arcs of <strong>sound</strong> aimed towards nearby mobs",
description: "construct a <strong class='color-bot'>bot</strong> that emits expanding<br>arcs of <strong>sound</strong> aimed towards nearby mobs",
maxCount: 9,
count: 0,
frequency: 1,
@@ -1834,7 +1834,7 @@ const tech = {
{
name: "boom-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">boom-bot</a>`,
description: "construct a <strong class='color-bot'>bot</strong> <strong>defends</strong> the space around you<br>ignites an <strong class='color-e'>explosion</strong> after hitting a mob",
description: "construct a <strong class='color-bot'>bot</strong> that <strong class='color-e'>explodes</strong> nearby mobs",
maxCount: 9,
count: 0,
frequency: 1,
@@ -1892,7 +1892,7 @@ const tech = {
{
name: "laser-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">laser-bot</a>`,
description: "construct a <strong class='color-bot'>bot</strong> uses <strong class='color-f'>energy</strong> to emit a <strong class='color-laser'>laser</strong><br>that targets nearby mobs",
description: "construct a <strong class='color-bot'>bot</strong> that uses <strong class='color-f'>energy</strong> to emit<br>a <strong class='color-laser'>laser</strong> that targets mobs",
maxCount: 9,
count: 0,
frequency: 1,
@@ -1950,7 +1950,7 @@ const tech = {
{
name: "orbital-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">orbital-bot</a>`,
description: "construct a <strong class='color-bot'>bot</strong> is locked in <strong>orbit</strong> around you<br><strong>stuns</strong> and <strong class='color-d'>damages</strong> mobs on <strong>contact</strong>",
description: "construct a <strong class='color-bot'>bot</strong> locked in <strong>orbit</strong> around you<br>that <strong>stuns</strong> and <strong class='color-d'>damages</strong> mobs",
maxCount: 9,
count: 0,
frequency: 1,
@@ -2017,7 +2017,7 @@ const tech = {
{
name: "dynamo-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">dynamo-bot</a>`,
description: "construct a <strong class='color-bot'>bot</strong> <strong class='color-d'>damages</strong> mobs it touches<br><strong>+8</strong> <strong class='color-f'>energy</strong> per second when nearby",
description: "construct a <strong class='color-bot'>bot</strong> that <strong class='color-d'>damages</strong> mobs and<br>generates <strong>+8</strong> <strong class='color-f'>energy</strong> per second when nearby",
maxCount: 9,
count: 0,
frequency: 1,
@@ -2170,7 +2170,7 @@ const tech = {
{
name: "ersatz bots",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Ersatz_good' class="link">ersatz bots</a>`,
description: `<strong>double</strong> your current permanent <strong class='color-bot'>bots</strong><br>remove <strong>all</strong> ${powerUps.orb.gun()} in your inventory`,
description: `<strong>double</strong> your <strong class='color-bot'>bots</strong><br>remove <strong>all</strong> ${powerUps.orb.gun()} in your inventory`,
maxCount: 1,
count: 0,
frequency: 2,
@@ -3988,7 +3988,7 @@ const tech = {
{
name: "junk DNA",
descriptionFunction() {
return `increase <strong class='color-d'>damage</strong> by twice the<br><strong class='color-junk'>JUNK</strong> chance <em style ="float: right;">(${(1 + 2 * (tech.junkChance + level.junkAdded)).toFixed(2)}x)</em>`
return `increase <strong class='color-d'>damage</strong> by twice your<br><strong class='color-junk'>JUNK</strong> chance <em style ="float: right;">(${(1 + 2 * (tech.junkChance + level.junkAdded)).toFixed(2)}x)</em>`
},
maxCount: 1,
count: 0,
@@ -6632,9 +6632,9 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() {
return (tech.haveGunCheck("drones") && !tech.isForeverDrones) || (m.fieldMode === 4 && simulation.molecularMode === 3)
return (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive) || (m.fieldMode === 4 && simulation.molecularMode === 3)
},
requires: "drones, not fault tolerance",
requires: "drones, not fault tolerance, irradiated drones",
effect() {
tech.isDroneOnDamage = true;
},
@@ -6758,9 +6758,9 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.droneCycleReduction === 1 && !tech.isIncendiary && !tech.isDroneTeleport && (tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldMode === 4 && simulation.molecularMode === 3))
return tech.droneCycleReduction === 1 && !tech.isDroneOnDamage && !tech.isIncendiary && !tech.isDroneTeleport && (tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldMode === 4 && simulation.molecularMode === 3))
},
requires: "drones, not reduced tolerances, incendiary, torque bursts",
requires: "drones, not reduced tolerances, incendiary, torque bursts, ablative drones",
effect() {
tech.isDroneRadioactive = true
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun

View File

@@ -1,24 +1,14 @@
******************************************************** NEXT PATCH **************************************************
new level: gravityObservatory
images have been disabled
I think they don't fit stylistically
level: testChamber2 renamed gravityInterferometer
it has been added to the levels that are extra hard and only show up late game
it also got a bit hard with the addition of 1 more laser
new power up: level WARP
it shows up when you enter testing mode on the initial level
interferometer horizontal laser now moves with the elevator
LaunchSite community map updated
deflected mob bullets are converted into small blocks
ablative drones is now a gun tech for drones
it makes ~33% more drones
1.033->1.05x sneak attack damage per coupling for cloaking field
bug fixes
extended vertical flip to edge cases:
trail left by snakeBoss
laser array from boss and mobs
springer,spiderBoss,mantisBoss constraints
subway: dark matter no longer removed if it gets too far from the player
training: fixed potential lock out from running out of ammo
training: fixed accidental difficulty increase
some minor bug fixes
******************************************************** BUGS ********************************************************
@@ -50,22 +40,8 @@ player can become crouched while not touching the ground if they exit the ground
*********************************************************** TODO *****************************************************
considering removing generative AI images from n-gon
pros: (of removing images)
the novelty of the images has worn off
cleaner UI without them
reduce the total size of n-gon by about 1/3
reduce the complexity of the code
avoid ire of people that hate generative AI
cons: (of removing images)
some people might like them
make a level selector power up
it shows up when you enter testing mode on the initial level
check box for community maps?
deflecting with field converts mob bullets to blocks that despawn after a few seconds
default for all fields that can deflect
extended vertical flip to edge cases:
!!stored circular graphics simulation.drawList.push
add more tips:
download latest version of n-gon