From 71a1badaa074df9ccb3b93910a556c9e88c75aed Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sat, 1 Jun 2024 11:42:06 +0200 Subject: style --- data.js | 1198 ++++++++++++++++++++++++------------------------- play.css | 63 ++- play.html | 1 + play.js | 880 ++++++++++++++++++++++++++++++++++-- rules.js | 7 +- tools/layout.svg | 104 +++-- tools/parse-layout.js | 12 +- 7 files changed, 1551 insertions(+), 714 deletions(-) diff --git a/data.js b/data.js index 548a938..f6e8426 100644 --- a/data.js +++ b/data.js @@ -1,21 +1,21 @@ const data = { type: { - major_fortress: [ 28, 70, 78, 131, 197, 210, 238, 255, 271, 405, 429, 471, 516, 547, 578 ], + major_fortress: [ 28, 70, 78, 131, 197, 332, 360, 377, 393, 405, 429, 471, 516, 547, 578 ], minor_fortress: [ 1, 6, 8, 11, 14, 17, 39, 50, 51, 52, 67, 72, 76, 97, 106, 118, 121, 138, 139, 144, 156, 160, 178, 188, 194, 196, - 200, 203, 206, 221, 223, 226, 227, 229, 236, 243, 245, 250, 254, 269, 277, 290, 291, 347, 360, 406, 407, 414, 433, + 208, 209, 265, 278, 322, 325, 328, 343, 345, 348, 349, 351, 358, 365, 367, 372, 376, 391, 399, 406, 407, 414, 433, 473, 483, 492, 494, 497, 514, 540, 561, 563, 579, 581, 592, 598, 601, 605, ], - box: [ 60, 242, 619, 620 ], + box: [ 60, 364, 619, 620 ], }, suit: { clubs: [ [ 0, 3 ], [ 21, 51 ], [ 169, 176 ], - [ 200, 217 ], - [ 282, 298 ], - [ 366, 367 ], + [ 200, 216 ], + [ 284, 285 ], + [ 322, 339 ], [ 404, 419 ], [ 434, 434 ], [ 468, 488 ], @@ -26,9 +26,9 @@ const data = { [ 4, 9 ], [ 52, 97 ], [ 177, 187 ], - [ 218, 230 ], - [ 299, 322 ], - [ 368, 381 ], + [ 217, 240 ], + [ 286, 299 ], + [ 340, 352 ], [ 435, 454 ], [ 489, 508 ], [ 536, 545 ], @@ -39,9 +39,9 @@ const data = { [ 10, 18 ], [ 98, 134 ], [ 188, 189 ], - [ 231, 254 ], - [ 323, 348 ], - [ 382, 385 ], + [ 241, 266 ], + [ 300, 303 ], + [ 353, 376 ], [ 420, 433 ], [ 455, 466 ], [ 509, 509 ], @@ -53,9 +53,9 @@ const data = { [ 19, 20 ], [ 135, 168 ], [ 190, 199 ], - [ 255, 281 ], - [ 349, 365 ], - [ 386, 403 ], + [ 267, 283 ], + [ 304, 321 ], + [ 377, 403 ], [ 467, 467 ], [ 510, 526 ], [ 563, 577 ], @@ -65,12 +65,12 @@ const data = { map: { Flanders: [ [ 0, 20 ], - [ 200, 365 ], - [ 404, 433 ], + [ 200, 283 ], + [ 322, 433 ], ], Bohemia: [ [ 21, 199 ], - [ 366, 403 ], + [ 284, 321 ], [ 434, 618 ], ], UNKNOWN: [ [ 619, 620 ] ], @@ -78,13 +78,13 @@ const data = { country: { Austria: [ [ 0, 168 ] ], Bavaria: [ [ 169, 199 ] ], - France: [ [ 200, 281 ] ], + France: [ [ 322, 403 ] ], Netherlands: [ [ 404, 433 ] ], Poland: [ [ 434, 467 ] ], Prussia: [ [ 468, 526 ] ], Saxony: [ [ 527, 577 ] ], Silesia: [ [ 578, 618 ] ], - HRE: [ [ 282, 403 ] ], + Empire: [ [ 200, 321 ] ], UNKNOWN: [ [ 619, 620 ] ], }, cities: { @@ -289,88 +289,6 @@ const data = { "München", "Pfaffenhofen", "Schrobenhausen", - "Belfort", - "Châlons-en-Champ.", - "Château-Thierry", - "Colmar", - "Créspy-en-V.", - "Epernay", - "Meaux", - "Montbeliard", - "Mulhouse", - "Provins", - "Reims", - "Rethel", - "Romilly s. S.", - "Sezianne", - "Soissons", - "Valdahon", - "Valmy", - "Vesoul", - "Bar-s.-Aube", - "Bouillon", - "Chaource", - "Chaumont", - "Châtillon s. S.", - "Haguenau", - "Langres", - "Sens", - "St. Dizier", - "Strasbourg", - "Tonnere", - "Troyes", - "Vitry", - "Armientières", - "Autun", - "Avallon", - "Beaumont", - "Beaune", - "Besançon", - "Calais", - "Dijon", - "Dole", - "Dunkerque", - "Gray", - "Italy", - "Lille", - "Longuyon", - "Metz", - "Montbard", - "Montmédy", - "Omans", - "Perne", - "Sedan", - "St. Avold", - "St. Omer", - "Thionville", - "Verdun", - "Amiens", - "Arras", - "Bar-le-Duc", - "Cambrai", - "Charleville-Mézieres", - "Compiègne", - "Douai", - "Doullens", - "Epinal", - "Guise", - "Jussey", - "Laon", - "Lens", - "Lunéville", - "Maubeuge", - "Mondidier", - "Nancy", - "Noyon", - "Péronne", - "Sarrebourg", - "Sarreguemines", - "St. Die", - "St. Quentin", - "Toul", - "Valenciennes", - "Vervins", - "Vittel", "Aschaffenburg", "Bingen", "Cochem", @@ -493,6 +411,88 @@ const data = { "Saalfeld", "Sonneberg", "Weimar", + "Belfort", + "Châlons-en-Champ.", + "Château-Thierry", + "Colmar", + "Créspy-en-V.", + "Epernay", + "Meaux", + "Montbeliard", + "Mulhouse", + "Provins", + "Reims", + "Rethel", + "Romilly s. S.", + "Sezianne", + "Soissons", + "Valdahon", + "Valmy", + "Vesoul", + "Bar-s.-Aube", + "Bouillon", + "Chaource", + "Chaumont", + "Châtillon s. S.", + "Haguenau", + "Langres", + "Sens", + "St. Dizier", + "Strasbourg", + "Tonnere", + "Troyes", + "Vitry", + "Armientières", + "Autun", + "Avallon", + "Beaumont", + "Beaune", + "Besançon", + "Calais", + "Dijon", + "Dole", + "Dunkerque", + "Gray", + "Italy", + "Lille", + "Longuyon", + "Metz", + "Montbard", + "Montmédy", + "Omans", + "Perne", + "Sedan", + "St. Avold", + "St. Omer", + "Thionville", + "Verdun", + "Amiens", + "Arras", + "Bar-le-Duc", + "Cambrai", + "Charleville-Mézieres", + "Compiègne", + "Douai", + "Doullens", + "Epinal", + "Guise", + "Jussey", + "Laon", + "Lens", + "Lunéville", + "Maubeuge", + "Mondidier", + "Nancy", + "Noyon", + "Péronne", + "Sarrebourg", + "Sarreguemines", + "St. Die", + "St. Quentin", + "Toul", + "Valenciennes", + "Vervins", + "Vittel", "Alkmaar", "Amsterdam", "Bergen", @@ -912,6 +912,128 @@ const data = { "Bavaria", "Bavaria", "Bavaria", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", + "Empire", "France", "France", "France", @@ -994,128 +1116,6 @@ const data = { "France", "France", "France", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", - "HRE", "Netherlands", "Netherlands", "Netherlands", @@ -1345,27 +1345,27 @@ const data = { 1696, 1849, 1282, 1786, 1783, 2188, 2240, 1686, 1854, 2379, 1764, 2411, 1621, 1797, 2320, 1625, 2302, 1796, 2247, 1861, 2395, 1853, 1623, 1664, 1678, 2383, 2279, 1677, 2237, 1834, 2226, 1718, 1692, 1415, 1343, 1344, 1367, 1428, 1435, 1357, 1335, 1207, 1073, 1100, 1146, 1255, 1276, 1149, 1194, 1218, 1274, 1157, 1379, 1331, 1171, 1127, 1276, - 1223, 1161, 1215, 1276, 1184, 1203, 1083, 510, 254, 152, 595, 72, 212, 77, 451, 576, 78, 245, 289, 117, 160, 145, - 406, 323, 381, 235, 422, 131, 276, 184, 744, 301, 71, 323, 697, 95, 142, 270, 154, 75, 75, 375, 145, 318, 72, 201, - 238, 147, 288, 215, 195, 466, 514, 136, 421, 318, 78, 384, 578, 80, 549, 389, 79, 139, 382, 182, 322, 69, 193, 71, - 483, 229, 388, 193, 141, 542, 290, 74, 482, 121, 136, 606, 636, 567, 180, 425, 237, 259, 408, 961, 794, 750, 896, - 928, 720, 776, 639, 862, 878, 961, 644, 949, 845, 709, 837, 703, 642, 784, 893, 378, 549, 429, 956, 936, 947, 834, - 793, 533, 590, 578, 719, 728, 625, 906, 625, 848, 882, 516, 845, 759, 959, 949, 813, 860, 873, 932, 807, 705, 703, - 912, 704, 724, 939, 931, 912, 877, 931, 833, 908, 779, 643, 613, 739, 960, 634, 766, 803, 854, 765, 764, 709, 690, - 858, 861, 935, 707, 795, 730, 891, 941, 907, 802, 955, 1500, 1487, 1053, 1129, 1174, 1255, 1041, 1046, 1123, 1228, - 1226, 1052, 1108, 1090, 1045, 1258, 1378, 1428, 1422, 1444, 1267, 1044, 1047, 1059, 1041, 1092, 1049, 1223, 1252, - 1207, 1169, 1118, 1183, 1259, 1095, 1096, 1050, 1115, 592, 596, 467, 540, 473, 559, 596, 539, 633, 514, 637, 521, - 382, 570, 599, 647, 813, 695, 700, 903, 935, 756, 801, 878, 831, 861, 730, 713, 769, 766, 2144, 2380, 2417, 2239, - 2197, 2296, 2385, 1844, 2234, 2406, 1859, 1859, 2218, 2192, 2316, 1812, 2267, 2318, 2353, 2366, 2335, 2093, 1938, - 2138, 1997, 2005, 2020, 2041, 2068, 1979, 1918, 1911, 1945, 2430, 1552, 1477, 1561, 1445, 1490, 1336, 1514, 1337, - 1561, 1555, 1499, 1413, 1340, 1418, 1395, 1562, 1390, 1450, 1361, 1393, 1450, 1730, 1691, 1168, 1646, 1762, 1062, - 1219, 1758, 1652, 1712, 1636, 1666, 1711, 1770, 1617, 1671, 1145, 1790, 1742, 1816, 1405, 1226, 1158, 1275, 1119, - 1215, 1277, 1175, 1060, 1103, 1241, 1291, 1086, 1197, 1044, 1201, 1231, 1148, 1336, 1351, 1469, 1494, 1407, 1414, - 1414, 1556, 1336, 1092, 1121, 1281, 1281, 1276, 1212, 1185, 1151, 1094, 1729, 1452, 1510, 1444, 1409, 1502, 1336, - 1513, 1406, 1496, 1550, 1453, 1354, 1564, 1400, 1551, 1352, 1334, 1641, 1288, 1623, 1681, 1694, 1728, 1616, 1782, - 1680, 1779, 1269, 1760, 1619, 1687, 1286, 2075, 1925, 1988, 1923, 2122, 2041, 2134, 2137, 1994, 1992, 2082, 1930, - 2066, 1990, 2190, 2259, 2336, 2205, 2287, 2069, 2036, 2137, 2047, 2131, 2022, 1932, 2351, 2262, 2327, 2286, 1845, - 1853, 2405, 1849, 2246, 1759, 2294, 2357, 1855, 2404, 2190, 1876, 935, + 1223, 1161, 1215, 1276, 1184, 1203, 1083, 961, 794, 750, 896, 928, 720, 776, 639, 862, 878, 961, 644, 949, 845, + 709, 837, 703, 642, 784, 893, 378, 549, 429, 956, 936, 947, 834, 793, 533, 590, 578, 719, 728, 625, 906, 625, 848, + 882, 516, 845, 759, 959, 949, 813, 860, 873, 932, 807, 705, 703, 912, 704, 724, 939, 931, 912, 877, 931, 833, 908, + 779, 643, 613, 739, 960, 634, 766, 803, 854, 765, 764, 709, 690, 858, 861, 935, 707, 795, 730, 891, 941, 907, 802, + 955, 1500, 1487, 1053, 1129, 1174, 1255, 1041, 1046, 1123, 1228, 1226, 1052, 1108, 1090, 1045, 1258, 1378, 1428, + 1422, 1444, 1267, 1044, 1047, 1059, 1041, 1092, 1049, 1223, 1252, 1207, 1169, 1118, 1183, 1259, 1095, 1096, 1050, + 1115, 510, 254, 152, 595, 72, 212, 77, 451, 576, 78, 245, 289, 117, 160, 145, 406, 323, 381, 235, 422, 131, 276, + 184, 744, 301, 71, 323, 697, 95, 142, 270, 154, 75, 75, 375, 145, 318, 72, 201, 238, 147, 288, 215, 195, 466, 514, + 136, 421, 318, 78, 384, 578, 80, 549, 389, 79, 139, 382, 182, 322, 69, 193, 71, 483, 229, 388, 193, 141, 542, 290, + 74, 482, 121, 136, 606, 636, 567, 180, 425, 237, 259, 408, 592, 596, 467, 540, 473, 559, 596, 539, 633, 514, 637, + 521, 382, 570, 599, 647, 813, 695, 700, 903, 935, 756, 801, 878, 831, 861, 730, 713, 769, 766, 2144, 2380, 2417, + 2239, 2197, 2296, 2385, 1844, 2234, 2406, 1859, 1859, 2218, 2192, 2316, 1812, 2267, 2318, 2353, 2366, 2335, 2093, + 1938, 2138, 1997, 2005, 2020, 2041, 2068, 1979, 1918, 1911, 1945, 2430, 1552, 1477, 1561, 1445, 1490, 1336, 1514, + 1337, 1561, 1555, 1499, 1413, 1340, 1418, 1395, 1562, 1390, 1450, 1361, 1393, 1450, 1730, 1691, 1168, 1646, 1762, + 1062, 1219, 1758, 1652, 1712, 1636, 1666, 1711, 1770, 1617, 1671, 1145, 1790, 1742, 1816, 1405, 1226, 1158, 1275, + 1119, 1215, 1277, 1175, 1060, 1103, 1241, 1291, 1086, 1197, 1044, 1201, 1231, 1148, 1336, 1351, 1469, 1494, 1407, + 1414, 1414, 1556, 1336, 1092, 1121, 1281, 1281, 1276, 1212, 1185, 1151, 1094, 1729, 1452, 1510, 1444, 1409, 1502, + 1336, 1513, 1406, 1496, 1550, 1453, 1354, 1564, 1400, 1551, 1352, 1334, 1641, 1288, 1623, 1681, 1694, 1728, 1616, + 1782, 1680, 1779, 1269, 1760, 1619, 1687, 1286, 2075, 1925, 1988, 1923, 2122, 2041, 2134, 2137, 1994, 1992, 2082, + 1930, 2066, 1990, 2190, 2259, 2336, 2205, 2287, 2069, 2036, 2137, 2047, 2131, 2022, 1932, 2351, 2262, 2327, 2286, + 1845, 1853, 2405, 1849, 2246, 1759, 2294, 2357, 1855, 2404, 2190, 1875, 935, ], y: [ 528, 587, 573, 563, 832, 641, 705, 662, 803, 719, 909, 474, 491, 538, 941, 479, 532, 582, 887, 647, 691, 1268, @@ -1378,50 +1378,50 @@ const data = { 1479, 1038, 1168, 1596, 1326, 1520, 1468, 1310, 1001, 848, 980, 1196, 1408, 1234, 1092, 947, 1393, 1043, 843, 1137, 1573, 832, 906, 1268, 1087, 961, 1190, 1138, 1236, 1307, 1270, 1140, 1184, 1340, 1045, 1393, 1473, 1095, 1425, 1040, 1383, 959, 1470, 926, 1452, 1086, 1421, 1137, 1312, 1187, 1294, 1198, 1169, 1260, 1331, 1246, 1257, - 1433, 1067, 973, 1388, 908, 1025, 993, 1469, 1449, 1059, 938, 894, 1086, 1043, 892, 1538, 1054, 1403, 1205, 847, - 1235, 1273, 1292, 1187, 1331, 1160, 1186, 1246, 1304, 1173, 1142, 539, 1496, 1390, 957, 1500, 1499, 475, 1419, - 1515, 474, 1407, 1577, 588, 990, 1078, 1387, 957, 1580, 593, 896, 1098, 536, 1020, 1033, 731, 686, 1142, 707, 840, - 840, 649, 659, 1299, 781, 1331, 845, 642, 1208, 738, 791, 1156, 814, 755, 1226, 1140, 1299, 778, 1168, 663, 831, - 1248, 979, 950, 895, 1013, 943, 1007, 1071, 1493, 960, 1077, 1061, 1437, 901, 906, 942, 1028, 1087, 685, 1248, - 1196, 750, 642, 782, 1284, 1136, 1213, 1195, 1136, 718, 667, 771, 1302, 1134, 833, 1335, 644, 1144, 1261, 675, - 1330, 1340, 545, 1441, 465, 490, 575, 1397, 588, 1387, 547, 594, 491, 594, 391, 332, 504, 1461, 1498, 1418, 440, - 1390, 1072, 1038, 1476, 458, 984, 556, 666, 772, 775, 641, 776, 847, 701, 642, 644, 679, 839, 722, 838, 715, 768, - 718, 831, 1177, 1223, 924, 951, 429, 406, 996, 1473, 898, 435, 884, 1039, 1536, 447, 1091, 973, 1508, 1498, 1440, - 1540, 648, 710, 1303, 847, 1182, 1156, 646, 694, 751, 827, 698, 848, 791, 1136, 724, 771, 800, 654, 232, 312, 446, - 461, 346, 416, 535, 289, 497, 327, 446, 384, 478, 501, 390, 578, 355, 346, 405, 237, 171, 397, 156, 295, 402, 191, - 213, 174, 262, 316, 395, 320, 496, 378, 268, 285, 581, 131, 469, 436, 177, 237, 427, 351, 430, 202, 325, 354, 538, - 402, 479, 336, 232, 286, 280, 322, 213, 353, 248, 175, 281, 155, 331, 645, 113, 349, 336, 209, 184, 259, 152, 141, - 176, 273, 275, 330, 75, 145, 246, 65, 188, 57, 347, 71, 297, 76, 237, 525, 277, 122, 398, 506, 335, 196, 147, 141, - 64, 277, 276, 229, 103, 396, 81, 218, 311, 392, 297, 153, 282, 260, 119, 121, 300, 250, 340, 63, 214, 168, 356, - 320, 192, 230, 104, 770, 721, 653, 689, 637, 693, 745, 642, 646, 582, 484, 480, 591, 543, 556, 600, 562, 527, 636, - 420, 581, 523, 492, 455, 589, 528, 449, 411, 393, 569, 549, 591, 559, 486, 486, 417, 589, 354, 426, 436, 394, 585, - 533, 570, 479, 533, 795, 430, 474, 541, 729, 528, 408, 394, 502, 436, 471, 499, 564, 588, 441, 593, 571, 435, 519, - 591, 539, 596, 536, 576, 655, 703, 644, 757, 685, 642, 641, 651, 733, 703, 674, 404, 579, 725, 525, 643, 474, 778, - 780, 456, 774, 705, 80, 109, + 979, 950, 895, 1013, 943, 1007, 1071, 1493, 960, 1077, 1061, 1437, 901, 906, 942, 1028, 1087, 685, 1248, 1196, + 750, 642, 782, 1284, 1136, 1213, 1195, 1136, 718, 667, 771, 1302, 1134, 833, 1335, 644, 1144, 1261, 675, 1330, + 1340, 545, 1441, 465, 490, 575, 1397, 588, 1387, 547, 594, 491, 594, 391, 332, 504, 1461, 1498, 1418, 440, 1390, + 1072, 1038, 1476, 458, 984, 556, 666, 772, 775, 641, 776, 847, 701, 642, 644, 679, 839, 722, 838, 715, 768, 718, + 831, 1177, 1223, 924, 951, 429, 406, 996, 1473, 898, 435, 884, 1039, 1536, 447, 1091, 973, 1508, 1498, 1440, 1540, + 648, 710, 1303, 847, 1182, 1156, 646, 694, 751, 827, 698, 848, 791, 1136, 724, 771, 800, 654, 1433, 1067, 973, + 1388, 908, 1025, 993, 1469, 1449, 1059, 938, 894, 1086, 1043, 892, 1538, 1054, 1403, 1205, 847, 1235, 1273, 1292, + 1187, 1331, 1160, 1186, 1246, 1304, 1173, 1142, 539, 1496, 1390, 957, 1500, 1499, 475, 1419, 1515, 474, 1407, + 1577, 588, 990, 1078, 1387, 957, 1580, 593, 896, 1098, 536, 1020, 1033, 731, 686, 1142, 707, 840, 840, 649, 659, + 1299, 781, 1331, 845, 642, 1208, 738, 791, 1156, 814, 755, 1226, 1140, 1299, 778, 1168, 663, 831, 1248, 232, 312, + 446, 461, 346, 416, 535, 289, 497, 327, 446, 384, 478, 501, 390, 578, 355, 346, 405, 237, 171, 397, 156, 295, 402, + 191, 213, 174, 262, 316, 395, 320, 496, 378, 268, 285, 581, 131, 469, 436, 177, 237, 427, 351, 430, 202, 325, 354, + 538, 402, 479, 336, 232, 286, 280, 322, 213, 353, 248, 175, 281, 155, 331, 645, 113, 349, 336, 209, 184, 259, 152, + 141, 176, 273, 275, 330, 75, 145, 246, 65, 188, 57, 347, 71, 297, 76, 237, 525, 277, 122, 398, 506, 335, 196, 147, + 141, 64, 277, 276, 229, 103, 396, 81, 218, 311, 392, 297, 153, 282, 260, 119, 121, 300, 250, 340, 63, 214, 168, + 356, 320, 192, 230, 104, 770, 721, 653, 689, 637, 693, 745, 642, 646, 582, 484, 480, 591, 543, 556, 600, 562, 527, + 636, 420, 581, 523, 492, 455, 589, 528, 449, 411, 393, 569, 549, 591, 559, 486, 486, 417, 589, 354, 426, 436, 394, + 585, 533, 570, 479, 533, 795, 430, 474, 541, 729, 528, 408, 394, 502, 436, 471, 499, 564, 588, 441, 593, 571, 435, + 519, 591, 539, 596, 536, 576, 655, 703, 644, 757, 685, 642, 641, 651, 733, 703, 674, 404, 579, 725, 525, 643, 474, + 778, 780, 456, 774, 705, 80, 109, ], main_roads: [ [], [ 3, 7, 19 ], [ 407, 3 ], [ 2, 1 ], - [ 18, 312 ], + [ 18, 230 ], [], - [ 302, 304, 310 ], - [ 1, 302 ], + [ 220, 222, 228 ], + [ 1, 220 ], [], - [ 310, 299, 312 ], + [ 228, 217, 230 ], [], [], [], [], - [ 253, 18 ], + [ 375, 18 ], [], [], - [ 19, 243 ], + [ 19, 365 ], [ 14, 4 ], [ 1, 17 ], [], - [ 367, 70 ], + [ 285, 70 ], [], [], [], @@ -1538,7 +1538,7 @@ const data = { [], [ 168, 78 ], [], - [ 376, 111 ], + [ 294, 111 ], [], [], [ 87, 164 ], @@ -1573,12 +1573,12 @@ const data = { [], [ 196, 173 ], [], - [ 171, 367 ], + [ 171, 285 ], [], [], [], [], - [ 388, 191 ], + [ 306, 191 ], [], [], [], @@ -1594,216 +1594,216 @@ const data = { [ 178, 197 ], [], [ 197, 198, 196 ], - [ 198, 391 ], + [ 198, 309 ], [], [ 193, 171 ], [ 191, 193 ], [ 193, 194 ], [], - [ 207, 208 ], - [ 205, 230 ], [], [], - [ 206, 260 ], - [ 210, 201 ], - [ 209, 204 ], - [ 236, 200 ], - [ 200, 293 ], - [ 212, 206 ], - [ 266, 211, 205 ], - [ 210, 259 ], - [ 229, 209 ], [], [], [], [], + [ 215, 232 ], [], - [ 226, 229, 222 ], + [ 213, 215 ], + [ 215, 224 ], [], + [ 330, 248 ], [], + [ 279, 208 ], [], - [ 218, 238 ], + [ 208, 209, 206 ], + [ 261, 232 ], + [ 9, 276 ], + [ 231, 226 ], + [ 226, 225 ], + [ 7, 6 ], [], - [ 281, 238 ], + [ 6, 381 ], + [ 237, 306 ], + [ 308, 209 ], + [ 219, 308 ], + [ 227, 218, 219, 237 ], + [ 232, 226 ], + [ 6, 9 ], [], - [ 230, 218, 257 ], - [ 313, 274 ], + [ 4, 9 ], + [ 248, 349, 218 ], + [ 206, 216, 227 ], [], - [ 218, 212 ], - [ 201, 226 ], [], [], [], + [ 226, 223 ], [], [], - [ 239, 248, 207 ], [], - [ 222, 239, 224 ], - [ 238, 236 ], [], [], [], - [ 17, 267 ], + [ 428, 245 ], + [ 244, 247 ], + [ 258, 306 ], + [ 245, 270 ], + [ 211, 231 ], [], - [ 271, 251, 253 ], [], [], - [ 236 ], + [ 270, 419 ], [], [], - [ 245, 343 ], [], - [ 245, 14 ], [], [], - [ 267, 273 ], - [ 226, 278 ], + [ 263, 246 ], [], - [ 211, 304 ], - [ 204, 272 ], [], + [ 373, 216 ], [], + [ 258 ], [], [], [], - [ 277, 210 ], - [ 243, 256 ], - [ 274, 271 ], [], [], - [ 268, 245, 278, 281 ], - [ 260, 277 ], - [ 256, 277 ], - [ 227, 268 ], + [ 278, 277 ], + [ 278, 252, 247 ], [], [], - [ 273, 266, 272 ], - [ 257, 271 ], [], [], - [ 271, 224 ], [], + [ 217, 278 ], + [ 269, 279 ], + [ 276, 270, 269 ], + [ 277, 213 ], [], [], [], [], [], - [ 297, 314 ], + [ 173, 21 ], [], - [ 295, 297 ], - [ 297, 306 ], + [ 295, 294 ], [], - [ 208, 330 ], [], - [ 361, 290 ], [], - [ 290, 291, 288 ], - [ 343, 314 ], - [ 9, 358 ], - [ 313, 308 ], - [ 308, 307 ], - [ 7, 6 ], [], - [ 6, 259 ], - [ 319, 388 ], - [ 390, 291 ], - [ 301, 390 ], - [ 309, 300, 301, 319 ], - [ 314, 308 ], - [ 6, 9 ], [], - [ 4, 9 ], - [ 330, 227, 300 ], - [ 288, 298, 309 ], + [ 495, 522 ], + [ 287, 138 ], + [ 298, 287 ], [], [], + [ 309, 295 ], [], [], - [ 308, 305 ], [], [], [], [], [], + [ 223, 246, 178 ], [], - [ 428, 327 ], - [ 326, 329 ], - [ 340, 388 ], - [ 327, 352 ], - [ 293, 313 ], + [ 225, 224, 309 ], + [ 308, 194, 298 ], [], [], [], - [ 352, 419 ], [], [], [], [], [], - [ 345, 328 ], [], [], - [ 251, 298 ], [], - [ 340 ], [], + [ 329, 330 ], + [ 327, 352 ], [], [], + [ 328, 382 ], + [ 332, 323 ], + [ 331, 326 ], + [ 358, 322 ], + [ 322, 211 ], + [ 334, 328 ], + [ 388, 333, 327 ], + [ 332, 381 ], + [ 351, 331 ], [], [], - [ 360, 359 ], - [ 360, 334, 329 ], [], [], [], + [ 348, 351, 344 ], [], [], - [ 299, 360 ], - [ 351, 361 ], - [ 358, 352, 351 ], - [ 359, 295 ], [], + [ 340, 360 ], [], + [ 403, 360 ], [], + [ 352, 340, 379 ], + [ 231, 396 ], [], + [ 340, 334 ], + [ 323, 348 ], [], - [ 173, 21 ], [], - [ 377, 376 ], [], [], [], + [ 361, 370, 329 ], [], + [ 344, 361, 346 ], + [ 360, 358 ], [], - [ 495, 522 ], - [ 369, 138 ], - [ 380, 369 ], [], [], - [ 391, 377 ], + [ 17, 389 ], [], + [ 393, 373, 375 ], [], [], + [ 358 ], [], [], + [ 367, 261 ], [], + [ 367, 14 ], [], - [ 305, 328, 178 ], [], - [ 307, 306, 391 ], - [ 390, 194, 380 ], + [ 389, 395 ], + [ 348, 400 ], [], + [ 333, 222 ], + [ 326, 394 ], [], [], [], [], [], + [ 399, 332 ], + [ 365, 378 ], + [ 396, 393 ], [], [], + [ 390, 367, 400, 403 ], + [ 382, 399 ], + [ 378, 399 ], + [ 349, 390 ], [], [], + [ 395, 388, 394 ], + [ 379, 393 ], [], [], + [ 393, 346 ], [], [ 418, 413 ], [], @@ -1819,7 +1819,7 @@ const data = { [], [ 410, 407 ], [ 421, 405, 409 ], - [ 334, 410 ], + [ 252, 410 ], [ 433, 428 ], [ 433, 418 ], [], @@ -1828,7 +1828,7 @@ const data = { [], [], [], - [ 420, 326 ], + [ 420, 244 ], [ 424, 432 ], [], [], @@ -1895,7 +1895,7 @@ const data = { [ 477, 496 ], [ 498, 506, 489 ], [ 518 ], - [ 538, 375 ], + [ 538, 293 ], [ 492, 501, 608 ], [ 490, 498 ], [ 497, 493 ], @@ -1922,7 +1922,7 @@ const data = { [], [], [], - [ 375, 516 ], + [ 293, 516 ], [], [], [], @@ -2025,25 +2025,25 @@ const data = { roads: [ [ 13, 3, 406 ], [ 5 ], - [ 303 ], + [ 221 ], [ 0 ], [ 8 ], - [ 320, 1 ], + [ 238, 1 ], [], [], - [ 219, 304, 4, 310 ], + [ 341, 222, 4, 228 ], [], - [ 14, 219 ], + [ 14, 341 ], [ 15, 12 ], [ 11, 13, 416 ], [ 17, 12, 0 ], - [ 244, 10, 347 ], - [ 16, 11, 240 ], - [ 243, 17, 15 ], - [ 279, 16, 13 ], - [ 315 ], + [ 366, 10, 265 ], + [ 16, 11, 362 ], + [ 365, 17, 15 ], + [ 401, 16, 13 ], + [ 233 ], [ 20 ], - [ 269, 19 ], + [ 391, 19 ], [ 42 ], [ 47, 69, 90 ], [ 96, 110, 28 ], @@ -2065,10 +2065,10 @@ const data = { [ 25 ], [ 79 ], [ 31 ], - [ 366, 21, 37 ], + [ 284, 21, 37 ], [ 34, 124, 38 ], [ 38, 78 ], - [ 26, 367 ], + [ 26, 285 ], [ 80 ], [ 29, 22, 530 ], [ 25 ], @@ -2148,7 +2148,7 @@ const data = { [ 119, 106, 118 ], [ 151, 118 ], [ 43, 118 ], - [ 49, 384, 99 ], + [ 49, 302, 99 ], [ 130, 101, 87 ], [ 106, 120 ], [ 35, 112 ], @@ -2192,265 +2192,265 @@ const data = { [ 121, 154 ], [ 52, 140 ], [], - [ 367, 174, 175 ], - [ 188, 175, 399 ], + [ 285, 174, 175 ], + [ 188, 175, 317 ], [ 175 ], [ 176, 26, 173 ], [ 172 ], [ 188, 169 ], [ 169, 171, 170 ], [ 181, 197, 172, 196 ], - [ 399, 180, 184 ], - [ 183, 373 ], - [ 373, 187, 378 ], - [ 177, 380, 190 ], + [ 317, 180, 184 ], + [ 183, 291 ], + [ 291, 187, 296 ], + [ 177, 298, 190 ], [ 197, 185, 66, 189, 176 ], - [ 105, 188, 381, 399 ], + [ 105, 188, 299, 317 ], [ 178, 197, 187 ], - [ 177, 381, 369 ], + [ 177, 299, 287 ], [ 187, 181 ], - [ 111, 381 ], + [ 111, 299 ], [ 183, 179, 185 ], [ 182, 106, 170, 174 ], - [ 181, 26, 382, 384 ], + [ 181, 26, 300, 302 ], [ 180, 195, 194 ], [ 199 ], - [ 196, 399 ], + [ 196, 317 ], [], [ 199, 190 ], - [ 399, 190 ], + [ 317, 190 ], [ 176, 192 ], [ 183, 181, 176 ], [], - [ 388, 390, 194, 191 ], - [ 217, 263 ], - [ 216 ], - [ 206, 205, 214 ], - [ 208, 227 ], + [ 306, 308, 194, 191 ], + [ 204, 210 ], + [ 205, 208 ], + [ 272, 277, 214 ], + [ 204, 209 ], + [ 208, 203, 212, 200 ], + [ 261, 214, 201 ], [], - [ 213, 202 ], - [ 202 ], - [ 215 ], - [ 203 ], + [ 211, 263 ], + [ 201, 204 ], + [ 203, 236 ], + [ 200, 224 ], + [ 207 ], + [ 204, 283 ], [], + [ 265, 202, 205 ], [], - [ 234 ], - [ 225, 213 ], - [ 212, 205 ], - [ 202, 266, 272 ], - [ 248, 207 ], - [ 201, 226, 234 ], - [ 241, 236, 265, 200 ], - [ 221 ], - [ 10, 250, 8 ], - [ 228, 222, 229, 225 ], - [ 224, 218, 226 ], - [ 220 ], - [ 275, 227, 309 ], - [ 221, 265 ], - [ 220, 212 ], - [ 221, 216 ], - [ 203, 223 ], - [ 233, 220 ], - [ 220 ], - [], - [ 252, 267, 240 ], - [ 235, 233 ], - [ 246, 232, 228 ], - [ 216, 211, 254, 250 ], - [ 239, 232, 238 ], - [ 217 ], - [ 240, 252 ], - [ 235, 246, 241 ], - [ 235 ], - [ 15, 231, 237 ], - [ 238, 217 ], [], - [ 16 ], - [ 254, 247, 14 ], - [], - [ 238, 233 ], - [ 244, 250 ], - [ 215 ], - [ 262, 252 ], - [ 259, 247, 234, 219 ], - [ 275 ], - [ 249, 231, 237 ], - [], - [ 257, 234, 244 ], - [ 270, 273, 262 ], - [ 261, 262 ], - [ 254 ], - [ 273, 269, 261 ], - [ 280, 250 ], - [], - [ 258, 279, 256 ], - [ 255, 256, 249 ], - [ 200, 276, 265, 268 ], - [ 277, 280 ], - [ 224, 217, 263 ], - [ 214 ], - [ 231 ], - [ 276, 263 ], - [ 258, 280, 302, 20, 279 ], - [ 272, 255 ], - [], - [ 214, 270 ], - [ 255, 258 ], - [ 275 ], - [ 274, 223, 251 ], - [ 263, 268 ], - [ 264 ], - [], - [ 269, 261, 17 ], - [ 264, 259, 269 ], - [], - [ 286, 292 ], - [ 287, 290 ], - [ 354, 359, 296 ], - [ 286, 291 ], - [ 290, 285, 294, 282 ], - [ 343, 296, 283 ], - [], - [ 293, 345 ], - [ 283, 286 ], - [ 285, 318 ], - [ 282, 306 ], - [ 289 ], - [ 286, 365 ], - [], - [ 347, 284, 287 ], - [], - [], - [ 353, 317 ], - [], - [ 306 ], - [ 269 ], - [ 320, 2, 410 ], + [ 271, 235 ], + [], + [ 224 ], + [ 391 ], + [ 238, 2, 410 ], [ 8 ], - [ 307, 316 ], - [ 292, 301 ], - [ 305 ], - [], - [ 318, 223 ], - [ 8, 311, 320 ], - [ 310, 317 ], - [ 315 ], - [ 322 ], - [], - [ 347, 18, 312, 354, 353 ], - [ 305, 321, 328 ], - [ 311, 299, 419 ], - [ 291, 309 ], - [ 321 ], - [ 310, 303, 5 ], - [ 316, 319, 322 ], - [ 321, 313, 342 ], - [ 346, 332 ], - [ 339, 328 ], - [ 422, 348, 326 ], - [ 325, 341, 337 ], - [ 356 ], - [ 324, 316 ], - [ 348 ], - [], - [ 333, 334 ], - [ 323, 356, 357 ], - [ 414, 331, 348 ], - [ 331 ], - [ 336, 346, 341 ], - [ 427, 335 ], - [ 326, 346 ], - [ 340, 339 ], - [ 338, 324, 373 ], - [ 342, 338 ], - [ 335, 326 ], - [ 322, 340 ], - [ 344, 287 ], - [ 343, 347 ], - [ 289 ], - [ 335, 337, 323 ], - [ 344, 14, 296, 315 ], - [ 329, 333, 325 ], - [ 356, 360 ], - [ 363, 351 ], - [ 364, 350, 353 ], - [], - [ 315, 299, 351 ], - [ 315, 284 ], - [ 364, 362, 356 ], - [ 327, 332, 349, 355 ], - [ 332, 362 ], - [], - [ 284 ], - [ 349 ], - [ 365 ], - [ 355, 357, 363 ], - [ 362, 350, 365 ], - [ 351, 355 ], - [ 294, 361, 363 ], - [ 367, 42 ], - [ 45, 169, 366 ], - [ 389, 374, 372 ], - [ 184, 374 ], - [ 537, 375 ], + [ 225, 234 ], + [ 210, 219 ], + [ 223 ], + [], + [ 236, 345 ], + [ 8, 229, 238 ], + [ 228, 235 ], + [ 233 ], + [ 240 ], + [], + [ 265, 18, 230, 272, 271 ], + [ 223, 239, 246 ], + [ 229, 217, 419 ], + [ 209, 227 ], + [ 239 ], + [ 228, 221, 5 ], + [ 234, 237, 240 ], + [ 239, 231, 260 ], + [ 264, 250 ], + [ 257, 246 ], + [ 422, 266, 244 ], + [ 243, 259, 255 ], + [ 274 ], + [ 242, 234 ], + [ 266 ], + [], + [ 251, 252 ], + [ 241, 274, 275 ], + [ 414, 249, 266 ], + [ 249 ], + [ 254, 264, 259 ], + [ 427, 253 ], + [ 244, 264 ], + [ 258, 257 ], + [ 256, 242, 291 ], + [ 260, 256 ], + [ 253, 244 ], + [ 240, 258 ], + [ 262, 205 ], + [ 261, 265 ], + [ 207 ], + [ 253, 255, 241 ], + [ 262, 14, 214, 233 ], + [ 247, 251, 243 ], + [ 274, 278 ], + [ 281, 269 ], + [ 282, 268, 271 ], + [], + [ 233, 217, 269 ], + [ 233, 202 ], + [ 282, 280, 274 ], + [ 245, 250, 267, 273 ], + [ 250, 280 ], + [], + [ 202 ], + [ 267 ], + [ 283 ], + [ 273, 275, 281 ], + [ 280, 268, 283 ], + [ 269, 273 ], + [ 212, 279, 281 ], + [ 285, 42 ], + [ 45, 169, 284 ], + [ 307, 292, 290 ], + [ 184, 292 ], + [ 537, 293 ], [ 522, 512, 564, 538 ], - [ 368, 377 ], - [ 339, 178, 179, 378 ], - [ 397, 395, 369, 368 ], - [ 370 ], - [ 395, 381 ], - [ 372 ], - [ 373, 179 ], + [ 286, 295 ], + [ 257, 178, 179, 296 ], + [ 315, 313, 287, 286 ], + [ 288 ], + [ 313, 299 ], + [ 290 ], + [ 291, 179 ], [ 494, 537 ], [ 180 ], - [ 186, 182, 184, 376 ], + [ 186, 182, 184, 294 ], [ 189 ], - [ 384, 385 ], - [ 189, 383, 125 ], - [ 383 ], - [ 539, 577, 393 ], - [ 400, 392 ], + [ 302, 303 ], + [ 189, 301, 125 ], + [ 301 ], + [ 539, 577, 311 ], + [ 318, 310 ], [ 199 ], - [ 368, 397, 402 ], + [ 286, 315, 320 ], [ 199 ], [], - [ 536, 387, 403 ], - [ 542, 396, 394, 386 ], - [ 573, 393 ], - [ 374, 376, 573, 398 ], - [ 400, 393, 403 ], - [ 389, 374 ], - [ 395, 401 ], + [ 536, 305, 321 ], + [ 542, 314, 312, 304 ], + [ 573, 311 ], + [ 292, 294, 573, 316 ], + [ 318, 311, 321 ], + [ 307, 292 ], + [ 313, 319 ], [ 182, 177, 170, 192, 195 ], - [ 401, 387, 396 ], - [ 398, 402, 400 ], - [ 401, 389 ], - [ 542, 396, 392 ], + [ 319, 305, 314 ], + [ 316, 320, 318 ], + [ 319, 307 ], + [ 542, 314, 310 ], + [ 339, 385 ], + [ 338 ], + [ 328, 327, 336 ], + [ 330, 349 ], + [], + [ 335, 324 ], + [ 324 ], + [ 337 ], + [ 325 ], + [], + [], + [ 356 ], + [ 347, 335 ], + [ 334, 327 ], + [ 324, 388, 394 ], + [ 370, 329 ], + [ 323, 348, 356 ], + [ 363, 358, 387, 322 ], + [ 343 ], + [ 10, 372, 8 ], + [ 350, 344, 351, 347 ], + [ 346, 340, 348 ], + [ 342 ], + [ 397, 349, 227 ], + [ 343, 387 ], + [ 342, 334 ], + [ 343, 338 ], + [ 325, 345 ], + [ 355, 342 ], + [ 342 ], + [], + [ 374, 389, 362 ], + [ 357, 355 ], + [ 368, 354, 350 ], + [ 338, 333, 376, 372 ], + [ 361, 354, 360 ], + [ 339 ], + [ 362, 374 ], + [ 357, 368, 363 ], + [ 357 ], + [ 15, 353, 359 ], + [ 360, 339 ], + [], + [ 16 ], + [ 376, 369, 14 ], + [], + [ 360, 355 ], + [ 366, 372 ], + [ 337 ], + [ 384, 374 ], + [ 381, 369, 356, 341 ], + [ 397 ], + [ 371, 353, 359 ], + [], + [ 379, 356, 366 ], + [ 392, 395, 384 ], + [ 383, 384 ], + [ 376 ], + [ 395, 391, 383 ], + [ 402, 372 ], + [], + [ 380, 401, 378 ], + [ 377, 378, 371 ], + [ 322, 398, 387, 390 ], + [ 399, 402 ], + [ 346, 339, 385 ], + [ 336 ], + [ 353 ], + [ 398, 385 ], + [ 380, 402, 220, 20, 401 ], + [ 394, 377 ], + [], + [ 336, 392 ], + [ 377, 380 ], + [ 397 ], + [ 396, 345, 373 ], + [ 385, 390 ], + [ 386 ], + [], + [ 391, 383, 17 ], + [ 386, 381, 391 ], + [], [ 411 ], [ 411 ], [ 407, 0, 416 ], [ 406 ], [], [ 414 ], - [ 303, 412 ], + [ 221, 412 ], [ 405, 404 ], [ 410, 414 ], [], - [ 412, 333, 409, 422 ], + [ 412, 251, 409, 422 ], [], [ 12, 406 ], [], [], - [ 317 ], + [ 235 ], [ 425, 427 ], [ 422 ], - [ 414, 421, 425, 325 ], + [ 414, 421, 425, 243 ], [ 427, 429 ], [], [ 422, 420 ], [ 429, 431 ], - [ 432, 423, 420, 336 ], + [ 432, 423, 420, 254 ], [], [ 426, 423 ], [ 431, 432 ], @@ -2517,7 +2517,7 @@ const data = { [ 544, 495 ], [ 470, 503, 501 ], [ 441 ], - [ 379 ], + [ 297 ], [ 540, 541, 491 ], [], [ 476, 499 ], @@ -2535,7 +2535,7 @@ const data = { [ 479, 546, 553 ], [], [ 521, 524 ], - [ 525, 371 ], + [ 525, 289 ], [ 524 ], [ 524, 519 ], [], @@ -2545,7 +2545,7 @@ const data = { [ 514, 526, 480 ], [ 525, 484 ], [ 517, 511, 526 ], - [ 371, 505 ], + [ 289, 505 ], [ 518, 517 ], [ 513, 525, 511, 514 ], [ 524, 512, 520 ], @@ -2559,13 +2559,13 @@ const data = { [ 532, 34 ], [], [ 539, 528 ], - [ 542, 392, 543, 544 ], - [ 544, 370, 505, 379 ], - [ 562, 371 ], - [ 535, 386, 540 ], + [ 542, 310, 543, 544 ], + [ 544, 288, 505, 297 ], + [ 562, 289 ], + [ 535, 304, 540 ], [ 557, 551, 539, 541, 495 ], [ 540, 495, 542, 543 ], - [ 541, 393, 403, 536 ], + [ 541, 311, 321, 536 ], [ 536, 541 ], [ 536, 491, 537 ], [ 568, 84, 55 ], @@ -2587,7 +2587,7 @@ const data = { [ 549 ], [ 486, 553, 538 ], [ 569, 576 ], - [ 473, 371, 486 ], + [ 473, 289, 486 ], [ 566, 575, 560 ], [ 567, 565, 571 ], [ 470, 574, 566 ], @@ -2596,11 +2596,11 @@ const data = { [ 568, 609 ], [ 566, 576, 613 ], [ 568, 611, 616 ], - [ 138, 395, 394, 577 ], + [ 138, 313, 312, 577 ], [ 608, 567 ], [ 565, 569 ], [ 563, 571 ], - [ 573, 528, 386 ], + [ 573, 528, 304 ], [ 584, 588, 591 ], [ 466, 616, 580 ], [ 461, 579 ], diff --git a/play.css b/play.css index a9195f8..125388a 100644 --- a/play.css +++ b/play.css @@ -148,7 +148,7 @@ header.your_turn.austria { background-color: var(--color-light-austria); } #log { background-color: #f3ebd4 } #log div:empty { - min-height: 4px; + min-height: 6px; } #log .city_tip:hover { cursor: pointer; text-decoration: underline; } @@ -193,49 +193,65 @@ span.suit.reserve { color: var(--color-reserve); font-weight: bold; font-family: .space { position: absolute; - box-sizing: border-box; border: 4px solid transparent; - background-color: #0002; } .space.city { - width: 24px; - height: 24px; + width: calc(18px + 10px); + height: calc(18px + 10px); border-radius: 50%; } .space.minor_fortress { - width: 28px; - height: 28px; + width: calc(28px + 10px); + height: calc(28px + 10px); } .space.major_fortress { - width: 40px; - height: 40px; + width: calc(32px + 12px); + height: calc(32px + 12px); border-radius: 50%; } -.space.Austria { background-color: #fcffff; } -.space.France { background-color: #ea192e; } -.space.Prussia { background-color: #035783; } -.space.Netherlands { background-color: #7d7c7a; } -.space.Silesia { background-color: #91b4a0; } -.space.Saxony { background-color: #127a3b; } -.space.Bavaria { background-color: #fcb01f; } -.space.Poland { background-color: #cac180; } +.space.box { + width: 44px; + height: 44px; +} + +.space.box.england { + width: 48px; + height: 56px; +} + +/* +.space.country_austria { background-color: #fcffff; } +.space.country_france { background-color: #ea192e; } +.space.country_prussia { background-color: #035783; } +.space.country_netherlands { background-color: #7d7c7a; } +.space.country_silesia { background-color: #91b4a0; } +.space.country_saxony { background-color: #127a3b; } +.space.country_bavaria { background-color: #fcb01f; } +.space.country_poland { background-color: #cac180; } .space.minor_fortress.Empire { background-color: #b41a70; } .space.major_fortress.Empire { background-color: #b41a70; } .space.city.Empire { background-color: #e0d796; } +*/ + +.space { + border-color: white; + box-shadow: 0 0 2px 1px black, inset 0 0 2px 1px black; +} .space.tip { border-color: lime; - z-index: 3000; + box-shadow: 0 0 2px 1px black, inset 0 0 2px 1px black; + z-index: 2000; } .space.action { border-color: white; - box-shadow: 0 0 2px black, inset 0 0 2px black; + box-shadow: 0 0 2px 1px black, inset 0 0 2px 1px black; z-index: 2000; } @@ -410,6 +426,15 @@ span.suit.reserve { color: var(--color-reserve); font-weight: bold; font-family: } } +.card.zoom { + width: 330px; + height: 514px; + border-radius: 16px; +} + +.card.polcard { cursor: zoom-in } +.card.polcard.zoom { cursor: zoom-out } + .draw-break { margin-left: 145px; } .card.tc { margin-right: -145px; } .panel_body { padding-right: calc(18px + 145px); } diff --git a/play.html b/play.html index 1e6d210..45aa939 100644 --- a/play.html +++ b/play.html @@ -28,6 +28,7 @@
  • Political Cards + diff --git a/play.js b/play.js index 76a8079..188af9b 100644 --- a/play.js +++ b/play.js @@ -1,77 +1,865 @@ +"use strict" + +// vim: set nowrap: +/* globals data, view, action_button, action_button_with_argument, confirm_action_button, send_action, params +*/ + +function toggle_pieces() { + document.getElementById("pieces").classList.toggle("hide") +} + +/* DATA */ + +const P_FRANCE = 0 +const P_BAVARIA = 1 +const P_PRUSSIA = 2 +const P_SAXONY = 3 +const P_PRAGMATIC = 4 +const P_AUSTRIA = 5 + const cities = data.cities const last_city = cities.name.length - 1 +const ELIMINATED = data.cities.name.length +const REMOVED = ELIMINATED + 1 +const ELIMINATED_TRAIN_X = 1065 +const ELIMINATED_TRAIN_Y = 210 +const ELIMINATED_DISC_X = 1365 +const ELIMINATED_DISC_Y = 210 +const ELIMINATED_GENERAL_X = 1040 +const ELIMINATED_GENERAL_Y = 160 +const ELIMINATED_GENERAL_DX = 50 + +const power_class = [ "france", "bavaria", "prussia", "saxony", "pragmatic", "austria" ] +const power_name = [ "France", "Bavaria", "Prussia", "Saxony", "Pragmatic", "Austria" ] + +const all_powers = [ 0, 1, 2, 3, 4, 5 ] + +let suit_class = [ "spades", "clubs", "hearts", "diamonds", "reserve" ] +let suit_letter = [ "S", "C", "H", "D", "R" ] + +function to_deck(c) { + return c >> 7 +} + +function to_suit(c) { + return (c >> 4) & 7 +} + +function to_value(c) { + return c & 15 +} + +/* PANEL ORDER */ + +const panel_order = [ P_FRANCE, P_BAVARIA, P_PRUSSIA, P_SAXONY, P_PRAGMATIC, P_AUSTRIA, P_AUSTRIA+1 ] +const panel_start = { + "Observer": P_FRANCE, + "Louis XV": P_FRANCE, + "Frederick": P_PRUSSIA, + "Maria Theresa": P_AUSTRIA, +} + +function remember_position(e) { + if (e.parentElement) { + let rect = e.getBoundingClientRect() + e.my_parent = e.parentElement + e.my_x = rect.x + e.my_y = rect.y + } else { + e.my_parent = null + e.my_x = 0 + e.my_y = 0 + } +} + +function animate_position(e) { + if (e.parentElement) { + if (e.my_parent) { + let rect = e.getBoundingClientRect() + let dx = e.my_x - rect.x + let dy = e.my_y - rect.y + if (dx !== 0 || dy !== 0) { + e.animate( + [ + { transform: `translate(${dx}px, ${dy}px)`, }, + { transform: "translate(0, 0)", }, + ], + { duration: 333, easing: "ease" } + ) + } + } + } +} + +function sort_power_panel(animate) { + let start = panel_start[params.role] | 0 + + if (animate) + for (let i = 0; i < 7; ++i) + remember_position(ui.power_panel[i]) + + ui.power_panel_list.replaceChildren() + for (let i = 0; i < 7; ++i) { + let p = panel_order[(i + start) % 7] + ui.power_panel_list.appendChild(ui.power_panel[p]) + } + + if (view && view.actions) + ui.power_panel_list.prepend(ui.power_panel[view.power]) + + if (animate) + for (let i = 0; i < 7; ++i) + animate_position(ui.power_panel[i]) +} + +/* BUILD UI */ + const ui = { - map_pieces: document.getElementById("pieces"), + prompt: document.getElementById("prompt"), + status: document.getElementById("status"), + header: document.querySelector("header"), + spaces_element: document.getElementById("spaces"), + pieces_element: document.getElementById("pieces"), + markers_element: document.getElementById("markers"), + political_display: document.getElementById("political_display"), + power_panel_list: document.getElementById("power_panel_list"), + power_header: [ + document.getElementById("hand_france_header"), + document.getElementById("hand_bavaria_header"), + document.getElementById("hand_prussia_header"), + document.getElementById("hand_saxony_header"), + document.getElementById("hand_pragmatic_header"), + document.getElementById("hand_austria_header"), + document.getElementById("political_header"), + ], + power_panel: [ + document.getElementById("hand_france_panel"), + document.getElementById("hand_bavaria_panel"), + document.getElementById("hand_prussia_panel"), + document.getElementById("hand_saxony_panel"), + document.getElementById("hand_pragmatic_panel"), + document.getElementById("hand_austria_panel"), + document.getElementById("political_panel"), + ], + hand: [ + document.getElementById("hand_france"), + document.getElementById("hand_bavaria"), + document.getElementById("hand_prussia"), + document.getElementById("hand_saxony"), + document.getElementById("hand_pragmatic"), + document.getElementById("hand_austria"), + ], cities: [], - roads: [], + action_register: [], +} + +function register_action(target, action, id) { + target.my_id = id + target.my_action = action + target.onmousedown = (evt) => on_click_action(evt, target) + ui.action_register.push(target) +} + +function on_click_action(evt, target) { + if (evt.button === 0) + if (send_action(target.my_action, target.my_id)) + evt.stopPropagation() +} + +function process_actions() { + for (let target of ui.action_register) + target.classList.toggle("action", is_action(target.my_action, target.my_id)) } -function make_road(type, x, y, dx, dy) { +function is_action(action, arg) { + if (arg === undefined) + return !!(view.actions && view.actions[action] === 1) + return !!(view.actions && view.actions[action] && set_has(view.actions[action], arg)) +} + +function create_element(action, id, style) { let e = document.createElement("div") - e.className = type - e.style.left = x + "px" - e.style.top = y + "px" - let a = Math.atan2(dy, dx) - let s = (Math.hypot(dx, dy) - 15) / 20 - e.style.transform = - "rotate(" + a + "rad)" + - "scale(" + s + ", 1)" - // TODO: rotate to align - map_pieces.appendChild(e) + e.className = style + register_action(e, action, id) + return e +} + +function create_piece(action, id, style) { + let e = document.createElement("div") + e.className = style + register_action(e, action, id) + e.onmouseenter = on_focus_piece + e.onmouseleave = on_blur_piece + return e +} + +function create_marker(style) { + let e = document.createElement("div") + e.className = style + return e +} + +function make_tc_deck(n) { + for (let suit = 0; suit <= 3; ++suit) { + for (let value = 2; value <= 10; ++value) { + let c = (n << 7) | (suit << 4) | value + ui.tc[c] = create_element("card", c, "card tc deck_" + (n+1) + " " + suit_class[suit] + " " + suit_letter[suit] + value) + } + } + for (let value = 2; value <= 3; ++value) { + let c = (n << 7) | (4 << 4) | value + ui.tc[c] = create_element("card", c, "card tc deck_" + (n+1) + " reserve R") + } +} + +function make_tc_deck_back(n) { + let list = [] + for (let i = 0; i < 38; ++i) { + let e = document.createElement("div") + e.className = "card tc reverse " + n + list.push(e) + } + return list +} + +function make_political_card(fc) { + let e = document.createElement("div") + if (fc === 0) + e.className = "card political reverse" + else + e.className = "card political c" + fc + return e +} + +function has_removed_all_pieces(pow) { + for (let p of all_power_generals[pow]) + if (view.pos[p] !== REMOVED) + return false + for (let p of all_power_trains[pow]) + if (view.pos[p] !== REMOVED) + return false + return true } function on_init() { - if (false) { - for (let a = 0; a <= last_city; ++a) { - for (let b of cities.major_roads[a]) { - if (a < b) { - let dx = cities.x[a] - cities.x[b] - let dy = cities.y[a] - cities.y[b] - let x = (cities.x[a] + cities.x[b]) / 2 - let y = (cities.y[a] + cities.y[b]) / 2 - make_road("major_road", x - 10, y - 3, dx, dy) - } - } - for (let b of cities.roads[a]) { - if (a < b) { - let dx = cities.x[a] - cities.x[b] - let dy = cities.y[a] - cities.y[b] - let x = (cities.x[a] + cities.x[b]) / 2 - let y = (cities.y[a] + cities.y[b]) / 2 - make_road("road", x - 10, y - 1, dx, dy) - } + ui.pieces = [ + create_piece("piece", 0, "piece cylinder france_1"), + create_piece("piece", 1, "piece cylinder france_2"), + create_piece("piece", 2, "piece cylinder france_3"), + create_piece("piece", 3, "piece cylinder france_4"), + create_piece("piece", 4, "piece cylinder france_5"), + create_piece("piece", 5, "piece cylinder bavaria_1"), + + create_piece("piece", 6, "piece cylinder prussia_1"), + create_piece("piece", 7, "piece cylinder prussia_2"), + create_piece("piece", 8, "piece cylinder prussia_3"), + create_piece("piece", 9, "piece cylinder prussia_4"), + create_piece("piece", 10, "piece cylinder saxony_1"), + create_piece("piece", 11, "piece cylinder pragmatic_1"), + create_piece("piece", 12, "piece cylinder pragmatic_2"), + create_piece("piece", 13, "piece cylinder pragmatic_3"), + + create_piece("piece", 14, "piece cylinder austria_1"), + create_piece("piece", 15, "piece cylinder austria_2"), + create_piece("piece", 16, "piece cylinder austria_3"), + create_piece("piece", 17, "piece cylinder austria_4"), + create_piece("piece", 18, "piece cylinder austria_5"), + create_piece("piece", 19, "piece cylinder austria_6"), + + create_piece("piece", 20, "piece cube france"), + create_piece("piece", 21, "piece cube france"), + create_piece("piece", 22, "piece cube bavaria"), + + create_piece("piece", 23, "piece cube prussia"), + create_piece("piece", 24, "piece cube prussia"), + create_piece("piece", 25, "piece cube saxony"), + create_piece("piece", 26, "piece cube pragmatic"), + + create_piece("piece", 27, "piece cube austria"), + create_piece("piece", 28, "piece cube austria"), + create_piece("piece", 29, "piece cube austria"), + + create_piece("piece", 30, "piece disc austria"), + create_piece("piece", 31, "piece disc austria"), + ] + + ui.troops = [] + for (let i = 0; i < 20; ++i) + ui.troops[i] = create_marker("hide") + for (let e of ui.troops) + ui.pieces_element.appendChild(e) + + /* + ui.conquest = [] + ui.retro = [] + for (let s of all_objectives) { + for (let pow = 0; pow < 7; ++pow) { + if (set_has(objective1[pow], s) || set_has(objective2[pow], s)) { + ui.conquest[s] = create_conquest("marker conquest " + power_class[pow], s) + ui.retro[s] = create_conquest("marker retroactive " + power_class[pow], s) } } } + */ + + ui.tc = [] + make_tc_deck(0) + make_tc_deck(1) + make_tc_deck(2) + make_tc_deck(3) + + ui.tc_back = [ + make_tc_deck_back("deck_1"), + make_tc_deck_back("deck_2"), + make_tc_deck_back("deck_3"), + make_tc_deck_back("deck_4"), + ] + + ui.combat = document.createElement("div") + ui.combat.id = "combat" + ui.combat.style.zIndex = 2000 + + ui.tcbreak = document.createElement("div") + ui.tcbreak.className = "draw-break" + + ui.political = [] + for (let fc = 0; fc <= 18; ++fc) + ui.political[fc] = make_political_card(fc) for (let a = 0; a <= last_city; ++a) { let e = ui.cities[a] = document.createElement("div") let x = cities.x[a] let y = cities.y[a] - if (data.type.major_fortress.includes(a)) { - e.className = "major fortress " + cities.country[a] - x -= 20 - y -= 20 + if (set_has(data.type.major_fortress, a)) { + e.className = "space major_fortress" + x -= 16 + 6 + 4 + y -= 16 + 6 + 4 + } + else if (set_has(data.type.minor_fortress, a)) { + e.className = "space minor_fortress" + x -= 14 + 5 + 4 + y -= 14 + 5 + 4 } - else if (data.type.minor_fortress.includes(a)) { - e.className = "minor fortress " + cities.country[a] - x -= 14 - y -= 14 + else if (set_has(data.type.box, a)) { + e.className = "space box" + if (data.cities.name[a] === "England") { + e.className = "space box england" + x -= 24 + 4 + y -= 28 + 4 + } else { + x -= 22 + 4 + y -= 22 + 4 + } } else { - e.className = "city " + cities.country[a] - x -= 12 - y -= 12 + e.className = "space city" + x -= 9 + 5 + 4 + y -= 9 + 5 + 4 } - e.classList.add("hide") + if (set_has(data.country.Austria, a)) e.classList.add("country_austria") + if (set_has(data.country.France, a)) e.classList.add("country_france") + if (set_has(data.country.Prussia, a)) e.classList.add("country_prussia") + if (set_has(data.country.Netherlands, a)) e.classList.add("country_netherlands") + if (set_has(data.country.Silesia, a)) e.classList.add("country_silesia") + if (set_has(data.country.Saxony, a)) e.classList.add("country_saxony") + if (set_has(data.country.Bavaria, a)) e.classList.add("country_bavaria") + if (set_has(data.country.Poland, a)) e.classList.add("country_poland") + if (set_has(data.country.Empire, a)) e.classList.add("country_empire") + + register_action(e, "space", a) + + e.onmouseenter = on_focus_city + e.onmouseleave = on_blur_city + + //e.classList.add("hide") e.style.left = x + "px" e.style.top = y + "px" - e.title = cities.name[a] - map_pieces.appendChild(e) + + ui.spaces_element.appendChild(e) } + + sort_power_panel(false) + + update_favicon() } on_init() + +/* TOOLTIPS */ + +function on_click_city_tip(loc) { + ui.cities[loc].scrollIntoView({ block: "center", inline: "center", behavior: "smooth" }) +} + +function on_focus_city_tip(s) { + ui.cities[s].classList.add("tip") +} + +function on_blur_city_tip(s) { + ui.cities[s].classList.remove("tip") +} + +function on_click_piece_tip(loc) { + ui.pieces[loc].scrollIntoView({ block: "center", inline: "center", behavior: "smooth" }) +} + +function on_focus_piece_tip(s) { + ui.pieces[s].classList.add("tip") +} + +function on_blur_piece_tip(s) { + ui.pieces[s].classList.remove("tip") +} + +function on_focus_city(evt) { + ui.status.textContent = data.cities.name[evt.target.my_id] +} + +function on_blur_city() { + ui.status.textContent = "" +} + +function on_focus_piece(evt) { + ui.status.textContent = piece_tooltip_name[evt.target.my_id] +} + +function on_blur_piece() { + ui.status.textContent = "" +} + +/* UPDATE UI */ + +function layout_general_offset(g, s) { + // if not selected: number of unselected generals below us + // if not selected: (number of unselected generals + 1) + number of selected generals below us + if (!set_has(view.selected, g)) { + let n = 0 + for (let i = g+1; i < 20; ++i) + if (view.pos[i] === s && !set_has(view.selected, i)) + ++n + return n + } else { + let n = 0 + for (let i = 0; i < 20; ++i) + if (view.pos[i] === s && !set_has(view.selected, i)) + ++n + if (n > 0) + ++n + for (let i = g+1; i < 20; ++i) + if (view.pos[i] === s && set_has(view.selected, i)) + ++n + return n + } +} + +function layout_general_offset_elim(g) { + let n = 0 + let p = get_cylinder_power(g) + for (let i of all_power_generals[p]) + if (i > g && view.pos[i] === ELIMINATED) + ++n + return n +} + +function layout_train_offset(g, s) { + let n = 0 + for (let i = g+1; i < 35; ++i) + if (view.pos[i] === s) + ++n + return n +} + +function get_cylinder_power(id) { + for (let p of all_powers) + if (set_has(all_power_generals[p], id)) + return p + return -1 +} + +function layout_general(id, s) { + let e = ui.pieces[id] + let x, y, n + + if (s === REMOVED) { + if (e.parentElement === ui.pieces_element) + e.remove() + return + } + if (e.parentElement !== ui.pieces_element) + ui.pieces_element.appendChild(e) + + if (s === ELIMINATED) { + n = layout_general_offset_elim(id) + x = ELIMINATED_GENERAL_X + ELIMINATED_GENERAL_DX * get_cylinder_power(id) + y = ELIMINATED_GENERAL_Y + } else { + n = layout_general_offset(id, s) + x = data.cities.x[s] + y = data.cities.y[s] + } + + let selected = set_has(view.selected, id) + + e.style.left = (x - 21) + "px" + e.style.top = (y - 29 - 15 * n) + "px" + e.style.zIndex = y + n + e.classList.toggle("selected", selected) + e.classList.toggle("oos", (view.oos & (1 <> 1 + let y = (data.cities.y[view.attacker] + data.cities.y[view.defender]) >> 1 + ui.combat.style.left = x - 20 + "px" + ui.combat.style.top = y - 20 + "px" +} + +function create_conquest(style, s) { + let x = data.cities.x[s] + let y = data.cities.y[s] + let e = document.createElement("div") + e.dataset.id = s + e.style.left = (x - 16) + "px" + e.style.top = (y - 16) + "px" + e.className = style + return e +} + +function update_favicon() { + let favicon = document.querySelector('link[rel="icon"]') + switch (params.role) { + case "Frederick": favicon.href = "favicon/favicon_frederick.png"; break + case "Elisabeth": favicon.href = "favicon/favicon_elisabeth.png"; break + case "Maria Theresa": favicon.href = "favicon/favicon_maria_theresa.png"; break + case "Pompadour": favicon.href = "favicon/favicon_pompadour.png"; break + } +} + +function cmp_tc(a, b) { + let ax = (to_suit(a) << 7) + (to_value(a) << 3) + to_deck(a) + let bx = (to_suit(b) << 7) + (to_value(b) << 3) + to_deck(b) + return ax - bx +} + +const colorize_S = '\u2660' +const colorize_C = '\u2663' +const colorize_H = '\u2665' +const colorize_D = '\u2666' +const colorize_R = '$1R' + +const suit_text = [ + '\u2660', + '\u2663', + '\u2665', + '\u2666', + 'R' +] + +function colorize(text) { + text = text.replaceAll("\u2660", colorize_S) + text = text.replaceAll("\u2663", colorize_C) + text = text.replaceAll("\u2665", colorize_H) + text = text.replaceAll("\u2666", colorize_D) + text = text.replace(/(\d+)R/g, colorize_R) + return text +} + +function on_update() { +// let text = colorize(view.prompt) +// if (text !== view.prompt) +// ui.prompt.innerHTML = text + + ui.header.classList.toggle("france", view.power === P_FRANCE) + ui.header.classList.toggle("bavaria", view.power === P_BAVARIA) + ui.header.classList.toggle("prussia", view.power === P_PRUSSIA) + ui.header.classList.toggle("saxony", view.power === P_SAXONY) + ui.header.classList.toggle("pragmatic", view.power === P_PRAGMATIC) + ui.header.classList.toggle("austira", view.power === P_AUSTRIA) + + sort_power_panel(true) + +/* + for (let p = 0; p < 20; ++p) + layout_general(p, view.pos[p]) + for (let p = 20; p < 30; ++p) + layout_train(p, view.pos[p]) + for (let p = 30; p < 32; ++p) + layout_hussar(p, view.pos[p]) +*/ + + let back = [ 0, 0, 0, 0 ] + + for (let pow of all_powers) { + /* + let banner = `${power_name[pow]} \u2014 ${view.pt[pow]} troops` + let m_obj = count_total_objectives(pow) + if (m_obj > 0) { + let n_obj = count_captured_objectives(pow) + if (pow === P_AUSTRIA && view.oo) + m_obj += "*" + banner += ` \u2014 ${n_obj} of ${m_obj} objectives` + } + ui.power_header[pow].textContent = banner + */ + + ui.hand[pow].replaceChildren() + view.hand[pow].sort(cmp_tc) + for (let c of view.hand[pow]) { + if ((c & 15) === 0) + ui.hand[pow].appendChild(ui.tc_back[c>>7][back[c>>7]++]) + else + ui.hand[pow].appendChild(ui.tc[c]) + } + } + + if (view.draw) { + view.draw.sort(cmp_tc) + if (view.hand[view.power].length > 0) + ui.hand[view.power].appendChild(ui.tcbreak) + for (let c of view.draw) + ui.hand[view.power].appendChild(ui.tc[c]) + } + + /* + ui.political_display.replaceChildren() + if (view.oo > 0) + ui.political_display.appendChild(ui.tc[view.oo]) + ui.political_display.appendChild(ui.fate[0]) + if (typeof view.fate === "object") + for (let c of view.fate) + ui.political_display.appendChild(ui.fate[c]) + */ + + ui.markers_element.replaceChildren() + /* + for (let s of view.conquest) + ui.markers_element.appendChild(ui.conquest[s]) + for (let s of view.retro) + ui.markers_element.appendChild(ui.retro[s]) + */ + + if (view.attacker !== undefined && view.defender !== undefined) { + ui.markers_element.appendChild(ui.combat) + layout_combat_marker() + } + + for (let v = 16; v >= 0; --v) + action_button_with_argument("value", v, v) + + for (let p = 0; p < 24; ++p) + action_button_with_argument("detach", p, "Detach " + piece_button_name[p]) + + action_button("take", "Take") + action_button("give", "Give") + action_button("recruit", "Recruit") + action_button("transfer", "Transfer") + + action_button("stop", "Stop") + action_button("pass", "Pass") + action_button("next", "Next") + action_button("done", "Done") + + action_button("end_cards", "End card draw") + action_button("end_setup", "End setup") + action_button("end_recruit", "End recruit") + action_button("end_movement", "End movement") + action_button("end_combat", "End combat") + action_button("end_supply", "End supply") + action_button("end_turn", "End turn") + + confirm_action_button("confirm_end_movement", "End movement", + "You still have UNMOVED pieces.?") + + action_button("undo", "Undo") + + process_actions() +} + +/* LOG */ + +const piece_log_name = [ +] + +const piece_power = [ +] + +const piece_button_name = [ +] + +const piece_tooltip_name = [ +] + +function sub_piece(match, p1) { + let x = p1 | 0 + let n = piece_log_name[x] + let p = power_class[piece_power[x]] + return `${n}` +} + +function sub_space(match, p1) { + let x = p1 | 0 + let n = data.cities.name[x] + return `${n}` +} + +function sub_tc(match, p1) { + return value + suit_text[suit] +} + +function on_log(text) { + let p = document.createElement("div") + + if (text.match(/^>>/)) { + text = text.substring(2) + p.className = "ii" + } + + if (text.match(/^>/)) { + text = text.substring(1) + p.className = "i" + } + + if (text.match(/^!/)) { + text = "Combat" + p.className = "combat" + } + + text = text.replace(/&/g, "&") + text = text.replace(//g, ">") + + text = text.replace(/S(\d+)/g, sub_space) + text = text.replace(/P(\d+)/g, sub_piece) + text = colorize(text) + + if (text.match(/^\$(\d+)/)) { + let fx = parseInt(text.substring(1)) + if (fx < 48 + 6) + text = `
    ${fate_flavor_text[fx]}
    ${fate_effect_text[fx]}
    ` + else + text = `
    ${fate_flavor_text[fx]}
    ` + } + else if (text.match(/^# /)) { + p.className = "h fate" + text = text.substring(2) + } + else if (text.match(/^\.s1/)) + text = the_war_in_the_west_text + else if (text.match(/^\.s2/)) + text = the_austrian_theater_text + else if (text.match(/^=\d/)) { + p.className = "h " + power_class[text[1]] + text = power_name[text[1]] + } + + p.innerHTML = text + return p +} + +/* COMMON LIBRARY */ + +function array_insert(array, index, item) { + for (let i = array.length; i > index; --i) + array[i] = array[i - 1] + array[index] = item +} + +function set_has(set, item) { + if (set === item) return true + if (set === undefined) return false + if (set === null) return false + let a = 0 + let b = set.length - 1 + while (a <= b) { + let m = (a + b) >> 1 + let x = set[m] + if (item < x) + b = m - 1 + else if (item > x) + a = m + 1 + else + return true + } + return false +} + +function set_add(set, item) { + let a = 0 + let b = set.length - 1 + while (a <= b) { + let m = (a + b) >> 1 + let x = set[m] + if (item < x) + b = m - 1 + else if (item > x) + a = m + 1 + else + return + } + array_insert(set, a, item) +} + +function set_add_all(set, other) { + for (let item of other) + set_add(set, item) +} diff --git a/rules.js b/rules.js index 51218c6..953c8d5 100644 --- a/rules.js +++ b/rules.js @@ -58,7 +58,12 @@ console.log(objectives) console.log("TAKE", anti_objectives) console.log("PROT", prot_objectives) -exports.roles = [ "Maria Theresa", "Frederick", "Louis XV" ] +exports.roles = [ + "Louis XV", + "Frederick", + "Maria Theresa", +] + exports.scenarios = [ "Standard", "Introductory" ] const P_AUSTRIA = 0 diff --git a/tools/layout.svg b/tools/layout.svg index 7fe274c..841fb90 100644 --- a/tools/layout.svg +++ b/tools/layout.svg @@ -40,10 +40,10 @@ inkscape:window-height="480" id="namedview6" showgrid="false" - inkscape:zoom="0.42996109" - inkscape:cx="1321.8811" - inkscape:cy="745.19143" - inkscape:current-layer="svg4" + inkscape:zoom="8.3661045" + inkscape:cx="236.64652" + inkscape:cy="1572.9559" + inkscape:current-layer="g3013" inkscape:document-rotation="0" showguides="false">