export const TERRAIN = { plains: { label: '平原', bonus: 1.0, glyph: 'plains' }, forest: { label: '森林', bonus: 1.2, glyph: 'forest' }, mountain: { label: '山地', bonus: 1.5, glyph: 'mountain' }, city: { label: '城市', bonus: 1.3, glyph: 'city' }, }; export const RESOURCES = { gold: { label: '金幣', short: '金' }, food: { label: '糧食', short: '糧' }, wood: { label: '木材', short: '木' }, stone: { label: '石料', short: '石' }, }; export const BUILDINGS = { walls: { id: 'walls', label: '城牆', icon: '🧱', image: 'assets/images/walls.png', cost: { wood: 10, stone: 15 }, effect: '+0.3 防禦加成', blurb: '高聳的城垛與厚重石牆,讓守軍彷彿有大地為盾。', accent: '#9aa7b4', }, barracks: { id: 'barracks', label: '兵營', icon: '🏛️', image: 'assets/images/barracks.png', cost: { wood: 8, stone: 5 }, effect: '徵兵金幣成本降至 2', blurb: '操練場、軍械庫與老練士官,讓新兵更容易成軍。', accent: '#c98a4b', }, market: { id: 'market', label: '市場', icon: '🏪', image: 'assets/images/market.png', cost: { gold: 10, wood: 5, stone: 3 }, effect: '每回合 +2 金幣收入', blurb: '商人、商隊與喧鬧的市集,讓金幣穩定流入國庫。', accent: '#e0b34c', }, }; export const PERSONALITY = { aggressive: { label: '侵略', blurb: '先發制人,極少讓步。' }, defensive: { label: '防禦', blurb: '堅守防線,珍視和平。' }, diplomatic: { label: '外交', blurb: '願意結盟與貿易。' }, mercantile: { label: '商業', blurb: '利潤先於征服。' }, }; const mainlandTerritories = [ { id: 'frosthold', name: '霜堡', type: 'mountain', owner: 'frost_wardens', armies: 3, resources: { gold: 1, food: 3, wood: 2, stone: 5 }, adjacentTo: ['northkeep', 'whisperfen'] }, { id: 'northkeep', name: '北境城', type: 'city', owner: 'iron_legion', armies: 3, resources: { gold: 4, food: 4, wood: 1, stone: 2 }, adjacentTo: ['frosthold', 'iron_hills', 'greenwood'] }, { id: 'iron_hills', name: '鐵丘', type: 'mountain', owner: 'iron_legion', armies: 2, resources: { gold: 2, food: 3, wood: 0, stone: 4 }, adjacentTo: ['northkeep', 'crossroads'] }, { id: 'whisperfen', name: '低語沼', type: 'forest', owner: 'frost_wardens', armies: 2, resources: { gold: 1, food: 3, wood: 4, stone: 0 }, adjacentTo: ['frosthold', 'greenwood'] }, { id: 'greenwood', name: '翠林', type: 'forest', owner: 'green_pact', armies: 2, resources: { gold: 1, food: 3, wood: 4, stone: 0 }, adjacentTo: ['northkeep', 'whisperfen', 'crossroads', 'silver_bay'] }, { id: 'crossroads', name: '十字路口', type: 'plains', owner: null, armies: 0, resources: { gold: 2, food: 2, wood: 1, stone: 1 }, adjacentTo: ['iron_hills', 'greenwood', 'desert_gate', 'stonehaven'] }, { id: 'desert_gate',name: '沙門', type: 'plains', owner: 'sand_empire', armies: 2, resources: { gold: 3, food: 3, wood: 0, stone: 2 }, adjacentTo: ['crossroads', 'ashlands'] }, { id: 'silver_bay', name: '銀灣', type: 'city', owner: 'green_pact', armies: 3, resources: { gold: 5, food: 2, wood: 1, stone: 1 }, adjacentTo: ['greenwood', 'stonehaven'] }, { id: 'stonehaven', name: '石港', type: 'mountain', owner: 'sand_empire', armies: 2, resources: { gold: 2, food: 3, wood: 0, stone: 5 }, adjacentTo: ['crossroads', 'silver_bay', 'dragon_peak', 'ashlands'] }, { id: 'ashlands', name: '灰燼原', type: 'plains', owner: 'crimson_horde', armies: 3, resources: { gold: 2, food: 4, wood: 1, stone: 3 }, adjacentTo: ['desert_gate', 'stonehaven'] }, { id: 'dragon_peak',name: '龍峰', type: 'mountain', owner: 'void_covenant', armies: 4, resources: { gold: 1, food: 2, wood: 0, stone: 6 }, adjacentTo: ['stonehaven', 'sunfield'] }, { id: 'sunfield', name: '日野', type: 'plains', owner: 'void_covenant', armies: 2, resources: { gold: 3, food: 4, wood: 1, stone: 0 }, adjacentTo: ['dragon_peak'] }, ]; const mainlandFactions = [ { id: 'iron_legion', name: '鐵軍團', personality: 'aggressive', color: '#d24b4b', crest: 'legion', territories: ['northkeep', 'iron_hills'], gold: 20, food: 10, wood: 5, stone: 15, blurb: '北方鑄造廠鍛出的紀律之師。' }, { id: 'green_pact', name: '翠盟', personality: 'defensive', color: '#5fae72', crest: 'leaf', territories: ['greenwood', 'silver_bay'], gold: 15, food: 20, wood: 25, stone: 5, blurb: '古老森林與銀色港灣的守望者。' }, { id: 'sand_empire', name: '沙帝國', personality: 'mercantile', color: '#e0b34c', crest: 'sun', territories: ['desert_gate', 'stonehaven'], gold: 30, food: 8, wood: 2, stone: 10, blurb: '逐一買下綠洲的商隊領主。' }, { id: 'void_covenant', name: '虛空議會', personality: 'diplomatic', color: '#a77bd6', crest: 'eye', territories: ['dragon_peak', 'sunfield'], gold: 10, food: 5, wood: 2, stone: 20, blurb: '言語帶有非自然份量的山中祕法師。' }, { id: 'frost_wardens', name: '霜衛', personality: 'defensive', color: '#6fb7d9', crest: 'snow', territories: ['frosthold', 'whisperfen'], gold: 10, food: 12, wood: 15, stone: 18, blurb: '凍土高原上沉默的哨兵。' }, { id: 'crimson_horde', name: '赤紅部落', personality: 'aggressive', color: '#e2663f', crest: 'fang', territories: ['ashlands'], gold: 15, food: 10, wood: 5, stone: 12, blurb: '專撿灰燼未燒盡之物的悍匪。' }, ]; const archipelagoTerritories = [ { id: 'coral_haven', name: '珊瑚港', type: 'city', owner: 'tide_lords', armies: 3, resources: { gold: 5, food: 3, wood: 1, stone: 1 }, adjacentTo: ['tidecrest', 'stormwatch'] }, { id: 'tidecrest', name: '潮冠', type: 'plains', owner: 'tide_lords', armies: 2, resources: { gold: 2, food: 3, wood: 2, stone: 1 }, adjacentTo: ['coral_haven', 'pearl_shoals', 'whale_rock'] }, { id: 'whale_rock', name: '鯨岩', type: 'mountain', owner: 'deep_ones', armies: 3, resources: { gold: 2, food: 2, wood: 0, stone: 4 }, adjacentTo: ['tidecrest'] }, { id: 'stormwatch', name: '風暴哨', type: 'mountain', owner: 'storm_kin', armies: 3, resources: { gold: 1, food: 3, wood: 0, stone: 5 }, adjacentTo: ['coral_haven', 'pearl_shoals', 'driftwood'] }, { id: 'pearl_shoals', name: '珍珠淺灘', type: 'plains', owner: null, armies: 0, resources: { gold: 3, food: 2, wood: 1, stone: 1 }, adjacentTo: ['tidecrest', 'stormwatch', 'ember_isle', 'serpent_bay'] }, { id: 'ember_isle', name: '餘燼島', type: 'mountain', owner: 'flame_brood', armies: 3, resources: { gold: 2, food: 3, wood: 0, stone: 6 }, adjacentTo: ['pearl_shoals', 'obsidian_rock'] }, { id: 'driftwood', name: '漂流木', type: 'forest', owner: 'storm_kin', armies: 2, resources: { gold: 1, food: 2, wood: 5, stone: 0 }, adjacentTo: ['stormwatch', 'kelp_forest'] }, { id: 'serpent_bay', name: '蛇灣', type: 'city', owner: null, armies: 0, resources: { gold: 4, food: 2, wood: 1, stone: 2 }, adjacentTo: ['pearl_shoals', 'obsidian_rock', 'fog_marsh'] }, { id: 'obsidian_rock', name: '黑曜岩', type: 'mountain', owner: 'flame_brood', armies: 2, resources: { gold: 1, food: 3, wood: 0, stone: 5 }, adjacentTo: ['ember_isle', 'serpent_bay', 'skyspire'] }, { id: 'kelp_forest', name: '海藻林', type: 'forest', owner: 'deep_ones', armies: 2, resources: { gold: 1, food: 4, wood: 3, stone: 0 }, adjacentTo: ['driftwood'] }, { id: 'fog_marsh', name: '霧沼', type: 'forest', owner: 'mist_walkers', armies: 3, resources: { gold: 2, food: 4, wood: 3, stone: 0 }, adjacentTo: ['serpent_bay', 'skyspire', 'sunken_ruins'] }, { id: 'skyspire', name: '天尖塔', type: 'mountain', owner: 'mist_walkers', armies: 2, resources: { gold: 3, food: 3, wood: 0, stone: 4 }, adjacentTo: ['obsidian_rock', 'fog_marsh'] }, { id: 'sunken_ruins', name: '沉沒遺跡', type: 'city', owner: 'wraith_fleet', armies: 3, resources: { gold: 4, food: 3, wood: 1, stone: 3 }, adjacentTo: ['fog_marsh', 'leviathan_cove'] }, { id: 'leviathan_cove',name: '巨獸灣', type: 'plains', owner: 'wraith_fleet', armies: 2, resources: { gold: 2, food: 3, wood: 2, stone: 1 }, adjacentTo: ['sunken_ruins'] }, ]; const archipelagoFactions = [ { id: 'tide_lords', name: '潮汐領主', personality: 'mercantile', color: '#59c2d6', crest: 'wave', territories: ['coral_haven', 'tidecrest'], gold: 25, food: 15, wood: 8, stone: 5, blurb: '艦隊控制每道海峽的商業親王。' }, { id: 'storm_kin', name: '風暴氏族', personality: 'aggressive', color: '#5c86d6', crest: 'bolt', territories: ['stormwatch', 'driftwood'], gold: 15, food: 10, wood: 20, stone: 15, blurb: '崇拜雷電的迎風崖掠奪者。' }, { id: 'flame_brood', name: '烈焰裔', personality: 'aggressive', color: '#e2583e', crest: 'flame', territories: ['ember_isle', 'obsidian_rock'], gold: 12, food: 5, wood: 2, stone: 25, blurb: '從火山群島孵化的龍裔。' }, { id: 'mist_walkers', name: '霧行者', personality: 'diplomatic', color: '#b07bd6', crest: 'mist', territories: ['fog_marsh', 'skyspire'], gold: 18, food: 12, wood: 10, stone: 10, blurb: '在霧中交易祕密的蒙面使節。' }, { id: 'deep_ones', name: '深海者', personality: 'defensive', color: '#54a878', crest: 'scale', territories: ['whale_rock', 'kelp_forest'], gold: 12, food: 15, wood: 12, stone: 12, blurb: '沉沒森林的古老守護者。' }, { id: 'wraith_fleet', name: '幽靈艦隊', personality: 'aggressive', color: '#d8c56a', crest: 'skull', territories: ['sunken_ruins', 'leviathan_cove'], gold: 20, food: 10, wood: 8, stone: 10, blurb: '自廢墟之城駛出的鬼船。' }, ]; export const MAPS = { mainland: { id: 'mainland', name: '大陸王座', kicker: '經典大陸爭霸', description: '十二行省、六位強敵、一座王座。開闊邊界與漫長補給線,獎勵大膽的征服者。', territories: mainlandTerritories, factions: mainlandFactions, positions: { frosthold: [150, 120], northkeep: [420, 120], iron_hills: [700, 120], whisperfen: [150, 315], greenwood: [420, 315], crossroads: [700, 315], desert_gate: [980, 315], silver_bay: [420, 515], stonehaven: [700, 515], ashlands: [980, 515], dragon_peak: [700, 690], sunfield: [980, 690], }, viewBox: [0, 0, 1140, 780], style: 'continent', }, archipelago: { id: 'archipelago', name: '破碎群島', kicker: '島鏈與咽喉要道', description: '十四座島嶼散布在狂暴海域。你掌握的每道海峽,都是抵在對手喉嚨上的刀。', territories: archipelagoTerritories, factions: archipelagoFactions, positions: { coral_haven: [150, 110], tidecrest: [410, 110], whale_rock: [670, 110], stormwatch: [150, 285], pearl_shoals: [410, 285], ember_isle: [670, 285], driftwood: [150, 460], serpent_bay: [410, 460], obsidian_rock: [670, 460], kelp_forest: [150, 635], fog_marsh: [410, 635], skyspire: [670, 635], sunken_ruins: [410, 800], leviathan_cove: [670, 800], }, viewBox: [0, 0, 1140, 900], style: 'isles', }, }; export const MAP_LIST = [MAPS.mainland, MAPS.archipelago]; export function factionById(mapId, id) { return MAPS[mapId].factions.find((f) => f.id === id) || null; } export function territoryTemplate(mapId, id) { const t = MAPS[mapId].territories.find((x) => x.id === id); return t ? JSON.parse(JSON.stringify(t)) : null; }