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'> <details id = 'settings-details'>
<summary>settings</summary> <summary>settings</summary>
<div style="line-height: 150%;" class="details-div"> <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> <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;"> <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> <label for="hide-hud" title="hide: tech, damage taken, damage, in game console, new level animation">minimal HUD</label>
<br> <br>

View File

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

View File

@@ -8,8 +8,8 @@ const level = {
defaultZoom: 1400, defaultZoom: 1400,
onLevel: -1, onLevel: -1,
levelsCleared: 0, levelsCleared: 0,
//see level.populateLevels: (initial, ... , (reservoir, factory, or gravityInterferometer), reactor, ... , subway, final) added later 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", "gravityObservatory"], 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"], 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"], trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon"],
levels: [], levels: [],
@@ -56,10 +56,10 @@ const level = {
// requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("field coupling") }); // requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("field coupling") });
// for (let i = 0; i < 1; i++) tech.giveTech("interest") // for (let i = 0; i < 1; i++) tech.giveTech("interest")
// m.lastKillCycle = m.cycle // 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); // 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 // 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 ************************************************** 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 = shuffle(level.levels); //shuffles order of maps with seeded random
level.levels.length = 9 //remove any extra levels past 9 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, 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 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 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 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(2355, -690)
wires.lineTo(2600, -690) wires.lineTo(2600, -690)
let isSpawnedWarp = false
level.custom = () => { 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 //working on a message using text
// ctx.font = "50px Arial"; // ctx.font = "50px Arial";
// ctx.fillStyle = "rgba(0,0,0,0.3)" // ctx.fillStyle = "rgba(0,0,0,0.3)"
@@ -7049,7 +7056,7 @@ const level = {
} }
}, },
gravityInterferometer() { interferometer() {
level.isVerticalFLipLevel = true level.isVerticalFLipLevel = true
mobs.maxMobBody = 20 //normally 40, but set to 10 to avoid too much clutter mobs.maxMobBody = 20 //normally 40, but set to 10 to avoid too much clutter
simulation.fallHeight = 4000 simulation.fallHeight = 4000
@@ -7084,8 +7091,8 @@ const level = {
frictionAir: 1, frictionAir: 1,
classType: "body", classType: "body",
holdX: 1762, holdX: 1762,
maxHeight: -1600, maxHeight: -1580,
minHeight: 100, minHeight: 130,
verticalForce: 0.03, verticalForce: 0.03,
isUp: false, isUp: false,
drag: 0.01, 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) 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 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(-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, 1700, 400, 25, 0.01, Math.PI / 2, 0.5)) balance.push(level.rotor(-750, 1755, 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(-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) 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 // spawn.mapRect(1980, -862, 25, 25); //laser entrance
balance.push(level.rotor(1000, -910, 550, 32, 0.01, 0, 0.5)) // balance.push(level.rotor(1000, -910, 550, 32, 0.01, 0, 0.5))
//left side //left side
//level entrance //level entrance
@@ -7206,7 +7213,6 @@ const level = {
spawn.mapVertex(-850, 840, "-225 -475 0 -500 225 -475 225 475 -225 475"); 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"); spawn.mapVertex(-350, 840, "-225 -475 0 -500 225 -475 225 475 -225 475");
//lower right side //lower right side
//far right wall ledges //far right wall ledges
spawn.mapRect(1925, -1700, 200, 200); spawn.mapRect(1925, -1700, 200, 200);
@@ -7233,14 +7239,12 @@ const level = {
spawn.mapRect(475, 1987, 550, 50); spawn.mapRect(475, 1987, 550, 50);
//ceiling zone //ceiling zone
spawn.mapRect(1200, -1625, 400, 25); spawn.mapRect(1200, -1600, 400, 25);
spawn.mapRect(-75, -1625, 1075, 25); spawn.mapRect(-75, -1725, 1075, 25);
spawn.mapRect(-575, -1625, 450, 25); spawn.mapRect(-575, -1625, 450, 25);
spawn.mapRect(-1075, -1850, 450, 25); spawn.mapRect(-1075, -1850, 450, 25);
spawn.mapRect(325, -1825, 575, 25);
spawn.mapRect(-1075, -1425, 450, 25); spawn.mapRect(-1075, -1425, 450, 25);
spawn.mapRect(-1675, -1588, 550, 25); spawn.mapRect(-1675, -1588, 550, 25);
} }
let buildVerticalFLippedMap = function () { // flip Y with this -> spawn.mapRect(x, -y - h, w, h); 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%)")) 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) 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 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(-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, -1700 - 25, 400, 25, 0.01, Math.PI / 2, 0.5)) balance.push(level.rotor(-750, -1755 - 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(-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) 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 // spawn.mapRect(1980, 862 - 25, 25, 25); //laser entrance
balance.push(level.rotor(1000, 910 - 32, 550, 32, 0.01, 0, 0.5)) // balance.push(level.rotor(1000, 910 - 32, 550, 32, 0.01, 0, 0.5))
//left side //left side
//level entrance //level entrance
@@ -7313,11 +7316,11 @@ const level = {
spawn.mapRect(475, -1987 - 50, 550, 50); spawn.mapRect(475, -1987 - 50, 550, 50);
//ceiling zone //ceiling zone
spawn.mapRect(1200, 1625 - 25, 400, 25); spawn.mapRect(1200, 1575, 400, 25);
spawn.mapRect(-75, 1625 - 25, 1075, 25); spawn.mapRect(-75, 1700, 1075, 25);
spawn.mapRect(-575, 1625 - 25, 450, 25); spawn.mapRect(-575, 1625 - 25, 450, 25);
spawn.mapRect(-1075, 1850 - 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(-1075, 1425 - 25, 450, 25);
spawn.mapRect(-1675, 1588 - 25, 550, 25); spawn.mapRect(-1675, 1588 - 25, 550, 25);
} }
@@ -7386,6 +7389,10 @@ const level = {
buildNormalMap() buildNormalMap()
level.custom = () => { level.custom = () => {
elevator.move() 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++) { for (let i = 0; i < buttons.length; i++) {
buttons[i].draw() buttons[i].draw()
if (buttons[i].isUp && !isFlipping) { if (buttons[i].isUp && !isFlipping) {
@@ -7500,13 +7507,17 @@ const level = {
ctx.fillRect(-2025, 2025 - 450, 400, 450); ctx.fillRect(-2025, 2025 - 450, 400, 450);
//shadows //shadows
ctx.fillStyle = "rgba(0,0,0,0.08)" 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(175, -250 - 725, 325, 725);
ctx.fillRect(650, -350 - 975, 475, 975); ctx.fillRect(650, -350 - 975, 475, 975);
ctx.fillRect(375, -1650 - 400, 750, 400); ctx.fillRect(375, -1650 - 400, 750, 400);
//ceiling //ceiling
ctx.fillStyle = "rgba(0,0,0,0.04)" ctx.fillStyle = "rgba(0,0,0,0.04)"
ctx.fillRect(1225, 2025 - 425, 350, 425); ctx.fillRect(1225, 2025 - 450, 350, 450);
ctx.fillRect(-50, 2025 - 425, 1025, 425); ctx.fillRect(-50, 1700, 1025, 325);
ctx.fillRect(-550, 2025 - 425, 400, 425); ctx.fillRect(-550, 2025 - 425, 400, 425);
ctx.fillRect(-1050, 2025 - 625, 400, 625); ctx.fillRect(-1050, 2025 - 625, 400, 625);
ctx.fillRect(-1625, 2025 - 450, 475, 450); ctx.fillRect(-1625, 2025 - 450, 475, 450);
@@ -7514,13 +7525,17 @@ const level = {
ctx.fillRect(-2025, -2025, 400, 450); ctx.fillRect(-2025, -2025, 400, 450);
//shadows //shadows
ctx.fillStyle = "rgba(0,0,0,0.08)" 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(175, 250, 325, 725);
ctx.fillRect(650, 350, 475, 975); ctx.fillRect(650, 350, 475, 975);
ctx.fillRect(375, 1650, 750, 400); ctx.fillRect(375, 1650, 750, 400);
//ceiling //ceiling
ctx.fillStyle = "rgba(0,0,0,0.04)" ctx.fillStyle = "rgba(0,0,0,0.04)"
ctx.fillRect(1225, -2025, 350, 425); ctx.fillRect(1225, -2025, 350, 450);
ctx.fillRect(-50, -2025, 1025, 425); ctx.fillRect(-50, -2025, 1025, 325);
ctx.fillRect(-550, -2025, 400, 425); ctx.fillRect(-550, -2025, 400, 425);
ctx.fillRect(-1050, -2025, 400, 625); ctx.fillRect(-1050, -2025, 400, 625);
ctx.fillRect(-1625, -2025, 475, 450); ctx.fillRect(-1625, -2025, 475, 450);
@@ -7569,7 +7584,7 @@ const level = {
spawn.randomLevelBoss(-875, -200); spawn.randomLevelBoss(-875, -200);
powerUps.addResearchToLevel() //needs to run after mobs are spawned powerUps.addResearchToLevel() //needs to run after mobs are spawned
}, },
gravityObservatory() { gravitron() {
mobs.maxMobBody = 25 //normally 40, but set lower to avoid too much clutter mobs.maxMobBody = 25 //normally 40, but set lower to avoid too much clutter
level.isVerticalFLipLevel = true level.isVerticalFLipLevel = true
simulation.fallHeight = 4000 simulation.fallHeight = 4000
@@ -7778,13 +7793,13 @@ const level = {
buildNormalMap() buildNormalMap()
level.custom = () => { level.custom = () => {
//stuff floats near buttons //stuff floats near buttons
if ((player.position.x > -3505 && player.position.x < -3075) || // if ((player.position.x > -3505 && player.position.x < -3075) ||
(player.position.x > 0 && player.position.x < 425) || // (player.position.x > 0 && player.position.x < 425) ||
(player.position.x > 3575)) { // (player.position.x > 3575)) {
if (player.position.y > 0) { // if (player.position.y > 0) {
player.force.y -= 0.8 * simulation.g * player.mass // player.force.y -= 0.8 * simulation.g * player.mass
} // }
} // }
for (let i = 0; i < body.length; i++) { for (let i = 0; i < body.length; i++) {
if ((body[i].position.x > -3505 && body[i].position.x < -3075) || if ((body[i].position.x > -3505 && body[i].position.x < -3075) ||
(body[i].position.x > 0 && body[i].position.x < 425) || (body[i].position.x > 0 && body[i].position.x < 425) ||
@@ -31644,6 +31659,7 @@ const level = {
level.setPosToSpawn(0, -50); //normal spawn level.setPosToSpawn(0, -50); //normal spawn
const elevatortoggle = level.toggle(13650, 3000) const elevatortoggle = level.toggle(13650, 3000)
let newMobsSpawned = false; let newMobsSpawned = false;
let leverTimer = 0;
level.exit.x = 11900; level.exit.x = 11900;
level.exit.y = -800; level.exit.y = -800;
const boost1 = level.boost(12050, 200, 1000) const boost1 = level.boost(12050, 200, 1000)
@@ -31670,6 +31686,24 @@ const level = {
powerUps.spawn(8650, 2000, "ammo") powerUps.spawn(8650, 2000, "ammo")
level.custom = () => { 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 //light rain
ctx.beginPath() ctx.beginPath()
ctx.fillStyle = "rgba(30,150,117,255)" ctx.fillStyle = "rgba(30,150,117,255)"
@@ -31687,8 +31721,8 @@ const level = {
elevatortoggle.query(); elevatortoggle.query();
if (elevatortoggle.isOn) { if (elevatortoggle.isOn) {
elevator1.move();
if (newMobsSpawned == false) { if (newMobsSpawned == false) {
leverTimer += 0.0125;
//last room mobs //last room mobs
spawn.randomSmallMob(11723.3, -127.5); spawn.randomSmallMob(11723.3, -127.5);
spawn.randomSmallMob(10525.2, 727.5); spawn.randomSmallMob(10525.2, 727.5);
@@ -31698,9 +31732,12 @@ const level = {
spawn.randomGroup(11066.3, 560.4, 0.4); spawn.randomGroup(11066.3, 560.4, 0.4);
newMobsSpawned = true; newMobsSpawned = true;
} }
}; };
if (leverTimer > 0 && leverTimer < 1) {
leverTimer += 0.0125
}
ctx.fillStyle = "rgba(0,0,0,0.3)" ctx.fillStyle = "rgba(0,0,0,0.3)"
ctx.beginPath() ctx.beginPath()
ctx.moveTo(5150, 1050) ctx.moveTo(5150, 1050)
@@ -31730,6 +31767,7 @@ const level = {
ctx.lineTo(12050, -280) ctx.lineTo(12050, -280)
ctx.lineTo(11950, -280) ctx.lineTo(11950, -280)
ctx.fill() ctx.fill()
//ladder //ladder
ctx.fillRect(12065, -770, 20, 870) ctx.fillRect(12065, -770, 20, 870)
ctx.fillRect(12115, -770, 20, 870) ctx.fillRect(12115, -770, 20, 870)
@@ -31749,11 +31787,6 @@ const level = {
ctx.fillRect(12055, 0, 90, 15) ctx.fillRect(12055, 0, 90, 15)
ctx.fillRect(12055, 60, 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 //post rocket shadows
ctx.fillStyle = "rgba(0,0,0,0.3)" ctx.fillStyle = "rgba(0,0,0,0.3)"
ctx.fillRect(10000, 510, 50, 700) ctx.fillRect(10000, 510, 50, 700)
@@ -31773,6 +31806,7 @@ const level = {
ctx.lineTo(5700, 2300) ctx.lineTo(5700, 2300)
ctx.lineTo(5884.8, 380.1) ctx.lineTo(5884.8, 380.1)
ctx.fill() ctx.fill()
//boss room shadow //boss room shadow
ctx.fillRect(11950, 2000, 5000, 1100) ctx.fillRect(11950, 2000, 5000, 1100)
ctx.fillRect(12150, -25, 3000, 250) ctx.fillRect(12150, -25, 3000, 250)
@@ -31781,7 +31815,6 @@ const level = {
level.exit.drawAndCheck(); level.exit.drawAndCheck();
level.enter.draw(); level.enter.draw();
} }
level.customTopLayer = () => { level.customTopLayer = () => {
@@ -31790,19 +31823,16 @@ const level = {
} else { } else {
ctx.fillStyle = `rgba(68, 68, 68, 68)` ctx.fillStyle = `rgba(68, 68, 68, 68)`
} }
ctx.fillRect(12150, -30, 1600, 1000) ctx.fillRect(12150, -30, 1600, 1000)
mover.draw(); mover.draw();
//vanishing platform //vanishing platform
vanisher.query(); vanisher.query();
//rocket //rocket
ctx.fillStyle = "rgba(202,88,0,1)" ctx.fillStyle = "rgba(202,88,0,1)"
ctx.fillRect(6800, -1000, 600, 2800) ctx.fillRect(6800, -1000, 600, 2800)
//ctx.beginPath()
ctx.beginPath() ctx.beginPath()
ctx.moveTo(7400, -998)//base right ctx.moveTo(7400, -998)//base right
ctx.lineTo(7350, -1400)//1/3rd up ctx.lineTo(7350, -1400)//1/3rd up
@@ -31819,18 +31849,21 @@ const level = {
ctx.fillRect(6800, 1700, 600, 300) ctx.fillRect(6800, 1700, 600, 300)
ctx.fillRect(6450, -400, 250, 2100) ctx.fillRect(6450, -400, 250, 2100)
ctx.fillRect(7500, -400, 250, 2100) ctx.fillRect(7500, -400, 250, 2100)
//right engine //right engine
ctx.beginPath() ctx.beginPath()
ctx.moveTo(6450, -398)//base right ctx.moveTo(6450, -398)//base right
ctx.lineTo(6575, -900)//peak ctx.lineTo(6575, -900)//peak
ctx.lineTo(6700, -398)//baseleft ctx.lineTo(6700, -398)//baseleft
ctx.fill() ctx.fill()
//right engine //right engine
ctx.beginPath() ctx.beginPath()
ctx.moveTo(7500, -398)//base right ctx.moveTo(7500, -398)//base right
ctx.lineTo(7625, -900)//peak ctx.lineTo(7625, -900)//peak
ctx.lineTo(7750, -398)//baseleft ctx.lineTo(7750, -398)//baseleft
ctx.fill() ctx.fill()
//right wing //right wing
ctx.beginPath() ctx.beginPath()
ctx.moveTo(6910, 450) ctx.moveTo(6910, 450)
@@ -31839,6 +31872,7 @@ const level = {
ctx.lineTo(6250, 1600) ctx.lineTo(6250, 1600)
ctx.lineTo(6780, 1030) ctx.lineTo(6780, 1030)
ctx.fill() ctx.fill()
//left wing //left wing
ctx.beginPath() ctx.beginPath()
ctx.moveTo((7100 - 6910) + 7100, 450) ctx.moveTo((7100 - 6910) + 7100, 450)
@@ -31859,8 +31893,8 @@ const level = {
ctx.lineTo(6900, 2)//baseleft ctx.lineTo(6900, 2)//baseleft
ctx.fill() ctx.fill()
ctx.fillStyle = "rgba(0,0,0,1)"
//right wing outline //right wing outline
ctx.fillStyle = "rgba(0,0,0,1)"
ctx.beginPath() ctx.beginPath()
ctx.moveTo((7100 - 6250) + 7100, 1700) ctx.moveTo((7100 - 6250) + 7100, 1700)
ctx.lineTo((7100 - 6250) + 7100, 1600) ctx.lineTo((7100 - 6250) + 7100, 1600)
@@ -31869,6 +31903,7 @@ const level = {
ctx.lineTo((7100 - 6800) + 7100, 1030) ctx.lineTo((7100 - 6800) + 7100, 1030)
ctx.lineTo((7100 - 6290) + 7100, 1600) ctx.lineTo((7100 - 6290) + 7100, 1600)
ctx.fill() ctx.fill()
//left wing outline //left wing outline
ctx.beginPath() ctx.beginPath()
ctx.moveTo(6250, 1700) ctx.moveTo(6250, 1700)
@@ -31878,16 +31913,24 @@ const level = {
ctx.lineTo(6800, 1030) ctx.lineTo(6800, 1030)
ctx.lineTo(6290, 1600) ctx.lineTo(6290, 1600)
ctx.fill() ctx.fill()
ctx.fillRect(6800, 2000, 600, 50) ctx.fillRect(6800, 2000, 600, 50)
ctx.fillRect(6850, 2050, 500, 150) 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 //shadows
ctx.fillStyle = "rgba(0,0,0,0.3)" ctx.fillStyle = "rgba(0,0,0,0.3)"
//ctx.fillRect(-272, -580, 1700, 600)
ctx.beginPath() ctx.beginPath()
ctx.moveTo(1800, -400) ctx.moveTo(1800, -400)
ctx.lineTo(2500, 300) ctx.lineTo(2500, 300)
@@ -31901,16 +31944,10 @@ const level = {
ctx.lineTo(1522.9, 2431.8) ctx.lineTo(1522.9, 2431.8)
ctx.lineTo(983.5, 887.3) ctx.lineTo(983.5, 887.3)
ctx.fill() ctx.fill()
//ctx.rect(6800, 0, 600, 1800)
//move elevator
//elevator1.move();
//elevator2.move();
}; };
//GEOMETRY
//vanishing platform //vanishing platform
var vanisher = level.vanish(10250, 201, 500, 20); var vanisher = level.vanish(10250, 201, 500, 20);
@@ -31925,20 +31962,14 @@ const level = {
spawn.mapRect(9500, -1500, 500, 2300); spawn.mapRect(9500, -1500, 500, 2300);
//-9000, +2000
spawn.mapRect(2500, 0, 3200, 500); spawn.mapRect(2500, 0, 3200, 500);
spawn.mapRect(5700, 0, 500, 2300); spawn.mapRect(5700, 0, 500, 2300);
spawn.mapRect(1800, 1100, 800, 2600); spawn.mapRect(1800, 1100, 800, 2600);
spawn.mapRect(2600, 1660, 1800, 2040); spawn.mapRect(2600, 1660, 1800, 2040);
spawn.mapRect(1800, -495, 200, 100); spawn.mapRect(1800, -495, 200, 100);
spawn.mapVertex(2400, -230, "0 10 900 510 800 510 750 510 0 110"); spawn.mapVertex(2400, -230, "0 10 900 510 800 510 750 510 0 110");
//stairs //stairs
spawn.mapRect(2600, 1150, 50, 550); spawn.mapRect(2600, 1150, 50, 550);
spawn.mapRect(2650, 1200, 50, 500); spawn.mapRect(2650, 1200, 50, 500);
spawn.mapRect(2700, 1250, 50, 450); spawn.mapRect(2700, 1250, 50, 450);
@@ -31956,10 +31987,8 @@ const level = {
spawn.mapRect(4685, 1300, 50, 550); spawn.mapRect(4685, 1300, 50, 550);
spawn.mapRect(4400, 2000, 550, 50); spawn.mapRect(4400, 2000, 550, 50);
spawn.mapRect(5150, 1000, 550, 50); spawn.mapRect(5150, 1000, 550, 50);
spawn.mapVertex(5500, 1550, "0 0 -500 600 100 0 -400 600"); spawn.mapVertex(5500, 1550, "0 0 -500 600 100 0 -400 600");
//second room //second room
spawn.mapRect(8000, 0, 1500, 2300); spawn.mapRect(8000, 0, 1500, 2300);
spawn.mapRect(6200, 2200, 1800, 100); spawn.mapRect(6200, 2200, 1800, 100);
@@ -31980,6 +32009,9 @@ const level = {
spawn.mapRect(10900, 2050, 400, 50); spawn.mapRect(10900, 2050, 400, 50);
spawn.mapRect(10950, 2000, 550, 700); spawn.mapRect(10950, 2000, 550, 700);
//light
spawn.mapRect(12925, 2000, 150, 12);
//roof over stairs //roof over stairs
spawn.mapRect(9500, 1200, 1000, 500); spawn.mapRect(9500, 1200, 1000, 500);
spawn.mapRect(9500, 2200, 500, 100); spawn.mapRect(9500, 2200, 500, 100);
@@ -32005,10 +32037,9 @@ const level = {
spawn.mapRect(11800, -1500, 350, 400); spawn.mapRect(11800, -1500, 350, 400);
spawn.mapRect(12150, -1500, 3000, 1500); spawn.mapRect(12150, -1500, 3000, 1500);
spawn.mapRect(13700, 0, 2000, 800); spawn.mapRect(13700, 0, 2000, 800);
spawn.mapRect(13200, 550, 50, 300); spawn.mapRect(13200, 550, 50, 300);
//MOBS
//mobs in first room //mobs in first room
@@ -32024,9 +32055,6 @@ const level = {
spawn.randomMob(13381.7, 2437.2, 0.8); spawn.randomMob(13381.7, 2437.2, 0.8);
spawn.randomGroup(10472.4, 2079.0, 0.4); spawn.randomGroup(10472.4, 2079.0, 0.4);
//boss room //boss room
spawn.randomLevelBoss(12786, 2461, ["launcherBoss", "laserTargetingBoss", "blinkBoss", "streamBoss", "historyBoss", "grenadierBoss", "blockBoss", "revolutionBoss", "slashBoss"]); spawn.randomLevelBoss(12786, 2461, ["launcherBoss", "laserTargetingBoss", "blinkBoss", "streamBoss", "historyBoss", "grenadierBoss", "blockBoss", "revolutionBoss", "slashBoss"]);
spawn.mapRect(13500, 3000, 500, 400); spawn.mapRect(13500, 3000, 500, 400);
@@ -32035,11 +32063,6 @@ const level = {
//extra boss //extra boss
spawn.randomLevelBoss(12808.8, 527.0, ["blinkBoss"]); 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); // if (simulation.difficulty > 1) spawn.randomLevelBoss(2200, -1300);
// spawn.secondaryBossChance(100, -1500) // spawn.secondaryBossChance(100, -1500)
powerUps.addResearchToLevel() //needs to run after mobs are spawned powerUps.addResearchToLevel() //needs to run after mobs are spawned
}, },
shipwreck() { shipwreck() {
simulation.inGameConsole(`<strong>shipwreck</strong> by <span class='color-var'>3xionDev</span>`); 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").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 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 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.instructions.effect() //reproduce this message
powerUps.warp.effect() //warp to any level
tech.giveTech("name") //replace "name" with tech name 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 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 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 m.maxEnergy = 1 //set max energy
simulation.enableConstructMode() //press T to build with mouse simulation.enableConstructMode() //press T to build with mouse
${lore} ${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); Matter.Body.setPosition(player, simulation.mouseInGame);
spawn.bodyRect(simulation.mouseInGame.x, simulation.mouseInGame.y, 50, 50) spawn.bodyRect(simulation.mouseInGame.x, simulation.mouseInGame.y, 50, 50)
spawn.randomLevelBoss(simulation.mouseInGame.x, simulation.mouseInGame.y) 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>chrome</strong> <strong>firefox</strong>
<strong>Win/Linux:</strong> Ctrl + Shift + J Ctrl + Shift + J <strong>Win/Linux:</strong> Ctrl + Shift + J Ctrl + Shift + J
<strong>Mac:</strong> Cmd + Option + J Cmd + Shift + J</pre></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>`
<div class="choose-grid-module" id="exit" style="text-align: center;font-size: 1.3rem;">exit</div>`
document.getElementById("choose-grid").innerHTML = text document.getElementById("choose-grid").innerHTML = text
//show level info //show level info
document.getElementById("choose-grid").style.opacity = "1" 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: { difficulty: {
name: "difficulty", name: "difficulty",
color: "#000", color: "#000",

View File

@@ -1560,7 +1560,7 @@ const tech = {
{ {
name: "enthalpy", name: "enthalpy",
descriptionFunction() { 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, maxCount: 9,
count: 0, count: 0,
@@ -1642,7 +1642,7 @@ const tech = {
{ {
name: "scrap refit", name: "scrap refit",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Scrap' class="link">scrap refit</a>`, 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, maxCount: 1,
count: 0, count: 0,
frequency: 3, frequency: 3,
@@ -1662,7 +1662,7 @@ const tech = {
{ {
name: "nail-bot", name: "nail-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">nail-bot</a>`, 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, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -1720,7 +1720,7 @@ const tech = {
{ {
name: "foam-bot", name: "foam-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">foam-bot</a>`, 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, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -1778,7 +1778,7 @@ const tech = {
{ {
name: "sound-bot", name: "sound-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">sound-bot</a>`, 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, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -1834,7 +1834,7 @@ const tech = {
{ {
name: "boom-bot", name: "boom-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">boom-bot</a>`, 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, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -1892,7 +1892,7 @@ const tech = {
{ {
name: "laser-bot", name: "laser-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">laser-bot</a>`, 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, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -1950,7 +1950,7 @@ const tech = {
{ {
name: "orbital-bot", name: "orbital-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">orbital-bot</a>`, 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, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -2017,7 +2017,7 @@ const tech = {
{ {
name: "dynamo-bot", name: "dynamo-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">dynamo-bot</a>`, 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, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -2170,7 +2170,7 @@ const tech = {
{ {
name: "ersatz bots", name: "ersatz bots",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Ersatz_good' class="link">ersatz bots</a>`, 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, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -3988,7 +3988,7 @@ const tech = {
{ {
name: "junk DNA", name: "junk DNA",
descriptionFunction() { 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, maxCount: 1,
count: 0, count: 0,
@@ -6632,9 +6632,9 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { 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() { effect() {
tech.isDroneOnDamage = true; tech.isDroneOnDamage = true;
}, },
@@ -6758,9 +6758,9 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { 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() { effect() {
tech.isDroneRadioactive = true tech.isDroneRadioactive = true
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun

View File

@@ -1,24 +1,14 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
new level: gravityObservatory images have been disabled
I think they don't fit stylistically
level: testChamber2 renamed gravityInterferometer new power up: level WARP
it has been added to the levels that are extra hard and only show up late game it shows up when you enter testing mode on the initial level
it also got a bit hard with the addition of 1 more laser interferometer horizontal laser now moves with the elevator
LaunchSite community map updated
deflected mob bullets are converted into small blocks some minor bug fixes
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
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
@@ -50,22 +40,8 @@ player can become crouched while not touching the ground if they exit the ground
*********************************************************** TODO ***************************************************** *********************************************************** TODO *****************************************************
considering removing generative AI images from n-gon extended vertical flip to edge cases:
pros: (of removing images) !!stored circular graphics simulation.drawList.push
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
add more tips: add more tips:
download latest version of n-gon download latest version of n-gon