summaryrefslogtreecommitdiff
path: root/play.js
diff options
context:
space:
mode:
Diffstat (limited to 'play.js')
-rw-r--r--play.js1276
1 files changed, 641 insertions, 635 deletions
diff --git a/play.js b/play.js
index 693c177..9ac8880 100644
--- a/play.js
+++ b/play.js
@@ -1,178 +1,178 @@
-"use strict";
+"use strict"
function abs(x) {
- return x < 0 ? -x : x;
+ return x < 0 ? -x : x
}
// PIECE AND SPACE RANGES
-const first_space = 1;
-const last_space = 141;
-const first_piece = 1;
-const last_piece = 151;
-const first_leader_box = 145;
-const last_leader_box = 167;
-function is_leader(p) { return (p >= 1 && p <= 13) || (p >= 87 && p <= 96); }
-function is_unit(p) { return (p >= 14 && p <= 86) || (p >= 97 && p <= 151); }
-function is_auxiliary(p) { return (p >= 14 && p <= 25) || (p >= 97 && p <= 126); }
-function is_drilled_troops(p) { return (p >= 26 && p <= 82) || (p >= 127 && p <= 147); }
-function is_indian(p) { return (p >= 14 && p <= 22) || (p >= 97 && p <= 118); }
+const first_space = 1
+const last_space = 141
+const first_piece = 1
+const last_piece = 151
+const first_leader_box = 145
+const last_leader_box = 167
+function is_leader(p) { return (p >= 1 && p <= 13) || (p >= 87 && p <= 96) }
+function is_unit(p) { return (p >= 14 && p <= 86) || (p >= 97 && p <= 151) }
+function is_auxiliary(p) { return (p >= 14 && p <= 25) || (p >= 97 && p <= 126) }
+function is_drilled_troops(p) { return (p >= 26 && p <= 82) || (p >= 127 && p <= 147) }
+function is_indian(p) { return (p >= 14 && p <= 22) || (p >= 97 && p <= 118) }
// Patch up leader/box associations.
-const box_from_leader = [];
-const leader_from_box = [];
+const box_from_leader = []
+const leader_from_box = []
for (let p = 0; p <= last_piece; ++p)
- box_from_leader[p] = 0;
+ box_from_leader[p] = 0
for (let s = first_leader_box; s <= last_leader_box; ++s) {
- let p = pieces.findIndex(piece => piece.name === spaces[s].name);
- box_from_leader[p] = s;
- leader_from_box[s-first_leader_box] = p;
+ let p = pieces.findIndex(piece => piece.name === spaces[s].name)
+ box_from_leader[p] = s
+ leader_from_box[s-first_leader_box] = p
}
-function leader_box(p) { return box_from_leader[p]; }
-function box_leader(s) { return leader_from_box[s-first_leader_box]; }
+function leader_box(p) { return box_from_leader[p] }
+function box_leader(s) { return leader_from_box[s-first_leader_box] }
function is_unit_reduced(p) {
- return view.reduced.includes(p);
+ return view.reduced.includes(p)
}
function unit_strength(p) {
if (is_unit_reduced(p))
- return pieces[p].reduced_strength;
- return pieces[p].strength;
+ return pieces[p].reduced_strength
+ return pieces[p].strength
}
function force_strength(ldr) {
- let str = 0;
- let s = leader_box(ldr);
+ let str = 0
+ let s = leader_box(ldr)
for (let p = 1; p <= last_piece; ++p)
if (view.location[p] === s)
if (is_unit(p))
- str += unit_strength(p);
- return str;
+ str += unit_strength(p)
+ return str
}
function stack_strength(stack) {
- let str = 0;
+ let str = 0
for (let i = 0; i < stack.length; ++i) {
- let p = stack[i][0];
+ let p = stack[i][0]
if (p > 0) {
if (is_leader(p))
- str += force_strength(p);
+ str += force_strength(p)
else
- str += unit_strength(p);
+ str += unit_strength(p)
}
}
- return str;
+ return str
}
function is_supreme_commander(ldr, stack) {
// If anyone else is moving from here, we're not supreme anymore!
for (let i = 0; i < stack.length; ++i) {
- let p = stack[i][0];
+ let p = stack[i][0]
if (is_leader(p) && p !== ldr)
if (force_strength(p) > 0)
- return false;
+ return false
}
// Otherwise, if we're on top of the stack, we're supreme!
for (let i = 0; i < stack.length; ++i) {
- let p = stack[i][0];
+ let p = stack[i][0]
if (is_leader(p))
- return (p === ldr);
+ return (p === ldr)
}
- return false;
+ return false
}
function check_menu(id, x) {
- document.getElementById(id).className = x ? "menu_item checked" : "menu_item unchecked";
+ document.getElementById(id).className = x ? "menu_item checked" : "menu_item unchecked"
}
// LAYOUT AND STYLE OPTIONS
-let layout = 0;
-let style = "bevel";
-let mouse_focus = 0;
+let layout = 0
+let style = "bevel"
+let mouse_focus = 0
function set_layout(x) {
- layout = x;
- window.localStorage[params.title_id + "/layout"] = layout;
- check_menu("stack_v", layout === 0);
- check_menu("stack_h", layout === 1);
- check_menu("stack_d", layout === 2);
+ layout = x
+ window.localStorage[params.title_id + "/layout"] = layout
+ check_menu("stack_v", layout === 0)
+ check_menu("stack_h", layout === 1)
+ check_menu("stack_d", layout === 2)
if (view)
- update_map();
+ update_map()
}
function set_style(x) {
- style = x;
- window.localStorage[params.title_id + "/style"] = x;
- check_menu("style_bevel", style === "bevel");
- check_menu("style_flat", style === "flat");
- let body = document.querySelector("body");
- body.classList.toggle("bevel", style === "bevel");
- body.classList.toggle("flat", style === "flat");
+ style = x
+ window.localStorage[params.title_id + "/style"] = x
+ check_menu("style_bevel", style === "bevel")
+ check_menu("style_flat", style === "flat")
+ let body = document.querySelector("body")
+ body.classList.toggle("bevel", style === "bevel")
+ body.classList.toggle("flat", style === "flat")
if (view)
- update_map();
+ update_map()
}
function set_mouse_focus(x) {
if (x === undefined)
- mouse_focus = 1 - mouse_focus;
+ mouse_focus = 1 - mouse_focus
else
- mouse_focus = x;
- window.localStorage[params.title_id + "/mouse_focus"] = mouse_focus;
- check_menu("mouse_focus", mouse_focus === 1);
+ mouse_focus = x
+ window.localStorage[params.title_id + "/mouse_focus"] = mouse_focus
+ check_menu("mouse_focus", mouse_focus === 1)
}
-set_layout(window.localStorage[params.title_id + "/layout"] | 0);
-set_style(window.localStorage[params.title_id + "/style"] || "bevel");
-set_mouse_focus(window.localStorage[params.title_id + "/mouse_focus"] | 0);
+set_layout(window.localStorage[params.title_id + "/layout"] | 0)
+set_style(window.localStorage[params.title_id + "/style"] || "bevel")
+set_mouse_focus(window.localStorage[params.title_id + "/mouse_focus"] | 0)
-let focus = null;
-let focus_box = document.getElementById("focus");
+let focus = null
+let focus_box = document.getElementById("focus")
// SUPPLY LINE DISPLAY
-let showing_supply = false;
+let showing_supply = false
function show_supply(supply) {
- showing_supply = true;
+ showing_supply = true
for (let s = 1; s <= last_space; ++s) {
- spaces[s].element.classList.toggle("french_supply", supply.french.includes(s));
- spaces[s].element.classList.toggle("british_supply", supply.british.includes(s));
+ spaces[s].element.classList.toggle("french_supply", supply.french.includes(s))
+ spaces[s].element.classList.toggle("british_supply", supply.british.includes(s))
}
}
function hide_supply() {
if (showing_supply) {
- showing_supply = false;
+ showing_supply = false
for (let s = 1; s <= last_space; ++s) {
- spaces[s].element.classList.remove("french_supply");
- spaces[s].element.classList.remove("british_supply");
+ spaces[s].element.classList.remove("french_supply")
+ spaces[s].element.classList.remove("british_supply")
}
}
}
-const DEBUG_CONNECTIONS = false;
+const DEBUG_CONNECTIONS = false
-const RELUCTANT = 0;
-const SUPPORTIVE = 1;
-const ENTHUSIASTIC = 2;
+const RELUCTANT = 0
+const SUPPORTIVE = 1
+const ENTHUSIASTIC = 2
-const EARLY = 0;
-const LATE = 1;
+const EARLY = 0
+const LATE = 1
-const VP_MARKER = "marker vps ";
-const VP10_MARKER = "marker vps vps_10 ";
-const PA_MARKER = "marker provincial_assemblies ";
-const SEASON_MARKER_FF = "marker season_french_first ";
-const SEASON_MARKER_BF = "marker season_british_first ";
+const VP_MARKER = "marker vps "
+const VP10_MARKER = "marker vps vps_10 "
+const PA_MARKER = "marker provincial_assemblies "
+const SEASON_MARKER_FF = "marker season_french_first "
+const SEASON_MARKER_BF = "marker season_british_first "
const SIEGE_MARKER = [
"marker small siege_0",
"marker small siege_1",
"marker small siege_2",
-];
+]
const FIELDWORKS_MARKER = [
"marker fieldworks"
-];
+]
const BRITISH_FORT_NAMES = {
"Augusta": "Virginia fortification line",
@@ -231,152 +231,152 @@ const INDIAN_ALLIED_NAMES = {
// Patch up leader/box associations.
for (let s = 1; s < spaces.length; ++s) {
if (spaces[s].type === 'leader-box') {
- let p = pieces.findIndex(x => x.name === spaces[s].name);
- spaces[s].leader = p;
- pieces[p].box = s;
+ let p = pieces.findIndex(x => x.name === spaces[s].name)
+ spaces[s].leader = p
+ pieces[p].box = s
}
}
function print(x) {
- console.log(JSON.stringify(x, (k,v)=>k==='log'?undefined:v));
+ console.log(JSON.stringify(x, (k,v)=>k==='log'?undefined:v))
}
function on_focus_card_tip(card_number) {
- document.getElementById("tooltip").className = "card show card_" + card_number;
+ document.getElementById("tooltip").className = "card show card_" + card_number
}
function on_blur_card_tip() {
- document.getElementById("tooltip").classList = "card";
+ document.getElementById("tooltip").classList = "card"
}
function on_focus_last_card() {
- console.log("focus", view.last_card);
+ console.log("focus", view.last_card)
if (typeof view.last_card === 'number') {
- document.getElementById("tooltip").className = "card show card_" + view.last_card;
+ document.getElementById("tooltip").className = "card show card_" + view.last_card
}
}
function on_blur_last_card() {
- document.getElementById("tooltip").classList = "card";
+ document.getElementById("tooltip").classList = "card"
}
function on_focus_pa_marker() {
- on_focus_bpa(view.pa);
+ on_focus_bpa(view.pa)
}
function on_focus_bpa(level) {
switch (level) {
case 0:
document.getElementById("status").textContent =
- `Reluctant: Max 2 southern & 6 northern provincials. No "Raise Provincial Regiments."`;
- break;
+ `Reluctant: Max 2 southern & 6 northern provincials. No "Raise Provincial Regiments."`
+ break
case 1:
document.getElementById("status").textContent =
- `Supportive: Max 4 southern & 10 northern provincials.`;
- break;
+ `Supportive: Max 4 southern & 10 northern provincials.`
+ break
case 2:
document.getElementById("status").textContent =
- `Enthusiastic: Unlimited provincials. No "Stingy Provincial Assembly."`;
- break;
+ `Enthusiastic: Unlimited provincials. No "Stingy Provincial Assembly."`
+ break
}
}
function on_blur_bpa() {
- document.getElementById("status").textContent = "";
+ document.getElementById("status").textContent = ""
}
function on_log_line(text, cn) {
- let p = document.createElement("div");
- if (cn) p.className = cn;
- p.innerHTML = text;
- return p;
+ let p = document.createElement("div")
+ if (cn) p.className = cn
+ p.innerHTML = text
+ return p
}
function on_log(text) {
- let p = document.createElement("div");
- text = text.replace(/&/g, "&amp;");
- text = text.replace(/</g, "&lt;");
- text = text.replace(/>/g, "&gt;");
+ let p = document.createElement("div")
+ text = text.replace(/&/g, "&amp;")
+ text = text.replace(/</g, "&lt;")
+ text = text.replace(/>/g, "&gt;")
text = text.replace(/#(\d+)[^\]]*\]/g,
- '<span class="tip" onmouseenter="on_focus_card_tip($1)" onmouseleave="on_blur_card_tip()">$&</span>');
+ '<span class="tip" onmouseenter="on_focus_card_tip($1)" onmouseleave="on_blur_card_tip()">$&</span>')
if (text.match(/^\.h1/)) {
- text = text.substring(4);
- p.className = 'h1';
+ text = text.substring(4)
+ p.className = 'h1'
}
if (text.match(/^\.h2/)) {
- text = text.substring(4);
+ text = text.substring(4)
if (text === 'France')
- p.className = 'h2 france';
+ p.className = 'h2 france'
else if (text === 'Britain')
- p.className = 'h2 britain';
+ p.className = 'h2 britain'
else
- p.className = 'h2';
+ p.className = 'h2'
}
if (text.match(/^\.h3/)) {
- text = text.substring(4);
- p.className = 'h3';
+ text = text.substring(4)
+ p.className = 'h3'
}
if (text.match(/^\.assault/)) {
- text = "Assault at " + text.substring(9);
- p.className = 'h3 assault';
+ text = "Assault at " + text.substring(9)
+ p.className = 'h3 assault'
}
if (text.match(/^\.battle/)) {
- text = "Battle at " + text.substring(8);
- p.className = 'h3 battle';
+ text = "Battle at " + text.substring(8)
+ p.className = 'h3 battle'
}
if (text.match(/^\.siege/)) {
- text = "Siege at " + text.substring(7);
- p.className = 'h3 siege';
+ text = "Siege at " + text.substring(7)
+ p.className = 'h3 siege'
}
if (text.match(/^\.raid/)) {
- text = "Raid at " + text.substring(6);
- p.className = 'h3 raid';
+ text = "Raid at " + text.substring(6)
+ p.className = 'h3 raid'
}
if (text.match(/^\.b /)) {
- text = text.substring(3);
- p.className = 'b';
+ text = text.substring(3)
+ p.className = 'b'
}
if (text.indexOf("\n") < 0) {
- p.innerHTML = text;
+ p.innerHTML = text
} else {
- text = text.split("\n");
- p.appendChild(on_log_line(text[0]));
+ text = text.split("\n")
+ p.appendChild(on_log_line(text[0]))
for (let i = 1; i < text.length; ++i)
- p.appendChild(on_log_line(text[i], "indent"));
+ p.appendChild(on_log_line(text[i], "indent"))
}
- return p;
+ return p
}
function show_card_list(id, list) {
- document.getElementById(id).classList.remove("hide");
- let body = document.getElementById(id + "_body");
+ document.getElementById(id).classList.remove("hide")
+ let body = document.getElementById(id + "_body")
while (body.firstChild)
- body.removeChild(body.firstChild);
+ body.removeChild(body.firstChild)
if (list.length === 0) {
- body.innerHTML = "<div>None</div>";
+ body.innerHTML = "<div>None</div>"
}
for (let c of list) {
- let p = document.createElement("div");
- p.className = "tip";
- p.onmouseenter = () => on_focus_card_tip(c);
- p.onmouseleave = on_blur_card_tip;
- p.textContent = `#${c} ${cards[c].name} [${cards[c].activation}]`;
- body.appendChild(p);
+ let p = document.createElement("div")
+ p.className = "tip"
+ p.onmouseenter = () => on_focus_card_tip(c)
+ p.onmouseleave = on_blur_card_tip
+ p.textContent = `#${c} ${cards[c].name} [${cards[c].activation}]`
+ body.appendChild(p)
}
}
function hide_card_list(id) {
- document.getElementById(id).classList.add("hide");
+ document.getElementById(id).classList.add("hide")
}
function on_reply(q, params) {
if (q === 'supply')
- show_supply(params);
+ show_supply(params)
if (q === 'discard')
- show_card_list("discard", params);
+ show_card_list("discard", params)
if (q === 'removed')
- show_card_list("removed", params);
+ show_card_list("removed", params)
}
let ui = {
@@ -430,250 +430,250 @@ let markers = {
function toggle_counters() {
// Cycle between showing everything, only markers, and nothing.
if (ui.map.classList.contains("hide_markers")) {
- ui.map.classList.remove("hide_markers");
- ui.map.classList.remove("hide_pieces");
+ ui.map.classList.remove("hide_markers")
+ ui.map.classList.remove("hide_pieces")
} else if (ui.map.classList.contains("hide_pieces")) {
- ui.map.classList.add("hide_markers");
+ ui.map.classList.add("hide_markers")
} else {
- ui.map.classList.add("hide_pieces");
+ ui.map.classList.add("hide_pieces")
}
}
function for_each_piece_in_space(s, fun) {
for (let p = 1; p < pieces.length; ++p)
if (abs(view.location[p]) === s)
- fun(p);
+ fun(p)
}
// TOOLTIPS
function on_click_space(evt) {
if (evt.button === 0) {
- hide_supply();
+ hide_supply()
if (view.actions && view.actions.space && view.actions.space.includes(evt.target.space)) {
- event.stopPropagation();
- send_action('space', evt.target.space);
+ event.stopPropagation()
+ send_action('space', evt.target.space)
}
}
}
-const montcalm_and_co = [ "Montcalm", "Bougainville", "Lévis" ];
-const wolfe_and_co = [ "Amherst", "Forbes", "Wolfe" ];
+const montcalm_and_co = [ "Montcalm", "Bougainville", "Lévis" ]
+const wolfe_and_co = [ "Amherst", "Forbes", "Wolfe" ]
function is_leader_dead(p) {
- let s = abs(view.location[p]);
+ let s = abs(view.location[p])
if (s)
- return false;
+ return false
if (view.british.pool.includes(p))
- return false;
+ return false
if (view.events.once_french_regulars && montcalm_and_co.includes(pieces[p].name))
- return false;
+ return false
if (wolfe_and_co.includes(pieces[p].name))
- return view.events.pitt || view.year >= 1759;
- return true;
+ return view.events.pitt || view.year >= 1759
+ return true
}
function is_leader_in_pool(p) {
- return view.british.pool.includes(p);
+ return view.british.pool.includes(p)
}
function is_leader_unavailable(p) {
- let s = view.location[p];
+ let s = view.location[p]
if (s)
- return false;
- return !is_leader_in_pool(p) && !is_leader_dead(p);
+ return false
+ return !is_leader_in_pool(p) && !is_leader_dead(p)
}
function on_focus_space(evt) {
- let id = evt.target.space;
- let space = spaces[id];
- let text = space.name;
+ let id = evt.target.space
+ let space = spaces[id]
+ let text = space.name
if (space.type === 'leader-box') {
if (view) {
- let p = space.leader;
- let s = abs(view.location[p]);
+ let p = space.leader
+ let s = abs(view.location[p])
if (!s) {
if (is_leader_dead(p))
- text += " (eliminated)";
+ text += " (eliminated)"
else if (is_leader_in_pool(p))
- text += " (pool)";
+ text += " (pool)"
else
- text += " (unavailable)";
+ text += " (unavailable)"
} else {
- text += " (" + spaces[s].name + ")";
+ text += " (" + spaces[s].name + ")"
}
}
} else if (space.type === 'militia-box') {
//
} else {
- let list = [];
+ let list = []
if (space.type !== 'box')
- list.push(space.type);
+ list.push(space.type)
if (space.is_port)
- list.push("port");
+ list.push("port")
if (space.is_fortress)
- list.push("fortress");
+ list.push("fortress")
if (space.department) {
if (space.department === 'st_lawrence')
list.push("st. lawrence department")
else
- list.push(space.department + " department");
+ list.push(space.department + " department")
}
if (list.length > 0)
- text += " (" + list.join(", ") + ")";
+ text += " (" + list.join(", ") + ")"
}
- ui.status.textContent = text;
+ ui.status.textContent = text
if (DEBUG_CONNECTIONS) {
- space.element.classList.add('highlight');
- space.land.forEach(n => spaces[n].element.classList.add('highlight'));
- space.river.forEach(n => spaces[n].element.classList.add('highlight'));
- space.lakeshore.forEach(n => spaces[n].element.classList.add('highlight'));
+ space.element.classList.add('highlight')
+ space.land.forEach(n => spaces[n].element.classList.add('highlight'))
+ space.river.forEach(n => spaces[n].element.classList.add('highlight'))
+ space.lakeshore.forEach(n => spaces[n].element.classList.add('highlight'))
}
}
function on_blur_space(evt) {
- let id = evt.target.space;
- ui.status.textContent = "";
+ let id = evt.target.space
+ ui.status.textContent = ""
if (DEBUG_CONNECTIONS) {
- spaces.forEach(n => n.element && n.element.classList.remove('highlight'));
+ spaces.forEach(n => n.element && n.element.classList.remove('highlight'))
}
}
function stack_piece_count(stack) {
- let n = 0;
+ let n = 0
for (let i = 0; i < stack.length; ++i)
if (stack[i][0] > 0)
- ++n;
- return n;
+ ++n
+ return n
}
function blur_stack() {
if (focus !== null) {
- // console.log("BLUR STACK");
- focus = null;
+ // console.log("BLUR STACK")
+ focus = null
}
- update_map();
+ update_map()
}
function is_small_stack(stk) {
- return stk.length <= 1 || (stack_piece_count(stk) === 1 && stk.length <= 2);
+ return stk.length <= 1 || (stack_piece_count(stk) === 1 && stk.length <= 2)
}
function focus_stack(stack) {
if (focus !== stack) {
- // console.log("FOCUS STACK", stack ? stack.name : "null");
- focus = stack;
- update_map();
- return is_small_stack(stack);
+ // console.log("FOCUS STACK", stack ? stack.name : "null")
+ focus = stack
+ update_map()
+ return is_small_stack(stack)
}
- return true;
+ return true
}
document.getElementById("map").addEventListener("mousedown", evt => {
if (evt.button === 0) {
- hide_supply();
- blur_stack();
+ hide_supply()
+ blur_stack()
}
-});
+})
function on_click_piece(evt) {
if (evt.button === 0) {
- hide_supply();
- event.stopPropagation();
+ hide_supply()
+ event.stopPropagation()
if (focus_stack(evt.target.my_stack)) {
- send_action('piece', evt.target.piece);
+ send_action('piece', evt.target.piece)
}
}
}
function on_click_marker(evt) {
if (evt.button === 0) {
- hide_supply();
- event.stopPropagation();
- focus_stack(evt.target.my_stack);
+ hide_supply()
+ event.stopPropagation()
+ focus_stack(evt.target.my_stack)
}
}
function on_focus_piece(evt) {
- let id = evt.target.piece;
- let piece = pieces[id];
- // evt.target.style.zIndex = 300;
+ let id = evt.target.piece
+ let piece = pieces[id]
+ // evt.target.style.zIndex = 300
if (view.reduced.includes(id))
- ui.status.textContent = piece.rdesc;
+ ui.status.textContent = piece.rdesc
else
- ui.status.textContent = piece.desc;
+ ui.status.textContent = piece.desc
if (mouse_focus)
- focus_stack(evt.target.my_stack);
+ focus_stack(evt.target.my_stack)
}
function on_blur_piece(evt) {
- let id = evt.target.piece;
- let piece = pieces[id];
- // evt.target.style.zIndex = piece.z;
- ui.status.textContent = "";
+ let id = evt.target.piece
+ let piece = pieces[id]
+ // evt.target.style.zIndex = piece.z
+ ui.status.textContent = ""
}
function on_focus_leader(evt) {
- let id = evt.target.piece;
- let piece = pieces[id];
- // evt.target.style.zIndex = 300;
- let str = force_strength(id);
+ let id = evt.target.piece
+ let piece = pieces[id]
+ // evt.target.style.zIndex = 300
+ let str = force_strength(id)
if (str > 0)
- ui.status.textContent = piece.desc + " (" + str + " strength)";
+ ui.status.textContent = piece.desc + " (" + str + " strength)"
else if (is_supreme_commander(id, evt.target.my_stack))
- ui.status.textContent = piece.desc + " (" + stack_strength(evt.target.my_stack) + " strength)";
+ ui.status.textContent = piece.desc + " (" + stack_strength(evt.target.my_stack) + " strength)"
else
- ui.status.textContent = piece.desc;
+ ui.status.textContent = piece.desc
if (mouse_focus)
- focus_stack(evt.target.my_stack);
+ focus_stack(evt.target.my_stack)
}
function on_blur_leader(evt) {
- let id = evt.target.piece;
- let piece = pieces[id];
- // evt.target.style.zIndex = piece.z;
- ui.status.textContent = "";
+ let id = evt.target.piece
+ let piece = pieces[id]
+ // evt.target.style.zIndex = piece.z
+ ui.status.textContent = ""
}
function is_fortification_marker(marker) {
- return marker.type === 'forts' || marker.type === 'forts_uc' || marker.type === 'stockades';
+ return marker.type === 'forts' || marker.type === 'forts_uc' || marker.type === 'stockades'
}
function is_allied_marker(marker) {
- return marker.type === 'allied';
+ return marker.type === 'allied'
}
function on_focus_marker(evt) {
- let marker = evt.target.marker;
- let space = spaces[marker.space_id];
- let name = marker.name;
+ let marker = evt.target.marker
+ let space = spaces[marker.space_id]
+ let name = marker.name
if (is_allied_marker(marker))
- name += " (" + INDIAN_ALLIED_NAMES[space.name] + ")";
+ name += " (" + INDIAN_ALLIED_NAMES[space.name] + ")"
if (is_fortification_marker(marker)) {
if (marker.faction === 'british' && space.name in BRITISH_FORT_NAMES)
- name += " (" + BRITISH_FORT_NAMES[space.name] + ")";
+ name += " (" + BRITISH_FORT_NAMES[space.name] + ")"
if (marker.faction === 'french' && space.name in FRENCH_FORT_NAMES)
- name += " (" + FRENCH_FORT_NAMES[space.name] + ")";
+ name += " (" + FRENCH_FORT_NAMES[space.name] + ")"
}
- ui.status.textContent = name;
+ ui.status.textContent = name
if (mouse_focus)
- focus_stack(evt.target.my_stack);
+ focus_stack(evt.target.my_stack)
}
function on_blur_marker(evt) {
- let marker = evt.target.marker;
- ui.status.textContent = "";
+ let marker = evt.target.marker
+ ui.status.textContent = ""
}
function on_focus_card(evt) {
- let id = evt.target.card;
- let card = cards[id];
- ui.status.textContent = `#${id} ${card.name} [${card.activation}]`;
+ let id = evt.target.card
+ let card = cards[id]
+ ui.status.textContent = `#${id} ${card.name} [${card.activation}]`
}
function on_blur_card(evt) {
- ui.status.textContent = "";
+ ui.status.textContent = ""
}
// CARD MENU
@@ -685,189 +685,189 @@ const card_action_menu = [
'construct_stockades',
'construct_forts',
'discard',
-];
+]
-let current_popup_card = 0;
+let current_popup_card = 0
function show_popup_menu(evt, list) {
- document.querySelectorAll("#popup div").forEach(e => e.classList.remove('enabled'));
+ document.querySelectorAll("#popup div").forEach(e => e.classList.remove('enabled'))
for (let item of list) {
- let e = document.getElementById("menu_" + item);
- e.classList.add('enabled');
+ let e = document.getElementById("menu_" + item)
+ e.classList.add('enabled')
}
- let popup = document.getElementById("popup");
- popup.style.display = 'block';
- popup.style.left = (evt.clientX-50) + "px";
- popup.style.top = (evt.clientY-12) + "px";
- cards[current_popup_card].element.classList.add("selected");
+ let popup = document.getElementById("popup")
+ popup.style.display = 'block'
+ popup.style.left = (evt.clientX-50) + "px"
+ popup.style.top = (evt.clientY-12) + "px"
+ cards[current_popup_card].element.classList.add("selected")
}
function hide_popup_menu() {
- let popup = document.getElementById("popup");
- popup.style.display = 'none';
+ let popup = document.getElementById("popup")
+ popup.style.display = 'none'
if (current_popup_card) {
- cards[current_popup_card].element.classList.remove("selected");
- current_popup_card = 0;
+ cards[current_popup_card].element.classList.remove("selected")
+ current_popup_card = 0
}
}
function is_card_enabled(card) {
if (view.actions) {
if (card_action_menu.some(a => view.actions[a] && view.actions[a].includes(card)))
- return true;
+ return true
if (view.actions.card && view.actions.card.includes(card))
- return true;
+ return true
}
- return false;
+ return false
}
function is_card_action(action, card) {
- return view.actions && view.actions[action] && view.actions[action].includes(card);
+ return view.actions && view.actions[action] && view.actions[action].includes(card)
}
function on_click_card(evt) {
- let card = evt.target.card;
+ let card = evt.target.card
if (is_card_action('card', card)) {
- send_action('card', card);
+ send_action('card', card)
} else {
- let menu = card_action_menu.filter(a => is_card_action(a, card));
+ let menu = card_action_menu.filter(a => is_card_action(a, card))
if (menu.length > 0) {
- current_popup_card = card;
- show_popup_menu(evt, menu);
+ current_popup_card = card
+ show_popup_menu(evt, menu)
}
}
}
function on_play_event() {
- send_action('play_event', current_popup_card);
- hide_popup_menu();
+ send_action('play_event', current_popup_card)
+ hide_popup_menu()
}
function on_activate_force() {
- send_action('activate_force', current_popup_card);
- hide_popup_menu();
+ send_action('activate_force', current_popup_card)
+ hide_popup_menu()
}
function on_activate_individually() {
- send_action('activate_individually', current_popup_card);
- hide_popup_menu();
+ send_action('activate_individually', current_popup_card)
+ hide_popup_menu()
}
function on_construct_stockades() {
- send_action('construct_stockades', current_popup_card);
- hide_popup_menu();
+ send_action('construct_stockades', current_popup_card)
+ hide_popup_menu()
}
function on_construct_forts() {
- send_action('construct_forts', current_popup_card);
- hide_popup_menu();
+ send_action('construct_forts', current_popup_card)
+ hide_popup_menu()
}
function on_discard() {
- send_action('discard', current_popup_card);
- hide_popup_menu();
+ send_action('discard', current_popup_card)
+ hide_popup_menu()
}
// BUILD UI
function build_siege_marker(space_id) {
- let list = markers.sieges;
- let marker = list.find(e => e.space_id === space_id);
+ let list = markers.sieges
+ let marker = list.find(e => e.space_id === space_id)
if (marker)
- return marker;
- marker = { space_id: space_id, name: "Siege", type: "Siege", element: null, level: 0 };
- let elt = marker.element = document.createElement("div");
- elt.marker = marker;
- elt.className = SIEGE_MARKER[marker.level];
- elt.addEventListener("mousedown", on_click_marker);
- elt.addEventListener("mouseenter", on_focus_marker);
- elt.addEventListener("mouseleave", on_blur_marker);
- elt.my_size = 36;
- list.push(marker);
- ui.markers.appendChild(elt);
- return marker;
+ return marker
+ marker = { space_id: space_id, name: "Siege", type: "Siege", element: null, level: 0 }
+ let elt = marker.element = document.createElement("div")
+ elt.marker = marker
+ elt.className = SIEGE_MARKER[marker.level]
+ elt.addEventListener("mousedown", on_click_marker)
+ elt.addEventListener("mouseenter", on_focus_marker)
+ elt.addEventListener("mouseleave", on_blur_marker)
+ elt.my_size = 36
+ list.push(marker)
+ ui.markers.appendChild(elt)
+ return marker
}
function update_siege_marker(space_id, level) {
- let marker = build_siege_marker(space_id);
- marker.level = level;
- marker.element.className = SIEGE_MARKER[marker.level];
- return marker.element;
+ let marker = build_siege_marker(space_id)
+ marker.level = level
+ marker.element.className = SIEGE_MARKER[marker.level]
+ return marker.element
}
function destroy_siege_marker(space_id) {
- let list = markers.sieges;
- let ix = list.findIndex(e => e.space_id === space_id);
+ let list = markers.sieges
+ let ix = list.findIndex(e => e.space_id === space_id)
if (ix >= 0) {
- list[ix].element.remove();
- list.splice(ix, 1);
+ list[ix].element.remove()
+ list.splice(ix, 1)
}
}
function build_fieldworks_marker(space_id) {
- let list = markers.fieldworks;
- let marker = list.find(e => e.space_id === space_id);
+ let list = markers.fieldworks
+ let marker = list.find(e => e.space_id === space_id)
if (marker)
- return marker.element;
- marker = { space_id: space_id, name: "Fieldworks", type: "Fieldworks", element: null };
- let elt = marker.element = document.createElement("div");
- elt.marker = marker;
- elt.className = FIELDWORKS_MARKER;
- elt.addEventListener("mousedown", on_click_marker);
- elt.addEventListener("mouseenter", on_focus_marker);
- elt.addEventListener("mouseleave", on_blur_marker);
- elt.my_size = 45;
- list.push(marker);
- ui.markers.appendChild(elt);
- return marker.element;
+ return marker.element
+ marker = { space_id: space_id, name: "Fieldworks", type: "Fieldworks", element: null }
+ let elt = marker.element = document.createElement("div")
+ elt.marker = marker
+ elt.className = FIELDWORKS_MARKER
+ elt.addEventListener("mousedown", on_click_marker)
+ elt.addEventListener("mouseenter", on_focus_marker)
+ elt.addEventListener("mouseleave", on_blur_marker)
+ elt.my_size = 45
+ list.push(marker)
+ ui.markers.appendChild(elt)
+ return marker.element
}
function destroy_fieldworks_marker(space_id) {
- let list = markers.fieldworks;
- let ix = list.findIndex(e => e.space_id === space_id);
+ let list = markers.fieldworks
+ let ix = list.findIndex(e => e.space_id === space_id)
if (ix >= 0) {
- list[ix].element.remove();
- list.splice(ix, 1);
+ list[ix].element.remove()
+ list.splice(ix, 1)
}
}
function build_faction_marker(space_id, faction, what) {
- let list = markers[faction][what];
- let marker = list.find(e => e.space_id === space_id);
+ let list = markers[faction][what]
+ let marker = list.find(e => e.space_id === space_id)
if (marker)
- return marker.element;
- marker = { space_id: space_id, name: marker_info[faction][what].name, faction: faction, type: what, element: null };
- let elt = marker.element = document.createElement("div");
- elt.marker = marker;
- elt.className = marker_info[faction][what].counter;
- elt.addEventListener("mousedown", on_click_marker);
- elt.addEventListener("mouseenter", on_focus_marker);
- elt.addEventListener("mouseleave", on_blur_marker);
+ return marker.element
+ marker = { space_id: space_id, name: marker_info[faction][what].name, faction: faction, type: what, element: null }
+ let elt = marker.element = document.createElement("div")
+ elt.marker = marker
+ elt.className = marker_info[faction][what].counter
+ elt.addEventListener("mousedown", on_click_marker)
+ elt.addEventListener("mouseenter", on_focus_marker)
+ elt.addEventListener("mouseleave", on_blur_marker)
if (what === 'raids')
- elt.my_size = 36;
+ elt.my_size = 36
else
- elt.my_size = 45;
- list.push(marker);
- ui.markers.appendChild(elt);
- return marker.element;
+ elt.my_size = 45
+ list.push(marker)
+ ui.markers.appendChild(elt)
+ return marker.element
}
function destroy_faction_marker(space_id, faction, what) {
- let list = markers[faction][what];
- let ix = list.findIndex(e => e.space_id === space_id);
+ let list = markers[faction][what]
+ let ix = list.findIndex(e => e.space_id === space_id)
if (ix >= 0) {
- list[ix].element.remove();
- list.splice(ix, 1);
+ list[ix].element.remove()
+ list.splice(ix, 1)
}
}
function build_space(id) {
- let space = spaces[id];
+ let space = spaces[id]
/* Make space for border */
- let x = space.x;
- let y = space.y;
- let w = space.w;
- let h = space.h;
+ let x = space.x
+ let y = space.y
+ let w = space.w
+ let h = space.h
if (space.type === 'box') { x -= 1; y -= 1; w -= 9; h -= 9; }
if (space.type === 'militia-box') { x -= 1; y -= 1; w -= 9; h -= 9; }
@@ -875,82 +875,82 @@ function build_space(id) {
if (space.type === 'wilderness') { x -= 1; y -= 1; w -= 9; h -= 9; }
if (space.type === 'leader-box') { x -= 1; y -= 1; w -= 9; h -= 9; }
- space.fstack = [];
- space.fstack.name = spaces[id].name + "/french";
- space.bstack = [];
- space.bstack.name = spaces[id].name + "/british";
-
- let elt = space.element = document.createElement("div");
- elt.space = id;
- elt.className = space.type;
- elt.style.left = x + "px";
- elt.style.top = y + "px";
- elt.style.width = w + "px";
- elt.style.height = h + "px";
- elt.addEventListener("mousedown", on_click_space);
- elt.addEventListener("mouseenter", on_focus_space);
- elt.addEventListener("mouseleave", on_blur_space);
+ space.fstack = []
+ space.fstack.name = spaces[id].name + "/french"
+ space.bstack = []
+ space.bstack.name = spaces[id].name + "/british"
+
+ let elt = space.element = document.createElement("div")
+ elt.space = id
+ elt.className = space.type
+ elt.style.left = x + "px"
+ elt.style.top = y + "px"
+ elt.style.width = w + "px"
+ elt.style.height = h + "px"
+ elt.addEventListener("mousedown", on_click_space)
+ elt.addEventListener("mouseenter", on_focus_space)
+ elt.addEventListener("mouseleave", on_blur_space)
if (space.type === 'leader-box')
- elt.classList.add(pieces[box_leader(id)].faction);
+ elt.classList.add(pieces[box_leader(id)].faction)
- ui.spaces.appendChild(elt);
+ ui.spaces.appendChild(elt)
}
function build_leader(id) {
- let leader = pieces[id];
- let elt = leader.element = document.createElement("div");
- elt.piece = id;
- elt.className = "offmap leader " + leader.faction + " " + leader.square;
- elt.addEventListener("mousedown", on_click_piece);
- elt.addEventListener("mouseenter", on_focus_leader);
- elt.addEventListener("mouseleave", on_blur_leader);
- ui.pieces.insertBefore(elt, ui.pieces.firstChild);
+ let leader = pieces[id]
+ let elt = leader.element = document.createElement("div")
+ elt.piece = id
+ elt.className = "offmap leader " + leader.faction + " " + leader.square
+ elt.addEventListener("mousedown", on_click_piece)
+ elt.addEventListener("mouseenter", on_focus_leader)
+ elt.addEventListener("mouseleave", on_blur_leader)
+ ui.pieces.insertBefore(elt, ui.pieces.firstChild)
}
function build_unit(id) {
- let unit = pieces[id];
- let elt = unit.element = document.createElement("div");
- elt.piece = id;
- elt.className = "offmap unit " + unit.faction + " " + unit.counter;
- elt.addEventListener("mousedown", on_click_piece);
- elt.addEventListener("mouseenter", on_focus_piece);
- elt.addEventListener("mouseleave", on_blur_piece);
- ui.pieces.insertBefore(elt, ui.pieces.firstChild);
+ let unit = pieces[id]
+ let elt = unit.element = document.createElement("div")
+ elt.piece = id
+ elt.className = "offmap unit " + unit.faction + " " + unit.counter
+ elt.addEventListener("mousedown", on_click_piece)
+ elt.addEventListener("mouseenter", on_focus_piece)
+ elt.addEventListener("mouseleave", on_blur_piece)
+ ui.pieces.insertBefore(elt, ui.pieces.firstChild)
}
function build_card(id) {
- let card = cards[id];
- let elt = card.element = document.createElement("div");
- elt.card = id;
- elt.className = "card card_" + id;
- elt.addEventListener("click", on_click_card);
- elt.addEventListener("mouseenter", on_focus_card);
- elt.addEventListener("mouseleave", on_blur_card);
- ui.cards.appendChild(elt);
+ let card = cards[id]
+ let elt = card.element = document.createElement("div")
+ elt.card = id
+ elt.className = "card card_" + id
+ elt.addEventListener("click", on_click_card)
+ elt.addEventListener("mouseenter", on_focus_card)
+ elt.addEventListener("mouseleave", on_blur_card)
+ ui.cards.appendChild(elt)
}
for (let c = 1; c < cards.length; ++c)
- build_card(c);
+ build_card(c)
for (let s = 1; s < spaces.length; ++s)
- build_space(s);
+ build_space(s)
for (let p = 0; p < pieces.length; ++p)
if (pieces[p].type === 'leader')
- build_leader(p);
+ build_leader(p)
else
- build_unit(p);
+ build_unit(p)
-document.getElementById("last_card").addEventListener("mouseenter", on_focus_last_card);
-document.getElementById("last_card").addEventListener("mouseleave", on_blur_last_card);
+document.getElementById("last_card").addEventListener("mouseenter", on_focus_last_card)
+document.getElementById("last_card").addEventListener("mouseleave", on_blur_last_card)
// UPDATE UI
function is_action_piece(p) {
if (view.actions && view.actions.piece && view.actions.piece.includes(p))
- return true;
+ return true
if (view.who === p)
- return true;
- return false;
+ return true
+ return false
}
const indian_homes = {
@@ -977,15 +977,15 @@ const indian_homes = {
function is_different_piece(a, b) {
if (a > 0 && b > 0) {
if (pieces[a].type !== pieces[b].type)
- return true;
+ return true
if (pieces[a].type === 'indian')
if (indian_homes[pieces[a].name] !== indian_homes[pieces[a].name])
- return true;
+ return true
if (view.reduced.includes(a) !== view.reduced.includes(b))
- return true;
- return false;
+ return true
+ return false
}
- return true;
+ return true
}
const style_dims = {
@@ -1005,144 +1005,144 @@ const style_dims = {
},
}
-const MINX = 15;
-const MINY = 15;
-const MAXX = 2550 - 15;
+const MINX = 15
+const MINY = 15
+const MAXX = 2550 - 15
// TODO: two or more columns/rows if too many pieces in stack
// TODO: separate layout for leader and militia boxes
function layout_stack(stack, x, y, dx) {
- let dim = style_dims[style];
- let z = (stack === focus) ? 101 : 1;
+ let dim = style_dims[style]
+ let z = (stack === focus) ? 101 : 1
- let n = stack.length;
- if (n > 32) n = Math.ceil(n / 4);
- else if (n > 24) n = Math.ceil(n / 3);
- else if (n > 10) n = Math.ceil(n / 2);
- let m = Math.ceil(stack.length / n);
+ let n = stack.length
+ if (n > 32) n = Math.ceil(n / 4)
+ else if (n > 24) n = Math.ceil(n / 3)
+ else if (n > 10) n = Math.ceil(n / 2)
+ let m = Math.ceil(stack.length / n)
// Lose focus if stack is small.
if (stack === focus && is_small_stack(stack))
- focus = null;
+ focus = null
if (stack === focus) {
- let w, h;
+ let w, h
if (layout === 0) {
- h = (dim.width + dim.gap) * (n-1);
+ h = (dim.width + dim.gap) * (n-1)
w = (dim.width + dim.gap) * (m-1)
}
if (layout === 1) {
- h = (dim.width + dim.gap) * (m-1);
- w = (dim.width + dim.gap) * (n-1);
+ h = (dim.width + dim.gap) * (m-1)
+ w = (dim.width + dim.gap) * (n-1)
}
if (y - h < MINY)
- y = h + MINY;
- focus_box.style.top = (y-h-dim.focus_margin) + "px";
+ y = h + MINY
+ focus_box.style.top = (y-h-dim.focus_margin) + "px"
if (dx > 0) {
if (x + w > MAXX - dim.width)
- x = MAXX - dim.width - w;
- focus_box.style.left = (x-dim.focus_margin) + "px";
+ x = MAXX - dim.width - w
+ focus_box.style.left = (x-dim.focus_margin) + "px"
} else {
if (x - w < MINX)
- x = w + MINX;
- focus_box.style.left = (x-w-dim.focus_margin) + "px";
+ x = w + MINX
+ focus_box.style.left = (x-w-dim.focus_margin) + "px"
}
- focus_box.style.width = (w+dim.width + 2*dim.focus_margin) + "px";
- focus_box.style.height = (h+dim.width + 2*dim.focus_margin) + "px";
+ focus_box.style.width = (w+dim.width + 2*dim.focus_margin) + "px"
+ focus_box.style.height = (h+dim.width + 2*dim.focus_margin) + "px"
}
- let start_x = x;
- let start_y = y;
+ let start_x = x
+ let start_y = y
for (let i = stack.length-1; i >= 0; --i, ++z) {
- let ii = stack.length - i;
- let [p, elt] = stack[i];
- let next_p = i > 0 ? stack[i-1][0] : 0;
+ let ii = stack.length - i
+ let [p, elt] = stack[i]
+ let next_p = i > 0 ? stack[i-1][0] : 0
if (layout === 2 && stack === focus) {
- if (y < MINY) y = MINY;
- if (x < MINX) x = MINX;
- if (x > MAXX - dim.width) x = MAXX - dim.width ;
+ if (y < MINY) y = MINY
+ if (x < MINX) x = MINX
+ if (x > MAXX - dim.width) x = MAXX - dim.width
}
- let ex = x;
- let ey = y;
+ let ex = x
+ let ey = y
if (p > 0) {
if (is_auxiliary(p)) {
- ex -= 2;
- ey -= 2;
+ ex -= 2
+ ey -= 2
}
} else {
- ex += Math.floor((45-elt.my_size) / 2);
- ey += Math.floor((45-elt.my_size) / 2);
+ ex += Math.floor((45-elt.my_size) / 2)
+ ey += Math.floor((45-elt.my_size) / 2)
}
- elt.style.left = Math.round(ex) + "px";
- elt.style.top = Math.round(ey) + "px";
- elt.style.zIndex = z;
+ elt.style.left = Math.round(ex) + "px"
+ elt.style.top = Math.round(ey) + "px"
+ elt.style.zIndex = z
if (p > 0)
- pieces[p].z = z;
+ pieces[p].z = z
if (stack === focus || is_small_stack(stack)) {
switch (layout) {
case 2: // Diagonal
if (y <= MINY + 25) {
- x -= (dim.width + dim.gap);
- y = MINY;
- continue;
+ x -= (dim.width + dim.gap)
+ y = MINY
+ continue
}
if (x <= MINX + 25) {
- y -= (dim.width + dim.gap);
- x = MINX;
- continue;
+ y -= (dim.width + dim.gap)
+ x = MINX
+ continue
}
if (x >= MAXX - dim.width - 25) {
- y -= (dim.width + dim.gap);
- x = MAXX - dim.width;
- continue;
+ y -= (dim.width + dim.gap)
+ x = MAXX - dim.width
+ continue
}
if (p > 0) {
if (is_leader(p)) {
- x += 20;
- y -= 20;
+ x += 20
+ y -= 20
} else if (is_indian(p)) {
- x -= 20;
+ x -= 20
// show stripe
if (style === 'bevel')
- y -= 28;
+ y -= 28
else
- y -= 26;
+ y -= 26
} else if (is_auxiliary(p)) {
- x -= 20;
- y -= 20;
+ x -= 20
+ y -= 20
} else {
- x += dx * 20;
- y -= 20;
+ x += dx * 20
+ y -= 20
}
} else {
- x += dx * 15;
- y -= 15;
+ x += dx * 15
+ y -= 15
}
- break;
+ break
case 0: // Vertical
- x = start_x + dx * (dim.width + dim.gap) * Math.floor(ii / n);
- y = start_y - (dim.width + dim.gap) * (ii % n);
- break;
+ x = start_x + dx * (dim.width + dim.gap) * Math.floor(ii / n)
+ y = start_y - (dim.width + dim.gap) * (ii % n)
+ break
case 1: // Horizontal
- x = start_x + dx * (dim.width + dim.gap) * (ii % n);
- y = start_y - (dim.width + dim.gap) * Math.floor(ii / n);
- break;
+ x = start_x + dx * (dim.width + dim.gap) * (ii % n)
+ y = start_y - (dim.width + dim.gap) * Math.floor(ii / n)
+ break
}
} else {
for (let k = 0; k <= dim.offset.length; ++k) {
if (stack.length > dim.thresh[k]) {
- x += dx * dim.offset[k];
- y -= dim.offset[k];
- break;
+ x += dx * dim.offset[k]
+ y -= dim.offset[k]
+ break
}
}
}
@@ -1150,317 +1150,323 @@ function layout_stack(stack, x, y, dx) {
}
function push_stack(stk, pc, elt) {
- stk.push([pc, elt]);
- elt.my_stack = stk;
+ stk.push([pc, elt])
+ elt.my_stack = stk
}
function unshift_stack(stk, pc, elt) {
- stk.unshift([pc, elt]);
- elt.my_stack = stk;
+ stk.unshift([pc, elt])
+ elt.my_stack = stk
}
function update_space(s) {
- let dim = style_dims[style];
- let space = spaces[s];
- let fstack = space.fstack;
- let bstack = space.bstack;
+ let dim = style_dims[style]
+ let space = spaces[s]
+ let fstack = space.fstack
+ let bstack = space.bstack
- fstack.length = 0;
- bstack.length = 0;
+ fstack.length = 0
+ bstack.length = 0
- let sx = space.x + Math.round(space.w/2) - 24;
- let sy = space.y + Math.round(space.h/2) - 24;
+ let sx = space.x + Math.round(space.w/2) - 24
+ let sy = space.y + Math.round(space.h/2) - 24
if (space.type !== 'box' && space.type !== 'militia-box' && space.type !== 'leader-box')
sy += 12; // make room for label
if (space.type === 'leader-box')
- sy = space.y + space.h - 55;
+ sy = space.y + space.h - 55
function marker(type) {
if (view.british[type].includes(s))
- push_stack(bstack, 0, build_faction_marker(s, 'british', type));
+ push_stack(bstack, 0, build_faction_marker(s, 'british', type))
else
- destroy_faction_marker(s, 'british', type);
+ destroy_faction_marker(s, 'british', type)
if (view.french[type].includes(s))
- push_stack(fstack, 0, build_faction_marker(s, 'french', type));
+ push_stack(fstack, 0, build_faction_marker(s, 'french', type))
else
- destroy_faction_marker(s, 'french', type);
+ destroy_faction_marker(s, 'french', type)
}
if (s in view.sieges) {
if (view.british.fortresses.includes(s) || view.british.forts.includes(s))
- push_stack(bstack, 0, update_siege_marker(s, view.sieges[s]));
+ push_stack(bstack, 0, update_siege_marker(s, view.sieges[s]))
else
- push_stack(fstack, 0, update_siege_marker(s, view.sieges[s]));
+ push_stack(fstack, 0, update_siege_marker(s, view.sieges[s]))
} else {
- destroy_siege_marker(s);
+ destroy_siege_marker(s)
}
marker("raids"); // TODO: more than one raid marker?
for_each_piece_in_space(s, p => {
if (view.location[p] >= 0) {
- let pe = pieces[p].element;
- pe.classList.remove('offmap');
- pe.classList.remove("inside");
+ let pe = pieces[p].element
+ pe.classList.remove('offmap')
+ pe.classList.remove("inside")
if (view.reduced.includes(p))
- pe.classList.add("reduced");
+ pe.classList.add("reduced")
else
- pe.classList.remove("reduced");
+ pe.classList.remove("reduced")
if (pieces[p].faction === 'british')
- push_stack(bstack, p, pe);
+ push_stack(bstack, p, pe)
else
- push_stack(fstack, p, pe);
+ push_stack(fstack, p, pe)
}
- });
+ })
- marker("stockades");
- marker("forts");
- marker("forts_uc");
- marker("allied");
+ marker("stockades")
+ marker("forts")
+ marker("forts_uc")
+ marker("allied")
for_each_piece_in_space(s, p => {
if (view.location[p] < 0) {
- let pe = pieces[p].element;
- pe.classList.remove('offmap');
- pe.classList.add("inside");
+ let pe = pieces[p].element
+ pe.classList.remove('offmap')
+ pe.classList.add("inside")
if (view.reduced.includes(p))
- pe.classList.add("reduced");
+ pe.classList.add("reduced")
else
- pe.classList.remove("reduced");
+ pe.classList.remove("reduced")
if (pieces[p].faction === 'british')
- push_stack(bstack, p, pe);
+ push_stack(bstack, p, pe)
else
- push_stack(fstack, p, pe);
+ push_stack(fstack, p, pe)
}
- });
+ })
if (view.amphib.includes(s))
- push_stack(bstack, 0, build_faction_marker(s, 'british', 'amphib'));
+ push_stack(bstack, 0, build_faction_marker(s, 'british', 'amphib'))
else
- destroy_faction_marker(s, 'british', 'amphib');
+ destroy_faction_marker(s, 'british', 'amphib')
- let fw = null;
+ let fw = null
if (view.fieldworks.includes(s)) {
- fw = build_fieldworks_marker(s);
- fw.my_stack = null;
+ fw = build_fieldworks_marker(s)
+ fw.my_stack = null
} else {
- destroy_fieldworks_marker(s);
+ destroy_fieldworks_marker(s)
}
if (fstack.length > 0 && bstack.length > 0) {
- layout_stack(bstack, sx - 27, sy, -1);
- layout_stack(fstack, sx + 27, sy, 1);
+ layout_stack(bstack, sx - 27, sy, -1)
+ layout_stack(fstack, sx + 27, sy, 1)
if (fw) {
- fw.style.left = (sx) + "px";
- fw.style.top = (sy - dim.width-5) + "px";
+ fw.style.left = (sx) + "px"
+ fw.style.top = (sy - dim.width-5) + "px"
}
} else {
if (fstack.length > 0) {
- if (fw) unshift_stack(fstack, 0, fw);
- layout_stack(fstack, sx, sy, 1);
+ if (fw) unshift_stack(fstack, 0, fw)
+ layout_stack(fstack, sx, sy, 1)
}
if (bstack.length > 0) {
- if (fw) unshift_stack(bstack, 0, fw);
- layout_stack(bstack, sx, sy, -1);
+ if (fw) unshift_stack(bstack, 0, fw)
+ layout_stack(bstack, sx, sy, -1)
}
if (fw && fstack.length === 0 && bstack.length === 0) {
- fw.style.left = sx + "px";
- fw.style.top = sy + "px";
+ fw.style.left = sx + "px"
+ fw.style.top = sy + "px"
}
}
if (s >= first_leader_box && s <= last_leader_box) {
- let p = box_leader(s);
- space.element.classList.toggle("dead", is_leader_dead(p));
- space.element.classList.toggle("pool", is_leader_in_pool(p));
- space.element.classList.toggle("unavailable", is_leader_unavailable(p));
+ let p = box_leader(s)
+ space.element.classList.toggle("dead", is_leader_dead(p))
+ space.element.classList.toggle("pool", is_leader_in_pool(p))
+ space.element.classList.toggle("unavailable", is_leader_unavailable(p))
}
if (view.actions && view.actions.space && view.actions.space.includes(s))
- space.element.classList.add("highlight");
+ space.element.classList.add("highlight")
else
- space.element.classList.remove("highlight");
+ space.element.classList.remove("highlight")
if (view.where === s)
- space.element.classList.add("selected");
+ space.element.classList.add("selected")
else
- space.element.classList.remove("selected");
+ space.element.classList.remove("selected")
}
function update_card(id) {
- let card = cards[id];
+ let card = cards[id]
if (is_card_enabled(id))
- card.element.classList.add('enabled');
+ card.element.classList.add('enabled')
else
- card.element.classList.remove('enabled');
+ card.element.classList.remove('enabled')
if (view.actions && view.actions.card && view.actions.card.includes(id))
- card.element.classList.add('highlight');
+ card.element.classList.add('highlight')
else
- card.element.classList.remove('highlight');
+ card.element.classList.remove('highlight')
if (view.hand.includes(id))
- card.element.classList.add("show");
+ card.element.classList.add("show")
else
- card.element.classList.remove("show");
+ card.element.classList.remove("show")
}
function update_piece(id) {
- let piece = pieces[id];
+ let piece = pieces[id]
if (view.actions && view.actions.piece && view.actions.piece.includes(id))
- piece.element.classList.add('highlight');
+ piece.element.classList.add('highlight')
else
- piece.element.classList.remove('highlight');
+ piece.element.classList.remove('highlight')
if (view.activation && view.activation.includes(id))
- piece.element.classList.add('activated');
+ piece.element.classList.add('activated')
else
- piece.element.classList.remove('activated');
+ piece.element.classList.remove('activated')
if (view.who === id)
- piece.element.classList.add('selected');
+ piece.element.classList.add('selected')
else
- piece.element.classList.remove('selected');
+ piece.element.classList.remove('selected')
}
function event_marker(e) {
- let element = document.getElementById("event_" + e);
+ let element = document.getElementById("event_" + e)
if (view.events[e])
- element.classList.add("show");
+ element.classList.add("show")
else
- element.classList.remove("show");
+ element.classList.remove("show")
}
function toggle_marker(id, show) {
- let element = document.getElementById(id);
+ let element = document.getElementById(id)
if (show)
- element.classList.add("show");
+ element.classList.add("show")
else
- element.classList.remove("show");
+ element.classList.remove("show")
}
function update_map() {
if (!view)
- return;
+ return
// Hide Dead and unused pieces
- for_each_piece_in_space(0, p => pieces[p].element.classList.add('offmap'));
+ for_each_piece_in_space(0, p => pieces[p].element.classList.add('offmap'))
for (let i = 1; i < cards.length; ++i)
- update_card(i);
+ update_card(i)
for (let i = 1; i < spaces.length; ++i)
- update_space(i, false);
+ update_space(i, false)
for (let i = 0; i < pieces.length; ++i)
- update_piece(i);
+ update_piece(i)
if (focus && focus.length === 0)
- focus = null;
+ focus = null
if (focus === null || layout > 1)
- focus_box.className = "hide";
+ focus_box.className = "hide"
else
- focus_box.className = "show";
+ focus_box.className = "show"
- ui.last_card.className = "card show card_" + view.last_card;
+ ui.last_card.className = "card show card_" + view.last_card
- let sm = document.getElementById("season_marker");
+ let sm = document.getElementById("season_marker")
if (view.events.quiberon) {
if (view.season === EARLY)
- sm.className = SEASON_MARKER_BF + "early year_" + view.year;
+ sm.className = SEASON_MARKER_BF + "early year_" + view.year
else
- sm.className = SEASON_MARKER_BF + "late year_" + view.year;
+ sm.className = SEASON_MARKER_BF + "late year_" + view.year
} else {
if (view.season === EARLY)
- sm.className = SEASON_MARKER_FF + "early year_" + view.year;
+ sm.className = SEASON_MARKER_FF + "early year_" + view.year
else
- sm.className = SEASON_MARKER_FF + "late year_" + view.year;
+ sm.className = SEASON_MARKER_FF + "late year_" + view.year
}
- let vpm = document.getElementById("vp_marker");
+ let vpm = document.getElementById("vp_marker")
if (view.vp > 20)
- vpm.className = VP10_MARKER + "french_vp_10";
+ vpm.className = VP10_MARKER + "french_vp_10"
else if (view.vp > 10)
- vpm.className = VP10_MARKER + "french_vp_" + (view.vp-10);
+ vpm.className = VP10_MARKER + "french_vp_" + (view.vp-10)
else if (view.vp > 0)
- vpm.className = VP_MARKER + "french_vp_" + view.vp;
+ vpm.className = VP_MARKER + "french_vp_" + view.vp
else if (view.vp < -20)
- vpm.className = VP10_MARKER + "flip british_vp_10";
+ vpm.className = VP10_MARKER + "flip british_vp_10"
else if (view.vp < -10)
- vpm.className = VP10_MARKER + "flip british_vp_" + (-(view.vp+10));
+ vpm.className = VP10_MARKER + "flip british_vp_" + (-(view.vp+10))
else if (view.vp < 0)
- vpm.className = VP_MARKER + "british_vp_" + (-view.vp);
+ vpm.className = VP_MARKER + "british_vp_" + (-view.vp)
else
- vpm.className = VP_MARKER + "vp_0";
+ vpm.className = VP_MARKER + "vp_0"
- let pam = document.getElementById("pa_marker");
+ let pam = document.getElementById("pa_marker")
switch (view.pa) {
- case RELUCTANT: pam.className = PA_MARKER + "reluctant"; break;
- case SUPPORTIVE: pam.className = PA_MARKER + "supportive"; break;
- case ENTHUSIASTIC: pam.className = PA_MARKER + "enthusiastic"; break;
+ case RELUCTANT:
+ pam.className = PA_MARKER + "reluctant"
+ break
+ case SUPPORTIVE:
+ pam.className = PA_MARKER + "supportive"
+ break
+ case ENTHUSIASTIC:
+ pam.className = PA_MARKER + "enthusiastic"
+ break
}
- document.getElementById("british_hand").textContent = view.british.hand;
- document.getElementById("french_hand").textContent = view.french.hand;
- document.getElementById("deck_size").textContent = view.deck;
-
- toggle_marker("british_card_held", view.british.held);
- toggle_marker("french_card_held", view.french.held);
- event_marker("pitt");
- event_marker("diplo");
- event_marker("quiberon");
- event_marker("no_fr_naval");
- event_marker("no_amphib");
- event_marker("cherokees");
- event_marker("cherokee_uprising");
- toggle_marker("event_british_blockhouses", view.events.blockhouses === 'Britain');
- toggle_marker("event_french_blockhouses", view.events.blockhouses === 'France');
-
- let demo_fort = view.actions && "demolish_fort" in view.actions;
- let demo_stockade = view.actions && "demolish_stockade" in view.actions;
- let demo_fieldworks = view.actions && "demolish_fieldworks" in view.actions;
+ document.getElementById("british_hand").textContent = view.british.hand
+ document.getElementById("french_hand").textContent = view.french.hand
+ document.getElementById("deck_size").textContent = view.deck
+
+ toggle_marker("british_card_held", view.british.held)
+ toggle_marker("french_card_held", view.french.held)
+ event_marker("pitt")
+ event_marker("diplo")
+ event_marker("quiberon")
+ event_marker("no_fr_naval")
+ event_marker("no_amphib")
+ event_marker("cherokees")
+ event_marker("cherokee_uprising")
+ toggle_marker("event_british_blockhouses", view.events.blockhouses === 'Britain')
+ toggle_marker("event_french_blockhouses", view.events.blockhouses === 'France')
+
+ let demo_fort = view.actions && "demolish_fort" in view.actions
+ let demo_stockade = view.actions && "demolish_stockade" in view.actions
+ let demo_fieldworks = view.actions && "demolish_fieldworks" in view.actions
if (demo_fort || demo_stockade || demo_fieldworks) {
- document.getElementById("demolish_menu").classList.remove("hide");
- document.getElementById("demolish_fort").classList.toggle("hide", !demo_fort);
- document.getElementById("demolish_stockade").classList.toggle("hide", !demo_stockade);
- document.getElementById("demolish_fieldworks").classList.toggle("hide", !demo_fieldworks);
+ document.getElementById("demolish_menu").classList.remove("hide")
+ document.getElementById("demolish_fort").classList.toggle("hide", !demo_fort)
+ document.getElementById("demolish_stockade").classList.toggle("hide", !demo_stockade)
+ document.getElementById("demolish_fieldworks").classList.toggle("hide", !demo_fieldworks)
} else {
- document.getElementById("demolish_menu").classList.add("hide");
+ document.getElementById("demolish_menu").classList.add("hide")
}
- action_button("restore", "Restore");
- action_button("northern", "Northern");
- action_button("southern", "Southern");
- action_button("siege", "Siege");
- action_button("assault", "Assault");
- action_button("move", "Move");
- action_button("naval_move", "Naval");
- action_button("eliminate", "Eliminate");
- action_button("pick_up_all", "Pick up all");
- action_button("drop_off", "Drop off");
- action_button("intercept", "Intercept");
- action_button("avoid", "Avoid battle");
- action_button("exchange", "Exchange");
- action_button("stop", "Stop");
+ action_button("restore", "Restore")
+ action_button("northern", "Northern")
+ action_button("southern", "Southern")
+ action_button("siege", "Siege")
+ action_button("assault", "Assault")
+ action_button("move", "Move")
+ action_button("naval_move", "Naval")
+ action_button("eliminate", "Eliminate")
+ action_button("pick_up_all", "Pick up all")
+ action_button("drop_off", "Drop off")
+ action_button("intercept", "Intercept")
+ action_button("avoid", "Avoid battle")
+ action_button("exchange", "Exchange")
+ action_button("stop", "Stop")
confirm_action_button("pass_bh_season", "Pass season",
"PASS on playing \"Blockhouses\" for the rest of this SEASON?"
- );
+ )
confirm_action_button("pass_fw_season", "Pass season",
"PASS on playing \"Foul Weather\" for the rest of this SEASON?"
- );
+ )
confirm_action_button("pass_fw_action", "Pass action",
"PASS on playing \"Foul Weather\" for the rest of this ACTION PHASE?"
- );
+ )
- action_button("pass", "Pass");
- action_button("next", "Next");
- action_button("end_move", "End move");
- action_button("undo", "Undo");
+ action_button("pass", "Pass")
+ action_button("next", "Next")
+ action_button("end_move", "End move")
+ action_button("undo", "Undo")
}
function on_update() {
- hide_supply();
- update_map();
+ hide_supply()
+ update_map()
}
// INITIALIZE CLIENT
-drag_element_with_mouse("#removed", "#removed_header");
-drag_element_with_mouse("#discard", "#discard_header");
-scroll_with_middle_mouse("main");
+drag_element_with_mouse("#removed", "#removed_header")
+drag_element_with_mouse("#discard", "#discard_header")
+scroll_with_middle_mouse("main")