summaryrefslogtreecommitdiff
path: root/data.js
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2024-05-16 21:33:44 +0200
committerTor Andersson <tor@ccxvii.net>2024-08-21 00:28:20 +0200
commit842b8915070cdb982a212a1be2a9805e095bf571 (patch)
tree8a357d25153cd1872ada90e8dfd5bef3e3931493 /data.js
parent8652add81fc0b12238754a28495d5e0e59babbaf (diff)
downloadwashingtons-war-842b8915070cdb982a212a1be2a9805e095bf571.tar.gz
numeric ids
Diffstat (limited to 'data.js')
-rw-r--r--data.js1155
1 files changed, 809 insertions, 346 deletions
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