Refine Archive World navigation and gate progression
All checks were successful
Build Org Website / build (push) Successful in 38s
All checks were successful
Build Org Website / build (push) Successful in 38s
This commit is contained in:
@@ -5,6 +5,12 @@
|
||||
return Object.freeze({ x, y, width, height, depth: depth || 2 });
|
||||
}
|
||||
|
||||
function enemy(type, x, y, options) {
|
||||
return Object.freeze(Object.assign({
|
||||
type, x, y, leash: 150, engage: 245, requiresSigil: null, questId: null
|
||||
}, options || {}));
|
||||
}
|
||||
|
||||
function landmark(id, title, eyebrow, x, y, npc, description, links, questId, area) {
|
||||
return Object.freeze({ id, title, eyebrow, x, y, npc, description, links, questId, area: area || null });
|
||||
}
|
||||
@@ -13,22 +19,22 @@
|
||||
gate: landmark("gate", "Town Gate", "Arrivals", 724, 920, "orin",
|
||||
"The only opening in Archive Town's old wall. Gatekeeper Orin is trying to restore the erased arrival plaques.",
|
||||
[["Home", "/"], ["Recently updated", "/recently-updated.html"], ["Contact", "/home/contact.html"]], "gate"),
|
||||
library: landmark("library", "Grand Library", "Knowledge", 265, 280, "sera",
|
||||
library: landmark("library", "Grand Library", "Knowledge", 265, 305, "sera",
|
||||
"Head Archivist Sera guards the sealed vault and a shelf whose symbols no longer remember their order.",
|
||||
[["Posts", "/posts/posts-list.html"], ["Categories", "/home/categories.html"], ["Posts introduction", "/posts/posts-intro.html"]], "library", "vault"),
|
||||
study: landmark("study", "Guild Study", "Work", 720, 250, "vale",
|
||||
study: landmark("study", "Guild Study", "Work", 720, 300, "vale",
|
||||
"Instructor Vale keeps the guild calm while Nulls gather beyond the practice banners.",
|
||||
[["Career", "/posts/career/career-list.html"], ["Competency status", "/home/status.html"], ["Probation objectives", "/posts/career/probation-objectives.html"]], "study"),
|
||||
inn: landmark("inn", "Kitchen Inn", "Daily life", 1110, 285, "mara",
|
||||
inn: landmark("inn", "Kitchen Inn", "Daily life", 1110, 305, "mara",
|
||||
"Innkeeper Mara holds three borrowed memories and cannot recall which traveller entrusted each one.",
|
||||
[["Blogs", "/blogs/blogs-list.html"], ["Weekly reviews", "/tags/review.html"], ["Blogs introduction", "/blogs/blogs-intro.html"]], "inn"),
|
||||
workshop: landmark("workshop", "Workshop", "Living systems", 1125, 545, "pell",
|
||||
workshop: landmark("workshop", "Workshop", "Living systems", 1125, 590, "pell",
|
||||
"Inventor Pell's recall engine has lost its cogs. A Redacted Sentinel occupies the repair yard.",
|
||||
[["Services", "/home/services.html"], ["Wird tracker", "/home/wird-tracker.html"], ["Countdowns", "/home/countdown.html"], ["Backlog", "/home/backlog.html"]], "workshop", "workshop"),
|
||||
playroom: landmark("playroom", "Playroom", "Experiments", 1120, 805, "pip",
|
||||
playroom: landmark("playroom", "Playroom", "Experiments", 1120, 835, "pip",
|
||||
"Gamekeeper Pip's lantern maze changes whenever a name disappears. Six patient lights still know the route.",
|
||||
[["Play hub", "/play/play.html"], ["The Rain Index", "/play/the-rain-index.html"], ["House of Pages", "/play/house.html"]], "playroom", "playroom"),
|
||||
museum: landmark("museum", "Lima Museum", "Keepsakes", 270, 805, "lima",
|
||||
museum: landmark("museum", "Lima Museum", "Keepsakes", 270, 830, "lima",
|
||||
"Curator Lima can reveal what the Redactor was before the ink, but the Museum Lens is fractured.",
|
||||
[["Lima archive", "/lima/index.html"], ["Older writing", "/blogs/2025/2025-list.html"], ["Memory Cabinet", "/play/memory.html"]], "museum"),
|
||||
garden: landmark("garden", "Notes Garden", "Connections", 255, 545, "rowan",
|
||||
@@ -115,56 +121,110 @@
|
||||
const AREAS = Object.freeze({
|
||||
town: Object.freeze({
|
||||
width: 1448, height: 1086, background: "town", spawn: { x: 724, y: 965 },
|
||||
movement: Object.freeze({ speed: 162, acceleration: 1280, deceleration: 1850, bootAcceleration: 1720 }),
|
||||
safeSpawns: Object.freeze({
|
||||
gate: { x: 724, y: 965 }, square: { x: 724, y: 555 }, library: { x: 270, y: 350 },
|
||||
study: { x: 720, y: 330 }, inn: { x: 1110, y: 350 }, workshop: { x: 1060, y: 550 },
|
||||
playroom: { x: 1060, y: 805 }, museum: { x: 330, y: 805 }, garden: { x: 330, y: 545 }
|
||||
study: { x: 720, y: 330 }, inn: { x: 1110, y: 350 }, workshop: { x: 1060, y: 615 },
|
||||
playroom: { x: 1060, y: 840 }, museum: { x: 330, y: 835 }, garden: { x: 330, y: 545 }
|
||||
}),
|
||||
safeZones: Object.freeze([
|
||||
rect(650, 845, 150, 220), rect(585, 455, 280, 190)
|
||||
]),
|
||||
gates: Object.freeze([
|
||||
Object.freeze({ id: "town-gate", x: 672, y: 850, width: 104, height: 102, requiresSigil: "gate" })
|
||||
]),
|
||||
collisions: Object.freeze([
|
||||
rect(0, 0, 1448, 58), rect(0, 0, 58, 1086), rect(1390, 0, 58, 1086),
|
||||
rect(0, 930, 645, 156), rect(803, 930, 645, 156),
|
||||
rect(125, 68, 330, 230, 7), rect(580, 70, 285, 210, 7), rect(960, 70, 355, 230, 7),
|
||||
rect(1010, 420, 335, 210, 7), rect(1000, 690, 345, 225, 7),
|
||||
rect(105, 685, 340, 230, 7), rect(85, 390, 350, 225, 7),
|
||||
rect(470, 75, 95, 350), rect(885, 75, 88, 350),
|
||||
rect(465, 615, 100, 275), rect(885, 615, 98, 275)
|
||||
/* Outer town wall, with a deliberate walkable opening through the gate. */
|
||||
rect(0, 0, 1448, 62), rect(0, 0, 54, 1086), rect(1394, 0, 54, 1086),
|
||||
rect(0, 862, 590, 98), rect(590, 840, 82, 132), rect(776, 840, 86, 132), rect(862, 862, 586, 98),
|
||||
/* Major buildings. Their steps and front doors remain approachable. */
|
||||
rect(188, 62, 270, 212, 7), rect(606, 55, 238, 218, 7), rect(964, 58, 292, 218, 7),
|
||||
rect(1010, 418, 330, 142, 7), rect(1002, 655, 340, 155, 7), rect(218, 620, 220, 178, 7),
|
||||
/* Rivers. Breaks align with the two east/west bridge routes. */
|
||||
rect(468, 88, 112, 255), rect(468, 432, 112, 93), rect(468, 610, 112, 250),
|
||||
rect(868, 88, 112, 255), rect(868, 432, 112, 93), rect(868, 610, 112, 250),
|
||||
/* Garden pond, dense hedges and corner ink pockets. */
|
||||
rect(56, 360, 105, 292), rect(160, 382, 286, 45), rect(78, 675, 105, 175),
|
||||
rect(1260, 310, 130, 108), rect(1270, 572, 120, 92), rect(1270, 812, 120, 80)
|
||||
]),
|
||||
npcs: Object.freeze([
|
||||
["orin", 724, 875], ["sera", 270, 335], ["vale", 720, 315], ["mara", 1110, 335],
|
||||
["pell", 1045, 545], ["pip", 1045, 800], ["lima", 335, 800], ["rowan", 335, 545],
|
||||
["pell", 1060, 590], ["pip", 1060, 835], ["lima", 335, 830], ["rowan", 335, 545],
|
||||
["nell", 760, 720], ["otho", 675, 520], ["remy", 790, 585]
|
||||
]),
|
||||
enemies: Object.freeze([
|
||||
["ink_blot", 510, 490], ["lost_footnote", 930, 640], ["null_scribe", 520, 780],
|
||||
["ink_blot", 1320, 380], ["lost_footnote", 120, 640]
|
||||
enemy("ink_blot", 635, 350, { leash: 95, engage: 210, requiresSigil: "gate", questId: "study" }),
|
||||
enemy("lost_footnote", 805, 350, { leash: 95, engage: 210, requiresSigil: "gate", questId: "study" }),
|
||||
enemy("null_scribe", 720, 405, { leash: 105, engage: 280, requiresSigil: "gate", questId: "study" }),
|
||||
enemy("ink_blot", 1110, 625, { leash: 105, engage: 205, requiresSigil: "gate" }),
|
||||
enemy("lost_footnote", 340, 590, { leash: 75, engage: 175, requiresSigil: "gate" })
|
||||
])
|
||||
}),
|
||||
vault: Object.freeze({
|
||||
width: 724, height: 543, background: "areas", frame: 0, spawn: { x: 362, y: 485 },
|
||||
movement: Object.freeze({ speed: 155, acceleration: 1300, deceleration: 1900, bootAcceleration: 1740 }),
|
||||
safeSpawns: Object.freeze({ entrance: { x: 362, y: 485 } }),
|
||||
collisions: Object.freeze([rect(0, 0, 724, 55), rect(0, 0, 45, 543), rect(679, 0, 45, 543), rect(0, 500, 300, 43), rect(424, 500, 300, 43)]),
|
||||
safeZones: Object.freeze([rect(300, 430, 124, 95)]),
|
||||
collisions: Object.freeze([
|
||||
rect(0, 0, 724, 32), rect(0, 0, 34, 543), rect(690, 0, 34, 543),
|
||||
rect(0, 32, 278, 130), rect(446, 32, 278, 130), rect(278, 32, 168, 60),
|
||||
rect(0, 472, 300, 71), rect(424, 472, 300, 71),
|
||||
rect(145, 150, 100, 72), rect(479, 150, 100, 72),
|
||||
rect(72, 272, 95, 70), rect(557, 272, 95, 70),
|
||||
rect(145, 345, 100, 72), rect(479, 345, 100, 72)
|
||||
]),
|
||||
npcs: Object.freeze([]), enemies: Object.freeze([])
|
||||
}),
|
||||
workshop: Object.freeze({
|
||||
width: 724, height: 543, background: "areas", frame: 1, spawn: { x: 362, y: 475 },
|
||||
movement: Object.freeze({ speed: 155, acceleration: 1300, deceleration: 1900, bootAcceleration: 1740 }),
|
||||
safeSpawns: Object.freeze({ entrance: { x: 362, y: 475 } }),
|
||||
collisions: Object.freeze([rect(0, 0, 724, 48), rect(0, 0, 42, 543), rect(682, 0, 42, 543), rect(0, 500, 300, 43), rect(424, 500, 300, 43), rect(50, 50, 220, 105), rect(470, 70, 190, 95)]),
|
||||
npcs: Object.freeze([]), enemies: Object.freeze([["sentinel", 365, 210]])
|
||||
safeZones: Object.freeze([rect(300, 430, 124, 95)]),
|
||||
collisions: Object.freeze([
|
||||
rect(0, 0, 724, 32), rect(0, 0, 34, 543), rect(690, 0, 34, 543),
|
||||
rect(34, 32, 656, 115), rect(0, 472, 300, 71), rect(424, 472, 300, 71),
|
||||
rect(34, 145, 120, 118), rect(570, 145, 120, 125),
|
||||
rect(34, 342, 218, 130), rect(520, 360, 170, 112)
|
||||
]),
|
||||
npcs: Object.freeze([]), enemies: Object.freeze([
|
||||
enemy("sentinel", 362, 245, { leash: 205, engage: 360 })
|
||||
])
|
||||
}),
|
||||
playroom: Object.freeze({
|
||||
width: 724, height: 543, background: "areas", frame: 2, spawn: { x: 362, y: 485 },
|
||||
movement: Object.freeze({ speed: 150, acceleration: 1250, deceleration: 1850, bootAcceleration: 1680 }),
|
||||
safeSpawns: Object.freeze({ entrance: { x: 362, y: 485 } }),
|
||||
safeZones: Object.freeze([rect(300, 445, 124, 80)]),
|
||||
collisions: Object.freeze([
|
||||
rect(0, 0, 724, 45), rect(0, 0, 42, 543), rect(682, 0, 42, 543), rect(0, 500, 300, 43), rect(424, 500, 300, 43),
|
||||
rect(100, 95, 210, 42), rect(405, 95, 210, 42), rect(200, 190, 320, 42), rect(90, 285, 220, 42), rect(410, 285, 220, 42), rect(220, 380, 285, 42)
|
||||
rect(0, 0, 724, 38), rect(0, 0, 28, 543), rect(696, 0, 28, 543),
|
||||
rect(0, 488, 300, 55), rect(424, 488, 300, 55),
|
||||
rect(28, 38, 210, 58), rect(294, 38, 186, 58), rect(522, 38, 174, 58),
|
||||
rect(147, 104, 92, 92), rect(345, 96, 72, 118), rect(520, 106, 96, 94),
|
||||
rect(28, 220, 128, 72), rect(217, 214, 118, 78), rect(416, 210, 116, 82), rect(615, 220, 81, 72),
|
||||
rect(112, 315, 126, 78), rect(302, 300, 94, 102), rect(492, 315, 126, 78),
|
||||
rect(28, 408, 118, 80), rect(205, 408, 105, 80), rect(414, 408, 105, 80), rect(578, 408, 118, 80)
|
||||
]),
|
||||
npcs: Object.freeze([]), enemies: Object.freeze([["lost_footnote", 120, 180], ["ink_blot", 590, 360]])
|
||||
npcs: Object.freeze([]), enemies: Object.freeze([
|
||||
enemy("lost_footnote", 90, 180, { leash: 60, engage: 150 }),
|
||||
enemy("ink_blot", 650, 350, { leash: 55, engage: 145 })
|
||||
])
|
||||
}),
|
||||
boss: Object.freeze({
|
||||
width: 724, height: 543, background: "areas", frame: 3, spawn: { x: 362, y: 470 },
|
||||
movement: Object.freeze({ speed: 158, acceleration: 1380, deceleration: 1950, bootAcceleration: 1780 }),
|
||||
safeSpawns: Object.freeze({ entrance: { x: 362, y: 470 } }),
|
||||
collisions: Object.freeze([rect(0, 0, 724, 35), rect(0, 0, 35, 543), rect(689, 0, 35, 543), rect(0, 508, 285, 35), rect(439, 508, 285, 35)]),
|
||||
npcs: Object.freeze([]), enemies: Object.freeze([["redactor", 362, 190]])
|
||||
safeZones: Object.freeze([rect(310, 438, 104, 70)]),
|
||||
collisions: Object.freeze([
|
||||
rect(0, 0, 724, 42), rect(0, 0, 34, 543), rect(690, 0, 34, 543),
|
||||
rect(34, 42, 145, 55), rect(545, 42, 145, 55),
|
||||
rect(34, 97, 48, 350), rect(642, 97, 48, 350),
|
||||
rect(34, 447, 245, 64), rect(445, 447, 245, 64),
|
||||
rect(196, 146, 48, 48), rect(480, 146, 48, 48),
|
||||
rect(196, 326, 48, 48), rect(480, 326, 48, 48)
|
||||
]),
|
||||
npcs: Object.freeze([]), enemies: Object.freeze([
|
||||
enemy("redactor", 362, 190, { leash: 250, engage: 500 })
|
||||
])
|
||||
})
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user