import level01 from './level01.js'; import level02 from './level02.js'; import level03 from './level03.js'; import level04 from './level04.js'; import level05 from './level05.js'; import level06 from './level06.js'; import level07 from './level07.js'; import level08 from './level08.js'; import level09 from './level09.js'; import level10 from './level10.js'; import level11 from './level11.js'; // Campaigns group levels into themed "maps" for the level select screen. // Each campaign gets its own background art (bgKey), menu theme music // (musicKey), and in-level look (data/themes.js), so adding a new campaign // is: create its levels, add a bg image + manifest entry, add an entry to // THEMES, add a row here. Node positions are in 960x540 design units (NOT multiplied by // WORLD_SCALE - the scene scales them), and the path is rendered as a line // through them in order. `positions` may be omitted to auto-place the // campaign's levels: a 2-lane circuit (top lane right->left, bottom lane // left->right, finish flag bottom-right) that comfortably fits up to ~12 // levels (see positioning.js). Give explicit `positions` only when you want // a custom layout - the auto-layout keeps every node in the open band of // the background art (y roughly 268-412) and clear of the title plate and // bottom chrome. export const CAMPAIGNS = [ { id: 'campaign01', name: 'Evergreen Lake', bgKey: 'campaign01_bg', levels: [level01, level02, level03, level04, level05, level06, level07, level08, level09, level10], }, { id: 'campaign02', name: 'Underprivileged Community', bgKey: 'campaign02_bg', // Menu music for this campaign's map in LevelSelect (util/music.js // playMenuTrack); undefined = the main title theme. musicKey: 'urban_trap_theme', // Its old levels (level04-06) moved into campaign01 while it grows toward // 10; add campaign02's own levels here as they're built. An empty // campaign renders as a bare map with "0/0 cleared" - fine as scaffolding. levels: [level11], }, ]; export const LEVELS = CAMPAIGNS.flatMap((c) => c.levels); export function getLevelById(id) { return LEVELS.find((level) => level.id === id); } export function getCampaignById(id) { return CAMPAIGNS.find((c) => c.id === id); } export function getCampaignOfLevel(levelId) { return CAMPAIGNS.find((c) => c.levels.some((l) => l.id === levelId)) || null; } export function getNextLevelId(id) { const index = LEVELS.findIndex((level) => level.id === id); if (index === -1 || index === LEVELS.length - 1) return null; return LEVELS[index + 1].id; }