diff options
-rw-r--r-- | data.js | 606 | ||||
-rw-r--r-- | play.js | 548 | ||||
-rw-r--r-- | rules.js | 3311 |
3 files changed, 2268 insertions, 2197 deletions
@@ -1,346 +1,360 @@ -"use strict"; +"use strict" let BOXES = {} -let BLOCKADE = {}; -let COLONIES = {}; -let SPACES = {}; -let PATH_INDEX = {}; -let PATH_NAME; -let PATH_TYPE; +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 }, + 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 }, + 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 }, -}; + Rochambeau: { owner: "French", strategy: 2, battle: 4, agility: 2, bonus: false }, +} function getEdge(A, B) { if (A > B) - return PATHS[B + "/" + A]; - return PATHS[A + "/" + B]; + return PATHS[B + "/" + A] + return PATHS[A + "/" + B] } -(function() { - let info = {}; +;(function () { + let info = {} function box(category, A, x, y) { - x += 40; y += 36; - BOXES[A] = { name: A, category: category, x: x, y: 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; + 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: [] }; + COLONIES[colony] = [] + COLONIES[colony].push(name) + SPACES[name] = { name: name, colony: colony, type: type, port: false, x: x, y: y, exits: [] } } function line(A, B, type) { if (A > B) { - let C = B; B = A; A = C; + 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; + 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 } - 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"); + 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("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("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("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("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); + 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; } + 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 + } - wilderness("Quebec", "Falmouth"); - wilderness("Fort Detroit", "Bassett Town"); - wilderness("Bassett Town", "Point Pleasant"); + 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"); + 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("Quebec", "Sea1") + sea("Montreal", "Sea1") - sea("Falmouth", "Sea2"); - sea("Boston", "Sea2"); - sea("Barnstable", "Sea2"); - sea("Newport", "Sea2"); + 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("New Haven", "Sea3") + sea("New York", "Sea3") + sea("Long Island", "Sea3") - sea("Philadelphia", "Sea4"); - sea("Wilmington DE", "Sea4"); + sea("Philadelphia", "Sea4") + sea("Wilmington DE", "Sea4") - sea("Baltimore", "Sea5"); - sea("Alexandria", "Sea5"); - sea("Yorktown", "Sea5"); - sea("Norfolk", "Sea5"); + sea("Baltimore", "Sea5") + sea("Alexandria", "Sea5") + sea("Yorktown", "Sea5") + sea("Norfolk", "Sea5") - sea("New Bern", "Sea6"); - sea("Wilmington NC", "Sea6"); - sea("Charleston", "Sea6"); + sea("New Bern", "Sea6") + sea("Wilmington NC", "Sea6") + sea("Charleston", "Sea6") - sea("Savannah", "Sea7"); - sea("St. Mary's", "Sea7"); + sea("Savannah", "Sea7") + sea("St. Mary's", "Sea7") - PATH_NAME = Object.keys(info).sort(); - PATH_TYPE = []; + PATH_NAME = Object.keys(info).sort() + PATH_TYPE = [] for (let id of PATH_NAME) - PATH_TYPE.push(info[id]); + 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); + let id = a < b ? a + "/" + b : b + "/" + a + PATH_INDEX[a][b] = PATH_NAME.indexOf(id) } } -})(); +})() -if (typeof module == 'object') { +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 + GENERALS: GENERALS, + BOXES: BOXES, + COLONIES: COLONIES, + SPACES: SPACES, + PATH_NAME: PATH_NAME, + PATH_TYPE: PATH_TYPE, + PATH_INDEX: PATH_INDEX, + BLOCKADE, } } @@ -1,12 +1,12 @@ -"use strict"; +"use strict" -const THE_13_COLONIES = [ 'NH', 'NY', 'MA', 'CT', 'RI', 'PA', 'NJ', 'MD', 'DE', 'VA', 'NC', 'SC', 'GA' ]; -const ALL_COLONIES = THE_13_COLONIES.concat(['CA']); -const AMERICAN_GENERALS = [ "Arnold", "Gates", "Greene", "Lafayette", "Lee", "Lincoln", "Washington", ]; -const CONTINENTAL_CONGRESS_DISPERSED = "Continental Congress Dispersed"; -const BRITISH = "British"; -const AMERICAN = "American"; -const BLOCKADE_ZONES = [ "Sea1","Sea2","Sea3","Sea4","Sea5","Sea6","Sea7" ]; +const THE_13_COLONIES = [ "NH", "NY", "MA", "CT", "RI", "PA", "NJ", "MD", "DE", "VA", "NC", "SC", "GA" ] +const ALL_COLONIES = THE_13_COLONIES.concat([ "CA" ]) +const AMERICAN_GENERALS = [ "Arnold", "Gates", "Greene", "Lafayette", "Lee", "Lincoln", "Washington" ] +const CONTINENTAL_CONGRESS_DISPERSED = "Continental Congress Dispersed" +const BRITISH = "British" +const AMERICAN = "American" +const BLOCKADE_ZONES = [ "Sea1", "Sea2", "Sea3", "Sea4", "Sea5", "Sea6", "Sea7" ] let ui = { cards: {}, @@ -15,277 +15,288 @@ let ui = { control: {}, blockade: {}, cu: [], -}; +} function on_log(text) { - let p = document.createElement("div"); - text = text.replace(/&/g, "&"); - text = text.replace(/</g, "<"); - text = text.replace(/>/g, ">"); + let p = document.createElement("div") + text = text.replace(/&/g, "&") + text = text.replace(/</g, "<") + text = text.replace(/>/g, ">") - text = text.replace(/\[(\d+)([^\]]*)\]/, '<span class="card_tip" data-card="$1">$1$2</span>'); + text = text.replace(/\[(\d+)([^\]]*)\]/, '<span class="card_tip" data-card="$1">$1$2</span>') if (text.match(/^\.h1 /)) { - p.className = 'h1'; - text = text.substring(4); + p.className = "h1" + text = text.substring(4) } else if (text.match(/^\.h2.american /)) { - p.className = 'h2 american'; - text = text.substring(13); + p.className = "h2 american" + text = text.substring(13) } else if (text.match(/^\.h2.british /)) { - p.className = 'h2 british'; - text = text.substring(12); + p.className = "h2 british" + text = text.substring(12) } - p.innerHTML = text; - return p; + p.innerHTML = text + return p } function clearList(container) { while (container.firstChild) - container.removeChild(container.firstChild); + container.removeChild(container.firstChild) } function onHoverCard(X) { - let c = CARDS[X.id.split("+")[1]]; - document.getElementById("status").textContent = JSON.stringify(c); + let c = CARDS[X.id.split("+")[1]] + document.getElementById("status").textContent = JSON.stringify(c) } function onFocusNode(evt) { - let space = SPACES[evt.target.id]; - document.getElementById("status").textContent = space.name; + let space = SPACES[evt.target.id] + document.getElementById("status").textContent = space.name } function onBlurNode(evt) { - let space = SPACES[evt.target.id]; - document.getElementById("status").textContent = ""; + let space = SPACES[evt.target.id] + document.getElementById("status").textContent = "" } function clear_group(name) { - let container = document.getElementById(name); + let container = document.getElementById(name) while (container.firstChild) - container.removeChild(container.firstChild); + container.removeChild(container.firstChild) } function build_marker(container, id, x, y, w, h, classList) { - let e = document.createElement("div"); - e.foo = { w:w, h:h }; - e.classList.add("marker"); + let e = document.createElement("div") + e.foo = { w: w, h: h } + e.classList.add("marker") for (let c of classList) - e.classList.add(c); - e.setAttribute("id", id); - e.style.left = ((x - w/2)|0) + "px"; - e.style.top = ((y - h/2)|0) + "px"; - document.getElementById(container).appendChild(e); - return e; + e.classList.add(c) + e.setAttribute("id", id) + e.style.left = ((x - w / 2) | 0) + "px" + e.style.top = ((y - h / 2) | 0) + "px" + document.getElementById(container).appendChild(e) + return e } function update_marker(e, space) { - let box = SPACES[space] || BOXES[space]; - e.style.left = ((box.x - e.foo.w/2)|0) + "px"; - e.style.top = ((box.y - e.foo.h/2)|0) + "px"; + let box = SPACES[space] || BOXES[space] + e.style.left = ((box.x - e.foo.w / 2) | 0) + "px" + e.style.top = ((box.y - e.foo.h / 2) | 0) + "px" } function update_marker_xy(e, x, y) { - e.style.left = ((x - e.foo.w/2)|0) + "px"; - e.style.top = ((y - e.foo.h/2)|0) + "px"; + e.style.left = ((x - e.foo.w / 2) | 0) + "px" + e.style.top = ((y - e.foo.h / 2) | 0) + "px" } function build_map() { function buildNode(type, x, y, colony) { - let e = document.createElement("div"); - let w, h; - e.classList.add("space"); - e.classList.add(type); - if (colony && colony != 'SEA') - e.classList.add("colony_" + colony); - if (type === 'regular-space') { - w = 66; - h = 66; - } else if (type === 'winter-quarters') { - w = 66; - h = 66; - } else if (type === 'fortified-port') { - w = 54; - h = 54; - } else if (type === 'blockade') { - w = 96; - h = 80; + let e = document.createElement("div") + let w, h + e.classList.add("space") + e.classList.add(type) + if (colony && colony != "SEA") + e.classList.add("colony_" + colony) + if (type === "regular-space") { + w = 66 + h = 66 + } else if (type === "winter-quarters") { + w = 66 + h = 66 + } else if (type === "fortified-port") { + w = 54 + h = 54 + } else if (type === "blockade") { + w = 96 + h = 80 } else { - w = 60; - h = 60; + w = 60 + h = 60 } - let b = 7; - w -= 2; - h -= 2; - e.style.left = (x - w/2 - b) + "px"; - e.style.top = (y - h/2 - b) + "px"; - e.style.width = (w) + "px"; - e.style.height = (h) + "px"; - return e; + let b = 7 + w -= 2 + h -= 2 + e.style.left = x - w / 2 - b + "px" + e.style.top = y - h / 2 - b + "px" + e.style.width = w + "px" + e.style.height = h + "px" + return e } for (let name in SPACES) { - let space = SPACES[name]; + let space = SPACES[name] if (space.colony != null) { - let e = buildNode(space.type, space.x, space.y, SPACES[name].colony); - e.setAttribute("id", name); - e.addEventListener("mouseenter", onFocusNode); - e.addEventListener("mouseleave", onBlurNode); - e.addEventListener("click", on_space); - ui.spaces[name] = e; - document.getElementById("spaces").appendChild(e); - build_marker("pc", name+"-pc", space.x, space.y, 67, 58.5, ["pc"]); + let e = buildNode(space.type, space.x, space.y, SPACES[name].colony) + e.setAttribute("id", name) + e.addEventListener("mouseenter", onFocusNode) + e.addEventListener("mouseleave", onBlurNode) + e.addEventListener("click", on_space) + ui.spaces[name] = e + document.getElementById("spaces").appendChild(e) + build_marker("pc", name + "-pc", space.x, space.y, 67, 58.5, [ "pc" ]) } } for (let zone of BLOCKADE_ZONES) { - let e = buildNode("blockade", BOXES[zone].x, BOXES[zone].y, "SEA"); - e.setAttribute("id", zone); - e.addEventListener("click", on_space); - document.getElementById("spaces").appendChild(e); - ui.blockade[zone] = e; + let e = buildNode("blockade", BOXES[zone].x, BOXES[zone].y, "SEA") + e.setAttribute("id", zone) + e.addEventListener("click", on_space) + document.getElementById("spaces").appendChild(e) + ui.blockade[zone] = e } - ui.turn = build_marker("markers", "GameTurn", - BOXES["Game Turn 1775"].x, BOXES["Game Turn 1775"].y, 56.5, 56.5, - ["turn"]); - - ui.french_alliance = build_marker("markers", "FrenchAlliance", - BOXES["French Alliance Track 0"].x, BOXES["French Alliance Track 0"].y, 56.5, 56.5, - ["french-alliance"]); - - ui.french_navy = build_marker("markers", "FrenchNavy", - BOXES["French Reinforcements"].x-130/2-10, BOXES["French Reinforcements"].y-32, 126/2, 252/2, - ["french-navy"]); - - ui.congress = build_marker("markers", "Congress", - SPACES["Philadelphia"].x, SPACES["Philadelphia"].y, 113/2, 113/2, - ["congress"]); + ui.turn = build_marker("markers", "GameTurn", BOXES["Game Turn 1775"].x, BOXES["Game Turn 1775"].y, 56.5, 56.5, [ + "turn", + ]) + + ui.french_alliance = build_marker( + "markers", + "FrenchAlliance", + BOXES["French Alliance Track 0"].x, + BOXES["French Alliance Track 0"].y, + 56.5, + 56.5, + [ "french-alliance" ] + ) + + ui.french_navy = build_marker( + "markers", + "FrenchNavy", + BOXES["French Reinforcements"].x - 130 / 2 - 10, + BOXES["French Reinforcements"].y - 32, + 126 / 2, + 252 / 2, + [ "french-navy" ] + ) + + ui.congress = build_marker( + "markers", + "Congress", + SPACES["Philadelphia"].x, + SPACES["Philadelphia"].y, + 113 / 2, + 113 / 2, + [ "congress" ] + ) for (let c in COLONIES) { - ui.control[c] = build_marker("markers", "control_" + c, - BOXES[c].x, BOXES[c].y, 38+8, 38+8, - ["control"]); + ui.control[c] = build_marker("markers", "control_" + c, BOXES[c].x, BOXES[c].y, 38 + 8, 38 + 8, [ "control" ]) } for (let c = 1; c <= 110; ++c) { - ui.cards[c] = document.getElementById("card+"+c); - ui.cards[c].addEventListener("click", on_card); + ui.cards[c] = document.getElementById("card+" + c) + ui.cards[c].addEventListener("click", on_card) } for (let g in GENERALS) { - let color = GENERALS[g].owner.toLowerCase(); - ui.generals[g] = build_marker("generals", g, - 0, - 0, - 126/2, - 252/2, - ["general", color, g, "offmap"]); - ui.generals[g].addEventListener("click", on_general); + let color = GENERALS[g].owner.toLowerCase() + ui.generals[g] = build_marker("generals", g, 0, 0, 126 / 2, 252 / 2, [ "general", color, g, "offmap" ]) + ui.generals[g].addEventListener("click", on_general) } } function update_units() { - const unitW = 130/2; - const unitH = 263/2; - const generalX = -22; - const generalY = 22; - const cuX = 20; - const cuY = 10; - - update_marker(ui.turn, "Game Turn " + view.year); + const unitW = 130 / 2 + const unitH = 263 / 2 + const generalX = -22 + const generalY = 22 + const cuX = 20 + const cuY = 10 + + update_marker(ui.turn, "Game Turn " + view.year) if (view.regulars) - ui.turn.classList.remove("no-regulars"); + ui.turn.classList.remove("no-regulars") else - ui.turn.classList.add("no-regulars"); + ui.turn.classList.add("no-regulars") - update_marker(ui.congress, view.congress); + update_marker(ui.congress, view.congress) - update_marker(ui.french_alliance, "French Alliance Track " + view.french_alliance); + update_marker(ui.french_alliance, "French Alliance Track " + view.french_alliance) if (view.european_war) - ui.french_alliance.classList.add("european-war"); + ui.french_alliance.classList.add("european-war") else - ui.french_alliance.classList.remove("european-war"); + ui.french_alliance.classList.remove("european-war") if (view.french_navy == "French Reinforcements") { - let x = BOXES["French Reinforcements"].x-130/2-10; - let y = BOXES["French Reinforcements"].y-32; - let w = 126/2; - let h = 252/2; - ui.french_navy.style.left = ((x-w/2)|0) + "px"; - ui.french_navy.style.top = ((y-h/2)|0) + "px"; + let x = BOXES["French Reinforcements"].x - 130 / 2 - 10 + let y = BOXES["French Reinforcements"].y - 32 + let w = 126 / 2 + let h = 252 / 2 + ui.french_navy.style.left = ((x - w / 2) | 0) + "px" + ui.french_navy.style.top = ((y - h / 2) | 0) + "px" } else { - update_marker(ui.french_navy, view.french_navy); + update_marker(ui.french_navy, view.french_navy) } for (let space in SPACES) { - let space_pc = view.pc[space]; - let e = document.getElementById(space+"-pc"); + let space_pc = view.pc[space] + let e = document.getElementById(space + "-pc") if (e) { if (space_pc === BRITISH) { - e.classList.remove("american"); - e.classList.add("british"); + e.classList.remove("american") + e.classList.add("british") } else if (space_pc === AMERICAN) { - e.classList.add("american"); - e.classList.remove("british"); + e.classList.add("american") + e.classList.remove("british") } else { - e.classList.remove("american"); - e.classList.remove("british"); + e.classList.remove("american") + e.classList.remove("british") } } } for (let c in COLONIES) { - let control = 0; + let control = 0 for (let space of COLONIES[c]) { if (view.pc[space] == BRITISH) - --control; + --control else if (view.pc[space] == AMERICAN) - ++control; + ++control } if (control < 0) - ui.control[c].className = "marker control british"; + ui.control[c].className = "marker control british" else if (control > 0) - ui.control[c].className = "marker control american"; + ui.control[c].className = "marker control american" else - ui.control[c].className = "marker control"; + ui.control[c].className = "marker control" } - let offset = {}; + let offset = {} for (let g in GENERALS) { - let e = ui.generals[g]; - let unit = view.generals[g]; - let space = SPACES[unit.location] || BOXES[unit.location]; + let e = ui.generals[g] + let unit = view.generals[g] + let space = SPACES[unit.location] || BOXES[unit.location] if (space) { - let o = (offset[space.name]|0); - update_marker_xy(e, space.x + o * generalX, space.y + o * generalY - 32); - e.classList.remove("offmap"); - offset[space.name] = ++o; + let o = offset[space.name] | 0 + update_marker_xy(e, space.x + o * generalX, space.y + o * generalY - 32) + e.classList.remove("offmap") + offset[space.name] = ++o } else { - e.classList.add("offmap"); + e.classList.add("offmap") } if (view.who == g) - e.classList.add("selected"); + e.classList.add("selected") else - e.classList.remove("selected"); + e.classList.remove("selected") } // TODO: reuse CU elements - offset = {}; - clear_group("cu"); + offset = {} + clear_group("cu") for (let i = 0; i < view.cu.length; ++i) { - let cu = view.cu[i]; - let space = SPACES[cu.location] || BOXES[cu.location]; - let o = (offset[space.name]|0); - let x = space.x + o * cuX; - let y = space.y + o * cuY; - let e = build_marker("cu", "cu"+i, x, y, 122/2, 122/2, ["cu", cu.owner.toLowerCase()]); - e.textContent = cu.count; - offset[space.name] = ++o; + let cu = view.cu[i] + let space = SPACES[cu.location] || BOXES[cu.location] + let o = offset[space.name] | 0 + let x = space.x + o * cuX + let y = space.y + o * cuY + let e = build_marker("cu", "cu" + i, x, y, 122 / 2, 122 / 2, [ "cu", cu.owner.toLowerCase() ]) + e.textContent = cu.count + offset[space.name] = ++o } } -build_map(); +build_map() function player_info(player, nc, nq) { let info = "" @@ -296,120 +307,120 @@ function player_info(player, nc, nq) { if (nq > 0) info += nq + "\u{231b} " info += nc + "\u{1f3b4}" - return info; + return info } function on_update() { - let e; + let e - roles.American.stat.textContent = player_info(AMERICAN, view.a_cards, view.a_queue); - roles.British.stat.textContent = player_info(BRITISH, view.b_cards, view.b_queue); + roles.American.stat.textContent = player_info(AMERICAN, view.a_cards, view.a_queue) + roles.British.stat.textContent = player_info(BRITISH, view.b_cards, view.b_queue) if (!view.last_played) - document.getElementById("last_played").className = "card show card_back"; + document.getElementById("last_played").className = "card show card_back" else - document.getElementById("last_played").className = "card show card_" + view.last_played; - - action_button("pickup_british_cu", "Pick up British CU"); - action_button("pickup_american_cu", "Pick up American CU"); - action_button("pickup_french_cu", "Pick up French CU"); - action_button("drop_british_cu", "Drop off British CU"); - action_button("drop_american_cu", "Drop off American CU"); - action_button("drop_french_cu", "Drop off French CU"); - action_button("british_first", "British"); - action_button("american_first", "American"); - action_button("surrender", "Surrender"); - action_button("pass", "Next"); - action_button("undo", "Undo"); - - e = document.getElementById("war_ends"); - e.classList.remove("year_1779"); - e.classList.remove("year_1780"); - e.classList.remove("year_1781"); - e.classList.remove("year_1782"); - e.classList.remove("year_1783"); + document.getElementById("last_played").className = "card show card_" + view.last_played + + action_button("pickup_british_cu", "Pick up British CU") + action_button("pickup_american_cu", "Pick up American CU") + action_button("pickup_french_cu", "Pick up French CU") + action_button("drop_british_cu", "Drop off British CU") + action_button("drop_american_cu", "Drop off American CU") + action_button("drop_french_cu", "Drop off French CU") + action_button("british_first", "British") + action_button("american_first", "American") + action_button("surrender", "Surrender") + action_button("pass", "Next") + action_button("undo", "Undo") + + e = document.getElementById("war_ends") + e.classList.remove("year_1779") + e.classList.remove("year_1780") + e.classList.remove("year_1781") + e.classList.remove("year_1782") + e.classList.remove("year_1783") if (view.war_ends) - e.classList.add("year_" + view.war_ends); - - e = document.getElementById("played_british_reinforcements"); - e.classList.remove("ops_1"); - e.classList.remove("ops_2"); - e.classList.remove("ops_3"); - e.classList.add("ops_" + view.played_british_reinforcements); - - e = document.getElementById("played_american_reinforcements_1"); - e.classList.remove("ops_1"); - e.classList.remove("ops_2"); - e.classList.remove("ops_3"); + e.classList.add("year_" + view.war_ends) + + e = document.getElementById("played_british_reinforcements") + e.classList.remove("ops_1") + e.classList.remove("ops_2") + e.classList.remove("ops_3") + e.classList.add("ops_" + view.played_british_reinforcements) + + e = document.getElementById("played_american_reinforcements_1") + e.classList.remove("ops_1") + e.classList.remove("ops_2") + e.classList.remove("ops_3") if (view.played_american_reinforcements.length >= 1) - e.classList.add("ops_" + view.played_american_reinforcements[0]); + e.classList.add("ops_" + view.played_american_reinforcements[0]) - e = document.getElementById("played_american_reinforcements_2"); - e.classList.remove("ops_1"); - e.classList.remove("ops_2"); - e.classList.remove("ops_3"); + e = document.getElementById("played_american_reinforcements_2") + e.classList.remove("ops_1") + e.classList.remove("ops_2") + e.classList.remove("ops_3") if (view.played_american_reinforcements.length >= 2) - e.classList.add("ops_" + view.played_american_reinforcements[1]); + e.classList.add("ops_" + view.played_american_reinforcements[1]) - let cards = view.hand; + let cards = view.hand for (let c = 1; c <= 110; ++c) { - ui.cards[c].classList.remove('enabled'); + ui.cards[c].classList.remove("enabled") if (cards && cards.includes(c)) - ui.cards[c].classList.add('show'); + ui.cards[c].classList.add("show") else - ui.cards[c].classList.remove('show'); + ui.cards[c].classList.remove("show") } for (let space in SPACES) - ui.spaces[space].classList.remove('enabled'); + ui.spaces[space].classList.remove("enabled") for (let general in GENERALS) - ui.generals[general].classList.remove('enabled'); + ui.generals[general].classList.remove("enabled") for (let zone of BLOCKADE_ZONES) - ui.blockade[zone].classList.remove('enabled'); + ui.blockade[zone].classList.remove("enabled") - update_units(); + update_units() if (player != view.active) - return; + return for (let action of Object.keys(view.actions)) { - let args = view.actions[action]; + let args = view.actions[action] switch (action) { - case 'card_play_event': - case 'card_discard_event': - case 'card_campaign': - case 'card_ops_general': - case 'card_ops_pc': - case 'card_ops_reinforcements': - case 'card_ops_queue': - case 'card_battle_play': - case 'card_battle_discard': - case 'exchange_for_discard': - for (let card of args) - ui.cards[card].classList.add('enabled'); - break; - case 'remove_cu': + case "card_play_event": + case "card_discard_event": + case "card_campaign": + case "card_ops_general": + case "card_ops_pc": + case "card_ops_reinforcements": + case "card_ops_queue": + case "card_battle_play": + case "card_battle_discard": + case "exchange_for_discard": + for (let card of args) + ui.cards[card].classList.add("enabled") + break + case "remove_cu": // TODO: target CU not space? - case 'move': - case 'sea_move': - case 'place_continental_congress': - case 'place_reinforcements': - case 'place_american_pc': - case 'place_british_pc': - case 'remove_pc': - case 'flip_pc': - for (let space of args) - ui.spaces[space].classList.add('enabled'); - break; - case 'select_general': - for (let general of args) - ui.generals[general].classList.add('enabled'); - break; - case 'place_navy': - for (let zone of args) - ui.blockade[zone].classList.add('enabled'); + case "move": + case "sea_move": + case "place_continental_congress": + case "place_reinforcements": + case "place_american_pc": + case "place_british_pc": + case "remove_pc": + case "flip_pc": + for (let space of args) + ui.spaces[space].classList.add("enabled") + break + case "select_general": + for (let general of args) + ui.generals[general].classList.add("enabled") + break + case "place_navy": + for (let zone of args) + ui.blockade[zone].classList.add("enabled") } } } @@ -472,39 +483,38 @@ function hide_popup_menu() { function on_card(evt) { if (view.actions) { - let c = evt.target.id.split("+")[1] | 0; + let c = evt.target.id.split("+")[1] | 0 show_popup_menu(evt, "popup", c, CARDS[c].title) } } function get_action_from_arg(x) { for (let action of Object.keys(view.actions)) { - let args = view.actions[action]; + let args = view.actions[action] if (Array.isArray(args) && args.includes(x)) - return action; + return action } - return null; + return null } function on_space(evt) { if (view.actions) { - let space = evt.target.id; - let action = get_action_from_arg(space); + let space = evt.target.id + let action = get_action_from_arg(space) if (action) - send_action(action, space); + send_action(action, space) } } function on_general(evt) { if (view.actions) { - let general = evt.target.id; - let action = get_action_from_arg(general); + let general = evt.target.id + let action = get_action_from_arg(general) if (action) - send_action(action, general); + send_action(action, general) } } function toggle_markers() { - document.querySelector("#map").classList.toggle("hide_markers"); + document.querySelector("#map").classList.toggle("hide_markers") } - @@ -1,42 +1,37 @@ -"use strict"; +"use strict" // TODO: campaign messed up who is who after battle // TODO: retreat with 0 CU after battle -exports.scenarios = [ - "Historical" -]; - -exports.roles = [ - "American", - "British", -]; - -const CARDS = require('./cards'); -const DATA = require('./data'); -const SPACES = DATA.SPACES; -const COLONIES = DATA.COLONIES; -const GENERALS = DATA.GENERALS; -const BLOCKADE = DATA.BLOCKADE; -const PATH_INDEX = DATA.PATH_INDEX; -const PATH_NAME = DATA.PATH_NAME; -const PATH_TYPE = DATA.PATH_TYPE; - -const BRITISH = 'British'; -const AMERICAN = 'American'; -const FRENCH = 'French'; - -const BRITISH_GENERALS = [ "Burgoyne", "Carleton", "Clinton", "Cornwallis", "Howe" ]; -const AMERICAN_GENERALS = [ "Arnold", "Gates", "Greene", "Lafayette", "Lee", "Lincoln", "Washington", "Rochambeau" ]; -const WASHINGTON = "Washington"; -const ROCHAMBEAU = "Rochambeau"; -const ARNOLD = "Arnold"; - -const CAPTURED_GENERALS = "Captured Generals"; -const CONTINENTAL_CONGRESS_DISPERSED = "Continental Congress Dispersed"; -const BRITISH_REINFORCEMENTS = "British Leader Reinforcements"; -const AMERICAN_REINFORCEMENTS = "American Leader Reinforcements"; -const FRENCH_REINFORCEMENTS = "French Reinforcements"; +exports.scenarios = [ "Historical" ] + +exports.roles = [ "American", "British" ] + +const CARDS = require("./cards") +const DATA = require("./data") +const SPACES = DATA.SPACES +const COLONIES = DATA.COLONIES +const GENERALS = DATA.GENERALS +const BLOCKADE = DATA.BLOCKADE +const PATH_INDEX = DATA.PATH_INDEX +const PATH_NAME = DATA.PATH_NAME +const PATH_TYPE = DATA.PATH_TYPE + +const BRITISH = "British" +const AMERICAN = "American" +const FRENCH = "French" + +const BRITISH_GENERALS = [ "Burgoyne", "Carleton", "Clinton", "Cornwallis", "Howe" ] +const AMERICAN_GENERALS = [ "Arnold", "Gates", "Greene", "Lafayette", "Lee", "Lincoln", "Washington", "Rochambeau" ] +const WASHINGTON = "Washington" +const ROCHAMBEAU = "Rochambeau" +const ARNOLD = "Arnold" + +const CAPTURED_GENERALS = "Captured Generals" +const CONTINENTAL_CONGRESS_DISPERSED = "Continental Congress Dispersed" +const BRITISH_REINFORCEMENTS = "British Leader Reinforcements" +const AMERICAN_REINFORCEMENTS = "American Leader Reinforcements" +const FRENCH_REINFORCEMENTS = "French Reinforcements" const TURN_TRACK = { 1775: "Game Turn 1775", 1776: "Game Turn 1776", @@ -47,44 +42,44 @@ const TURN_TRACK = { 1781: "Game Turn 1781", 1782: "Game Turn 1782", 1783: "Game Turn 1783", -}; +} -const FALMOUTH_QUEBEC = "Falmouth/Quebec"; +const FALMOUTH_QUEBEC = "Falmouth/Quebec" -const THE_13_COLONIES = [ 'NH', 'NY', 'MA', 'CT', 'RI', 'PA', 'NJ', 'MD', 'DE', 'VA', 'NC', 'SC', 'GA' ]; -const SOUTH_OF_WINTER_ATTRITION_LINE = [ 'NC', 'SC', 'GA' ]; +const THE_13_COLONIES = [ "NH", "NY", "MA", "CT", "RI", "PA", "NJ", "MD", "DE", "VA", "NC", "SC", "GA" ] +const SOUTH_OF_WINTER_ATTRITION_LINE = [ "NC", "SC", "GA" ] -const CAMPAIGN_CARDS = [ 67, 68, 69, 70 ]; -const DECLARATION_OF_INDEPENDENCE = 99; -const BARON_VON_STEUBEN = 86; -const WAR_ENDS_1779 = 71; -const BENJAMIN_FRANKLIN = 101; +const CAMPAIGN_CARDS = [ 67, 68, 69, 70 ] +const DECLARATION_OF_INDEPENDENCE = 99 +const BARON_VON_STEUBEN = 86 +const WAR_ENDS_1779 = 71 +const BENJAMIN_FRANKLIN = 101 -const ENEMY = { "American": BRITISH, "British": AMERICAN }; +const ENEMY = { American: BRITISH, British: AMERICAN } -const default_options = {}; +const default_options = {} -let states = {}; -let events = {}; +let states = {} +let events = {} -let game; -let view; +let game +let view function random(n) { - return (game.seed = game.seed * 200105 % 34359738337) % n + return (game.seed = (game.seed * 200105) % 34359738337) % n } function logbr() { - if (game.log.length > 0 && game.log[game.log.length-1] !== "") - game.log.push(""); + if (game.log.length > 0 && game.log[game.log.length - 1] !== "") + game.log.push("") } function log(s) { - game.log.push(s); + game.log.push(s) } function logp(s) { - game.log.push(game.active[0] + " " + s); + game.log.push(game.active[0] + " " + s) } function object_copy(original) { @@ -147,9 +142,9 @@ function pop_undo() { } function remove_from_array(array, item) { - let i = array.indexOf(item); + let i = array.indexOf(item) if (i >= 0) - array.splice(i, 1); + array.splice(i, 1) } function setup_game(seed) { @@ -189,7 +184,7 @@ function setup_game(seed) { function spawn_unit(owner, location, pc, cu, name) { if (pc) - game.pc[location] = owner; + game.pc[location] = owner if (name) { game.generals[name] = { location: location, @@ -201,291 +196,301 @@ function setup_game(seed) { location: location, count: cu, moved: 0, - }); + }) } } - function british(place, pc, cu, ld) { spawn_unit(BRITISH, place, pc, cu, ld); } - function american(place, pc, cu, ld) { spawn_unit(AMERICAN, place, pc, cu, ld); } - function french(place, pc, cu, ld) { spawn_unit(FRENCH, place, pc, cu, ld); } + function british(place, pc, cu, ld) { + spawn_unit(BRITISH, place, pc, cu, ld) + } + function american(place, pc, cu, ld) { + spawn_unit(AMERICAN, place, pc, cu, ld) + } + function french(place, pc, cu, ld) { + spawn_unit(FRENCH, place, pc, cu, ld) + } - british("Quebec", true, 2, "Carleton"); - british("Montreal", true); - british("Fort Detroit", true, 1); - british("Boston", true, 5, "Howe"); - british("Norfolk", true); - british("Gilbert Town", true); - british("Wilmington NC", true); - british("Ninety Six", true); + british("Quebec", true, 2, "Carleton") + british("Montreal", true) + british("Fort Detroit", true, 1) + british("Boston", true, 5, "Howe") + british("Norfolk", true) + british("Gilbert Town", true) + british("Wilmington NC", true) + british("Ninety Six", true) - american("Lexington Concord", true, 5, "Washington"); - american("Newport", false, 2, "Greene"); - american("Charleston", true, 2); - american("Philadelphia", true); + american("Lexington Concord", true, 5, "Washington") + american("Newport", false, 2, "Greene") + american("Charleston", true, 2) + american("Philadelphia", true) - british(BRITISH_REINFORCEMENTS, false, 0, "Burgoyne"); - british(BRITISH_REINFORCEMENTS, false, 0, "Clinton"); - british(BRITISH_REINFORCEMENTS, false, 0, "Cornwallis"); + british(BRITISH_REINFORCEMENTS, false, 0, "Burgoyne") + british(BRITISH_REINFORCEMENTS, false, 0, "Clinton") + british(BRITISH_REINFORCEMENTS, false, 0, "Cornwallis") - american(AMERICAN_REINFORCEMENTS, false, 0, "Arnold"); - american(AMERICAN_REINFORCEMENTS, false, 0, "Lincoln"); - american(AMERICAN_REINFORCEMENTS, false, 0, "Gates"); - american(AMERICAN_REINFORCEMENTS, false, 0, "Lee"); - american(AMERICAN_REINFORCEMENTS, false, 0, "Lafayette"); + american(AMERICAN_REINFORCEMENTS, false, 0, "Arnold") + american(AMERICAN_REINFORCEMENTS, false, 0, "Lincoln") + american(AMERICAN_REINFORCEMENTS, false, 0, "Gates") + american(AMERICAN_REINFORCEMENTS, false, 0, "Lee") + american(AMERICAN_REINFORCEMENTS, false, 0, "Lafayette") - french(FRENCH_REINFORCEMENTS, false, 5, "Rochambeau"); + french(FRENCH_REINFORCEMENTS, false, 5, "Rochambeau") - goto_committees_of_correspondence(); + goto_committees_of_correspondence() } /* GAME STATE */ function create_deck() { - let deck = []; + let deck = [] for (let i = 1; i <= 110; ++i) { // No DoI or Baron von Steuben first year. - if (i == DECLARATION_OF_INDEPENDENCE || i == BARON_VON_STEUBEN) - continue; - deck.push(i); + if (i === DECLARATION_OF_INDEPENDENCE || i === BARON_VON_STEUBEN) + continue + deck.push(i) } - return deck; + return deck } function reshuffle_deck() { - log("Reshuffled the deck."); - game.reshuffle = false; - game.deck = game.deck.concat(game.discard); - game.discard = []; + log("Reshuffled the deck.") + game.reshuffle = false + game.deck = game.deck.concat(game.discard) + game.discard = [] } function roll_d6() { - return random(6) + 1; + return random(6) + 1 } function deal_card() { - if (game.deck.length == 0) - reshuffle_deck(); - let i = random(game.deck.length); - let c = game.deck[i]; - game.deck.splice(i, 1); - return c; + if (game.deck.length === 0) + reshuffle_deck() + let i = random(game.deck.length) + let c = game.deck[i] + game.deck.splice(i, 1) + return c } function last_discard() { if (game.discard.length > 0) - return game.discard[game.discard.length-1]; - return null; + return game.discard[game.discard.length - 1] + return null } function active_hand() { - return (game.active == AMERICAN) ? game.a_hand : game.b_hand; + return game.active === AMERICAN ? game.a_hand : game.b_hand } function play_card(c, reason) { if (reason) - log(game.active[0] + " played #" + c + " " + reason); + log(game.active[0] + " played #" + c + " " + reason) else - log(game.active[0] + " played #" + c); - if (CARDS[c].reshuffle == 'if_played') - game.reshuffle = true; - remove_from_array(active_hand(), c); - game.last_played = c; + log(game.active[0] + " played #" + c) + if (CARDS[c].reshuffle === "if_played") + game.reshuffle = true + remove_from_array(active_hand(), c) + game.last_played = c if (!CARDS[c].once) - game.discard.push(c); + game.discard.push(c) else - log("Removed card " + c + "."); + log("Removed card " + c + ".") } function discard_card_from_hand(hand, c) { - remove_from_array(hand, c); - game.discard.push(c); - if (CARDS[c].reshuffle == 'if_discarded') - game.reshuffle = true; - logp("discarded #" + c); + remove_from_array(hand, c) + game.discard.push(c) + if (CARDS[c].reshuffle === "if_discarded") + game.reshuffle = true + logp("discarded #" + c) } function discard_card(c, reason) { - game.last_played = c; - discard_card_from_hand(active_hand(), c); + game.last_played = c + discard_card_from_hand(active_hand(), c) if (reason) - logp("discarded #" + c + " " + reason); + logp("discarded #" + c + " " + reason) else - logp("discarded #" + c); + logp("discarded #" + c) } function can_exchange_for_discard(c) { if (game.did_discard_event) { - if (game.active == BRITISH) - return true; - return CARDS[c].count > 1; + if (game.active === BRITISH) + return true + return CARDS[c].count > 1 } - return false; + return false } function can_play_event(c) { - let card = CARDS[c]; + let card = CARDS[c] switch (card.when) { - case 'before_french_alliance': return !game.french_alliance_triggered; - case 'after_french_alliance': return game.french_alliance_triggered; - case 'european_war_in_effect': return game.european_war; + case "before_french_alliance": + return !game.french_alliance_triggered + case "after_french_alliance": + return game.french_alliance_triggered + case "european_war_in_effect": + return game.european_war } switch (card.event) { - case 'john_glovers_marblehead_regiment': return has_general_on_map(); + case "john_glovers_marblehead_regiment": + return has_general_on_map() } - return true; + return true } function can_play_reinforcements() { - if (game.active == BRITISH) { - if (game.played_british_reinforcements == 0) { - let n = count_british_cu(BRITISH_REINFORCEMENTS); + if (game.active === BRITISH) { + if (game.played_british_reinforcements === 0) { + let n = count_british_cu(BRITISH_REINFORCEMENTS) for (let g of BRITISH_GENERALS) - if (game.generals[g].location == BRITISH_REINFORCEMENTS) - ++n; - return n > 0; + if (game.generals[g].location === BRITISH_REINFORCEMENTS) + ++n + return n > 0 } - return false; + return false } - if (game.active == AMERICAN) - return game.played_american_reinforcements.length < 2; - return false; + if (game.active === AMERICAN) + return game.played_american_reinforcements.length < 2 + return false } function is_port(where) { - return SPACES[where].port; + return SPACES[where].port } function is_non_blockaded_port(where) { - if (SPACES[where].port && BLOCKADE[where] != game.french_navy) - return true; - return false; + if (SPACES[where].port && BLOCKADE[where] !== game.french_navy) + return true + return false } function is_fortified_port(where) { - return SPACES[where].type == 'fortified-port'; + return SPACES[where].type === "fortified-port" } function is_continental_congress_dispersed() { - return game.congress == CONTINENTAL_CONGRESS_DISPERSED; + return game.congress === CONTINENTAL_CONGRESS_DISPERSED } function is_winter_quarter_space(where) { - let colony = SPACES[where].colony; - if (colony == 'GA' || colony == 'SC' || colony == 'NC') - return true; // south of winter attrition line - let type = SPACES[where].type; - if (type == 'winter-quarters' || type == 'fortified-port') - return true; - return false; + let colony = SPACES[where].colony + if (colony === "GA" || colony === "SC" || colony === "NC") + return true // south of winter attrition line + let type = SPACES[where].type + if (type === "winter-quarters" || type === "fortified-port") + return true + return false } function allowed_to_place_american_pc() { if (is_continental_congress_dispersed()) - return false; + return false if (game.pennsylvania_and_new_jersey_line_mutinies) - return false; - return true; + return false + return true } function is_british_militia(space) { - return game.control[SPACES[space].colony] == BRITISH; + return game.control[SPACES[space].colony] === BRITISH } function is_american_militia(space) { - return game.control[SPACES[space].colony] == AMERICAN; + return game.control[SPACES[space].colony] === AMERICAN } function is_american_winter_offensive() { - if (game.who == WASHINGTON && game.a_hand.length == 0) - return true; - return false; + if (game.who === WASHINGTON && game.a_hand.length === 0) + return true + return false } /* PC */ function has_no_pc(space) { - return game.pc[space] != BRITISH && game.pc[space] != AMERICAN; + return game.pc[space] !== BRITISH && game.pc[space] !== AMERICAN } function has_british_pc(space) { - return game.pc[space] == BRITISH; + return game.pc[space] === BRITISH } function has_american_pc(space) { - return game.pc[space] == AMERICAN; + return game.pc[space] === AMERICAN } function has_enemy_pc(space) { - if (game.active == BRITISH) - return has_american_pc(space); + if (game.active === BRITISH) + return has_american_pc(space) else - return has_british_pc(space); + return has_british_pc(space) } function is_adjacent_to_british_pc(a) { for (let b of SPACES[a].exits) if (has_british_pc(b)) - return true; + return true if (SPACES[a].port) { for (let b in SPACES) { if (SPACES[b].port) if (has_british_pc(b)) - return true; + return true } } - return false; + return false } function is_adjacent_to_american_pc(a) { for (let b of SPACES[a].exits) if (has_american_pc(b)) - return true; - return false; + return true + return false } function place_british_pc(space) { - logp("placed PC in " + space); + logp("placed PC in " + space) if (game.british_pc_space_list) - remove_from_array(game.british_pc_space_list, space); - game.pc[space] = BRITISH; + remove_from_array(game.british_pc_space_list, space) + game.pc[space] = BRITISH } function place_american_pc(space) { - logp("placed PC in " + space); - game.pc[space] = AMERICAN; + logp("placed PC in " + space) + game.pc[space] = AMERICAN } function remove_pc(space) { - if (game.active == BRITISH) - logp("removed PC in " + space); + if (game.active === BRITISH) + logp("removed PC in " + space) else - logp("removed PC in " + space); - game.pc[space] = undefined; + logp("removed PC in " + space) + game.pc[space] = undefined } function flip_pc(space) { - if (game.active == BRITISH) - logp("flipped PC in " + space); + if (game.active === BRITISH) + logp("flipped PC in " + space) else - logp("flipped PC in " + space); - game.pc[space] = ENEMY[game.pc[space]]; + logp("flipped PC in " + space) + game.pc[space] = ENEMY[game.pc[space]] } function update_colony_control() { for (let c in COLONIES) { - let control = 0; + let control = 0 for (let space of COLONIES[c]) { - if (game.pc[space] == BRITISH) - --control; - else if (game.pc[space] == AMERICAN) - ++control; + if (game.pc[space] === BRITISH) + --control + else if (game.pc[space] === AMERICAN) + ++control } if (control < 0) - game.control[c] = BRITISH; + game.control[c] = BRITISH else if (control > 0) - game.control[c] = AMERICAN; + game.control[c] = AMERICAN else - game.control[c] = undefined; + game.control[c] = undefined } } @@ -493,484 +498,484 @@ function update_colony_control() { function find_cu(owner, space) { for (let i = 0; i < game.cu.length; ++i) { - let cu = game.cu[i]; - if (cu.location == space && cu.owner == owner) - return cu; + let cu = game.cu[i] + if (cu.location === space && cu.owner === owner) + return cu } - return null; + return null } function find_british_cu(space) { - return find_cu(BRITISH, space); + return find_cu(BRITISH, space) } function find_american_cu(space) { - return find_cu(AMERICAN, space); + return find_cu(AMERICAN, space) } function find_french_cu(space) { - return find_cu(FRENCH, space); + return find_cu(FRENCH, space) } function has_british_cu(space) { - return find_british_cu(space) != null; + return find_british_cu(space) !== null } function has_no_british_cu(space) { - return !has_british_cu(space); + return !has_british_cu(space) } function has_american_or_french_cu(space) { - return find_american_cu(space) != null || find_french_cu(space) != null; + return find_american_cu(space) !== null || find_french_cu(space) !== null } function has_american_cu(space) { - return find_american_cu(space) != null; + return find_american_cu(space) !== null } function has_french_cu(space) { - return find_french_cu(space) != null; + return find_french_cu(space) !== null } function has_enemy_cu(where) { - if (game.active == BRITISH) - return has_american_or_french_cu(where); + if (game.active === BRITISH) + return has_american_or_french_cu(where) else - return has_british_cu(where); + return has_british_cu(where) } function count_cu(owner, space) { - let cu = find_cu(owner, space); - return cu ? cu.count : 0; + let cu = find_cu(owner, space) + return cu ? cu.count : 0 } function count_british_cu(where) { - let cu = find_british_cu(where); - return cu ? cu.count : 0; + let cu = find_british_cu(where) + return cu ? cu.count : 0 } function count_american_cu(where) { - let cu = find_american_cu(where); - return cu ? cu.count : 0; + let cu = find_american_cu(where) + return cu ? cu.count : 0 } function count_french_cu(where) { - let cu = find_french_cu(where); - return cu ? cu.count : 0; + let cu = find_french_cu(where) + return cu ? cu.count : 0 } function count_unmoved_british_cu(where) { - let cu = find_british_cu(where); - return cu ? cu.count - cu.moved : 0; + let cu = find_british_cu(where) + return cu ? cu.count - cu.moved : 0 } function count_unmoved_american_cu(where) { - let cu = find_american_cu(where); - return cu ? cu.count - cu.moved : 0; + let cu = find_american_cu(where) + return cu ? cu.count - cu.moved : 0 } function count_unmoved_french_cu(where) { - let cu = find_french_cu(where); - return cu ? cu.count - cu.moved : 0; + let cu = find_french_cu(where) + return cu ? cu.count - cu.moved : 0 } function mark_moved_cu(owner, space, moved) { if (moved > 0) - find_cu(owner, space).moved += moved; + find_cu(owner, space).moved += moved } function count_american_and_french_cu(where) { - return count_american_cu(where) + count_french_cu(where); + return count_american_cu(where) + count_french_cu(where) } function count_enemy_cu(where) { - if (game.active == BRITISH) - return count_american_and_french_cu(where); + if (game.active === BRITISH) + return count_american_and_french_cu(where) else - return count_british_cu(where); + return count_british_cu(where) } function spawn_cu(owner, where, count) { - game.cu.push({owner:owner, location:where, count:count, moved:0}); + game.cu.push({ owner: owner, location: where, count: count, moved: 0 }) } function remove_cu(owner, where, count) { - if (count == 0) - return; - let cu = find_cu(owner, where); + if (count === 0) + return + let cu = find_cu(owner, where) if (count >= cu.count) { - let i = game.cu.indexOf(cu); - remove_from_array(game.cu, cu); + let i = game.cu.indexOf(cu) + remove_from_array(game.cu, cu) } else { - cu.count -= count; + cu.count -= count } } function place_cu(owner, where, count) { - let cu = find_cu(owner, where); + let cu = find_cu(owner, where) if (!cu) - spawn_cu(owner, where, count); + spawn_cu(owner, where, count) else - cu.count += count; + cu.count += count } function place_british_cu(where, count) { - place_cu(BRITISH, where, count); + place_cu(BRITISH, where, count) } function place_american_cu(where, count) { - place_cu(AMERICAN, where, count); + place_cu(AMERICAN, where, count) } function place_french_cu(where, count) { - place_cu(FRENCH, where, count); + place_cu(FRENCH, where, count) } function move_cu(owner, from, to, count) { - if (count == 0) - return; - let from_cu = find_cu(owner, from); + if (count === 0) + return + let from_cu = find_cu(owner, from) if (count < from_cu.count) { - from_cu.count -= count; - place_cu(owner, to, count); + from_cu.count -= count + place_cu(owner, to, count) } else { - let to_cu = find_cu(owner, to); + let to_cu = find_cu(owner, to) if (to_cu) { - remove_cu(owner, from, from_cu.count); - to_cu.count += count; + remove_cu(owner, from, from_cu.count) + to_cu.count += count } else { - from_cu.location = to; + from_cu.location = to } } } function move_british_cu(from, to, count) { - move_cu(BRITISH, from, to, count); + move_cu(BRITISH, from, to, count) } /* GENERALS */ function is_general_on_map(g) { switch (game.generals[g].location) { - case null: /* killed */ - case CAPTURED_GENERALS: - case BRITISH_REINFORCEMENTS: - case AMERICAN_REINFORCEMENTS: - case FRENCH_REINFORCEMENTS: - return false; + case null: /* killed */ + case CAPTURED_GENERALS: + case BRITISH_REINFORCEMENTS: + case AMERICAN_REINFORCEMENTS: + case FRENCH_REINFORCEMENTS: + return false } - return true; + return true } function find_british_general(where) { for (let general of BRITISH_GENERALS) - if (game.generals[general].location == where) - return general; - return null; + if (game.generals[general].location === where) + return general + return null } function find_american_or_french_general(where) { for (let general of AMERICAN_GENERALS) - if (game.generals[general].location == where) - return general; - return null; + if (game.generals[general].location === where) + return general + return null } function has_british_general(where) { - return find_british_general(where) != null; + return find_british_general(where) !== null } function has_american_or_french_general(where) { - return find_american_or_french_general(where) != null; + return find_american_or_french_general(where) !== null } function has_enemy_general(where) { - if (game.active == BRITISH) - return has_american_or_french_general(where); + if (game.active === BRITISH) + return has_american_or_french_general(where) else - return has_british_general(where); + return has_british_general(where) } function count_friendly_generals(where) { - let list; - if (game.active == BRITISH) - list = BRITISH_GENERALS; + let list + if (game.active === BRITISH) + list = BRITISH_GENERALS else - list = AMERICAN_GENERALS; - let count = 0; + list = AMERICAN_GENERALS + let count = 0 for (let g of list) - if (location_of_general(g) == where) - ++count; - return count; + if (location_of_general(g) === where) + ++count + return count } function has_general_on_map() { - if (game.active == BRITISH) - return has_british_general_on_map(); + if (game.active === BRITISH) + return has_british_general_on_map() else - return has_american_general_on_map(); + return has_american_general_on_map() } function has_british_general_on_map() { for (let g of BRITISH_GENERALS) if (is_general_on_map(g)) - return true; - return false; + return true + return false } function has_american_general_on_map() { for (let g of AMERICAN_GENERALS) if (is_general_on_map(g)) - return true; - return false; + return true + return false } function can_activate_general(c) { - if (game.active == BRITISH) - return can_activate_british_general(c); + if (game.active === BRITISH) + return can_activate_british_general(c) else - return can_activate_american_general(c); + return can_activate_american_general(c) } function can_activate_british_general(c) { - let ops = CARDS[c].count + game.b_queue; + let ops = CARDS[c].count + game.b_queue for (let g of BRITISH_GENERALS) if (is_general_on_map(g) && GENERALS[g].strategy <= ops) - return true; - return false; + return true + return false } function can_activate_american_general(c) { - let ops = CARDS[c].count + game.a_queue; + let ops = CARDS[c].count + game.a_queue for (let g of AMERICAN_GENERALS) if (is_general_on_map(g) && GENERALS[g].strategy <= ops) - return true; - return false; + return true + return false } function move_general(who, where) { - game.generals[who].location = where; + game.generals[who].location = where } function capture_washington() { - game.generals[WASHINGTON].location = null; + game.generals[WASHINGTON].location = null if (!game.french_alliance_triggered) { - game.french_alliance -= 3; + game.french_alliance -= 3 if (game.french_alliance < 0) - game.french_alliance = 0; + game.french_alliance = 0 } - goto_george_washington_captured(); + goto_george_washington_captured() } function capture_british_general(where) { - let g = find_british_general(where); - log(g + " was captured!"); - move_general(g, CAPTURED_GENERALS); + let g = find_british_general(where) + log(g + " was captured!") + move_general(g, CAPTURED_GENERALS) } function capture_american_or_french_general(where) { - let g = find_american_or_french_general(where); - log(g + " was captured!"); - if (g == WASHINGTON) - capture_washington(); + let g = find_american_or_french_general(where) + log(g + " was captured!") + if (g === WASHINGTON) + capture_washington() else - move_general(g, CAPTURED_GENERALS); + move_general(g, CAPTURED_GENERALS) } function capture_enemy_general(where) { - if (game.active == BRITISH) - capture_american_or_french_general(where); + if (game.active === BRITISH) + capture_american_or_french_general(where) else - capture_british_general(where); + capture_british_general(where) } function remove_benedict_arnold() { if (game.generals[ARNOLD].location) { - log("Removed Arnold from the game!"); - game.generals[ARNOLD].location = null; + log("Removed Arnold from the game!") + game.generals[ARNOLD].location = null } } /* ARMIES */ function has_british_army(where) { - return has_british_general(where) && has_british_cu(where); + return has_british_general(where) && has_british_cu(where) } function has_american_army(where) { - return has_american_or_french_general(where) && has_american_or_french_cu(where); + return has_american_or_french_general(where) && has_american_or_french_cu(where) } function has_no_british_playing_piece(where) { if (has_british_pc(where)) - return false; + return false if (has_british_general(where)) - return false; + return false if (has_british_cu(where)) - return false; - return true; + return false + return true } function has_no_american_unit(where) { if (has_american_or_french_general(where)) - return false; + return false if (has_american_or_french_cu(where)) - return false; - if (game.congress == where) - return false; - return true; + return false + if (game.congress === where) + return false + return true } function place_british_reinforcements(who, count, where) { - let already_there = find_british_general(where); + let already_there = find_british_general(where) if (who && already_there) { - move_general(already_there, BRITISH_REINFORCEMENTS); + move_general(already_there, BRITISH_REINFORCEMENTS) } if (who) { - logp("reinforced " + where + " with " + who); - move_general(who, where); + logp("reinforced " + where + " with " + who) + move_general(who, where) } if (count > 0) { - logp("reinforced " + where + " with " + count + " CU"); - move_british_cu(BRITISH_REINFORCEMENTS, where, count); + logp("reinforced " + where + " with " + count + " CU") + move_british_cu(BRITISH_REINFORCEMENTS, where, count) if (has_enemy_general(where)) - capture_enemy_general(where); - if (game.active == BRITISH && game.congress == where) - disperse_continental_congress(where); + capture_enemy_general(where) + if (game.active === BRITISH && game.congress === where) + disperse_continental_congress(where) } } function place_american_reinforcements(who, count, where) { - let already_there = find_american_or_french_general(where); + let already_there = find_american_or_french_general(where) if (who && already_there) { // Never replace Washington - if (already_there == WASHINGTON) - who = null; + if (already_there === WASHINGTON) + who = null else - move_general(already_there, AMERICAN_REINFORCEMENTS); + move_general(already_there, AMERICAN_REINFORCEMENTS) } if (who) { - logp("reinforced " + where + " with " + who); - move_general(who, where); + logp("reinforced " + where + " with " + who) + move_general(who, where) } - logp("reinforced " + where + " with " + count + " CU"); - place_american_cu(where, count); + logp("reinforced " + where + " with " + count + " CU") + place_american_cu(where, count) if (has_enemy_general(where)) - capture_enemy_general(where); + capture_enemy_general(where) } function place_french_reinforcements(who, where) { - let already_there = find_american_or_french_general(where); + let already_there = find_american_or_french_general(where) if (who && already_there) { // Never replace Washington - if (already_there == WASHINGTON) - who = null; + if (already_there === WASHINGTON) + who = null else - move_general(already_there, AMERICAN_REINFORCEMENTS); + move_general(already_there, AMERICAN_REINFORCEMENTS) } if (who) { - logp("reinforced " + where + " with " + who); - move_general(who, where); + logp("reinforced " + where + " with " + who) + move_general(who, where) } - logp("reinforced " + where + " with the French CU"); - move_cu(FRENCH, FRENCH_REINFORCEMENTS, where, count_french_cu(FRENCH_REINFORCEMENTS)); - move_cu(FRENCH, AMERICAN_REINFORCEMENTS, where, count_french_cu(AMERICAN_REINFORCEMENTS)); + logp("reinforced " + where + " with the French CU") + move_cu(FRENCH, FRENCH_REINFORCEMENTS, where, count_french_cu(FRENCH_REINFORCEMENTS)) + move_cu(FRENCH, AMERICAN_REINFORCEMENTS, where, count_french_cu(AMERICAN_REINFORCEMENTS)) } function location_of_general(g) { - return game.generals[g].location; + return game.generals[g].location } function pickup_max_british_cu(where) { - game.carry_british = count_unmoved_british_cu(where); + game.carry_british = count_unmoved_british_cu(where) if (game.carry_british > 5) - game.carry_british = 5; - game.carry_american = 0; - game.carry_french = 0; + game.carry_british = 5 + game.carry_american = 0 + game.carry_french = 0 } function pickup_max_american_cu(where) { - game.carry_british = 0; - game.carry_french = count_unmoved_french_cu(where); - game.carry_american = count_unmoved_american_cu(where); + game.carry_british = 0 + game.carry_french = count_unmoved_french_cu(where) + game.carry_american = count_unmoved_american_cu(where) if (game.carry_french > 5) - game.carry_french = 5; + game.carry_french = 5 if (game.carry_american + game.carry_french > 5) - game.carry_american = 5 - game.carry_french; + game.carry_american = 5 - game.carry_french } function move_army(who, from, to) { - game.count -= movement_cost(from, to); + game.count -= movement_cost(from, to) if (game.mobility && has_enemy_cu(to)) { - game.mobility = false; - game.count -= 1; + game.mobility = false + game.count -= 1 } if (game.carry_british > 0) - move_cu(BRITISH, from, to, game.carry_british); + move_cu(BRITISH, from, to, game.carry_british) if (game.carry_american > 0) - move_cu(AMERICAN, from, to, game.carry_american); + move_cu(AMERICAN, from, to, game.carry_american) if (game.carry_french > 0) - move_cu(FRENCH, from, to, game.carry_french); - move_general(who, to); + move_cu(FRENCH, from, to, game.carry_french) + move_general(who, to) } function intercept_army(who, from, to) { if (game.carry_british > 0) - move_cu(BRITISH, from, to, game.carry_british); + move_cu(BRITISH, from, to, game.carry_british) if (game.carry_american > 0) - move_cu(AMERICAN, from, to, game.carry_american); + move_cu(AMERICAN, from, to, game.carry_american) if (game.carry_french > 0) - move_cu(FRENCH, from, to, game.carry_french); - move_general(who, to); + move_cu(FRENCH, from, to, game.carry_french) + move_general(who, to) } function overrun(where) { - logp("overran CU in " + where); - let cu; - if (game.active == BRITISH) - cu = find_american_cu(where) || find_french_cu(where); + logp("overran CU in " + where) + let cu + if (game.active === BRITISH) + cu = find_american_cu(where) || find_french_cu(where) else - cu = find_british_cu(where); - remove_cu(cu.owner, where, 1); + cu = find_british_cu(where) + remove_cu(cu.owner, where, 1) } function retreat_american_army(from, to) { - let g = find_american_or_french_general(from); + let g = find_american_or_french_general(from) if (g) - move_general(g, to); - move_cu(AMERICAN, from, to, count_american_cu(from)); - move_cu(FRENCH, from, to, count_french_cu(from)); + move_general(g, to) + move_cu(AMERICAN, from, to, count_american_cu(from)) + move_cu(FRENCH, from, to, count_french_cu(from)) } function retreat_british_army(from, to) { - let g = find_british_general(from); + let g = find_british_general(from) if (g) - move_general(g, to); - move_cu(BRITISH, from, to, count_british_cu(from)); + move_general(g, to) + move_cu(BRITISH, from, to, count_british_cu(from)) } function surrender_american_army(where) { - let g = find_american_or_french_general(where); + let g = find_american_or_french_general(where) if (g) - capture_american_or_french_general(where); - remove_cu(AMERICAN, where, count_american_cu(where)); - remove_cu(FRENCH, where, count_french_cu(where)); + capture_american_or_french_general(where) + remove_cu(AMERICAN, where, count_american_cu(where)) + remove_cu(FRENCH, where, count_french_cu(where)) } function surrender_british_army(where) { - let g = find_british_general(where); + let g = find_british_general(where) if (g) - capture_british_general(where); - game.british_losses += count_british_cu(where); - remove_cu(BRITISH, where, count_british_cu(where)); + capture_british_general(where) + game.british_losses += count_british_cu(where) + remove_cu(BRITISH, where, count_british_cu(where)) } function disperse_continental_congress(where) { - log("Contintental Congress dispersed!"); - game.congress = CONTINENTAL_CONGRESS_DISPERSED; - game.congress_was_dispersed = true; + log("Contintental Congress dispersed!") + game.congress = CONTINENTAL_CONGRESS_DISPERSED + game.congress_was_dispersed = true } /* MOVE GENERATORS */ @@ -978,13 +983,13 @@ function disperse_continental_congress(where) { function gen_action(action, argument) { if (!view.actions) view.actions = {} - if (argument != undefined) { + if (argument !== undefined) { if (!(action in view.actions)) - view.actions[action] = [ argument ]; + view.actions[action] = [ argument ] else - view.actions[action].push(argument); + view.actions[action].push(argument) } else { - view.actions[action] = 1; + view.actions[action] = 1 } } @@ -992,20 +997,20 @@ function gen_action_undo() { if (!view.actions) view.actions = {} if (game.undo && game.undo.length > 0) - view.actions.undo = 1; + view.actions.undo = 1 else - view.actions.undo = 0; + view.actions.undo = 0 } function gen_pass() { - gen_action('pass'); + gen_action("pass") } function gen_remove_british_pc_from(list_of_colonies) { for (let colony of list_of_colonies) { for (let space of COLONIES[colony]) { if (has_british_pc(space) && has_no_british_cu(space)) { - gen_action('remove_pc', space); + gen_action("remove_pc", space) } } } @@ -1014,7 +1019,7 @@ function gen_remove_british_pc_from(list_of_colonies) { function gen_remove_american_pc() { for (let space in SPACES) { if (has_american_pc(space) && has_no_american_unit(space)) { - gen_action('remove_pc', space); + gen_action("remove_pc", space) } } } @@ -1023,7 +1028,7 @@ function gen_remove_american_pc_from(list_of_colonies) { for (let colony of list_of_colonies) { for (let space of COLONIES[colony]) { if (has_american_pc(space) && has_no_american_unit(space)) { - gen_action('remove_pc', space); + gen_action("remove_pc", space) } } } @@ -1034,7 +1039,7 @@ function gen_remove_american_pc_from_non_port(list_of_colonies) { for (let space of COLONIES[colony]) { if (!SPACES[space].port) { if (has_american_pc(space) && has_no_american_unit(space)) { - gen_action('remove_pc', space); + gen_action("remove_pc", space) } } } @@ -1042,28 +1047,28 @@ function gen_remove_american_pc_from_non_port(list_of_colonies) { } function gen_remove_american_pc_within_two_spaces_of_a_british_general() { - let candidates = {}; + let candidates = {} for (let g of BRITISH_GENERALS) { - let a = game.generals[g].location; + let a = game.generals[g].location if (a in SPACES) { - candidates[a] = true; + candidates[a] = true for (let b of SPACES[a].exits) { - candidates[b] = true; + candidates[b] = true for (let c of SPACES[b].exits) { - candidates[c] = true; + candidates[c] = true } } } } for (let space in candidates) if (has_american_pc(space) && has_no_american_unit(space)) - gen_action('remove_pc', space); + gen_action("remove_pc", space) } function gen_place_american_pc() { for (let space in SPACES) { if (has_no_pc(space) && has_no_british_playing_piece(space)) { - gen_action('place_american_pc', space); + gen_action("place_american_pc", space) } } } @@ -1072,7 +1077,7 @@ function gen_place_american_pc_in(list_of_colonies) { for (let colony of list_of_colonies) { for (let space of COLONIES[colony]) { if (has_no_pc(space) && has_no_british_playing_piece(space)) { - gen_action('place_american_pc', space); + gen_action("place_american_pc", space) } } } @@ -1081,349 +1086,368 @@ function gen_place_american_pc_in(list_of_colonies) { /* SETUP PHASE */ function goto_committees_of_correspondence() { - log(".h2.american Committes of Correspondence"); - logbr(); - game.active = AMERICAN; - game.state = 'committees_of_correspondence'; - game.coc = THE_13_COLONIES.slice(); + log(".h2.american Committes of Correspondence") + logbr() + game.active = AMERICAN + game.state = "committees_of_correspondence" + game.coc = THE_13_COLONIES.slice() } states.committees_of_correspondence = { inactive: "Committees of Correspondence", prompt: function (current) { - view.prompt = "Committees of Correspondence: Place 1 PC marker in each of the 13 colonies. " + game.coc.length + " left."; + view.prompt = + "Committees of Correspondence: Place 1 PC marker in each of the 13 colonies. " + game.coc.length + " left." if (game.coc.length > 0) - gen_place_american_pc_in(game.coc); + gen_place_american_pc_in(game.coc) else - gen_pass(); + gen_pass() }, place_american_pc: function (space) { - push_undo(); - let colony = SPACES[space].colony; - remove_from_array(game.coc, colony); - place_american_pc(space); + push_undo() + let colony = SPACES[space].colony + remove_from_array(game.coc, colony) + place_american_pc(space) }, pass: function () { - clear_undo(); - goto_for_the_king(); - } + clear_undo() + goto_for_the_king() + }, } function goto_for_the_king() { - logbr(); - log(".h2.british For the King"); - logbr(); - delete game.coc; - game.active = BRITISH; - game.state = 'for_the_king'; - game.count = 3; - gen_british_pc_ops_start(); + logbr() + log(".h2.british For the King") + logbr() + delete game.coc + game.active = BRITISH + game.state = "for_the_king" + game.count = 3 + gen_british_pc_ops_start() } states.for_the_king = { inactive: "For the King", prompt: function (current) { - view.prompt = "For the King: Place 3 PC markers. " + game.count + " left."; + view.prompt = "For the King: Place 3 PC markers. " + game.count + " left." if (game.count > 0) - gen_british_pc_ops(); + gen_british_pc_ops() else - gen_pass(); + gen_pass() }, place_british_pc: function (space) { - push_undo(); - place_british_pc(space); - --game.count; + push_undo() + place_british_pc(space) + --game.count }, pass: function () { - clear_undo(); - gen_british_pc_ops_end(); - goto_start_year(); - } + clear_undo() + gen_british_pc_ops_end() + goto_start_year() + }, } /* REINFORCEMENTS AND START OF STRATEGY PHASE */ function automatic_victory() { - let n_american = 0; - let n_british = 0; + let n_american = 0 + let n_british = 0 for (let space in SPACES) { - n_american += count_french_cu(space) + count_american_cu(space); - if (SPACES[space].colony != "CA") - n_british += count_british_cu(space); + n_american += count_french_cu(space) + count_american_cu(space) + if (SPACES[space].colony !== "CA") + n_british += count_british_cu(space) } - if (n_american == 0) { - game.victory = "British Automatic Victory!"; - game.active = "None"; - game.result = BRITISH; - game.state = 'game_over'; - log(game.victory); - return true; + if (n_american === 0) { + game.victory = "British Automatic Victory!" + game.active = "None" + game.result = BRITISH + game.state = "game_over" + log(game.victory) + return true } - if (n_british == 0) { - game.victory = "American Automatic Victory!"; - game.active = "None"; - game.result = AMERICAN; - game.state = 'game_over'; - log(game.victory); - return true; + if (n_british === 0) { + game.victory = "American Automatic Victory!" + game.active = "None" + game.result = AMERICAN + game.state = "game_over" + log(game.victory) + return true } - return false; + return false } function goto_start_year() { - logbr(); - log(".h1 Year " + game.year); - logbr(); + logbr() + log(".h1 Year " + game.year) + logbr() // Prisoner exchange for (let g of BRITISH_GENERALS) - if (game.generals[g].location == CAPTURED_GENERALS) - move_general(g, BRITISH_REINFORCEMENTS); + if (game.generals[g].location === CAPTURED_GENERALS) + move_general(g, BRITISH_REINFORCEMENTS) for (let g of AMERICAN_GENERALS) - if (game.generals[g].location == CAPTURED_GENERALS) - move_general(g, AMERICAN_REINFORCEMENTS); + if (game.generals[g].location === CAPTURED_GENERALS) + move_general(g, AMERICAN_REINFORCEMENTS) switch (game.year) { - case 1775: place_british_cu(BRITISH_REINFORCEMENTS, 3); break; - case 1776: place_british_cu(BRITISH_REINFORCEMENTS, 8); break; - case 1777: place_british_cu(BRITISH_REINFORCEMENTS, 1); break; - case 1778: place_british_cu(BRITISH_REINFORCEMENTS, 8); break; - case 1779: place_british_cu(BRITISH_REINFORCEMENTS, 1); break; - case 1780: place_british_cu(BRITISH_REINFORCEMENTS, 5); break; - case 1781: place_british_cu(BRITISH_REINFORCEMENTS, 1); break; - case 1782: place_british_cu(BRITISH_REINFORCEMENTS, 1); break; - case 1783: place_british_cu(BRITISH_REINFORCEMENTS, 1); break; - } - - if (game.year == 1776) { - game.deck.push(DECLARATION_OF_INDEPENDENCE); - game.deck.push(BARON_VON_STEUBEN); + case 1775: + place_british_cu(BRITISH_REINFORCEMENTS, 3) + break + case 1776: + place_british_cu(BRITISH_REINFORCEMENTS, 8) + break + case 1777: + place_british_cu(BRITISH_REINFORCEMENTS, 1) + break + case 1778: + place_british_cu(BRITISH_REINFORCEMENTS, 8) + break + case 1779: + place_british_cu(BRITISH_REINFORCEMENTS, 1) + break + case 1780: + place_british_cu(BRITISH_REINFORCEMENTS, 5) + break + case 1781: + place_british_cu(BRITISH_REINFORCEMENTS, 1) + break + case 1782: + place_british_cu(BRITISH_REINFORCEMENTS, 1) + break + case 1783: + place_british_cu(BRITISH_REINFORCEMENTS, 1) + break + } + + if (game.year === 1776) { + game.deck.push(DECLARATION_OF_INDEPENDENCE) + game.deck.push(BARON_VON_STEUBEN) } if (game.reshuffle) - reshuffle_deck(); + reshuffle_deck() - game.a_hand = []; - game.b_hand = []; + game.a_hand = [] + game.b_hand = [] for (let i = 0; i < 7; ++i) { - game.a_hand.push(deal_card()); - game.b_hand.push(deal_card()); + game.a_hand.push(deal_card()) + game.b_hand.push(deal_card()) } - game.a_queue = 0; - game.b_queue = 0; - game.did_discard_event = false; + game.a_queue = 0 + game.b_queue = 0 + game.did_discard_event = false // TODO: save the played card numbers instead (rule 6.1B clarification) - game.played_british_reinforcements = 0; - game.played_american_reinforcements = []; - game.active = BRITISH; - game.state = 'british_declare_first'; + game.played_british_reinforcements = 0 + game.played_american_reinforcements = [] + game.active = BRITISH + game.state = "british_declare_first" } states.british_declare_first = { prompt: function (current) { - view.prompt = "Declare yourself as the first player by playing a campaign card?"; - gen_pass(); + view.prompt = "Declare yourself as the first player by playing a campaign card?" + gen_pass() for (let c of CAMPAIGN_CARDS) { if (game.b_hand.includes(c)) { - gen_action('card_campaign', c); + gen_action("card_campaign", c) } } }, card_campaign: function (c) { - delete game.congress_was_dispersed; - logp("went first by playing a campaign card"); - game.active = BRITISH; - goto_campaign(c); + delete game.congress_was_dispersed + logp("went first by playing a campaign card") + game.active = BRITISH + goto_campaign(c) }, pass: function () { if (game.congress_was_dispersed) - game.active = BRITISH; + game.active = BRITISH else - game.active = AMERICAN; - game.state = 'choose_first_player'; - delete game.congress_was_dispersed; + game.active = AMERICAN + game.state = "choose_first_player" + delete game.congress_was_dispersed }, } states.choose_first_player = { prompt: function (current) { - view.prompt = "Choose who will play the first strategy card."; - gen_action('american_first'); - gen_action('british_first'); + view.prompt = "Choose who will play the first strategy card." + gen_action("american_first") + gen_action("british_first") }, american_first: function (c) { - logp("went first"); - goto_strategy_phase(AMERICAN); + logp("went first") + goto_strategy_phase(AMERICAN) }, british_first: function (c) { - logp("went first"); - goto_strategy_phase(BRITISH); + logp("went first") + goto_strategy_phase(BRITISH) }, } /* STRATEGY PHASE */ function goto_strategy_phase(new_active) { - game.active = new_active; - game.state = 'strategy_phase'; - logbr(); + game.active = new_active + game.state = "strategy_phase" + logbr() if (game.active === AMERICAN) - log(".h2.american American Turn"); + log(".h2.american American Turn") else - log(".h2.british British Turn"); - logbr(); + log(".h2.british British Turn") + logbr() } states.strategy_phase = { inactive: "strategy phase", prompt: function (current) { - view.prompt = "Play a strategy card."; - gen_strategy_plays(active_hand()); + view.prompt = "Play a strategy card." + gen_strategy_plays(active_hand()) }, card_campaign: function (c) { - game.did_discard_event = false; - clear_queue(); - goto_campaign(c); + game.did_discard_event = false + clear_queue() + goto_campaign(c) }, card_play_event: function (c) { - push_undo(); - game.did_discard_event = false; - clear_queue(); - do_event(c); + push_undo() + game.did_discard_event = false + clear_queue() + do_event(c) }, card_discard_event: function (c) { - push_undo(); - game.did_discard_event = true; - clear_queue(); - discard_card(c, "PC action"); - game.state = 'discard_event_pc_action'; + push_undo() + game.did_discard_event = true + clear_queue() + discard_card(c, "PC action") + game.state = "discard_event_pc_action" }, card_ops_pc: function (c) { - push_undo(); - game.did_discard_event = false; - clear_queue(); - play_card(c, "for PC"); - goto_ops_pc(CARDS[c].count); + push_undo() + game.did_discard_event = false + clear_queue() + play_card(c, "for PC") + goto_ops_pc(CARDS[c].count) }, card_ops_reinforcements: function (c) { - push_undo(); - game.did_discard_event = false; - clear_queue(); - goto_ops_reinforcements(c); + push_undo() + game.did_discard_event = false + clear_queue() + goto_ops_reinforcements(c) }, card_ops_queue: function (c) { - game.did_discard_event = false; - play_card(c, "to queue"); - if (game.active == BRITISH) - game.b_queue += CARDS[c].count; + game.did_discard_event = false + play_card(c, "to queue") + if (game.active === BRITISH) + game.b_queue += CARDS[c].count else - game.a_queue += CARDS[c].count; - end_strategy_card(); + game.a_queue += CARDS[c].count + end_strategy_card() }, card_ops_general: function (c) { - push_undo(); - game.did_discard_event = false; - goto_ops_general(c); + push_undo() + game.did_discard_event = false + goto_ops_general(c) }, exchange_for_discard: function (c) { - game.did_discard_event = false; - let d = game.discard.pop(); - discard_card(c); - active_hand().push(d); - logp("picked up up #" + d); + game.did_discard_event = false + let d = game.discard.pop() + discard_card(c) + active_hand().push(d) + logp("picked up up #" + d) }, } function end_strategy_card() { - clear_undo(); + clear_undo() if (automatic_victory()) - return; + return if (game.campaign) { if (--game.campaign > 0) { - game.count = 3; // can activate any general! - game.state = 'ops_general_who'; - return; + game.count = 3 // can activate any general! + game.state = "ops_general_who" + return } else { - delete game.landing_party; - delete game.campaign; + delete game.landing_party + delete game.campaign } } - if (!game.french_alliance_triggered && game.french_alliance == 9) { - log("The French signed an alliance with the Americans!"); - game.french_alliance_triggered = true; - if (game.french_navy == FRENCH_REINFORCEMENTS) { - game.save_active = game.active; - game.active = AMERICAN; - game.state = 'place_french_navy_trigger'; - return; + if (!game.french_alliance_triggered && game.french_alliance === 9) { + log("The French signed an alliance with the Americans!") + game.french_alliance_triggered = true + if (game.french_navy === FRENCH_REINFORCEMENTS) { + game.save_active = game.active + game.active = AMERICAN + game.state = "place_french_navy_trigger" + return } } - game.moved = {}; + game.moved = {} for (let cu of game.cu) - cu.moved = 0; + cu.moved = 0 - goto_strategy_phase(ENEMY[game.active]); + goto_strategy_phase(ENEMY[game.active]) - let hand = active_hand(); - if (hand.length == 0) { - game.active = ENEMY[game.active]; - hand = active_hand(); - if (hand.length == 0) - return goto_winter_attrition_phase(); + let hand = active_hand() + if (hand.length === 0) { + game.active = ENEMY[game.active] + hand = active_hand() + if (hand.length === 0) + return goto_winter_attrition_phase() } } function clear_queue() { - if (game.active == BRITISH) - game.b_queue = 0; + if (game.active === BRITISH) + game.b_queue = 0 else - game.a_queue = 0; + game.a_queue = 0 } function gen_strategy_plays(hand) { for (let c of hand) { - let card = CARDS[c]; + let card = CARDS[c] switch (card.type) { - case 'mandatory-event': - gen_action('card_play_event', c); - break; - case 'campaign': - gen_action('card_campaign', c); - break; - case 'ops': - if (can_exchange_for_discard(c)) - gen_action('exchange_for_discard', c); - if (can_activate_general(c)) - gen_action('card_ops_general', c); - gen_action('card_ops_pc', c); - if (can_play_reinforcements()) - gen_action('card_ops_reinforcements', c); - if (card.count < 3) - gen_action('card_ops_queue', c); - break; - case 'british-event': - case 'british-event-or-battle': - if (game.active == BRITISH) - if (can_play_event(c)) - gen_action('card_play_event', c); - gen_action('card_discard_event', c); - break; - case 'american-event': - if (game.active == AMERICAN) - if (can_play_event(c)) - gen_action('card_play_event', c); - gen_action('card_discard_event', c); - break; - case 'british-battle': - case 'american-battle': - gen_action('card_discard_event', c); - break; + case "mandatory-event": + gen_action("card_play_event", c) + break + case "campaign": + gen_action("card_campaign", c) + break + case "ops": + if (can_exchange_for_discard(c)) + gen_action("exchange_for_discard", c) + if (can_activate_general(c)) + gen_action("card_ops_general", c) + gen_action("card_ops_pc", c) + if (can_play_reinforcements()) + gen_action("card_ops_reinforcements", c) + if (card.count < 3) + gen_action("card_ops_queue", c) + break + case "british-event": + case "british-event-or-battle": + if (game.active === BRITISH) + if (can_play_event(c)) + gen_action("card_play_event", c) + gen_action("card_discard_event", c) + break + case "american-event": + if (game.active === AMERICAN) + if (can_play_event(c)) + gen_action("card_play_event", c) + gen_action("card_discard_event", c) + break + case "british-battle": + case "american-battle": + gen_action("card_discard_event", c) + break } } } @@ -1432,31 +1456,31 @@ function gen_strategy_plays(hand) { states.discard_event_pc_action = { prompt: function (current) { - view.prompt = "Place, flip, or remove PC marker."; - gen_pass(); - if (game.active == BRITISH) - gen_british_discard_event_pc_action(); + view.prompt = "Place, flip, or remove PC marker." + gen_pass() + if (game.active === BRITISH) + gen_british_discard_event_pc_action() else - gen_american_discard_event_pc_action(); + gen_american_discard_event_pc_action() }, place_british_pc: function (space) { - place_british_pc(space); - end_strategy_card(); + place_british_pc(space) + end_strategy_card() }, place_american_pc: function (space) { - place_american_pc(space); - end_strategy_card(); + place_american_pc(space) + end_strategy_card() }, remove_pc: function (space) { - remove_pc(space); - end_strategy_card(); + remove_pc(space) + end_strategy_card() }, flip_pc: function (space) { - flip_pc(space); - end_strategy_card(); + flip_pc(space) + end_strategy_card() }, pass: function () { - end_strategy_card(); + end_strategy_card() }, } @@ -1464,11 +1488,11 @@ function gen_british_discard_event_pc_action() { for (let space in SPACES) { if (is_adjacent_to_british_pc(space)) { if (has_no_pc(space) && has_no_american_unit(space)) - gen_action('place_british_pc', space); + gen_action("place_british_pc", space) else if (has_american_pc(space) && has_british_army(space)) - gen_action('flip_pc', space); + gen_action("flip_pc", space) else if (has_american_pc(space) && has_no_american_unit(space)) - gen_action('remove_pc', space); + gen_action("remove_pc", space) } } } @@ -1478,13 +1502,11 @@ function gen_american_discard_event_pc_action() { if (is_adjacent_to_american_pc(space)) { if (has_no_pc(space) && has_no_british_cu(space)) { if (allowed_to_place_american_pc()) - gen_action('place_american_pc', space); - } - else if (has_british_pc(space) && has_american_or_french_general(space)) { - gen_action('flip_pc', space); - } - else if (has_british_pc(space) && has_no_british_cu(space)) { - gen_action('remove_pc', space); + gen_action("place_american_pc", space) + } else if (has_british_pc(space) && has_american_or_french_general(space)) { + gen_action("flip_pc", space) + } else if (has_british_pc(space) && has_no_british_cu(space)) { + gen_action("remove_pc", space) } } } @@ -1493,80 +1515,79 @@ function gen_american_discard_event_pc_action() { /* PLAY OPS CARD FOR PC ACTIONS */ function goto_ops_pc(count) { - game.count = count; - game.state = 'ops_pc'; - if (game.active == BRITISH) - gen_british_pc_ops_start(); + game.count = count + game.state = "ops_pc" + if (game.active === BRITISH) + gen_british_pc_ops_start() } states.ops_pc = { prompt: function (current) { - view.prompt = "Place or flip PC markers. " + game.count + " left."; - gen_pass(); + view.prompt = "Place or flip PC markers. " + game.count + " left." + gen_pass() if (game.count > 0) { - if (game.active == BRITISH) - gen_british_pc_ops(); + if (game.active === BRITISH) + gen_british_pc_ops() else gen_american_pc_ops() } }, place_british_pc: function (space) { - push_undo(); - place_british_pc(space); - --game.count; + push_undo() + place_british_pc(space) + --game.count }, place_american_pc: function (space) { - push_undo(); - place_american_pc(space); - --game.count; + push_undo() + place_american_pc(space) + --game.count }, flip_pc: function (space) { - push_undo(); - flip_pc(space); - --game.count; + push_undo() + flip_pc(space) + --game.count }, pass: function () { - if (game.active == BRITISH) - gen_british_pc_ops_end(); - end_strategy_card(); + if (game.active === BRITISH) + gen_british_pc_ops_end() + end_strategy_card() }, } function gen_british_pc_ops_start() { - game.british_pc_space_list = []; + game.british_pc_space_list = [] for (let space in SPACES) { if (has_no_pc(space) && has_no_american_unit(space)) { if (is_adjacent_to_british_pc(space)) - game.british_pc_space_list.push(space); + game.british_pc_space_list.push(space) } } } function gen_british_pc_ops() { for (let space of game.british_pc_space_list) - gen_action('place_british_pc', space); + gen_action("place_british_pc", space) for (let space in SPACES) { if (has_british_army(space)) { if (has_no_pc(space)) - gen_action('place_british_pc', space); + gen_action("place_british_pc", space) else if (has_american_pc(space)) - gen_action('flip_pc', space); + gen_action("flip_pc", space) } } } function gen_british_pc_ops_end(space) { - delete game.british_pc_space_list; + delete game.british_pc_space_list } function gen_american_pc_ops() { for (let space in SPACES) { if (has_no_pc(space) && has_no_british_cu(space)) { if (allowed_to_place_american_pc()) - gen_action('place_american_pc', space); - } - else if (has_british_pc(space) && has_american_or_french_general(space)) { - gen_action('flip_pc', space); + gen_action("place_american_pc", space) + } else if (has_british_pc(space) && has_american_or_french_general(space)) { + gen_action("flip_pc", space) } } } @@ -1574,126 +1595,126 @@ function gen_american_pc_ops() { /* PLAY OPS CARD FOR REINFORCEMENTS */ function goto_ops_reinforcements(c) { - let count = CARDS[c].count; - play_card(c, "for reinforcements"); - if (game.active == BRITISH) { - game.played_british_reinforcements = count; - game.count = count_british_cu(BRITISH_REINFORCEMENTS); - game.state = 'ops_british_reinforcements_who'; + let count = CARDS[c].count + play_card(c, "for reinforcements") + if (game.active === BRITISH) { + game.played_british_reinforcements = count + game.count = count_british_cu(BRITISH_REINFORCEMENTS) + game.state = "ops_british_reinforcements_who" } else { - game.played_american_reinforcements.push(count); - game.count = count; - game.state = 'ops_american_reinforcements_who'; + game.played_american_reinforcements.push(count) + game.count = count + game.state = "ops_american_reinforcements_who" } } states.ops_british_reinforcements_who = { prompt: function (current) { view.prompt = "Reinforcements: choose an available general or pass to bring only CU." - view.prompt += " Carrying " + game.count + " British CU."; - gen_pass(); - gen_british_reinforcements_who(); + view.prompt += " Carrying " + game.count + " British CU." + gen_pass() + gen_british_reinforcements_who() }, drop_british_cu: function () { - --game.count; + --game.count }, pickup_british_cu: function () { - ++game.count; + ++game.count }, select_general: function (g) { - push_undo(); - game.state = 'ops_british_reinforcements_where'; - game.who = g; + push_undo() + game.state = "ops_british_reinforcements_where" + game.who = g }, pass: function () { - push_undo(); - game.state = 'ops_british_reinforcements_where'; - game.who = null; + push_undo() + game.state = "ops_british_reinforcements_where" + game.who = null }, } states.ops_british_reinforcements_where = { prompt: function (current) { - view.prompt = "Reinforcements: choose a port space."; - view.prompt += " Carrying " + game.count + " British CU."; - gen_british_reinforcements_where(); + view.prompt = "Reinforcements: choose a port space." + view.prompt += " Carrying " + game.count + " British CU." + gen_british_reinforcements_where() }, drop_british_cu: function () { - --game.count; + --game.count }, pickup_british_cu: function () { - ++game.count; + ++game.count }, place_reinforcements: function (space) { - place_british_reinforcements(game.who, game.count, space); - end_strategy_card(); - game.who = null; + place_british_reinforcements(game.who, game.count, space) + end_strategy_card() + game.who = null }, } states.ops_american_reinforcements_who = { prompt: function (current) { - view.prompt = "Reinforcements: choose an available general or pass to bring only CU."; - gen_pass(); - gen_american_reinforcements_who(); + view.prompt = "Reinforcements: choose an available general or pass to bring only CU." + gen_pass() + gen_american_reinforcements_who() }, select_general: function (g) { - push_undo(); - game.state = 'ops_american_reinforcements_where'; - game.who = g; + push_undo() + game.state = "ops_american_reinforcements_where" + game.who = g }, pass: function () { - push_undo(); - game.state = 'ops_american_reinforcements_where'; - game.who = null; + push_undo() + game.state = "ops_american_reinforcements_where" + game.who = null }, } states.ops_american_reinforcements_where = { prompt: function (current) { - view.prompt = "Reinforcements: choose a space."; - gen_american_reinforcements_where(game.who); + view.prompt = "Reinforcements: choose a space." + gen_american_reinforcements_where(game.who) }, place_reinforcements: function (space) { - if (game.who == ROCHAMBEAU) - place_french_reinforcements(game.who, space); + if (game.who === ROCHAMBEAU) + place_french_reinforcements(game.who, space) else - place_american_reinforcements(game.who, game.count, space); - end_strategy_card(); - game.who = null; + place_american_reinforcements(game.who, game.count, space) + end_strategy_card() + game.who = null }, } function gen_british_reinforcements_who() { for (let g of BRITISH_GENERALS) { - let general = game.generals[g]; - if (general.location == BRITISH_REINFORCEMENTS) { - gen_action('select_general', g); + let general = game.generals[g] + if (general.location === BRITISH_REINFORCEMENTS) { + gen_action("select_general", g) } } if (game.count > 0) - gen_action('drop_british_cu'); + gen_action("drop_british_cu") if (game.count < count_british_cu(BRITISH_REINFORCEMENTS)) - gen_action('pickup_british_cu'); + gen_action("pickup_british_cu") } function gen_british_reinforcements_where() { for (let space in SPACES) { if (is_non_blockaded_port(space)) if (!has_american_or_french_cu(space) && !has_american_pc(space)) - gen_action('place_reinforcements', space); + gen_action("place_reinforcements", space) } if (game.count > 0) - gen_action('drop_british_cu'); + gen_action("drop_british_cu") if (game.count < count_british_cu(BRITISH_REINFORCEMENTS)) - gen_action('pickup_british_cu'); + gen_action("pickup_british_cu") } function gen_american_reinforcements_who() { for (let g of AMERICAN_GENERALS) { - let general = game.generals[g]; - if (general.location == AMERICAN_REINFORCEMENTS) { - gen_action('select_general', g); + let general = game.generals[g] + if (general.location === AMERICAN_REINFORCEMENTS) { + gen_action("select_general", g) } } } @@ -1701,11 +1722,11 @@ function gen_american_reinforcements_who() { function gen_american_reinforcements_where(general) { for (let space in SPACES) { if (!has_british_cu(space) && !has_british_pc(space)) { - if (general == ROCHAMBEAU) { + if (general === ROCHAMBEAU) { if (SPACES[space].port) - gen_action('place_reinforcements', space); + gen_action("place_reinforcements", space) } else { - gen_action('place_reinforcements', space); + gen_action("place_reinforcements", space) } } } @@ -1714,455 +1735,464 @@ function gen_american_reinforcements_where(general) { /* PLAY OPS CARD TO MOVE A GENERAL */ function goto_ops_general(c) { - play_card(c, " to activate a general"); - if (game.active == BRITISH) { - game.count = CARDS[c].count + game.b_queue; - game.b_queue = 0; + play_card(c, " to activate a general") + if (game.active === BRITISH) { + game.count = CARDS[c].count + game.b_queue + game.b_queue = 0 } else { - game.count = CARDS[c].count + game.a_queue; - game.a_queue = 0; + game.count = CARDS[c].count + game.a_queue + game.a_queue = 0 } - game.state = 'ops_general_who'; + game.state = "ops_general_who" } states.ops_general_who = { prompt: function (current) { if (game.campaign && game.landing_party) - view.prompt = "Campaign: Activate a general or use a landing party. " + game.campaign + " left."; + view.prompt = "Campaign: Activate a general or use a landing party. " + game.campaign + " left." else if (game.campaign) - view.prompt = "Campaign: Activate a general. " + game.campaign + " left."; + view.prompt = "Campaign: Activate a general. " + game.campaign + " left." else - view.prompt = "Activate a general with strategy rating " + game.count + " or lower."; + view.prompt = "Activate a general with strategy rating " + game.count + " or lower." if (game.landing_party) - gen_landing_party(); - gen_activate_general(); - gen_pass(); + gen_landing_party() + gen_activate_general() + gen_pass() }, place_british_pc: function (where) { - game.landing_party = 0; - place_british_pc(where); - end_strategy_card(); + game.landing_party = 0 + place_british_pc(where) + end_strategy_card() }, flip_pc: function (where) { - game.landing_party = 0; - flip_pc(where); - end_strategy_card(); + game.landing_party = 0 + flip_pc(where) + end_strategy_card() }, select_general: function (g) { - push_undo(); - goto_ops_general_move(g, false); + push_undo() + goto_ops_general_move(g, false) }, pass: function () { if (game.campaign > 0) - game.campaign = 0; - end_strategy_card(); - } + game.campaign = 0 + end_strategy_card() + }, } function gen_landing_party() { for (let space in SPACES) { if (!is_fortified_port(space) && is_non_blockaded_port(space)) { if (has_american_pc(space) && has_no_american_unit(space)) - gen_action('flip_pc', space); + gen_action("flip_pc", space) if (has_no_pc(space) && has_no_american_unit(space) && has_no_british_playing_piece(space)) - gen_action('place_british_pc', space); + gen_action("place_british_pc", space) } } } function gen_activate_general() { - if (game.active == BRITISH) - return gen_activate_british_general(); + if (game.active === BRITISH) + return gen_activate_british_general() else - return gen_activate_american_general(); + return gen_activate_american_general() } function gen_activate_british_general() { for (let g of BRITISH_GENERALS) if (is_general_on_map(g) && GENERALS[g].strategy <= game.count && !game.moved[g]) - gen_action('select_general', g); + gen_action("select_general", g) } function gen_activate_american_general() { for (let g of AMERICAN_GENERALS) if (is_general_on_map(g) && GENERALS[g].strategy <= game.count && !game.moved[g]) - gen_action('select_general', g); + gen_action("select_general", g) } function goto_remove_general(where) { - game.state = 'remove_general'; - game.where = where; + game.state = "remove_general" + game.where = where } states.remove_general = { prompt: function (current) { - view.prompt = "Remove a general to the reinforcements box."; - gen_remove_general(); + view.prompt = "Remove a general to the reinforcements box." + gen_remove_general() }, select_general: function (g) { - if (game.active == BRITISH) - move_general(g, BRITISH_REINFORCEMENTS); + if (game.active === BRITISH) + move_general(g, BRITISH_REINFORCEMENTS) else - move_general(g, AMERICAN_REINFORCEMENTS); - end_strategy_card(); + move_general(g, AMERICAN_REINFORCEMENTS) + end_strategy_card() }, } function goto_remove_general_after_intercept() { - game.state = 'remove_general_after_intercept'; + game.state = "remove_general_after_intercept" } states.remove_general_after_intercept = { prompt: function (current) { - view.prompt = "Remove a general to the reinforcements box."; - gen_remove_general(); + view.prompt = "Remove a general to the reinforcements box." + gen_remove_general() }, select_general: function (g) { - if (game.active == BRITISH) - move_general(g, BRITISH_REINFORCEMENTS); + if (game.active === BRITISH) + move_general(g, BRITISH_REINFORCEMENTS) else - move_general(g, AMERICAN_REINFORCEMENTS); - end_intercept(); + move_general(g, AMERICAN_REINFORCEMENTS) + end_intercept() }, } function goto_remove_general_after_retreat(where) { - game.state = 'remove_general_after_retreat'; - game.where = where; + game.state = "remove_general_after_retreat" + game.where = where } states.remove_general_after_retreat = { prompt: function (current) { - view.prompt = "Remove a general to the reinforcements box."; - gen_remove_general(); + view.prompt = "Remove a general to the reinforcements box." + gen_remove_general() }, select_general: function (g) { - if (game.active == BRITISH) - move_general(g, BRITISH_REINFORCEMENTS); + if (game.active === BRITISH) + move_general(g, BRITISH_REINFORCEMENTS) else - move_general(g, AMERICAN_REINFORCEMENTS); - end_battle(); + move_general(g, AMERICAN_REINFORCEMENTS) + end_battle() }, } function gen_remove_general() { - if (game.active == BRITISH) - return gen_remove_british_general(); + if (game.active === BRITISH) + return gen_remove_british_general() else - return gen_remove_american_general(); + return gen_remove_american_general() } function gen_remove_british_general() { for (let g of BRITISH_GENERALS) - if (location_of_general(g) == game.where) - gen_action('select_general', g); + if (location_of_general(g) === game.where) + gen_action("select_general", g) } function gen_remove_american_general() { for (let g of AMERICAN_GENERALS) - if (g != WASHINGTON) - if (location_of_general(g) == game.where) - gen_action('select_general', g); + if (g !== WASHINGTON) + if (location_of_general(g) === game.where) + gen_action("select_general", g) } function goto_ops_general_move(g, marblehead) { - game.state = 'ops_general_move'; - game.who = g; + game.state = "ops_general_move" + game.who = g if (marblehead) { - game.mobility = false; - game.count = 6; + game.mobility = false + game.count = 6 } else { - if (game.active == BRITISH) { - game.mobility = false; - game.count = 4; + if (game.active === BRITISH) { + game.mobility = false + game.count = 4 } else { - game.mobility = true; - game.count = 5; + game.mobility = true + game.count = 5 } } - let where = location_of_general(g); - if (game.active == BRITISH) - pickup_max_british_cu(where); + let where = location_of_general(g) + if (game.active === BRITISH) + pickup_max_british_cu(where) else - pickup_max_american_cu(where); + pickup_max_american_cu(where) } states.ops_general_move = { prompt: function (current) { - view.prompt = "Move " + game.who + " with "; + view.prompt = "Move " + game.who + " with " if (game.carry_british > 0) { - view.prompt += game.carry_british + " British CU."; + view.prompt += game.carry_british + " British CU." } else if (game.carry_french + game.carry_american > 0) { if (game.carry_french > 0) { if (game.carry_american > 0) { - view.prompt += game.carry_french + " French CU and "; - view.prompt += game.carry_american + " American CU."; + view.prompt += game.carry_french + " French CU and " + view.prompt += game.carry_american + " American CU." } else { - view.prompt += game.carry_french + " French CU."; + view.prompt += game.carry_french + " French CU." } } else { - view.prompt += game.carry_american + " American CU."; + view.prompt += game.carry_american + " American CU." } } else { - view.prompt += game.carry_american + " no CU."; + view.prompt += game.carry_american + " no CU." } - if (game.count == 1) - view.prompt += " " + game.count + " move left."; + if (game.count === 1) + view.prompt += " " + game.count + " move left." else if (game.count > 1) - view.prompt += " " + game.count + " moves left."; + view.prompt += " " + game.count + " moves left." // Cannot stop on enemy general if (!has_enemy_general(location_of_general(game.who))) - gen_pass(); + gen_pass() - gen_carry_cu(); - gen_move_general(); + gen_carry_cu() + gen_move_general() }, - pickup_british_cu: function () { ++game.carry_british; }, - pickup_american_cu: function () { ++game.carry_american; }, - pickup_french_cu: function () { ++game.carry_french; }, + pickup_british_cu: function () { + ++game.carry_british + }, + pickup_american_cu: function () { + ++game.carry_american + }, + pickup_french_cu: function () { + ++game.carry_french + }, drop_british_cu: function () { - push_undo(); - --game.carry_british; + push_undo() + --game.carry_british if (game.moved[game.who]) - mark_moved_cu(BRITISH, location_of_general(game.who), 1); + mark_moved_cu(BRITISH, location_of_general(game.who), 1) }, drop_american_cu: function () { - push_undo(); - --game.carry_american; + push_undo() + --game.carry_american if (game.moved[game.who]) - mark_moved_cu(AMERICAN, location_of_general(game.who), 1); + mark_moved_cu(AMERICAN, location_of_general(game.who), 1) }, drop_french_cu: function () { - push_undo(); - --game.carry_french; + push_undo() + --game.carry_french if (game.moved[game.who]) - mark_moved_cu(FRENCH, location_of_general(game.who), 1); + mark_moved_cu(FRENCH, location_of_general(game.who), 1) }, move: function (to) { - push_undo(); + push_undo() - game.moved[game.who] = 1; - let from = location_of_general(game.who); - let cu = game.carry_british + game.carry_american + game.carry_french; + game.moved[game.who] = 1 + let from = location_of_general(game.who) + let cu = game.carry_british + game.carry_american + game.carry_french - let intercept = false; - if (game.active == BRITISH) { - let is_sea_move = (path_type(from, to) == undefined); + let intercept = false + if (game.active === BRITISH) { + let is_sea_move = path_type(from, to) === undefined if (has_american_pc(to) && cu > 0 && !is_sea_move && !has_british_cu(to)) - intercept = can_intercept_to(to); + intercept = can_intercept_to(to) } - move_army(game.who, from, to); + move_army(game.who, from, to) if (cu > 0) { if (has_enemy_general(to) && !has_enemy_cu(to)) { - capture_enemy_general(to); + capture_enemy_general(to) } - if (game.active == BRITISH && game.congress == to && !has_enemy_cu(to)) { - disperse_continental_congress(to); + if (game.active === BRITISH && game.congress === to && !has_enemy_cu(to)) { + disperse_continental_congress(to) } - if (cu >= 4 && count_enemy_cu(to) == 1 && !has_enemy_general(to)) { - overrun(to); + if (cu >= 4 && count_enemy_cu(to) === 1 && !has_enemy_general(to)) { + overrun(to) } } if (intercept) - goto_intercept(from, to); + goto_intercept(from, to) else - resume_moving(from, to); + resume_moving(from, to) }, pass: function () { - clear_undo(); - let where = location_of_general(game.who); - end_move(); + clear_undo() + let where = location_of_general(game.who) + end_move() if (count_friendly_generals(where) > 1) - goto_remove_general(where); + goto_remove_general(where) else - end_strategy_card(); + end_strategy_card() }, } function resume_moving(from, to) { if (has_enemy_cu(to)) { - end_move(); - goto_start_battle(from, to); + end_move() + goto_start_battle(from, to) } } function can_intercept_to(to) { for (let space of SPACES[to].exits) { if (has_american_army(space)) { - let g = find_american_or_french_general(space); + let g = find_american_or_french_general(space) if (g && !game.moved[g]) - return true; + return true } } - return false; + return false } function gen_intercept() { for (let space of SPACES[game.where].exits) { if (has_american_army(space)) { - let g = find_american_or_french_general(space); + let g = find_american_or_french_general(space) if (g && !game.moved[g]) - gen_action('select_general', g); + gen_action("select_general", g) } } } function goto_intercept(from, where) { - clear_undo(); - game.save_who = game.who; - game.who = null; - game.from = from; - game.where = where; - game.active = AMERICAN; - game.state = 'intercept'; + clear_undo() + game.save_who = game.who + game.who = null + game.from = from + game.where = where + game.active = AMERICAN + game.state = "intercept" } states.intercept = { prompt: function (current) { - view.prompt = "Intercept " + game.save_who + " in " + game.where + "?"; - gen_pass(); - gen_intercept(); + view.prompt = "Intercept " + game.save_who + " in " + game.where + "?" + gen_pass() + gen_intercept() }, select_general: function (g) { - game.moved[g] = 1; - let die = roll_d6(); + game.moved[g] = 1 + let die = roll_d6() if (die <= GENERALS[g].agility) { - log(g + " intercepted (" + die + " <= " + GENERALS[g].agility + ")"); - game.did_intercept = 1; + log(g + " intercepted (" + die + " <= " + GENERALS[g].agility + ")") + game.did_intercept = 1 - let save_carry_british = game.carry_british; - let save_carry_american = game.carry_american; - let save_carry_french = game.carry_french; + let save_carry_british = game.carry_british + let save_carry_american = game.carry_american + let save_carry_french = game.carry_french - pickup_max_american_cu(location_of_general(g)); - intercept_army(g, location_of_general(g), game.where); + pickup_max_american_cu(location_of_general(g)) + intercept_army(g, location_of_general(g), game.where) - game.carry_british = save_carry_british; - game.carry_american = save_carry_american; - game.carry_french = save_carry_french; + game.carry_british = save_carry_british + game.carry_american = save_carry_american + game.carry_french = save_carry_french if (count_friendly_generals(game.where) > 1) - goto_remove_general_after_intercept(); + goto_remove_general_after_intercept() else - end_intercept(); + end_intercept() } else { - log(g + " failed to intercept (" + die + " > " + GENERALS[g].agility + ")"); + log(g + " failed to intercept (" + die + " > " + GENERALS[g].agility + ")") if (!can_intercept_to(game.where)) - end_intercept(); + end_intercept() } }, pass: function () { - end_intercept(); + end_intercept() }, } function end_intercept() { - game.active = BRITISH; - game.state = 'ops_general_move'; - game.who = game.save_who; - delete game.save_who; - resume_moving(game.from, game.where); - delete game.from; + game.active = BRITISH + game.state = "ops_general_move" + game.who = game.save_who + delete game.save_who + resume_moving(game.from, game.where) + delete game.from } function end_move() { - let where = location_of_general(game.who); + let where = location_of_general(game.who) if (game.moved[game.who]) { - mark_moved_cu(BRITISH, where, game.carry_british); - mark_moved_cu(AMERICAN, where, game.carry_american); - mark_moved_cu(FRENCH, where, game.carry_french); + mark_moved_cu(BRITISH, where, game.carry_british) + mark_moved_cu(AMERICAN, where, game.carry_american) + mark_moved_cu(FRENCH, where, game.carry_french) } - game.who = null; - delete game.mobility; - delete game.carry_british; - delete game.carry_american; - delete game.carry_french; + game.who = null + delete game.mobility + delete game.carry_british + delete game.carry_american + delete game.carry_french } function path_type(from, to) { - return PATH_TYPE[PATH_INDEX[from][to]]; + return PATH_TYPE[PATH_INDEX[from][to]] } function path_name(from, to) { - return PATH_NAME[PATH_INDEX[from][to]]; + return PATH_NAME[PATH_INDEX[from][to]] } function gen_carry_cu() { - let where = location_of_general(game.who); - if (game.active == BRITISH) { + let where = location_of_general(game.who) + if (game.active === BRITISH) { if (game.carry_british > 0) - gen_action('drop_british_cu'); + gen_action("drop_british_cu") if (game.carry_british < 5 && game.carry_british < count_unmoved_british_cu(where)) - gen_action('pickup_british_cu'); + gen_action("pickup_british_cu") } else { - let carry_total = game.carry_french + game.carry_american; + let carry_total = game.carry_french + game.carry_american if (game.carry_french > 0) - gen_action('drop_french_cu'); + gen_action("drop_french_cu") if (game.carry_american > 0) - gen_action('drop_american_cu'); + gen_action("drop_american_cu") if (carry_total < 5 && game.carry_french < count_unmoved_french_cu(where)) - gen_action('pickup_french_cu'); + gen_action("pickup_french_cu") if (carry_total < 5 && game.carry_american < count_unmoved_american_cu(where)) - gen_action('pickup_american_cu'); + gen_action("pickup_american_cu") } } function movement_cost(from, to) { switch (path_type(from, to)) { - case undefined: return 4; /* must be a sea connection if no direct path */ - case 'wilderness': return 3; - default: return 1; + case undefined: + return 4 /* must be a sea connection if no direct path */ + case "wilderness": + return 3 + default: + return 1 } } function gen_move_general() { - let from = location_of_general(game.who); - let alone = (game.carry_british + game.carry_american + game.carry_french) == 0; + let from = location_of_general(game.who) + let alone = game.carry_british + game.carry_american + game.carry_french === 0 for (let to of SPACES[from].exits) { - let mp = 1; - if (path_type(from, to) == 'wilderness') { - if (path_name(from, to) == FALMOUTH_QUEBEC) - if (game.who != ARNOLD) - continue; - mp = 3; + let mp = 1 + if (path_type(from, to) === "wilderness") { + if (path_name(from, to) === FALMOUTH_QUEBEC) + if (game.who !== ARNOLD) + continue + mp = 3 } if (alone) { if (has_enemy_cu(to)) - continue; + continue if (has_enemy_pc(to)) - continue; + continue // TODO: more robust check for not stopping (or allow undo in case he gets stuck) - if (has_enemy_general(to) && game.count - mp == 0) - continue; + if (has_enemy_general(to) && game.count - mp === 0) + continue } if (game.mobility && has_enemy_cu(to)) { if (game.count - mp >= 1) - gen_action('move', to); + gen_action("move", to) } else { if (game.count - mp >= 0) - gen_action('move', to); + gen_action("move", to) } } - if (game.active == BRITISH && game.count == 4) { + if (game.active === BRITISH && game.count === 4) { if (is_non_blockaded_port(from)) { for (let to in SPACES) { - if (to != from) { + if (to !== from) { if (is_non_blockaded_port(to)) { if (!has_american_pc(to) && !has_american_or_french_cu(to)) { // don't leave alone if (alone && has_enemy_general(to)) continue // TODO: duplicate action if can move by normal road - gen_action('move', to); + gen_action("move", to) } } } @@ -2174,291 +2204,292 @@ function gen_move_general() { /* CAMPAIGN */ function goto_campaign(c) { - play_card(c); - game.state = 'campaign'; - game.campaign = CARDS[c].count; - game.landing_party = game.active == BRITISH ? 1 : 0; - game.count = 3; // can activate any general! - game.state = 'ops_general_who'; + play_card(c) + game.state = "campaign" + game.campaign = CARDS[c].count + game.landing_party = game.active === BRITISH ? 1 : 0 + game.count = 3 // can activate any general! + game.state = "ops_general_who" } /* EVENTS */ events.the_war_ends = function (c, card) { - logp("played #" + c); - log("The war will end in " + card.year); - game.last_played = c; - remove_from_array(active_hand(), c); + logp("played #" + c) + log("The war will end in " + card.year) + game.last_played = c + remove_from_array(active_hand(), c) if (game.war_ends) - game.discard.push(WAR_ENDS_1779 + game.war_ends - 1779); - game.war_ends = card.year; - end_strategy_card(); + game.discard.push(WAR_ENDS_1779 + game.war_ends - 1779) + game.war_ends = card.year + end_strategy_card() } events.remove_random_british_card = function (c, card) { - play_card(c); - remove_random_card(game.b_hand); - end_strategy_card(); + play_card(c) + remove_random_card(game.b_hand) + end_strategy_card() } events.remove_random_american_card = function (c, card) { - play_card(c); - remove_random_card(game.a_hand); - end_strategy_card(); + play_card(c) + remove_random_card(game.a_hand) + end_strategy_card() } function remove_random_card(hand) { if (hand.length > 0) { - let i = random(hand.length); - let c = hand[i]; - discard_card_from_hand(hand, c); - if (CARDS[c].type == 'mandatory-event') - do_event(c); + let i = random(hand.length) + let c = hand[i] + discard_card_from_hand(hand, c) + if (CARDS[c].type === "mandatory-event") + do_event(c) else - end_strategy_card(); + end_strategy_card() } } function advance_french_alliance(count) { if (game.french_alliance < 9) { - game.french_alliance += count; + game.french_alliance += count if (game.french_alliance > 9) - game.french_alliance = 9; - log("French alliance advanced to " + count); + game.french_alliance = 9 + log("French alliance advanced to " + count) } } function lose_regular_advantage() { if (game.regulars) { - log("British Regulars Advantage lost!"); - game.regulars = false; - advance_french_alliance(2); + log("British Regulars Advantage lost!") + game.regulars = false + advance_french_alliance(2) } } events.baron_von_steuben_trains_the_continental_army = function (c, card) { - play_card(c); + play_card(c) if (is_general_on_map(WASHINGTON)) { - let where = location_of_general(WASHINGTON); - logp("placed 2 CU with Washington in " + where); - place_american_cu(where, 2); - lose_regular_advantage(); + let where = location_of_general(WASHINGTON) + logp("placed 2 CU with Washington in " + where) + place_american_cu(where, 2) + lose_regular_advantage() } - end_strategy_card(); + end_strategy_card() } events.advance_french_alliance = function (c, card) { - play_card(c); - advance_french_alliance(card.count); - end_strategy_card(); + play_card(c) + advance_french_alliance(card.count) + end_strategy_card() } events.remove_french_navy = function (c, card) { - play_card(c); - game.french_navy = TURN_TRACK[game.year+1]; - end_strategy_card(); + play_card(c) + game.french_navy = TURN_TRACK[game.year + 1] + end_strategy_card() } events.remove_british_pc_from = function (c, card) { - play_card(c); - game.count = card.count; - game.where = card.where; - game.state = 'remove_british_pc_from'; + play_card(c) + game.count = card.count + game.where = card.where + game.state = "remove_british_pc_from" } states.remove_british_pc_from = { prompt: function (current) { - view.prompt = "Remove British PC markers from " + game.where.join(", ") + ". " + game.count + " left."; - gen_pass(); - gen_remove_british_pc_from(game.where); + view.prompt = "Remove British PC markers from " + game.where.join(", ") + ". " + game.count + " left." + gen_pass() + gen_remove_british_pc_from(game.where) }, remove_pc: function (where) { - remove_pc(where); - if (--game.count == 0) { - delete game.where; - end_strategy_card(); + remove_pc(where) + if (--game.count === 0) { + delete game.where + end_strategy_card() } }, pass: function () { - delete game.where; - end_strategy_card(); + delete game.where + end_strategy_card() }, } events.remove_american_pc = function (c, card) { - play_card(c); - game.count = card.count; - game.state = 'remove_american_pc'; + play_card(c) + game.count = card.count + game.state = "remove_american_pc" } states.remove_american_pc = { prompt: function (current) { - view.prompt = "Remove American PC markers. " + game.count + " left."; - gen_pass(); - gen_remove_american_pc(); + view.prompt = "Remove American PC markers. " + game.count + " left." + gen_pass() + gen_remove_american_pc() }, remove_pc: function (where) { - remove_pc(where); - if (--game.count == 0) { - end_strategy_card(); + remove_pc(where) + if (--game.count === 0) { + end_strategy_card() } }, pass: function () { - end_strategy_card(); + end_strategy_card() }, } events.remove_american_pc_from = function (c, card) { - play_card(c); - game.count = card.count; - game.where = card.where; - game.state = 'remove_american_pc_from'; + play_card(c) + game.count = card.count + game.where = card.where + game.state = "remove_american_pc_from" } states.remove_american_pc_from = { prompt: function (current) { - view.prompt = "Remove American PC markers from " + game.where.join(", ") + ". " + game.count + " left."; - gen_pass(); - gen_remove_american_pc_from(game.where); + view.prompt = "Remove American PC markers from " + game.where.join(", ") + ". " + game.count + " left." + gen_pass() + gen_remove_american_pc_from(game.where) }, remove_pc: function (where) { - remove_pc(where); - if (--game.count == 0) { - delete game.where; - end_strategy_card(); + remove_pc(where) + if (--game.count === 0) { + delete game.where + end_strategy_card() } }, pass: function () { - delete game.where; - end_strategy_card(); + delete game.where + end_strategy_card() }, } events.remove_american_pc_from_non_port = function (c, card) { - play_card(c); - game.count = card.count; - game.where = card.where; - game.state = 'remove_american_pc_from_non_port'; + play_card(c) + game.count = card.count + game.where = card.where + game.state = "remove_american_pc_from_non_port" } states.remove_american_pc_from_non_port = { prompt: function (current) { - view.prompt = "Remove American PC markers from non-Port space in " + game.where.join(", ") + ". " + game.count + " left."; - gen_pass(); - gen_remove_american_pc_from_non_port(game.where); + view.prompt = + "Remove American PC markers from non-Port space in " + game.where.join(", ") + ". " + game.count + " left." + gen_pass() + gen_remove_american_pc_from_non_port(game.where) }, remove_pc: function (where) { - remove_pc(where); - if (--game.count == 0) { - delete game.where; - end_strategy_card(); + remove_pc(where) + if (--game.count === 0) { + delete game.where + end_strategy_card() } }, pass: function () { - delete game.where; - end_strategy_card(); + delete game.where + end_strategy_card() }, } events.remove_american_pc_within_two_spaces_of_a_british_general = function (c, card) { - play_card(c); - game.count = card.count; - game.state = 'remove_american_pc_within_two_spaces_of_a_british_general'; + play_card(c) + game.count = card.count + game.state = "remove_american_pc_within_two_spaces_of_a_british_general" } states.remove_american_pc_within_two_spaces_of_a_british_general = { prompt: function (current) { - view.prompt = "Remove American PC markers within two spaces of a British general. " + game.count + " left."; - gen_pass(); - gen_remove_american_pc_within_two_spaces_of_a_british_general(); + view.prompt = "Remove American PC markers within two spaces of a British general. " + game.count + " left." + gen_pass() + gen_remove_american_pc_within_two_spaces_of_a_british_general() }, remove_pc: function (where) { - remove_pc(where); - if (--game.count == 0) { - delete game.where; - end_strategy_card(); + remove_pc(where) + if (--game.count === 0) { + delete game.where + end_strategy_card() } }, pass: function () { - delete game.where; - end_strategy_card(); + delete game.where + end_strategy_card() }, } events.place_american_pc = function (c, card) { - play_card(c); - game.count = card.count; - game.state = 'place_american_pc'; + play_card(c) + game.count = card.count + game.state = "place_american_pc" } states.place_american_pc = { prompt: function (current) { - view.prompt = "Place American PC markers. " + game.count + " left."; - gen_pass(); - gen_place_american_pc(); + view.prompt = "Place American PC markers. " + game.count + " left." + gen_pass() + gen_place_american_pc() }, place_american_pc: function (where) { - place_american_pc(where); - if (--game.count == 0) { - end_strategy_card(); + place_american_pc(where) + if (--game.count === 0) { + end_strategy_card() } }, pass: function () { - end_strategy_card(); + end_strategy_card() }, } events.place_american_pc_in = function (c, card) { - play_card(c); - game.count = card.count; - game.where = card.where; - game.state = 'place_american_pc_in'; + play_card(c) + game.count = card.count + game.where = card.where + game.state = "place_american_pc_in" } states.place_american_pc_in = { prompt: function (current) { - view.prompt = "Place American PC markers in " + game.where.join(", ") + ". " + game.count + " left."; - gen_pass(); - gen_place_american_pc_in(game.where); + view.prompt = "Place American PC markers in " + game.where.join(", ") + ". " + game.count + " left." + gen_pass() + gen_place_american_pc_in(game.where) }, place_american_pc: function (where) { - place_american_pc(where); - if (--game.count == 0) { - delete game.where; - end_strategy_card(); + place_american_pc(where) + if (--game.count === 0) { + delete game.where + end_strategy_card() } }, pass: function () { - delete game.where; - end_strategy_card(); + delete game.where + end_strategy_card() }, } events.lord_sandwich_coastal_raids = function (c, card) { - play_card(c); - game.state = 'lord_sandwich_coastal_raids'; - game.count = 2; - game.where = null; + play_card(c) + game.state = "lord_sandwich_coastal_raids" + game.count = 2 + game.where = null } states.lord_sandwich_coastal_raids = { prompt: function (current) { - view.prompt = "Remove two or flip one American PC in a port space."; - gen_pass(); - gen_lord_sandwich_coastal_raids(game.where); + view.prompt = "Remove two or flip one American PC in a port space." + gen_pass() + gen_lord_sandwich_coastal_raids(game.where) }, place_british_pc: function (where) { - place_british_pc(where); - end_strategy_card(); + place_british_pc(where) + end_strategy_card() }, remove_pc: function (where) { - game.where = where; - remove_pc(where); - if (--game.count == 0) - end_strategy_card(); + game.where = where + remove_pc(where) + if (--game.count === 0) + end_strategy_card() }, pass: function () { - end_strategy_card(); + end_strategy_card() }, } @@ -2466,196 +2497,196 @@ function gen_lord_sandwich_coastal_raids(first_removed) { for (let space in SPACES) { if (SPACES[space].port) if (has_american_pc(space) && has_no_american_unit(space)) - gen_action('remove_pc', space); - if (space == first_removed) - gen_action('place_british_pc', space); + gen_action("remove_pc", space) + if (space === first_removed) + gen_action("place_british_pc", space) } } events.remove_american_cu = function (c, card) { - play_card(c); - game.state = 'remove_american_cu'; + play_card(c) + game.state = "remove_american_cu" } states.remove_american_cu = { prompt: function (current) { - view.prompt = "Remove one American CU from any space."; - gen_pass(); - gen_remove_american_cu(); + view.prompt = "Remove one American CU from any space." + gen_pass() + gen_remove_american_cu() }, remove_cu: function (where) { - let cu = find_american_cu(where) || find_french_cu(where); - remove_cu(cu.owner, where, 1); - end_strategy_card(); + let cu = find_american_cu(where) || find_french_cu(where) + remove_cu(cu.owner, where, 1) + end_strategy_card() }, pass: function () { - end_strategy_card(); + end_strategy_card() }, } function gen_remove_american_cu() { for (let space in SPACES) { if (has_american_or_french_cu(space)) - gen_action('remove_cu', space); + gen_action("remove_cu", space) } } events.remove_british_cu = function (c, card) { - play_card(c); - game.state = 'remove_british_cu'; + play_card(c) + game.state = "remove_british_cu" game.count = card.count } states.remove_british_cu = { prompt: function (current) { - view.prompt = "Remove " + game.count + " British CU from any space."; - gen_pass(); - gen_remove_british_cu(); + view.prompt = "Remove " + game.count + " British CU from any space." + gen_pass() + gen_remove_british_cu() }, remove_cu: function (where) { let cu = find_british_cu(where) - remove_cu(cu.owner, where, 1); + remove_cu(cu.owner, where, 1) if (--game.count === 0) - end_strategy_card(); + end_strategy_card() }, pass: function () { - end_strategy_card(); + end_strategy_card() }, } function gen_remove_british_cu() { for (let space in SPACES) { if (has_british_cu(space)) - gen_action('remove_cu', space); + gen_action("remove_cu", space) } } events.pennsylvania_and_new_jersey_line_mutinies = function (c, card) { - play_card(c); - game.pennsylvania_and_new_jersey_line_mutinies = true; - game.state = 'pennsylvania_and_new_jersey_line_mutinies'; - game.count = 2; - game.where = null; + play_card(c) + game.pennsylvania_and_new_jersey_line_mutinies = true + game.state = "pennsylvania_and_new_jersey_line_mutinies" + game.count = 2 + game.where = null } states.pennsylvania_and_new_jersey_line_mutinies = { prompt: function (current) { - view.prompt = "Remove two American CUs from the map, one each from two different spaces."; - gen_pass(); - gen_pennsylvania_and_new_jersey_line_mutinies(game.where); + view.prompt = "Remove two American CUs from the map, one each from two different spaces." + gen_pass() + gen_pennsylvania_and_new_jersey_line_mutinies(game.where) }, remove_cu: function (where) { - let cu = find_american_cu(where) || find_french_cu(where); - remove_cu(cu.owner, where, 1); - game.where = where; - if (--game.count == 0) - end_strategy_card(); + let cu = find_american_cu(where) || find_french_cu(where) + remove_cu(cu.owner, where, 1) + game.where = where + if (--game.count === 0) + end_strategy_card() }, pass: function () { - end_strategy_card(); + end_strategy_card() }, } function gen_pennsylvania_and_new_jersey_line_mutinies(first_removed) { for (let space in SPACES) { if (has_american_or_french_cu(space)) - if (space != first_removed) - gen_action('remove_cu', space); + if (space !== first_removed) + gen_action("remove_cu", space) } } events.john_glovers_marblehead_regiment = function (c, card) { - play_card(c); - game.state = 'john_glovers_marblehead_regiment_who'; - game.count = 3; // strategy rating for gen_activate_general + play_card(c) + game.state = "john_glovers_marblehead_regiment_who" + game.count = 3 // strategy rating for gen_activate_general } states.john_glovers_marblehead_regiment_who = { prompt: function (current) { - view.prompt = "Activate an American general."; - gen_activate_general(); + view.prompt = "Activate an American general." + gen_activate_general() }, select_general: function (g) { - goto_ops_general_move(g, true); + goto_ops_general_move(g, true) }, } events.declaration_of_independence = function (c, card) { - play_card(c); - game.last_active = game.active; - game.active = AMERICAN; - game.doi = THE_13_COLONIES.slice(); - game.state = 'declaration_of_independence'; + play_card(c) + game.last_active = game.active + game.active = AMERICAN + game.doi = THE_13_COLONIES.slice() + game.state = "declaration_of_independence" } states.declaration_of_independence = { prompt: function (current) { - view.prompt = "Declaration of Independence: Place 1 PC marker in each of the 13 colonies. "; - view.prompt += game.doi.length + " left."; - gen_pass(); - gen_place_american_pc_in(game.doi); + view.prompt = "Declaration of Independence: Place 1 PC marker in each of the 13 colonies. " + view.prompt += game.doi.length + " left." + gen_pass() + gen_place_american_pc_in(game.doi) }, place_american_pc: function (space) { - let colony = SPACES[space].colony; - remove_from_array(game.doi, colony); - place_american_pc(space); - if (game.doi.length == 0) - end_declaration_of_independence(); + let colony = SPACES[space].colony + remove_from_array(game.doi, colony) + place_american_pc(space) + if (game.doi.length === 0) + end_declaration_of_independence() }, pass: function () { - end_declaration_of_independence(); - } + end_declaration_of_independence() + }, } function end_declaration_of_independence() { - game.active = game.last_active; - delete game.last_active; - delete game.doi; - end_strategy_card(); + game.active = game.last_active + delete game.last_active + delete game.doi + end_strategy_card() } function goto_george_washington_captured() { /* Save all the state we clobber during the interrupt. */ - game.last_state = game.state; - game.last_active = game.active; - game.last_count = game.count; + game.last_state = game.state + game.last_active = game.active + game.last_count = game.count - game.state = 'george_washington_captured'; - game.active = BRITISH; - game.count = 5; + game.state = "george_washington_captured" + game.active = BRITISH + game.count = 5 } states.george_washington_captured = { prompt: function (current) { - view.prompt = "George Washington is captured! Remove American PC markers. " + game.count + " left."; - gen_pass(); - gen_remove_american_pc(); + view.prompt = "George Washington is captured! Remove American PC markers. " + game.count + " left." + gen_pass() + gen_remove_american_pc() }, remove_pc: function (where) { - remove_pc(where); - if (--game.count == 0) { - end_george_washington_captured(); + remove_pc(where) + if (--game.count === 0) { + end_george_washington_captured() } }, pass: function () { - end_george_washington_captured(); + end_george_washington_captured() }, } function end_george_washington_captured() { /* Restore previous state. */ - game.state = game.last_state; - game.count = game.last_count; - game.active = game.last_active; - delete game.last_state; - delete game.last_active; - delete game.last_count; + game.state = game.last_state + game.count = game.last_count + game.active = game.last_active + delete game.last_state + delete game.last_active + delete game.last_count } function do_event(c) { - let card = CARDS[c]; + let card = CARDS[c] if (card.event in events) - events[card.event](c, card); + events[card.event](c, card) else throw new Error("Event not implemented yet: " + card.event) } @@ -2664,140 +2695,139 @@ function do_event(c) { function can_retreat_before_battle(where) { if (game.did_intercept) - return false; + return false // can't retreat if attempted (successful or not) interception! - let g = find_american_or_french_general(where); + let g = find_american_or_french_general(where) if (g && !game.moved[g]) - return true; - return false; + return true + return false } function goto_start_battle(from, where) { - clear_undo(); - game.attacker = game.active; - game.attack_from = from; - game.british_losses = 0; - game.where = where; - game.a_bonus = 0; - game.b_bonus = 0; - if (game.active == BRITISH && can_retreat_before_battle(where)) - goto_retreat_before_battle(); + clear_undo() + game.attacker = game.active + game.attack_from = from + game.british_losses = 0 + game.where = where + game.a_bonus = 0 + game.b_bonus = 0 + if (game.active === BRITISH && can_retreat_before_battle(where)) + goto_retreat_before_battle() else - goto_play_attacker_battle_card(); + goto_play_attacker_battle_card() } function goto_retreat_before_battle() { - game.active = AMERICAN; - game.who = find_american_or_french_general(game.where); - game.state = 'retreat_before_battle'; + game.active = AMERICAN + game.who = find_american_or_french_general(game.where) + game.state = "retreat_before_battle" } states.retreat_before_battle = { prompt: function (current) { - view.prompt = "Attempt retreat before battle?"; - gen_pass(); - gen_defender_retreat(); + view.prompt = "Attempt retreat before battle?" + gen_pass() + gen_defender_retreat() }, move: function (to) { - let agility = GENERALS[game.who].agility; + let agility = GENERALS[game.who].agility if (GENERALS[game.who].bonus) - agility += 2; - let roll = roll_d6(); + agility += 2 + let roll = roll_d6() if (roll <= agility) { - logp("successfully retreated before battle: " + roll + " <= " + agility); - pickup_max_american_cu(game.where); - move_army(game.who, game.where, to); - goto_remove_general_after_retreat_before_battle(to); + logp("successfully retreated before battle: " + roll + " <= " + agility) + pickup_max_american_cu(game.where) + move_army(game.who, game.where, to) + goto_remove_general_after_retreat_before_battle(to) } else { - logp("failed to retreat before battle: " + roll + " > " + agility); - end_retreat_before_battle(); + logp("failed to retreat before battle: " + roll + " > " + agility) + end_retreat_before_battle() } }, pass: function () { - end_retreat_before_battle(); + end_retreat_before_battle() }, } function goto_remove_general_after_retreat_before_battle(to) { if (count_friendly_generals(to) > 1) { - game.state = 'remove_general_after_retreat_before_battle'; - game.save_where = game.where; - game.where = to; + game.state = "remove_general_after_retreat_before_battle" + game.save_where = game.where + game.where = to } else { - end_remove_general_after_retreat_before_battle(); + end_remove_general_after_retreat_before_battle() } } states.remove_general_after_retreat_before_battle = { prompt: function (current) { - view.prompt = "Remove a general to the reinforcements box."; - gen_remove_general(); + view.prompt = "Remove a general to the reinforcements box." + gen_remove_general() }, select_general: function (g) { - if (game.active == BRITISH) - move_general(g, BRITISH_REINFORCEMENTS); + if (game.active === BRITISH) + move_general(g, BRITISH_REINFORCEMENTS) else - move_general(g, AMERICAN_REINFORCEMENTS); - game.where = game.save_where; - delete game.save_where; - end_remove_general_after_retreat_before_battle(); + move_general(g, AMERICAN_REINFORCEMENTS) + game.where = game.save_where + delete game.save_where + end_remove_general_after_retreat_before_battle() }, } - function end_remove_general_after_retreat_before_battle() { - let b_cu = count_british_cu(game.where); - let a_cu = count_american_and_french_cu(game.where); - if (a_cu == 0) { - end_battle(); - } else if (b_cu >= 4 && a_cu == 1) { - overrun(game.where); - end_battle(); + let b_cu = count_british_cu(game.where) + let a_cu = count_american_and_french_cu(game.where) + if (a_cu === 0) { + end_battle() + } else if (b_cu >= 4 && a_cu === 1) { + overrun(game.where) + end_battle() } else { - end_retreat_before_battle(); + end_retreat_before_battle() } } function can_defender_retreat(to) { - if (to == game.attack_from) - return false; + if (to === game.attack_from) + return false if (has_enemy_pc(to)) - return false; + return false if (has_enemy_cu(to)) - return false; - return true; + return false + return true } function can_attacker_retreat() { - let to = game.attack_from; + let to = game.attack_from if (has_enemy_pc(to)) - return false; + return false if (has_enemy_cu(to)) - return false; - return true; + return false + return true } function gen_defender_retreat() { - let from = game.where; + let from = game.where for (let to of SPACES[from].exits) { if (can_defender_retreat(to)) - gen_action('move', to); + gen_action("move", to) } - if (game.active == BRITISH) { - let can_sea_retreat = false; + if (game.active === BRITISH) { + let can_sea_retreat = false if (is_non_blockaded_port(from)) { if (is_fortified_port(from)) { if (has_british_pc(from) && is_non_blockaded_port(from)) - can_sea_retreat = true; + can_sea_retreat = true } else { - can_sea_retreat = true; + can_sea_retreat = true } } if (can_sea_retreat) { for (let to in SPACES) { - if (to != from && is_non_blockaded_port(to)) { + if (to !== from && is_non_blockaded_port(to)) { if (!has_american_pc(to) && !has_american_or_french_cu(to)) { - gen_action('move', to); + gen_action("move", to) } } } @@ -2807,517 +2837,534 @@ function gen_defender_retreat() { function gen_attacker_retreat() { if (can_attacker_retreat()) - gen_action('move', game.attack_from); + gen_action("move", game.attack_from) } function end_retreat_before_battle() { - game.who = null; - goto_play_attacker_battle_card(); + game.who = null + goto_play_attacker_battle_card() } function goto_play_attacker_battle_card() { - game.active = game.attacker; - game.state = 'play_attacker_battle_card'; + game.active = game.attacker + game.state = "play_attacker_battle_card" } states.play_attacker_battle_card = { prompt: function (current) { - view.prompt = "Attack: Play or discard event for DRM."; - gen_pass(); - gen_battle_card(); + view.prompt = "Attack: Play or discard event for DRM." + gen_pass() + gen_battle_card() }, card_battle_play: function (c) { - play_card(c, "for +2 DRM"); - if (game.active == BRITISH) { - if (CARDS[c].event == 'remove_benedict_arnold') - remove_benedict_arnold(); - game.b_draw_after_battle = true; - game.b_bonus += 2; + play_card(c, "for +2 DRM") + if (game.active === BRITISH) { + if (CARDS[c].event === "remove_benedict_arnold") + remove_benedict_arnold() + game.b_draw_after_battle = true + game.b_bonus += 2 } else { - game.a_draw_after_battle = true; - game.a_bonus += 2; + game.a_draw_after_battle = true + game.a_bonus += 2 } - goto_play_defender_battle_card(); + goto_play_defender_battle_card() }, card_battle_discard: function (c) { - discard_card(c, "for +1 DRM"); - if (game.active == BRITISH) { - game.b_draw_after_battle = true; - game.b_bonus += 1; + discard_card(c, "for +1 DRM") + if (game.active === BRITISH) { + game.b_draw_after_battle = true + game.b_bonus += 1 } else { - game.a_draw_after_battle = true; - game.a_bonus += 1; + game.a_draw_after_battle = true + game.a_bonus += 1 } - goto_play_defender_battle_card(); + goto_play_defender_battle_card() }, pass: function () { - goto_play_defender_battle_card(); + goto_play_defender_battle_card() }, } function goto_play_defender_battle_card() { - game.state = 'play_defender_battle_card'; - game.active = ENEMY[game.attacker]; + game.state = "play_defender_battle_card" + game.active = ENEMY[game.attacker] } states.play_defender_battle_card = { prompt: function (current) { - view.prompt = "Defend: Play or discard event for DRM."; - gen_pass(); - gen_battle_card(); + view.prompt = "Defend: Play or discard event for DRM." + gen_pass() + gen_battle_card() }, card_battle_play: function (c) { - play_card(c, "for +2 DRM"); - if (game.active == BRITISH) { - if (CARDS[c].event == 'remove_benedict_arnold') - remove_benedict_arnold(); - game.b_draw_after_battle = true; - game.b_bonus += 2; + play_card(c, "for +2 DRM") + if (game.active === BRITISH) { + if (CARDS[c].event === "remove_benedict_arnold") + remove_benedict_arnold() + game.b_draw_after_battle = true + game.b_bonus += 2 } else { - game.a_draw_after_battle = true; - game.a_bonus += 2; + game.a_draw_after_battle = true + game.a_bonus += 2 } - resolve_battle(); + resolve_battle() }, card_battle_discard: function (c) { - discard_card(c, "for +1 DRM"); - if (game.active == BRITISH) { - game.b_draw_after_battle = true; - game.b_bonus += 1; + discard_card(c, "for +1 DRM") + if (game.active === BRITISH) { + game.b_draw_after_battle = true + game.b_bonus += 1 } else { - game.a_draw_after_battle = true; - game.a_bonus += 1; + game.a_draw_after_battle = true + game.a_bonus += 1 } - resolve_battle(); + resolve_battle() }, pass: function () { - resolve_battle(); + resolve_battle() }, } function gen_battle_card() { for (let c of active_hand()) { - let card = CARDS[c]; - if (game.active == BRITISH) { + let card = CARDS[c] + if (game.active === BRITISH) { switch (card.type) { - case 'british-battle': - case 'british-event-or-battle': - gen_action('card_battle_play', c); - break; - case 'british-event': - case 'american-event': - case 'american-battle': - gen_action('card_battle_discard', c); - break; + case "british-battle": + case "british-event-or-battle": + gen_action("card_battle_play", c) + break + case "british-event": + case "american-event": + case "american-battle": + gen_action("card_battle_discard", c) + break } } else { switch (card.type) { - case 'british-battle': - case 'british-event-or-battle': - case 'british-event': - case 'american-event': - gen_action('card_battle_discard', c); - break; - case 'american-battle': - gen_action('card_battle_play', c); - break; + case "british-battle": + case "british-event-or-battle": + case "british-event": + case "american-event": + gen_action("card_battle_discard", c) + break + case "american-battle": + gen_action("card_battle_play", c) + break } } } } function roll_loser_combat_losses(log) { - let roll = roll_d6(); - let losses = 0; - log.push("Loser Combat Loss Roll: " + roll); + let roll = roll_d6() + let losses = 0 + log.push("Loser Combat Loss Roll: " + roll) switch (roll) { - case 1: case 2: case 3: losses = 1; break; - case 4: case 5: losses = 2; break; - case 6: losses = 3; break; - } - return losses; + case 1: + case 2: + case 3: + losses = 1 + break + case 4: + case 5: + losses = 2 + break + case 6: + losses = 3 + break + } + return losses } function roll_winner_combat_losses(log, losing_general) { - let agility = losing_general ? GENERALS[losing_general].agility : 0; - let roll = roll_d6(); - log.push("Enemy Agility Rating: " + agility); - log.push("Winner Combat Loss Roll: " + roll); - let losses = 0; + let agility = losing_general ? GENERALS[losing_general].agility : 0 + let roll = roll_d6() + log.push("Enemy Agility Rating: " + agility) + log.push("Winner Combat Loss Roll: " + roll) + let losses = 0 switch (agility) { - case 0: losses = (roll == 1) ? 1 : 0; break; - case 1: losses = (roll <= 2) ? 1 : 0; break; - case 2: losses = (roll <= 3) ? 1 : 0; break; - case 3: losses = (roll <= 4) ? 1 : 0; break; - } - return losses; + case 0: + losses = roll === 1 ? 1 : 0 + break + case 1: + losses = roll <= 2 ? 1 : 0 + break + case 2: + losses = roll <= 3 ? 1 : 0 + break + case 3: + losses = roll <= 4 ? 1 : 0 + break + } + return losses } function apply_british_combat_losses(max) { - let cu = find_british_cu(game.where); + let cu = find_british_cu(game.where) if (cu.count > max) { - cu.count -= max; - return max; + cu.count -= max + return max } - remove_from_array(game.cu, cu); - return cu.count; + remove_from_array(game.cu, cu) + return cu.count } function apply_american_combat_losses(max) { - let cu = find_american_cu(game.where); + let cu = find_american_cu(game.where) if (cu) { if (cu.count > max) { - cu.count -= max; - return max; + cu.count -= max + return max } - remove_from_array(game.cu, cu); - return cu.count; + remove_from_array(game.cu, cu) + return cu.count } - return 0; + return 0 } function apply_french_combat_losses(max) { - let cu = find_french_cu(game.where); + let cu = find_french_cu(game.where) if (cu) { if (cu.count > max) { - cu.count -= max; - return max; + cu.count -= max + return max } - remove_from_array(game.cu, cu); - return cu.count; + remove_from_array(game.cu, cu) + return cu.count } - return 0; + return 0 } function apply_american_and_french_combat_losses(max) { - let n = apply_american_combat_losses(max); + let n = apply_american_combat_losses(max) if (n < max) n += apply_french_combat_losses(max - n) - return n; + return n } function resolve_battle() { - let a_log = []; - let b_log = []; + let a_log = [] + let b_log = [] - game.active = ENEMY[game.active]; - let b_g = find_british_general(game.where); - let b_cu = count_british_cu(game.where); - let a_g = find_american_or_french_general(game.where); - let a_cu = count_american_and_french_cu(game.where); - let b_br = 0; - let a_br = 0; + game.active = ENEMY[game.active] + let b_g = find_british_general(game.where) + let b_cu = count_british_cu(game.where) + let a_g = find_american_or_french_general(game.where) + let a_cu = count_american_and_french_cu(game.where) + let b_br = 0 + let a_br = 0 if (b_g) - b_log.push("General: " + b_g); + b_log.push("General: " + b_g) if (a_g) - a_log.push("General: " + a_g); + a_log.push("General: " + a_g) if (b_g) { - let roll = roll_d6(); + let roll = roll_d6() if (roll <= 3) - b_br = Math.min(Math.floor(GENERALS[b_g].battle / 2), b_cu); + b_br = Math.min(Math.floor(GENERALS[b_g].battle / 2), b_cu) else - b_br = Math.min(GENERALS[b_g].battle, b_cu); - b_log.push("Actual Battle Rating Roll: " + roll); + b_br = Math.min(GENERALS[b_g].battle, b_cu) + b_log.push("Actual Battle Rating Roll: " + roll) } if (a_g) { - let roll = roll_d6(); + let roll = roll_d6() if (roll <= 3) - a_br = Math.min(Math.floor(GENERALS[a_g].battle / 2), a_cu); + a_br = Math.min(Math.floor(GENERALS[a_g].battle / 2), a_cu) else - a_br = Math.min(GENERALS[a_g].battle, a_cu); - a_log.push("Actual Battle Rating Roll: " + roll); + a_br = Math.min(GENERALS[a_g].battle, a_cu) + a_log.push("Actual Battle Rating Roll: " + roll) } - b_log.push("+" + b_cu + " CU"); - a_log.push("+" + a_cu + " CU"); - b_log.push("+" + b_br + " Actual Battle Rating"); - a_log.push("+" + a_br + " Actual Battle Rating"); + b_log.push("+" + b_cu + " CU") + a_log.push("+" + a_cu + " CU") + b_log.push("+" + b_br + " Actual Battle Rating") + a_log.push("+" + a_br + " Actual Battle Rating") - let b_drm = b_cu + b_br + game.b_bonus; + let b_drm = b_cu + b_br + game.b_bonus if (game.regulars) { - b_log.push("+1 British Regulars' Advantage"); - b_drm += 1; + b_log.push("+1 British Regulars' Advantage") + b_drm += 1 } if (is_non_blockaded_port(game.where)) { if (is_fortified_port(game.where)) { if (has_british_pc(game.where)) { - b_log.push("+1 Royal Navy Support"); - b_drm += 1; + b_log.push("+1 Royal Navy Support") + b_drm += 1 } } else { - b_log.push("+1 Royal Navy Support"); - b_drm += 1; + b_log.push("+1 Royal Navy Support") + b_drm += 1 } } if (is_british_militia(game.where)) { - b_log.push("+1 Militia"); - b_drm += 1; + b_log.push("+1 Militia") + b_drm += 1 } - if (game.b_bonus == 2) - b_log.push("+2 Battle Card"); - else if (game.b_bonus == 1) - b_log.push("+1 Discard of an Event Card"); + if (game.b_bonus === 2) + b_log.push("+2 Battle Card") + else if (game.b_bonus === 1) + b_log.push("+1 Discard of an Event Card") - let a_drm = a_cu + a_br + game.a_bonus; + let a_drm = a_cu + a_br + game.a_bonus if (is_american_militia(game.where)) { - a_log.push("+1 Militia"); - a_drm += 1; + a_log.push("+1 Militia") + a_drm += 1 } if (is_american_winter_offensive()) { - a_log.push("+2 American Winter Offensive"); - a_drm += 2; + a_log.push("+2 American Winter Offensive") + a_drm += 2 } - if (game.a_bonus == 2) - a_log.push("+2 Battle Card"); - else if (game.a_bonus == 1) - a_log.push("+1 Discard of an Event Card"); + if (game.a_bonus === 2) + a_log.push("+2 Battle Card") + else if (game.a_bonus === 1) + a_log.push("+1 Discard of an Event Card") if (game.did_intercept) { - a_log.push("+1 Interception"); - a_drm += 1; + a_log.push("+1 Interception") + a_drm += 1 } - let b_roll = roll_d6(); - let a_roll = roll_d6(); + let b_roll = roll_d6() + let a_roll = roll_d6() - b_log.push("Battle Roll: " + b_roll); - b_log.push("Battle Total: " + (b_roll + b_drm)); - a_log.push("Battle Roll: " + a_roll); - a_log.push("Battle Total: " + (a_roll + a_drm)); + b_log.push("Battle Roll: " + b_roll) + b_log.push("Battle Total: " + (b_roll + b_drm)) + a_log.push("Battle Roll: " + a_roll) + a_log.push("Battle Total: " + (a_roll + a_drm)) - let victor; - if (game.active == BRITISH) - victor = (b_roll + b_drm) >= (a_roll + a_drm) ? BRITISH : AMERICAN; + let victor + if (game.active === BRITISH) + victor = b_roll + b_drm >= a_roll + a_drm ? BRITISH : AMERICAN else - victor = (b_roll + b_drm) >= (a_roll + a_drm) ? BRITISH : AMERICAN; + victor = b_roll + b_drm >= a_roll + a_drm ? BRITISH : AMERICAN - let a_lost_cu, b_lost_cu; - if (victor == BRITISH) { - b_lost_cu = roll_winner_combat_losses(b_log, a_g); - a_lost_cu = roll_loser_combat_losses(a_log); + let a_lost_cu, b_lost_cu + if (victor === BRITISH) { + b_lost_cu = roll_winner_combat_losses(b_log, a_g) + a_lost_cu = roll_loser_combat_losses(a_log) } else { - b_lost_cu = roll_loser_combat_losses(b_log); - a_lost_cu = roll_winner_combat_losses(a_log, b_g); + b_lost_cu = roll_loser_combat_losses(b_log) + a_lost_cu = roll_winner_combat_losses(a_log, b_g) } - game.british_losses = apply_british_combat_losses(b_lost_cu); - let american_losses = apply_american_and_french_combat_losses(a_lost_cu); + game.british_losses = apply_british_combat_losses(b_lost_cu) + let american_losses = apply_american_and_french_combat_losses(a_lost_cu) - b_log.push("Losses: " + game.british_losses + " CU"); - a_log.push("Losses: " + american_losses + " CU"); + b_log.push("Losses: " + game.british_losses + " CU") + a_log.push("Losses: " + american_losses + " CU") // Special case: winning general with no CU on enemy PC is captured - if (victor == BRITISH) { - if (b_g && count_british_cu(game.where) == 0 && has_american_pc(game.where)) - capture_british_general(game.where); + if (victor === BRITISH) { + if (b_g && count_british_cu(game.where) === 0 && has_american_pc(game.where)) + capture_british_general(game.where) } else { - if (a_g && count_american_and_french_cu(game.where) == 0 && has_british_pc(game.where)) - capture_american_or_french_general(game.where); + if (a_g && count_american_and_french_cu(game.where) === 0 && has_british_pc(game.where)) + capture_american_or_french_general(game.where) } - log("BRITISH BATTLE REPORT:\n" + b_log.join("\n")); - log("AMERICAN BATTLE REPORT:\n" + a_log.join("\n")); - log(victor + " victory in " + game.where + "!"); + log("BRITISH BATTLE REPORT:\n" + b_log.join("\n")) + log("AMERICAN BATTLE REPORT:\n" + a_log.join("\n")) + log(victor + " victory in " + game.where + "!") - if (victor == AMERICAN) - advance_french_alliance(1); + if (victor === AMERICAN) + advance_french_alliance(1) - goto_retreat_after_battle(victor); + goto_retreat_after_battle(victor) } function goto_retreat_after_battle(victor) { - if (victor == BRITISH) { - game.who = find_american_or_french_general(game.where); - if (game.who == null && count_american_and_french_cu(game.where) == 0) - return end_battle(); + if (victor === BRITISH) { + game.who = find_american_or_french_general(game.where) + if (game.who === null && count_american_and_french_cu(game.where) === 0) + return end_battle() } else { - game.who = find_british_general(game.where); - if (game.who == null && count_british_cu(game.where) == 0) - return end_battle(); + game.who = find_british_general(game.where) + if (game.who === null && count_british_cu(game.where) === 0) + return end_battle() } - game.active = ENEMY[victor]; - game.state = 'retreat_after_battle'; + game.active = ENEMY[victor] + game.state = "retreat_after_battle" } states.retreat_after_battle = { prompt: function (current) { - view.prompt = "Retreat after battle."; - gen_action('surrender'); - if (game.active == game.attacker) - gen_attacker_retreat(); + view.prompt = "Retreat after battle." + gen_action("surrender") + if (game.active === game.attacker) + gen_attacker_retreat() else - gen_defender_retreat(); + gen_defender_retreat() }, move: function (to) { - logp("retreated to " + to); - if (game.active == BRITISH) - retreat_british_army(game.where, to); + logp("retreated to " + to) + if (game.active === BRITISH) + retreat_british_army(game.where, to) else - retreat_american_army(game.where, to); + retreat_american_army(game.where, to) if (count_friendly_generals(to) > 1) - goto_remove_general_after_retreat(to); + goto_remove_general_after_retreat(to) else - end_battle(); + end_battle() }, surrender: function () { // End battle here, so if Washington is captured we can handle the interrupt state. - let active = game.active; - let where = game.where; - end_battle(); + let active = game.active + let where = game.where + end_battle() - logp("surrendered"); - if (active == BRITISH) - surrender_british_army(where); + logp("surrendered") + if (active === BRITISH) + surrender_british_army(where) else - surrender_american_army(where); + surrender_american_army(where) }, } function end_battle() { - game.active = game.attacker; + game.active = game.attacker - if (game.active == BRITISH && game.congress == game.where) - disperse_continental_congress(game.where); + if (game.active === BRITISH && game.congress === game.where) + disperse_continental_congress(game.where) if (game.british_losses >= 3) - lose_regular_advantage(); + lose_regular_advantage() // TODO: delay until end of campaign if (game.b_draw_after_battle) - game.b_hand.push(deal_card()); + game.b_hand.push(deal_card()) if (game.a_draw_after_battle) - game.a_hand.push(deal_card()); + game.a_hand.push(deal_card()) - delete game.did_intercept; - delete game.b_bonus; - delete game.a_bonus; - delete game.b_draw_after_battle; - delete game.a_draw_after_battle; - delete game.attack_from; - delete game.british_losses; - delete game.attacker; - game.where = null; - game.who = null; - end_strategy_card(); + delete game.did_intercept + delete game.b_bonus + delete game.a_bonus + delete game.b_draw_after_battle + delete game.a_draw_after_battle + delete game.attack_from + delete game.british_losses + delete game.attacker + game.where = null + game.who = null + end_strategy_card() } /* END TURN PHASES */ function apply_single_winter_attrition(owner, space) { - let die = roll_d6(); - log(owner[0] + " attrition roll " + die + " in " + space); + let die = roll_d6() + log(owner[0] + " attrition roll " + die + " in " + space) if (die <= 3) { - log(owner[0] + " lost 1 CU in " + space); - remove_cu(owner, space, 1); + log(owner[0] + " lost 1 CU in " + space) + remove_cu(owner, space, 1) } } function apply_winter_attrition(owner, space, n) { - let half = Math.floor(n / 2); - log(owner[0] + " lost " + half + " CU in " + space); - remove_cu(owner, space, half); + let half = Math.floor(n / 2) + log(owner[0] + " lost " + half + " CU in " + space) + remove_cu(owner, space, half) } function goto_winter_attrition_phase() { - logbr(); - log("Winter Attrition"); + logbr() + log("Winter Attrition") for (let space in SPACES) { - let wq = is_winter_quarter_space(space); - let n_british = count_british_cu(space); - let n_american = count_american_cu(space); - let n_french = count_french_cu(space); - let has_washington = game.generals[WASHINGTON].location == space; - - if (n_british == 1 && !wq) - apply_single_winter_attrition(BRITISH, space, has_british_general(space)); + let wq = is_winter_quarter_space(space) + let n_british = count_british_cu(space) + let n_american = count_american_cu(space) + let n_french = count_french_cu(space) + let has_washington = game.generals[WASHINGTON].location === space + + if (n_british === 1 && !wq) + apply_single_winter_attrition(BRITISH, space, has_british_general(space)) if (n_british > 1 && !wq) - apply_winter_attrition(BRITISH, space, n_british); + apply_winter_attrition(BRITISH, space, n_british) - if (n_american == 0 && n_french == 1 && !wq) - apply_single_winter_attrition(FRENCH, space, has_american_or_french_general(space)); - if (n_american == 0 && n_french > 1 && !wq) - apply_winter_attrition(FRENCH, space, n_french); + if (n_american === 0 && n_french === 1 && !wq) + apply_single_winter_attrition(FRENCH, space, has_american_or_french_general(space)) + if (n_american === 0 && n_french > 1 && !wq) + apply_winter_attrition(FRENCH, space, n_french) - if (n_american == 1 && n_french == 0) - apply_single_winter_attrition(AMERICAN, space, has_american_or_french_general(space)); - if (n_american > 1 && n_french == 0) { - let n = n_american; + if (n_american === 1 && n_french === 0) + apply_single_winter_attrition(AMERICAN, space, has_american_or_french_general(space)) + if (n_american > 1 && n_french === 0) { + let n = n_american if (has_washington && wq) - n = Math.max(0, n - 5); - apply_winter_attrition(AMERICAN, space, n); + n = Math.max(0, n - 5) + apply_winter_attrition(AMERICAN, space, n) } if (n_american > 0 && n_french > 0) { - let n = n_american + n_french; + let n = n_american + n_french if (has_washington && wq) - n = Math.max(0, n - 5); - let half = Math.floor(n / 2); + n = Math.max(0, n - 5) + let half = Math.floor(n / 2) // TODO: let player choose (but why would he ever choose the french?) - let lose_american = Math.min(half, n_american); - log(owner[0] + " lost " + lose_american + " American CU in " + space); - remove_cu(AMERICAN, space, n_american); - half -= lose_american; - n_american -= lose_american; + let lose_american = Math.min(half, n_american) + log(owner[0] + " lost " + lose_american + " American CU in " + space) + remove_cu(AMERICAN, space, n_american) + half -= lose_american + n_american -= lose_american if (half > 0) { - log(owner[0] + " lost " + half + " French CU in " + space); - remove_cu(FRENCH, space, half); + log(owner[0] + " lost " + half + " French CU in " + space) + remove_cu(FRENCH, space, half) } } } if (automatic_victory()) - return; + return - goto_french_naval_phase(); + goto_french_naval_phase() } function goto_french_naval_phase() { - if (game.french_navy != FRENCH_REINFORCEMENTS) { - game.active = AMERICAN; - game.state = 'place_french_navy'; + if (game.french_navy !== FRENCH_REINFORCEMENTS) { + game.active = AMERICAN + game.state = "place_french_navy" } else { - goto_political_control_phase(); + goto_political_control_phase() } } function gen_place_french_navy() { - gen_action('place_navy', "Sea1"); - gen_action('place_navy', "Sea2"); - gen_action('place_navy', "Sea3"); - gen_action('place_navy', "Sea4"); - gen_action('place_navy', "Sea5"); - gen_action('place_navy', "Sea6"); - gen_action('place_navy', "Sea7"); + gen_action("place_navy", "Sea1") + gen_action("place_navy", "Sea2") + gen_action("place_navy", "Sea3") + gen_action("place_navy", "Sea4") + gen_action("place_navy", "Sea5") + gen_action("place_navy", "Sea6") + gen_action("place_navy", "Sea7") } states.place_french_navy_trigger = { prompt: function (current) { - view.prompt = "Place the French Navy in a blockade zone."; - gen_place_french_navy(); + view.prompt = "Place the French Navy in a blockade zone." + gen_place_french_navy() }, place_navy: function (zone) { - logp("placed French Navy."); - game.french_navy = zone; - game.active = game.save_active; - delete game.save_active; + logp("placed French Navy.") + game.french_navy = zone + game.active = game.save_active + delete game.save_active end_strategy_card() }, } states.place_french_navy = { prompt: function (current) { - view.prompt = "Place the French Navy in a blockade zone."; - gen_place_french_navy(); + view.prompt = "Place the French Navy in a blockade zone." + gen_place_french_navy() }, place_navy: function (zone) { - logp("placed French Navy."); - game.french_navy = zone; - goto_political_control_phase(); + logp("placed French Navy.") + game.french_navy = zone + goto_political_control_phase() }, } @@ -3325,64 +3372,64 @@ function place_pc_markers_segment() { for (let space in SPACES) { if (has_american_army(space)) { if (has_no_pc(space)) - place_american_pc(space); + place_american_pc(space) else if (has_british_pc(space)) - flip_pc(space); + flip_pc(space) } if (has_british_army(space)) { if (has_no_pc(space)) - place_british_pc(space); + place_british_pc(space) else if (has_american_pc(space)) - flip_pc(space); + flip_pc(space) } } } function is_american_pc_root(space) { if (has_no_pc(space) && has_no_british_cu(space)) - return true; - if (game.congress == space) - return true; + return true + if (game.congress === space) + return true if (has_american_pc(space)) { if (has_american_or_french_cu(space)) - return true; + return true if (has_american_or_french_general(space)) - return true; + return true } - return false; + return false } function is_british_pc_root(space) { if (has_no_pc(space) && !has_american_or_french_cu(space) && !has_american_or_french_general(space)) - return true; + return true if (has_british_pc(space)) { if (is_port(space)) - return true; + return true if (has_british_cu(space)) - return true; + return true } - return false; + return false } function is_american_pc_path(space) { if (has_american_pc(space)) - return !has_british_army(space); - return false; + return !has_british_army(space) + return false } function is_british_pc_path(space) { if (has_british_pc(space)) - return !has_american_army(space); - return false; + return !has_american_army(space) + return false } function spread_american_path(seen, from) { for (let to of SPACES[from].exits) { if (to in seen) - continue; + continue if (is_american_pc_path(to)) { - seen[to] = 1; - spread_american_path(seen, to); + seen[to] = 1 + spread_american_path(seen, to) } } } @@ -3390,182 +3437,182 @@ function spread_american_path(seen, from) { function spread_british_path(seen, from) { for (let to of SPACES[from].exits) { if (to in seen) - continue; + continue if (is_british_pc_path(to)) { - seen[to] = 1; - spread_british_path(seen, to); + seen[to] = 1 + spread_british_path(seen, to) } } } function remove_isolated_american_pc_segment() { - log("Removed isolated American PC"); - let seen = {}; + log("Removed isolated American PC") + let seen = {} for (let space in SPACES) { if (is_american_pc_root(space)) { - seen[space] = 1; - spread_american_path(seen, space); + seen[space] = 1 + spread_american_path(seen, space) } } for (let space in SPACES) if (has_american_pc(space) && !seen[space]) - remove_pc(space); + remove_pc(space) } function remove_isolated_british_pc_segment() { - log("Removed isolated British PC"); - let seen = {}; + log("Removed isolated British PC") + let seen = {} for (let space in SPACES) { if (is_british_pc_root(space)) { - seen[space] = 1; - spread_british_path(seen, space); + seen[space] = 1 + spread_british_path(seen, space) } } for (let space in SPACES) if (has_british_pc(space) && !seen[space]) - remove_pc(space); + remove_pc(space) } function gen_place_continental_congress() { - let n = 0; + let n = 0 for (let space in SPACES) { - if (SPACES[space].colony != 'CA') { + if (SPACES[space].colony !== "CA") { if (has_american_pc(space) && has_no_british_playing_piece(space)) { - gen_action('place_continental_congress', space); - ++n; + gen_action("place_continental_congress", space) + ++n } } } - return n; + return n } function goto_political_control_phase() { - if (game.congress == CONTINENTAL_CONGRESS_DISPERSED) { - game.active = AMERICAN; - game.state = 'return_continental_congress'; + if (game.congress === CONTINENTAL_CONGRESS_DISPERSED) { + game.active = AMERICAN + game.state = "return_continental_congress" } else { - goto_political_control_phase_2(); + goto_political_control_phase_2() } } states.return_continental_congress = { prompt: function () { - view.prompt = "Return Continental Congress to a space in the 13 colonies."; - if (gen_place_continental_congress() == 0) - gen_pass(); + view.prompt = "Return Continental Congress to a space in the 13 colonies." + if (gen_place_continental_congress() === 0) + gen_pass() }, place_continental_congress: function (where) { - game.congress = where; - goto_political_control_phase_2(); + game.congress = where + goto_political_control_phase_2() }, pass: function () { - goto_political_control_phase_2(); - } + goto_political_control_phase_2() + }, } function goto_political_control_phase_2() { - place_pc_markers_segment(); - remove_isolated_american_pc_segment(); - remove_isolated_british_pc_segment(); - goto_end_phase(); + place_pc_markers_segment() + remove_isolated_american_pc_segment() + remove_isolated_british_pc_segment() + goto_end_phase() } states.european_war = { prompt: function () { - view.prompt = "European War: Remove 2 British CU from any spaces. " + game.count + " left."; - gen_pass(); - gen_remove_british_cu(); + view.prompt = "European War: Remove 2 British CU from any spaces. " + game.count + " left." + gen_pass() + gen_remove_british_cu() }, remove_cu: function (where) { - let cu = find_british_cu(where); - remove_cu(BRITISH, where, 1); - if (--game.count == 0) - goto_end_phase(); + let cu = find_british_cu(where) + remove_cu(BRITISH, where, 1) + if (--game.count === 0) + goto_end_phase() }, pass: function () { - goto_end_phase(); - } + goto_end_phase() + }, } function norths_government_falls() { - update_colony_control(); + update_colony_control() - let n_american = 0; + let n_american = 0 for (let c in COLONIES) - if (game.control[c] == AMERICAN) - ++n_american; + if (game.control[c] === AMERICAN) + ++n_american if (n_american >= 7) - game.result = AMERICAN; + game.result = AMERICAN else - game.result = BRITISH; + game.result = BRITISH - game.victory = "North's Government Falls: " + game.result + " Victory!"; - game.active = "None"; - game.state = 'game_over'; + game.victory = "North's Government Falls: " + game.result + " Victory!" + game.active = "None" + game.state = "game_over" - log(game.victory); + log(game.victory) } function goto_end_phase() { if (game.french_alliance_triggered && !game.european_war) { - game.european_war = true; - game.count = 2; - game.active = AMERICAN; - game.state = 'european_war'; - game.reshuffle = true; - return; + game.european_war = true + game.count = 2 + game.active = AMERICAN + game.state = "european_war" + game.reshuffle = true + return } - if ((game.war_ends && game.year >= game.war_ends) || game.year == 1783) - return norths_government_falls(); + if ((game.war_ends && game.year >= game.war_ends) || game.year === 1783) + return norths_government_falls() - delete game.pennsylvania_and_new_jersey_line_mutinies; - game.a_queue = game.b_queue = 0; - game.year += 1; - goto_start_year(); + delete game.pennsylvania_and_new_jersey_line_mutinies + game.a_queue = game.b_queue = 0 + game.year += 1 + goto_start_year() } states.game_over = { prompt: function () { - view.prompt = game.victory; - } + view.prompt = game.victory + }, } /* CLIENT/SERVER COMMS */ exports.setup = function (seed, scenario, options) { - setup_game(seed); - return game; + setup_game(seed) + return game } exports.action = function (state, current, action, arg) { - game = state; + game = state // TODO: check against action list - if (current == game.active) { - let S = states[game.state]; + if (current === game.active) { + let S = states[game.state] if (action in S) { - S[action](arg); + S[action](arg) } else { - if (action === 'undo' && game.undo && game.undo.length > 0) - pop_undo(); + if (action === "undo" && game.undo && game.undo.length > 0) + pop_undo() else - throw new Error("Invalid action: " + action); + throw new Error("Invalid action: " + action) } } - update_colony_control(); + update_colony_control() - return game; + return game } function list_actions(current) { view.actions = {} - states[game.state].prompt(current); + states[game.state].prompt(current) } -exports.view = function(state, current) { - game = state; +exports.view = function (state, current) { + game = state view = { active: state.active, @@ -3592,24 +3639,24 @@ exports.view = function(state, current) { } if (state.pennsylvania_and_new_jersey_line_mutinies) - view.pennsylvania_and_new_jersey_line_mutinies = true; + view.pennsylvania_and_new_jersey_line_mutinies = true - if (current == AMERICAN) - view.hand = state.a_hand; - else if (current == BRITISH) - view.hand = state.b_hand; + if (current === AMERICAN) + view.hand = state.a_hand + else if (current === BRITISH) + view.hand = state.b_hand else - view.hand = []; + view.hand = [] - if (current == state.active) { - list_actions(current); - gen_action_undo(); + if (current === state.active) { + list_actions(current) + gen_action_undo() } else { - let inactive = states[game.state].inactive; - if (typeof inactive !== 'string') - inactive = game.state; - view.prompt = "Waiting for " + game.active + " player \u2014 " + inactive + "."; + let inactive = states[game.state].inactive + if (typeof inactive !== "string") + inactive = game.state + view.prompt = "Waiting for " + game.active + " player \u2014 " + inactive + "." } - return view; + return view } |