From 842b8915070cdb982a212a1be2a9805e095bf571 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Thu, 16 May 2024 21:33:44 +0200 Subject: numeric ids --- data.js | 1155 ++++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 809 insertions(+), 346 deletions(-) (limited to 'data.js') diff --git a/data.js b/data.js index 7e5c8f4..011d0fd 100644 --- a/data.js +++ b/data.js @@ -1,360 +1,823 @@ "use strict" -let BOXES = {} -let BLOCKADE = {} -let COLONIES = {} -let SPACES = {} -let PATH_INDEX = {} -let PATH_NAME -let PATH_TYPE - -const GENERALS = { - Arnold: { owner: "American", strategy: 1, battle: 3, agility: 2, bonus: false }, - Gates: { owner: "American", strategy: 2, battle: 2, agility: 1, bonus: false }, - Greene: { owner: "American", strategy: 1, battle: 4, agility: 2, bonus: true }, - Lafayette: { owner: "American", strategy: 1, battle: 2, agility: 1, bonus: false }, - Lee: { owner: "American", strategy: 2, battle: 1, agility: 1, bonus: false }, - Lincoln: { owner: "American", strategy: 2, battle: 1, agility: 1, bonus: false }, - Washington: { owner: "American", strategy: 1, battle: 5, agility: 2, bonus: true }, - - Burgoyne: { owner: "British", strategy: 2, battle: 2, agility: 1, bonus: false }, - Carleton: { owner: "British", strategy: 3, battle: 3, agility: 2, bonus: false }, - Clinton: { owner: "British", strategy: 3, battle: 4, agility: 2, bonus: false }, - Cornwallis: { owner: "British", strategy: 2, battle: 4, agility: 2, bonus: false }, - Howe: { owner: "British", strategy: 3, battle: 6, agility: 3, bonus: false }, - - Rochambeau: { owner: "French", strategy: 2, battle: 4, agility: 2, bonus: false }, +var data + +;(function () { + +function array_insert(array, index, item) { + for (let i = array.length; i > index; --i) + array[i] = array[i - 1] + array[index] = item } -function getEdge(A, B) { - if (A > B) - return PATHS[B + "/" + A] - return PATHS[A + "/" + B] +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 () { - let info = {} +function make_index_from_list(list) { + let map = {} + for (let i = 0; i < list.length; ++i) + map[list[i]] = i + return map +} - function box(category, A, x, y) { - x += 40 - y += 36 - BOXES[A] = { name: A, category: category, x: x, y: y } - } +const BOXES = {} - function space(colony, name, x, y, type) { - x += 40 - y += 36 - if (type == "winter-quarters") { - x += 1 - y += 1 - } - if (!(colony in COLONIES)) - COLONIES[colony] = [] - COLONIES[colony].push(name) - SPACES[name] = { name: name, colony: colony, type: type, port: false, x: x, y: y, exits: [] } - } +// === GENERALS === - function line(A, B, type) { - if (A > B) { - let C = B - B = A - A = C - } - let id = A + "/" + B - SPACES[A].exits.push(B) - SPACES[B].exits.push(A) - info[id] = type - if (!(A in PATH_INDEX)) - PATH_INDEX[A] = {} - if (!(B in PATH_INDEX)) - PATH_INDEX[B] = {} - PATH_INDEX[A][B] = -1 - PATH_INDEX[B][A] = -1 - } +const generals = [ + { name: "Arnold", owner: "American", strategy: 1, battle: 3, agility: 2, bonus: false }, + { name: "Gates", owner: "American", strategy: 2, battle: 2, agility: 1, bonus: false }, + { name: "Greene", owner: "American", strategy: 1, battle: 4, agility: 2, bonus: true }, + { name: "Lafayette", owner: "American", strategy: 1, battle: 2, agility: 1, bonus: false }, + { name: "Lee", owner: "American", strategy: 2, battle: 1, agility: 1, bonus: false }, + { name: "Lincoln", owner: "American", strategy: 2, battle: 1, agility: 1, bonus: false }, + { name: "Washington", owner: "American", strategy: 1, battle: 5, agility: 2, bonus: true }, - space("CA", "Fort Detroit", 55, 673, "regular-space") - space("CA", "Montreal", 1000, 159, "fortified-port") - space("CA", "Quebec", 1122, 57, "fortified-port") - space("CT", "Hartford", 1183, 749, "winter-quarters") - space("CT", "New Haven", 1088, 736, "regular-space") - space("DE", "Wilmington DE", 885, 1079, "winter-quarters") - space("GA", "Augusta", 140, 2060, "regular-space") - space("GA", "Savannah", 227, 2271, "regular-space") - space("GA", "St. Mary's", 180, 2394, "regular-space") - space("MA", "Barnstable", 1394, 705, "regular-space") - space("MA", "Boston", 1327, 592, "winter-quarters") - space("MA", "Falmouth", 1334, 410, "regular-space") - space("MA", "Lexington Concord", 1218, 628, "regular-space") - space("MA", "Springfield", 1095, 624, "winter-quarters") - space("MD", "Baltimore", 769, 1105, "winter-quarters") - space("MD", "Fort Cumberland", 446, 1098, "regular-space") - space("MD", "Frederick Town", 646, 1097, "regular-space") - space("NC", "Charlotte", 215, 1653, "regular-space") - space("NC", "Gilbert Town", 123, 1568, "regular-space") - space("NC", "Hillsboro", 484, 1582, "regular-space") - space("NC", "New Bern", 764, 1670, "regular-space") - space("NC", "Salem", 308, 1561, "regular-space") - space("NC", "Wake (Raleigh)", 606, 1671, "regular-space") - space("NC", "Wilmington NC", 676, 1816, "regular-space") - space("NH", "Brattleboro", 1102, 486, "regular-space") - space("NH", "Concord", 1214, 460, "regular-space") - space("NH", "Norwich", 1125, 342, "winter-quarters") - space("NJ", "Monmouth", 998, 1074, "regular-space") - space("NJ", "Morristown", 864, 831, "regular-space") - space("NJ", "New Brunswick", 961, 942, "regular-space") - space("NY", "Albany", 965, 626, "winter-quarters") - space("NY", "Fort Niagara", 461, 526, "regular-space") - space("NY", "Fort Stanwix", 877, 483, "winter-quarters") - space("NY", "Genesee", 668, 582, "regular-space") - space("NY", "Long Island", 1147, 868, "regular-space") - space("NY", "New York", 1024, 838, "winter-quarters") - space("NY", "Oswego", 768, 424, "regular-space") - space("NY", "Saratoga", 992, 496, "regular-space") - space("NY", "Ticonderoga", 993, 355, "winter-quarters") - space("NY", "Westchester", 955, 747, "regular-space") - space("PA", "Bassett Town", 147, 984, "regular-space") - space("PA", "Harrisburg", 555, 880, "regular-space") - space("PA", "Philadelphia", 846, 961, "fortified-port") - space("PA", "Pittsburgh", 439, 958, "winter-quarters") - space("PA", "Reading", 684, 900, "regular-space") - space("PA", "Wyoming Valley", 685, 747, "winter-quarters") - space("PA", "York", 589, 992, "regular-space") - space("RI", "Newport", 1289, 736, "winter-quarters") - space("SC", "Camden", 346, 1773, "regular-space") - space("SC", "Charleston", 444, 2050, "fortified-port") - space("SC", "Cheraw", 496, 1795, "regular-space") - space("SC", "Eutaw Springs", 404, 1905, "regular-space") - space("SC", "Fort Prince George", 74, 1773, "regular-space") - space("SC", "Georgetown", 574, 1915, "regular-space") - space("SC", "Ninety Six", 222, 1932, "regular-space") - space("VA", "Abingdon", 61, 1451, "regular-space") - space("VA", "Alexandria", 653, 1217, "winter-quarters") - space("VA", "Charlottesville", 434, 1257, "winter-quarters") - space("VA", "Fincastle", 349, 1402, "regular-space") - space("VA", "Fort Chiswell", 212, 1408, "regular-space") - space("VA", "Lynch's Ferry", 486, 1444, "regular-space") - space("VA", "Norfolk", 781, 1450, "winter-quarters") - space("VA", "Petersburg", 634, 1446, "regular-space") - space("VA", "Point Pleasant", 132, 1218, "regular-space") - space("VA", "Richmond", 608, 1323, "winter-quarters") - space("VA", "Yorktown", 767, 1317, "regular-space") - - box("SEA", "Sea1", 1277, 65, "blockade") - box("SEA", "Sea2", 1469, 514, "blockade") - box("SEA", "Sea3", 1213, 981, "blockade") - box("SEA", "Sea4", 1058, 1174, "blockade") - box("SEA", "Sea5", 947, 1395, "blockade") - box("SEA", "Sea6", 637, 2027, "blockade") - box("SEA", "Sea7", 359, 2358, "blockade") - - box("HOLDING", "Continental Congress Dispersed", 545, 350) - box("HOLDING", "Captured Generals", 1463, 80) - box("HOLDING", "British Leader Reinforcements", 1425, 1745) - box("HOLDING", "American Leader Reinforcements", 400, 310) - box("HOLDING", "French Reinforcements", 150, 340) - - box("ALLIANCE", "French Alliance Track 0", 898, 2240) - box("ALLIANCE", "French Alliance Track 1", 964, 2240) - box("ALLIANCE", "French Alliance Track 2", 1030, 2240) - box("ALLIANCE", "French Alliance Track 3", 1096, 2240) - box("ALLIANCE", "French Alliance Track 4", 1162, 2240) - box("ALLIANCE", "French Alliance Track 5", 1228, 2240) - box("ALLIANCE", "French Alliance Track 6", 1294, 2240) - box("ALLIANCE", "French Alliance Track 7", 1360, 2240) - box("ALLIANCE", "French Alliance Track 8", 1426, 2240) - box("ALLIANCE", "French Alliance Track 9", 1492, 2240) - - box("TURN", "Game Turn 1775", 898, 2370) - box("TURN", "Game Turn 1776", 964, 2370) - box("TURN", "Game Turn 1777", 1030, 2370) - box("TURN", "Game Turn 1778", 1096, 2370) - box("TURN", "Game Turn 1779", 1162, 2370) - box("TURN", "Game Turn 1780", 1228, 2370) - box("TURN", "Game Turn 1781", 1294, 2370) - box("TURN", "Game Turn 1782", 1360, 2370) - box("TURN", "Game Turn 1783", 1426, 2370) - - box("CONTROL", "CA", 1376, 967) - box("CONTROL", "NH", 1458, 1006) - box("CONTROL", "NY", 1375, 1081) - box("CONTROL", "MA", 1491, 1081) - box("CONTROL", "CT", 1455, 1156) - box("CONTROL", "RI", 1533, 1156) - box("CONTROL", "PA", 1299, 1194) - box("CONTROL", "NJ", 1376, 1189) - box("CONTROL", "MD", 1299, 1266) - box("CONTROL", "DE", 1376, 1266) - box("CONTROL", "VA", 1241, 1337) - box("CONTROL", "NC", 1260, 1407) - box("CONTROL", "SC", 1212, 1479) - box("CONTROL", "GA", 1164, 1550) - - function wilderness(A, B) { - line(A, B, "wilderness") - } - function path(A, B) { - line(A, B, "path") - } - function sea(space, zone) { - SPACES[space].port = true - BLOCKADE[space] = zone - } + { name: "Rochambeau", owner: "French", strategy: 2, battle: 4, agility: 2, bonus: false }, - wilderness("Quebec", "Falmouth") - wilderness("Fort Detroit", "Bassett Town") - wilderness("Bassett Town", "Point Pleasant") - - path("Quebec", "Montreal") - path("Montreal", "Ticonderoga") - path("Montreal", "Oswego") - path("Oswego", "Fort Niagara") - path("Oswego", "Fort Stanwix") - path("Fort Niagara", "Fort Detroit") - path("Fort Niagara", "Genesee") - path("Ticonderoga", "Norwich") - path("Ticonderoga", "Saratoga") - path("Norwich", "Brattleboro") - path("Norwich", "Concord") - path("Concord", "Falmouth") - path("Concord", "Brattleboro") - path("Saratoga", "Brattleboro") - path("Saratoga", "Albany") - path("Brattleboro", "Springfield") - path("Fort Stanwix", "Albany") - path("Albany", "Springfield") - path("Lexington Concord", "Springfield") - path("Lexington Concord", "Boston") - path("Falmouth", "Boston") - path("Barnstable", "Boston") - path("Newport", "Boston") - path("Newport", "Hartford") - path("Springfield", "Hartford") - path("New Haven", "Hartford") - path("New Haven", "New York") - path("New Haven", "Westchester") - path("New York", "Westchester") - path("New York", "Long Island") - path("Newport", "Lexington Concord") - path("Albany", "Westchester") - path("Fort Stanwix", "Genesee") - path("Genesee", "Wyoming Valley") - path("Fort Niagara", "Pittsburgh") - path("Morristown", "Westchester") - path("Morristown", "Wyoming Valley") - path("Morristown", "Reading") - path("Morristown", "New Brunswick") - path("Morristown", "New York") - path("New York", "New Brunswick") - path("Monmouth", "New Brunswick") - path("Philadelphia", "New Brunswick") - path("Monmouth", "Philadelphia") - path("Reading", "Philadelphia") - path("Wyoming Valley", "Reading") - path("Wilmington DE", "Philadelphia") - path("Wilmington DE", "Baltimore") - path("Bassett Town", "Pittsburgh") - path("Fort Cumberland", "Pittsburgh") - path("Harrisburg", "Pittsburgh") - path("Harrisburg", "York") - path("Reading", "York") - path("Harrisburg", "Reading") - path("Frederick Town", "York") - path("Frederick Town", "Baltimore") - path("Frederick Town", "Alexandria") - path("Frederick Town", "Charlottesville") - path("Frederick Town", "Fort Cumberland") - path("Richmond", "Alexandria") - path("Richmond", "Yorktown") - path("Richmond", "Petersburg") - path("Richmond", "Lynch's Ferry") - path("Richmond", "Charlottesville") - path("Richmond", "Norfolk") - path("Fincastle", "Charlottesville") - path("Fincastle", "Lynch's Ferry") - path("Fincastle", "Fort Chiswell") - path("Point Pleasant", "Fort Chiswell") - path("Abingdon", "Fort Chiswell") - path("Abingdon", "Gilbert Town") - path("Fort Prince George", "Gilbert Town") - path("Charlotte", "Gilbert Town") - path("Charlotte", "Salem") - path("Hillsboro", "Salem") - path("Cheraw", "Salem") - path("Lynch's Ferry", "Salem") - path("Charlotte", "Camden") - path("Abingdon", "Fort Prince George") - path("New Bern", "Norfolk") - path("Petersburg", "Norfolk") - path("Petersburg", "Wake (Raleigh)") - path("New Bern", "Wake (Raleigh)") - path("Hillsboro", "Wake (Raleigh)") - path("Petersburg", "Hillsboro") - path("Petersburg", "Lynch's Ferry") - path("Wilmington NC", "Wake (Raleigh)") - path("Wilmington NC", "Cheraw") - path("Wilmington NC", "Georgetown") - path("Cheraw", "Georgetown") - path("Cheraw", "Camden") - path("Ninety Six", "Fort Prince George") - path("Ninety Six", "Camden") - path("Ninety Six", "Augusta") - path("Eutaw Springs", "Camden") - path("Eutaw Springs", "Charleston") - path("Georgetown", "Charleston") - path("Savannah", "Charleston") - path("Alexandria", "Baltimore") - path("Savannah", "Augusta") - path("Savannah", "St. Mary's") - path("Charlottesville", "Lynch's Ferry") - - sea("Quebec", "Sea1") - sea("Montreal", "Sea1") - - sea("Falmouth", "Sea2") - sea("Boston", "Sea2") - sea("Barnstable", "Sea2") - sea("Newport", "Sea2") - - sea("New Haven", "Sea3") - sea("New York", "Sea3") - sea("Long Island", "Sea3") - - sea("Philadelphia", "Sea4") - sea("Wilmington DE", "Sea4") - - sea("Baltimore", "Sea5") - sea("Alexandria", "Sea5") - sea("Yorktown", "Sea5") - sea("Norfolk", "Sea5") - - sea("New Bern", "Sea6") - sea("Wilmington NC", "Sea6") - sea("Charleston", "Sea6") - - sea("Savannah", "Sea7") - sea("St. Mary's", "Sea7") - - PATH_NAME = Object.keys(info).sort() - PATH_TYPE = [] - for (let id of PATH_NAME) - PATH_TYPE.push(info[id]) - for (let a in PATH_INDEX) { - for (let b in PATH_INDEX[a]) { - let id = a < b ? a + "/" + b : b + "/" + a - PATH_INDEX[a][b] = PATH_NAME.indexOf(id) - } - } -})() + { name: "Burgoyne", owner: "British", strategy: 2, battle: 2, agility: 1, bonus: false }, + { name: "Carleton", owner: "British", strategy: 3, battle: 3, agility: 2, bonus: false }, + { name: "Clinton", owner: "British", strategy: 3, battle: 4, agility: 2, bonus: false }, + { name: "Cornwallis", owner: "British", strategy: 2, battle: 4, agility: 2, bonus: false }, + { name: "Howe", owner: "British", strategy: 3, battle: 6, agility: 3, bonus: false }, +] + +const general_index = make_index_from_list(generals.map(x=>x.name)) + +// === SPACES === + +const spaces = [] +const space_index = {} -if (typeof module == "object") { - module.exports = { - GENERALS: GENERALS, - BOXES: BOXES, - COLONIES: COLONIES, - SPACES: SPACES, - PATH_NAME: PATH_NAME, - PATH_TYPE: PATH_TYPE, - PATH_INDEX: PATH_INDEX, - BLOCKADE, +const colony_name = [ "Canada", "NH", "NY", "MA", "CT", "RI", "PA", "NJ", "MD", "DE", "VA", "NC", "SC", "GA" ] +const colony_spaces = colony_name.map(x => []) + +const Canada = 0 +const NH = 1 +const NY = 2 +const MA = 3 +const CT = 4 +const RI = 5 +const PA = 6 +const NJ = 7 +const MD = 8 +const DE = 9 +const VA = 10 +const NC = 11 +const SC = 12 +const GA = 13 + +function box(category, A, x, y) { + x += 40 + y += 36 + BOXES[A] = { name: A, category: category, x: x, y: y } +} + +function space(colony, name, x, y, type) { + x += 40 + y += 36 + if (type === "winter-quarters") { + x += 1 + y += 1 } + + let ix = spaces.length + space_index[name] = ix + spaces.push({ name: name, colony, type, port: 0, path: [], wilderness: [], adjacent: [], x, y }) + set_add(colony_spaces[colony], ix) +} + +function not_space(type, name, x, y) { + // box that's not a space + x += 40 + y += 36 + let ix = spaces.length + space_index[name] = ix + spaces.push({ name, type, x, y }) +} + +function line(A, B, type) { + A = space_index[A] + B = space_index[B] + set_add(spaces[A].adjacent, B) + set_add(spaces[B].adjacent, A) + set_add(spaces[A][type], B) + set_add(spaces[B][type], A) +} + +space(Canada, "Fort Detroit", 55, 673, "regular-space") +space(Canada, "Montreal", 1000, 159, "fortified-port") +space(Canada, "Quebec", 1122, 57, "fortified-port") +space(CT, "Hartford", 1183, 749, "winter-quarters") +space(CT, "New Haven", 1088, 736, "regular-space") +space(DE, "Wilmington DE", 885, 1079, "winter-quarters") +space(GA, "Augusta", 140, 2060, "regular-space") +space(GA, "Savannah", 227, 2271, "regular-space") +space(GA, "St. Mary's", 180, 2394, "regular-space") +space(MA, "Barnstable", 1394, 705, "regular-space") +space(MA, "Boston", 1327, 592, "winter-quarters") +space(MA, "Falmouth", 1334, 410, "regular-space") +space(MA, "Lexington Concord", 1218, 628, "regular-space") +space(MA, "Springfield", 1095, 624, "winter-quarters") +space(MD, "Baltimore", 769, 1105, "winter-quarters") +space(MD, "Fort Cumberland", 446, 1098, "regular-space") +space(MD, "Frederick Town", 646, 1097, "regular-space") +space(NC, "Charlotte", 215, 1653, "regular-space") +space(NC, "Gilbert Town", 123, 1568, "regular-space") +space(NC, "Hillsboro", 484, 1582, "regular-space") +space(NC, "New Bern", 764, 1670, "regular-space") +space(NC, "Salem", 308, 1561, "regular-space") +space(NC, "Wake (Raleigh)", 606, 1671, "regular-space") +space(NC, "Wilmington NC", 676, 1816, "regular-space") +space(NH, "Brattleboro", 1102, 486, "regular-space") +space(NH, "Concord", 1214, 460, "regular-space") +space(NH, "Norwich", 1125, 342, "winter-quarters") +space(NJ, "Monmouth", 998, 1074, "regular-space") +space(NJ, "Morristown", 864, 831, "regular-space") +space(NJ, "New Brunswick", 961, 942, "regular-space") +space(NY, "Albany", 965, 626, "winter-quarters") +space(NY, "Fort Niagara", 461, 526, "regular-space") +space(NY, "Fort Stanwix", 877, 483, "winter-quarters") +space(NY, "Genesee", 668, 582, "regular-space") +space(NY, "Long Island", 1147, 868, "regular-space") +space(NY, "New York", 1024, 838, "winter-quarters") +space(NY, "Oswego", 768, 424, "regular-space") +space(NY, "Saratoga", 992, 496, "regular-space") +space(NY, "Ticonderoga", 993, 355, "winter-quarters") +space(NY, "Westchester", 955, 747, "regular-space") +space(PA, "Bassett Town", 147, 984, "regular-space") +space(PA, "Harrisburg", 555, 880, "regular-space") +space(PA, "Philadelphia", 846, 961, "fortified-port") +space(PA, "Pittsburgh", 439, 958, "winter-quarters") +space(PA, "Reading", 684, 900, "regular-space") +space(PA, "Wyoming Valley", 685, 747, "winter-quarters") +space(PA, "York", 589, 992, "regular-space") +space(RI, "Newport", 1289, 736, "winter-quarters") +space(SC, "Camden", 346, 1773, "regular-space") +space(SC, "Charleston", 444, 2050, "fortified-port") +space(SC, "Cheraw", 496, 1795, "regular-space") +space(SC, "Eutaw Springs", 404, 1905, "regular-space") +space(SC, "Fort Prince George", 74, 1773, "regular-space") +space(SC, "Georgetown", 574, 1915, "regular-space") +space(SC, "Ninety Six", 222, 1932, "regular-space") +space(VA, "Abingdon", 61, 1451, "regular-space") +space(VA, "Alexandria", 653, 1217, "winter-quarters") +space(VA, "Charlottesville", 434, 1257, "winter-quarters") +space(VA, "Fincastle", 349, 1402, "regular-space") +space(VA, "Fort Chiswell", 212, 1408, "regular-space") +space(VA, "Lynch's Ferry", 486, 1444, "regular-space") +space(VA, "Norfolk", 781, 1450, "winter-quarters") +space(VA, "Petersburg", 634, 1446, "regular-space") +space(VA, "Point Pleasant", 132, 1218, "regular-space") +space(VA, "Richmond", 608, 1323, "winter-quarters") +space(VA, "Yorktown", 767, 1317, "regular-space") + +not_space("box", "Continental Congress Dispersed", 545, 350) +not_space("box", "Captured Generals", 1463, 80) +not_space("box", "British Leader Reinforcements", 1425, 1745) +not_space("box", "American Leader Reinforcements", 400, 310) +not_space("box", "French Reinforcements", 150, 340) + +box("SEA", "Sea1", 1277, 65, "blockade") +box("SEA", "Sea2", 1469, 514, "blockade") +box("SEA", "Sea3", 1213, 981, "blockade") +box("SEA", "Sea4", 1058, 1174, "blockade") +box("SEA", "Sea5", 947, 1395, "blockade") +box("SEA", "Sea6", 637, 2027, "blockade") +box("SEA", "Sea7", 359, 2358, "blockade") + +box("ALLIANCE", "French Alliance Track 0", 898, 2240) +box("ALLIANCE", "French Alliance Track 1", 964, 2240) +box("ALLIANCE", "French Alliance Track 2", 1030, 2240) +box("ALLIANCE", "French Alliance Track 3", 1096, 2240) +box("ALLIANCE", "French Alliance Track 4", 1162, 2240) +box("ALLIANCE", "French Alliance Track 5", 1228, 2240) +box("ALLIANCE", "French Alliance Track 6", 1294, 2240) +box("ALLIANCE", "French Alliance Track 7", 1360, 2240) +box("ALLIANCE", "French Alliance Track 8", 1426, 2240) +box("ALLIANCE", "French Alliance Track 9", 1492, 2240) + +box("TURN", "Game Turn 1775", 898, 2370) +box("TURN", "Game Turn 1776", 964, 2370) +box("TURN", "Game Turn 1777", 1030, 2370) +box("TURN", "Game Turn 1778", 1096, 2370) +box("TURN", "Game Turn 1779", 1162, 2370) +box("TURN", "Game Turn 1780", 1228, 2370) +box("TURN", "Game Turn 1781", 1294, 2370) +box("TURN", "Game Turn 1782", 1360, 2370) +box("TURN", "Game Turn 1783", 1426, 2370) + +box("CONTROL", "Canada", 1376, 967) +box("CONTROL", "NH", 1458, 1006) +box("CONTROL", "NY", 1375, 1081) +box("CONTROL", "MA", 1491, 1081) +box("CONTROL", "CT", 1455, 1156) +box("CONTROL", "RI", 1533, 1156) +box("CONTROL", "PA", 1299, 1194) +box("CONTROL", "NJ", 1376, 1189) +box("CONTROL", "MD", 1299, 1266) +box("CONTROL", "DE", 1376, 1266) +box("CONTROL", "VA", 1241, 1337) +box("CONTROL", "NC", 1260, 1407) +box("CONTROL", "SC", 1212, 1479) +box("CONTROL", "GA", 1164, 1550) + +function wilderness(A, B) { + line(A, B, "wilderness") +} + +function path(A, B) { + line(A, B, "path") +} + +function sea(space, zone) { + spaces[space_index[space]].port = zone +} + +wilderness("Quebec", "Falmouth") +wilderness("Fort Detroit", "Bassett Town") +wilderness("Bassett Town", "Point Pleasant") + +path("Quebec", "Montreal") +path("Montreal", "Ticonderoga") +path("Montreal", "Oswego") +path("Oswego", "Fort Niagara") +path("Oswego", "Fort Stanwix") +path("Fort Niagara", "Fort Detroit") +path("Fort Niagara", "Genesee") +path("Ticonderoga", "Norwich") +path("Ticonderoga", "Saratoga") +path("Norwich", "Brattleboro") +path("Norwich", "Concord") +path("Concord", "Falmouth") +path("Concord", "Brattleboro") +path("Saratoga", "Brattleboro") +path("Saratoga", "Albany") +path("Brattleboro", "Springfield") +path("Fort Stanwix", "Albany") +path("Albany", "Springfield") +path("Lexington Concord", "Springfield") +path("Lexington Concord", "Boston") +path("Falmouth", "Boston") +path("Barnstable", "Boston") +path("Newport", "Boston") +path("Newport", "Hartford") +path("Springfield", "Hartford") +path("New Haven", "Hartford") +path("New Haven", "New York") +path("New Haven", "Westchester") +path("New York", "Westchester") +path("New York", "Long Island") +path("Newport", "Lexington Concord") +path("Albany", "Westchester") +path("Fort Stanwix", "Genesee") +path("Genesee", "Wyoming Valley") +path("Fort Niagara", "Pittsburgh") +path("Morristown", "Westchester") +path("Morristown", "Wyoming Valley") +path("Morristown", "Reading") +path("Morristown", "New Brunswick") +path("Morristown", "New York") +path("New York", "New Brunswick") +path("Monmouth", "New Brunswick") +path("Philadelphia", "New Brunswick") +path("Monmouth", "Philadelphia") +path("Reading", "Philadelphia") +path("Wyoming Valley", "Reading") +path("Wilmington DE", "Philadelphia") +path("Wilmington DE", "Baltimore") +path("Bassett Town", "Pittsburgh") +path("Fort Cumberland", "Pittsburgh") +path("Harrisburg", "Pittsburgh") +path("Harrisburg", "York") +path("Reading", "York") +path("Harrisburg", "Reading") +path("Frederick Town", "York") +path("Frederick Town", "Baltimore") +path("Frederick Town", "Alexandria") +path("Frederick Town", "Charlottesville") +path("Frederick Town", "Fort Cumberland") +path("Richmond", "Alexandria") +path("Richmond", "Yorktown") +path("Richmond", "Petersburg") +path("Richmond", "Lynch's Ferry") +path("Richmond", "Charlottesville") +path("Richmond", "Norfolk") +path("Fincastle", "Charlottesville") +path("Fincastle", "Lynch's Ferry") +path("Fincastle", "Fort Chiswell") +path("Point Pleasant", "Fort Chiswell") +path("Abingdon", "Fort Chiswell") +path("Abingdon", "Gilbert Town") +path("Fort Prince George", "Gilbert Town") +path("Charlotte", "Gilbert Town") +path("Charlotte", "Salem") +path("Hillsboro", "Salem") +path("Cheraw", "Salem") +path("Lynch's Ferry", "Salem") +path("Charlotte", "Camden") +path("Abingdon", "Fort Prince George") +path("New Bern", "Norfolk") +path("Petersburg", "Norfolk") +path("Petersburg", "Wake (Raleigh)") +path("New Bern", "Wake (Raleigh)") +path("Hillsboro", "Wake (Raleigh)") +path("Petersburg", "Hillsboro") +path("Petersburg", "Lynch's Ferry") +path("Wilmington NC", "Wake (Raleigh)") +path("Wilmington NC", "Cheraw") +path("Wilmington NC", "Georgetown") +path("Cheraw", "Georgetown") +path("Cheraw", "Camden") +path("Ninety Six", "Fort Prince George") +path("Ninety Six", "Camden") +path("Ninety Six", "Augusta") +path("Eutaw Springs", "Camden") +path("Eutaw Springs", "Charleston") +path("Georgetown", "Charleston") +path("Savannah", "Charleston") +path("Alexandria", "Baltimore") +path("Savannah", "Augusta") +path("Savannah", "St. Mary's") +path("Charlottesville", "Lynch's Ferry") + +sea("Quebec", 1) +sea("Montreal", 1) + +sea("Falmouth", 2) +sea("Boston", 2) +sea("Barnstable", 2) +sea("Newport", 2) + +sea("New Haven", 3) +sea("New York", 3) +sea("Long Island", 3) + +sea("Philadelphia", 4) +sea("Wilmington DE", 4) + +sea("Baltimore", 5) +sea("Alexandria", 5) +sea("Yorktown", 5) +sea("Norfolk", 5) + +sea("New Bern", 6) +sea("Wilmington NC", 6) +sea("Charleston", 6) + +sea("Savannah", 7) +sea("St. Mary's", 7) + +// === CARDS === + +const CARD_3_OPS = { title: "3 OPS", type: "ops", count: 3 } +const CARD_2_OPS = { title: "2 OPS", type: "ops", count: 2 } +const CARD_1_OPS = { title: "1 OPS", type: "ops", count: 1 } + +const cards = [ + null, + + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + CARD_3_OPS, + + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + CARD_2_OPS, + + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + CARD_1_OPS, + + /* 67 */ + { + title: "Minor Campaign", + type: "campaign", + count: 2, + }, + + /* 68 */ + { + title: "Minor Campaign", + type: "campaign", + count: 2, + }, + + /* 69 */ + { + title: "Minor Campaign", + type: "campaign", + count: 2, + }, + + /* 70 */ + { + title: "Major Campaign", + type: "campaign", + count: 3, + }, + + /* 71 */ + { + title: "North's Government Falls - The War Ends in 1779", + type: "mandatory-event", + event: "the_war_ends", + year: 1779, + }, + + /* 72 */ + { + title: "North's Government Falls - The War Ends in 1780", + type: "mandatory-event", + event: "the_war_ends", + year: 1780, + }, + + /* 73 */ + { + title: "North's Government Falls - The War Ends in 1781", + type: "mandatory-event", + event: "the_war_ends", + year: 1781, + }, + + /* 74 */ + { + title: "North's Government Falls - The War Ends in 1782", + type: "mandatory-event", + event: "the_war_ends", + year: 1782, + }, + + /* 75 */ + { + title: "North's Government Falls - The War Ends in 1783", + type: "mandatory-event", + event: "the_war_ends", + year: 1783, + }, + + /* 76 */ + { + title: "Henry Know Continental Artillery Commander", + type: "american-battle", + }, + + /* 77 */ + { + title: "Jane McCrea Indian Atrocity Sparks Outrage", + type: "american-event", + event: "place_american_pc", + count: 2, + once: true, + }, + + /* 78 */ + { + title: "Iroquois Uprising!", + type: "british-event", + event: "remove_american_pc_from_non_port", + where: [ NH, NY, PA ], + count: 2, + }, + + /* 79 */ + { + title: "Joseph Brant Leads an Iroquois Raid", + type: "british-event", + event: "remove_american_pc_from_non_port", + where: [ NH, NY, PA ], + count: 2, + }, + + /* 80 */ + { + title: "Lt. Colonel Simcoe's Queen's Rangers", + type: "british-event", + event: "remove_american_pc_within_two_spaces_of_a_british_general", + count: 2, + }, + + /* 81 */ + { + title: "D'Estaing Sails for the Caribbean", + type: "british-event", + when: "after_french_alliance", + event: "remove_french_navy", + }, + + /* 82 */ + { + title: "Banastre Tarleton's Waxhaws Massacre", + type: "british-event-or-battle", + event: "remove_american_cu", + }, + + /* 83 */ + { + title: "Lord George Germaine Offers Royal Amnesty", + type: "british-event", + event: "remove_american_pc", + count: 2, + }, + + /* 84 */ + { + title: "George Rogers Clark Leads a Western Offensive", + type: "american-event", + event: "remove_random_british_card", + }, + + /* 85 */ + { + title: "Don Bernardo Galvez Captures Pensacola", + type: "american-event", + when: "european_war_in_effect", + event: "remove_british_cu", + count: 2, + }, + + /* 86 */ + { + title: "Baron von Steuben Trains the Continental Army", + type: "american-event", + event: "baron_von_steuben_trains_the_continental_army", + }, + + /* 87 */ + { + title: "Lord North Offers a Royal Amnesty", + type: "british-event", + event: "remove_american_pc", + count: 4, + once: true, + }, + + /* 88 */ + { + title: "The Swamp Fox, Francis Marion", + type: "american-event", + event: "remove_british_pc_from", + where: [ NC, SC, GA ], + count: 2, + }, + + /* 89 */ + { + title: "The Gamecock: Thomas Sumter", + type: "american-event", + event: "remove_british_pc_from", + where: [ NC, SC, GA ], + count: 2, + }, + + /* 90 */ + { + title: "Josiah Martin Rallies North Carolina Loyalists", + type: "british-event", + event: "remove_american_pc_from", + where: [ NC ], + count: 2, + }, + + /* 91 */ + { + title: 'Thomas Paine Publishes Pamphlets "Common Sense" and "The American Crisis"', + type: "american-event", + event: "place_american_pc_in", + where: [ NH, NY, MA, CT, RI, PA, NJ, MD, DE, VA, NC, SC, GA ], + count: 3, + once: true, + }, + + /* 92 */ + { + title: "Nathan Hale, American Martyr", + type: "american-event", + event: "place_american_pc", + count: 2, + once: true, + }, + + /* 93 */ + { + title: "John Glover's Marblehead Regiment", + type: "american-event", + event: "john_glovers_marblehead_regiment", + }, + + /* 94 */ + { + title: "Pennsylvania and New Jersey Line Mutinies", + type: "british-event", + event: "pennsylvania_and_new_jersey_line_mutinies", + }, + + /* 95 */ + { + title: "William Pitt Urges Peace Talks", + type: "british-event", + when: "before_french_alliance", + event: "remove_american_pc", + count: 2, + reshuffle: "if_played", + }, + + /* 96 */ + { + title: "Hortelez et Cie: Clandestine French and Spanish Aid", + type: "american-event", + when: "before_french_alliance", + event: "advance_french_alliance", + reshuffle: "if_discarded", + count: 2, + }, + + /* 97 */ + { + title: "Admiral Suffren Wins a Naval Victory", + type: "american-event", + when: "after_french_alliance", + event: "remove_random_british_card", + }, + + /* 98 */ + { + title: '"Mad" Anthony Wayne', + type: "american-battle", + }, + + /* 99 */ + { + title: "Declaration of Independence", + type: "mandatory-event", + event: "declaration_of_independence", + once: true, + reshuffle: "if_played", + tournament: true, + }, + + /* 100 */ + { + title: "Benedict Arnold's Treason Undermines the Patriot Cause", + type: "british-battle", + event: "remove_benedict_arnold", + once: true, + }, + + /* 101 */ + { + title: "Benjamin Franklin: Minister to France", + type: "mandatory-event", + event: "advance_french_alliance", + count: 4, + once: true, + tournament: true, + }, + + /* 102 */ + { + title: "Admiral Rodney Captures St. Eustatius", + type: "british-event", + event: "remove_random_american_card", + when: "european_war_in_effect", + once: true, + }, + + /* 103 */ + { + title: "Thaddeus Kosciuszco Constructs Engineering Works", + type: "american-battle", + }, + + /* 104 */ + { + title: "Light Horse Harry Lee", + type: "american-battle", + }, + + /* 105 */ + { + title: "Morgan's Riflemen", + type: "american-battle", + }, + + /* 106 */ + { + title: "John Paul Jones' Shipping Raids", + type: "american-event", + event: "remove_random_british_card", + }, + + /* 107 */ + { + title: "British Light Infantry", + type: "british-battle", + }, + + /* 108 */ + { + title: "Lord Sandwich Coastal Raids", + type: "british-event", + event: "lord_sandwich_coastal_raids", + }, + + /* 109 */ + { + title: "Edward Bancroft, British Double Agent", + type: "british-event", + event: "remove_random_american_card", + }, + + /* 110 */ + { + title: "Hessian Infantry Bayonet Charge", + type: "british-battle", + }, +] + +data = { + BOXES, + cards, + general_index, + generals, + space_index, + spaces, + colony_name, + colony_spaces, } + +})() + +if (typeof module === "object") + module.exports = data -- cgit v1.2.3