/** * System-agnostic map population. * * Works in ANY Foundry world: never assumes a game system, actors, or * compendia. Labelled rooms/features become GM map Notes; optional ambient * lights add atmosphere. Lightweight by design. */ const MODULE_ID = "mapwright"; const BOOK_ICON = "icons/svg/book.svg"; function note(x, y, text, gs, kind) { return { x: Math.round(x * gs), y: Math.round(y * gs), text, texture: { src: BOOK_ICON }, iconSize: Math.max(32, Math.round(gs * 0.5)), fontSize: Math.max(16, Math.round(gs * 0.24)), global: false, flags: { [MODULE_ID]: { generated: true, kind } } }; } /** Notes for each labelled building room. */ export function buildRoomNotes(layout, gs) { const out = []; for (const room of layout.rooms) { if (!room.label) continue; out.push(note(room.cx, room.cy, room.locked ? `${room.label} (locked)` : room.label, gs, "room-note")); } return out; } /** Notes for cave/outdoor feature points ({x,y,label}). */ export function buildFeatureNotes(features, gs) { return (features ?? []).map((f) => note(f.x, f.y, f.label, gs, "feature-note")); } /** Soft ambient light per building room. */ export function buildRoomLights(layout, gs, subtype) { return layout.rooms.map((room) => ({ x: Math.round(room.cx * gs), y: Math.round(room.cy * gs), walls: true, vision: false, config: { dim: Math.round(Math.max(room.w, room.h) * gs * 0.9), bright: Math.round(Math.max(room.w, room.h) * gs * 0.35), color: subtype === "fantasy" ? "#ffb46b" : "#fdf6e3", luminosity: 0.35, alpha: 0.35 }, flags: { [MODULE_ID]: { generated: true } } })); } /** A warm torch light at each cave feature point. */ export function buildFeatureLights(features, gs, animate = true) { return (features ?? []).map((f) => ({ x: Math.round(f.x * gs), y: Math.round(f.y * gs), walls: true, vision: false, config: { dim: Math.round(gs * 4), bright: Math.round(gs * 1.6), color: "#ff9d4a", luminosity: 0.4, alpha: 0.3, animation: animate ? { type: "torch", speed: 3, intensity: 4 } : {} }, flags: { [MODULE_ID]: { generated: true } } })); }