Files
healer-man/src/game/dungeons/forsakenAbbey.ts
T
2026-08-14 15:56:39 -04:00

159 lines
5.3 KiB
TypeScript

import {
DUNGEON_DEFINITION_SCHEMA_VERSION,
type DungeonDefinition,
} from "../dungeonTypes";
import {
FORSAKEN_ABBEY_BOSSES,
FORSAKEN_ABBEY_ENTITIES,
FORSAKEN_ABBEY_OBJECTIVE_ORDER,
FORSAKEN_ABBEY_STATIC_SPAWNS,
} from "../generated/forsakenAbbeyPopulation.generated";
/**
* Offline-capable RuneWaker import. Environment, population, placements, and
* creature models are all packaged files; SQL Server is forensic tooling only.
*/
export const FORSAKEN_ABBEY_DEFINITION = {
schemaVersion: DUNGEON_DEFINITION_SCHEMA_VERSION,
id: "forsaken-abbey",
title: "Forsaken Abbey",
mapId: 102,
lfgDungeonIds: [],
expansion: "runewaker",
environmentMode: "runewaker-ros",
difficultyVariants: [
{ id: "normal", difficulty: "normal", spawnMask: 1, levelRange: [18, 28] },
],
defaultDifficultyId: "normal",
availability: "available",
presentation: {
location: "Forsaken Abbey",
theme: "Ruined monastery and underground crypt",
summary: "Cleanse the ruined monastery and defeat the keepers guarding Demon Witch Ancalon.",
loadingMessage: "Entering Forsaken Abbey...",
unchartedAreaName: "Uncharted Forsaken Abbey",
background: "#09090c",
fog: { color: "#0b0b10", near: 34, far: 235 },
ambientLight: { color: "#9d96a7", intensity: 0.2 },
hemisphereLight: { skyColor: "#77768c", groundColor: "#0a0809", intensity: 0.48 },
directionalLight: { color: "#c9bea6", intensity: 0.78, offset: [9, 17, -6] },
materials: {
cutoutPatterns: [],
cutoutNames: [
"runewaker_material_262",
"runewaker_material_265",
"runewaker_material_276",
"runewaker_material_281",
"runewaker_material_282",
"runewaker_material_194",
],
blendPatterns: [],
blendNames: [
"runewaker_material_221",
"runewaker_material_216",
"runewaker_material_237",
"runewaker_material_239",
"runewaker_material_47",
"runewaker_material_9",
],
additivePatterns: [],
additiveNames: [],
},
map: { width: 430, height: 300, padding: 24, contours: [] },
},
assets: {
visual: [
{
id: "visual",
fileName: "forsaken-abbey-visual.glb",
checksum: "b534f66c693ac57f560e8a7aeeff59ee955b8de4bf97dd8f0aa368e10d43e79f",
size: 20_955_020,
triangleCount: 207_586,
},
],
collision: [
{
id: "collision-000",
fileName: "forsaken-abbey-collision-000.glb",
checksum: "f56bc14a460d04bd7f85f9acd64c19aa1060c06277eddff90635918b85053c57",
size: 3_870_524,
triangleCount: 83_963,
},
{
id: "collision-001",
fileName: "forsaken-abbey-collision-001.glb",
checksum: "d84c384419d3998a7337023d0b05d3bd1409e43ccc28fa17813e3661151d0cac",
size: 3_951_196,
triangleCount: 87_581,
},
{
id: "collision-002",
fileName: "forsaken-abbey-collision-002.glb",
checksum: "e5af65a15181b655f43e76be63d1e0b983ca4c766a254d682185138e4bfb9e66",
size: 1_677_852,
triangleCount: 36_042,
},
],
navigation: {
id: "navigation",
fileName: "forsaken-abbey-navigation.glb",
checksum: "d178b76459fc09302235e68e0b0385bdfa32a55b3fd7b317c11453690244a4bd",
size: 257_520,
triangleCount: 5_347,
},
},
transform: {
position: [0, 0, 0],
rotation: [0, 0, 0],
scale: 1,
fromRunewaker: "local=scale(0.1)*inverse(WDB placement)*server; three(x,y,z)=(local.x,local.y,-local.z)",
},
bounds: {
min: [-29.38274, -21.74707, -110.44788],
max: [416.5376, 34.07087, 85.36886],
},
entrance: {
name: "Forsaken Abbey Entrance",
footPosition: [-2.06969, 0.152924, 0.062695],
forward: [-0.757208847, 0, -0.653172843],
yaw: 4.000621895,
},
areas: [
{
id: "entrance",
name: "Forsaken Abbey Entrance",
center: [-2.06969, 0.152924, 0.062695],
radius: 24,
},
],
entities: FORSAKEN_ABBEY_ENTITIES,
staticSpawns: FORSAKEN_ABBEY_STATIC_SPAWNS,
roamingPacks: [],
bosses: FORSAKEN_ABBEY_BOSSES,
objectiveOrder: FORSAKEN_ABBEY_OBJECTIVE_ORDER,
navigationLinks: [],
serverGameObjects: [],
provenance: {
clientBuild: "preserved RuneWaker source snapshot",
clientArchiveHashes: {
wdb: "e20f91edc3d9924fdcccec2cde665bd7cd4d0d2a205d4d390fdd3c14ff76baf4",
primaryRos: "b4a70e2c17f7f2be9255ae173e483d60a49d51dc0e7211cf069e1256c6a180c6",
populationSnapshot: "13ef6edd3df6e71389aa92d01201889148c0794cf9ecaafdbaf90d3145d2bf7b",
},
databaseAdapter: "portable RuneWaker Zone 102 JSON snapshot",
sourceSnapshot: "scripts/runewaker-pipeline/snapshots/forsaken-abbey-zone-102.json",
coordinateTransform: "threeLocal=(inverse(WDB placement)*server)*(0.1,0.1,-0.1)",
},
validation: {
status: "green",
report: "src/assets/game/dungeons/forsaken-abbey/population-import-report.json",
blockers: [],
warnings: [
"Creature ROS files expose static geometry; HealerMan supplies procedural movement and combat motion.",
"101 level-zero quest objects, scripted props, doors, transports, and treasure rows remain source-audited but are not combat entities.",
"Collision includes decorative primary-ROS geometry and needs a visual playtest pass.",
"WDB-managed secondary doodads and effects are not assembled yet.",
],
},
} as const satisfies DungeonDefinition;