diff options
author | Tor Andersson <tor@ccxvii.net> | 2022-10-02 17:33:01 +0200 |
---|---|---|
committer | Tor Andersson <tor@ccxvii.net> | 2022-11-30 13:26:51 +0100 |
commit | 11016ba45398d98a02e063de65e1e1fa9d73a58c (patch) | |
tree | 284ff3715ac5346067f504d9297b964f4c56b688 /data.js | |
parent | 04bd6f688a047ccaa804c4e32f64405873b2f49b (diff) | |
download | crusader-rex-11016ba45398d98a02e063de65e1e1fa9d73a58c.tar.gz |
Optimize game state representation using numbers instead of string ids.
Diffstat (limited to 'data.js')
-rw-r--r-- | data.js | 837 |
1 files changed, 449 insertions, 388 deletions
@@ -1,4 +1,4 @@ -"use strict"; +"use strict" const CARDS = { 1: { name: "Assassins", event: "assassins", image: "card_assassins" }, @@ -28,418 +28,479 @@ const CARDS = { 25: { name: "a 1", moves: 1, image: "card_1" }, 26: { name: "a 1", moves: 1, image: "card_1" }, 27: { name: "a 1", moves: 1, image: "card_1" }, -}; - -const BLOCKS = {}; -const ROADS = {}; - -const SHIELDS = { - Antioch: [ "Bohemond", "Templars", "Turcopoles" ], - Latakia: [ "Bohemond" ], - "Sa\xf4ne": [ "Josselin" ], - Margat: [ "Hospitallers" ], - Krak: [ "Hospitallers" ], - Tartus: [ "Templars" ], - Tripoli: [ "Bohemond", "Raymond" ], - Beirut: [ "Turcopoles", "King Guy" ], - Sidon: [ "Reynald (Sidon)" ], - Beaufort: [ "Reynald (Sidon)" ], - Tyre: [ "Conrad", "King Guy" ], - Acre: [ "Turcopoles", "Hospitallers", "King Guy" ], - Tiberias: [ "Turcopoles", "Raymond" ], - Baisan: [ "Hospitallers" ], - Caesarea: [ "Walter" ], - Nablus: [ "Balian" ], - Amman: [ "Templars" ], - Jaffa: [ "King Guy" ], - Jerusalem: [ "King Guy", "Hospitallers", "Templars" ], - Ascalon: [ "Balian", "King Guy" ], - Hebron: [ "King Guy" ], - Gaza: [ "Templars" ], - Kerak: [ "Reynald (Kerak)" ], - Egypt: [ "Saladin", "Qara-Qush", "Yuzpah" ], - Aleppo: [ "Saladin", "Sanjar", "Zangi" ], - Ashtera: [ "Yazkuj" ], - Artah: [ "Sulaiman" ], - Damascus: [ "Saladin", "Keukburi", "Al Mashtub" ], - Homs: [ "Tuman", "Shirkuh" ], - Zerdana: [ "Jurdik" ], - Baalbek: [ "Bahram" ], - Hama: [ "Taqi al Din" ], - Banyas: [ "Qaimaz" ] } -// From edit.html output -const TOWNS = { - "Acre":{"x":452,"y":1566}, - "Ajlun":{"x":987,"y":1542}, - "Albara":{"x":810,"y":388}, - "Aleppo":{"x":1051,"y":108}, - "Amman":{"x":1088,"y":1838}, - "Anjar":{"x":753,"y":1129}, - "Antioch":{"x":471,"y":189}, - "Artah":{"x":865,"y":149}, - "Ascalon":{"x":365,"y":2077}, - "Ashtera":{"x":1038,"y":1419}, - "Baalbek":{"x":842,"y":1008}, - "Baisan":{"x":707,"y":1685}, - "Banyas":{"x":764,"y":1362}, - "Beaufort":{"x":605,"y":1354}, - "Beersheba":{"x":444,"y":2283}, - "Beirut":{"x":527,"y":1137}, - "Botron":{"x":540,"y":995}, - "Caesarea":{"x":402,"y":1754}, - "Damascus":{"x":1059,"y":1185}, - "Damiya":{"x":847,"y":1808}, - "Dimona":{"x":630,"y":2294}, - "Egypt":{"x":202,"y":2318}, - "Gaza":{"x":300,"y":2185}, - "Hama":{"x":1035,"y":477}, - "Harim":{"x":700,"y":120}, - "Hebron":{"x":680,"y":2115}, - "Homs":{"x":1053,"y":683}, - "Jaffa":{"x":399,"y":1923}, - "Jericho":{"x":836,"y":1931}, - "Jerusalem":{"x":680,"y":1980}, - "Kassab":{"x":426,"y":339}, - "Kerak":{"x":1008,"y":2076}, - "Krak":{"x":774,"y":726}, - "Lachish":{"x":495,"y":2148}, - "Lacum":{"x":919,"y":885}, - "Latakia":{"x":401,"y":445}, - "Legio":{"x":587,"y":1658}, - "Margat":{"x":540,"y":567}, - "Masyaf":{"x":756,"y":608}, - "Monterrand":{"x":920,"y":603}, - "Nablus":{"x":643,"y":1787}, - "Qaddas":{"x":1145,"y":916}, - "Ramallah":{"x":514,"y":1950}, - "Sa\xf4ne":{"x":650,"y":430}, - "Shughur":{"x":655,"y":300}, - "Sidon":{"x":493,"y":1276}, - "St. Simeon":{"x":364,"y":211}, - "Tartus":{"x":605,"y":718}, - "Tiberias":{"x":699,"y":1560}, - "Tripoli":{"x":621,"y":882}, - "Tyre":{"x":465,"y":1397}, - "Zerdana":{"x":1021,"y":300}, - "Zoar":{"x":955,"y":2278}, - "Germania":{"x":140,"y":272}, - "France":{"x":140,"y":573}, - "England":{"x":140,"y":873}, - "Sea":{"x":320,"y":900}, - "FP":{"x":15,"y":946}, - "SP":{"x":1275-15,"y":946}, - "Dead":{"x":50,"y":80}, -}; - -const PORTS = []; - -(function () { +const BLOCKS = [] +const block_index = {} + +const TOWNS = [] +const town_index = {} + +const ROADS = {} +const PORTS = [] +const SHIELDS = [] + +function init_towns() { + + // From edit.html output + const TOWNS_XY = { + "Acre":{"x":452,"y":1566}, + "Ajlun":{"x":987,"y":1542}, + "Albara":{"x":810,"y":388}, + "Aleppo":{"x":1051,"y":108}, + "Amman":{"x":1088,"y":1838}, + "Anjar":{"x":753,"y":1129}, + "Antioch":{"x":471,"y":189}, + "Artah":{"x":865,"y":149}, + "Ascalon":{"x":365,"y":2077}, + "Ashtera":{"x":1038,"y":1419}, + "Baalbek":{"x":842,"y":1008}, + "Baisan":{"x":707,"y":1685}, + "Banyas":{"x":764,"y":1362}, + "Beaufort":{"x":605,"y":1354}, + "Beersheba":{"x":444,"y":2283}, + "Beirut":{"x":527,"y":1137}, + "Botron":{"x":540,"y":995}, + "Caesarea":{"x":402,"y":1754}, + "Damascus":{"x":1059,"y":1185}, + "Damiya":{"x":847,"y":1808}, + "Dimona":{"x":630,"y":2294}, + "Egypt":{"x":202,"y":2318}, + "Gaza":{"x":300,"y":2185}, + "Hama":{"x":1035,"y":477}, + "Harim":{"x":700,"y":120}, + "Hebron":{"x":680,"y":2115}, + "Homs":{"x":1053,"y":683}, + "Jaffa":{"x":399,"y":1923}, + "Jericho":{"x":836,"y":1931}, + "Jerusalem":{"x":680,"y":1980}, + "Kassab":{"x":426,"y":339}, + "Kerak":{"x":1008,"y":2076}, + "Krak":{"x":774,"y":726}, + "Lachish":{"x":495,"y":2148}, + "Lacum":{"x":919,"y":885}, + "Latakia":{"x":401,"y":445}, + "Legio":{"x":587,"y":1658}, + "Margat":{"x":540,"y":567}, + "Masyaf":{"x":756,"y":608}, + "Monterrand":{"x":920,"y":603}, + "Nablus":{"x":643,"y":1787}, + "Qaddas":{"x":1145,"y":916}, + "Ramallah":{"x":514,"y":1950}, + "Sa\xf4ne":{"x":650,"y":430}, + "Shughur":{"x":655,"y":300}, + "Sidon":{"x":493,"y":1276}, + "St. Simeon":{"x":364,"y":211}, + "Tartus":{"x":605,"y":718}, + "Tiberias":{"x":699,"y":1560}, + "Tripoli":{"x":621,"y":882}, + "Tyre":{"x":465,"y":1397}, + "Zerdana":{"x":1021,"y":300}, + "Zoar":{"x":955,"y":2278}, + "Germania":{"x":140,"y":272}, + "France":{"x":140,"y":573}, + "England":{"x":140,"y":873}, + "Sea":{"x":320,"y":900}, + "FP":{"x":15,"y":946}, + "SP":{"x":1275-15,"y":946}, + "Dead":{"x":50,"y":80}, + "Nowhere":{"x":50,"y":80}, + } + + function town(axis, major_align, minor_align, wrap, region, name, rating, type) { + let i = town_index[name] = TOWNS.length + TOWNS.push({ + name, + region, + type, + rating, + port: (type === 'port' || type === 'fortified-port'), + fortified_port: (type === 'fortified-port'), + exits: [], + layout: { + x: TOWNS_XY[name].x, + y: TOWNS_XY[name].y, + axis, + major: 1 - major_align, + minor: 1 - minor_align, + wrap + } + }) + if (type === 'port' || type === 'fortified-port') + PORTS.push(i) + } + + town('Y', 1.0, 1.0, 50, "Pool", "Nowhere", 0, "pool") + town('Y', 1.0, 1.0, 3, "Pool", "Dead", 0, "pool") + town('Y', 0.5, 1.0, 50, "Pool", "FP", 0, "pool") + town('Y', 0.5, 1.0, 50, "Pool", "SP", 0, "pool") + town('Y', 1.0, 1.0, 1, "Pool", "Sea", 0, "pool") + + town('Y', 1.0, 0.5, 3, "Staging", "England", 3, "staging") + town('Y', 1.0, 0.5, 3, "Staging", "France", 3, "staging") + town('Y', 1.0, 0.5, 3, "Staging", "Germania", 3, "staging") + + town('X', 1.0, 0.5, 3, "Syria", "Aleppo", 3, "town") + town('Y', 0.5, 0.5, 3, "Syria", "Artah", 1, "town") + town('X', 1.0, 0.5, 3, "Syria", "Zerdana", 1, "town") + town('X', 1.0, 0.5, 3, "Syria", "Hama", 1, "town") + town('X', 0.9, 0.5, 3, "Syria", "Homs", 2, "town") + town('X', 0.3, 0.5, 3, "Syria", "Lacum", 0, "town") + town('X', 0.3, 0.5, 3, "Syria", "Qaddas", 0, "town") + town('X', 0.5, 1.0, 3, "Syria", "Baalbek", 1, "town") + town('X', 0.5, 1.0, 3, "Syria", "Anjar", 0, "town") + town('X', 0.5, 0.5, 4, "Syria", "Damascus", 4, "town") + town('X', 1.0, 0.5, 3, "Syria", "Banyas", 1, "town") + town('X', 1.0, 0.5, 3, "Syria", "Ashtera", 1, "town") + town('X', 1.0, 0.5, 3, "Syria", "Ajlun", 0, "town") + + town('X', 0.0, 0.5, 3, "Antioch", "St. Simeon", 0, "port") + town('Y', 0.5, 0.5, 3, "Antioch", "Antioch", 3, "town") + town('Y', 0.5, 0.5, 3, "Antioch", "Harim", 0, "town") + town('X', 0.5, 0.5, 3, "Antioch", "Kassab", 0, "town") + town('X', 0.5, 0.5, 3, "Antioch", "Shughur", 0, "town") + town('X', 0.0, 0.5, 3, "Antioch", "Latakia", 1, "port") + town('X', 0.5, 0.5, 3, "Antioch", "Sa\xf4ne", 1, "town") + town('Y', 0.5, 0.5, 3, "Antioch", "Albara", 0, "town") + town('X', 0.0, 0.5, 3, "Antioch", "Margat", 1, "port") + + town('X', 0.5, 0.5, 1, "Masyaf", "Masyaf", 1, "town") + + town('Y', 0.5, 0.5, 3, "Tripoli", "Monterrand", 0, "town") + town('X', 0.0, 0.5, 3, "Tripoli", "Tartus", 1, "port") + town('X', 1.0, 0.5, 3, "Tripoli", "Krak", 1, "town") + town('X', 0.0, 0.5, 3, "Tripoli", "Tripoli", 2, "fortified-port") + town('X', 0.0, 0.5, 3, "Tripoli", "Botron", 0, "town") + + town('X', 0.0, 0.5, 3, "Jerusalem", "Beirut", 2, "port") + town('X', 0.0, 0.5, 3, "Jerusalem", "Sidon", 1, "port") + town('X', 0.0, 0.5, 3, "Jerusalem", "Tyre", 2, "fortified-port") + town('Y', 0.5, 0.5, 3, "Jerusalem", "Beaufort", 1, "town") + town('X', 0.0, 0.5, 3, "Jerusalem", "Acre", 3, "port") + town('X', 1.0, 0.5, 3, "Jerusalem", "Tiberias", 2, "town") + town('Y', 1.0, 0.5, 3, "Jerusalem", "Legio", 0, "town") + town('X', 1.0, 0.5, 3, "Jerusalem", "Baisan", 1, "town") + town('X', 0.0, 0.5, 3, "Jerusalem", "Caesarea", 1, "port") + town('X', 0.5, 0.5, 3, "Jerusalem", "Nablus", 1, "town") + town('X', 0.5, 0.5, 3, "Jerusalem", "Damiya", 0, "town") + town('X', 0.5, 0.5, 3, "Jerusalem", "Amman", 1, "town") + town('X', 0.0, 0.5, 3, "Jerusalem", "Jaffa", 1, "port") + town('Y', 0.5, 0.5, 3, "Jerusalem", "Ramallah", 0, "town") + town('X', 0.5, 0.4, 3, "Jerusalem", "Jerusalem", 3, "town") + town('Y', 0.5, 0.5, 3, "Jerusalem", "Jericho", 0, "town") + town('X', 0.1, 0.5, 6, "Jerusalem", "Ascalon", 2, "port") + town('Y', 0.5, 0.5, 3, "Jerusalem", "Lachish", 0, "town") + town('X', 0.5, 1.0, 3, "Jerusalem", "Hebron", 1, "town") + town('X', 1.0, 0.5, 3, "Jerusalem", "Kerak", 1, "town") + town('X', 0.5, 0.5, 6, "Jerusalem", "Gaza", 1, "town") + town('Y', 0.5, 0.5, 3, "Jerusalem", "Beersheba", 0, "town") + town('X', 0.5, 0.5, 3, "Jerusalem", "Dimona", 0, "town") + town('X', 1.0, 0.5, 3, "Jerusalem", "Zoar", 0, "town") + + town('X', 0.5, 0.5, 4, "Egypt", "Egypt", 4, "port") +} + +function init_roads() { + function road(a,b,type) { + a = town_index[a] + b = town_index[b] + let id = (a < b) ? a * 100 + b : b * 100 + a + ROADS[id] = type + TOWNS[a].exits.push(b) + TOWNS[b].exits.push(a) + } + + function offmap(a,b,type) { + a = town_index[a] + b = town_index[b] + let id = (a < b) ? a * 100 + b : b * 100 + a + ROADS[id] = type + } + + function iron_bridge(A,B) { road(A,B,"iron-bridge"); } + function major(A,B) { road(A,B,"major"); } + function minor(A,B) { road(A,B,"minor"); } + + iron_bridge("Antioch", "Harim") + major("Harim", "Artah") + major("Artah", "Aleppo") + major("Aleppo", "Zerdana") + major("Zerdana", "Hama") + major("Hama", "Albara") + major("Hama", "Monterrand") + major("Hama", "Homs") + major("Albara", "Shughur") + major("Shughur", "Harim") + major("Monterrand", "Krak") + major("Krak", "Homs") + major("Krak", "Tripoli") + major("Tripoli", "Tartus") + major("Tripoli", "Botron") + major("Tartus", "Margat") + major("Margat", "Latakia") + major("Botron", "Beirut") + major("Beirut", "Sidon") + major("Sidon", "Tyre") + major("Tyre", "Beaufort") + major("Beaufort", "Banyas") + major("Banyas", "Damascus") + major("Damascus", "Qaddas") + major("Qaddas", "Homs") + major("Homs", "Lacum") + major("Lacum", "Baalbek") + major("Baalbek", "Anjar") + major("Anjar", "Beaufort") + major("Damascus", "Ashtera") + major("Ashtera", "Ajlun") + major("Ajlun", "Amman") + major("Amman", "Kerak") + major("Kerak", "Zoar") + major("Zoar", "Hebron") + major("Hebron", "Jerusalem") + major("Jerusalem", "Ramallah") + major("Ramallah", "Jaffa") + major("Jaffa", "Ascalon") + major("Ascalon", "Gaza") + major("Gaza", "Egypt") + major("Ajlun", "Tiberias") + major("Tiberias", "Acre") + major("Acre", "Legio") + major("Legio", "Baisan") + major("Baisan", "Tiberias") + major("Baisan", "Nablus") + major("Nablus", "Legio") + major("Nablus", "Jerusalem") + major("Acre", "Caesarea") + major("Caesarea", "Jaffa") + + minor("St. Simeon", "Antioch") + minor("Antioch", "Kassab") + minor("Kassab", "Latakia") + minor("Latakia", "Sa\xf4ne") + minor("Sa\xf4ne", "Shughur") + minor("Sa\xf4ne", "Albara") + minor("Albara", "Zerdana") + minor("Zerdana", "Artah") + + minor("Monterrand", "Homs") + + minor("Tartus", "Krak") + minor("Krak", "Lacum") + minor("Lacum", "Qaddas") + minor("Tripoli", "Baalbek") + minor("Beirut", "Anjar") + minor("Anjar", "Damascus") + minor("Sidon", "Beaufort") + minor("Tiberias", "Banyas") + minor("Banyas", "Ashtera") + minor("Tyre", "Acre") + minor("Caesarea", "Nablus") + minor("Nablus", "Damiya") + minor("Damiya", "Baisan") + minor("Damiya", "Amman") + minor("Amman", "Jericho") + minor("Jericho", "Damiya") + minor("Jericho", "Kerak") + minor("Jericho", "Jerusalem") + + minor("Ramallah", "Ascalon") + minor("Ascalon", "Lachish") + minor("Lachish", "Gaza") + minor("Gaza", "Beersheba") + minor("Beersheba", "Egypt") + minor("Beersheba", "Dimona") + minor("Dimona", "Zoar") + minor("Dimona", "Hebron") + minor("Hebron", "Lachish") + + offmap("Germania", "St. Simeon", 'minor') + offmap("Germania", "Aleppo", 'major') + offmap("Germania", "Antioch", 'major') + + for (let town of TOWNS) + town.exits.sort((a,b)=>a-b) + +} + +function init_blocks() { let nomads = { Arabs: 1, Turks: 1, Kurds: 1 } function army(rc, owner, name, home, move, steps, combat, order, plural) { - let id = name; + let id = name if (order === 'Military Orders' || order === 'Pilgrims' || order === 'Turcopoles') - id = home + " " + name; + id = home + " " + name if (order === 'Nomads') - id += " " + nomads[name]++; + id += " " + nomads[name]++ if (name === 'Reynald' || name === 'Raymond') - id += " (" + home + ")"; - if (id in BLOCKS) - throw Error("Name clash: " + id + " order:"+order + " " + JSON.stringify(nomads)); - BLOCKS[id] = { + id += " (" + home + ")" + if (id in block_index) + throw Error("Name clash: " + id + " order:"+order + " " + JSON.stringify(nomads)) + + let home_idx = town_index[home] | 0 + if (home === "Normandy") home_idx = town_index["England"] + if (home === "Aquitaine") home_idx = town_index["England"] + if (home === "Bourgogne") home_idx = town_index["France"] + if (home === "Flanders") home_idx = town_index["France"] + + block_index[id] = BLOCKS.length + BLOCKS.push({ + id: id, owner: owner, name: name, plural: plural, type: order.toLowerCase().replace(/ /g, "_"), - home: home, + home: home_idx, + home_name: home, move: move, steps: steps, - combat: combat, + initiative: combat[0], + fire_power: combat[1] | 0, image: rc, - } + }) } function frank(rc, name, home, move, steps, combat, order, plural) { - army(rc, "Franks", name, home, move, steps, combat, order, plural); + army(rc, "Franks", name, home, move, steps, combat, order, plural) } + function saracen(rc, name, home, move, steps, combat, order, plural) { - army(rc, "Saracens", name, home, move, steps, combat, order, plural); + army(rc, "Saracens", name, home, move, steps, combat, order, plural) } + frank(11, "Richard", "England", 3, 4, "B4", "Crusaders", 0) + frank(12, "Philippe", "France", 2, 4, "B3", "Crusaders", 0) + frank(13, "Barbarossa", "Germania", 2, 4, "B3", "Crusaders", 0) + frank(14, "Templars", "Jerusalem", 3, 3, "B3", "Military Orders", 1) + frank(15, "Templars", "Antioch", 3, 3, "B3", "Military Orders", 1) + frank(16, "Templars", "Gaza", 3, 3, "B3", "Military Orders", 1) + frank(17, "Templars", "Tartus", 3, 2, "B3", "Military Orders", 1) + + frank(21, "Robert", "Normandy", 2, 3, "B3", "Crusaders", 0) + frank(22, "Hugues", "Bourgogne", 2, 4, "B2", "Crusaders", 0) + frank(23, "Frederik", "Germania", 2, 3, "B2", "Crusaders", 0) + frank(24, "Hospitallers", "Jerusalem", 3, 4, "B3", "Military Orders", 1) + frank(25, "Hospitallers", "Acre", 3, 3, "B3", "Military Orders", 1) + frank(26, "Hospitallers", "Krak", 3, 2, "B3", "Military Orders", 1) + frank(27, "Reynald", "Sidon", 2, 3, "B2", "Outremers", 0) + + frank(31, "Crossbows", "Aquitaine", 2, 3, "A2", "Crusaders", 1) + frank(32, "Fileps", "Flanders", 2, 3, "B3", "Crusaders", 0) + frank(33, "Leopold", "Germania", 2, 3, "B3", "Crusaders", 0) + frank(34, "Conrad", "Tyre", 2, 4, "B3", "Outremers", 0) + frank(35, "Balian", "Nablus", 2, 3, "B2", "Outremers", 0) + frank(36, "Walter", "Caesarea", 2, 3, "B2", "Outremers", 0) + frank(37, "Raymond", "Tiberias", 2, 3, "B2", "Outremers", 0) + + frank(41, "Turcopoles", "Antioch", 3, 3, "A2", "Turcopoles", 1) + frank(42, "Pilgrims", "Genoa", 2, 4, "C2", "Pilgrims", 1) + frank(43, "Pilgrims", "Sicily", 2, 3, "C2", "Pilgrims", 1) + frank(44, "King Guy", "Jerusalem", 2, 4, "B2", "Outremers", 0) + frank(45, "Reynald", "Kerak", 3, 2, "B3", "Outremers", 0) + frank(46, "Bohemond", "Antioch", 2, 4, "B2", "Outremers", 0) + frank(47, "Raymond", "Tripoli", 2, 4, "B2", "Outremers", 0) + + frank(51, "Turcopoles", "Beirut", 3, 3, "A2", "Turcopoles", 1) + frank(52, "Pilgrims", "Brittany", 2, 4, "C2", "Pilgrims", 1) + frank(53, "Josselin", "Sa\xf4ne", 2, 3, "B2", "Outremers", 0) + + saracen(55, "Qara-Qush", "Egypt", 3, 3, "B3", "Emirs", 0) + saracen(56, "Zangi", "Aleppo", 3, 3, "B2", "Emirs", 0) + saracen(57, "Sanjar", "Aleppo", 3, 3, "B2", "Emirs", 0) + + saracen(61, "Yazkuj", "Ashtera", 3, 2, "B2", "Emirs", 0) + saracen(62, "Sulaiman", "Artah", 3, 2, "B2", "Emirs", 0) + saracen(63, "Keukburi", "Damascus", 3, 3, "B3", "Emirs", 0) + saracen(64, "Shirkuh", "Homs", 3, 3, "B2", "Emirs", 0) + saracen(65, "Jurdik", "Zerdana", 3, 3, "B2", "Emirs", 0) + saracen(66, "Bahram", "Baalbek", 3, 3, "B2", "Emirs", 0) + saracen(67, "Tuman", "Homs", 3, 3, "B3", "Emirs", 0) + + saracen(71, "Taqi al Din", "Hama", 3, 4, "A2", "Emirs", 0) + saracen(72, "Al Mashtub", "Damascus", 3, 4, "B3", "Emirs", 0) + saracen(73, "Al Adil", "Egypt", 3, 4, "A2", "Emirs", 0) + saracen(74, "Saladin", "Damascus", 3, 4, "A3", "Emirs", 0) + saracen(75, "Al Aziz", "Egypt", 3, 3, "B2", "Emirs", 0) + saracen(76, "Al Afdal", "Damascus", 3, 3, "B3", "Emirs", 0) + saracen(77, "Al Zahir", "Aleppo", 3, 3, "A2", "Emirs", 0) + + saracen(81, "Yuzpah", "Egypt", 3, 4, "B2", "Emirs", 0) + saracen(82, "Qaimaz", "Banyas", 3, 3, "B2", "Emirs", 0) + + saracen(83, "Kurds", "Damascus", 3, 4, "C1", "Nomads", 1) + saracen(84, "Kurds", "Damascus", 3, 4, "C1", "Nomads", 1) + saracen(85, "Kurds", "Damascus", 3, 3, "C2", "Nomads", 1) + saracen(86, "Kurds", "Damascus", 3, 3, "C2", "Nomads", 1) + + saracen(91, "Turks", "Aleppo", 3, 3, "A2", "Nomads", 1) + saracen(92, "Turks", "Aleppo", 3, 3, "A2", "Nomads", 1) + saracen(93, "Turks", "Aleppo", 3, 4, "A1", "Nomads", 1) + saracen(94, "Turks", "Aleppo", 3, 4, "A1", "Nomads", 1) + + saracen(95, "Arabs", "Egypt", 3, 3, "B2", "Nomads", 1) + saracen(96, "Arabs", "Egypt", 3, 3, "B2", "Nomads", 1) + saracen(97, "Arabs", "Egypt", 3, 4, "B1", "Nomads", 1) + saracen(87, "Arabs", "Egypt", 3, 4, "B1", "Nomads", 1) + + // The assassins are not a real unit + army(54, "Assassins", "Assassins", "Masyaf", 0, 3, "A3", "Assassins", 1) +} - frank(11, "Richard", "England", 3, 4, "B4", "Crusaders", 0); - frank(12, "Philippe", "France", 2, 4, "B3", "Crusaders", 0); - frank(13, "Barbarossa", "Germania", 2, 4, "B3", "Crusaders", 0); - frank(14, "Templars", "Jerusalem", 3, 3, "B3", "Military Orders", 1); - frank(15, "Templars", "Antioch", 3, 3, "B3", "Military Orders", 1); - frank(16, "Templars", "Gaza", 3, 3, "B3", "Military Orders", 1); - frank(17, "Templars", "Tartus", 3, 2, "B3", "Military Orders", 1); - - frank(21, "Robert", "Normandy", 2, 3, "B3", "Crusaders", 0); - frank(22, "Hugues", "Bourgogne", 2, 4, "B2", "Crusaders", 0); - frank(23, "Frederik", "Germania", 2, 3, "B2", "Crusaders", 0); - frank(24, "Hospitallers", "Jerusalem", 3, 4, "B3", "Military Orders", 1); - frank(25, "Hospitallers", "Acre", 3, 3, "B3", "Military Orders", 1); - frank(26, "Hospitallers", "Krak", 3, 2, "B3", "Military Orders", 1); - frank(27, "Reynald", "Sidon", 2, 3, "B2", "Outremers", 0); - - frank(31, "Crossbows", "Aquitaine", 2, 3, "A2", "Crusaders", 1); - frank(32, "Fileps", "Flanders", 2, 3, "B3", "Crusaders", 0); - frank(33, "Leopold", "Germania", 2, 3, "B3", "Crusaders", 0); - frank(34, "Conrad", "Tyre", 2, 4, "B3", "Outremers", 0); - frank(35, "Balian", "Nablus", 2, 3, "B2", "Outremers", 0); - frank(36, "Walter", "Caesarea", 2, 3, "B2", "Outremers", 0); - frank(37, "Raymond", "Tiberias", 2, 3, "B2", "Outremers", 0); - - frank(41, "Turcopoles", "Antioch", 3, 3, "A2", "Turcopoles", 1); - frank(42, "Pilgrims", "Genoa", 2, 4, "C2", "Pilgrims", 1); - frank(43, "Pilgrims", "Sicily", 2, 3, "C2", "Pilgrims", 1); - frank(44, "King Guy", "Jerusalem", 2, 4, "B2", "Outremers", 0); - frank(45, "Reynald", "Kerak", 3, 2, "B3", "Outremers", 0); - frank(46, "Bohemond", "Antioch", 2, 4, "B2", "Outremers", 0); - frank(47, "Raymond", "Tripoli", 2, 4, "B2", "Outremers", 0); - - frank(51, "Turcopoles", "Beirut", 3, 3, "A2", "Turcopoles", 1); - frank(52, "Pilgrims", "Brittany", 2, 4, "C2", "Pilgrims", 1); - frank(53, "Josselin", "Sa\xf4ne", 2, 3, "B2", "Outremers", 0); - - army(54, "Assassins", "Assassins", "Masyaf", 0, 3, "A3", "Assassins", 1); - - saracen(55, "Qara-Qush", "Egypt", 3, 3, "B3", "Emirs", 0); - saracen(56, "Zangi", "Aleppo", 3, 3, "B2", "Emirs", 0); - saracen(57, "Sanjar", "Aleppo", 3, 3, "B2", "Emirs", 0); - - saracen(61, "Yazkuj", "Ashtera", 3, 2, "B2", "Emirs", 0); - saracen(62, "Sulaiman", "Artah", 3, 2, "B2", "Emirs", 0); - saracen(63, "Keukburi", "Damascus", 3, 3, "B3", "Emirs", 0); - saracen(64, "Shirkuh", "Homs", 3, 3, "B2", "Emirs", 0); - saracen(65, "Jurdik", "Zerdana", 3, 3, "B2", "Emirs", 0); - saracen(66, "Bahram", "Baalbek", 3, 3, "B2", "Emirs", 0); - saracen(67, "Tuman", "Homs", 3, 3, "B3", "Emirs", 0); - - saracen(71, "Taqi al Din", "Hama", 3, 4, "A2", "Emirs", 0); - saracen(72, "Al Mashtub", "Damascus", 3, 4, "B3", "Emirs", 0); - saracen(73, "Al Adil", "Egypt", 3, 4, "A2", "Emirs", 0); - saracen(74, "Saladin", "Damascus", 3, 4, "A3", "Emirs", 0); - saracen(75, "Al Aziz", "Egypt", 3, 3, "B2", "Emirs", 0); - saracen(76, "Al Afdal", "Damascus", 3, 3, "B3", "Emirs", 0); - saracen(77, "Al Zahir", "Aleppo", 3, 3, "A2", "Emirs", 0); - - saracen(81, "Yuzpah", "Egypt", 3, 4, "B2", "Emirs", 0); - saracen(82, "Qaimaz", "Banyas", 3, 3, "B2", "Emirs", 0); - - saracen(83, "Kurds", "Damascus", 3, 4, "C1", "Nomads", 1); - saracen(84, "Kurds", "Damascus", 3, 4, "C1", "Nomads", 1); - saracen(85, "Kurds", "Damascus", 3, 3, "C2", "Nomads", 1); - saracen(86, "Kurds", "Damascus", 3, 3, "C2", "Nomads", 1); - - saracen(91, "Turks", "Aleppo", 3, 3, "A2", "Nomads", 1); - saracen(92, "Turks", "Aleppo", 3, 3, "A2", "Nomads", 1); - saracen(93, "Turks", "Aleppo", 3, 4, "A1", "Nomads", 1); - saracen(94, "Turks", "Aleppo", 3, 4, "A1", "Nomads", 1); - - saracen(95, "Arabs", "Egypt", 3, 3, "B2", "Nomads", 1); - saracen(96, "Arabs", "Egypt", 3, 3, "B2", "Nomads", 1); - saracen(97, "Arabs", "Egypt", 3, 4, "B1", "Nomads", 1); - saracen(87, "Arabs", "Egypt", 3, 4, "B1", "Nomads", 1); - - function town(axis, major_align, minor_align, wrap, region, name, rating, type) { - TOWNS[name].region = region; - TOWNS[name].rating = rating; - if (type === 'port' || type === 'fortified-port') - TOWNS[name].port = true; - if (type === 'fortified-port') - TOWNS[name].fortified_port = true; - if (TOWNS[name].port) - PORTS.push(name); - TOWNS[name].exits = []; - TOWNS[name].layout_axis = axis; - TOWNS[name].layout_major = 1 - major_align; - TOWNS[name].layout_minor = 1 - minor_align; - TOWNS[name].wrap = wrap; - } - - town('Y', 0.5, 1.0, 50, "Pool", "FP", 0, "pool"); - town('Y', 0.5, 1.0, 50, "Pool", "SP", 0, "pool"); - town('Y', 1.0, 1.0, 3, "Pool", "Dead", 0, "pool"); - town('Y', 1.0, 1.0, 1, "Pool", "Sea", 0, "pool"); - - town('Y', 1.0, 0.5, 3, "Staging", "England", 3, "staging"); - town('Y', 1.0, 0.5, 3, "Staging", "France", 3, "staging"); - town('Y', 1.0, 0.5, 3, "Staging", "Germania", 3, "staging"); - - - town('X', 1.0, 0.5, 3, "Syria", "Aleppo", 3, "town"); - town('Y', 0.5, 0.5, 3, "Syria", "Artah", 1, "town"); - town('X', 1.0, 0.5, 3, "Syria", "Zerdana", 1, "town"); - town('X', 1.0, 0.5, 3, "Syria", "Hama", 1, "town"); - town('X', 0.9, 0.5, 3, "Syria", "Homs", 2, "town"); - town('X', 0.3, 0.5, 3, "Syria", "Lacum", 0, "town"); - town('X', 0.3, 0.5, 3, "Syria", "Qaddas", 0, "town"); - town('X', 0.5, 1.0, 3, "Syria", "Baalbek", 1, "town"); - town('X', 0.5, 1.0, 3, "Syria", "Anjar", 0, "town"); - town('X', 0.5, 0.5, 4, "Syria", "Damascus", 4, "town"); - town('X', 1.0, 0.5, 3, "Syria", "Banyas", 1, "town"); - town('X', 1.0, 0.5, 3, "Syria", "Ashtera", 1, "town"); - town('X', 1.0, 0.5, 3, "Syria", "Ajlun", 0, "town"); - - town('X', 0.0, 0.5, 3, "Antioch", "St. Simeon", 0, "port"); - town('Y', 0.5, 0.5, 3, "Antioch", "Antioch", 3, "town"); - town('Y', 0.5, 0.5, 3, "Antioch", "Harim", 0, "town"); - town('X', 0.5, 0.5, 3, "Antioch", "Kassab", 0, "town"); - town('X', 0.5, 0.5, 3, "Antioch", "Shughur", 0, "town"); - town('X', 0.0, 0.5, 3, "Antioch", "Latakia", 1, "port"); - town('X', 0.5, 0.5, 3, "Antioch", "Sa\xf4ne", 1, "town"); - town('Y', 0.5, 0.5, 3, "Antioch", "Albara", 0, "town"); - town('X', 0.0, 0.5, 3, "Antioch", "Margat", 1, "port"); - - town('X', 0.5, 0.5, 1, "Masyaf", "Masyaf", 1, "town"); - - town('Y', 0.5, 0.5, 3, "Tripoli", "Monterrand", 0, "town"); - town('X', 0.0, 0.5, 3, "Tripoli", "Tartus", 1, "port"); - town('X', 1.0, 0.5, 3, "Tripoli", "Krak", 1, "town"); - town('X', 0.0, 0.5, 3, "Tripoli", "Tripoli", 2, "fortified-port"); - town('X', 0.0, 0.5, 3, "Tripoli", "Botron", 0, "town"); - - town('X', 0.0, 0.5, 3, "Jerusalem", "Beirut", 2, "port"); - town('X', 0.0, 0.5, 3, "Jerusalem", "Sidon", 1, "port"); - town('X', 0.0, 0.5, 3, "Jerusalem", "Tyre", 2, "fortified-port"); - town('Y', 0.5, 0.5, 3, "Jerusalem", "Beaufort", 1, "town"); - town('X', 0.0, 0.5, 3, "Jerusalem", "Acre", 3, "port"); - town('X', 1.0, 0.5, 3, "Jerusalem", "Tiberias", 2, "town"); - town('Y', 1.0, 0.5, 3, "Jerusalem", "Legio", 0, "town"); - town('X', 1.0, 0.5, 3, "Jerusalem", "Baisan", 1, "town"); - town('X', 0.0, 0.5, 3, "Jerusalem", "Caesarea", 1, "port"); - town('X', 0.5, 0.5, 3, "Jerusalem", "Nablus", 1, "town"); - town('X', 0.5, 0.5, 3, "Jerusalem", "Damiya", 0, "town"); - town('X', 0.5, 0.5, 3, "Jerusalem", "Amman", 1, "town"); - town('X', 0.0, 0.5, 3, "Jerusalem", "Jaffa", 1, "port"); - town('Y', 0.5, 0.5, 3, "Jerusalem", "Ramallah", 0, "town"); - town('X', 0.5, 0.4, 3, "Jerusalem", "Jerusalem", 3, "town"); - town('Y', 0.5, 0.5, 3, "Jerusalem", "Jericho", 0, "town"); - town('X', 0.1, 0.5, 6, "Jerusalem", "Ascalon", 2, "port"); - town('Y', 0.5, 0.5, 3, "Jerusalem", "Lachish", 0, "town"); - town('X', 0.5, 1.0, 3, "Jerusalem", "Hebron", 1, "town"); - town('X', 1.0, 0.5, 3, "Jerusalem", "Kerak", 1, "town"); - town('X', 0.5, 0.5, 6, "Jerusalem", "Gaza", 1, "town"); - town('Y', 0.5, 0.5, 3, "Jerusalem", "Beersheba", 0, "town"); - town('X', 0.5, 0.5, 3, "Jerusalem", "Dimona", 0, "town"); - town('X', 1.0, 0.5, 3, "Jerusalem", "Zoar", 0, "town"); - - town('X', 0.5, 0.5, 4, "Egypt", "Egypt", 4, "port"); - - function road(A,B,type) { - let id = (A < B) ? (A + "/" + B) : (B + "/" + A); - ROADS[id] = type; - TOWNS[A].exits.push(B); - TOWNS[B].exits.push(A); +function init_shields() { + for (let i = 0; i < TOWNS.length; ++i) + SHIELDS[i] = [] + function shield(town, block_names) { + town = town_index[town] + for (let name of block_names) { + if (name in block_index) { + SHIELDS[town].push(block_index[name]) + } else { + for (let b = 0; b < BLOCKS.length; ++b) + if (BLOCKS[b].name === name) + SHIELDS[town].push(b) + } + } + SHIELDS[town].sort((a,b)=>a-b) } - function iron_bridge(A,B) { road(A,B,"iron-bridge"); } - function major(A,B) { road(A,B,"major"); } - function minor(A,B) { road(A,B,"minor"); } + shield("Antioch", [ "Bohemond", "Templars", "Turcopoles" ]) + shield("Latakia", [ "Bohemond" ]) + shield("Sa\xf4ne", [ "Josselin" ]) + shield("Margat", [ "Hospitallers" ]) + shield("Krak", [ "Hospitallers" ]) + shield("Tartus", [ "Templars" ]) + shield("Tripoli", [ "Bohemond", "Raymond" ]) + shield("Beirut", [ "Turcopoles", "King Guy" ]) + shield("Sidon", [ "Reynald (Sidon)" ]) + shield("Beaufort", [ "Reynald (Sidon)" ]) + shield("Tyre", [ "Conrad", "King Guy" ]) + shield("Acre", [ "Turcopoles", "Hospitallers", "King Guy" ]) + shield("Tiberias", [ "Turcopoles", "Raymond" ]) + shield("Baisan", [ "Hospitallers" ]) + shield("Caesarea", [ "Walter" ]) + shield("Nablus", [ "Balian" ]) + shield("Amman", [ "Templars" ]) + shield("Jaffa", [ "King Guy" ]) + shield("Jerusalem", [ "King Guy", "Hospitallers", "Templars" ]) + shield("Ascalon", [ "Balian", "King Guy" ]) + shield("Hebron", [ "King Guy" ]) + shield("Gaza", [ "Templars" ]) + shield("Kerak", [ "Reynald (Kerak)" ]) + shield("Egypt", [ "Saladin", "Al Adil", "Al Aziz", "Al Afdal", "Al Zahir", "Qara-Qush", "Yuzpah" ]) + shield("Aleppo", [ "Saladin", "Al Adil", "Al Aziz", "Al Afdal", "Al Zahir", "Sanjar", "Zangi" ]) + shield("Ashtera", [ "Yazkuj" ]) + shield("Artah", [ "Sulaiman" ]) + shield("Damascus", [ "Saladin", "Al Adil", "Al Aziz", "Al Afdal", "Al Zahir", "Keukburi", "Al Mashtub" ]) + shield("Homs", [ "Tuman", "Shirkuh" ]) + shield("Zerdana", [ "Jurdik" ]) + shield("Baalbek", [ "Bahram" ]) + shield("Hama", [ "Taqi al Din" ]) + shield("Banyas", [ "Qaimaz" ]) +} - iron_bridge("Antioch", "Harim"); - major("Harim", "Artah"); - major("Artah", "Aleppo"); - major("Aleppo", "Zerdana"); - major("Zerdana", "Hama"); - major("Hama", "Albara"); - major("Hama", "Monterrand"); - major("Hama", "Homs"); - major("Albara", "Shughur"); - major("Shughur", "Harim"); - major("Monterrand", "Krak"); - major("Krak", "Homs"); - major("Krak", "Tripoli"); - major("Tripoli", "Tartus"); - major("Tripoli", "Botron"); - major("Tartus", "Margat"); - major("Margat", "Latakia"); - major("Botron", "Beirut"); - major("Beirut", "Sidon"); - major("Sidon", "Tyre"); - major("Tyre", "Beaufort"); - major("Beaufort", "Banyas"); - major("Banyas", "Damascus"); - major("Damascus", "Qaddas"); - major("Qaddas", "Homs"); - major("Homs", "Lacum"); - major("Lacum", "Baalbek"); - major("Baalbek", "Anjar"); - major("Anjar", "Beaufort"); - major("Damascus", "Ashtera"); - major("Ashtera", "Ajlun"); - major("Ajlun", "Amman"); - major("Amman", "Kerak"); - major("Kerak", "Zoar"); - major("Zoar", "Hebron"); - major("Hebron", "Jerusalem"); - major("Jerusalem", "Ramallah"); - major("Ramallah", "Jaffa"); - major("Jaffa", "Ascalon"); - major("Ascalon", "Gaza"); - major("Gaza", "Egypt"); - major("Ajlun", "Tiberias"); - major("Tiberias", "Acre"); - major("Acre", "Legio"); - major("Legio", "Baisan"); - major("Baisan", "Tiberias"); - major("Baisan", "Nablus"); - major("Nablus", "Legio"); - major("Nablus", "Jerusalem"); - major("Acre", "Caesarea"); - major("Caesarea", "Jaffa"); - - minor("St. Simeon", "Antioch"); - minor("Antioch", "Kassab"); - minor("Kassab", "Latakia"); - minor("Latakia", "Sa\xf4ne"); - minor("Sa\xf4ne", "Shughur"); - minor("Sa\xf4ne", "Albara"); - minor("Albara", "Zerdana"); - minor("Zerdana", "Artah"); - - minor("Monterrand", "Homs"); - - minor("Tartus", "Krak"); - minor("Krak", "Lacum"); - minor("Lacum", "Qaddas"); - minor("Tripoli", "Baalbek"); - minor("Beirut", "Anjar"); - minor("Anjar", "Damascus"); - minor("Sidon", "Beaufort"); - minor("Tiberias", "Banyas"); - minor("Banyas", "Ashtera"); - minor("Tyre", "Acre"); - minor("Caesarea", "Nablus"); - minor("Nablus", "Damiya"); - minor("Damiya", "Baisan"); - minor("Damiya", "Amman"); - minor("Amman", "Jericho"); - minor("Jericho", "Damiya"); - minor("Jericho", "Kerak"); - minor("Jericho", "Jerusalem"); - - minor("Ramallah", "Ascalon"); - minor("Ascalon", "Lachish"); - minor("Lachish", "Gaza"); - minor("Gaza", "Beersheba"); - minor("Beersheba", "Egypt"); - minor("Beersheba", "Dimona"); - minor("Dimona", "Zoar"); - minor("Dimona", "Hebron"); - minor("Hebron", "Lachish"); - - // off-map roads - ROADS["Germania/St. Simeon"] = 'minor'; - ROADS["Aleppo/Germania"] = 'major'; - ROADS["Antioch/Germania"] = 'major'; - - // TODO: seats and alternate seats -})(); +init_towns() +init_roads() +init_blocks() +init_shields() if (typeof module !== 'undefined') - module.exports = { CARDS, BLOCKS, TOWNS, PORTS, ROADS, SHIELDS } + module.exports = { CARDS, BLOCKS, TOWNS, PORTS, ROADS, SHIELDS, block_index, town_index } |