// ============================================================ // WARLORD'S FATE — static game data // Stylized hex-map of China + factions, cities, characters // ============================================================ export const START_YEAR = 193; export const START_MONTH = 1; // ---------- HEX MAP ---------- // Each char = one hex tile. '.' water. Lowercase letter = province plains, // uppercase = mountainous hex of that province. // Provinces: l liangzhou, o yongzhou, y youzhou, j jizhou, q qingzhou, // a yanzhou, s sili, x xuzhou, u yuzhou, n jingzhou, h yangzhou, g yizhou export const MAP_ROWS = [ "llllllll...................", "lLLlllll.yyyyyyyY..........", "lLLLllll.yyyyyyyYY.........", "llLLLlll.yyyyyyyyY.........", "lllLoooooyyyyyyyYY.........", "llllooooojJJjjjjj..........", "lllloooooojJjjjqqqqQQq.....", "...oooosssjJjjjqqqqQQQq....", "....ooossssaaaaaqqqqQQq....", ".....oSSSssaaaaaaqqqqqq....", ".gggggoSSSaaaaaaaqqqqq.....", ".gggggnnssSaaaaaaqqqqx.....", ".gGGggnnnnnaaaaaxxxxxxh....", ".ggGGGnnnnuuuuUUxxxxxhhh...", "ggggGGnnnnnuuuuuxxxxhhhhh..", ".ggggGnnnnnnuuuuuhhhhhhhh..", ".gggggnnnnnnnnnhhhhhhhhhh..", ".ggggggNnnnnnnnhhhhhhhhhh..", ".ggggggNNnnnnnnhhhhhhhhhh..", ".ggggggGNnnnnnn..hhhhhhh...", ".gggggggNnnnnnn...hhhh.....", "..gggggGG.nnnn.............", "..gggggG...................", "..gggggG...................", "...gggg....................", "...gggg....................", ]; export const HEX_R = 3.1; // world radius of a hex export function hexToWorld(col, row) { const w = Math.sqrt(3) * HEX_R; return [col * w + (row % 2 ? w / 2 : 0), row * 1.5 * HEX_R]; } // ---------- PROVINCES ---------- export const PROVINCES = { l: { name: "Liangzhou", cn: "凉州", tint: 0xc9ae7c, mount: 0.85, desc: "Western corridors. Horse country of hard riders." }, o: { name: "Yongzhou", cn: "雍州", tint: 0xc4ad7d, mount: 0.55, desc: "Old Qin lands guarding the Guanzhong plain." }, y: { name: "Youzhou", cn: "幽州", cn2: "", tint: 0xc7b489, mount: 0.7, desc: "Northern frontier against the steppe." }, j: { name: "Jizhou", cn: "冀州", tint: 0xcdbb8b, mount: 0.45, desc: "The richest northern plains, granary of war." }, q: { name: "Qingzhou", cn: "青州", tint: 0xcabb90, mount: 0.4, desc: "Eastern peninsula of salt and hills." }, a: { name: "Yanzhou", cn: "兖州", tint: 0xcdbc8e, mount: 0.3, desc: "Central crossroads — whoever holds it threatens the capital." }, s: { name: "Sili", cn: "司隶", tint: 0xc6b183, mount: 0.6, desc: "The imperial domain: Luoyang and the passes." }, x: { name: "Xuzhou", cn: "徐州", tint: 0xc9bd94, mount: 0.25, desc: "Rich eastern lowlands, fought over by every warlord." }, u: { name: "Yuzhou", cn: "豫州", tint: 0xc7b78c, mount: 0.3, desc: "Ancient heartland of the Central Plains." }, n: { name: "Jingzhou", cn: "荆州", tint: 0xa8ab77, mount: 0.55, desc: "Vast southern rivers region. Seven commanderies of grain and boats." }, h: { name: "Yangzhou", cn: "扬州", tint: 0x9cab7d, mount: 0.5, desc: "Lakeland and rivers below the Yangtze." }, g: { name: "Yizhou", cn: "益州", tint: 0x99a674, mount: 0.95, desc: "The basin behind mountains — a nation unto itself." }, }; export const PROVINCE_LETTERS = Object.keys(PROVINCES); // ---------- CITIES ---------- // [id, name, cn, province, col, row, basePop(thousands), commerce, fertility] export const CITY_DEFS = [ ["ji", "Ji", "蓟", "y", 12, 2, 180, 52, 60], ["beiping", "Beiping", "北平", "y", 15, 2, 150, 46, 55], ["ye", "Ye", "邺", "j", 12, 6, 220, 72, 85], ["nanpi", "Nanpi", "南皮", "j", 15, 5, 160, 58, 70], ["linzi", "Linzi", "临淄", "q", 17, 7, 170, 60, 62], ["beihai", "Beihai", "北海", "q", 21, 8, 130, 50, 55], ["puyang", "Puyang", "濮阳", "a", 12, 9, 140, 55, 68], ["chenliu", "Chenliu", "陈留", "a", 14, 10, 150, 62, 70], ["luoyang", "Luoyang", "洛阳", "s", 9, 9, 300, 88, 60], ["hongnong", "Hongnong", "弘农", "s", 8, 11, 90, 40, 48], ["changan", "Chang'an", "长安", "o", 6, 8, 280, 84, 65], ["anding", "Anding", "安定", "o", 5, 6, 80, 34, 45], ["wuwei", "Wuwei", "武威", "l", 2, 3, 100, 42, 50], ["tianshui", "Tianshui", "天水", "l", 3, 5, 110, 44, 52], ["xiaopei", "Xiaopei", "小沛", "x", 16, 12, 110, 44, 66], ["xiapi", "Xiapi", "下邳", "x", 19, 13, 190, 64, 80], ["xuchang", "Xuchang", "许昌", "u", 14, 13, 170, 66, 78], ["wan", "Wan", "宛", "u", 12, 14, 140, 54, 64], ["runan", "Runan", "汝南", "u", 15, 14, 150, 50, 72], ["shouchun", "Shouchun", "寿春", "h", 18, 15, 160, 56, 76], ["jianye", "Jianye", "建业", "h", 21, 14, 200, 74, 72], ["lujiang", "Lujiang", "庐江", "h", 18, 17, 120, 48, 66], ["wu", "Wu", "吴", "h", 21, 17, 170, 68, 74], ["xiangyang", "Xiangyang", "襄阳", "n", 10, 14, 230, 76, 78], ["jiangling", "Jiangling", "江陵", "n", 11, 17, 180, 62, 82], ["jiangxia", "Jiangxia", "江夏", "n", 14, 16, 140, 52, 70], ["changsha", "Changsha", "长沙", "n", 11, 20, 160, 58, 80], ["hanzhong", "Hanzhong", "汉中", "g", 4, 11, 120, 48, 68], ["chengdu", "Chengdu", "成都", "g", 3, 15, 240, 80, 92], ["zitong", "Zitong", "梓潼", "g", 3, 13, 110, 44, 66], ["jiangzhou", "Jiangzhou", "江州", "g", 6, 17, 130, 50, 70], ["yunnan", "Yunnan", "云南", "g", 6, 22, 90, 38, 58], ]; // ---------- FACTIONS ---------- // personality: hawk | diplomat | turtle | merchant | opportunist | fanatic export const FACTION_DEFS = [ { id: "cao", name: "Cao Cao", title: "Protector of the East", color: "#3b62c8", leader: "caocao", personality: "hawk", desc: "Ruthless genius of the Central Plains. Peerless officers, cold ambition.", startCities: ["chenliu"] }, { id: "liu", name: "Liu Bei", title: "Lord of Benevolence", color: "#43a05e", leader: "liubei", personality: "diplomat", desc: "A sandal-weaver who swears brotherhood with heroes. The people love him.", startCities: ["xiaopei"] }, { id: "sun", name: "Sun Ce", title: "Little Conqueror", color: "#cc4633", leader: "sunce", personality: "hawk", desc: "The Tiger of Jiangdong's son, carving a river realm with bold strokes.", startCities: ["jianye", "wu"] }, { id: "yuan", name: "Yuan Shao", title: "Lord of Four Generations", color: "#8f6ad6", leader: "yuanshao", personality: "hawk", desc: "Greatest house of the age — vast lands, divided court.", startCities: ["ye", "nanpi"] }, { id: "gongsun", name: "Gongsun Zan", title: "White Horse General", color: "#dfe5ee", leader: "gongsunzan", personality: "hawk", desc: "Iron cavalry of the northern frontier.", startCities: ["beiping", "ji"] }, { id: "dong", name: "Dong Zhuo", title: "Tyrant Chancellor", color: "#50606e", leader: "dongzhuo", personality: "fanatic", desc: "He burns what he cannot rule. The Empire hates him — and fears him more.", startCities: ["changan", "luoyang", "hongnong"] }, { id: "ma", name: "Ma Teng", title: "Lion of the West", color: "#dd8030", leader: "mateng", personality: "opportunist", desc: "Descendant of heroes, master of the western horse.", startCities: ["wuwei"] }, { id: "liuzhang", name: "Liu Zhang", title: "Lord of Shu", color: "#2ba3a0", leader: "liuzhang", personality: "turtle", desc: "Gentle master of the rich mountain basin.", startCities: ["chengdu", "zitong", "jiangzhou"] }, { id: "liubiao", name: "Liu Biao", title: "Warden of Jingzhou", color: "#c05a9e", leader: "liubiao", personality: "turtle", desc: "Scholar-lord of the great southern rivers.", startCities: ["xiangyang", "jiangling", "jiangxia"] }, { id: "yuanshu", name: "Yuan Shu", title: "General of the Rear", color: "#cf7052", leader: "yuanshu", personality: "fanatic", desc: "Proud cousin of Yuan Shao. His ambition outstrips his sense.", startCities: ["shouchun"] }, { id: "lubu", name: "Lü Bu", title: "Flying General", color: "#9e2b3c", leader: "lubu", personality: "opportunist", desc: "Matchless in battle. Matchless in treachery. Two fathers already betrayed.", startCities: ["puyang"] }, { id: "tao", name: "Tao Qian", title: "Governor of Xu", color: "#a08b62", leader: "taoqian", personality: "diplomat", desc: "An aging, kindly governor in a land everyone covets.", startCities: ["xiapi"] }, { id: "kong", name: "Kong Rong", title: "Scholar of the North", color: "#7fa8b8", leader: "kongrong", personality: "diplomat", desc: "Descendant of Confucius. Braver with words than armies.", startCities: ["beihai"] }, { id: "zhanglu", name: "Zhang Lu", title: "Master of the Ways", color: "#7c8f4a", leader: "zhanglu", personality: "turtle", desc: "Priest-king of the Hanzhong valley, beloved by his flock.", startCities: ["hanzhong"] }, { id: "hansui", name: "Han Sui", title: "Old Friend of the West",color: "#8a6a42", leader: "hansui", personality: "opportunist", desc: "Ma Teng's sworn brother, holding Tianshui's passes.", startCities: ["tianshui"] }, { id: "huangjin", name: "Yellow Turbans", title: "Remnant Zealots", color: "#c9b93a", leader: "guanhai", personality: "fanatic", desc: "The shattered sect still preaches rebellion in the hills.", startCities: ["linzi", "runan"] }, { id: "neutral", name: "Local Garrison", title: "Imperial Remnant", color: "#8a8a82", leader: null, personality: "turtle", desc: "Militias loyal to a fading throne.", startCities: ["xuchang", "wan", "lujiang", "changsha", "anding", "yunnan"] }, ]; export const PLAYER_SPAWN_CITIES = ["xuchang", "wan", "lujiang", "changsha", "yunnan", "anding"]; // ---------- TRAITS ---------- export const TRAITS = { brave: { name: "Brave", icon: "⚔", desc: "+charge damage, morale holds longer" }, cautious: { name: "Cautious", icon: "🛡", desc: "fewer losses when losing, resists ambush" }, impulsive: { name: "Impulsive", icon: "⚡", desc: "wild swings in battle — brilliant or reckless" }, loyalheart: { name: "Loyal Heart", icon: "❤", desc: "loyalty rarely decays" }, ambitious: { name: "Ambitious", icon: "🏔", desc: "demands promotion; loyalty falls without glory" }, greedy: { name: "Greedy", icon: "💰", desc: "higher salary, can be bribed by enemies" }, honorable: { name: "Honorable", icon: "⛩", desc: "refuses bribes; executing prisoners angers them" }, cruel: { name: "Cruel", icon: "🩸", desc: "+siege assault, −public order, inspires fear" }, charismatic: { name: "Charismatic", icon: "✨", desc: "boosts nearby troops' morale and recruiting" }, genius: { name: "Genius", icon: "☯", desc: "stratagems far more likely to succeed" }, arrogant: { name: "Arrogant", icon: "😤", desc: "clashes with peers; hard to advise" }, kind: { name: "Kind", icon: "🌸", desc: "+public order wherever stationed" }, naval: { name: "River Master", icon: "⛵", desc: "+power in river battles" }, cavalry: { name: "Cavalry Expert",icon:"🐎", desc: "cavalry under him hit harder" }, vanguard: { name: "Vanguard", icon: "🗡", desc: "leads devastating first assaults" }, admin: { name: "Administrator",icon: "📐", desc: "+city tax and construction speed" }, engineer: { name: "Engineer", icon: "🔧", desc: "sieges progress faster, walls matter less" }, spymaster: { name: "Spy Master", icon: "👁", desc: "espionage missions succeed more often" }, scholar: { name: "Scholar", icon: "📖", desc: "academies train officers faster" }, ironwill: { name: "Iron Will", icon: "🗿", desc: "never routs early; wounded recovers faster" }, }; // ---------- HERO SKILLS ---------- export const SKILLS = { greendragon: { name: "Green Dragon Strike", cn: "青龙偃月", type: "charge", pow: 2.2, text: "cleaves through the enemy line like a crescent moon" }, tigerroar: { name: "Tiger Roar", cn: "据水断桥", type: "morale", pow: 26, text: "roars so terribly the enemy line wavers and breaks" }, dragonspear: { name: "Dragon Spear", cn: "龙胆亮银", type: "charge", pow: 1.9, text: "rides seven times through enemy ranks, unscathed" }, skypiercer: { name: "Sky Piercer", cn: "方天画戟", type: "duel", pow: 3.0, text: "seeks the enemy champion amid the storm of halberds" }, fireattack: { name: "Fire Attack", cn: "火计", type: "fire", pow: 1.6, text: "the wind turns, and flame devours the foe" }, eightform: { name: "Eight Formations", cn: "八阵图", type: "defense",pow: 0.45,text: "the ranks fold into an unfathomable maze of stones" }, patience: { name: "Still Water", cn: "隐忍", type: "defense",pow: 0.3, text: "waits, unmoving, until the enemy spends his fury" }, weststorm: { name: "Western Storm", cn: "西凉铁骑", type: "charge", pow: 2.1, text: "leads a tide of horsemen that nothing can stand against" }, fallingstar: { name: "Drawn Bow, Falling Star", cn: "百步穿杨", type: "volley", pow: 2.0, text: "draws the great bow — the arrow flies beyond sight and strikes" }, ironguard: { name: "Iron Guard", cn: "古之恶来", type: "defense",pow: 0.4, text: "stands alone at the gate and the gate does not fall" }, madox: { name: "Mad Ox", cn: "虎痴", type: "duel", pow: 2.4, text: "wrestles bulls bare-handed — men scatter before him" }, thunder: { name: "Thunder at the Walls",cn: "威震逍遥津",type:"morale", pow: 22, text: "his name alone drains the courage from the foe" }, littleconq: { name: "Little Conqueror", cn: "小霸王", type: "charge", pow: 2.0, text: "breaks the siege lines with sheer joyous fury" }, divinearchery:{ name: "Divine Archery", cn: "辕门射戟", type: "volley", pow: 1.7, text: "pierces the small branch at a hundred paces — both armies stare" }, ruthlessscheme:{ name: "Ruthless Scheme", cn: "毒士", type: "fire", pow: 1.5, text: "whispers one sentence, and the battlefield turns" }, vengeance: { name: "Vengeance", cn: "恩怨分明", type: "morale", pow: 18, text: "points at the traitor's banner — the soldiers howl" }, rally: { name: "Rally", cn: "激励", type: "morale", pow: 12, text: "raises the standard and steadies the line" }, volley: { name: "Arrow Storm", cn: "万箭齐发", type: "volley", pow: 1.4, text: "a thousand arrows darken the sky" }, chargecall: { name: "Charge!", cn: "冲锋", type: "charge", pow: 1.5, text: "sounds the horns and rides down the wavering foe" }, ambush: { name: "Ambush", cn: "埋伏", type: "fire", pow: 1.45,text: "signals from the tall grass — the trap closes" }, }; // ---------- GENERALS ---------- // n,f faction,t title,b birth,st [ldr,war,int,pol,cha],tr traits,sk skill export const GENERAL_DEFS = [ // --- Cao Cao's camp --- { n: "Cao Cao", f: "cao", t: "Warlord of Chenliu", b: 155, st: [96, 84, 92, 94, 90], tr: ["genius", "ambitious", "arrogant"], sk: "ruthlessscheme" }, { n: "Xiahou Dun", f: "cao", t: "Fierce General", b: 157, st: [86, 90, 56, 62, 70], tr: ["brave", "ironwill"], sk: "chargecall" }, { n: "Xiahou Yuan", f: "cao", t: "Swift Cavalry", b: 158, st: [84, 87, 60, 55, 64], tr: ["impulsive", "cavalry"], sk: "chargecall" }, { n: "Cao Ren", f: "cao", t: "Steadfast Defender", b: 168, st: [88, 82, 66, 60, 58], tr: ["cautious", "ironwill"], sk: "ironguard" }, { n: "Dian Wei", f: "cao", t: "Coming Evil", b: 158, st: [70, 96, 32, 20, 40], tr: ["brave", "loyalheart"], sk: "madox" }, { n: "Xu Chu", f: "cao", t: "Mad Tiger", b: 169, st: [68, 95, 36, 22, 44], tr: ["brave", "loyalheart"], sk: "madox" }, { n: "Yu Jin", f: "cao", t: "Disciplined Officer", b: 160, st: [82, 78, 64, 58, 52], tr: ["cautious"], sk: "rally" }, { n: "Xun Yu", f: "cao", t: "King's Advisor", b: 163, st: [52, 30, 96, 98, 84], tr: ["scholar", "honorable", "admin"], sk: "patience" }, { n: "Guo Jia", f: "cao", t: "Young Phoenix Eye", b: 170, st: [46, 24, 97, 74, 80], tr: ["genius", "impulsive"], sk: "fireattack" }, // --- Liu Bei's brotherhood --- { n: "Liu Bei", f: "liu", t: "Lord of Virtue", b: 161, st: [88, 68, 74, 82, 99], tr: ["charismatic", "kind", "loyalheart"], sk: "rally" }, { n: "Guan Yu", f: "liu", t: "Beautiful Beard", b: 160, st: [95, 97, 78, 62, 84], tr: ["brave", "honorable", "loyalheart", "arrogant"], sk: "greendragon" }, { n: "Zhang Fei", f: "liu", t: "Yan Man", b: 165, st: [84, 96, 40, 30, 62], tr: ["brave", "impulsive", "cruel"], sk: "tigerroar" }, { n: "Jian Yong", f: "liu", t: "Wandering Monk-Advisor", b: 158, st: [40, 22, 78, 72, 84], tr: ["kind"], sk: "rally" }, { n: "Mi Zhu", f: "liu", t: "Wealthy Host", b: 162, st: [42, 26, 68, 82, 74], tr: ["admin", "loyalheart"], sk: "rally" }, // --- Sun clan --- { n: "Sun Ce", f: "sun", t: "Little Conqueror", b: 175, st: [90, 91, 74, 62, 92], tr: ["charismatic", "brave", "vanguard"], sk: "littleconq" }, { n: "Zhou Yu", f: "sun", t: "Marquis of Beauty", b: 175, st: [92, 76, 96, 80, 94], tr: ["genius", "naval", "charismatic"], sk: "fireattack" }, { n: "Huang Gai", f: "sun", t: "Old Veteran", b: 148, st: [78, 80, 58, 52, 60], tr: ["ironwill", "naval"], sk: "fireattack" }, { n: "Cheng Pu", f: "sun", t: "Senior General", b: 145, st: [80, 79, 62, 58, 64], tr: ["cautious", "naval"], sk: "rally" }, { n: "Han Dang", f: "sun", t: "River Veteran", b: 150, st: [76, 78, 54, 48, 58], tr: ["naval"], sk: "volley" }, { n: "Zhu Zhi", f: "sun", t: "Governor of Wu", b: 156, st: [70, 62, 66, 76, 66], tr: ["admin"], sk: "rally" }, { n: "Zhang Zhao", f: "sun", t: "Chancellor Material", b: 156, st: [48, 20, 88, 94, 78], tr: ["scholar", "admin"], sk: "patience" }, { n: "Sun Quan", f: "sun", t: "Heir of Jiangdong", b: 182, st: [78, 62, 82, 88, 86], tr: ["kind", "cautious"], sk: "rally", heirOf: "sun" }, // --- Yuan Shao's host --- { n: "Yuan Shao", f: "yuan", t: "Lord of Ye", b: 154, st: [84, 70, 66, 78, 88], tr: ["arrogant", "ambitious"], sk: "chargecall" }, { n: "Yan Liang", f: "yuan", t: "Brave of Hebei", b: 160, st: [78, 91, 42, 30, 48], tr: ["brave", "impulsive"], sk: "chargecall" }, { n: "Wen Chou", f: "yuan", t: "Brave of Hebei", b: 158, st: [76, 90, 40, 28, 46], tr: ["brave", "impulsive"], sk: "chargecall" }, { n: "Zhang He", f: "yuan", t: "Prudent Officer", b: 167, st: [86, 84, 76, 62, 58], tr: ["cautious"], sk: "ambush" }, { n: "Ju Shou", f: "yuan", t: "Loyal Counselor", b: 158, st: [50, 24, 88, 80, 60], tr: ["honorable"], sk: "patience" }, { n: "Tian Feng", f: "yuan", t: "Blunt Strategist", b: 156, st: [48, 26, 90, 74, 52], tr: ["honorable", "arrogant"], sk: "patience" }, { n: "Xu You", f: "yuan", t: "Greedy Advisor", b: 157, st: [44, 22, 89, 66, 62], tr: ["greedy", "arrogant"], sk: "fireattack" }, { n: "Guo Tu", f: "yuan", t: "Court Flatterer", b: 159, st: [40, 18, 78, 70, 66], tr: ["greedy"], sk: "ambush" }, // --- Gongsun Zan --- { n: "Gongsun Zan", f: "gongsun", t: "White Horse General", b: 153, st: [82, 84, 58, 56, 60], tr: ["cavalry", "arrogant"], sk: "weststorm" }, { n: "Zhao Yun", f: "gongsun", t: "Dragon of Changshan", b: 168, st: [92, 98, 76, 58, 82], tr: ["brave", "loyalheart", "kind", "cavalry"], sk: "dragonspear" }, { n: "Tian Kai", f: "gongsun", t: "Frontier Colonel", b: 158, st: [68, 70, 50, 46, 48], tr: [], sk: "volley" }, // --- Dong Zhuo's tyrants --- { n: "Dong Zhuo", f: "dong", t: "Chancellor of State", b: 138, st: [78, 80, 52, 60, 44], tr: ["cruel", "greedy", "ambitious"], sk: "tigerroar" }, { n: "Lü Bu", f: "lubu", t: "Flying General", b: 156, st: [82, 100, 42, 30, 50], tr: ["brave", "ambitious", "impulsive"], sk: "skypiercer", servingDong: true }, { n: "Hua Xiong", f: "dong", t: "Pass Commander", b: 158, st: [74, 88, 44, 32, 44], tr: ["brave"], sk: "chargecall" }, { n: "Li Jue", f: "dong", t: "Bandit General", b: 152, st: [70, 76, 48, 40, 34], tr: ["cruel", "greedy"], sk: "chargecall" }, { n: "Guo Si", f: "dong", t: "Bandit General", b: 153, st: [68, 74, 44, 38, 32], tr: ["cruel", "greedy"], sk: "chargecall" }, { n: "Jia Xu", f: "dong", t: "Poison Scholar", b: 147, st: [56, 30, 98, 84, 62], tr: ["genius", "spymaster"], sk: "ruthlessscheme" }, { n: "Gao Shun", f: "lubu", t: "Camp Rampart", b: 158, st: [84, 88, 58, 40, 42], tr: ["ironwill", "loyalheart"], sk: "ironguard" }, { n: "Zhang Liao", f: "lubu", t: "Quiet Thunder", b: 169, st: [92, 92, 80, 66, 74], tr: ["brave", "loyalheart", "cautious"], sk: "thunder" }, { n: "Chen Gong", f: "lubu", t: "Disillusioned Strategist", b: 161, st: [48, 26, 92, 76, 66], tr: ["honorable"], sk: "ambush" }, // --- West --- { n: "Ma Teng", f: "ma", t: "Lion of Xiliang", b: 145, st: [80, 82, 54, 56, 74], tr: ["brave", "honorable"], sk: "weststorm" }, { n: "Ma Chao", f: "ma", t: "Splendid Stallion", b: 176, st: [88, 97, 56, 34, 72], tr: ["brave", "cavalry", "vanguard", "impulsive"], sk: "weststorm" }, { n: "Pang De", f: "ma", t: "White-Horse Rider", b: 170, st: [82, 90, 58, 44, 52], tr: ["brave", "ironwill"], sk: "chargecall" }, { n: "Ma Dai", f: "ma", t: "Young Cousin", b: 180, st: [74, 78, 62, 50, 56], tr: ["cautious"], sk: "rally" }, { n: "Han Sui", f: "hansui", t: "Elder of the West", b: 144, st: [76, 72, 62, 64, 70], tr: ["cautious"], sk: "rally" }, // --- South & river lords --- { n: "Liu Zhang", f: "liuzhang", t: "Lord of Shu", b: 162, st: [58, 40, 52, 66, 60], tr: ["kind"], sk: "rally" }, { n: "Zhang Ren", f: "liuzhang", t: "Shield of Shu", b: 165, st: [84, 84, 66, 48, 54], tr: ["loyalheart", "cautious"], sk: "ambush" }, { n: "Yan Yan", f: "liuzhang", t: "Old General of Ba", b: 150, st: [78, 76, 58, 54, 60], tr: ["ironwill"], sk: "ironguard" }, { n: "Fa Zheng", f: "liuzhang", t: "Sharp Vengeance", b: 176, st: [50, 24, 94, 78, 64], tr: ["genius"], sk: "vengeance" }, { n: "Liu Biao", f: "liubiao", t: "Warden of Jing", b: 142, st: [64, 44, 74, 84, 80], tr: ["kind", "scholar"], sk: "patience" }, { n: "Kuai Liang", f: "liubiao", t: "Jing Advisor", b: 152, st: [52, 26, 86, 80, 68], tr: ["scholar"], sk: "patience" }, { n: "Cai Mao", f: "liubiao", t: "Naval Commander", b: 155, st: [72, 70, 58, 56, 60], tr: ["naval", "greedy"], sk: "volley" }, { n: "Huang Zhong", f: "neutral", t: "Hidden Dragon of Changsha", b: 148, st: [88, 95, 66, 50, 58], tr: ["brave", "ironwill", "vanguard"], sk: "fallingstar", hidden: true }, { n: "Wei Yan", f: "neutral", t: "Restless Blade", b: 173, st: [82, 88, 58, 42, 50], tr: ["ambitious", "brave"], sk: "ambush", hidden: true }, { n: "Yuan Shu", f: "yuanshu", t: "Lord of Shouchun", b: 155, st: [66, 52, 48, 62, 58], tr: ["arrogant", "greedy", "ambitious"], sk: "chargecall" }, { n: "Ji Ling", f: "yuanshu", t: "Three-Bladed Halberd", b: 160, st: [74, 84, 46, 36, 44], tr: ["brave"], sk: "chargecall" }, { n: "Tao Qian", f: "tao", t: "Kind Governor", b: 132, st: [56, 40, 62, 76, 78], tr: ["kind"], sk: "rally" }, { n: "Cao Bao", f: "tao", t: "Ambitious Colonel", b: 155, st: [62, 60, 44, 48, 50], tr: ["greedy"], sk: "rally" }, { n: "Kong Rong", f: "kong", t: "Confucian Lord", b: 153, st: [48, 30, 82, 78, 84], tr: ["scholar", "kind"], sk: "patience" }, { n: "Taishi Ci", f: "neutral", t: "Wandering Hero", b: 166, st: [84, 90, 70, 54, 72], tr: ["brave", "honorable", "loyalheart"], sk: "divinearchery", hidden: false, freeAgent: true }, { n: "Gan Ning", f: "neutral", t: "Bell-Robbed Pirate", b: 175, st: [80, 88, 66, 40, 62], tr: ["naval", "impulsive", "brave"], sk: "ambush", hidden: true }, { n: "Zhang Lu", f: "zhanglu", t: "Waymaster", b: 148, st: [66, 48, 72, 84, 82], tr: ["kind", "scholar"], sk: "patience" }, { n: "Guan Hai", f: "huangjin", t: "Zealot Chief", b: 155, st: [62, 74, 36, 24, 40], tr: ["brave", "cruel"], sk: "rally" }, { n: "He Yi", f: "huangjin", t: "Zealot Chief", b: 153, st: [58, 70, 34, 22, 38], tr: ["cruel"], sk: "chargecall" }, ]; // relationships export const RELATIONS = { sworn: [["Liu Bei", "Guan Yu"], ["Liu Bei", "Zhang Fei"], ["Guan Yu", "Zhang Fei"], ["Ma Teng", "Han Sui"], ["Sun Ce", "Zhou Yu"]], rivals: [["Zhuge Liang", "Zhou Yu"], ["Yuan Shao", "Gongsun Zan"], ["Ma Teng", "Dong Zhuo"]], friends: [["Guo Jia", "Cao Cao"], ["Xun Yu", "Cao Cao"], ["Fa Zheng", "Zhang Ren"], ["Taishi Ci", "Sun Ce"], ["Zhao Yun", "Liu Bei"]], family: [["Cao Cao", "Xiahou Dun"], ["Cao Cao", "Xiahou Yuan"], ["Cao Cao", "Cao Ren"], ["Ma Teng", "Ma Chao"], ["Ma Teng", "Ma Dai"], ["Sun Ce", "Sun Quan"]], }; // Hidden talents that may be discovered (city -> general definition) export const HIDDEN_TALENTS = [ { n: "Zhuge Liang", f: null, t: "Sleeping Dragon", b: 181, st: [88, 62, 100, 96, 92], tr: ["genius", "loyalheart", "scholar"], sk: "eightform", findCity: "xiangyang", minYear: 199, hint: "a young farmer-scholar who talks about the empire like a chessboard" }, { n: "Pang Tong", f: null, t: "Fledgling Phoenix", b: 179, st: [80, 58, 98, 84, 70], tr: ["genius", "arrogant"], sk: "fireattack", findCity: "jiangling", minYear: 198, hint: "an ugly, brilliant wanderer whom everyone underestimates" }, { n: "Xu Shu", f: null, t: "Single Sword Wanderer", b: 172, st: [76, 72, 90, 70, 76], tr: ["scholar", "brave"], sk: "ambush", findCity: "xuchang", minYear: 195, hint: "a swordsman turned strategist, avenging wrongs along the road" }, { n: "Sima Yi", f: null, t: "Patient Wolf", b: 179, st: [86, 58, 98, 94, 78], tr: ["genius", "cautious", "ambitious"], sk: "patience", findCity: "luoyang", minYear: 201, hint: "a sickly-looking clerk whose eyes miss nothing" }, { n: "Lu Xun", f: null, t: "Young Fire of Jiangdong", b: 183, st: [84, 62, 96, 88, 82], tr: ["genius", "naval", "kind"], sk: "fireattack", findCity: "wu", minYear: 203, hint: "a quiet youth of a great house who reads smoke like scripture" }, { n: "Wang Ping", f: null, t: "Stubborn Veteran", b: 178, st: [78, 80, 60, 52, 50], tr: ["ironwill", "cautious"], sk: "ironguard", findCity: "hanzhong", minYear: 196, hint: "a hill soldier who knows every goat trail in the passes" }, ]; // random-name parts for generic recruits export const SURNAME = ["Zhao","Qian","Sun","Li","Zhou","Wu","Zheng","Wang","Feng","Chen","Chu","Wei","Jiang","Shen","Han","Yang","Zhu","Qin","You","Xu","He","Lü","Shi","Zhang","Kong","Cao","Yan","Hua","Jin","Tao","Jiang2","Qi","Xie","Zou","Yu","Bai","Shui","Dou","Zhang2","Pan"]; export const GIVEN = ["Ping","An","Kang","Ning","Fu","Gui","Lu","De","Long","Hu","Bao","Shan","Yi","Li","Jun","Jie","Xiong","Hao","Wei","Feng","Yuan","Liang","Zhong","Shi","Bo","Shu","Gong","Wenda","Gongjin","Yunchang","Yide","Zilong","Mingyuan"]; // ---------- UNITS ---------- // atk/def per 100 men; cost gold per 100 recruited; upkeep food/month per 100 export const UNIT_TYPES = { spear: { name: "Spearmen", icon: "🔱", atk: 22, def: 26, cost: 60, food: 4, desc: "Cheap and steady. Counters cavalry." }, sword: { name: "Swordsmen", icon: "⚔", atk: 26, def: 22, cost: 90, food: 4, desc: "Balanced melee line infantry." }, bow: { name: "Archers", icon: "🏹", atk: 24, def: 14, cost: 100, food: 3, desc: "Strikes first rounds from range. Fragile in melee." }, xb: { name: "Crossbowmen", icon: "🎯", atk: 32, def: 16, cost: 150, food: 4, desc: "Devastating slow volleys. Weak defense." }, cav: { name: "Cavalry", icon: "🐎", atk: 34, def: 24, cost: 180, food: 7, desc: "Fast flankers. Counters archers, dies to spears." }, hcav: { name: "Heavy Cavalry",icon: "🦄", atk: 44, def: 34, cost: 300, food: 9, desc: "Shatterhammer of the line. Very expensive." }, }; // counter matrix attacker->defender multiplier export const COUNTER = { spear: { cav: 1.7, hcav: 1.8, spear: 1.0, sword: 0.9, bow: 0.8, xb: 0.8 }, sword: { spear: 1.1, sword: 1.0, bow: 1.2, xb: 1.1, cav: 0.8, hcav: 0.7 }, bow: { sword: 1.1, spear: 1.1, bow: 1.0, xb: 0.9, cav: 0.6, hcav: 0.5 }, xb: { hcav: 1.0, cav: 0.9, spear: 1.2, sword: 1.2, bow: 1.0, xb: 1.0 }, cav: { bow: 1.8, xb: 1.9, sword: 1.3, spear: 0.55, cav: 1.0, hcav: 0.8 }, hcav: { bow: 2.0, xb: 2.1, sword: 1.5, spear: 0.5, cav: 1.2, hcav: 1.0 }, }; // ---------- BUILDINGS ---------- export const BUILDINGS = { farm: { name: "Farm", icon: "🌾", maxLv: 3, cost: lv => 500 + lv * 700, desc: "+food harvest" }, market: { name: "Market", icon: "🏮", maxLv: 3, cost: lv => 600 + lv * 800, desc: "+tax income" }, barracks: { name: "Barracks", icon: "⚔", maxLv: 3, cost: lv => 600 + lv * 800, desc: "+recruit capacity, troop quality" }, wall: { name: "Walls", icon: "🧱", maxLv: 3, cost: lv => 800 + lv * 1000, desc: "+siege defense" }, academy: { name: "Academy", icon: "📖", maxLv: 3, cost: lv => 700 + lv * 900, desc: "generals gain XP; unlocks stratagems" }, workshop: { name: "Workshop", icon: "🔧", maxLv: 2, cost: lv => 800 + lv * 1000, desc: "cheaper elite troops, siege engines" }, granary: { name: "Granary", icon: "🏚", maxLv: 2, cost: lv => 500 + lv * 600, desc: "+food storage, famine protection" }, }; // ---------- FORMATIONS ---------- export const FORMATIONS = { balanced: { name: "Balanced Line", icon: "➖", desc: "No bonuses, no weaknesses.", mods: {} }, turtle: { name: "Turtle", icon: "🐢", desc: "Defense +30%, damage −15%. Grinds the foe down.", mods: { defMul: 1.3, atkMul: 0.85 } }, spearwall: { name: "Spear Wall", icon: "🔱", desc: "Counters cavalry utterly; weak to arrows.", mods: { antiCav: 2.0, vsBow: 1.35 } }, cavcharge: { name: "Cavalry Charge",icon: "🐎", desc: "First 3 rounds +50% damage; then fatigue.", mods: { burst: 1.5 } }, archerline: { name: "Archer Line", icon: "🏹", desc: "Ranged units +35%; melee weaker.", mods: { ranged: 1.35, melee: 0.85 } }, encircle: { name: "Encirclement", icon: "🌀", desc: "+damage each round as the trap closes; risky if losing morale.", mods: { ramp: 1.12 } }, }; // ---------- ORIGINS (custom warlord backgrounds) ---------- export const ORIGINS = { governor: { name: "Local Governor", icon: "🏯", desc: "An appointed administrator. +Politics, cities start orderly, cheap buildings.", bonus: { stat: "pol", orderBonus: 15, buildDiscount: 0.15 } }, soldier: { name: "Former Soldier", icon: "⚔", desc: "Rose from the ranks. +War, troops cost 20% less, armies +5% morale.", bonus: { stat: "war", troopDiscount: 0.2, moraleBonus: 5 } }, noble: { name: "Fallen Noble", icon: "⛩", desc: "Blood of old houses. +Legitimacy 15, start with +1500 gold, marriage offers come easier.", bonus: { legit: 15, gold: 1500, diploBonus: 8 } }, bandit: { name: "Bandit Leader", icon: "🐺", desc: "Feared raider. Start with extra troops, +Fear, −Honor. Order harder to keep.", bonus: { fear: 15, honor: -10, extraTroops: 400, orderPenalty: -10 } }, merchant: { name: "Merchant Prince", icon: "🏮", desc: "Silver tongue and ledgers. +25% tax, trade deals better, +500 gold.", bonus: { taxBonus: 0.25, gold: 500, tradeBonus: 10 } }, scholar: { name: "Wandering Scholar", icon: "📖", desc: "Students everywhere. Free talented retainer, academies cheaper, discover talents easier.", bonus: { stat: "int", academyDiscount: 0.3, findBonus: 0.15 } }, exile: { name: "Exiled General", icon: "🎖", desc: "A famous commander fleeing injustice. Start with a veteran sworn friend, +Fame.", bonus: { fame: 15, companion: true } }, rebel: { name: "Rebel Firebrand", icon: "🔥", desc: "The peasants rise for you. Recruits cost half, +recruitment, −Legitimacy.", bonus: { recruitDiscount: 0.5, legit: -10, fame: 10 } }, }; export const DIFFICULTIES = { easy: { name: "Shepherd of the People", aiIncome: 0.75, aiAggro: 0.8, playerTax: 1.15, desc: "AI grows slower; forgiving economy." }, normal: { name: "Contender", aiIncome: 1.0, aiAggro: 1.0, playerTax: 1.0, desc: "The intended struggle for the realm." }, hard: { name: "Vulture of the Age", aiIncome: 1.3, aiAggro: 1.35, playerTax: 0.9, desc: "AI expands aggressively and hunts the weak — including you." }, }; // decorative river polylines (hex col,row) export const RIVERS = [ { name: "Yellow River", pts: [[5,6],[6,7],[7,8],[8,8],[9,9],[10,9],[11,8],[12,7],[13,7],[14,8],[16,8],[18,8],[20,8]] }, { name: "Yangtze", pts: [[3,15],[4,15],[6,15],[8,15],[10,15],[12,15],[13,15],[15,15],[17,16],[19,16],[21,16],[23,17]] }, { name: "Han River", pts: [[9,12],[9,13],[10,14]] }, { name: "Huai River", pts: [[14,13],[16,13],[18,14],[19,15]] }, ]; // season names export const SEASONS = ["Winter","Spring","Summer","Autumn"]; export function seasonOfMonth(m){ if(m>=2&&m<=4)return"Spring"; if(m>=5&&m<=7)return"Summer"; if(m>=8&&m<=10)return"Autumn"; return"Winter"; }