From 660981ddb4b8d92aa8f74936c198f261384193e9 Mon Sep 17 00:00:00 2001
From: Tor Andersson <tor@ccxvii.net>
Date: Wed, 16 Feb 2022 14:37:58 +0100
Subject: Track first play of French Regulars to bring on Montcalm & co.

---
 rules.js | 77 +++++++++++++++++++++++-----------------------------------------
 1 file changed, 28 insertions(+), 49 deletions(-)

diff --git a/rules.js b/rules.js
index 3d141b1..cac9517 100644
--- a/rules.js
+++ b/rules.js
@@ -1,6 +1,7 @@
 "use strict";
 
-// cleanups
+// CLEANUPS
+// naming: France/Britain or "The French"/"The British"
 // TODO: rename node/space -> location/space or raw_space/space or box/space?
 // TODO: replace piece[p].type lookups with index range checks
 // TODO: move core of is_friendly/enemy to is_british/french and branch in is_friendly/enemy
@@ -12,39 +13,28 @@
 // TODO: clean up handling of dead/unused french leaders (french regulars event)
 // TODO: show discard/removed card list in UI
 // TODO: defender retreat procedure needs love
+// TODO: for_each_exit -> flat list of all exits
 
-// naming: France/Britain or "The French"/"The British"
-
-// features
-// TODO: trace supply
-// TODO: infiltration
-
-// TODO: 13.12 victory check exception -- originally-British fortresses are friendly
-
-// TODO: french_regulars event played - montcalm not entered or dead separate state (merge DEAD/UNUSED consts)
-// put leaders in pool in their own box?
-
-// TODO: campaign and stacking - define forces first, then move
 // TODO: flat force definition - use sum of leader command rating
 //    (only allow dropping subordinate if stacking limit allows)
-// TODO: indians and raiders go home - new process (coureurs and leaders follow indians, etc)
 
-// TODO: 10.413 leaders and coureurs may follow indians home
-// TODO: leaders alone - retreat (reinforcement events that place units)
+// TODO: retreat procedure is awkward (define then select then move)
 
-// TODO: remove old 7 command leader(s) before placing reinforcements
+// FEATURES
+// TODO: infiltration
 
-// GRAPHICS: badge for pool/dead leaders
-// GRAPHICS: tooltip for leader stack and strength
+// BUGS
+// TODO: 13.12 victory check exception -- originally-British fortresses are friendly
+// TODO: 10.413 leaders and coureurs may follow indians home
+// TODO: leaders alone - retreat from reinforcement placements
+// TODO: campaign - define both forces first, then move
+// TODO: remove old 7 command leader(s) immediately as they're drawn, before placing reinforcements
 
 const { spaces, pieces, cards } = require("./data");
 
 const BRITAIN = 'Britain';
 const FRANCE = 'France';
 
-const DEAD = 0;
-const UNUSED = 0;
-
 // Order of pieces: br.leaders/br.units/fr.leaders/fr.units
 let first_british_piece = -1;
 let last_british_leader = -1;
@@ -216,9 +206,7 @@ const ENTHUSIASTIC = 2;
 
 function find_space(name) {
 	if (name === 'dead')
-		return DEAD;
-	if (name === 'unused')
-		return UNUSED;
+		return 0;
 	let ix = spaces.findIndex(node => node.name === name);
 	if (ix < 0)
 		throw new Error("cannot find space " + name);
@@ -425,6 +413,8 @@ define_indian_settlement("Pays d'en Haut", "Huron");
 const JOHNSON = find_leader("Johnson");
 const ABERCROMBY = find_leader("Abercromby");
 const AMHERST = find_leader("Amherst");
+const FORBES = find_leader("Forbes");
+const WOLFE = find_leader("Wolfe");
 const BRADDOCK = find_leader("Braddock");
 const LOUDOUN = find_leader("Loudoun");
 const MONTCALM = find_leader("Montcalm");
@@ -565,15 +555,12 @@ function deal_cards() {
 	log("Dealt " + bn + " cards to Britain.");
 
 	while (fn > 0 || bn > 0) {
-		let c;
 		if (fn > 0) {
-			game.France.hand.push(c=deal_card());
-			log("DEAL", c, "to France");
+			game.France.hand.push(deal_card());
 			--fn;
 		}
 		if (bn > 0) {
-			game.Britain.hand.push(c=deal_card());
-			log("DEAL", c, "to Britain");
+			game.Britain.hand.push(deal_card());
 			--bn;
 		}
 	}
@@ -1067,11 +1054,11 @@ function set_force_inside(force) {
 function is_piece_on_map(p) {
 	// TODO: militia boxes?
 	let s = piece_node(p);
-	return s !== UNUSED && s !== DEAD;
+	return s !== 0;
 }
 
 function is_piece_unused(p) {
-	return piece_node(p) === UNUSED;
+	return piece_node(p) === 0;
 }
 
 function is_piece_in_node(p, node) {
@@ -1664,10 +1651,7 @@ function eliminate_piece(p) {
 	log(piece_name(p) + " is eliminated.");
 	isolate_piece_from_force(p);
 	set_unit_reduced(p, 0);
-	if (is_leader(p))
-		game.pieces.location[p] = DEAD;
-	else
-		game.pieces.location[p] = UNUSED;
+	game.pieces.location[p] = 0;
 	if (is_indian_unit(p)) {
 		let home = indian_home_settlement(p);
 		if (home) {
@@ -2281,9 +2265,9 @@ function find_closest_friendly_unbesieged_fortification(start) {
 function start_year() {
 	if (game.tracks.year === 1759 && !game.events.pitt) {
 		log("Placing Amherst, Forbes, and Wolfe into the British leader pool.");
-		game.pieces.pool.push(find_leader("Amherst"));
-		game.pieces.pool.push(find_leader("Forbes"));
-		game.pieces.pool.push(find_leader("Wolfe"));
+		game.pieces.pool.push(AMHERST);
+		game.pieces.pool.push(FORBES);
+		game.pieces.pool.push(WOLFE);
 	}
 
 	game.tracks.season = EARLY;
@@ -7152,17 +7136,14 @@ events.french_regulars = {
 	play() {
 		game.state = 'french_regulars';
 		game.leader = [];
-		if (is_piece_unused(MONTCALM)) {
+		if (game.events.once_french_regulars) {
 			game.leader.push(MONTCALM);
-			move_piece_to(MONTCALM, leader_box(MONTCALM));
-		}
-		if (is_piece_unused(LEVIS)) {
 			game.leader.push(LEVIS);
-			move_piece_to(LEVIS, leader_box(LEVIS));
-		}
-		if (is_piece_unused(BOUGAINVILLE)) {
 			game.leader.push(BOUGAINVILLE);
+			move_piece_to(MONTCALM, leader_box(MONTCALM));
+			move_piece_to(LEVIS, leader_box(LEVIS));
 			move_piece_to(BOUGAINVILLE, leader_box(BOUGAINVILLE));
+			delete game.events.once_french_regulars;
 		}
 		game.count = 2;
 	}
@@ -7938,9 +7919,7 @@ function setup_1755() {
 	game.pieces.pool.push(find_leader("Murray"));
 	game.pieces.pool.push(find_leader("Webb"));
 
-	setup_leader("unused", "Amherst");
-	setup_leader("unused", "Forbes");
-	setup_leader("unused", "Wolfe");
+	game.events.once_french_regulars = 1;
 
 	start_year();
 
-- 
cgit v1.2.3