summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2024-10-25 11:58:58 +0200
committerTor Andersson <tor@ccxvii.net>2024-10-26 00:00:01 +0200
commit5d81b4294bd8f9b20ac8a396a185f6cf9550c00f (patch)
tree1fd4e5fd1bbab268f3421cef825d6504b39d5370
parent7122c8101e49300b7e29266a939f355e9eb8ffd3 (diff)
download1989-dawn-of-freedom-5d81b4294bd8f9b20ac8a396a185f6cf9550c00f.tar.gz
Update client.
Fixed some spelling errors in space data table. Create tools directory and add Makefile. Add layout.svg with boxes drawn on top of locations. Add genlayout.js to create list of box locations. Add gencolors.js to create beveled marker border colors. Major rewrite of play.js and play.css with official assets.
-rw-r--r--Makefile9
-rw-r--r--data.js1355
-rw-r--r--images/trash-can.svg1
-rw-r--r--info/cards.html193
-rw-r--r--play.css1010
-rw-r--r--play.html236
-rw-r--r--play.js1080
-rw-r--r--rules.js71
-rw-r--r--tools/colors.js110
-rw-r--r--tools/gencode.js (renamed from gencode.js)3
-rw-r--r--tools/gencolors.js78
-rw-r--r--tools/genlayout.js37
-rw-r--r--tools/layout.svg920
13 files changed, 3546 insertions, 1557 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..daa5c21
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,9 @@
+default: rules.js play.js
+rules.js: events.txt
+ sed '/const CODE /,$$d' < rules.js > /tmp/rules.js
+ node tools/gencode.js >> /tmp/rules.js
+ cp /tmp/rules.js rules.js
+play.js: tools/layout.svg
+ sed '/var LAYOUT /,$$d' < play.js > /tmp/play.js
+ node tools/genlayout.js >> /tmp/play.js
+ cp /tmp/play.js play.js
diff --git a/data.js b/data.js
index 17e7530..6c37c50 100644
--- a/data.js
+++ b/data.js
@@ -1,80 +1,1280 @@
-const spaces = [
- null,
- {name_unique: 'Schwerin', space_id: 1, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 111, y: 61}, adjacent: [2, 3, , , ]},
- {name_unique: 'Rostock', space_id: 2, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 228, y: 41}, adjacent: [1, 3, , , ]},
- {name_unique: 'Berlin', space_id: 3, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'East_Germany', region: 'Eastern Europe', box: {x: 251, y: 113}, adjacent: [1, 2, 5, 9, ]},
- {name_unique: 'German Writers', space_id: 4, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 58, y: 185}, adjacent: [5, , , , ]},
- {name_unique: 'Walter Ulbricht Academy', space_id: 5, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 175, y: 187}, adjacent: [3, 4, , , ]},
- {name_unique: 'Lutherian Church', space_id: 6, socio: 7, stability: 5, battleground: 1, demInfl: 1, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 300, y: 212}, adjacent: [9, , , , ]},
- {name_unique: 'Magdeburg', space_id: 7, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 58, y: 275}, adjacent: [8, 10, 11, , ]},
- {name_unique: 'Halle', space_id: 8, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 175, y: 278}, adjacent: [7, 9, 11, , ]},
- {name_unique: 'Leipzig', space_id: 9, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 297, y: 297}, adjacent: [3, 6, 8, 11, 12]},
- {name_unique: 'Erfurt', space_id: 10, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 23, y: 356}, adjacent: [7, , , , ]},
- {name_unique: 'Karl-Marx-Stadt', space_id: 11, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 138, y: 385}, adjacent: [7, 8, 9, 12, ]},
- {name_unique: 'Dresden', space_id: 12, socio: 1, stability: 4, battleground: 1, demInfl: 0, comInfl: 2, country: 'East_Germany', region: 'Eastern Europe', box: {x: 262, y: 375}, adjacent: [9, 11, 19, 27, ]},
- {name_unique: 'Szczecin', space_id: 13, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 434, y: 204}, adjacent: [14, 16, , , ]},
- {name_unique: 'Gdańsk', space_id: 14, socio: 4, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 699, y: 215}, adjacent: [13, 15, 16, 17, 18]},
- {name_unique: 'Bydgoszcz', space_id: 15, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 679, y: 304}, adjacent: [14, 17, , , ]},
- {name_unique: 'Poznań', space_id: 16, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 521, y: 355}, adjacent: [13, 14, 19, 20, ]},
- {name_unique: 'Warszawa', space_id: 17, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 806, y: 383}, adjacent: [14, 15, 18, 21, 24]},
- {name_unique: 'Białystok', space_id: 18, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 940, y: 342}, adjacent: [14, 17, 24, , ]},
- {name_unique: 'Wrocław', space_id: 19, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 462, y: 443}, adjacent: [12, 16, 20, 22, ]},
- {name_unique: 'Catholic Church, Poland', space_id: 20, socio: 7, stability: 5, battleground: 0, demInfl: 5, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 625, y: 437}, adjacent: [16, 19, 21, 22, 23]},
- {name_unique: 'Łódź', space_id: 21, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 749, y: 486}, adjacent: [17, 20, 23, 24, ]},
- {name_unique: 'Katowice', space_id: 22, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 570, y: 569}, adjacent: [19, 20, 23, 33, ]},
- {name_unique: 'Kraków', space_id: 23, socio: 4, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 711, y: 598}, adjacent: [20, 21, 22, 25, ]},
- {name_unique: 'Lublin', space_id: 24, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 879, y: 603}, adjacent: [17, 18, 21, , ]},
- {name_unique: 'Jagiellian University', space_id: 25, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 679, y: 681}, adjacent: [23, 26, , , ]},
- {name_unique: 'Polish Writers', space_id: 26, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 832, y: 694}, adjacent: [25, , , , ]},
- {name_unique: 'Plzeň', space_id: 27, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 2, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 159, y: 483}, adjacent: [12, 28, 29, , ]},
- {name_unique: 'České Budĕjovice', space_id: 28, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 196, y: 601}, adjacent: [27, 29, , , ]},
- {name_unique: 'Praha', space_id: 29, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 317, y: 614}, adjacent: [27, 28, 30, 32, ]},
- {name_unique: 'Charles University', space_id: 30, socio: 6, stability: 1, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 380, y: 532}, adjacent: [29, 31, , , ]},
- {name_unique: 'Czech Writers', space_id: 31, socio: 5, stability: 2, battleground: 1, demInfl: 2, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 444, y: 607}, adjacent: [30, , , , ]},
- {name_unique: 'Brno', space_id: 32, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 1, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 403, y: 711}, adjacent: [29, 33, 34, , ]},
- {name_unique: 'Ostrava', space_id: 33, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 523, y: 681}, adjacent: [22, 32, 34, 35, ]},
- {name_unique: 'Bratislava', space_id: 34, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 417, y: 797}, adjacent: [32, 33, 35, , ]},
- {name_unique: 'Catholic Church, Czechoslovakia', space_id: 35, socio: 7, stability: 5, battleground: 0, demInfl: 1, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 538, y: 794}, adjacent: [33, 34, 36, , ]},
- {name_unique: 'Prešov', space_id: 36, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 658, y: 794}, adjacent: [35, 37, , , ]},
- {name_unique: 'Košice', space_id: 37, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 777, y: 815}, adjacent: [36, 42, , , ]},
- {name_unique: 'Catholic Church, Hungary', space_id: 38, socio: 7, stability: 5, battleground: 0, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 314, y: 886}, adjacent: [39, 43, , , ]},
- {name_unique: 'Győr', space_id: 39, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 434, y: 887}, adjacent: [38, 40, 43, 44, ]},
- {name_unique: 'Tatabánya', space_id: 40, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 549, y: 886}, adjacent: [39, 41, 45, , ]},
- {name_unique: 'Miskolc', space_id: 41, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 664, y: 901}, adjacent: [40, 42, 45, , ]},
- {name_unique: 'Debrecen', space_id: 42, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 781, y: 938}, adjacent: [37, 41, , , ]},
- {name_unique: 'Szombathely', space_id: 43, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Hungary', region: 'Eastern Europe', box: {x: 316, y: 963}, adjacent: [38, 39, 44, , ]},
- {name_unique: 'Székesfehérvár', space_id: 44, socio: 4, stability: 3, battleground: 0, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 442, y: 962}, adjacent: [39, 43, 45, , ]},
- {name_unique: 'Budapest', space_id: 45, socio: 2, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 630, y: 983}, adjacent: [40, 41, 44, 47, 48]},
- {name_unique: 'Hungarian Writers', space_id: 46, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 348, y: 1040}, adjacent: [47, , , , ]},
- {name_unique: 'Eötvös Loránd University', space_id: 47, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 512, y: 1034}, adjacent: [46, 45, , , ]},
- {name_unique: 'Szeged', space_id: 48, socio: 3, stability: 4, battleground: 1, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 632, y: 1073}, adjacent: [45, 49, 50, , ]},
- {name_unique: 'Pécs', space_id: 49, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 486, y: 1105}, adjacent: [48, , , , ]},
- {name_unique: 'Timişoara', space_id: 50, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 597, y: 1204}, adjacent: [48, 51, 60, , ]},
- {name_unique: 'Cluj-Napoca', space_id: 51, socio: 1, stability: 4, battleground: 1, demInfl: 0, comInfl: 2, country: 'Romania', region: 'Balkans', box: {x: 756, y: 1125}, adjacent: [50, 54, 58, 61, ]},
- {name_unique: 'Târgu Mureş', space_id: 52, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 915, y: 1136}, adjacent: [53, 56, , , ]},
- {name_unique: 'Iaşi', space_id: 53, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1072, y: 1097}, adjacent: [52, 57, 62, , ]},
- {name_unique: 'Babeş-Bolyai University', space_id: 54, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 746, y: 1203}, adjacent: [51, 55, , , ]},
- {name_unique: 'Romanian Writers', space_id: 55, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 739, y: 1278}, adjacent: [54, , , , ]},
- {name_unique: 'Hargita/Covasna', space_id: 56, socio: 8, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 928, y: 1227}, adjacent: [52, , , , ]},
- {name_unique: 'Braşov', space_id: 57, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1049, y: 1225}, adjacent: [53, 59, 61, , ]},
- {name_unique: 'Orthodox Church Romania', space_id: 58, socio: 7, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 855, y: 1338}, adjacent: [51, 60, , , ]},
- {name_unique: 'Ploieşti', space_id: 59, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1061, y: 1316}, adjacent: [57, 61, 62, , ]},
- {name_unique: 'Craiova', space_id: 60, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 763, y: 1411}, adjacent: [50, 58, 61, , ]},
- {name_unique: 'Bucureşti', space_id: 61, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Romania', region: 'Balkans', box: {x: 929, y: 1445}, adjacent: [51, 57, 59, 60, 63]},
- {name_unique: 'Galaţi', space_id: 62, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1104, y: 1399}, adjacent: [53, 59, 63, , ]},
- {name_unique: 'Constanţa', space_id: 63, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1130, y: 1517}, adjacent: [61, 62, 72, , ]},
- {name_unique: 'Pleven', space_id: 64, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 764, y: 1534}, adjacent: [68, , , , ]},
- {name_unique: 'Orthodox Church Bulgaria', space_id: 65, socio: 7, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 882, y: 1540}, adjacent: [66, 68, , , ]},
- {name_unique: 'Ruse', space_id: 66, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 998, y: 1540}, adjacent: [65, 69, 70, 71, 72]},
- {name_unique: 'Sofia University', space_id: 67, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 645, y: 1650}, adjacent: [68, 73, , , ]},
- {name_unique: 'Sofia', space_id: 68, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Bulgaria', region: 'Balkans', box: {x: 768, y: 1653}, adjacent: [64, 65, 67, 69, 74]},
- {name_unique: 'Stara Zagora', space_id: 69, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Bulgaria', region: 'Balkans', box: {x: 886, y: 1694}, adjacent: [66, 68, 71, , ]},
- {name_unique: 'Razgrad', space_id: 70, socio: 8, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 954, y: 1620}, adjacent: [66, , , , ]},
- {name_unique: 'Burgas', space_id: 71, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 1004, y: 1695}, adjacent: [66, 69, 72, , ]},
- {name_unique: 'Varna', space_id: 72, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 1086, y: 1613}, adjacent: [63, 66, 71, , ]},
- {name_unique: 'Bulgarian Writers', space_id: 73, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 652, y: 1726}, adjacent: [67, , , , ]},
- {name_unique: 'Plovdiv', space_id: 74, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 771, y: 1739}, adjacent: [68, 75, , , ]},
- {name_unique: 'Sliven', space_id: 75, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 894, y: 1768}, adjacent: [74, , , , ]}
+const spaces = [
+ null,
+ {
+ name_unique: "Schwerin",
+ space_id: 1,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 111,
+ y: 61,
+ },
+ adjacent: [ 2, 3 ],
+ ascii_name: "Schwerin",
+ },
+ {
+ name_unique: "Rostock",
+ space_id: 2,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 228,
+ y: 41,
+ },
+ adjacent: [ 1, 3 ],
+ ascii_name: "Rostock",
+ },
+ {
+ name_unique: "Berlin",
+ space_id: 3,
+ socio: 2,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 2,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 251,
+ y: 113,
+ },
+ adjacent: [ 1, 2, 5, 9 ],
+ ascii_name: "Berlin",
+ },
+ {
+ name_unique: "German Writers",
+ space_id: 4,
+ socio: 5,
+ stability: 2,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 58,
+ y: 185,
+ },
+ adjacent: [ 5 ],
+ ascii_name: "German Writers",
+ },
+ {
+ name_unique: "Walter Ulbricht Academy",
+ space_id: 5,
+ socio: 6,
+ stability: 1,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 175,
+ y: 187,
+ },
+ adjacent: [ 3, 4 ],
+ ascii_name: "Walter Ulbricht Academy",
+ },
+ {
+ name_unique: "Lutheran Church",
+ space_id: 6,
+ socio: 7,
+ stability: 5,
+ battleground: 1,
+ demInfl: 1,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 300,
+ y: 212,
+ },
+ adjacent: [ 9 ],
+ ascii_name: "Lutheran Church",
+ },
+ {
+ name_unique: "Magdeburg",
+ space_id: 7,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 58,
+ y: 275,
+ },
+ adjacent: [ 8, 10, 11 ],
+ ascii_name: "Magdeburg",
+ },
+ {
+ name_unique: "Halle",
+ space_id: 8,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 175,
+ y: 278,
+ },
+ adjacent: [ 7, 9, 11 ],
+ ascii_name: "Halle",
+ },
+ {
+ name_unique: "Leipzig",
+ space_id: 9,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 297,
+ y: 297,
+ },
+ adjacent: [ 3, 6, 8, 11, 12 ],
+ ascii_name: "Leipzig",
+ },
+ {
+ name_unique: "Erfurt",
+ space_id: 10,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 23,
+ y: 356,
+ },
+ adjacent: [ 7 ],
+ ascii_name: "Erfurt",
+ },
+ {
+ name_unique: "Karl-Marx-Stadt",
+ space_id: 11,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 138,
+ y: 385,
+ },
+ adjacent: [ 7, 8, 9, 12 ],
+ ascii_name: "Karl-Marx-Stadt",
+ },
+ {
+ name_unique: "Dresden",
+ space_id: 12,
+ socio: 1,
+ stability: 4,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 2,
+ country: "East_Germany",
+ region: "Eastern Europe",
+ box: {
+ x: 262,
+ y: 375,
+ },
+ adjacent: [ 9, 11, 19, 27 ],
+ ascii_name: "Dresden",
+ },
+ {
+ name_unique: "Szczecin",
+ space_id: 13,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 434,
+ y: 204,
+ },
+ adjacent: [ 14, 16 ],
+ ascii_name: "Szczecin",
+ },
+ {
+ name_unique: "Gdańsk",
+ space_id: 14,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 1,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 699,
+ y: 215,
+ },
+ adjacent: [ 13, 15, 16, 17, 18 ],
+ ascii_name: "Gdansk",
+ },
+ {
+ name_unique: "Bydgoszcz",
+ space_id: 15,
+ socio: 1,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 1,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 679,
+ y: 304,
+ },
+ adjacent: [ 14, 17 ],
+ ascii_name: "Bydgoszcz",
+ },
+ {
+ name_unique: "Poznań",
+ space_id: 16,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 521,
+ y: 355,
+ },
+ adjacent: [ 13, 14, 19, 20 ],
+ ascii_name: "Poznan",
+ },
+ {
+ name_unique: "Warszawa",
+ space_id: 17,
+ socio: 2,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 1,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 806,
+ y: 383,
+ },
+ adjacent: [ 14, 15, 18, 21, 24 ],
+ ascii_name: "Warszawa",
+ },
+ {
+ name_unique: "Białystok",
+ space_id: 18,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 940,
+ y: 342,
+ },
+ adjacent: [ 14, 17, 24 ],
+ ascii_name: "Bialystok",
+ },
+ {
+ name_unique: "Wrocław",
+ space_id: 19,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 462,
+ y: 443,
+ },
+ adjacent: [ 12, 16, 20, 22 ],
+ ascii_name: "Wroclaw",
+ },
+ {
+ name_unique: "Catholic Church, Poland",
+ space_id: 20,
+ socio: 7,
+ stability: 5,
+ battleground: 0,
+ demInfl: 5,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 625,
+ y: 437,
+ },
+ adjacent: [ 16, 19, 21, 22, 23 ],
+ ascii_name: "Catholic Church, Poland",
+ },
+ {
+ name_unique: "Łódź",
+ space_id: 21,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 749,
+ y: 486,
+ },
+ adjacent: [ 17, 20, 23, 24 ],
+ ascii_name: "Lodz",
+ },
+ {
+ name_unique: "Katowice",
+ space_id: 22,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 570,
+ y: 569,
+ },
+ adjacent: [ 19, 20, 23, 33 ],
+ ascii_name: "Katowice",
+ },
+ {
+ name_unique: "Kraków",
+ space_id: 23,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 1,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 711,
+ y: 598,
+ },
+ adjacent: [ 20, 21, 22, 25 ],
+ ascii_name: "Krakow",
+ },
+ {
+ name_unique: "Lublin",
+ space_id: 24,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 1,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 879,
+ y: 603,
+ },
+ adjacent: [ 17, 18, 21 ],
+ ascii_name: "Lublin",
+ },
+ {
+ name_unique: "Jagiellonian University",
+ space_id: 25,
+ socio: 6,
+ stability: 1,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 679,
+ y: 681,
+ },
+ adjacent: [ 23, 26 ],
+ ascii_name: "Jagiellonian University",
+ },
+ {
+ name_unique: "Polish Writers",
+ space_id: 26,
+ socio: 5,
+ stability: 2,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Poland",
+ region: "Eastern Europe",
+ box: {
+ x: 832,
+ y: 694,
+ },
+ adjacent: [ 25 ],
+ ascii_name: "Polish Writers",
+ },
+ {
+ name_unique: "Plzeň",
+ space_id: 27,
+ socio: 1,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 2,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 159,
+ y: 483,
+ },
+ adjacent: [ 12, 28, 29 ],
+ ascii_name: "Plzen",
+ },
+ {
+ name_unique: "České Budĕjovice",
+ space_id: 28,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 196,
+ y: 601,
+ },
+ adjacent: [ 27, 29 ],
+ ascii_name: "Ceske Budejovice",
+ },
+ {
+ name_unique: "Praha",
+ space_id: 29,
+ socio: 2,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 2,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 317,
+ y: 614,
+ },
+ adjacent: [ 27, 28, 30, 32 ],
+ ascii_name: "Praha",
+ },
+ {
+ name_unique: "Charles University",
+ space_id: 30,
+ socio: 6,
+ stability: 1,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 380,
+ y: 532,
+ },
+ adjacent: [ 29, 31 ],
+ ascii_name: "Charles University",
+ },
+ {
+ name_unique: "Czech Writers",
+ space_id: 31,
+ socio: 5,
+ stability: 2,
+ battleground: 1,
+ demInfl: 2,
+ comInfl: 0,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 444,
+ y: 607,
+ },
+ adjacent: [ 30 ],
+ ascii_name: "Czech Writers",
+ },
+ {
+ name_unique: "Brno",
+ space_id: 32,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 1,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 403,
+ y: 711,
+ },
+ adjacent: [ 29, 33, 34 ],
+ ascii_name: "Brno",
+ },
+ {
+ name_unique: "Ostrava",
+ space_id: 33,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 523,
+ y: 681,
+ },
+ adjacent: [ 22, 32, 34, 35 ],
+ ascii_name: "Ostrava",
+ },
+ {
+ name_unique: "Bratislava",
+ space_id: 34,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 417,
+ y: 797,
+ },
+ adjacent: [ 32, 33, 35 ],
+ ascii_name: "Bratislava",
+ },
+ {
+ name_unique: "Catholic Church, Czechoslovakia",
+ space_id: 35,
+ socio: 7,
+ stability: 5,
+ battleground: 0,
+ demInfl: 1,
+ comInfl: 0,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 538,
+ y: 794,
+ },
+ adjacent: [ 33, 34, 36 ],
+ ascii_name: "Catholic Church, Czechoslovakia",
+ },
+ {
+ name_unique: "Prešov",
+ space_id: 36,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 658,
+ y: 794,
+ },
+ adjacent: [ 35, 37 ],
+ ascii_name: "Presov",
+ },
+ {
+ name_unique: "Košice",
+ space_id: 37,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Czechoslovakia",
+ region: "Eastern Europe",
+ box: {
+ x: 777,
+ y: 815,
+ },
+ adjacent: [ 36, 42 ],
+ ascii_name: "Kosice",
+ },
+ {
+ name_unique: "Catholic Church, Hungary",
+ space_id: 38,
+ socio: 7,
+ stability: 5,
+ battleground: 0,
+ demInfl: 1,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 314,
+ y: 886,
+ },
+ adjacent: [ 39, 43 ],
+ ascii_name: "Catholic Church, Hungary",
+ },
+ {
+ name_unique: "Győr",
+ space_id: 39,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 434,
+ y: 887,
+ },
+ adjacent: [ 38, 40, 43, 44 ],
+ ascii_name: "Gyor",
+ },
+ {
+ name_unique: "Tatabánya",
+ space_id: 40,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 549,
+ y: 886,
+ },
+ adjacent: [ 39, 41, 45 ],
+ ascii_name: "Tatabanya",
+ },
+ {
+ name_unique: "Miskolc",
+ space_id: 41,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 664,
+ y: 901,
+ },
+ adjacent: [ 40, 42, 45 ],
+ ascii_name: "Miskolc",
+ },
+ {
+ name_unique: "Debrecen",
+ space_id: 42,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 781,
+ y: 938,
+ },
+ adjacent: [ 37, 41 ],
+ ascii_name: "Debrecen",
+ },
+ {
+ name_unique: "Szombathely",
+ space_id: 43,
+ socio: 1,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 1,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 316,
+ y: 963,
+ },
+ adjacent: [ 38, 39, 44 ],
+ ascii_name: "Szombathely",
+ },
+ {
+ name_unique: "Székesfehérvár",
+ space_id: 44,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 1,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 442,
+ y: 962,
+ },
+ adjacent: [ 39, 43, 45 ],
+ ascii_name: "Szekesfehervar",
+ },
+ {
+ name_unique: "Budapest",
+ space_id: 45,
+ socio: 2,
+ stability: 3,
+ battleground: 1,
+ demInfl: 1,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 630,
+ y: 983,
+ },
+ adjacent: [ 40, 41, 44, 47, 48 ],
+ ascii_name: "Budapest",
+ },
+ {
+ name_unique: "Hungarian Writers",
+ space_id: 46,
+ socio: 5,
+ stability: 2,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 348,
+ y: 1040,
+ },
+ adjacent: [ 47 ],
+ ascii_name: "Hungarian Writers",
+ },
+ {
+ name_unique: "Eötvös Loránd University",
+ space_id: 47,
+ socio: 6,
+ stability: 1,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 512,
+ y: 1034,
+ },
+ adjacent: [ 46, 45 ],
+ ascii_name: "Eotvos Lorand University",
+ },
+ {
+ name_unique: "Szeged",
+ space_id: 48,
+ socio: 3,
+ stability: 4,
+ battleground: 1,
+ demInfl: 1,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 632,
+ y: 1073,
+ },
+ adjacent: [ 45, 49, 50 ],
+ ascii_name: "Szeged",
+ },
+ {
+ name_unique: "Pécs",
+ space_id: 49,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Hungary",
+ region: "Eastern Europe",
+ box: {
+ x: 486,
+ y: 1105,
+ },
+ adjacent: [ 48 ],
+ ascii_name: "Pecs",
+ },
+ {
+ name_unique: "Timişoara",
+ space_id: 50,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 597,
+ y: 1204,
+ },
+ adjacent: [ 48, 51, 60 ],
+ ascii_name: "Timisoara",
+ },
+ {
+ name_unique: "Cluj-Napoca",
+ space_id: 51,
+ socio: 1,
+ stability: 4,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 2,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 756,
+ y: 1125,
+ },
+ adjacent: [ 50, 54, 58, 61 ],
+ ascii_name: "Cluj-Napoca",
+ },
+ {
+ name_unique: "Târgu Mureş",
+ space_id: 52,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 915,
+ y: 1136,
+ },
+ adjacent: [ 53, 56 ],
+ ascii_name: "Targu Mures",
+ },
+ {
+ name_unique: "Iaşi",
+ space_id: 53,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 1072,
+ y: 1097,
+ },
+ adjacent: [ 52, 57, 62 ],
+ ascii_name: "Iasi",
+ },
+ {
+ name_unique: "Babeş-Bolyai University",
+ space_id: 54,
+ socio: 6,
+ stability: 1,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 746,
+ y: 1203,
+ },
+ adjacent: [ 51, 55 ],
+ ascii_name: "Babes-Bolyai University",
+ },
+ {
+ name_unique: "Romanian Writers",
+ space_id: 55,
+ socio: 5,
+ stability: 2,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 739,
+ y: 1278,
+ },
+ adjacent: [ 54 ],
+ ascii_name: "Romanian Writers",
+ },
+ {
+ name_unique: "Harghita/Covasna",
+ space_id: 56,
+ socio: 8,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 928,
+ y: 1227,
+ },
+ adjacent: [ 52 ],
+ ascii_name: "Harghita/Covasna",
+ },
+ {
+ name_unique: "Braşov",
+ space_id: 57,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 1049,
+ y: 1225,
+ },
+ adjacent: [ 53, 59, 61 ],
+ ascii_name: "Brasov",
+ },
+ {
+ name_unique: "Orthodox Church, Romania",
+ space_id: 58,
+ socio: 7,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 855,
+ y: 1338,
+ },
+ adjacent: [ 51, 60 ],
+ ascii_name: "Orthodox Church, Romania",
+ },
+ {
+ name_unique: "Ploieşti",
+ space_id: 59,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 1061,
+ y: 1316,
+ },
+ adjacent: [ 57, 61, 62 ],
+ ascii_name: "Ploiesti",
+ },
+ {
+ name_unique: "Craiova",
+ space_id: 60,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 763,
+ y: 1411,
+ },
+ adjacent: [ 50, 58, 61 ],
+ ascii_name: "Craiova",
+ },
+ {
+ name_unique: "Bucureşti",
+ space_id: 61,
+ socio: 2,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 2,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 929,
+ y: 1445,
+ },
+ adjacent: [ 51, 57, 59, 60, 63 ],
+ ascii_name: "Bucuresti",
+ },
+ {
+ name_unique: "Galaţi",
+ space_id: 62,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 1104,
+ y: 1399,
+ },
+ adjacent: [ 53, 59, 63 ],
+ ascii_name: "Galati",
+ },
+ {
+ name_unique: "Constanţa",
+ space_id: 63,
+ socio: 4,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Romania",
+ region: "Balkans",
+ box: {
+ x: 1130,
+ y: 1517,
+ },
+ adjacent: [ 61, 62, 72 ],
+ ascii_name: "Constanta",
+ },
+ {
+ name_unique: "Pleven",
+ space_id: 64,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 764,
+ y: 1534,
+ },
+ adjacent: [ 68 ],
+ ascii_name: "Pleven",
+ },
+ {
+ name_unique: "Orthodox Church, Bulgaria",
+ space_id: 65,
+ socio: 7,
+ stability: 3,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 882,
+ y: 1540,
+ },
+ adjacent: [ 66, 68 ],
+ ascii_name: "Orthodox Church, Bulgaria",
+ },
+ {
+ name_unique: "Ruse",
+ space_id: 66,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 998,
+ y: 1540,
+ },
+ adjacent: [ 65, 69, 70, 71, 72 ],
+ ascii_name: "Ruse",
+ },
+ {
+ name_unique: "Sofia University",
+ space_id: 67,
+ socio: 6,
+ stability: 1,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 645,
+ y: 1650,
+ },
+ adjacent: [ 68, 73 ],
+ ascii_name: "Sofia University",
+ },
+ {
+ name_unique: "Sofia",
+ space_id: 68,
+ socio: 2,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 2,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 768,
+ y: 1653,
+ },
+ adjacent: [ 64, 65, 67, 69, 74 ],
+ ascii_name: "Sofia",
+ },
+ {
+ name_unique: "Stara Zagora",
+ space_id: 69,
+ socio: 1,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 1,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 886,
+ y: 1694,
+ },
+ adjacent: [ 66, 68, 71 ],
+ ascii_name: "Stara Zagora",
+ },
+ {
+ name_unique: "Razgrad",
+ space_id: 70,
+ socio: 8,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 954,
+ y: 1620,
+ },
+ adjacent: [ 66 ],
+ ascii_name: "Razgrad",
+ },
+ {
+ name_unique: "Burgas",
+ space_id: 71,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 1004,
+ y: 1695,
+ },
+ adjacent: [ 66, 69, 72 ],
+ ascii_name: "Burgas",
+ },
+ {
+ name_unique: "Varna",
+ space_id: 72,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 1086,
+ y: 1613,
+ },
+ adjacent: [ 63, 66, 71 ],
+ ascii_name: "Varna",
+ },
+ {
+ name_unique: "Bulgarian Writers",
+ space_id: 73,
+ socio: 5,
+ stability: 2,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 652,
+ y: 1726,
+ },
+ adjacent: [ 67 ],
+ ascii_name: "Bulgarian Writers",
+ },
+ {
+ name_unique: "Plovdiv",
+ space_id: 74,
+ socio: 4,
+ stability: 3,
+ battleground: 1,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 771,
+ y: 1739,
+ },
+ adjacent: [ 68, 75 ],
+ ascii_name: "Plovdiv",
+ },
+ {
+ name_unique: "Sliven",
+ space_id: 75,
+ socio: 3,
+ stability: 4,
+ battleground: 0,
+ demInfl: 0,
+ comInfl: 0,
+ country: "Bulgaria",
+ region: "Balkans",
+ box: {
+ x: 894,
+ y: 1768,
+ },
+ adjacent: [ 74 ],
+ ascii_name: "Sliven",
+ },
]
const cards = [
@@ -249,5 +1449,4 @@ null,
{number: 54, name: 'Petition', value: 3, socio: 0, url: 'ps10'},
]
-
if (typeof module !== 'undefined') module.exports = { spaces, cards, power_cards }
diff --git a/images/trash-can.svg b/images/trash-can.svg
new file mode 100644
index 0000000..7b8da5a
--- /dev/null
+++ b/images/trash-can.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 512 512"><path stroke-width="1.18459" d="M188.479 28.56v59.229H96.08v35.537h319.838V87.79h-92.398v-59.23ZM209.8 49.881H302.2v37.907H209.8zm-93.585 94.767L151.88 483.44h208.243l35.66-338.792zm73.845 15.85.758 10.637 18.954 265.348.761 10.632-21.27 1.52-.758-10.637-18.954-265.348-.761-10.633zm131.878 0 21.27 1.52-.763 10.635L323.493 438l-.758 10.638-21.27-1.521.761-10.634 18.954-265.348.758-10.637zm-76.6.734h21.322v286.67H245.34z"/></svg>
diff --git a/info/cards.html b/info/cards.html
new file mode 100644
index 0000000..479867d
--- /dev/null
+++ b/info/cards.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<html>
+<meta name="viewport" content="width=600">
+<title>1989 - Cards</title>
+<style>
+body {
+ background-color: slategray;
+}
+.list {
+ margin: 20px;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 20px;
+}
+img {
+ border-radius: 16px;
+ box-shadow: 0 0 0 1px #444, 1px 2px 4px #0004;
+}
+</style>
+<body>
+
+<div class="list">
+<img src="../cards100/event_back.webp">
+<img src="../cards100/event_1.webp">
+<img src="../cards100/event_2.webp">
+<img src="../cards100/event_3.webp">
+<img src="../cards100/event_4.webp">
+<img src="../cards100/event_5.webp">
+<img src="../cards100/event_6.webp">
+<img src="../cards100/event_7.webp">
+<img src="../cards100/event_8.webp">
+<img src="../cards100/event_9.webp">
+<img src="../cards100/event_10.webp">
+<img src="../cards100/event_11.webp">
+<img src="../cards100/event_12.webp">
+<img src="../cards100/event_13.webp">
+<img src="../cards100/event_14.webp">
+<img src="../cards100/event_15.webp">
+<img src="../cards100/event_16.webp">
+<img src="../cards100/event_17.webp">
+<img src="../cards100/event_18.webp">
+<img src="../cards100/event_19.webp">
+<img src="../cards100/event_20.webp">
+<img src="../cards100/event_21.webp">
+<img src="../cards100/event_22.webp">
+<img src="../cards100/event_23.webp">
+<img src="../cards100/event_24.webp">
+<img src="../cards100/event_25.webp">
+<img src="../cards100/event_26.webp">
+<img src="../cards100/event_27.webp">
+<img src="../cards100/event_28.webp">
+<img src="../cards100/event_29.webp">
+<img src="../cards100/event_30.webp">
+<img src="../cards100/event_31.webp">
+<img src="../cards100/event_32.webp">
+<img src="../cards100/event_33.webp">
+<img src="../cards100/event_34.webp">
+<img src="../cards100/event_35.webp">
+<img src="../cards100/event_36.webp">
+<img src="../cards100/event_37.webp">
+<img src="../cards100/event_38.webp">
+<img src="../cards100/event_39.webp">
+<img src="../cards100/event_40.webp">
+<img src="../cards100/event_41.webp">
+<img src="../cards100/event_42.webp">
+<img src="../cards100/event_43.webp">
+<img src="../cards100/event_44.webp">
+<img src="../cards100/event_45.webp">
+<img src="../cards100/event_46.webp">
+<img src="../cards100/event_47.webp">
+<img src="../cards100/event_48.webp">
+<img src="../cards100/event_49.webp">
+<img src="../cards100/event_50.webp">
+<img src="../cards100/event_51.webp">
+<img src="../cards100/event_52.webp">
+<img src="../cards100/event_53.webp">
+<img src="../cards100/event_54.webp">
+<img src="../cards100/event_55.webp">
+<img src="../cards100/event_56.webp">
+<img src="../cards100/event_57.webp">
+<img src="../cards100/event_58.webp">
+<img src="../cards100/event_59.webp">
+<img src="../cards100/event_60.webp">
+<img src="../cards100/event_61.webp">
+<img src="../cards100/event_62.webp">
+<img src="../cards100/event_63.webp">
+<img src="../cards100/event_64.webp">
+<img src="../cards100/event_65.webp">
+<img src="../cards100/event_66.webp">
+<img src="../cards100/event_67.webp">
+<img src="../cards100/event_68.webp">
+<img src="../cards100/event_69.webp">
+<img src="../cards100/event_70.webp">
+<img src="../cards100/event_71.webp">
+<img src="../cards100/event_72.webp">
+<img src="../cards100/event_73.webp">
+<img src="../cards100/event_74.webp">
+<img src="../cards100/event_75.webp">
+<img src="../cards100/event_76.webp">
+<img src="../cards100/event_77.webp">
+<img src="../cards100/event_78.webp">
+<img src="../cards100/event_79.webp">
+<img src="../cards100/event_80.webp">
+<img src="../cards100/event_81.webp">
+<img src="../cards100/event_82.webp">
+<img src="../cards100/event_83.webp">
+<img src="../cards100/event_84.webp">
+<img src="../cards100/event_85.webp">
+<img src="../cards100/event_86.webp">
+<img src="../cards100/event_87.webp">
+<img src="../cards100/event_88.webp">
+<img src="../cards100/event_89.webp">
+<img src="../cards100/event_90.webp">
+<img src="../cards100/event_91.webp">
+<img src="../cards100/event_92.webp">
+<img src="../cards100/event_93.webp">
+<img src="../cards100/event_94.webp">
+<img src="../cards100/event_95.webp">
+<img src="../cards100/event_96.webp">
+<img src="../cards100/event_97.webp">
+<img src="../cards100/event_98.webp">
+<img src="../cards100/event_99.webp">
+<img src="../cards100/event_100.webp">
+<img src="../cards100/event_101.webp">
+<img src="../cards100/event_102.webp">
+<img src="../cards100/event_103.webp">
+<img src="../cards100/event_104.webp">
+<img src="../cards100/event_105.webp">
+<img src="../cards100/event_106.webp">
+<img src="../cards100/event_107.webp">
+<img src="../cards100/event_108.webp">
+<img src="../cards100/event_109.webp">
+<img src="../cards100/event_110.webp">
+</div>
+
+<div class="list">
+<img src="../cards100/power_back.webp">
+<img src="../cards100/power_1.webp">
+<img src="../cards100/power_2.webp">
+<img src="../cards100/power_3.webp">
+<img src="../cards100/power_4.webp">
+<img src="../cards100/power_5.webp">
+<img src="../cards100/power_6.webp">
+<img src="../cards100/power_7.webp">
+<img src="../cards100/power_8.webp">
+<img src="../cards100/power_9.webp">
+<img src="../cards100/power_10.webp">
+<img src="../cards100/power_11.webp">
+<img src="../cards100/power_12.webp">
+<img src="../cards100/power_13.webp">
+<img src="../cards100/power_14.webp">
+<img src="../cards100/power_15.webp">
+<img src="../cards100/power_16.webp">
+<img src="../cards100/power_17.webp">
+<img src="../cards100/power_18.webp">
+<img src="../cards100/power_19.webp">
+<img src="../cards100/power_20.webp">
+<img src="../cards100/power_21.webp">
+<img src="../cards100/power_22.webp">
+<img src="../cards100/power_23.webp">
+<img src="../cards100/power_24.webp">
+<img src="../cards100/power_25.webp">
+<img src="../cards100/power_26.webp">
+<img src="../cards100/power_27.webp">
+<img src="../cards100/power_28.webp">
+<img src="../cards100/power_29.webp">
+<img src="../cards100/power_30.webp">
+<img src="../cards100/power_31.webp">
+<img src="../cards100/power_32.webp">
+<img src="../cards100/power_33.webp">
+<img src="../cards100/power_34.webp">
+<img src="../cards100/power_35.webp">
+<img src="../cards100/power_36.webp">
+<img src="../cards100/power_37.webp">
+<img src="../cards100/power_38.webp">
+<img src="../cards100/power_39.webp">
+<img src="../cards100/power_40.webp">
+<img src="../cards100/power_41.webp">
+<img src="../cards100/power_42.webp">
+<img src="../cards100/power_43.webp">
+<img src="../cards100/power_44.webp">
+<img src="../cards100/power_45.webp">
+<img src="../cards100/power_46.webp">
+<img src="../cards100/power_47.webp">
+<img src="../cards100/power_48.webp">
+<img src="../cards100/power_49.webp">
+<img src="../cards100/power_50.webp">
+<img src="../cards100/power_51.webp">
+<img src="../cards100/power_52.webp">
+</div>
+
+</body>
diff --git a/play.css b/play.css
index 2a65885..3b49c7b 100644
--- a/play.css
+++ b/play.css
@@ -1,46 +1,14 @@
-main { background-color: dimgray; }
-header { background-color: silver; }
-header.your_turn { background-color: orange; }
-#role_Democrat { background-color: hsl(200, 80%, 80%); }
-#role_Communist { background-color: hsl(0, 80%, 80%); }
-#turn_info { background-color: white; }
-/*.aside_events {
- font-family: "Source Sans";
- font-style: normal;
- font-size: 16px;
- line-height: 1.5;
-}*/
-#deck_data {
- font-family: "Source Sans";
- font-style: normal;
- font-size: 16px;
- line-height: 1.5;
-}
-#deck_stat {padding-left: 5px; padding-bottom: 5px;}
-
+main { background-color: slategray; }
-#log { background-color: whitesmoke; }
-#log .h1 { font-weight: bold; padding-top:2px; padding-bottom:2px; text-align: center; }
-#log .h2 { padding-top:2px; padding-bottom:2px; text-align: center; }
-#log .h3 { text-align: center; }
-#log .h4 { text-decoration: underline; }
-#log .h5 { text-decoration: underline; }
+body.Democrat header.your_turn { background-color: hsl(206, 85%, 75%); }
+body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); }
-#log .h2 { background-color: hsl(0,0%,80%);}
-#log .h1 { background-color: hsl(0,0%,80%); }
-#log .h2.dem { background-color: hsl(200, 80%, 80%); }
-#log .h2.com { background-color: hsl(0, 80%, 80%); }
-#log .h3.democrat { background-color: hsl(210,30%,90%); }
-#log .h3.h2.communist { background-color: hsl(35,40%,90%); }
+#role_Democrat { background-color: hsl(206, 80%, 80%); }
+#role_Communist { background-color: hsl(355, 70%, 80%); }
-#log div { padding-left: 20px; text-indent: -12px; }
-#log div.i { padding-left: 32px; text-indent: -12px; }
-#log div.ii { padding-left: 44px; text-indent: -12px; }
+/* LOG */
-
-#log .card_name { font-style: italic; }
-#log .card_name:hover { text-decoration: underline; }
-#log .space_tip:hover { cursor: pointer; text-decoration: underline; }
+#log { font-variant-numeric: tabular-nums; }
#log .die {
display: inline-block;
@@ -62,555 +30,212 @@ header.your_turn { background-color: orange; }
#log .d5 { background-position: 80% 0; }
#log .d6 { background-position: 100% 0; }
-.selected {
- cursor: pointer;
-}
+#log .h1 { font-weight: bold; padding-top:2px; padding-bottom:2px; text-align: center; }
+#log .h2 { padding-top:2px; padding-bottom:2px; text-align: center; }
+#log .h3 { text-align: center; }
+#log .h4 { text-decoration: underline; }
+#log .h5 { text-decoration: underline; }
-#log {
- font-variant-numeric: tabular-nums;
-}
+#log { background-color: floralwhite }
+#log .h1 { background-color: tan }
+#log .h2 { background-color: wheat }
+#log .h2.dem { background-color: hsl(206, 85%, 80%); }
+#log .h2.com { background-color: hsl(355, 70%, 80%); }
-/* TOOLBAR */
+#log div { padding-left: 20px; text-indent: -12px; }
+#log div.i { padding-left: 32px; text-indent: -12px; }
+#log div.ii { padding-left: 44px; text-indent: -12px; }
-#toolbar {
- justify-content: space-evenly;
-}
+#log .card_name { font-style: italic; }
+#log .card_name:hover { text-decoration: underline; }
+#log .space_tip:hover { cursor: pointer; text-decoration: underline; }
-#prompt {
- display: flex;
- margin-left: auto;
-}
+/* MAP */
-#button {
- display: flex;
- margin-left: auto;
+#mapwrap {
+ width: 1650px;
+ height: 2550px;
}
-/* MAP */
#map {
- margin: 0 auto ;
- position: relative;
- background-repeat: no-repeat;
- background-size: cover;
- width: 1275px; /* was 1275*/
- height: 2000px;
- /*border: solid black;*/
- overflow: clip;
+ width: 1650px;
+ height: 2550px;
+ background-size: 1650px 2550px;
box-shadow: 0px 1px 10px #0008;
- /*z-index: 3;*/
-}
-
-#map { background-image: url(1989_map.jpg) }
-
-/* Containers to appear on hover*/
- #overlay {
- position: relative;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- /* background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent overlay */
- /* display: none;*/
- justify-content: center;
- align-items: center;
- text-align: left;
- }
-
-/* SPACES */
-
-.space-area {
- position: absolute;
- box-sizing: border-box;
- border: transparent red 2px;
-}
-
-/* PANELS AND HANDS */
-
-.panel {
- background-color: #555;
- display: inline-block;
-}
-
-.panel_header {
- background-color: #444;
- color: hsl(40, 60%, 90%);
- font-weight: bold;
- text-align: center;
- padding: 3px 1em;
-}
-
-.hide {
- display: none;
-}
-
-#hand_panel, #events_panel, #played_card_panel, #table_panel, #samizdat_panel, #opp_hand_panel, #power_panel, #ceausescu_panel {
- min-width: 200px;
- width: auto;
- /*display: inline-block;*/
- margin: 10px;
- border-radius: 5px;
-}
-
-#events {
- display: flex;
-}
-
-#discard_panel, #removed_panel {
- min-width: 200px;
- width: auto;
- display: inline-block;
- margin: 10px;
- border-radius: 5px;
-}
-
-#discard_panel.hide, #removed_panel.hide {
- display: none;
-}
-
-#hand_panel {
- margin: 10px;
- border-radius: 5px;
-}
-
-/* INFLUENCE MARKERS */
-
-.demInfl {
- position: absolute;
- box-sizing: border-box;
- bottom: 1px;
- left: 6px;
- height: 35px;
- width: 35px;
- border-radius: 5px;
-}
-
-.demInfl.controlled {
- background-image: url(images/US_blank.gif);
- background-size: contain;
-}
-
-
-.demInfl.uncontrolled {
- background-image: url(images/USd_blank.gif);
- background-size: contain;
-}
-/*
-.demInfl:hover {
- cursor: pointer;
-}*/
-
-.comInfl {
- position: absolute;
- box-sizing: border-box;
- bottom: 1px;
- right: 6px;
- height: 35px;
- width: 35px;
-}
-/*
-.comInfl:hover {
- cursor: pointer;
-}*/
-
-.comInfl.controlled {
- background-image: url(images/SV_blank.gif);
- background-size: contain;
-}
-
-
-.comInfl.uncontrolled {
- background-image: url(images/SVd_blank.gif);
- background-size: contain;
-}
-
-.demInflValue {
- position: absolute;
- box-sizing: border-box;
- font-family: 'Open Sans';
- font-size: 20px;
- font-weight: bold;
- top: 10px;
- left: 16px;
}
-.demInflValue_10 {
- position: absolute;
- box-sizing: border-box;
- font-family: 'Open Sans';
- font-size: 20px;
- font-weight: bold;
- top: 10px;
- left: 10px;
+#map { background-image: url("map75.jpg") }
+@media (min-resolution: 97dpi) {
+ #map { background-image: url("map150.jpg") }
}
-.comInflValue {
- position: absolute;
- box-sizing: border-box;
- font-family: 'Open Sans';
- font-size: 20px;
- font-weight: bold;
- top: 12px;
- left: 74px;
-}
+/* SPACES */
-.comInflValue_10 {
+.space {
position: absolute;
box-sizing: border-box;
- font-family: 'Open Sans';
- font-size: 20px;
- font-weight: bold;
- top: 12px;
- left: 68px;
+ border: 4px solid transparent;
}
-.comInflValue.controlled, .held {
- color: whitesmoke;
- text-shadow:
- 1px 1px 0 #c2272d, /* Right bottom */
- -1px 1px 0 #c2272d, /* Left bottom */
- 1px -1px 0 #c2272d, /* Right top */
- -1px -1px 0 #c2272d; /* Left top */
+.space.action {
+ border-color: white;
+ box-shadow: 0 0 0 1px black, inset 0 0 0 1px black;
}
-.comInflValue.uncontrolled {
- color: #c2272d;
- text-shadow:
- 1px 1px 0 #ffffff, /* Right bottom */
- -1px 1px 0 #ffffff, /* Left bottom */
- 1px -1px 0 #ffffff, /* Right top */
- -1px -1px 0 #ffffff; /* Left top */
-}
+.space.East_Germany.action { border-color: white; }
+.space.Poland.action { border-color: yellow; }
+.space.Czechoslovakia.action { border-color: lightgreen; }
+.space.Hungary.action { border-color: gold; }
+.space.Romania.action { border-color: peachpuff; }
+.space.Bulgaria.action { border-color: palegreen; }
-.comInflValue_10.controlled, .held {
- color: whitesmoke;
- text-shadow:
- 1px 1px 0 #c2272d, /* Right bottom */
- -1px 1px 0 #c2272d, /* Left bottom */
- 1px -1px 0 #c2272d, /* Right top */
- -1px -1px 0 #c2272d; /* Left top */
+.space.tip {
+ border-color: lime;
+ box-shadow: 0 0 0 1px black, inset 0 0 0 1px black;
}
-.comInflValue_10.uncontrolled {
- color: #c2272d;
- text-shadow:
- 1px 1px 0 #ffffff, /* Right bottom */
- -1px 1px 0 #ffffff, /* Left bottom */
- 1px -1px 0 #ffffff, /* Right top */
- -1px -1px 0 #ffffff; /* Left top */
-}
-
-
-/* GAME MARKERS */
-
-.t0 {left: 511px}
-.t1 {left: 511px}
-.t2 {left: 553px}
-.t3 {left: 595px}
-.t4 {left: 637px}
-.t5 {left: 679px}
-.t6 {left: 721px}
-.t7 {left: 763px}
-.t8 {left: 805px}
-.t9 {left: 847px}
-.t10 {left: 889px}
-
-#turn-tracker {
- position:absolute;
- top: 65px;
- height: 35px;
- width: 36px;
- /*display: block;*/
-}
-
-.r0 {left: 554px}
-.r1 {left: 554px}
-.r2 {left: 596px}
-.r3 {left: 638px}
-.r4 {left: 680px}
-.r5 {left: 722px}
-.r6 {left: 764px}
-.r7 {left: 806px}
-.r8 {left: 848px}
+/* MARKERS */
-.dem-action-round-tracker { background-image: url(images/US_Action_Round.gif);}
-.com-action-round-tracker { background-image: url(images/SV_Action_Round.gif);}
+/* node tools/gencolors.js */
+.marker { background-color: #ffffff; border-color: #eeeeee #8a8a8a #8a8a8a #eeeeee; box-shadow: 0 0 0 1px #323232, 1px 2px 4px #0008; }
+.demInfl.ctl { background-color: #c4e2f6; border-color: #e6ffff #8ca8bb #8ca8bb #e6ffff; box-shadow: 0 0 0 1px #274050, 1px 2px 4px #0008; }
+.comInfl.ctl { background-color: #c1272d; border-color: #e74e4c #9c0009 #9c0009 #e74e4c; box-shadow: 0 0 0 1px #520000, 1px 2px 4px #0008; }
+#marker_action_round.com { background-color: #147fc0; border-color: #44a3e6 #005c9b #005c9b #44a3e6; box-shadow: 0 0 0 1px #001a54, 1px 2px 4px #0008; }
+#marker_action_round.dem { background-color: #c1272d; border-color: #e74e4c #9c0009 #9c0009 #e74e4c; box-shadow: 0 0 0 1px #520000, 1px 2px 4px #0008; }
+#marker_vp, #marker_turn { background-color: #fadb04; border-color: #ffff51 #c0a100 #c0a100 #ffff51; box-shadow: 0 0 0 1px #563600, 1px 2px 4px #0008; }
+#marker_com_tst { background-color: #f26649; border-color: #ff9273 #c2391c #c2391c #ff9273; box-shadow: 0 0 0 1px #640000, 1px 2px 4px #0008; }
+#marker_dem_tst { background-color: #c4e2f4; border-color: #e6ffff #8ca8ba #8ca8ba #e6ffff; box-shadow: 0 0 0 1px #27404f, 1px 2px 4px #0008; }
-#action-round-tracker {
+#event_reminder_list {
position: absolute;
- top: 114px;
- height: 30px;
- width: 35px;
- background-size: cover;
-}
-
-
-
-#stability-track {
- position:absolute;
- left: 1085px;
- height: 35px;
- width: 35px;
-}
-
-.s0 {top: 853px}
-.s1 {top: 896px}
-.s2 {top: 939px}
-.s3 {top: 982px}
-.s4 {top: 1025px}
-
-
-.tst0 {left: 0}
-.tst1 {left: 38px}
-.tst2 {left: 93px}
-.tst3 {left: 148px}
-.tst4 {left: 203px}
-.tst5 {left: 258px}
-.tst6 {left: 313px}
-.tst7 {left: 368px}
-.tst8 {left: 436px}
-
-#dem-TST {
- position: absolute;
- top: 1680px;
- height: 35px;
- width: 35px;
-}
-
-#com-TST {
- position: absolute;
- top: 1782px;
- height: 35px;
- width: 35px;
-}
-
-.vp0 {top: 1913px;
-left: 660px}
-
-.vp-20, .vp-18, .vp-16, .vp-14, .vp-12, .vp-10, .vp-8, .vp-6, .vp-4, .vp-2, .vp1, .vp3, .vp5, .vp7, .vp9, .vp11, .vp13, .vp15, .vp17, .vp19 {top: 1889px}
-.vp-19, .vp-17, .vp-15, .vp-13, .vp-11, .vp-9, .vp-7, .vp-5, .vp-3, .vp-1, .vp2, .vp4, .vp6, .vp8, .vp10, .vp12, .vp14, .vp16, .vp18, .vp20 {top: 1938px}
-
-.vp-21 {top: 1912px; left: 117px}
-.vp21 {top: 1912px; left: 1182px}
-
-.vp-20 {left: 165px}
-.vp-19 {left: 189px}
-.vp-18 {left: 214px}
-.vp-17 {left: 238px}
-.vp-16 {left: 263px}
-.vp-15 {left: 287px}
-.vp-14 {left: 312px}
-.vp-13 {left: 336px}
-.vp-12 {left: 361px}
-.vp-11 {left: 385px}
-.vp-10 {left: 410px}
-.vp-9 {left: 434px}
-.vp-8 {left: 459px}
-.vp-7 {left: 483px}
-.vp-6 {left: 508px}
-.vp-5 {left: 532px}
-.vp-4 {left: 557px}
-.vp-3 {left: 581px}
-.vp-2 {left: 606px}
-.vp-1 {left: 630px}
-.vp1 {left: 692px}
-.vp2 {left: 717px}
-.vp3 {left: 741px}
-.vp4 {left: 766px}
-.vp5 {left: 790px}
-.vp6 {left: 815px}
-.vp7 {left: 839px}
-.vp8 {left: 864px}
-.vp9 {left: 888px}
-.vp10 {left: 913px}
-.vp11 {left: 937px}
-.vp12 {left: 962px}
-.vp13 {left: 986px}
-.vp14 {left: 1011px}
-.vp15 {left: 1035px}
-.vp16 {left: 1060px}
-.vp17 {left: 1084px}
-.vp18 {left: 1109px}
-.vp19 {left: 1133px}
-.vp20 {left: 1158px}
-
-#vp {
- position: absolute;
- height: 40px;
- width: 40px;
+ display: flex;
+ flex-rap: wrap;
+ gap: 5px;
+ bottom: 165px;
+ right: 195px;
}
.marker {
position: absolute;
- height: 30px;
- width: 30px;
-}
-
-.revolution {background-image: url(images/US_blank.gif); background-size: contain}
-.held {background-image: url(images/SV_blank.gif); background-size: contain}
-
-.germany {top: 127px; left: 439px}
-.poland { top: 232px; left: 934px}
-.czech {top: 494px; left: 362px}
-.hungary {top: 1041px; left: 813px}
-.romania {top: 1063px; left: 1012px}
-.bulgaria {top: 1578px; left: 720px}
-
-.times_held {
- position: absolute;
- font-family: 'Open Sans';
- font-size: 20px;
- font-weight: bold;
- top: -18px;
- left: 8px
-}
-
-.outlined_text {
- text-shadow:
- 1px 1px 0 #ffffff, /* Right bottom */
- -1px 1px 0 #ffffff, /* Left bottom */
- 1px -1px 0 #ffffff, /* Right top */
- -1px -1px 0 #ffffff; /* Left top */
-}
-
-/* ============= EVENT MARKERS ========== */
-
-.event-marker {
- display: none;
- position: absolute;
- height: 30px;
- width: 30px;
- transition: transform 0.3s ease;
-}
-
-.event-marker:hover {
- cursor: pointer;
- transform: scale(2);
- z-index: 1;
-}
-
-.event-marker.aside {
- border: solid black 1.5px;
- margin: 3px;
- position: relative;
-}
-
-#turn_info {
- display: flex;
- flex-direction: column;
- align-items: flex-start;
-}
-
-#turn_info > div {
- display: flex;
- margin-bottom: 8px;
- gap: 4px;
-}
-
-#turn_info > img {
- display: block;
-
-}
-
-/*Solidarity legalised*/
-#event_2 {
- top: 216px;
- left: 612px;
-}
-
-/*Systematisation*/
-#event_69 {
- height: 65px;
- width: 65px;
-}
+ pointer-events: none;
+ width: 45px;
+ height: 45px;
+ border: 2px solid;
+ border-color: #eee #bbb #bbb #eee;
+ /* TODO: per marker border color */
+ box-shadow: 0 0 0 1px #444;
+ //border-radius: 8px;
+}
+
+.demInfl { background-color: #fff; }
+.comInfl { background-color: #fff; }
+.demInfl.ctl { background-color: #147fc0; }
+.comInfl.ctl { background-color: #c1272d; }
+
+.demInfl.v1 { background-image: url(markers75/di1.png) }
+.demInfl.v2 { background-image: url(markers75/di2.png) }
+.demInfl.v3 { background-image: url(markers75/di3.png) }
+.demInfl.v4 { background-image: url(markers75/di4.png) }
+.demInfl.v5 { background-image: url(markers75/di5.png) }
+.demInfl.v6 { background-image: url(markers75/di6.png) }
+.demInfl.v7 { background-image: url(markers75/di7.png) }
+.demInfl.v8 { background-image: url(markers75/di8.png) }
+.demInfl.ctl.v1 { background-image: url(markers75/dc1.png) }
+.demInfl.ctl.v2 { background-image: url(markers75/dc2.png) }
+.demInfl.ctl.v3 { background-image: url(markers75/dc3.png) }
+.demInfl.ctl.v4 { background-image: url(markers75/dc4.png) }
+.demInfl.ctl.v5 { background-image: url(markers75/dc5.png) }
+.demInfl.ctl.v6 { background-image: url(markers75/dc6.png) }
+.demInfl.ctl.v7 { background-image: url(markers75/dc7.png) }
+.demInfl.ctl.v8 { background-image: url(markers75/dc8.png) }
+
+.comInfl.v1 { background-image: url(markers75/ci1.png) }
+.comInfl.v2 { background-image: url(markers75/ci2.png) }
+.comInfl.v3 { background-image: url(markers75/ci3.png) }
+.comInfl.v4 { background-image: url(markers75/ci4.png) }
+.comInfl.v5 { background-image: url(markers75/ci5.png) }
+.comInfl.v6 { background-image: url(markers75/ci6.png) }
+.comInfl.v7 { background-image: url(markers75/ci7.png) }
+.comInfl.v8 { background-image: url(markers75/ci8.png) }
+.comInfl.ctl.v1 { background-image: url(markers75/cc1.png) }
+.comInfl.ctl.v2 { background-image: url(markers75/cc2.png) }
+.comInfl.ctl.v3 { background-image: url(markers75/cc3.png) }
+.comInfl.ctl.v4 { background-image: url(markers75/cc4.png) }
+.comInfl.ctl.v5 { background-image: url(markers75/cc5.png) }
+.comInfl.ctl.v6 { background-image: url(markers75/cc6.png) }
+.comInfl.ctl.v7 { background-image: url(markers75/cc7.png) }
+.comInfl.ctl.v8 { background-image: url(markers75/cc8.png) }
+
+#marker_turn { background-image: url(markers75/turn.png) }
+#marker_action_round.dem { background-image: url(markers75/action_round_blue.png) }
+#marker_action_round.com { background-image: url(markers75/action_round_blue.png) }
+#marker_stability_track { background-image: url(markers75/ussr_stability_track.png) }
+#marker_dem_tst { background-image: url(markers75/ts_blue.png) }
+#marker_com_tst { background-image: url(markers75/ts_red.png) }
+#marker_vp { background-image: url(markers75/vp.png) }
+
+/* EVENT MARKERS */
+
+.marker.aside {
+ position: static;
+}
+
+#event_2 { background-image: url(markers75/event_solidarity_legalized.png) }
+#event_9 { background-image: url(markers75/event_the_wall.png) }
+#event_15 { background-image: url(markers75/event_honecker.png) }
+#event_24 { background-image: url(markers75/event_st_nicholas.png) }
+#event_26 { background-image: url(markers75/event_helsinki.png) }
+#event_39 { background-image: url(markers75/event_eco_glasnost.png) }
+#event_48 { background-image: url(markers75/event_we_are_the_people.png) }
+#event_49 { background-image: url(markers75/event_foreign_currency.png) }
+#event_53 { background-image: url(markers75/event_li_peng.png) }
+#event_58 { background-image: url(markers75/event_austria_hungary.png) }
+#event_59 { background-image: url(markers75/event_grenz_truppen.png) }
+#event_65 { background-image: url(markers75/event_pres_visit.png) }
+#event_69 { background-image: url(markers75/event_systematization.png) }
+#event_70 { background-image: url(markers75/event_securitate.png) }
+#event_73 { background-image: url(markers75/event_laszlo_tokes.png) }
+#event_97 { background-image: url(markers75/event_tyrant.png) }
+#event_100 { background-image: url(markers75/event_stand_fast.png) }
+#event_101 { background-image: url(markers75/event_elena.png) }
+#event_104 { background-image: url(markers75/event_nye_party.png) }
+
+/* Solidarity legalized */
+#event_2 { top: 265px; left: 778px; }
+
+/* The Wall */
+#event_9 { top: 175px; left: 216px; }
+
+/* CARD PANELS */
-/*The Tyrant is Gone*/
-#event_97 {
- height: 40px;
- width: 40px;
+.panel {
+ background-color: #607080;
+ max-width: 1650px;
+ margin: 24px auto;
}
-/*The Wall*/
-#event_9 {
- top: 143px;
- left: 170px;
+.panel_header {
+ background-color: #506070;
+ color: white;
+ font-weight: bold;
+ padding: 3px;
+ text-align: center;
}
-
-/* =========== CARDS ================= */
-/*
-.playedCard {
+.panel_body {
+ margin-top: 3px;
display: flex;
- margin: auto;
- height: 300px;
-}*/
-
-.hand_card {
- background-size: contain;
- height: 250px;
- margin: 10px;
- border-radius: 5px;
- transition: transform .3s ease 0.5s;
-}
-/*
-.hand_card:hover {
- cursor: pointer;
-}*/
-
-.zoom {
- transform: scale(1.75)
-}
-
-.power_card {
- background-size: contain;
- height: 250px;
- margin: 10px;
- border-radius: 5px;
-}
-
-.discard_card, .event_card {
- background-size: contain;
- height: 150px;
- margin: 5px;
- border-radius: 5px;
- transition: transform .3s ease;
-}
-
-.discard_card:hover, .event_card:hover {
- /*cursor: pointer;*/
- transform: scale(2);
+ flex-wrap: wrap;
+ padding: 16px;
+ gap: 16px;
+ min-height: 350px;
}
-.selected.space-area {
- background-color: #0002;
- outline: solid white 2px;
- /*box-shadow: 0 0 4px white; */
- border-radius: 10px 10px 0 0;
-}
-
-.space-area.tip {
- background-color: #ff08;
- outline: solid white 2px;
- box-shadow: 0 0 8px #ff08;
- border-radius: 10px 10px 0 0;
-}
-
-.selected.hand_card {
- outline: solid silver 3px;
- /*box-shadow: 0 0 4px white; */
- border-radius: 18px;
-}
-
-
-.selected.power_card {
- outline: solid silver 3px;
- /*box-shadow: 0 0 4px white; */
- border-radius: 18px;
+.panel:has(.panel_body:empty) {
+ display: none;
}
-/* =============== OTHER ===============*/
-#space-characteristics {display: none}
-
-/* =============== CARD IMAGES =========*/
+/* CARD IMAGES */
#tooltip {
position: fixed;
@@ -626,116 +251,179 @@ left: 660px}
width: 250px;
height: 350px;
border-radius: 16px;
- box-shadow: 1px 2px 4px #0004;
-}
-
-.card_1 {background-image: url(cards/e1.gif)}
-.card_2 {background-image: url(cards/e2.gif)}
-.card_3 {background-image: url(cards/e3.gif)}
-.card_4 {background-image: url(cards/e4.gif)}
-.card_5 {background-image: url(cards/e5.gif)}
-.card_6 {background-image: url(cards/e6.gif)}
-.card_7 {background-image: url(cards/e7.gif)}
-.card_8 {background-image: url(cards/e8.gif)}
-.card_9 {background-image: url(cards/e9.gif)}
-.card_10 {background-image: url(cards/e10.gif)}
-.card_11 {background-image: url(cards/e11.gif)}
-.card_12 {background-image: url(cards/e12.gif)}
-.card_13 {background-image: url(cards/e13.gif)}
-.card_14 {background-image: url(cards/e14.gif)}
-.card_15 {background-image: url(cards/e15.gif)}
-.card_16 {background-image: url(cards/e16.gif)}
-.card_17 {background-image: url(cards/e17.gif)}
-.card_18 {background-image: url(cards/e18.gif)}
-.card_19 {background-image: url(cards/e19.gif)}
-.card_20 {background-image: url(cards/e20.gif)}
-.card_21 {background-image: url(cards/e21.gif)}
-.card_22 {background-image: url(cards/e22.gif)}
-.card_23 {background-image: url(cards/e23.gif)}
-.card_24 {background-image: url(cards/e24.gif)}
-.card_25 {background-image: url(cards/e25.gif)}
-.card_26 {background-image: url(cards/e26.gif)}
-.card_27 {background-image: url(cards/e27.gif)}
-.card_28 {background-image: url(cards/e28.gif)}
-.card_29 {background-image: url(cards/e29.gif)}
-.card_30 {background-image: url(cards/e30.gif)}
-.card_31 {background-image: url(cards/e31.gif)}
-.card_32 {background-image: url(cards/e32.gif)}
-.card_33 {background-image: url(cards/e33.gif)}
-.card_34 {background-image: url(cards/e34.gif)}
-.card_35 {background-image: url(cards/e35.gif)}
-.card_36 {background-image: url(cards/e36.gif)}
-.card_37 {background-image: url(cards/e37.gif)}
-.card_38 {background-image: url(cards/e38.gif)}
-.card_39 {background-image: url(cards/e39.gif)}
-.card_40 {background-image: url(cards/e40.gif)}
-.card_41 {background-image: url(cards/e41.gif)}
-.card_42 {background-image: url(cards/e42.gif)}
-.card_43 {background-image: url(cards/e43.gif)}
-.card_44 {background-image: url(cards/e44.gif)}
-.card_45 {background-image: url(cards/e45.gif)}
-.card_46 {background-image: url(cards/e46.gif)}
-.card_47 {background-image: url(cards/e47.gif)}
-.card_48 {background-image: url(cards/e48.gif)}
-.card_49 {background-image: url(cards/e49.gif)}
-.card_50 {background-image: url(cards/e50.gif)}
-.card_51 {background-image: url(cards/e51.gif)}
-.card_52 {background-image: url(cards/e52.gif)}
-.card_53 {background-image: url(cards/e53.gif)}
-.card_54 {background-image: url(cards/e54.gif)}
-.card_55 {background-image: url(cards/e55.gif)}
-.card_56 {background-image: url(cards/e56.gif)}
-.card_57 {background-image: url(cards/e57.gif)}
-.card_58 {background-image: url(cards/e58.gif)}
-.card_59 {background-image: url(cards/e59.gif)}
-.card_60 {background-image: url(cards/e60.gif)}
-.card_61 {background-image: url(cards/e61.gif)}
-.card_62 {background-image: url(cards/e62.gif)}
-.card_63 {background-image: url(cards/e63.gif)}
-.card_64 {background-image: url(cards/e64.gif)}
-.card_65 {background-image: url(cards/e65.gif)}
-.card_66 {background-image: url(cards/e66.gif)}
-.card_67 {background-image: url(cards/e67.gif)}
-.card_68 {background-image: url(cards/e68.gif)}
-.card_69 {background-image: url(cards/e69.gif)}
-.card_70 {background-image: url(cards/e70.gif)}
-.card_71 {background-image: url(cards/e71.gif)}
-.card_72 {background-image: url(cards/e72.gif)}
-.card_73 {background-image: url(cards/e73.gif)}
-.card_74 {background-image: url(cards/e74.gif)}
-.card_75 {background-image: url(cards/e75.gif)}
-.card_76 {background-image: url(cards/e76.gif)}
-.card_77 {background-image: url(cards/e77.gif)}
-.card_78 {background-image: url(cards/e78.gif)}
-.card_79 {background-image: url(cards/e79.gif)}
-.card_80 {background-image: url(cards/e80.gif)}
-.card_81 {background-image: url(cards/e81.gif)}
-.card_82 {background-image: url(cards/e82.gif)}
-.card_83 {background-image: url(cards/e83.gif)}
-.card_84 {background-image: url(cards/e84.gif)}
-.card_85 {background-image: url(cards/e85.gif)}
-.card_86 {background-image: url(cards/e86.gif)}
-.card_87 {background-image: url(cards/e87.gif)}
-.card_88 {background-image: url(cards/e88.gif)}
-.card_89 {background-image: url(cards/e89.gif)}
-.card_90 {background-image: url(cards/e90.gif)}
-.card_91 {background-image: url(cards/e91.gif)}
-.card_92 {background-image: url(cards/e92.gif)}
-.card_93 {background-image: url(cards/e93.gif)}
-.card_94 {background-image: url(cards/e94.gif)}
-.card_95 {background-image: url(cards/e95.gif)}
-.card_96 {background-image: url(cards/e96.gif)}
-.card_97 {background-image: url(cards/e97.gif)}
-.card_98 {background-image: url(cards/e98.gif)}
-.card_99 {background-image: url(cards/e99.gif)}
-.card_100 {background-image: url(cards/e100.gif)}
-.card_101 {background-image: url(cards/e101.gif)}
-.card_102 {background-image: url(cards/e102.gif)}
-.card_103 {background-image: url(cards/e103.gif)}
-.card_104 {background-image: url(cards/e104.gif)}
-.card_105 {background-image: url(cards/e105.gif)}
-.card_106 {background-image: url(cards/e106.gif)}
-.card_107 {background-image: url(cards/e107.gif)}
-.card_108 {background-image: url(cards/e108.gif)}
-.card_109 {background-image: url(cards/e109.gif)}
-.card_110 {background-image: url(cards/e110.gif)}
+ box-shadow: 0 0 0 1px #444, 1px 2px 4px #0004;
+}
+
+.card.action {
+ box-shadow: 0 0 0 1px #444, 0 0 0 4px white;
+}
+
+.card.selected {
+ box-shadow: 0 0 0 1px #444, 0 0 0 4px yellow;
+}
+
+.card.event_0 { background-image: url(cards100/event_back.webp) }
+.card.event_1 { background-image: url(cards100/event_1.webp) }
+.card.event_2 { background-image: url(cards100/event_2.webp) }
+.card.event_3 { background-image: url(cards100/event_3.webp) }
+.card.event_4 { background-image: url(cards100/event_4.webp) }
+.card.event_5 { background-image: url(cards100/event_5.webp) }
+.card.event_6 { background-image: url(cards100/event_6.webp) }
+.card.event_7 { background-image: url(cards100/event_7.webp) }
+.card.event_8 { background-image: url(cards100/event_8.webp) }
+.card.event_9 { background-image: url(cards100/event_9.webp) }
+.card.event_10 { background-image: url(cards100/event_10.webp) }
+.card.event_11 { background-image: url(cards100/event_11.webp) }
+.card.event_12 { background-image: url(cards100/event_12.webp) }
+.card.event_13 { background-image: url(cards100/event_13.webp) }
+.card.event_14 { background-image: url(cards100/event_14.webp) }
+.card.event_15 { background-image: url(cards100/event_15.webp) }
+.card.event_16 { background-image: url(cards100/event_16.webp) }
+.card.event_17 { background-image: url(cards100/event_17.webp) }
+.card.event_18 { background-image: url(cards100/event_18.webp) }
+.card.event_19 { background-image: url(cards100/event_19.webp) }
+.card.event_20 { background-image: url(cards100/event_20.webp) }
+.card.event_21 { background-image: url(cards100/event_21.webp) }
+.card.event_22 { background-image: url(cards100/event_22.webp) }
+.card.event_23 { background-image: url(cards100/event_23.webp) }
+.card.event_24 { background-image: url(cards100/event_24.webp) }
+.card.event_25 { background-image: url(cards100/event_25.webp) }
+.card.event_26 { background-image: url(cards100/event_26.webp) }
+.card.event_27 { background-image: url(cards100/event_27.webp) }
+.card.event_28 { background-image: url(cards100/event_28.webp) }
+.card.event_29 { background-image: url(cards100/event_29.webp) }
+.card.event_30 { background-image: url(cards100/event_30.webp) }
+.card.event_31 { background-image: url(cards100/event_31.webp) }
+.card.event_32 { background-image: url(cards100/event_32.webp) }
+.card.event_33 { background-image: url(cards100/event_33.webp) }
+.card.event_34 { background-image: url(cards100/event_34.webp) }
+.card.event_35 { background-image: url(cards100/event_35.webp) }
+.card.event_36 { background-image: url(cards100/event_36.webp) }
+.card.event_37 { background-image: url(cards100/event_37.webp) }
+.card.event_38 { background-image: url(cards100/event_38.webp) }
+.card.event_39 { background-image: url(cards100/event_39.webp) }
+.card.event_40 { background-image: url(cards100/event_40.webp) }
+.card.event_41 { background-image: url(cards100/event_41.webp) }
+.card.event_42 { background-image: url(cards100/event_42.webp) }
+.card.event_43 { background-image: url(cards100/event_43.webp) }
+.card.event_44 { background-image: url(cards100/event_44.webp) }
+.card.event_45 { background-image: url(cards100/event_45.webp) }
+.card.event_46 { background-image: url(cards100/event_46.webp) }
+.card.event_47 { background-image: url(cards100/event_47.webp) }
+.card.event_48 { background-image: url(cards100/event_48.webp) }
+.card.event_49 { background-image: url(cards100/event_49.webp) }
+.card.event_50 { background-image: url(cards100/event_50.webp) }
+.card.event_51 { background-image: url(cards100/event_51.webp) }
+.card.event_52 { background-image: url(cards100/event_52.webp) }
+.card.event_53 { background-image: url(cards100/event_53.webp) }
+.card.event_54 { background-image: url(cards100/event_54.webp) }
+.card.event_55 { background-image: url(cards100/event_55.webp) }
+.card.event_56 { background-image: url(cards100/event_56.webp) }
+.card.event_57 { background-image: url(cards100/event_57.webp) }
+.card.event_58 { background-image: url(cards100/event_58.webp) }
+.card.event_59 { background-image: url(cards100/event_59.webp) }
+.card.event_60 { background-image: url(cards100/event_60.webp) }
+.card.event_61 { background-image: url(cards100/event_61.webp) }
+.card.event_62 { background-image: url(cards100/event_62.webp) }
+.card.event_63 { background-image: url(cards100/event_63.webp) }
+.card.event_64 { background-image: url(cards100/event_64.webp) }
+.card.event_65 { background-image: url(cards100/event_65.webp) }
+.card.event_66 { background-image: url(cards100/event_66.webp) }
+.card.event_67 { background-image: url(cards100/event_67.webp) }
+.card.event_68 { background-image: url(cards100/event_68.webp) }
+.card.event_69 { background-image: url(cards100/event_69.webp) }
+.card.event_70 { background-image: url(cards100/event_70.webp) }
+.card.event_71 { background-image: url(cards100/event_71.webp) }
+.card.event_72 { background-image: url(cards100/event_72.webp) }
+.card.event_73 { background-image: url(cards100/event_73.webp) }
+.card.event_74 { background-image: url(cards100/event_74.webp) }
+.card.event_75 { background-image: url(cards100/event_75.webp) }
+.card.event_76 { background-image: url(cards100/event_76.webp) }
+.card.event_77 { background-image: url(cards100/event_77.webp) }
+.card.event_78 { background-image: url(cards100/event_78.webp) }
+.card.event_79 { background-image: url(cards100/event_79.webp) }
+.card.event_80 { background-image: url(cards100/event_80.webp) }
+.card.event_81 { background-image: url(cards100/event_81.webp) }
+.card.event_82 { background-image: url(cards100/event_82.webp) }
+.card.event_83 { background-image: url(cards100/event_83.webp) }
+.card.event_84 { background-image: url(cards100/event_84.webp) }
+.card.event_85 { background-image: url(cards100/event_85.webp) }
+.card.event_86 { background-image: url(cards100/event_86.webp) }
+.card.event_87 { background-image: url(cards100/event_87.webp) }
+.card.event_88 { background-image: url(cards100/event_88.webp) }
+.card.event_89 { background-image: url(cards100/event_89.webp) }
+.card.event_90 { background-image: url(cards100/event_90.webp) }
+.card.event_91 { background-image: url(cards100/event_91.webp) }
+.card.event_92 { background-image: url(cards100/event_92.webp) }
+.card.event_93 { background-image: url(cards100/event_93.webp) }
+.card.event_94 { background-image: url(cards100/event_94.webp) }
+.card.event_95 { background-image: url(cards100/event_95.webp) }
+.card.event_96 { background-image: url(cards100/event_96.webp) }
+.card.event_97 { background-image: url(cards100/event_97.webp) }
+.card.event_98 { background-image: url(cards100/event_98.webp) }
+.card.event_99 { background-image: url(cards100/event_99.webp) }
+.card.event_100 { background-image: url(cards100/event_100.webp) }
+.card.event_101 { background-image: url(cards100/event_101.webp) }
+.card.event_102 { background-image: url(cards100/event_102.webp) }
+.card.event_103 { background-image: url(cards100/event_103.webp) }
+.card.event_104 { background-image: url(cards100/event_104.webp) }
+.card.event_105 { background-image: url(cards100/event_105.webp) }
+.card.event_106 { background-image: url(cards100/event_106.webp) }
+.card.event_107 { background-image: url(cards100/event_107.webp) }
+.card.event_108 { background-image: url(cards100/event_108.webp) }
+.card.event_109 { background-image: url(cards100/event_109.webp) }
+.card.event_110 { background-image: url(cards100/event_110.webp) }
+
+.card.power_0 { background-image: url(cards100/power_back.webp) }
+.card.power_1 { background-image: url(cards100/power_1.webp) }
+.card.power_2 { background-image: url(cards100/power_2.webp) }
+.card.power_3 { background-image: url(cards100/power_3.webp) }
+.card.power_4 { background-image: url(cards100/power_4.webp) }
+.card.power_5 { background-image: url(cards100/power_5.webp) }
+.card.power_6 { background-image: url(cards100/power_6.webp) }
+.card.power_7 { background-image: url(cards100/power_7.webp) }
+.card.power_8 { background-image: url(cards100/power_8.webp) }
+.card.power_9 { background-image: url(cards100/power_9.webp) }
+.card.power_10 { background-image: url(cards100/power_10.webp) }
+.card.power_11 { background-image: url(cards100/power_11.webp) }
+.card.power_12 { background-image: url(cards100/power_12.webp) }
+.card.power_13 { background-image: url(cards100/power_13.webp) }
+.card.power_14 { background-image: url(cards100/power_14.webp) }
+.card.power_15 { background-image: url(cards100/power_15.webp) }
+.card.power_16 { background-image: url(cards100/power_16.webp) }
+.card.power_17 { background-image: url(cards100/power_17.webp) }
+.card.power_18 { background-image: url(cards100/power_18.webp) }
+.card.power_19 { background-image: url(cards100/power_19.webp) }
+.card.power_20 { background-image: url(cards100/power_20.webp) }
+.card.power_21 { background-image: url(cards100/power_21.webp) }
+.card.power_22 { background-image: url(cards100/power_22.webp) }
+.card.power_23 { background-image: url(cards100/power_23.webp) }
+.card.power_24 { background-image: url(cards100/power_24.webp) }
+.card.power_25 { background-image: url(cards100/power_25.webp) }
+.card.power_26 { background-image: url(cards100/power_26.webp) }
+.card.power_27 { background-image: url(cards100/power_27.webp) }
+.card.power_28 { background-image: url(cards100/power_28.webp) }
+.card.power_29 { background-image: url(cards100/power_29.webp) }
+.card.power_30 { background-image: url(cards100/power_30.webp) }
+.card.power_31 { background-image: url(cards100/power_31.webp) }
+.card.power_32 { background-image: url(cards100/power_32.webp) }
+.card.power_33 { background-image: url(cards100/power_33.webp) }
+.card.power_34 { background-image: url(cards100/power_34.webp) }
+.card.power_35 { background-image: url(cards100/power_35.webp) }
+.card.power_36 { background-image: url(cards100/power_36.webp) }
+.card.power_37 { background-image: url(cards100/power_37.webp) }
+.card.power_38 { background-image: url(cards100/power_38.webp) }
+.card.power_39 { background-image: url(cards100/power_39.webp) }
+.card.power_40 { background-image: url(cards100/power_40.webp) }
+.card.power_41 { background-image: url(cards100/power_41.webp) }
+.card.power_42 { background-image: url(cards100/power_42.webp) }
+.card.power_43 { background-image: url(cards100/power_43.webp) }
+.card.power_44 { background-image: url(cards100/power_44.webp) }
+.card.power_45 { background-image: url(cards100/power_45.webp) }
+.card.power_46 { background-image: url(cards100/power_46.webp) }
+.card.power_47 { background-image: url(cards100/power_47.webp) }
+.card.power_48 { background-image: url(cards100/power_48.webp) }
+.card.power_49 { background-image: url(cards100/power_49.webp) }
+.card.power_50 { background-image: url(cards100/power_50.webp) }
+.card.power_51 { background-image: url(cards100/power_51.webp) }
+.card.power_52 { background-image: url(cards100/power_52.webp) }
diff --git a/play.html b/play.html
index e09e214..eb2f495 100644
--- a/play.html
+++ b/play.html
@@ -7,204 +7,140 @@
<meta charset="utf-8">
<title>1989</title>
<link rel="icon" href="favicon.png">
-<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/fonts/fonts.css">
<link rel="stylesheet" href="/common/client.css">
<link rel="stylesheet" href="play.css">
<script defer src="/common/client.js"></script>
<script defer src="data.js"></script>
-<!-- <script defer src="rules.js"></script> -->
<script defer src="play.js"></script>
-
</head>
<body>
+
<div id="tooltip" class="card hide"></div>
<header>
<div id="toolbar">
<details>
- <summary><img src="images/cog.svg" width="50" height="50"></summary> <!-- Not sure why this is so big! -->
+ <summary><img src="/images/cog.svg"></summary>
+ <menu>
+ <li><a target="_blank" href="/1989-dawn-of-freedom/info/rules.html">Rules of Play</a>
+ <li><a target="_blank" href="/1989-dawn-of-freedom/info/background.html">Background Book</a>
+ <li><a target="_blank" href="/1989-dawn-of-freedom/info/reference.html">Reference Sheets</a>
+ <li class="separator">
+ <li><a target="_blank" href="/1989-dawn-of-freedom/info/cards.html">Card Gallery</a>
+ </menu>
+ </details>
+ <details>
+ <summary><img src="images/trash-can.svg"></summary>
<menu>
- <li>Rules of Play
- <li>Background Book
- <li>Reference Sheets
-
+ <li id="show_removed_menu" onclick="toggle_removed()">Show removed events
+ <li id="show_discard_menu" onclick="toggle_discard()">Show discard
</menu>
</details>
- <button onclick="toggle_pieces()"><img src="images/earth-africa-europe.svg"></button>
- <button onclick="toggle_discard()"><img src="images/bin.png"></button>
- <button onclick="toggle_removed()"><img src="images/remove.png"></button>
</div>
</header>
<aside>
- <div id="roles">
- <div class="role" id="role_Democrat">
- <div class="role_name">Democrat</div>
- <div class="role_stat" id="role_stat_dem">0 cards in hand</div>
- <div class="role_user">-</div>
- </div>
- <div class="role" id="role_Communist">
- <div class="role_name">Communist</div>
- <div class="role_stat" id="role_stat_com">0 cards in hand</div>
- <div class="role_user">-</div>
- </div>
- <div class="role" id="deck_data">
- <div class="deck_name" id="deck_stat">Strategy deck:</div>
- <div class="role_stat" id="deck_length">0 cards</div>
- </div>
- </div>
+ <div id="roles"></div>
+ <div id="turn_info"></div>
<div id="log"></div>
</aside>
-<main data-min-zoom="0.5" data-max-zoom = "2.0">
-
-<!-- MAP, EVENTS -->
-<section id="sec_map">
-
-<div class="map" id="map">
- <div id="pieces">
- <div id="overlay">
- <h2 id="space-characteristics"></h2>
- <img id="turn-tracker" class="hide" src="images/Turn.gif">
- <div class="us-action-round-tracker hide" id="action-round-tracker"></div>
- <img id="stability-track" class="hide" src="images/SV_Stability.gif">
- <img id="dem-TST" class="hide" src="images/US_Tiananmen_Square.gif">
- <img id="com-TST" class="hide" src="images/SV_Tiananmen_Square.gif">
- <img id="vp" class="hide" src="images/VP.gif">
- <div class="germany marker" id="East_Germany">
- <p class="times_held hide" id="East_Germany_times_held">1</p></div>
- <div class="poland marker" id="Poland">
- <p class="times_held hide" id="Poland_times_held">1</p></div>
- <div class="czech marker" id="Czechoslovakia">
- <p class="times_held hide" id="Czechoslovakia_times_held">1</p></div>
- <div class="hungary marker" id="Hungary">
- <p class="times_held hide" id="Hungary_times_held">1</p></div>
- <div class="romania marker" id="Romania">
- <p class="times_held hide" id="Romania_times_held">1</p></div>
- <div class="bulgaria marker" id="Bulgaria">
- <p class="times_held hide" id="Bulgaria_times_held">1</p></div>
+<main>
+
+<div id="mapwrap">
+<div id="map">
+ <div id="spaces"></div>
+ <div id="markers">
+ <div id="marker_turn" class="marker"></div>
+ <div id="marker_action_round" class="marker"></div>
+ <div id="marker_stability_track" class="marker"></div>
+ <div id="marker_dem_tst" class="marker"></div>
+ <div id="marker_com_tst" class="marker"></div>
+ <div id="marker_vp" class="marker"></div>
+
+ <!-- TODO
+ <div class="germany marker" id="East_Germany">
+ <p class="times_held hide" id="East_Germany_times_held">1</p></div>
+ <div class="poland marker" id="Poland">
+ <p class="times_held hide" id="Poland_times_held">1</p></div>
+ <div class="czech marker" id="Czechoslovakia">
+ <p class="times_held hide" id="Czechoslovakia_times_held">1</p></div>
+ <div class="hungary marker" id="Hungary">
+ <p class="times_held hide" id="Hungary_times_held">1</p></div>
+ <div class="romania marker" id="Romania">
+ <p class="times_held hide" id="Romania_times_held">1</p></div>
+ <div class="bulgaria marker" id="Bulgaria">
+ <p class="times_held hide" id="Bulgaria_times_held">1</p></div>
+ -->
<!-- PERMANENT EVENT MARKERS ON THE BOARD -->
-
-
- <img id="event_2" class="event-marker" src = "images/Event_Marker_Solidarity_Leg.gif">
- <img id="event_69" class="event-marker" src="images/Event_Marker_Systematizatio.gif">
- <img id="event_97" class="event-marker" src="images/Event_Marker_The_Tyrant_Is_.gif">
- <img id="event_9" class="event-marker" src="images/Event_Marker_The_Wall.gif">
-
- </div>
- <div id="counters"></div>
+ <div id="event_reminder_list"></div>
</div>
</div>
-</section>
-
-
-<!-- EVENTS IN PLAY -->
-<section id = "sec_events">
- <div id="events_panel" class="panel hide">
- <div id="events_header" class="panel_header">Event Markers</div>
- <div id="events" class="panel_body">
- <img id="event_15" class="event-marker aside" src="images/Event_Marker_Honecker.gif">
- <img id="event_24" class="event-marker aside" src="images/Event_Marker_St_Nicholas.gif">
- <img id="event_26" class="event-marker aside" src="images/Event_Marker_Helsinki.gif">
- <img id="event_39" class="event-marker aside" src = "images/Event_Marker_Eco_Glasnost.gif">
- <img id="event_48" class="event-marker aside" src="images/Event_Marker_We_are_the_Peo.gif">
- <img id="event_49" class="event-marker aside" src="images/Event_Marker_Foreign_Curren.gif">
- <img id="event_53" class="event-marker aside" src="images/Event_Marker_Li_Peng_.gif">
- <img id="event_58" class="event-marker aside" src="images/Event_Marker_Austria_Hungar.gif">
- <img id="event_59" class="event-marker aside" src="images/Event_Marker_Grenz_Truppen.gif">
- <img id="event_65" class="event-marker aside" src="images/Event_Marker_Pres_Visit.gif">
- <img id="event_70" class="event-marker aside" src="images/Event_Marker_Securitate.gif">
- <img id="event_73" class="event-marker aside" src="images/Event_Marker_Laszlo.gif">
- <img id="event_100" class="event-marker aside" src="images/Event_Marker_Stand_Fast.gif">
- <img id="event_101" class="event-marker aside" src="images/Event_Marker_Elena.gif">
- <img id="event_104" class="event-marker aside" src="images/Event_Marker_NYE_Party.gif">
- </div>
- </div>
-</section>
+</div>
<!-- EVENTS ON THE TABLE -->
-<section id = "sec_table_cards">
- <div id="table_panel" class="panel hide">
- <div id="table_header" class="panel_header">Cards on the Table</div>
- <div id="table_cards" class="panel_body"></div>
- </div>
-</section>
+<div id="table_panel" class="panel">
+ <div id="table_header" class="panel_header">Cards on the Table</div>
+ <div id="table_cards" class="panel_body"></div>
+</div>
<!-- PLAYED CARD -->
-<section id="sec_played_card">
-<div id="played_card_panel" class="panel hide">
-<div id="played_card_header" class="panel_header">Played Card</div>
-<div id="played_card" class="panel_body"></div>
+<div id="played_card_panel" class="panel">
+ <div id="played_card_header" class="panel_header">Played Card</div>
+ <div id="played_card" class="panel_body"></div>
</div>
-</section>
-
-<!-- DISCARD -->
-<section id = "sec_discard">
- <div id="discard_panel" class="panel">
- <div id="discard_header" class="panel_header">Discard</div>
- <div id="discard" class="panel_body"></div>
- </div>
-</section>
-
-<!-- PERMANENTLY REMOVED -->
-<section id = "sec_removed">
- <div id="removed_panel" class="panel hide">
- <div id="removed_header" class="panel_header">Permanently Removed Events</div>
- <div id="removed" class="panel_body"></div>
- </div>
-</section>
+<!-- HAND -->
+<div id="hand_panel" class="panel">
+ <div id="hand_header" class="panel_header">Hand</div>
+ <div id="hand" class="panel_body"></div>
+</div>
<!-- POWERSTRUGGLE -->
-<section id = "sec_power">
- <div id="ceausescu_panel" class="panel hide">
- <div id="ceausescu_header" class="panel_header">Ceausescu Cards</div>
- <div id="ceausescu_hand" class="panel_body"></div>
- </div>
- <div id="power_panel" class="panel hide">
- <div id="power_header" class="panel_header">Power Struggle Hand</div>
- <div id="power_hand" class="panel_body"></div>
- </div>
-</section>
-
-
+<div id="ceausescu_panel" class="panel">
+ <div id="ceausescu_header" class="panel_header">Ceausescu Cards</div>
+ <div id="ceausescu_hand" class="panel_body"></div>
+</div>
+<div id="power_panel" class="panel">
+ <div id="power_header" class="panel_header">Power Struggle Hand</div>
+ <div id="power_hand" class="panel_body"></div>
+</div>
<!-- OPPONENT HAND -->
-<section id="sec_opp_hand">
+<div id="opp_hand_panel" class="panel">
+ <div id="opp_hand_header" class="panel_header">Opponent Hand</div>
+ <div id="opp_hand" class="panel_body"></div>
+</div>
- <div id="opp_hand_panel" class="panel hide">
- <div id="opp_hand_header" class="panel_header">Opponent Hand</div>
- <div id="opp_hand" class="panel_body"></div>
- </div>
-
-</section>
+<div id="opp_power_hand_panel" class="panel">
+ <div id="opp_power_hand_header" class="panel_header">Opponent Power Struggle Hand</div>
+ <div id="opp_power_hand" class="panel_body"></div>
+</div>
<!-- SAMIZDAT CARD -->
-<section id = "sec_samizdat">
- <div id="samizdat_panel" class="panel">
- <div id="samizdat_header" class="panel_header">Set aside card</div>
- <div id="samizdat_card" class="panel_body"></div>
- </div>
-</section>
-
+<div id="samizdat_panel" class="panel">
+ <div id="samizdat_header" class="panel_header">Samizdat Card</div>
+ <div id="samizdat_card" class="panel_body"></div>
+</div>
-<!-- HAND -->
-<section id="sec_hand">
+<!-- PERMANENTLY REMOVED -->
+<div id="removed_panel" class="panel">
+ <div id="removed_header" class="panel_header">Permanently Removed Events</div>
+ <div id="removed" class="panel_body"></div>
+</div>
-<div id="hand_panel" class="panel hide">
- <div id="hand_header" class="panel_header">Hand</div>
- <div id="hand" class="panel_body"></div>
+<!-- DISCARD -->
+<div id="discard_panel" class="panel">
+ <div id="discard_header" class="panel_header">Discard</div>
+ <div id="discard" class="panel_body"></div>
</div>
-</section>
</main>
<footer id="status"></footer>
-
-
</html>
diff --git a/play.js b/play.js
index 5ccf136..9ac9e60 100644
--- a/play.js
+++ b/play.js
@@ -1,677 +1,417 @@
+"use strict"
-const seed = 'none'
-const scenario = 'standard'
-const options = 'none'
-//const rules = require("./rules")
+let action_register = []
+function register_action(target, action, id) {
+ target.my_action = action
+ target.my_id = id
+ target.onmousedown = on_click_action
+ action_register.push(target)
+}
+
+function is_action(action, arg) {
+ return !!(view.actions && view.actions[action] && view.actions[action].includes(arg))
+}
+
+function on_click_action(evt) {
+ if (evt.button === 0)
+ send_action(evt.target.my_action, evt.target.my_id)
+}
+
+const last_space = 75
const last_card = 110
const last_power_card = 52
-let hover_timeout
-const height = 65
-const width = 105
-const toolbar = document.getElementById('toolbar')
-const vpMarker = document.getElementById('vp')
-const counters = document.getElementById('counters')
-
-const countries= ['Poland', 'Hungary', 'East_Germany', 'Bulgaria', 'Czechoslovakia', 'Romania']
-
-/*const aside_events = [
- "honecker",
- "st_nicholas_church",
- "helsinki_final_act",
- "eco_glasnost",
- "we_are_the_people",
- "foreign_currency_debt_burden",
- "li_peng",
- "austria_hungary_border_reopened",
- "grenztruppen",
- "presidential_visit",
- "securitate",
- "laslzo_tokes",
- "stand_fast",
- "elena",
- "new_years_eve_party"
-]*/
-const board_events = [2, 9, 69, 97]
+
+const countries = [ "Poland", "Hungary", "East_Germany", "Bulgaria", "Czechoslovakia", "Romania" ]
+const board_events = [ 2, 9, 69, 97 ]
const box_events = [ 15, 24, 26, 39, 48, 49, 53, 58, 59, 65, 70, 73, 100, 101, 104 ]
-let box_events_showing = false
-let show_discard = false
-
-const overlay = document.getElementById('overlay');
-const spaceNameElement = document.getElementById('space-name');
-const spaceCharacteristicsElement = document.getElementById('space-characteristics');
-
-
-// Event listener to track mouse movement over the map
- document.querySelector('.map').addEventListener('mousemove', function(event) {
- const x = event.offsetX; // X-coordinate of mouse relative to container
- const y = event.offsetY; // Y-coordinate of mouse relative to container
- spaceCharacteristicsElement.innerText = `X: ${x}, Y: ${y}`;
- })
-
-
- // Create map areas dynamically based on coordinates
-
- function create_ui() {
-
-// CREATE MAP
-
- spaces.forEach((space) => {
-
-
- if (space && space.box) {
-
- //CREATE SPACES
- const { x, y} = space.box;
- const spaceArea = document.createElement('div');
- spaceArea.classList.add('space-area', space.country)
- spaceArea.id=`space_${space.space_id}`;
- spaceArea.style.left = x + 'px';
- spaceArea.style.top = y + 'px';
- spaceArea.style.width = width + 'px';
- spaceArea.style.height = height + 'px';
- spaceArea.style.zIndex = 2;
- spaceArea.my_space = space.space_id;
- spaceArea.addEventListener('mousedown', on_click_space);
-
- //CREATE DEMOCRATIC INFLUENCE MARKERS FOR EACH SPACE
- const dem_img = document.createElement('div')
- dem_img.classList.add('demInfl', space.country)
- dem_img.style.display = 'none'
- dem_img.id=`${space.name_unique}_demInfl`
- dem_img.style.zIndex = 1
- dem_img.my_space = space.space_id;
- dem_img.addEventListener('mousedown', on_click_space);
- spaceArea.appendChild(dem_img)
-
- //CREATE DEMOCRATIC INFLUENCE VALUES
- const demInflValue = document.createElement('p')
- demInflValue.className='demInflValue'
- demInflValue.style.display = 'none'
- demInflValue.id=`${space.name_unique}_demInflValue`
- demInflValue.innerText=space.demInfl
- demInflValue.style.zIndex = 1
- demInflValue.my_space = space.space_id;
- demInflValue.addEventListener('mousedown', on_click_space);
- spaceArea.appendChild(demInflValue)
-
- //CREATE COMMUNIST INFLUENCE MARKERS FOR EACH SPACE
- const com_img = document.createElement('div')
- com_img.className='comInfl'
- com_img.style.display='none'
- com_img.id=`${space.name_unique}_comInfl`
- com_img.style.zIndex = 1
- com_img.my_space = space.space_id;
- com_img.addEventListener('mousedown', on_click_space);
- spaceArea.appendChild(com_img)
-
- //CREATE COMMUNIST INFLUENCE VALUES
- const comInflValue = document.createElement('p')
- comInflValue.className='comInflValue'
- comInflValue.style.display='none'
- comInflValue.id=`${space.name_unique}_comInflValue`
- comInflValue.innerText=space.comInfl
- comInflValue.style.zIndex = 1
- comInflValue.my_space = space.space_id;
- comInflValue.addEventListener('mousedown', on_click_space);
- spaceArea.appendChild(comInflValue)
- //}
-
- counters.appendChild(spaceArea);
- }
- });
-// CREATE CARDS
+const ui = {
+ favicon: document.getElementById("favicon"),
+ turn_info: document.getElementById("turn_info"),
+
+ turn: document.getElementById("marker_turn"),
+ round: document.getElementById("marker_action_round"),
+ stability: document.getElementById("marker_stability_track"),
+ dem_tst: document.getElementById("marker_dem_tst"),
+ com_tst: document.getElementById("marker_com_tst"),
+ vp: document.getElementById("marker_vp"),
+
+ event_reminder_list: document.getElementById("event_reminder_list"),
+
+ played_card: document.getElementById("played_card"),
+ hand: document.getElementById("hand"),
+ power_hand: document.getElementById("power_hand"),
+ opp_hand: document.getElementById("opp_hand"),
+ opp_power_hand: document.getElementById("opp_power_hand"),
+ discard: document.getElementById("discard"),
+ removed: document.getElementById("removed"),
+ table_cards: document.getElementById("table_cards"),
+
+ ceausescu_hand: document.getElementById("ceausescu_hand"),
+ samizdat_card: document.getElementById("samizdat_card"),
+}
+
+function create_country(id, name) {
+ let [ x, y, w, h ] = LAYOUT[name]
+ let xc = Math.round(x + w / 2)
+ let yc = Math.round(y + h / 2)
+
+ let e = document.createElement("div")
+ e.className = "marker demInfl"
+ e.style.left = xc - 25 + "px"
+ e.style.top = yc - 25 + "px"
+ ui.countries[id] = e
+ document.getElementById("markers").appendChild(e)
+}
+
+function create_ui() {
+ ui.layout_xy = []
+ ui.spaces = []
+ ui.dem_inf = []
+ ui.com_inf = []
+
+ for (let s = 1; s <= last_space; ++s) {
+ let info = spaces[s]
+ let [ x, y, w, h ] = LAYOUT[info.ascii_name]
+ let xc = Math.round( x + w / 2 )
+ let yc = Math.round( y + h / 2 )
+ x -= 6
+ y -= 6
+ w += 12
+ h += 12
+
+ ui.layout_xy[s] = [ xc, yc ]
+
+ let space_e = document.createElement("div")
+ register_action(space_e, "space", s)
+ space_e.className = "space " + info.country
+ space_e.style.left = x + "px"
+ space_e.style.top = y + "px"
+ space_e.style.width = w + "px"
+ space_e.style.height = h + "px"
+ ui.spaces[s] = space_e
+
+ let com_e = document.createElement("div")
+ com_e.className = "marker comInfl hide"
+ com_e.style.left = (xc + 32 - 25) + "px"
+ com_e.style.top = (yc + 12 - 25) + "px"
+ ui.com_inf[s] = com_e
+
+ let dem_e = document.createElement("div")
+ dem_e.className = "marker demInfl hide"
+ dem_e.style.left = (xc - 32 - 25) + "px"
+ dem_e.style.top = (yc + 12 - 25) + "px"
+ ui.dem_inf[s] = dem_e
+
+ document.getElementById("spaces").append(space_e)
+ document.getElementById("markers").appendChild(com_e)
+ document.getElementById("markers").appendChild(dem_e)
+ }
- const is_mobile = window.matchMedia("(pointer: coarse)").matches
+ ui.cards = []
for (let c = 1; c <= last_card; ++c) {
+ const card_e = document.createElement("div")
+ register_action(card_e, "card", c)
+ card_e.className = "card event_" + c
+ ui.cards[c] = card_e
+ }
- const hand_card = document.createElement('img');
- hand_card.classList.add('hand_card')
- hand_card.id=`card_${c}`;
- hand_card.src = `cards/e${c}.gif`
- hand_card.my_card = c;
- hand_card.addEventListener('click', on_click_card);
-
- if(!is_mobile) {
- hand_card.addEventListener('mouseenter', () => {
- hover_timeout = setTimeout(() => {
- hand_card.classList.add('zoom');
- }, 500) })
- hand_card.addEventListener('mouseleave', () => {
- clearTimeout(hover_timeout);
- hand_card.classList.remove('zoom');
- });
- }
+ ui.power_cards = []
+ for (let c = 1; c <= last_power_card; ++c) {
+ const power_card_e = document.createElement("div")
+ register_action(power_card_e, "power_card", c)
+ power_card_e.className = "card power_" + c
+ ui.power_cards[c] = power_card_e
+ }
- ui.cards.push(hand_card);
+ ui.events = []
+ for (let id of box_events) {
+ ui.events[id] = document.createElement("div")
+ ui.events[id].id = "event_" + id
+ ui.events[id].className = "marker event aside"
}
-
-
-
- for (let card of power_cards) {
- if (!card) continue;
- const power_card = document.createElement('img');
- power_card.classList.add('power_card');
- power_card.id = `power_card_${card.number}`;
- power_card.src = `cards_2/${card.url}.gif`;
- power_card.my_card = card.number;
- power_card.addEventListener('mousedown', on_click_card);
- ui.power_cards.push(power_card);
+ for (let id of board_events) {
+ ui.events[id] = document.createElement("div")
+ ui.events[id].id = "event_" + id
+ ui.events[id].className = "marker event"
+ document.getElementById("markers").appendChild(ui.events[id])
}
-}
-
-
-
-function is_card_enabled(card) {
- if (view.actions) {
- if (card_action_menu.some(a => view.actions[a] && view.actions[a].includes(card)))
- return true
- if (view.actions.card_select && view.actions.card_select.includes(card))
- return true
- if (view.actions.card && view.actions.card.includes(card))
- return true
- }
- return false
+ ui.countries = []
+ create_country(0, "country_poland")
+ create_country(1, "country_hungary")
+ create_country(2, "country_east_germany")
+ create_country(3, "country_bulgaria")
+ create_country(4, "country_czechoslovakia")
+ create_country(5, "country_romania")
}
// SUPPORTING FUNCTIONS
function on_click_space(evt) {
- if (evt.button === 0) {
- const space = evt.target.my_space;
- //console.log('on_click_space_called with space:', space);
- if (send_action('infl', space)) {
+ if (evt.button === 0) {
+ const space = evt.target.my_space
+ //console.log('on_click_space_called with space:', space);
+ if (send_action("infl", space)) {
//console.log('send_action with infl:', space);
- evt.stopPropagation();
- } else if (send_action('sc', space)) {
+ evt.stopPropagation()
+ } else if (send_action("sc", space)) {
//console.log('send_action with sc:', space);
- evt.stopPropagation();
+ evt.stopPropagation()
} else {
- // console.log('send_action failed for space:', space);
- }
- }
- //hide_popup_menu();
-}
-
-function on_click_card(evt) {
- if (evt.button === 0) {
- const card = evt.target.my_card;
- //console.log('on_click_card_called with card:', card);
- if (is_action('card', card)) {
- //console.log('in action card')
- if (send_action('card', card)) {
- evt.stopPropagation();
- }
- }
- if (is_action('power_card', card)) {
- if (send_action('power_card', card)) {
- evt.stopPropagation();
- }
+ // console.log('send_action failed for space:', space);
}
}
+ //hide_popup_menu();
}
-function is_action(action) {
- //console.log('is_action called with: ', action)
- //console.log('view.actions', view.actions)
- if (view.actions && view.actions[action])
- return true
- return false
-}
-
-function is_card_action(action, card) {
- //console.log('is_card_action called with action', action, 'card', card)
- //console.log('view.actions', view.actions, 'view.actions[action]', view.actions[action])
- if (view.actions && view.actions[action] && view.actions[action].includes(card))
- return true
- return false
-}
-
-function on_log(text) { // eslint-disable-line no-unused-vars
+function on_log(text) {
+ // eslint-disable-line no-unused-vars
let p = document.createElement("div")
if (text.match(/^>/)) {
text = text.substring(1)
- p.className = 'i'
+ p.className = "i"
}
- text = text.replace(/_/g, ' ')
+ text = text.replace(/_/g, " ")
text = text.replace(/C(\d+)/g, sub_card_name)
text = text.replace(/P(\d+)/g, sub_power_card_name)
text = text.replace(/V(\d+)/g, sub_power_card_value)
text = text.replace(/%(\d+)/g, sub_space_name)
text = text.replace(/D[1-6]/g, sub_die)
-
if (text.match(/^\.h1/)) {
text = text.substring(4)
- p.className = 'h1'
- }
- else if (text.match(/^\.h2d/)) {
+ p.className = "h1"
+ } else if (text.match(/^\.h2d/)) {
text = text.substring(5)
- p.className = 'h2 dem'
- }
- else if (text.match(/^\.h2c/)) {
+ p.className = "h2 dem"
+ } else if (text.match(/^\.h2c/)) {
text = text.substring(5)
- p.className = 'h2 com'
- }
- else if (text.match(/^\.h2/)) {
+ p.className = "h2 com"
+ } else if (text.match(/^\.h2/)) {
text = text.substring(4)
- p.className = 'h2'
- }
- else if (text.match(/^\.h3/)) {
+ p.className = "h2"
+ } else if (text.match(/^\.h3/)) {
text = text.substring(4)
- p.className = 'h3'
+ p.className = "h3"
}
p.innerHTML = text
return p
}
-let ui = {
- favicon: document.getElementById('favicon'),
- player: [
- document.getElementById("role_Democrat"),
- document.getElementById("role_Communist"),
- ],
- cards: [ null ],
- power_cards: [null],
- dem_hand_count: document.getElementById("role_stat_dem"),
- com_hand_count: document.getElementById("role_stat_com"),
- deck_length: document.getElementById("deck_length"),
- played_card: 0,
- table_panel: document.getElementById("table_panel"),
- hand_panel: document.getElementById("hand_panel"),
- turn: document.getElementById("turn-tracker"),
- round: document.getElementById("action-round-tracker"),
- stability: document.getElementById("stability-track"),
- dem_TST: document.getElementById("dem-TST"),
- com_TST: document.getElementById("com-TST"),
- vp: document.getElementById("vp"),
- spaces: document.getElementsByClassName("space-area")
+function layout_turn_marker() {
+ let x = 654 + 24 + (view.turn - 1) * 53
+ let y = 80 + 24
+ ui.turn.style.left = (x - 25) + "px"
+ ui.turn.style.top = (y - 25) + "px"
+}
+function layout_round_marker() {
+ let x = 709 + 24 + (view.turn - 1) * 53
+ let y = 142 + 24
+ ui.round.style.left = (x - 25) + "px"
+ ui.round.style.top = (y - 25) + "px"
+ if (view.round_player === "Democrat") // TODO: bit flag?
+ ui.round.className = "marker dem"
+ else
+ ui.round.className = "marker com"
}
+function layout_stability_marker() {
+ let x = 24 + 1381
+ let y = 24 + 1081 + view.stability * 54
+ ui.stability.style.left = (x - 25) + "px"
+ ui.stability.style.top = (y - 25) + "px"
+}
-function on_update() {
- //console.log('on_update called')
- //console.log('view.valid_spaces: ', view.valid_spaces)
- //console.log('view.actions: ', view.actions)
- //console.log('view.power_cards:', view.power_cards)
- document.querySelectorAll('[id^="space_"].selected').forEach(spaceElement => {spaceElement.classList.remove('selected');});
- document.getElementById("power_hand")?.querySelectorAll('.selected').forEach(cardElement => {cardElement.classList.remove('selected');});
- view.valid_spaces.forEach(space_id => {
- const spaceElementId = `space_${space_id}`;
- const spaceElement = document.getElementById(spaceElementId);
-
- if (spaceElement) {
- spaceElement.classList.add('selected');
- }
- });
-
- //Check influence values
-
- for (let i = 1; i < spaces.length; i ++) {
-
- const space = spaces[i]
- const demInfl = view.demInfl[i]
- const comInfl = view.comInfl[i]
- //console.log('piece', piece)
- //console.log('space', space)
- const dem_marker = document.getElementById(`${space.name_unique}_demInfl`);
- const dem_number = document.getElementById(`${space.name_unique}_demInflValue`);
- const com_marker = document.getElementById(`${space.name_unique}_comInfl`);
- const com_number = document.getElementById(`${space.name_unique}_comInflValue`);
-
- dem_number.innerText=demInfl
- if (demInfl > 0) {
- dem_marker.style.display = 'block';
- dem_number.style.display = 'block';
-
- if (demInfl > 9) {
- dem_number.classList.remove('demInflValue')
- dem_number.classList.add('demInflValue_10')
- } else {
- dem_number.classList.add('demInflValue')
- dem_number.classList.remove('demInflValue_10')
- }
-
- if(check_dem_control(demInfl, comInfl, space)){
- dem_marker.classList.add('controlled')
- dem_number.classList.add('outlined_text')
- dem_marker.classList.remove('uncontrolled')
- } else {
- dem_marker.classList.add('uncontrolled')
- dem_marker.classList.remove('controlled')
- dem_number.classList.remove('outlined_text')
- }
- } else {
- dem_marker.style.display = 'none';
- dem_number.style.display = 'none';
- }
- com_number.innerText=comInfl
- if (comInfl > 0) {
- com_marker.style.display = 'block';
- com_number.style.display = 'block';
-
- if (comInfl > 9) {
- com_number.classList.remove('comInflValue')
- com_number.classList.add('comInflValue_10')
- } else {
- com_number.classList.add('comInflValue')
- com_number.classList.remove('comInflValue_10')
- }
-
- if(check_com_control(demInfl, comInfl, space)){
- com_marker.classList.add('controlled')
- com_number.classList.add('controlled')
- com_marker.classList.remove('uncontrolled')
- com_number.classList.remove('uncontrolled')
- } else {
- com_marker.classList.add('uncontrolled')
- com_number.classList.add('uncontrolled')
- com_marker.classList.remove('controlled')
- com_number.classList.remove('controlled')
- }
- } else {
- com_marker.style.display = 'none';
- com_number.style.display = 'none';
- }
-
- }
+let TST_X = [ 53, 53+69, 53+69*2, 53+69*3, 53+69*4, 53+69*5, 53+69*6, 556 ]
+let TST_Y = [ 2128, 2257 ]
-// UPDATE COUNTRY MARKERS
- for (let i = 0; i < countries.length; i++) {
- const country = countries[i];
- const marker = document.getElementById(country)
- const times_held = document.getElementById(`${country}_times_held`)
-
- if (view.revolutions[find_country_index(country)]) {
- marker.classList.add('revolution')
- marker.classList.remove('held')
- marker.style.display = 'block'
- times_held.classList.add('outlined_text')
- times_held.classList.remove('hide')
- } else if (view.times_held[find_country_index(country)] > 0 ) {
- //console.log('setting ', country)
- marker.classList.add('held')
- marker.style.display = 'block'
- times_held.classList.remove('hide')
- times_held.innerHTML = view.times_held[find_country_index(country)]
- }
- else {marker.style.display = 'none'}
- }
+function layout_tst_marker(e, v, top) {
+ let x = TST_X[v] + 24
+ let y = TST_Y[top] + 24
+ e.style.left = (x - 25) + "px"
+ e.style.top = (y - 25) + "px"
+}
-// UPDATE ASIDE
- if (view.is_pwr_struggle) {
- ui.dem_hand_count.innerText = `${view.democrat_power_hand} Power cards`
- ui.com_hand_count.innerText = `${view.communist_power_hand} Power cards`
- } else{
- ui.dem_hand_count.innerText = `${view.democrat_hand} cards`
- ui.com_hand_count.innerText = `${view.communist_hand} cards`
+function layout_vp_marker() {
+ let x, y
+ if (view.vp === 0) {
+ y = 2425 + 25
+ x = 843 + 28
}
- ui.deck_length.innerText = `${view.strategy_deck} cards`
-
-// UPDATE HAND
- document.getElementById("hand").replaceChildren()
- document.getElementById("played_card").replaceChildren()
-
- if (view.hand.length && view.is_pwr_struggle === false) {
- document.getElementById("hand_panel").classList.remove("hide")
- //console.log('view.actions.card', view.actions.card)
- for (let c of view.hand) {
- let card = ui.cards[c]
- document.getElementById("hand").appendChild(card);
- if (view.actions && view.actions.card && view.actions.card.includes(c)) {
- card.classList.add('action')
- } else {
- card.classList.remove('action')
- }
- if (view.valid_cards.includes(c)) {
- card.classList.add('selected')
- } else {
- card.classList.remove('selected')
- }
- card.classList.remove('discard_card')
+ else if (view.vp < 0) {
+ if (view.vp & 1) {
+ y = 2456 + 25
+ x = 803 + 28 - (-view.vp - 1)/2 * 62
+ } else {
+ y = 2395 + 25
+ x = 772 + 28 - (-view.vp - 2)/2 * 62
}
- } else {
- document.getElementById("hand_panel").classList.add("hide")
- }
-
-// UPDATE DISCARD
-document.getElementById("discard").replaceChildren()
-if (!view.is_pwr_struggle) {
- for (let c of view.strategy_discard) {
- let discard_card = ui.cards[c]
- document.getElementById("discard").appendChild(discard_card)
- discard_card.classList.add('discard_card')
- discard_card.classList.remove('selected')
- }
-} else if (view.is_pwr_struggle) {
- for (let c of view.strategy_discard) {
- let discard_card = ui.power_cards[c]
- document.getElementById("discard").appendChild(discard_card)
- discard_card.classList.add('discard_card')
- discard_card.classList.remove('selected')
}
-}
-
-// DISCARD FOR EVENTS
-//console.log('view.discard',view.discard)
-if(view.discard) {
- //document.getElementById("discard").replaceChildren()
- document.getElementById("discard_panel").classList.remove("hide")
- for (let c of view.strategy_discard) {
- let discard_card = ui.cards[c]
- document.getElementById("discard").appendChild(discard_card)
- discard_card.classList.add('discard_card')
- if (view.valid_cards.includes(c)) {
- discard_card.classList.add('selected')
+ else if (view.vp > 0) {
+ if (view.vp & 1) {
+ y = 2396 + 25
+ x = 883 + 28 + (view.vp - 1)/2 * 62
} else {
- discard_card.classList.remove('selected')
+ y = 2455 + 25
+ x = 913 + 28 + (view.vp - 2)/2 * 62
}
- }
-} else {
- if (!show_discard) {
- document.getElementById("discard_panel").classList.add("hide")
+ }
+ ui.vp.style.left = (x - 25) + "px"
+ ui.vp.style.top = (y - 25) + "px"
+}
+
+function layout_country(id) {
+ for (let i = 0; i < 6; i++) {
+ // TODO: what number to display?
+ if (view.revolutions[id])
+ ui.countries[id].className = "marker comInfl ctl v" + view.times_held[id]
+ else if (view.times_held[id] > 0)
+ ui.countries[id].className = "marker demInfl ctl v" + view.times_held[id]
+ else
+ ui.countries[id].className = "marker hide"
}
}
-// UPDATE PERMANENTLY REMOVED CARDS
-document.getElementById("removed").replaceChildren()
-for (let c of view.strategy_removed) {
- let discard_card = ui.cards[c]
- document.getElementById("removed").appendChild(discard_card)
- discard_card.classList.add('discard_card')
- discard_card.classList.remove('selected')
-}
-
-
-// PLAYED CARD PANEL
-if (view.played_card > 0) {
- document.getElementById("played_card_panel").classList.remove("hide")
- document.getElementById("played_card").appendChild(ui.cards[view.played_card]);
- document.getElementById("played_card").classList.remove("hand_card")
-} else {
- document.getElementById("played_card_panel").classList.add("hide")
-}
-
-// TABLE CARDS PANEL
-document.getElementById("table_cards").replaceChildren()
-if (view.table_cards.length > 0) {
- document.getElementById("table_panel").classList.remove("hide")
- for (let c of view.table_cards) {
- let card = ui.cards[c]
- document.getElementById("table_cards").appendChild(card);
- card.classList.remove("hand_card")
- card.classList.add('event_card');
- }
- } else {
- document.getElementById("table_panel").classList.add("hide")
-}
+function on_update() {
+ if (!ui.spaces)
+ create_ui()
-// OPPONENT HAND
-document.getElementById("opp_hand").replaceChildren()
-if (!view.is_pwr_struggle) {
- if (view.show_opp_hand && view.opp_hand.length >0) {
- document.getElementById("opp_hand_panel").classList.remove("hide")
- for (let c of view.opp_hand) {
- let card = ui.cards[c]
- document.getElementById("opp_hand").appendChild(card);
- card.classList.remove('discard_card')
- if (!view.is_pwr_struggle) {
- if (view.valid_cards.includes(c)) {
- card.classList.add('selected')
- } else {
- card.classList.remove('selected')
- }
- }
- }
+ // UPDATE ASIDE
+ if (view.is_pwr_struggle) {
+ roles.Democrat.stat.textContent = `${view.democrat_power_hand} Power cards`
+ roles.Communist.stat.textContent = `${view.communist_power_hand} Power cards`
} else {
- document.getElementById("opp_hand_panel").classList.add("hide")
+ roles.Democrat.stat.textContent = `${view.democrat_hand} cards`
+ roles.Communist.stat.innerText = `${view.communist_hand} cards`
}
-} else {
- //console.log('power struggle, show opp hand', view.show_opp_hand, 'view opp hand', view.opp_hand )
- if (view.show_opp_hand && view.opp_hand && view.opp_hand.length > 0) {
- document.getElementById("opp_hand_panel").classList.remove("hide")
- for (let c of view.opp_hand) {
- let card = ui.power_cards[c]
- //console.log('power_card:', power_card)
- document.getElementById("opp_hand").appendChild(card);
- card.classList.remove('discard_card')
- }
+ ui.turn_info.innerText = `Strategy deck: ${view.strategy_deck} cards`
+
+ // UPDATE TRACK MARKERS
+ layout_turn_marker()
+ layout_round_marker()
+ layout_stability_marker()
+ layout_vp_marker()
+ layout_tst_marker(ui.dem_tst, view.dem_tst, 0)
+ layout_tst_marker(ui.com_tst, view.com_tst, 1)
+
+ // UPDATE EVENT MARKERS ON THE BOARD
+
+ if (view.persistent_events.includes(2))
+ ui.events[2].style.display = "block"
+ else
+ ui.events[2].style.display = "none"
+
+ if (view.persistent_events.includes(9))
+ ui.events[9].style.display = "block"
+ else
+ ui.events[9].style.display = "none"
+
+ if (view.persistent_events.includes(69)) {
+ ui.events[69].style.display = "block"
+ ui.events[69].style.left = ui.layout_xy[view.systematization][0] - 25 + "px"
+ ui.events[69].style.top = ui.layout_xy[view.systematization][1] - 25 + "px"
} else {
- document.getElementById("opp_hand_panel").classList.add("hide")
+ ui.events[69].style.display = "none"
}
-}
-// POWER STRUGGLE HAND
- document.getElementById("power_hand").replaceChildren()
-
- if (view.power_hand.length && view.is_pwr_struggle) {
- document.getElementById("power_panel").classList.remove("hide")
- for (let c of view.power_hand) {
- let power_card = ui.power_cards[c]
- document.getElementById("power_hand").appendChild(power_card);
- power_card.classList.remove('discard_card')
- if (view.valid_cards.includes(c)) {
- power_card.classList.add('selected');
- }
- }
+ if (view.persistent_events.includes(97)) {
+ ui.events[97].style.display = "block"
+ ui.events[97].style.left = ui.layout_xy[view.the_tyrant_is_gone][0] - 25 + "px"
+ ui.events[97].style.top = ui.layout_xy[view.the_tyrant_is_gone][1] - 25 + "px"
} else {
- document.getElementById("power_panel").classList.add("hide")
+ ui.events[97].style.display = "none"
}
-// CEAUSESCU
+ // EVENT REMINDER LIST
+
+ ui.event_reminder_list.replaceChildren()
+ for (let id of box_events)
+ if (view.persistent_events.includes(id))
+ ui.event_reminder_list.appendChild(ui.events[id])
+
+ // UPDATE INFLUENCE VALUES
+ for (let s = 1; s <= last_space; ++s) {
+ const demInfl = view.demInfl[s]
+ const comInfl = view.comInfl[s]
+
+ if (demInfl - comInfl >= spaces[s].stability)
+ ui.dem_inf[s].className = "marker demInfl ctl v" + demInfl
+ else if (demInfl > 0)
+ ui.dem_inf[s].className = "marker demInfl v" + demInfl
+ else
+ ui.dem_inf[s].className = "marker demInfl hide"
+
+ if (comInfl - demInfl >= spaces[s].stability)
+ ui.com_inf[s].className = "marker comInfl ctl v" + comInfl
+ else if (comInfl > 0)
+ ui.com_inf[s].className = "marker comInfl v" + comInfl
+ else
+ ui.com_inf[s].className = "marker comInfl hide"
+ }
-if (view.ceausescu_cards && view.ceausescu_cards.length > 0 && view.is_pwr_struggle === true) {
- document.getElementById("ceausescu_panel").classList.remove("hide")
- for (let c of view.ceausescu_cards) {
- let power_card = ui.power_cards[c]
- document.getElementById("ceausescu_hand").appendChild(power_card);
- power_card.classList.remove('discard_card')
+ // UPDATE COUNTRY MARKERS
- }
-} else {
- document.getElementById("ceausescu_panel").classList.add("hide")
-}
+ for (let i = 0; i < 6; ++i)
+ layout_country(i)
-// SAMIZDAT CARD
-if (view.samizdat > 0 ) {
- let samizdat_card = ui.cards[view.samizdat]
- document.getElementById("samizdat_panel").classList.remove("hide")
- document.getElementById("samizdat_card").appendChild(samizdat_card)
-} else {
- document.getElementById("samizdat_panel").classList.add("hide")
-}
+ // UPDATE CARD DISPLAYS
-// UPDATE BOARD MARKERS
- ui.turn.className = `t${view.turn}`
- if (view.round_player === 'Democrat') {
- ui.round.className = `dem-action-round-tracker r${view.round}`
- } else {
- ui.round.className = `com-action-round-tracker r${view.round}`
- }
- ui.stability.className = `s${view.stability}`
- ui.dem_TST.className = `tst${view.dem_tst}`
- ui.com_TST.className = `tst${view.com_tst}`
- if (view.vp >= -20 && view.vp <= 20) {
- ui.vp.className = `vp${view.vp}`
- } else if (view.vp > 20) {
- ui.vp.className = `vp21`
- } else if (view.vp < -20) {
- ui.vp.className = `vp-21`
- }
-
-//console.log('strategy discard: ', view.strategy_discard)
-//console.log('valid spaces: ', view.valid_spaces)
-
-//console.log('view.persistent_events', view.persistent_events)
+ ui.played_card.replaceChildren()
+ if (view.played_card > 0)
+ ui.played_card.appendChild(ui.cards[view.played_card])
-// UPDATE EVENT MARKERS ON THE BOARD
+ ui.samizdat_card.replaceChildren()
+ if (view.samizdat > 0)
+ ui.samizdat_card.appendChild(ui.cards[view.samizdat])
-for (let id of board_events) {
- let marker = document.getElementById(`event_${id}`)
- //console.log('event', id, marker)
- if (view.persistent_events.includes(id)) {
- marker.style.display = 'block'
- } else {
- marker.style.display = 'none'
- }
-}
+ ui.hand.replaceChildren()
+ for (let c of view.hand)
+ ui.hand.appendChild(ui.cards[c])
+ ui.power_hand.replaceChildren()
+ if (view.power_hand)
+ for (let c of view.power_hand)
+ ui.hand.appendChild(ui.power_cards[c])
-// UPDATE EVENT MARKERS BELOW THE BOARD
+ ui.opp_hand.replaceChildren()
+ if (view.opp_hand)
+ for (let c of view.opp_hand)
+ ui.opp_hand.appendChild(ui.cards[c])
-for (let id of box_events) {
- let marker = document.getElementById(`event_${id}`)
- //console.log('event', id, marker)
- if (view.persistent_events.includes(id)) {
- marker.style.display = 'block'
- } else {
- marker.style.display = 'none'
- }
-}
+ // TODO: fix rules to set view.opp_power_hand
+ ui.opp_power_hand.replaceChildren()
+ if (view.opp_power_hand)
+ for (let c of view.opp_power_hand)
+ ui.opp_hand.appendChild(ui.power_cards[c])
+ ui.ceausescu_hand.replaceChildren()
+ if (view.ceausescu_cards)
+ for (let c of view.ceausescu_cards)
+ ui.ceausescu_hand.appendChild(ui.power_cards[c])
-// CHECK WHETHER ANY EVENT MARKERS ARE SHOWING IN THE EVENTS BOX
-box_events_showing = false
-for (let id of box_events) {
- if (view.persistent_events.includes(id)) {
- box_events_showing = true;
- }
-/*
- //Special check for events which are not true/false
- if (view.persistent_events['foreign_currency_debt_burden'] !== '') {
- aside_events_showing = true
- }
- if (view.persistent_events['stand_fast'] !== '') {
- aside_events_showing = true
- }
- */
-}
+ ui.discard.replaceChildren()
+ for (let c of view.strategy_discard)
+ ui.discard.appendChild(ui.cards[c])
-if (box_events_showing) {
- document.getElementById('events_panel').classList.remove("hide")
-} else {
- document.getElementById('events_panel').classList.add("hide")
-}
+ ui.removed.replaceChildren()
+ for (let c of view.strategy_removed)
+ ui.discard.appendChild(ui.cards[c])
-let systematization = document.getElementById('event_69')
-if (view.persistent_events.includes(69)) {
- systematization.style.left = (spaces[view.systematization].box.x +20) + 'px';
- systematization.style.top = spaces[view.systematization].box.y + 'px';
-}
+ ui.table_cards.replaceChildren()
+ if (view.table_cards)
+ for (let c of view.table_cards)
+ ui.table_cards.appendChild(ui.cards[c])
-let tyrant = document.getElementById('event_97')
-if (view.persistent_events.includes(97)) {
- tyrant.style.left = (spaces[view.the_tyrant_is_gone].box.x - 41) + 'px';
- tyrant.style.top = (spaces[view.the_tyrant_is_gone].box.y + 23) + 'px';
-} else {tyrant.style.display = 'none'}
+ for (let e of action_register)
+ e.classList.toggle("action", is_action(e.my_action, e.my_id))
action_button("yes", "Yes")
action_button("no", "No")
@@ -696,7 +436,7 @@ if (view.persistent_events.includes(97)) {
action_button("strike", "Strike")
action_button("march", "March")
action_button("rally", "Rally in the Square")
- action_button("petition", "Petition")
+ action_button("petition", "Petition")
action_button("bonus", "Calculate VP bonus")
action_button("scoring", "Score country")
action_button("retain", "Retain Power")
@@ -704,9 +444,9 @@ if (view.persistent_events.includes(97)) {
action_button("take", "Take Power")
action_button("concede", "Concede")
action_button("struggle", "Begin power struggle")
- action_button("raise", "Raise the stakes")
- action_button("draw", "Draw")
- action_button("scoring", "Scoring")
+ action_button("raise", "Raise the stakes")
+ action_button("draw", "Draw")
+ action_button("scoring", "Scoring")
action_button("event", "Event")
action_button("opp_event", "Resolve opponent event")
action_button("influence", "Place SPs")
@@ -716,8 +456,6 @@ if (view.persistent_events.includes(97)) {
action_button("done", "Done")
action_button("end_round", "End Round")
action_button("undo", "Undo")
-
-console.log('view.actions', view.actions)
}
// =========================== LOG FUNCTIONS ==============================================
@@ -738,9 +476,8 @@ function sub_power_card_value(match, p1) {
}
function sub_space_name(match, p1) {
- let x = p1 | 0
- let id = spaces[x].space_id
- let name = spaces[x].name_unique
+ let id = p1 | 0
+ let name = spaces[id].name_unique
return `<span class="space_tip" onmouseenter="on_focus_space_tip(${id})" onmouseleave="on_blur_space_tip(${id})" onclick="on_click_space_tip(${id})">${name}</span>`
}
@@ -754,45 +491,32 @@ const die = {
D3: '<span class="die white d3"></span>',
D4: '<span class="die white d4"></span>',
D5: '<span class="die white d5"></span>',
- D6: '<span class="die white d6"></span>'
+ D6: '<span class="die white d6"></span>',
}
// =========================== VISUAL FUNCTIONS ==========================================#
-function on_focus_card_tip(card_number) {
- document.getElementById("tooltip").className = "card card_" + card_number
+function on_focus_card_tip(card_number) {
+ document.getElementById("tooltip").className = "card event_" + card_number
}
-function on_blur_card_tip() {
+function on_blur_card_tip() {
document.getElementById("tooltip").classList = "card hide"
}
function on_focus_space_tip(id) {
- space = document.getElementById(`space_${id}`)
- space.classList.add("tip")
-}
-
-function on_click_space_tip(id) {
- space = document.getElementById(`space_${id}`)
- scroll_into_view(space)
+ ui.spaces[id].classList.add("tip")
}
function on_blur_space_tip(id) {
- space = document.getElementById(`space_${id}`)
- space.classList.remove("tip")
+ ui.spaces[id].classList.remove("tip")
}
-function toggle_pieces() {
- document.getElementById("pieces").classList.toggle("hide")
+function on_click_space_tip(id) {
+ scroll_into_view(ui.spaces[id])
}
-
function toggle_discard() {
- if (show_discard) {
- show_discard = false
- } else {
- show_discard = true
- }
document.getElementById("discard_panel").classList.toggle("hide")
}
@@ -800,20 +524,118 @@ function toggle_removed() {
document.getElementById("removed_panel").classList.toggle("hide")
}
-function check_dem_control(demInfl, comInfl, space) {
- if ((demInfl - comInfl) >= space.stability) {
- return true
- } else{ false}
-}
-
-function check_com_control(demInfl, comInfl, space) {
- if ((comInfl - demInfl) >= space.stability) {
- return true
- } else{ false}
-}
-
function find_country_index(country) {
return countries.indexOf(country)
}
-create_ui()
+// #region GENERATED LAYOUT DATA
+
+var LAYOUT = {
+ "Babes-Bolyai University": [958,1529,127,75],
+ "Berlin": [329,148,127,75],
+ "Bialystok": [1202,436,127,76],
+ "Brasov": [1339,1556,127,75],
+ "Bratislava": [539,1013,127,76],
+ "Brno": [521,904,127,76],
+ "Bucuresti": [1186,1837,127,76],
+ "Budapest": [809,1249,127,76],
+ "Bulgarian Writers": [838,2192,127,76],
+ "Burgas": [1289,2152,127,76],
+ "Bydgoszcz": [872,388,127,76],
+ "Catholic Church, Czechoslovakia": [692,1010,127,75],
+ "Catholic Church, Hungary": [409,1126,127,76],
+ "Catholic Church, Poland": [802,558,127,75],
+ "Ceske Budejovice": [260,765,127,77],
+ "Charles University": [491,677,128,76],
+ "Cluj-Napoca": [970,1429,127,76],
+ "Constanta": [1443,1925,127,76],
+ "Craiova": [977,1793,127,76],
+ "Czech Writers": [573,773,127,76],
+ "Debrecen": [1000,1192,127,76],
+ "Dresden": [343,479,127,76],
+ "Eotvos Lorand University": [658,1314,127,76],
+ "Erfurt": [38,455,127,76],
+ "Galati": [1409,1778,127,76],
+ "Gdansk": [896,277,127,76],
+ "German Writers": [81,239,127,76],
+ "Gyor": [560,1129,127,76],
+ "Halle": [231,357,127,75],
+ "Harghita/Covasna": [1186,1560,127,75],
+ "Hungarian Writers": [452,1322,127,76],
+ "Iasi": [1369,1395,127,76],
+ "Jagiellonian University": [870,867,127,76],
+ "Karl-Marx-Stadt": [184,492,127,75],
+ "Katowice": [733,723,127,76],
+ "Kosice": [995,1037,127,76],
+ "Krakow": [911,761,127,76],
+ "Leipzig": [387,379,127,76],
+ "Lodz": [959,620,127,76],
+ "Lublin": [1124,754,127,76],
+ "Lutheran Church": [391,271,127,76],
+ "Magdeburg": [79,352,127,75],
+ "Miskolc": [851,1146,127,76],
+ "Orthodox Church, Bulgaria": [1130,1956,127,76],
+ "Orthodox Church, Romania": [1094,1700,127,76],
+ "Ostrava": [673,868,127,75],
+ "Pecs": [626,1406,127,75],
+ "Pleven": [979,1948,127,76],
+ "Ploiesti": [1356,1671,127,76],
+ "Plovdiv": [987,2209,127,75],
+ "Plzen": [211,615,127,76],
+ "Polish Writers": [1051,883,127,75],
+ "Poznan": [671,452,127,76],
+ "Praha": [412,782,127,75],
+ "Presov": [844,1010,127,75],
+ "Razgrad": [1219,2057,127,76],
+ "Romanian Writers": [947,1625,127,75],
+ "Rostock": [299,53,127,76],
+ "Ruse": [1277,1956,127,76],
+ "Schwerin": [148,86,127,76],
+ "Sliven": [1144,2251,127,75],
+ "Sofia": [983,2098,127,76],
+ "Sofia University": [828,2095,127,76],
+ "Stara Zagora": [1133,2153,127,75],
+ "Szczecin": [574,263,127,75],
+ "Szeged": [812,1364,127,76],
+ "Szekesfehervar": [571,1223,127,75],
+ "Szombathely": [410,1224,127,76],
+ "Targu Mures": [1169,1443,127,76],
+ "Tatabanya": [706,1126,127,75],
+ "Timisoara": [767,1531,127,76],
+ "Varna": [1387,2051,127,76],
+ "Walter Ulbricht Academy": [234,240,127,76],
+ "Warszawa": [1032,490,127,75],
+ "Wroclaw": [595,565,127,75],
+ "action_1": [708,143,48,44],
+ "action_8": [1080,143,47,43],
+ "country_bulgaria": [915,1999,46,41],
+ "country_czechoslovakia": [463,624,44,39],
+ "country_east_germany": [560,160,43,37],
+ "country_hungary": [1034,1319,44,39],
+ "country_poland": [1188,292,44,39],
+ "country_romania": [1287,1349,44,39],
+ "event_solidarity_legalized": [779,270,44,43],
+ "event_the_wall": [222,179,40,41],
+ "tst_com_1": [53,2257,47,47],
+ "tst_com_7": [469,2257,47,47],
+ "tst_com_8": [556,2257,47,47],
+ "tst_dem_1": [53,2128,47,47],
+ "tst_dem_7": [469,2128,47,47],
+ "tst_dem_8": [556,2128,47,47],
+ "turn_1": [655,81,47,48],
+ "turn_10": [1133,80,48,48],
+ "ussr_1": [1381,1080,48,48],
+ "ussr_2": [1381,1134,48,48],
+ "ussr_3": [1381,1188,48,48],
+ "ussr_4": [1381,1243,48,48],
+ "ussr_5": [1381,1297,48,48],
+ "vp_0": [843,2425,55,51],
+ "vp_1": [883,2395,55,50],
+ "vp_19": [1440,2395,55,50],
+ "vp_2": [913,2455,56,51],
+ "vp_20": [1471,2455,55,51],
+ "vp_neg_1": [803,2455,56,51],
+ "vp_neg_19": [246,2456,55,50],
+ "vp_neg_2": [772,2395,56,51],
+ "vp_neg_20": [215,2395,55,51],
+}
diff --git a/rules.js b/rules.js
index 877c4d8..6ce54dd 100644
--- a/rules.js
+++ b/rules.js
@@ -268,18 +268,13 @@ exports.view = function(state, player) {
// === ACTIONS ===========
function gen_action(action, argument) {
-//console.log('gen_action called with ', action, ' and ', argument)
if (argument === undefined) {
- //console.log('argument undefined')
view.actions[action] = 1
} else {
- if (!(action in view.actions)) {
- //console.log('push argument')
+ if (!(action in view.actions))
view.actions[action] = []
- }
view.actions[action].push(argument)
}
- //console.log('view.actions: ', view.actions, 'view.actions[action]: ', view.actions[action])
}
function gen_action_space(space){
@@ -9013,6 +9008,7 @@ states.vm_support_falters = {
/* =================== EVENTS ================================ */
// #region GENERATED EVENT CODE
+
const CODE = []
CODE[1] = [ // Legacy of Martial Law*
@@ -9875,43 +9871,44 @@ CODE[110] = [ // Malta Summit*
[ vm_remove_opp_infl, 5 ],
[ vm_return ],
]
-// #endregion
-
-// ============= TIANANMEN SQUARE TRACK AWARDS ====================
-CODE[203] = [//Tiananmen Square space 3 award
- [vm_tst_3],
- [vm_return]
-]
-CODE[204] = [//Tiananmen Square space 4 award
- [vm_valid_spaces_opponent],
- [vm_tst_4],
- [vm_return]
+CODE[203] = [ // Tiananmen Square space 3 award
+ [ vm_tst_3 ],
+ [ vm_return ],
]
-CODE[206] = [//Tiananmen Square space 6
- [vm_valid_spaces_sc],
- [vm_tst_6],
- [vm_return]
+
+CODE[204] = [ // Tiananmen Square space 4 award
+ [ vm_valid_spaces_opponent ],
+ [ vm_tst_4 ],
+ [ vm_return ],
]
-CODE[208] = [//Tiananmen Square space 8 event
- [vm_tst_8],
- [vm_return]
+
+CODE[206] = [ // Tiananmen Square space 6
+ [ vm_valid_spaces_sc ],
+ [ vm_tst_6 ],
+ [ vm_return ],
]
-// ============= POWER STRUGGLE WILDCARDS =========================
+CODE[208] = [ // Tiananmen Square space 8 event
+ [ vm_tst_8 ],
+ [ vm_return ],
+]
-CODE[349] = [//Scare Tactics
- [vm_scare_tactics],
- [vm_valid_spaces_country_opp],
- [vm_prompt, ()=>` from ${country_name(game.vm_active_country)}`],
- [vm_remove_opp_infl, 1],
- [vm_return]
+CODE[349] = [ // Scare Tactics
+ [ vm_scare_tactics ],
+ [ vm_valid_spaces_country_opp ],
+ [ vm_prompt, ()=>` from ${country_name(game.vm_active_country)}` ],
+ [ vm_remove_opp_infl, 1 ],
+ [ vm_return ],
]
-CODE[350] = [//Support Surges
- [vm_support_surges],
- [vm_return]
+
+CODE[350] = [ // Support Surges
+ [ vm_support_surges ],
+ [ vm_return ],
]
-CODE[351] = [//Support Falters
- [vm_support_falters],
- [vm_return]
+
+CODE[351] = [ // Support Falters
+ [ vm_support_falters ],
+ [ vm_return ],
]
+// #endregion
diff --git a/tools/colors.js b/tools/colors.js
new file mode 100644
index 0000000..f8f7ace
--- /dev/null
+++ b/tools/colors.js
@@ -0,0 +1,110 @@
+"use strict"
+
+function rgb_from_any(color) {
+ switch (color.mode) {
+ case "rgb": return color
+ case "lrgb": return rgb_from_lrgb(color)
+ case "oklab": return rgb_from_oklab(color)
+ }
+}
+
+function lrgb_from_any(color) {
+ switch (color.mode) {
+ case "rgb": return lrgb_from_rgb(color)
+ case "lrgb": return color
+ case "oklab": return lrgb_from_oklab(color)
+ }
+}
+
+function oklab_from_any(color) {
+ switch (color.mode) {
+ case "rgb": return oklab_from_rgb(color)
+ case "lrgb": return oklab_from_lrgb(color)
+ case "oklab": return color
+ }
+}
+
+function format_hex(color) {
+ let {r, g, b} = rgb_from_any(color)
+ let adj = 1
+ r = Math.round(Math.max(0, Math.min(1, r)) * 255)
+ g = Math.round(Math.max(0, Math.min(1, g)) * 255)
+ b = Math.round(Math.max(0, Math.min(1, b)) * 255)
+ let x = (r << 16) | (g << 8) | b
+ return "#" + x.toString(16).padStart(6, "0")
+}
+
+function parse_hex(str) {
+ let x = parseInt(str.substring(1), 16)
+ return {
+ mode: "rgb",
+ r: ((x >> 16) & 255) / 255.0,
+ g: ((x >> 8) & 255) / 255.0,
+ b: ((x) & 255) / 255.0
+ }
+}
+
+function lrgb_from_rgb({ r, g, b }) {
+ function to_linear(c) {
+ let ac = Math.abs(c)
+ if (ac < 0.04045)
+ return c / 12.92
+ return (Math.sign(c) || 1) * Math.pow((ac + 0.055) / 1.055, 2.4)
+ }
+ return {
+ mode: "lrgb",
+ r: to_linear(r),
+ g: to_linear(g),
+ b: to_linear(b)
+ }
+}
+
+function rgb_from_lrgb({ r, g, b }) {
+ function from_linear(c) {
+ let ac = Math.abs(c)
+ if (ac > 0.0031308)
+ return (Math.sign(c) || 1) * (1.055 * Math.pow(ac, 1 / 2.4) - 0.055)
+ return c * 12.92
+ }
+ return {
+ mode: "rgb",
+ r: from_linear(r),
+ g: from_linear(g),
+ b: from_linear(b)
+ }
+}
+
+function oklab_from_lrgb({ r, g, b }) {
+ let L = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b)
+ let M = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b)
+ let S = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b)
+ return {
+ mode: "oklab",
+ l: 0.2104542553 * L + 0.793617785 * M - 0.0040720468 * S,
+ a: 1.9779984951 * L - 2.428592205 * M + 0.4505937099 * S,
+ b: 0.0259040371 * L + 0.7827717662 * M - 0.808675766 * S
+ }
+}
+
+function lrgb_from_oklab({ l, a, b }) {
+ let L = Math.pow(l + 0.3963377774 * a + 0.2158037573 * b, 3)
+ let M = Math.pow(l - 0.1055613458 * a - 0.0638541728 * b, 3)
+ let S = Math.pow(l - 0.0894841775 * a - 1.291485548 * b, 3)
+ return {
+ mode: "lrgb",
+ r: +4.0767416621 * L - 3.3077115913 * M + 0.2309699292 * S,
+ g: -1.2684380046 * L + 2.6097574011 * M - 0.3413193965 * S,
+ b: -0.0041960863 * L - 0.7034186147 * M + 1.707614701 * S
+ }
+}
+
+function oklab_from_rgb(rgb) {
+ return oklab_from_lrgb(lrgb_from_rgb(rgb))
+}
+
+function rgb_from_oklab(oklab) {
+ return rgb_from_lrgb(lrgb_from_oklab(oklab))
+}
+
+if (typeof module === "object")
+ module.exports = { format_hex, parse_hex, rgb_from_any, lrgb_from_any, oklab_from_any }
diff --git a/gencode.js b/tools/gencode.js
index 6e66a02..f2e3a26 100644
--- a/gencode.js
+++ b/tools/gencode.js
@@ -64,7 +64,6 @@ function emit(line) {
console.log("\t[ " + line.join(", ") + " ],")
}
-console.log("// #region GENERATED EVENT CODE")
console.log("const CODE = []")
let first = false
@@ -104,4 +103,4 @@ for (let line of fs.readFileSync("events.txt", "utf-8").split("\n")) {
emit(["return"])
console.log("]")
-console.log("// #endregion") \ No newline at end of file
+console.log("// #endregion")
diff --git a/tools/gencolors.js b/tools/gencolors.js
new file mode 100644
index 0000000..5904741
--- /dev/null
+++ b/tools/gencolors.js
@@ -0,0 +1,78 @@
+const { parse_hex, format_hex, lrgb_from_any, rgb_from_any, oklab_from_any } = require("./colors.js")
+
+const white = "#ffffff"
+const black = "#000000"
+
+function lerp(a, b, n) {
+ return a + (b - a) * n
+}
+
+function blend(a, b, n) {
+ a = lrgb_from_any(parse_hex(a))
+ b = lrgb_from_any(parse_hex(b))
+ return format_hex({
+ mode: "lrgb",
+ r: lerp(a.r, b.r, n),
+ g: lerp(a.g, b.g, n),
+ b: lerp(a.b, b.b, n)
+ })
+}
+
+function multiply_luminance(hex, m) {
+ let oklab = oklab_from_any(parse_hex(hex))
+ oklab.l = Math.max(0, Math.min(1, oklab.l * m))
+ return format_hex(oklab)
+}
+
+function add_luminance(hex, m) {
+ let oklab = oklab_from_any(parse_hex(hex))
+ oklab.l = Math.max(0, Math.min(1, oklab.l + m))
+ return format_hex(oklab)
+}
+
+function make_3d_colors(base) {
+ return [
+ base,
+ multiply_luminance(base, 0.9),
+ multiply_luminance(base, 0.8),
+ multiply_luminance(base, 0.7),
+ multiply_luminance(base, 0.4)
+ ]
+}
+
+function make_2d_colors(base) {
+ return [
+ base,
+ multiply_luminance(base, 1.2),
+ multiply_luminance(base, 0.8),
+ multiply_luminance(base, 0.4)
+ ]
+}
+
+function make_2d_colors_add(base) {
+ return [
+ base,
+ add_luminance(base, 0.2),
+ add_luminance(base, -0.2),
+ add_luminance(base, -0.5),
+ ]
+}
+
+function print(x) {
+ console.log(x)
+}
+
+function gencss(color, sel) {
+ let [ bg, hi, lo, sh ] = make_2d_colors(color)
+ print(`${sel} { background-color: ${color}; border-color: ${hi} ${lo} ${lo} ${hi}; box-shadow: 0 0 0 1px ${sh}, 1px 2px 4px #0008; }`)
+}
+
+gencss("#bbbbbb", ".marker")
+gencss("#c4e2f6", ".demInfl.ctl")
+gencss("#c1272d", ".comInfl.ctl")
+gencss("#147fc0", "#marker_action_round.com")
+gencss("#c1272d", "#marker_action_round.dem")
+gencss("#fadb04", "#marker_vp, #marker_turn")
+gencss("#f26649", "#marker_com_tst")
+gencss("#c4e2f4", "#marker_dem_tst")
+
diff --git a/tools/genlayout.js b/tools/genlayout.js
new file mode 100644
index 0000000..37f419d
--- /dev/null
+++ b/tools/genlayout.js
@@ -0,0 +1,37 @@
+const fs = require("fs")
+
+let boxes = []
+let mode, name, x, y, w, h
+
+function flush() {
+ if (mode === 'rect') {
+ boxes[name] = [ x |0, y |0, w |0, h |0 ]
+ }
+ x = y = w = h = 0
+ name = null
+}
+
+for (let line of fs.readFileSync("tools/layout.svg", "utf-8").split("\n")) {
+ line = line.trim()
+ if (line.startsWith("<rect")) {
+ flush()
+ mode = "rect"
+ x = y = w = h = 0
+ } else if (line.startsWith('x="'))
+ x = Math.round(Number(line.split('"')[1]))
+ else if (line.startsWith('y="'))
+ y = Math.round(Number(line.split('"')[1]))
+ else if (line.startsWith('width="'))
+ w = Math.round(Number(line.split('"')[1]))
+ else if (line.startsWith('height="'))
+ h = Math.round(Number(line.split('"')[1]))
+ else if (line.startsWith('inkscape:label="'))
+ name = line.split('"')[1]
+}
+
+flush()
+
+console.log("var LAYOUT = {")
+for (let key of Object.keys(boxes).sort())
+ console.log("\t\"" + key + "\": " + JSON.stringify(boxes[key]) + ",")
+console.log("}")
diff --git a/tools/layout.svg b/tools/layout.svg
new file mode 100644
index 0000000..36c6045
--- /dev/null
+++ b/tools/layout.svg
@@ -0,0 +1,920 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1650"
+ height="2550"
+ version="1.1"
+ id="svg6"
+ sodipodi:docname="layout.svg"
+ inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+ <metadata
+ id="metadata12">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs10" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="480"
+ id="namedview8"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="1183.328"
+ inkscape:cy="683.50131"
+ inkscape:current-layer="svg6"
+ inkscape:snap-grids="true"
+ inkscape:document-rotation="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid14" />
+ </sodipodi:namedview>
+ <image
+ sodipodi:absref="/home/tor/src/rally/public/1989-dawn-of-freedom/map75.png"
+ xlink:href="../map75.png"
+ style="display:inline;opacity:1"
+ id="image2"
+ sodipodi:insensitive="true"
+ image-rendering="pixelated"
+ height="2550"
+ width="1650"
+ y="0"
+ x="0" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect16"
+ width="127"
+ height="76"
+ x="148"
+ y="86"
+ inkscape:label="Schwerin" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect18"
+ width="127"
+ height="76"
+ x="299"
+ y="53"
+ inkscape:label="Rostock" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect22"
+ width="127"
+ height="75"
+ x="329"
+ y="148"
+ inkscape:label="Berlin" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect26"
+ width="127"
+ height="76"
+ x="81"
+ y="239"
+ inkscape:label="German Writers" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect28"
+ width="127"
+ height="76"
+ x="234"
+ y="240"
+ inkscape:label="Walter Ulbricht Academy" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect30"
+ width="127"
+ height="76"
+ x="391"
+ y="271"
+ inkscape:label="Lutheran Church" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect32"
+ width="127"
+ height="75"
+ x="574"
+ y="263"
+ inkscape:label="Szczecin" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect36"
+ width="127"
+ height="76"
+ x="896"
+ y="277"
+ inkscape:label="Gdansk" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect38"
+ width="127"
+ height="75"
+ x="79"
+ y="352"
+ inkscape:label="Magdeburg" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect40"
+ width="127"
+ height="75"
+ x="231"
+ y="357"
+ inkscape:label="Halle" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect42"
+ width="127"
+ height="76"
+ x="38"
+ y="455"
+ inkscape:label="Erfurt" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect44"
+ width="127"
+ height="75"
+ x="184"
+ y="492"
+ inkscape:label="Karl-Marx-Stadt" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect46"
+ width="127"
+ height="76"
+ x="343"
+ y="479"
+ inkscape:label="Dresden" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect48"
+ width="127"
+ height="76"
+ x="211"
+ y="615"
+ inkscape:label="Plzen" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect50"
+ width="128"
+ height="76"
+ x="491"
+ y="677"
+ inkscape:label="Charles University" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect54"
+ width="127"
+ height="75"
+ x="595"
+ y="565"
+ inkscape:label="Wroclaw" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect56"
+ width="127"
+ height="75"
+ x="802"
+ y="558"
+ inkscape:label="Catholic Church, Poland" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect58"
+ width="127"
+ height="76"
+ x="959"
+ y="620"
+ inkscape:label="Lodz" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect60"
+ width="127"
+ height="75"
+ x="1032"
+ y="490"
+ inkscape:label="Warszawa" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect62"
+ width="127"
+ height="76"
+ x="671"
+ y="452"
+ inkscape:label="Poznan" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect67"
+ width="127"
+ height="76"
+ x="872"
+ y="388"
+ inkscape:label="Bydgoszcz" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect71"
+ width="127"
+ height="76"
+ x="1202"
+ y="436"
+ inkscape:label="Bialystok" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect75"
+ width="127"
+ height="77"
+ x="260"
+ y="765"
+ inkscape:label="Ceske Budejovice" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect77"
+ width="127"
+ height="75"
+ x="412"
+ y="782"
+ inkscape:label="Praha" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect79"
+ width="127"
+ height="76"
+ x="573"
+ y="773"
+ inkscape:label="Czech Writers" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect81"
+ width="127"
+ height="76"
+ x="733"
+ y="723"
+ inkscape:label="Katowice" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect83"
+ width="127"
+ height="76"
+ x="911"
+ y="761"
+ inkscape:label="Krakow" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect85"
+ width="127"
+ height="76"
+ x="1124"
+ y="754"
+ inkscape:label="Lublin" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect87"
+ width="127"
+ height="76"
+ x="870"
+ y="867"
+ inkscape:label="Jagiellonian University" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect89"
+ width="127"
+ height="75"
+ x="1051"
+ y="883"
+ inkscape:label="Polish Writers" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect91"
+ width="127"
+ height="75"
+ x="673"
+ y="868"
+ inkscape:label="Ostrava" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect97"
+ width="127"
+ height="76"
+ x="521"
+ y="904"
+ inkscape:label="Brno" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect99"
+ width="127"
+ height="76"
+ x="539"
+ y="1013"
+ inkscape:label="Bratislava" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect101"
+ width="127"
+ height="75"
+ x="692"
+ y="1010"
+ inkscape:label="Catholic Church, Czechoslovakia" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect103"
+ width="127"
+ height="75"
+ x="844"
+ y="1010"
+ inkscape:label="Presov" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect105"
+ width="127"
+ height="76"
+ x="995"
+ y="1037"
+ inkscape:label="Kosice" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect109"
+ width="127"
+ height="76"
+ x="409"
+ y="1126"
+ inkscape:label="Catholic Church, Hungary" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect111"
+ width="127"
+ height="76"
+ x="560"
+ y="1129"
+ inkscape:label="Gyor" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect113"
+ width="127"
+ height="75"
+ x="706"
+ y="1126"
+ inkscape:label="Tatabanya" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect115"
+ width="127"
+ height="76"
+ x="851"
+ y="1146"
+ inkscape:label="Miskolc" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect117"
+ width="127"
+ height="76"
+ x="1000"
+ y="1192"
+ inkscape:label="Debrecen" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect119"
+ width="127"
+ height="76"
+ x="410"
+ y="1224"
+ inkscape:label="Szombathely" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect121"
+ width="127"
+ height="75"
+ x="571"
+ y="1223"
+ inkscape:label="Szekesfehervar" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect123"
+ width="127"
+ height="76"
+ x="809"
+ y="1249"
+ inkscape:label="Budapest" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect129"
+ width="127"
+ height="76"
+ x="812"
+ y="1364"
+ inkscape:label="Szeged" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect131"
+ width="127"
+ height="76"
+ x="658"
+ y="1314"
+ inkscape:label="Eotvos Lorand University" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect133"
+ width="127"
+ height="76"
+ x="452"
+ y="1322"
+ inkscape:label="Hungarian Writers" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect135"
+ width="127"
+ height="75"
+ x="626"
+ y="1406"
+ inkscape:label="Pecs" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect137"
+ width="127"
+ height="76"
+ x="1369"
+ y="1395"
+ inkscape:label="Iasi" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect139"
+ width="127"
+ height="76"
+ x="1169"
+ y="1443"
+ inkscape:label="Targu Mures" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect141"
+ width="127"
+ height="76"
+ x="970"
+ y="1429"
+ inkscape:label="Cluj-Napoca" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect143"
+ width="127"
+ height="76"
+ x="767"
+ y="1531"
+ inkscape:label="Timisoara" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect145"
+ width="127"
+ height="75"
+ x="947"
+ y="1625"
+ inkscape:label="Romanian Writers" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect147"
+ width="127"
+ height="75"
+ x="958"
+ y="1529"
+ inkscape:label="Babes-Bolyai University" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect149"
+ width="127"
+ height="75"
+ x="1186"
+ y="1560"
+ inkscape:label="Harghita/Covasna" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect151"
+ width="127"
+ height="75"
+ x="1339"
+ y="1556"
+ inkscape:label="Brasov" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect153"
+ width="127"
+ height="76"
+ x="1356"
+ y="1671"
+ inkscape:label="Ploiesti" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect155"
+ width="127"
+ height="76"
+ x="1409"
+ y="1778"
+ inkscape:label="Galati" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect157"
+ width="127"
+ height="76"
+ x="1186"
+ y="1837"
+ inkscape:label="Bucuresti" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect159"
+ width="127"
+ height="76"
+ x="977"
+ y="1793"
+ inkscape:label="Craiova" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect161"
+ width="127"
+ height="76"
+ x="1094"
+ y="1700"
+ inkscape:label="Orthodox Church, Romania" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect163"
+ width="127"
+ height="76"
+ x="387"
+ y="379"
+ inkscape:label="Leipzig" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect165"
+ width="127"
+ height="76"
+ x="979"
+ y="1948"
+ inkscape:label="Pleven" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect167"
+ width="127"
+ height="76"
+ x="1130"
+ y="1956"
+ inkscape:label="Orthodox Church, Bulgaria" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect169"
+ width="127"
+ height="76"
+ x="1277"
+ y="1956"
+ inkscape:label="Ruse" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect171"
+ width="127"
+ height="76"
+ x="1443"
+ y="1925"
+ inkscape:label="Constanta" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect175"
+ width="127"
+ height="76"
+ x="828"
+ y="2095"
+ inkscape:label="Sofia University" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect177"
+ width="127"
+ height="76"
+ x="983"
+ y="2098"
+ inkscape:label="Sofia" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect179"
+ width="127"
+ height="75"
+ x="1133"
+ y="2153"
+ inkscape:label="Stara Zagora" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect181"
+ width="127"
+ height="76"
+ x="1289"
+ y="2152"
+ inkscape:label="Burgas" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect183"
+ width="127"
+ height="76"
+ x="1219"
+ y="2057"
+ inkscape:label="Razgrad" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect185"
+ width="127"
+ height="76"
+ x="1387"
+ y="2051"
+ inkscape:label="Varna" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect187"
+ width="127"
+ height="75"
+ x="1144"
+ y="2251"
+ inkscape:label="Sliven" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect189"
+ width="127"
+ height="75"
+ x="987"
+ y="2209"
+ inkscape:label="Plovdiv" />
+ <rect
+ style="display:inline;fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect191"
+ width="127"
+ height="76"
+ x="838"
+ y="2192"
+ inkscape:label="Bulgarian Writers" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect207"
+ width="48"
+ height="48"
+ x="1381"
+ y="1080"
+ inkscape:label="ussr_1" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect209"
+ width="48"
+ height="48"
+ x="1381"
+ y="1134"
+ inkscape:label="ussr_2" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect211"
+ width="48"
+ height="48"
+ x="1381"
+ y="1188"
+ inkscape:label="ussr_3" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect213"
+ width="48"
+ height="48"
+ x="1381"
+ y="1243"
+ inkscape:label="ussr_4" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect215"
+ width="48"
+ height="48"
+ x="1381"
+ y="1297"
+ inkscape:label="ussr_5" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect217"
+ width="47"
+ height="47"
+ x="53"
+ y="2128"
+ inkscape:label="tst_dem_1" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect229"
+ width="47"
+ height="47"
+ x="469"
+ y="2128"
+ inkscape:label="tst_dem_7" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect231"
+ width="47"
+ height="47"
+ x="556"
+ y="2128"
+ inkscape:label="tst_dem_8" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect236"
+ width="47"
+ height="47"
+ x="53"
+ y="2257"
+ inkscape:label="tst_com_1" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect248"
+ width="47"
+ height="47"
+ x="469"
+ y="2257"
+ inkscape:label="tst_com_7" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect250"
+ width="47"
+ height="47"
+ x="556"
+ y="2257"
+ inkscape:label="tst_com_8" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect252"
+ width="55"
+ height="51"
+ x="215"
+ y="2395"
+ inkscape:label="vp_neg_20" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect254"
+ width="55"
+ height="50"
+ x="246"
+ y="2456"
+ inkscape:label="vp_neg_19" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect256"
+ width="55"
+ height="51"
+ x="843"
+ y="2425"
+ inkscape:label="vp_0" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect258"
+ width="55"
+ height="50"
+ x="883"
+ y="2395"
+ inkscape:label="vp_1" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect260"
+ width="55"
+ height="50"
+ x="1440"
+ y="2395"
+ inkscape:label="vp_19" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect262"
+ width="55"
+ height="51"
+ x="1471"
+ y="2455"
+ inkscape:label="vp_20" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect264"
+ width="56"
+ height="51"
+ x="913"
+ y="2455"
+ inkscape:label="vp_2" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect266"
+ width="56"
+ height="51"
+ x="803"
+ y="2455"
+ inkscape:label="vp_neg_1" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect268"
+ width="56"
+ height="51"
+ x="772"
+ y="2395"
+ inkscape:label="vp_neg_2" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect24"
+ width="40"
+ height="41"
+ x="222"
+ y="179"
+ inkscape:label="event_the_wall" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect34"
+ width="44"
+ height="43"
+ x="779"
+ y="270"
+ inkscape:label="event_solidarity_legalized" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect193"
+ width="47"
+ height="48"
+ x="655"
+ y="81"
+ inkscape:label="turn_1" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect195"
+ width="48"
+ height="44"
+ x="708"
+ y="143"
+ inkscape:label="action_1" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect203"
+ width="48"
+ height="48"
+ x="1133"
+ y="80"
+ inkscape:label="turn_10" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect205"
+ width="47"
+ height="43"
+ x="1080"
+ y="143"
+ inkscape:label="action_8" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect52"
+ width="44"
+ height="39"
+ x="463"
+ y="624"
+ inkscape:label="country_czechoslovakia" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect69"
+ width="44"
+ height="39"
+ x="1188"
+ y="292"
+ inkscape:label="country_poland" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect73"
+ width="43"
+ height="37"
+ x="560"
+ y="160"
+ inkscape:label="country_east_germany" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect125"
+ width="44"
+ height="39"
+ x="1034"
+ y="1319"
+ inkscape:label="country_hungary" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect127"
+ width="44"
+ height="39"
+ x="1287"
+ y="1349"
+ inkscape:label="country_romania" />
+ <rect
+ style="fill:#00fff2;fill-opacity:0.566802;stroke-width:0.355276"
+ id="rect173"
+ width="46"
+ height="41"
+ x="915"
+ y="1999"
+ inkscape:label="country_bulgaria" />
+</svg>