From 6ed582a00c8f4f94958ac5a3801a9d2f764ed142 Mon Sep 17 00:00:00 2001 From: iainp5 Date: Fri, 5 Jul 2024 08:16:07 +0100 Subject: Added adjacency --- rules.js | 694 ++++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 578 insertions(+), 116 deletions(-) diff --git a/rules.js b/rules.js index bbde529..29eab65 100644 --- a/rules.js +++ b/rules.js @@ -15,83 +15,197 @@ const last_strategy_card = 110 /* to check! */ const hand_limit = 8 const spaces = [ - {name: 'Schwerin', name_unique: 'Schwerin', socio: 4, stability: 3, battleground: 0, country: 1, box: {x: 111, y: 61, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Rostock', name_unique: 'Rostock', socio: 4, stability: 3, battleground: 0, country: 1, box: {x: 228, y: 41, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Berlin', name_unique: 'Berlin', socio: 2, stability: 3, battleground: 1, country: 1, box: {x: 251, y: 113, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0}, - {name: 'German Writers', name_unique: 'German Writers', socio: 5, stability: 2, battleground: 0, country: 1, box: {x: 58, y: 185, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Walter Ulbricht Academy', name_unique: 'Walter Ulbricht Academy', socio: 6, stability: 1, battleground: 0, country: 1, box: {x: 175, y: 187, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Lutherian Church', name_unique: 'Lutherian Church', socio: 7, stability: 5, battleground: 1, country: 1, box: {x: 300, y: 212, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Magdeburg', name_unique: 'Magdeburg', socio: 4, stability: 3, battleground: 1, country: 1, box: {x: 58, y: 275, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Halle', name_unique: 'Halle', socio: 4, stability: 3, battleground: 0, country: 1, box: {x: 175, y: 278, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Leipzig', name_unique: 'Leipzig', socio: 4, stability: 3, battleground: 1, country: 1, box: {x: 297, y: 297, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Erfurt', name_unique: 'Erfurt', socio: 3, stability: 4, battleground: 0, country: 1, box: {x: 23, y: 356, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Karl-Marx-Stadt', name_unique: 'Karl-Marx-Stadt', socio: 4, stability: 3, battleground: 1, country: 1, box: {x: 138, y: 385, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Dresden', name_unique: 'Dresden', socio: 1, stability: 4, battleground: 1, country: 1, box: {x: 262, y: 375, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0}, - {name: 'Szczecin', name_unique: 'Szczecin', socio: 4, stability: 3, battleground: 0, country: 2, box: {x: 434, y: 204, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Gdansk', name_unique: 'Gdansk', socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 699, y: 215, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Bydgoszcz', name_unique: 'Bydgoszcz', socio: 1, stability: 4, battleground: 0, country: 2, box: {x: 679, y: 304, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0}, - {name: 'Poznan', name_unique: 'Poznan', socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 521, y: 355, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Warszawa', name_unique: 'Warszawa', socio: 2, stability: 3, battleground: 1, country: 2, box: {x: 806, y: 383, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0}, - {name: 'Bialystok', name_unique: 'Bialystok', socio: 3, stability: 4, battleground: 0, country: 2, box: {x: 940, y: 342, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Wroclaw', name_unique: 'Wroclaw', socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 462, y: 443, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Catholic Church', name_unique: 'Catholic Church Poland', socio: 7, stability: 5, battleground: 0, country: 2, box: {x: 625, y: 437, h: 65, w: 105}, demInfl: 5, comInfl: 0, demCtrl: 1, comCtrl: 0}, - {name: 'Lodz', name_unique: 'Lodz', socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 749, y: 486, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Katowice', name_unique: 'Katowice', socio: 4, stability: 3, battleground: 0, country: 2, box: {x: 570, y: 569, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Krakow', name_unique: 'Krakow', socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 711, y: 598, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Lublin', name_unique: 'Lublin', socio: 3, stability: 4, battleground: 0, country: 2, box: {x: 879, y: 603, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0}, - {name: 'Jagiellian University', name_unique: 'Jagiellian University', socio: 6, stability: 1, battleground: 0, country: 2, box: {x: 679, y: 681, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Polish Writers', name_unique: 'Polish Writers', socio: 5, stability: 2, battleground: 0, country: 2, box: {x: 832, y: 694, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Plzen', name_unique: 'Plzen', socio: 1, stability: 4, battleground: 0, country: 3, box: {x: 159, y: 483, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0}, - {name: 'Ceske Budejovice', name_unique: 'Ceske Budejovice', socio: 3, stability: 3, battleground: 0, country: 3, box: {x: 196, y: 601, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Praha', name_unique: 'Praha', socio: 2, stability: 3, battleground: 1, country: 3, box: {x: 317, y: 614, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0}, - {name: 'Charles University', name_unique: 'Charles University', socio: 6, stability: 1, battleground: 1, country: 3, box: {x: 380, y: 532, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Czech Writers', name_unique: 'Czech Writers', socio: 5, stability: 2, battleground: 1, country: 3, box: {x: 444, y: 607, h: 65, w: 105}, demInfl: 2, comInfl: 0, demCtrl: 1, comCtrl: 0}, - {name: 'Brno', name_unique: 'Brno', socio: 4, stability: 3, battleground: 1, country: 3, box: {x: 403, y: 711, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0}, - {name: 'Ostrava', name_unique: 'Ostrava', socio: 4, stability: 3, battleground: 1, country: 3, box: {x: 523, y: 681, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Bratislava', name_unique: 'Bratislava', socio: 4, stability: 3, battleground: 1, country: 3, box: {x: 417, y: 797, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Catholic Church', name_unique: 'Catholic Church Czech', socio: 7, stability: 5, battleground: 0, country: 3, box: {x: 538, y: 794, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Presov', name_unique: 'Presov', socio: 3, stability: 4, battleground: 0, country: 3, box: {x: 658, y: 794, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Kosice', name_unique: 'Kosice', socio: 3, stability: 4, battleground: 0, country: 3, box: {x: 777, y: 815, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Catholic Church', name_unique: 'Catholic Church Hungary', socio: 7, stability: 5, battleground: 0, country: 4, box: {x: 314, y: 886, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Gyor', name_unique: 'Gyor', socio: 4, stability: 3, battleground: 0, country: 4, box: {x: 434, y: 887, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Tatabanya', name_unique: 'Tatabanya', socio: 4, stability: 3, battleground: 0, country: 4, box: {x: 549, y: 886, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Miskolc', name_unique: 'Miskolc', socio: 4, stability: 3, battleground: 1, country: 4, box: {x: 664, y: 901, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Debrecen', name_unique: 'Debrecen', socio: 4, stability: 3, battleground: 1, country: 4, box: {x: 781, y: 938, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Szombathely', name_unique: 'Szombathely', socio: 1, stability: 4, battleground: 0, country: 4, box: {x: 316, y: 963, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0}, - {name: 'Szekesfehervar', name_unique: 'Szekesfehervar', socio: 4, stability: 3, battleground: 0, country: 4, box: {x: 442, y: 962, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Budapest', name_unique: 'Budapest', socio: 2, stability: 3, battleground: 1, country: 4, box: {x: 630, y: 983, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Hungarian Writers', name_unique: 'Hungarian Writers', socio: 5, stability: 2, battleground: 0, country: 4, box: {x: 348, y: 1040, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Eotvos Lorand University', name_unique: 'Eotvos Lorand University', socio: 6, stability: 1, battleground: 0, country: 4, box: {x: 512, y: 1034, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Szeged', name_unique: 'Szeged', socio: 3, stability: 4, battleground: 1, country: 4, box: {x: 632, y: 1073, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Pecs', name_unique: 'Pecs', socio: 3, stability: 4, battleground: 1, country: 4, box: {x: 486, y: 1105, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Timisoara', name_unique: 'Timisoara', socio: 4, stability: 3, battleground: 1, country: 5, box: {x: 597, y: 1204, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Cluj-Napoca', name_unique: 'Cluj-Napoca', socio: 1, stability: 4, battleground: 1, country: 5, box: {x: 756, y: 1125, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0}, - {name: 'Targu Mures', name_unique: 'Targu Mures', socio: 3, stability: 4, battleground: 0, country: 5, box: {x: 915, y: 1136, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Iasi', name_unique: 'Iasi', socio: 4, stability: 3, battleground: 1, country: 5, box: {x: 1072, y: 1097, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Babes-Bolyai University', name_unique: 'Babes-Bolyai University', socio: 6, stability: 1, battleground: 0, country: 5, box: {x: 746, y: 1203, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Romanian Writers', name_unique: 'Romanian Writers', socio: 5, stability: 2, battleground: 0, country: 5, box: {x: 739, y: 1278, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Hargita/Covasna', name_unique: 'Hargita/Covasna', socio: 8, stability: 4, battleground: 0, country: 5, box: {x: 928, y: 1227, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Brasov', name_unique: 'Brasov', socio: 4, stability: 3, battleground: 1, country: 5, box: {x: 1049, y: 1225, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Orthodox Church', name_unique: 'Orthodox Church Romania', socio: 7, stability: 3, battleground: 0, country: 5, box: {x: 855, y: 1338, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Ploiesti', name_unique: 'Ploiesti', socio: 4, stability: 3, battleground: 0, country: 5, box: {x: 1061, y: 1316, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Craiova', name_unique: 'Craiova', socio: 3, stability: 4, battleground: 0, country: 5, box: {x: 763, y: 1411, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Bucuresti', name_unique: 'Bucuresti', socio: 2, stability: 3, battleground: 1, country: 5, box: {x: 929, y: 1445, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0}, - {name: 'Galatii', name_unique: 'Galatii', socio: 4, stability: 3, battleground: 1, country: 5, box: {x: 1104, y: 1399, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Constanta', name_unique: 'Constanta', socio: 4, stability: 3, battleground: 0, country: 5, box: {x: 1130, y: 1517, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Pleven', name_unique: 'Pleven', socio: 3, stability: 4, battleground: 0, country: 6, box: {x: 764, y: 1534, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Orthodox Church', name_unique: 'Orthodox Church Bulgaria', socio: 7, stability: 3, battleground: 0, country: 6, box: {x: 882, y: 1540, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Ruse', name_unique: 'Ruse', socio: 4, stability: 3, battleground: 1, country: 6, box: {x: 998, y: 1540, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Sofia University', name_unique: 'Sofia University', socio: 6, stability: 1, battleground: 0, country: 6, box: {x: 645, y: 1650, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Sofia', name_unique: 'Sofia', socio: 2, stability: 3, battleground: 1, country: 6, box: {x: 768, y: 1653, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0}, - {name: 'Stara Zagora', name_unique: 'Stara Zagora', socio: 1, stability: 4, battleground: 0, country: 6, box: {x: 886, y: 1694, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0}, - {name: 'Razgrad', name_unique: 'Razgrad', socio: 8, stability: 4, battleground: 0, country: 6, box: {x: 954, y: 1620, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Burgas', name_unique: 'Burgas', socio: 4, stability: 3, battleground: 1, country: 6, box: {x: 1004, y: 1695, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Varna', name_unique: 'Varna', socio: 4, stability: 3, battleground: 1, country: 6, box: {x: 1086, y: 1613, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Bulgarian Writers', name_unique: 'Bulgarian Writers', socio: 5, stability: 2, battleground: 0, country: 6, box: {x: 652, y: 1726, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Plovdiv', name_unique: 'Plovdiv', socio: 4, stability: 3, battleground: 1, country: 6, box: {x: 771, y: 1739, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - {name: 'Sliven', name_unique: 'Sliven', socio: 3, stability: 4, battleground: 0, country: 6, box: {x: 894, y: 1768, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0}, - - ] + {name: 'Schwerin', name_unique: 'Schwerin', space_id: 1, socio: 4, stability: 3, battleground: 0, country: 1, box: {x: 111, y: 61, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [2, 3, , , ]}, + {name: 'Rostock', name_unique: 'Rostock', space_id: 2, socio: 4, stability: 3, battleground: 0, country: 1, box: {x: 228, y: 41, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [1, 3, , , ]}, + {name: 'Berlin', name_unique: 'Berlin', space_id: 3, socio: 2, stability: 3, battleground: 1, country: 1, box: {x: 251, y: 113, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0, adjacent: [1, 2, 5, 9, ]}, + {name: 'German Writers', name_unique: 'German Writers', space_id: 4, socio: 5, stability: 2, battleground: 0, country: 1, box: {x: 58, y: 185, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [5, , , , ]}, + {name: 'Walter Ulbricht Academy', name_unique: 'Walter Ulbricht Academy', space_id: 5, socio: 6, stability: 1, battleground: 0, country: 1, box: {x: 175, y: 187, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [3, 4, , , ]}, + {name: 'Lutherian Church', name_unique: 'Lutherian Church', space_id: 6, socio: 7, stability: 5, battleground: 1, country: 1, box: {x: 300, y: 212, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [9, , , , ]}, + {name: 'Magdeburg', name_unique: 'Magdeburg', space_id: 7, socio: 4, stability: 3, battleground: 1, country: 1, box: {x: 58, y: 275, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [8, 10, 11, , ]}, + {name: 'Halle', name_unique: 'Halle', space_id: 8, socio: 4, stability: 3, battleground: 0, country: 1, box: {x: 175, y: 278, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [7, 10, 11, , ]}, + {name: 'Leipzig', name_unique: 'Leipzig', space_id: 9, socio: 4, stability: 3, battleground: 1, country: 1, box: {x: 297, y: 297, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [3, 6, 8, 11, 12]}, + {name: 'Erfurt', name_unique: 'Erfurt', space_id: 10, socio: 3, stability: 4, battleground: 0, country: 1, box: {x: 23, y: 356, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [7, , , , ]}, + {name: 'Karl-Marx-Stadt', name_unique: 'Karl-Marx-Stadt', space_id: 11, socio: 4, stability: 3, battleground: 1, country: 1, box: {x: 138, y: 385, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [7, 8, 9, 12, ]}, + {name: 'Dresden', name_unique: 'Dresden', space_id: 12, socio: 1, stability: 4, battleground: 1, country: 1, box: {x: 262, y: 375, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0, adjacent: [9, 11, 19, 27, ]}, + {name: 'Szczecin', name_unique: 'Szczecin', space_id: 13, socio: 4, stability: 3, battleground: 0, country: 2, box: {x: 434, y: 204, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [14, 16, , , ]}, + {name: 'Gdansk', name_unique: 'Gdansk', space_id: 14, socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 699, y: 215, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [13, 15, 16, 17, 18]}, + {name: 'Bydgoszcz', name_unique: 'Bydgoszcz', space_id: 15, socio: 1, stability: 4, battleground: 0, country: 2, box: {x: 679, y: 304, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0, adjacent: [15, 17, , , ]}, + {name: 'Poznan', name_unique: 'Poznan', space_id: 16, socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 521, y: 355, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [13, 14, 19, 20, ]}, + {name: 'Warszawa', name_unique: 'Warszawa', space_id: 17, socio: 2, stability: 3, battleground: 1, country: 2, box: {x: 806, y: 383, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0, adjacent: [14, 15, 18, 21, 24]}, + {name: 'Bialystok', name_unique: 'Bialystok', space_id: 18, socio: 3, stability: 4, battleground: 0, country: 2, box: {x: 940, y: 342, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [14, 17, 24, , ]}, + {name: 'Wroclaw', name_unique: 'Wroclaw', space_id: 19, socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 462, y: 443, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [12, 16, 20, 22, ]}, + {name: 'Catholic Church', name_unique: 'Catholic Church Poland', space_id: 20, socio: 7, stability: 5, battleground: 0, country: 2, box: {x: 625, y: 437, h: 65, w: 105}, demInfl: 5, comInfl: 0, demCtrl: 1, comCtrl: 0, adjacent: [16, 19, 21, 22, 23]}, + {name: 'Lodz', name_unique: 'Lodz', space_id: 21, socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 749, y: 486, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [17, 20, 23, 24, ]}, + {name: 'Katowice', name_unique: 'Katowice', space_id: 22, socio: 4, stability: 3, battleground: 0, country: 2, box: {x: 570, y: 569, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [19, 20, 21, 33, ]}, + {name: 'Krakow', name_unique: 'Krakow', space_id: 23, socio: 4, stability: 3, battleground: 1, country: 2, box: {x: 711, y: 598, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [20, 21, 23, 25, ]}, + {name: 'Lublin', name_unique: 'Lublin', space_id: 24, socio: 3, stability: 4, battleground: 0, country: 2, box: {x: 879, y: 603, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0, adjacent: [17, 18, 21, , ]}, + {name: 'Jagiellian University', name_unique: 'Jagiellian University', space_id: 25, socio: 6, stability: 1, battleground: 0, country: 2, box: {x: 679, y: 681, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [23, 26, , , ]}, + {name: 'Polish Writers', name_unique: 'Polish Writers', space_id: 26, socio: 5, stability: 2, battleground: 0, country: 2, box: {x: 832, y: 694, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [25, , , , ]}, + {name: 'Plzen', name_unique: 'Plzen', space_id: 27, socio: 1, stability: 4, battleground: 0, country: 3, box: {x: 159, y: 483, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0, adjacent: [12, 29, , , ]}, + {name: 'Ceske Budejovice', name_unique: 'Ceske Budejovice', space_id: 28, socio: 3, stability: 3, battleground: 0, country: 3, box: {x: 196, y: 601, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [28, 29, , , ]}, + {name: 'Praha', name_unique: 'Praha', space_id: 29, socio: 2, stability: 3, battleground: 1, country: 3, box: {x: 317, y: 614, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0, adjacent: [27, 28, 30, 32, ]}, + {name: 'Charles University', name_unique: 'Charles University', space_id: 30, socio: 6, stability: 1, battleground: 1, country: 3, box: {x: 380, y: 532, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [29, 31, , , ]}, + {name: 'Czech Writers', name_unique: 'Czech Writers', space_id: 31, socio: 5, stability: 2, battleground: 1, country: 3, box: {x: 444, y: 607, h: 65, w: 105}, demInfl: 2, comInfl: 0, demCtrl: 1, comCtrl: 0, adjacent: [30, , , , ]}, + {name: 'Brno', name_unique: 'Brno', space_id: 32, socio: 4, stability: 3, battleground: 1, country: 3, box: {x: 403, y: 711, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0, adjacent: [29, 33, 34, , ]}, + {name: 'Ostrava', name_unique: 'Ostrava', space_id: 33, socio: 4, stability: 3, battleground: 1, country: 3, box: {x: 523, y: 681, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [22, 32, 34, 35, ]}, + {name: 'Bratislava', name_unique: 'Bratislava', space_id: 34, socio: 4, stability: 3, battleground: 1, country: 3, box: {x: 417, y: 797, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [32, 33, 35, , ]}, + {name: 'Catholic Church', name_unique: 'Catholic Church Czech', space_id: 35, socio: 7, stability: 5, battleground: 0, country: 3, box: {x: 538, y: 794, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [33, 34, 36, , ]}, + {name: 'Presov', name_unique: 'Presov', space_id: 36, socio: 3, stability: 4, battleground: 0, country: 3, box: {x: 658, y: 794, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [35, 37, , , ]}, + {name: 'Kosice', name_unique: 'Kosice', space_id: 37, socio: 3, stability: 4, battleground: 0, country: 3, box: {x: 777, y: 815, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [36, 42, , , ]}, + {name: 'Catholic Church', name_unique: 'Catholic Church Hungary', space_id: 38, socio: 7, stability: 5, battleground: 0, country: 4, box: {x: 314, y: 886, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [39, 43, , , ]}, + {name: 'Gyor', name_unique: 'Gyor', space_id: 39, socio: 4, stability: 3, battleground: 0, country: 4, box: {x: 434, y: 887, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [38, 40, 43, 44, ]}, + {name: 'Tatabanya', name_unique: 'Tatabanya', space_id: 40, socio: 4, stability: 3, battleground: 0, country: 4, box: {x: 549, y: 886, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [39, 41, 45, , ]}, + {name: 'Miskolc', name_unique: 'Miskolc', space_id: 41, socio: 4, stability: 3, battleground: 1, country: 4, box: {x: 664, y: 901, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [40, 42, 45, , ]}, + {name: 'Debrecen', name_unique: 'Debrecen', space_id: 42, socio: 4, stability: 3, battleground: 1, country: 4, box: {x: 781, y: 938, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [37, 41, , , ]}, + {name: 'Szombathely', name_unique: 'Szombathely', space_id: 43, socio: 1, stability: 4, battleground: 0, country: 4, box: {x: 316, y: 963, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0, adjacent: [38, 39, 44, , ]}, + {name: 'Szekesfehervar', name_unique: 'Szekesfehervar', space_id: 44, socio: 4, stability: 3, battleground: 0, country: 4, box: {x: 442, y: 962, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [39, 43, 45, , ]}, + {name: 'Budapest', name_unique: 'Budapest', space_id: 45, socio: 2, stability: 3, battleground: 1, country: 4, box: {x: 630, y: 983, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [4, 41, 44, 47, 48]}, + {name: 'Hungarian Writers', name_unique: 'Hungarian Writers', space_id: 46, socio: 5, stability: 2, battleground: 0, country: 4, box: {x: 348, y: 1040, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [47, , , , ]}, + {name: 'Eotvos Lorand University', name_unique: 'Eotvos Lorand University', space_id: 47, socio: 6, stability: 1, battleground: 0, country: 4, box: {x: 512, y: 1034, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [46, 45, , , ]}, + {name: 'Szeged', name_unique: 'Szeged', space_id: 48, socio: 3, stability: 4, battleground: 1, country: 4, box: {x: 632, y: 1073, h: 65, w: 105}, demInfl: 1, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [45, 49, 50, , ]}, + {name: 'Pecs', name_unique: 'Pecs', space_id: 49, socio: 3, stability: 4, battleground: 1, country: 4, box: {x: 486, y: 1105, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [48, , , , ]}, + {name: 'Timisoara', name_unique: 'Timisoara', space_id: 50, socio: 4, stability: 3, battleground: 1, country: 5, box: {x: 597, y: 1204, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [48, 51, 60, , ]}, + {name: 'Cluj-Napoca', name_unique: 'Cluj-Napoca', space_id: 51, socio: 1, stability: 4, battleground: 1, country: 5, box: {x: 756, y: 1125, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0, adjacent: [50, 54, 58, , ]}, + {name: 'Targu Mures', name_unique: 'Targu Mures', space_id: 52, socio: 3, stability: 4, battleground: 0, country: 5, box: {x: 915, y: 1136, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [53, 56, , , ]}, + {name: 'Iasi', name_unique: 'Iasi', space_id: 53, socio: 4, stability: 3, battleground: 1, country: 5, box: {x: 1072, y: 1097, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [52, 57, 62, , ]}, + {name: 'Babes-Bolyai University', name_unique: 'Babes-Bolyai University', space_id: 54, socio: 6, stability: 1, battleground: 0, country: 5, box: {x: 746, y: 1203, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [51, 55, , , ]}, + {name: 'Romanian Writers', name_unique: 'Romanian Writers', space_id: 55, socio: 5, stability: 2, battleground: 0, country: 5, box: {x: 739, y: 1278, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [54, , , , ]}, + {name: 'Hargita/Covasna', name_unique: 'Hargita/Covasna', space_id: 56, socio: 8, stability: 4, battleground: 0, country: 5, box: {x: 928, y: 1227, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [52, , , , ]}, + {name: 'Brasov', name_unique: 'Brasov', space_id: 57, socio: 4, stability: 3, battleground: 1, country: 5, box: {x: 1049, y: 1225, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [53, 59, 61, , ]}, + {name: 'Orthodox Church', name_unique: 'Orthodox Church Romania', space_id: 58, socio: 7, stability: 3, battleground: 0, country: 5, box: {x: 855, y: 1338, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [51, 60, , , ]}, + {name: 'Ploiesti', name_unique: 'Ploiesti', space_id: 59, socio: 4, stability: 3, battleground: 0, country: 5, box: {x: 1061, y: 1316, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [57, 61, 62, , ]}, + {name: 'Craiova', name_unique: 'Craiova', space_id: 60, socio: 3, stability: 4, battleground: 0, country: 5, box: {x: 763, y: 1411, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [50, 58, 61, , ]}, + {name: 'Bucuresti', name_unique: 'Bucuresti', space_id: 61, socio: 2, stability: 3, battleground: 1, country: 5, box: {x: 929, y: 1445, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0, adjacent: [51, 57, 59, 60, 63]}, + {name: 'Galatii', name_unique: 'Galatii', space_id: 62, socio: 4, stability: 3, battleground: 1, country: 5, box: {x: 1104, y: 1399, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [53, 59, 63, , ]}, + {name: 'Constanta', name_unique: 'Constanta', space_id: 63, socio: 4, stability: 3, battleground: 0, country: 5, box: {x: 1130, y: 1517, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [61, 62, 72, , ]}, + {name: 'Pleven', name_unique: 'Pleven', space_id: 64, socio: 3, stability: 4, battleground: 0, country: 6, box: {x: 764, y: 1534, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [67, , , , ]}, + {name: 'Orthodox Church', name_unique: 'Orthodox Church Bulgaria', space_id: 65, socio: 7, stability: 3, battleground: 0, country: 6, box: {x: 882, y: 1540, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [66, 68, , , ]}, + {name: 'Ruse', name_unique: 'Ruse', space_id: 66, socio: 4, stability: 3, battleground: 1, country: 6, box: {x: 998, y: 1540, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [65, 69, 70, 71, 72]}, + {name: 'Sofia University', name_unique: 'Sofia University', space_id: 67, socio: 6, stability: 1, battleground: 0, country: 6, box: {x: 645, y: 1650, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [68, 73, , , ]}, + {name: 'Sofia', name_unique: 'Sofia', space_id: 68, socio: 2, stability: 3, battleground: 1, country: 6, box: {x: 768, y: 1653, h: 65, w: 105}, demInfl: 0, comInfl: 2, demCtrl: 0, comCtrl: 0, adjacent: [64, 65, 67, 69, 74]}, + {name: 'Stara Zagora', name_unique: 'Stara Zagora', space_id: 69, socio: 1, stability: 4, battleground: 0, country: 6, box: {x: 886, y: 1694, h: 65, w: 105}, demInfl: 0, comInfl: 1, demCtrl: 0, comCtrl: 0, adjacent: [66, 68, 71, , ]}, + {name: 'Razgrad', name_unique: 'Razgrad', space_id: 70, socio: 8, stability: 4, battleground: 0, country: 6, box: {x: 954, y: 1620, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [66, , , , ]}, + {name: 'Burgas', name_unique: 'Burgas', space_id: 71, socio: 4, stability: 3, battleground: 1, country: 6, box: {x: 1004, y: 1695, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [66, 69, 72, , ]}, + {name: 'Varna', name_unique: 'Varna', space_id: 72, socio: 4, stability: 3, battleground: 1, country: 6, box: {x: 1086, y: 1613, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [63, 66, 71, , ]}, + {name: 'Bulgarian Writers', name_unique: 'Bulgarian Writers', space_id: 73, socio: 5, stability: 2, battleground: 0, country: 6, box: {x: 652, y: 1726, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [67, , , , ]}, + {name: 'Plovdiv', name_unique: 'Plovdiv', space_id: 74, socio: 4, stability: 3, battleground: 1, country: 6, box: {x: 771, y: 1739, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [68, 75, , , ]}, + {name: 'Sliven', name_unique: 'Sliven', space_id: 75, socio: 3, stability: 4, battleground: 0, country: 6, box: {x: 894, y: 1768, h: 65, w: 105}, demInfl: 0, comInfl: 0, demCtrl: 0, comCtrl: 0, adjacent: [75, , , , ]}, + ] + +const cards = [ + null, + {number: 1, period: 1, side: 'C', name: 'Legacy of Martial Law*', ops: 2, remove: 1}, + {number: 2, period: 1, side: 'D', name: 'Solidarity Legalized*', ops: 4, remove: 1}, + {number: 3, period: 1, side: 'D', name: 'Walesa*', ops: 3, remove: 1}, + {number: 4, period: 1, side: 'D', name: 'Michnik*', ops: 1, remove: 1}, + {number: 5, period: 1, side: 'D', name: 'General Strike', ops: 3, remove: 0}, + {number: 6, period: 1, side: 'C', name: 'Brought in for Questioning', ops: 3, remove: 0}, + {number: 7, period: 1, side: 'C', name: 'State Run Media*', ops: 2, remove: 1}, + {number: 8, period: 1, side: 'N', name: 'Prudence', ops: 4, remove: 0}, + {number: 9, period: 1, side: 'C', name: 'The Wall*', ops: 1, remove: 1}, + {number: 10, period: 1, side: 'C', name: 'Cult of Personality*', ops: 3, remove: 1}, + {number: 11, period: 1, side: 'C', name: 'Dissident Arrested', ops: 2, remove: 0}, + {number: 12, period: 1, side: 'C', name: 'Apparatchiks*', ops: 2, remove: 1}, + {number: 13, period: 1, side: 'C', name: 'Stasi*', ops: 1, remove: 1}, + {number: 14, period: 1, side: 'N', name: 'Gorbachev Charms the West', ops: 4, remove: 0}, + {number: 15, period: 1, side: 'C', name: 'Honecker*', ops: 3, remove: 1}, + {number: 16, period: 1, side: 'C', name: 'Nomenklatura*', ops: 2, remove: 1}, + {number: 17, period: 1, side: 'D', name: 'Roundtable Talks', ops: 3, remove: 0}, + {number: 18, period: 1, side: 'C', name: 'Poszgay Defends the Revolution*', ops: 2, remove: 1}, + {number: 19, period: 1, side: 'D', name: 'Papal Visit*', ops: 2, remove: 1}, + {number: 20, period: 1, side: 'C', name: 'Deutsche Marks*', ops: 4, remove: 1}, + {number: 21, period: 1, side: 'N', name: 'Common European Home', ops: 2, remove: 0}, + {number: 22, period: 1, side: 'N', name: 'Power Struggle - Poland', ops: 0, remove: 0}, + {number: 23, period: 1, side: 'N', name: 'Power Struggle - Hungary', ops: 0, remove: 0}, + {number: 24, period: 1, side: 'D', name: 'St. Nicholas Church*', ops: 1, remove: 1}, + {number: 25, period: 1, side: 'C', name: 'Perestroika*', ops: 3, remove: 1}, + {number: 26, period: 1, side: 'D', name: 'Helsinki Final Act*', ops: 1, remove: 1}, + {number: 27, period: 1, side: 'D', name: 'Consumerism', ops: 3, remove: 0}, + {number: 28, period: 1, side: 'C', name: 'Factory Party Cells', ops: 3, remove: 0}, + {number: 29, period: 1, side: 'D', name: 'Jan Palach Week*', ops: 1, remove: 1}, + {number: 30, period: 1, side: 'C', name: 'Tear Gas*', ops: 1, remove: 1}, + {number: 31, period: 1, side: 'D', name: 'Intelligentsia', ops: 2, remove: 0}, + {number: 32, period: 1, side: 'C', name: 'Peasant Parties*', ops: 2, remove: 1}, + {number: 33, period: 1, side: 'D', name: 'Sajudis*', ops: 2, remove: 1}, + {number: 34, period: 1, side: 'D', name: 'Fidesz*', ops: 2, remove: 1}, + {number: 35, period: 1, side: 'C', name: 'Heal Our Bleeding Wound', ops: 3, remove: 0}, + {number: 36, period: 1, side: 'D', name: 'Dash for the West*', ops: 3, remove: 1}, + {number: 37, period: 1, side: 'C', name: 'Nagy Reburied*', ops: 3, remove: 1}, + {number: 38, period: 1, side: 'C', name: 'The July Concept*', ops: 3, remove: 1}, + {number: 39, period: 1, side: 'D', name: 'Eco-Glasnost*', ops: 2, remove: 1}, + {number: 40, period: 1, side: 'D', name: 'Hungarian Democratic Forum*', ops: 3, remove: 1}, + {number: 41, period: 2, side: 'C', name: 'Ceausescu*', ops: 3, remove: 1}, + {number: 42, period: 2, side: 'N', name: 'Power Struggle - East Germany', ops: 0, remove: 0}, + {number: 43, period: 2, side: 'N', name: 'Power Struggle - Bulgaria', ops: 0, remove: 0}, + {number: 44, period: 2, side: 'N', name: 'Inflationary Currency*', ops: 3, remove: 1}, + {number: 45, period: 2, side: 'D', name: 'Soviet Troop Withdrawals*', ops: 4, remove: 1}, + {number: 46, period: 2, side: 'D', name: 'Goodbye Lenin!*', ops: 3, remove: 1}, + {number: 47, period: 2, side: 'C', name: 'Bulgarian Turks expelled*', ops: 3, remove: 1}, + {number: 48, period: 2, side: 'D', name: '\"We are the People!\"', ops: 3, remove: 0}, + {number: 49, period: 2, side: 'D', name: 'Foreign Currency Debt Burden', ops: 1, remove: 0}, + {number: 50, period: 2, side: 'D', name: 'This Sinatra Doctrine*', ops: 3, remove: 1}, + {number: 51, period: 2, side: 'C', name: '40th Anniversary Celebration*', ops: 2, remove: 1}, + {number: 52, period: 2, side: 'C', name: 'Normalization*', ops: 3, remove: 1}, + {number: 53, period: 2, side: 'C', name: 'Li Peng*', ops: 2, remove: 1}, + {number: 54, period: 3, side: 'D', name: 'The Crowd Turns Against Ceausescu*', ops: 3, remove: 1}, + {number: 55, period: 2, side: 'N', name: 'Power Struggle - Czechoslovakia', ops: 0, remove: 0}, + {number: 56, period: 2, side: 'D', name: 'Foreign Television*', ops: 2, remove: 1}, + {number: 57, period: 2, side: 'C', name: 'Central Committee Reshuffle*', ops: 2, remove: 1}, + {number: 58, period: 2, side: 'D', name: 'Austria-Hungary Border Reopened*', ops: 2, remove: 1}, + {number: 59, period: 2, side: 'C', name: 'GrenzTruppen*', ops: 2, remove: 1}, + {number: 60, period: 2, side: 'D', name: 'Toxic Waste*', ops: 2, remove: 1}, + {number: 61, period: 2, side: 'D', name: 'The Monday Demonstrations*', ops: 4, remove: 1}, + {number: 62, period: 2, side: 'D', name: 'Yakovlev Counsels Gorbachev*', ops: 2, remove: 1}, + {number: 63, period: 2, side: 'D', name: 'Genscher*', ops: 2, remove: 1}, + {number: 64, period: 2, side: 'D', name: 'Legacy of 1968*', ops: 4, remove: 1}, + {number: 65, period: 2, side: 'D', name: 'Presidential Visit*', ops: 3, remove: 1}, + {number: 66, period: 2, side: 'D', name: 'New Forum*', ops: 1, remove: 1}, + {number: 67, period: 2, side: 'N', name: 'Reformer Rehabilitated*', ops: 2, remove: 1}, + {number: 68, period: 2, side: 'D', name: 'Klaus and Komarek*', ops: 3, remove: 1}, + {number: 69, period: 2, side: 'C', name: 'Systematization*', ops: 3, remove: 1}, + {number: 70, period: 3, side: 'C', name: 'Securitate*', ops: 2, remove: 1}, + {number: 71, period: 2, side: 'D', name: 'Kiss of Death*', ops: 3, remove: 1}, + {number: 72, period: 2, side: 'D', name: 'Peasant Parties Revolt*', ops: 3, remove: 1}, + {number: 73, period: 2, side: 'D', name: 'Laszlo Tokes*', ops: 2, remove: 1}, + {number: 74, period: 2, side: 'D', name: 'FRG Embassies*', ops: 3, remove: 1}, + {number: 75, period: 2, side: 'D', name: 'Exit Visas*', ops: 3, remove: 1}, + {number: 76, period: 2, side: 'C', name: 'Warsaw Pact Summit*', ops: 2, remove: 1}, + {number: 77, period: 2, side: 'D', name: 'Samizdat*', ops: 3, remove: 1}, + {number: 78, period: 2, side: 'N', name: 'Workers Revolt', ops: 2, remove: 0}, + {number: 79, period: 2, side: 'C', name: 'The Third Way*', ops: 2, remove: 1}, + {number: 80, period: 2, side: 'C', name: 'Nepotism*', ops: 3, remove: 1}, + {number: 81, period: 2, side: 'D', name: 'The Baltic Way*', ops: 3, remove: 1}, + {number: 82, period: 3, side: 'C', name: 'Spitzel*', ops: 1, remove: 1}, + {number: 83, period: 3, side: 'C', name: 'Modrow*', ops: 2, remove: 1}, + {number: 84, period: 3, side: 'D', name: 'Breakaway Baltic Republics*', ops: 4, remove: 1}, + {number: 85, period: 3, side: 'N', name: 'Tank Column/Tank Man*', ops: 2, remove: 1}, + {number: 86, period: 3, side: 'D', name: '\"The Wall Must Go!*\"', ops: 3, remove: 0}, + {number: 87, period: 3, side: 'D', name: 'Kohl Proposes Reunification*', ops: 3, remove: 1}, + {number: 88, period: 3, side: 'C', name: 'Adamec*', ops: 2, remove: 1}, + {number: 89, period: 3, side: 'D', name: 'Domino Theory*', ops: 3, remove: 1}, + {number: 90, period: 3, side: 'D', name: 'Civic Forum*', ops: 4, remove: 1}, + {number: 91, period: 3, side: 'D', name: 'My First Banana*', ops: 3, remove: 1}, + {number: 92, period: 3, side: 'C', name: 'Betrayal*', ops: 3, remove: 1}, + {number: 93, period: 3, side: 'D', name: 'Shock Therapy*', ops: 3, remove: 1}, + {number: 94, period: 3, side: 'D', name: 'Union of Democratic Forces*', ops: 4, remove: 1}, + {number: 95, period: 3, side: 'N', name: 'Power Struggle - Romania', ops: 0, remove: 0}, + {number: 96, period: 3, side: 'C', name: 'The Chinese Solution*', ops: 1, remove: 1}, + {number: 97, period: 3, side: 'D', name: 'The Tyrant is Gone*', ops: 2, remove: 1}, + {number: 98, period: 3, side: 'C', name: 'Politburo Intrigue*', ops: 2, remove: 1}, + {number: 99, period: 3, side: 'C', name: 'Ligachev*', ops: 3, remove: 1}, + {number: 100, period: 3, side: 'N', name: 'Stand Fast*', ops: 3, remove: 1}, + {number: 101, period: 3, side: 'C', name: 'Elena*', ops: 1, remove: 1}, + {number: 102, period: 3, side: 'C', name: 'National Salvation Front*', ops: 3, remove: 1}, + {number: 103, period: 3, side: 'D', name: 'Government Resigns*', ops: 3, remove: 1}, + {number: 104, period: 3, side: 'C', name: 'New Year\'s Eve Party*', ops: 2, remove: 1}, + {number: 105, period: 3, side: 'D', name: 'Public Against Violence*', ops: 3, remove: 1}, + {number: 106, period: 3, side: 'C', name: 'Social Democratic Platform Adopted*', ops: 2, remove: 1}, + {number: 107, period: 3, side: 'C', name: 'Massacre in Timisoara*', ops: 3, remove: 1}, + {number: 108, period: 3, side: 'D', name: 'Army Backs Revolution*', ops: 3, remove: 1}, + {number: 109, period: 3, side: 'C', name: 'Kremlin Coup!*', ops: 3, remove: 1}, + {number: 110, period: 3, side: 'D', name: 'Malta Summit*', ops: 3, remove: 1}, + +] exports.scenarios = [ "Standard" ] @@ -109,13 +223,21 @@ exports.setup = function (seed, scenario, options) { log: [], undo: [], active: null, - state: "com_init_1", + state: "com_init", played_card: [], available_ops: 0, + starting_infl: { + com_starting_infl: 0, + dem_starting_infl: 0 + }, turn: 0, round: 0, + stability: 0, + dem_TST: 0, + com_TST: 0, + vp: 0, pieces: [], @@ -140,15 +262,27 @@ function start_game() { //starting influence console.log('start_game called') + // Draw cards + game.strategy_deck = draw_deck(cards) + console.log('starting deck: ', game.strategy_deck.length) + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, hand_limit) + + console.log('democrat_hand: ', game.democrat_hand, 'communist hand: ', game.communist_hand) + console.log('updated deck: ', game.strategy_deck.length) + spaces.forEach(space => { game.pieces.push({ name_unique: space.name_unique, demInfl: space.demInfl, - comInfl: space.comInfl + comInfl: space.comInfl, + stability: space.stability }); }); + //console.log('game.pieces: ', game.pieces) //Communist starts by placing 2 influence game.available_ops = 2 + log_h1("Place starting influence") + log_side() } @@ -163,10 +297,17 @@ exports.view = function(state, player) { played_card: game.played_card, selected_space: game.selected_space, + valid_spaces: [], pieces: game.pieces, turn: game.turn, round: game.round, + vp: game.vp, + stability: game.stability, + dem_TST: game.dem_TST, + com_TST: game.com_TST, + + strategy_deck: game.strategy_deck.length, democrat_hand: game.democrat_hand.length, @@ -219,7 +360,7 @@ exports.view = function(state, player) { } -// === ACTIONS +// === ACTIONS =========== function gen_action(action, argument) { //console.log('gen_action called with ', action, ' and ', argument) @@ -234,10 +375,13 @@ function gen_action(action, argument) { } function gen_action_infl(space){ - console.log('gen_action_infl called') gen_action("infl", space) } +function gen_action_card(card){ + gen_action("card", card) +} + exports.action = function (state, player, action, arg) { //console.log('exports.action called with state:' , state, 'player:', player, 'action: ', action, 'arg: ', arg) game = state @@ -252,64 +396,345 @@ exports.action = function (state, player, action, arg) { return game } +// ============= GAME STATES ======================= +states.com_init = { + inactive: 'place starting influence', + prompt() { + if (game.available_ops == 0) { + view.prompt = 'Place starting influence: done.'; + gen_action("done"); + return; + } + view.prompt = `Place ${game.available_ops} starting influence` + + let available_spaces = spaces.slice() + for (let space of available_spaces) { + //May not add where there is opposition influence + const clicked_space = find_space_index(space.name_unique) + if (game.pieces[clicked_space].demInfl === 0) { + gen_action_infl(space.name_unique) + } + //console.log('state: com_init_1') + //console.log('space: ', space) + } + }, + infl(space) { + + add_infl(space) -function init_player_cards(first_card) { - let c = first_card - let deck = [] - - for (let n = 0; n < era_cards_count; ++n) - deck.push(++c) - - shuffle(deck) - - return deck + if (game.available_ops === 0) { + view.prompt= 'Place starting influence: done.' + gen_action("done") + } + }, + + done() { + view.prompt='Influence added' + game.starting_infl.com_starting_infl++ + console.log('game.starting_infl.com_starting_infl: ', game.starting_infl.com_starting_infl) + if (game.starting_infl.com_starting_infl == 1){ + game.available_ops = 3 + game.state = 'dem_init' + next_player() + log_side() + } else if (game.starting_infl.com_starting_infl == 2) { + game.available_ops = 4 + game.state = 'dem_init' + next_player() + log_side() + } else if (game.starting_infl.com_starting_infl == 3) { + new_turn() + clear_undo() + game.state = 'choose_card' + } + } } - - -states.com_init_1 = { +states.dem_init = { inactive: 'place starting influence', prompt() { + if (game.available_ops == 0) { + view.prompt = 'Place starting influence: done.'; + gen_action("done"); + return; + } view.prompt = `Place ${game.available_ops} starting influence` let available_spaces = spaces.slice() for (let space of available_spaces) { - gen_action_infl(space.name_unique); + //May not add where there is opposition influence + const clicked_space = find_space_index(space.name_unique) + if (game.pieces[clicked_space].comInfl === 0) { + gen_action_infl(space.name_unique) + } //console.log('state: com_init_1') //console.log('space: ', space) } }, - infl(space) { - push_undo() - console.log('space clicked was: ', space) - const clicked_space = find_space_index(space) - console.log('clicked_space: ', clicked_space) - console.log('game.pieces.space', game.pieces[clicked_space]) - console.log('initial influence: ', game.pieces[clicked_space] ) - game.pieces[clicked_space].comInfl++ - game.available_ops-- - console.log('new influence: ', game.pieces[clicked_space]) + + add_infl(space) +/* + if (game.available_ops === 0) { + view.prompt= 'Place starting influence: done.' + gen_action("done") + } */ + }, + + done() { + view.prompt='Influence added' + game.starting_infl.dem_starting_infl++ + console.log('game.starting_infl.com_starting_infl: ', game.starting_infl.com_starting_infl) + if (game.starting_infl.dem_starting_infl == 1){ + game.available_ops = 3 + } else if (game.starting_infl.dem_starting_infl == 2) { + game.available_ops = 2 + } + next_player() + log_side() + game.state = 'com_init' + } +} + +/*states.start_new_turn = { + inactive: 'to choose a card', + prompt() { + view.prompt = 'Choose a card', + new_turn() + game.state = 'select_card' + }, +}*/ + +states.choose_card = { + inactive: 'choose a card', + prompt() { + if (game.played_card > 0) { + view.prompt = 'Choose a card: done' + gen_action("done"); + return; + } + + view.prompt = 'Choose a card' + let available_cards + if (game.active === DEM) { + available_cards = game.democrat_hand + } else { + available_cards = game.communist_hand + } + console.log(available_cards) + for (let card of available_cards) { + gen_action_card(card) + } + }, + card(card) { + console.log('card number: ', card) + log(`Played ${cards[card].name}`) + game.played_card = card + let find_card + if (game.active === COM) { + find_card = game.communist_hand.indexOf(card); + const [playedCard] = game.communist_hand.splice(find_card, 1); + } else { + find_card = game.democrat_hand.indexOf(card); + const [playedCard] = game.democrat_hand.splice(find_card, 1); + } + game.strategy_discard.push(card) + console.log('discard: ', game.strategy_discard) + game.available_ops = cards[card].ops + console.log('game.available_ops: ', game.available_ops) + view.prompt = 'Choose a card: done' + gen_action("done") + }, + done () { + game.state = 'play_card' + } +} + +states.play_card ={ + inactive: 'play a card', + prompt () { + view.prompt = 'Play for:' + clear_undo() + gen_action('event') + gen_action('influence') + gen_action('tst') + gen_action('support_check') + }, + event() { + + }, + influence(influence) { + console.log('influence called') + game.state='add_influence' + }, + tst(tst) { + console.log('tst called') + }, + support_check() { + + } + +} + +states.add_influence = { + inactive: 'add influence', + valid_spaces: [], + prompt () { if (game.available_ops == 0) { - game.state = "next_step" - } + view.prompt = 'Place starting influence: done.'; + gen_action("done"); + return; + } + + view.prompt = `Add influence: ${game.available_ops} remaining` + + //Only do the influence check at the start. No chaining of placing influence + if (this.valid_spaces.length === 0) { + this.valid_spaces = this.get_valid_spaces(); + } + + // Generate actions for initial valid spaces + for (let space_id of this.valid_spaces) { + const space = spaces.find(s => s.space_id === space_id); + if (space) { + gen_action_infl(space.name_unique); + } + } + + }, + infl(space) { + add_infl(space) + }, + get_valid_spaces() { + return valid_spaces() + }, + done() { + view.prompt = 'Influence added' + game.state = 'test' } + } -states.next_step = { - inactive: "place starting influence", - prompt() { - view.prompt = "Next step" +states.test = { + inactive: 'test', + prompt () { + view.prompt = "test" } } +function add_infl(space) { + log(`Added 1 influence in ${space}.`) + push_undo() + console.log('space clicked was: ', space) + const clicked_space = find_space_index(space) + const opponent_control = game.active === COM ? game.pieces[clicked_space].demCtrl : game.pieces[clicked_space].comCtrl + + console.log('clicked_space: ', clicked_space) + console.log('game.pieces.space', game.pieces[clicked_space]) + console.log('initial influence: ', game.pieces[clicked_space] ) + + if (game.active === COM) { + game.pieces[clicked_space].comInfl++ + } else { + game.pieces[clicked_space].demInfl++ + } + if (opponent_control) { + game.available_ops -= 2 + } else { + game.available_ops-- + } + console.log('new influence: ', game.pieces[clicked_space]) + console.log('available_ops: ', game.available_ops) +} + +function valid_spaces() { + let valid_spaces_set = new Set(); + + // Iterate over all spaces to find the ones with the player's influence + for (let space of spaces) { + const player_influence = game.active === COM ? space.comInfl : space.demInfl; + + // If the space has the player's influence, add it and its adjacent spaces to the set + if (player_influence > 0) { + valid_spaces_set.add(space.space_id); + for (let adj_space_id of space.adjacent) { + if (adj_space_id) { + const adj_space = spaces.find(s => s.space_id === adj_space_id); + + // Check if the adjacent space is controlled by the opponent + const opponent_control = game.active === COM ? adj_space.demCtrl : adj_space.comCtrl; + + // Only add the adjacent space if the available_ops >= 2 or the space is not controlled by the opponent + if (game.available_ops >= 2 || !opponent_control) { + valid_spaces_set.add(adj_space.space_id); + } + } + } + } + } + // Convert the set to an array before returning + view.valid_spaces = Array.from(valid_spaces_set) + return Array.from(valid_spaces_set); +} + +// =========== MOVING THROUGH TURNS ============ + +function new_turn() { + game.turn ++ + game.round = 1 + log_h1("Turn " + game.turn) + log_h2("Action Round " + game.round) + log_side() +} + +function next_player() { + clear_undo() + + if (game.active === DEM) + game.active = COM + else + game.active = DEM +} + function find_space_index(name_unique) { return game.pieces.findIndex(piece => piece && piece.name_unique === name_unique); } +function find_card_index(card) { + return cards.findIndex(card => card && card.number === card); +} + +function draw_deck(deck) { + return deck.filter(card => card && card.period === 1); +} + +function draw_cards(deck, democrat_hand, communist_hand, hand_limit) { + let turn = 'communist'; // Start with the communist player + + while (democrat_hand.length < hand_limit || communist_hand.length < hand_limit) { + if (deck.length === 0) { + console.log('No more cards in the deck.'); + break; + } + + if (turn === 'communist' && communist_hand.length < hand_limit) { + communist_hand.push(draw_card(deck).number); + turn = 'democrat'; // Switch turn + } else if (turn === 'democrat' && democrat_hand.length < hand_limit) { + democrat_hand.push(draw_card(deck).number); + turn = 'communist'; // Switch turn + } + } +} + +function draw_card(deck) { + const randomIndex = Math.floor(Math.random() * deck.length); + return deck.splice(randomIndex, 1)[0]; +} + // === COMMON LIBRARY === function shuffle(list) { @@ -323,19 +748,56 @@ function shuffle(list) { return list } +// ======== LOG COMMANDS ============= + +function log(msg) { + game.log.push(msg) +} + +function log_br() { + if (game.log.length > 0 && game.log[game.log.length - 1] !== "") + game.log.push("") +} + +function logi(msg) { + game.log.push(">" + msg) +} + function log_h1(msg) { log_br() log(".h1 " + msg) log_br() } -function log_br() { - if (game.log.length > 0 && game.log[game.log.length - 1] !== "") - game.log.push("") +function log_h2(msg) { + log_br() + log(".h2 " + msg) + log_br() } -function log(msg) { - game.log.push(msg) +function log_h3(msg) { + log_br() + log(".h3 " + msg) +} + +function log_side() { + log_br() + if (game.active === DEM) + log(".h2d " + game.active) + else + log(".h2c " + game.active) + log_br() +} + +function log_sep() { + log(".hr") +} + +// ============ UNDO FUNCTIONS ================== + +function clear_undo() { + if (game.undo.length > 0) + game.undo = [] } function push_undo() { -- cgit v1.2.3