diff options
Diffstat (limited to 'play.js')
-rw-r--r-- | play.js | 705 |
1 files changed, 373 insertions, 332 deletions
@@ -1,19 +1,47 @@ -"use strict"; +"use strict" -const LANCASTER = "Lancaster"; -const YORK = "York"; -const REBEL = "Rebel"; +const LANCASTER = "Lancaster" +const YORK = "York" const ENEMY = { York: "Lancaster", Lancaster: "York" } -const POOL = "Pool"; -const DEAD = "Dead"; -const MINOR = "Minor"; - -const NOBODY = -1 const NOWHERE = 0 +const POOL = 1 +const MINOR = 2 -const KING_TEXT = "\u2756"; -const PRETENDER_TEXT = ""; +const L_POOL = area_index["LPool"] +const Y_POOL = area_index["YPool"] +const L_MINOR = area_index["LMinor"] +const Y_MINOR = area_index["YMinor"] + +const NOBODY = -1 +const B_YORK = block_index["York"] +const B_MARCH = block_index["March"] +const B_RUTLAND = block_index["Rutland"] +const B_CLARENCE_Y = block_index["Clarence/Y"] +const B_GLOUCESTER = block_index["Gloucester"] +const B_EXETER_Y = block_index["Exeter/Y"] +const B_WARWICK_Y = block_index["Warwick/Y"] +const B_KENT_Y = block_index["Kent/Y"] +const B_SALISBURY_Y = block_index["Salisbury/Y"] +const B_IRISH_MERCENARY = block_index["Irish Mercenary"] +const B_BURGUNDIAN_MERCENARY = block_index["Burgundian Mercenary"] +const B_CALAIS_MERCENARY = block_index["Calais Mercenary"] +const B_HENRY_VI = block_index["Henry VI"] +const B_PRINCE_EDWARD = block_index["Prince Edward"] +const B_EXETER_L = block_index["Exeter/L"] +const B_SOMERSET = block_index["Somerset"] +const B_RICHMOND = block_index["Richmond"] +const B_WARWICK_L = block_index["Warwick/L"] +const B_KENT_L = block_index["Kent/L"] +const B_SALISBURY_L = block_index["Salisbury/L"] +const B_CLARENCE_L = block_index["Clarence/L"] +const B_SCOTS_MERCENARY = block_index["Scots Mercenary"] +const B_WELSH_MERCENARY = block_index["Welsh Mercenary"] +const B_FRENCH_MERCENARY = block_index["French Mercenary"] +const B_REBEL = block_index["Rebel"] + +const KING_TEXT = "\u2756" +const PRETENDER_TEXT = "" const LONG_NAME = { "Somerset": "Duke of Somerset", @@ -49,7 +77,7 @@ const LONG_NAME = { } function toggle_blocks() { - document.getElementById("map").classList.toggle("hide_blocks"); + document.getElementById("map").classList.toggle("hide_blocks") } let ui = { @@ -62,6 +90,9 @@ let ui = { present: new Set(), } +for (let a of AREAS) + a.nbname = a.name.replace(/ /g, "\xa0") + function on_focus_space_tip(x) { ui.areas[x].classList.add("tip") } @@ -76,7 +107,7 @@ function on_click_space_tip(x) { function sub_space_name(match, p1, offset, string) { let x = p1 | 0 - let n = AREAS[x].name + let n = AREAS[x].nbname return `<span class="tip" onmouseenter="on_focus_space_tip(${x})" onmouseleave="on_blur_space_tip(${x})" onclick="on_click_space_tip(${x})">${n}</span>` } @@ -115,158 +146,158 @@ function on_log(text) { function is_known_block(b) { if (view.game_over && player === 'Observer') - return true; - return block_owner(b) === player; + return true + return block_owner(b) === player } function on_focus_area(evt) { - let where = evt.target.area; - let text = where; + let where = evt.target.area + let text = AREAS[where].name if (AREAS[where].city) - text += " (" + AREAS[where].city + ")"; + text += " (" + AREAS[where].city + ")" if (AREAS[where].crown) - text += " - Crown"; // " \u2655"; + text += " - Crown" // " \u2655" if (where === "South Yorks" || where === "Kent") - text += " - Church"; // " -" \u2657"; + text += " - Church" // " -" \u2657" if (AREAS[where].major_port) - text += " - Port"; + text += " - Port" if (AREAS[where].shields.length > 0) - text += " - " + AREAS[where].shields.join(", "); - document.getElementById("status").textContent = text; + text += " - " + AREAS[where].shields.join(", ") + document.getElementById("status").textContent = text } function on_blur_area(evt) { - document.getElementById("status").textContent = ""; + document.getElementById("status").textContent = "" } function on_click_area(evt) { - let where = evt.target.area; - send_action('area', where); + let where = evt.target.area + send_action('area', where) } -const STEP_TEXT = [ 0, "I", "II", "III", "IIII" ]; -const HEIR_TEXT = [ 0, '\u00b9', '\u00b2', '\u00b3', '\u2074', '\u2075' ]; +const STEP_TEXT = [ 0, "I", "II", "III", "IIII" ] +const HEIR_TEXT = [ 0, '\u00b9', '\u00b2', '\u00b3', '\u2074', '\u2075' ] function block_name(who) { - if (who === NOBODY) return "Nobody"; - let name = BLOCKS[who].name; - let long_name = LONG_NAME[name]; - return long_name ? long_name : name; + if (who === NOBODY) return "Nobody" + let name = BLOCKS[who].name + let long_name = LONG_NAME[name] + return long_name ? long_name : name } function block_owner(who) { - if (who === REBEL) { + if (who === B_REBEL) { if (view.pretender !== NOBODY) - return BLOCKS[view.pretender].owner; + return BLOCKS[view.pretender].owner if (view.king !== NOBODY) - return ENEMY[BLOCKS[view.king].owner]; - return YORK; + return ENEMY[BLOCKS[view.king].owner] + return YORK } - return BLOCKS[who].owner; + return BLOCKS[who].owner } function on_focus_map_block(evt) { - let b = evt.target.block; + let b = evt.target.block if (is_known_block(b)) { - let s = BLOCKS[b].steps; - let text = block_name(b) + " "; + let s = BLOCKS[b].steps + let text = block_name(b) + " " if (BLOCKS[b].type === 'heir') - text += "H" + HEIR_TEXT[BLOCKS[b].heir] + "-"; + text += "H" + HEIR_TEXT[BLOCKS[b].heir] + "-" if (BLOCKS[b].loyalty) - text += BLOCKS[b].loyalty + "-"; + text += BLOCKS[b].loyalty + "-" else if (BLOCKS[b].type === 'nobles') - text += "\u2740-"; - text += STEP_TEXT[s] + "-" + BLOCKS[b].combat; - document.getElementById("status").textContent = text; + text += "\u2740-" + text += STEP_TEXT[s] + "-" + BLOCKS[b].combat + document.getElementById("status").textContent = text } else { - let owner = block_owner(b); - if (b === REBEL) - owner = "Rebel"; - document.getElementById("status").textContent = owner; + let owner = block_owner(b) + if (b === B_REBEL) + owner = "Rebel" + document.getElementById("status").textContent = owner } } function on_blur_map_block(evt) { - document.getElementById("status").textContent = ""; + document.getElementById("status").textContent = "" } function on_click_map_block(evt) { - let b = evt.target.block; + let b = evt.target.block if (!view.battle) - send_action('block', b); + send_action('block', b) } function on_focus_battle_block(evt) { - let b = evt.target.block; - let msg = block_name(b); + let b = evt.target.block + let msg = block_name(b) if (view.battle.LR.includes(b)) - msg = "Lancaster Reserve"; + msg = "Lancaster Reserve" if (view.battle.YR.includes(b)) - msg = "York Reserve"; + msg = "York Reserve" if (view.actions && view.actions.battle_fire && view.actions.battle_fire.includes(b)) - msg = "Fire with " + msg; + msg = "Fire with " + msg else if (view.actions && view.actions.battle_retreat && view.actions.battle_retreat.includes(b)) - msg = "Retreat with " + msg; + msg = "Retreat with " + msg else if (view.actions && view.actions.battle_charge && view.actions.battle_charge.includes(b)) - msg = "Charge " + msg; + msg = "Charge " + msg else if (view.actions && view.actions.battle_treachery && view.actions.battle_treachery.includes(b)) - msg = "Attempt treachery on " + msg; + msg = "Attempt treachery on " + msg else if (view.actions && view.actions.battle_hit && view.actions.battle_hit.includes(b)) - msg = "Take hit on " + msg; + msg = "Take hit on " + msg - document.getElementById("status").textContent = msg; + document.getElementById("status").textContent = msg } function on_blur_battle_block(evt) { - document.getElementById("status").textContent = ""; + document.getElementById("status").textContent = "" } function on_click_battle_block(evt) { - let b = evt.target.block; - send_action('block', b); + let b = evt.target.block + send_action('block', b) } function on_focus_battle_fire(evt) { document.getElementById("status").textContent = - "Fire with " + block_name(evt.target.block); + "Fire with " + block_name(evt.target.block) } function on_focus_battle_retreat(evt) { document.getElementById("status").textContent = - "Retreat with " + block_name(evt.target.block); + "Retreat with " + block_name(evt.target.block) } function on_focus_battle_pass(evt) { document.getElementById("status").textContent = - "Pass with " + block_name(evt.target.block); + "Pass with " + block_name(evt.target.block) } function on_focus_battle_hit(evt) { document.getElementById("status").textContent = - "Take hit on " + block_name(evt.target.block); + "Take hit on " + block_name(evt.target.block) } function on_focus_battle_charge(evt) { if (block_owner(evt.target.block) === view.active) document.getElementById("status").textContent = - "Charge with " + block_name(evt.target.block); + "Charge with " + block_name(evt.target.block) else document.getElementById("status").textContent = - "Charge " + block_name(evt.target.block); + "Charge " + block_name(evt.target.block) } function on_focus_battle_treachery(evt) { if (block_owner(evt.target.block) === view.active) document.getElementById("status").textContent = - "Attempt treachery with " + block_name(evt.target.block); + "Attempt treachery with " + block_name(evt.target.block) else document.getElementById("status").textContent = - "Attempt treachery on " + block_name(evt.target.block); + "Attempt treachery on " + block_name(evt.target.block) } function on_blur_battle_button(evt) { - document.getElementById("status").textContent = ""; + document.getElementById("status").textContent = "" } function on_click_battle_hit(evt) { send_action('battle_hit', evt.target.block); } @@ -277,468 +308,478 @@ function on_click_battle_treachery(evt) { send_action('battle_treachery', evt.ta function on_click_battle_pass(evt) { if (window.confirm("Are you sure that you want to PASS with " + block_name(evt.target.block) + "?")) - send_action('battle_pass', evt.target.block); + send_action('battle_pass', evt.target.block) } function on_click_card(evt) { - let c = evt.target.id.split("+")[1] | 0; - send_action('play', c); + let c = evt.target.id.split("+")[1] | 0 + send_action('play', c) } function build_battle_button(menu, b, c, click, enter, img_src) { - let img = new Image(); - img.draggable = false; - img.classList.add("action"); - img.classList.add(c); - img.setAttribute("src", img_src); - img.addEventListener("click", click); - img.addEventListener("mouseenter", enter); - img.addEventListener("mouseleave", on_blur_battle_button); - img.block = b; - menu.appendChild(img); + let img = new Image() + img.draggable = false + img.classList.add("action") + img.classList.add(c) + img.setAttribute("src", img_src) + img.addEventListener("click", click) + img.addEventListener("mouseenter", enter) + img.addEventListener("mouseleave", on_blur_battle_button) + img.block = b + menu.appendChild(img) } function build_battle_block(b, block) { - let element = document.createElement("div"); - element.classList.add("block"); - element.classList.add("known"); - element.classList.add(BLOCKS[b].owner); - element.classList.add("block_" + block.image); - element.addEventListener("mouseenter", on_focus_battle_block); - element.addEventListener("mouseleave", on_blur_battle_block); - element.addEventListener("click", on_click_battle_block); - element.block = b; - ui.battle_block[b] = element; - - let menu_list = document.createElement("div"); - menu_list.classList.add("battle_menu_list"); + let element = document.createElement("div") + element.classList.add("block") + element.classList.add("known") + element.classList.add(BLOCKS[b].owner) + element.classList.add("block_" + block.image) + element.addEventListener("mouseenter", on_focus_battle_block) + element.addEventListener("mouseleave", on_blur_battle_block) + element.addEventListener("click", on_click_battle_block) + element.block = b + ui.battle_block[b] = element + + let menu_list = document.createElement("div") + menu_list.classList.add("battle_menu_list") build_battle_button(menu_list, b, "treachery", on_click_battle_treachery, on_focus_battle_treachery, - "/images/rose.svg"); + "/images/rose.svg") build_battle_button(menu_list, b, "charge", on_click_battle_charge, on_focus_battle_charge, - "/images/mounted-knight.svg"); + "/images/mounted-knight.svg") build_battle_button(menu_list, b, "hit", on_click_battle_hit, on_focus_battle_hit, - "/images/cross-mark.svg"); + "/images/cross-mark.svg") - // menu_list.appendChild(document.createElement("br")); + // menu_list.appendChild(document.createElement("br")) build_battle_button(menu_list, b, "fire", on_click_battle_fire, on_focus_battle_fire, - "/images/pointy-sword.svg"); + "/images/pointy-sword.svg") build_battle_button(menu_list, b, "retreat", on_click_battle_retreat, on_focus_battle_retreat, - "/images/flying-flag.svg"); + "/images/flying-flag.svg") build_battle_button(menu_list, b, "pass", on_click_battle_pass, on_focus_battle_pass, - "/images/sands-of-time.svg"); + "/images/sands-of-time.svg") - let menu = document.createElement("div"); - menu.classList.add("battle_menu"); - menu.appendChild(element); - menu.appendChild(menu_list); - menu.block = b; - ui.battle_menu[b] = menu; + let menu = document.createElement("div") + menu.classList.add("battle_menu") + menu.appendChild(element) + menu.appendChild(menu_list) + menu.block = b + ui.battle_menu[b] = menu } function build_map_block(b, block) { - let element = document.createElement("div"); - element.classList.add("block"); - element.classList.add("known"); - element.classList.add(BLOCKS[b].owner); - element.classList.add("block_" + block.image); - element.addEventListener("mouseenter", on_focus_map_block); - element.addEventListener("mouseleave", on_blur_map_block); - element.addEventListener("click", on_click_map_block); - element.block = b; - ui.blocks[b] = element; + let element = document.createElement("div") + element.classList.add("block") + element.classList.add("known") + element.classList.add(BLOCKS[b].owner) + element.classList.add("block_" + block.image) + element.addEventListener("mouseenter", on_focus_map_block) + element.addEventListener("mouseleave", on_blur_map_block) + element.addEventListener("click", on_click_map_block) + element.block = b + ui.blocks[b] = element } function build_map() { - let element; + let element - ui.blocks_element = document.getElementById("blocks"); - ui.offmap_element = document.getElementById("offmap"); + ui.blocks_element = document.getElementById("blocks") + ui.offmap_element = document.getElementById("offmap") for (let c = 1; c <= 25; ++c) { - ui.cards[c] = document.getElementById("card+"+c); - ui.cards[c].addEventListener("click", on_click_card); + ui.cards[c] = document.getElementById("card+"+c) + ui.cards[c].addEventListener("click", on_click_card) } for (let c = 1; c <= 7; ++c) - ui.card_backs[c] = document.getElementById("back+"+c); + ui.card_backs[c] = document.getElementById("back+"+c) - for (let name in AREAS) { - let area = AREAS[name]; - element = document.getElementById("svgmap").getElementById("area_"+name.replace(/ /g, "_")); + for (let area = 0; area < AREAS.length; ++area) { + let name = AREAS[area].name + element = document.getElementById("svgmap").getElementById("area_"+name.replace(/ /g, "_")) if (element) { - element.area = name; - element.addEventListener("mouseenter", on_focus_area); - element.addEventListener("mouseleave", on_blur_area); - element.addEventListener("click", on_click_area); - ui.areas[name] = element; + element.area = area + element.addEventListener("mouseenter", on_focus_area) + element.addEventListener("mouseleave", on_blur_area) + element.addEventListener("click", on_click_area) + ui.areas[area] = element } } - for (let b in BLOCKS) { - let block = BLOCKS[b]; - build_battle_block(b, block); - build_map_block(b, block); + for (let b = 0; b < BLOCKS.length; ++b) { + let block = BLOCKS[b] + build_battle_block(b, block) + build_map_block(b, block) } } function update_steps(b, steps, element) { - element.classList.remove("r1"); - element.classList.remove("r2"); - element.classList.remove("r3"); - element.classList.add("r"+(BLOCKS[b].steps - steps)); + element.classList.remove("r1") + element.classList.remove("r2") + element.classList.remove("r3") + element.classList.add("r"+(BLOCKS[b].steps - steps)) +} + +function compare_layout_blocks(a, b) { + let ad = view.dead.includes(a.block) + let bd = view.dead.includes(b.block) + if (ad && !bd) return 1 + if (bd && !ad) return -1 + return a.block - b.block } function layout_blocks(area, secret, known) { - let wrap = AREAS[area].wrap; - let s = secret.length; - let k = known.length; - let n = s + k; - let row, rows = []; - let i = 0; + secret.sort(compare_layout_blocks) + known.sort(compare_layout_blocks) + + let wrap = AREAS[area].layout.wrap + let s = secret.length + let k = known.length + let n = s + k + let row, rows = [] + let i = 0 function new_line() { - rows.push(row = []); - i = 0; + rows.push(row = []) + i = 0 } - new_line(); + new_line() while (secret.length > 0) { if (i === wrap) - new_line(); - row.push(secret.shift()); - ++i; + new_line() + row.push(secret.shift()) + ++i } // Break early if secret and known fit in exactly two rows, and more than three blocks total if (s > 0 && s <= wrap && k > 0 && k <= wrap && n > 3) - new_line(); + new_line() while (known.length > 0) { if (i === wrap) - new_line(); - row.push(known.shift()); - ++i; + new_line() + row.push(known.shift()) + ++i } - if (AREAS[area].layout_minor > 0.5) - rows.reverse(); + if (AREAS[area].layout.minor > 0.5) + rows.reverse() for (let j = 0; j < rows.length; ++j) for (i = 0; i < rows[j].length; ++i) - position_block(area, j, rows.length, i, rows[j].length, rows[j][i]); + position_block(area, j, rows.length, i, rows[j].length, rows[j][i]) } function position_block(area, row, n_rows, col, n_cols, element) { - let space = AREAS[area]; - let block_size = 60+6; - let padding = 4; - let offset = block_size + padding; - let row_size = (n_rows-1) * offset; - let col_size = (n_cols-1) * offset; - let x = space.x - block_size/2; - let y = space.y - block_size/2; - - if (space.layout_axis === 'X') { - x -= col_size * space.layout_major; - y -= row_size * space.layout_minor; - x += col * offset; - y += row * offset; + let space = AREAS[area] + let block_size = 60+6 + let padding = 4 + let offset = block_size + padding + let row_size = (n_rows-1) * offset + let col_size = (n_cols-1) * offset + let x = space.layout.x - block_size/2 + let y = space.layout.y - block_size/2 + + if (space.layout.axis === 'X') { + x -= col_size * space.layout.major + y -= row_size * space.layout.minor + x += col * offset + y += row * offset } else { - y -= col_size * space.layout_major; - x -= row_size * space.layout_minor; - y += col * offset; - x += row * offset; + y -= col_size * space.layout.major + x -= row_size * space.layout.minor + y += col * offset + x += row * offset } - element.style.left = (x|0)+"px"; - element.style.top = (y|0)+"px"; + element.style.left = (x|0)+"px" + element.style.top = (y|0)+"px" } function show_block(element) { if (element.parentElement !== ui.blocks_element) - ui.blocks_element.appendChild(element); + ui.blocks_element.appendChild(element) } function hide_block(element) { if (element.parentElement !== ui.offmap_element) - ui.offmap_element.appendChild(element); + ui.offmap_element.appendChild(element) } function is_dead(who) { - return view.location[who] === NOWHERE; + return view.location[who] === NOWHERE } function is_perma_dead(who) { - if (BLOCKS[who].loyalty === undefined) - return true; + if (BLOCKS[who].loyalty === 0) + return true switch (who) { - case "Warwick/Y": return is_dead("Warwick/L") && is_dead("Warwick/Y"); - case "Kent/Y": return is_dead("Kent/L") && is_dead("Kent/Y"); - case "Salisbury/Y": return is_dead("Salisbury/L") && is_dead("Salisbury/Y"); - case "Clarence/Y": return is_dead("Clarence/L") && is_dead("Clarence/Y"); - case "Exeter/L": return is_dead("Exeter/L") && is_dead("Exeter/Y"); + case B_WARWICK_Y: return is_dead(B_WARWICK_Y) && is_dead(B_WARWICK_L) + case B_KENT_Y: return is_dead(B_KENT_Y) && is_dead(B_KENT_L) + case B_SALISBURY_Y: return is_dead(B_SALISBURY_Y) && is_dead(B_SALISBURY_L) + case B_CLARENCE_Y: return is_dead(B_CLARENCE_Y) && is_dead(B_CLARENCE_L) + case B_EXETER_L: return is_dead(B_EXETER_Y) && is_dead(B_EXETER_L) } - return false; + return false } function update_map() { - let overflow = { Lancaster: [], York: [], Rebel: [] }; - let layout = {}; + let overflow = { Lancaster: [], York: [], Rebel: [] } + let layout = {} document.getElementById("turn_info").textContent = "Campaign " + view.campaign + "\nKing: " + block_name(view.king) + - "\nPretender: " + block_name(view.pretender); - - layout[DEAD] = { Lancaster: [], York: [] }; - for (let area in AREAS) - layout[area] = { Lancaster: [], York: [] }; - - for (let b in view.location) { - let info = BLOCKS[b]; - let element = ui.blocks[b]; - let area = view.location[b]; - let moved = view.moved[b] ? " moved" : ""; - let image = " block_" + info.image; - let steps = " r" + (info.steps - view.steps[b]); - let known = is_known_block(b); - - // perma-dead nobles - if (area === NOWHERE && is_perma_dead(b)) { - area = DEAD; - moved = " moved"; - known = 1; - steps = ""; - } - - if (area !== NOWHERE) { + "\nPretender: " + block_name(view.pretender) + + for (let area = 0; area < AREAS.length; ++area) + layout[area] = { Lancaster: [], York: [] } + + for (let b = 0; b < BLOCKS.length; ++b) { + let info = BLOCKS[b] + let element = ui.blocks[b] + let area = view.location[b] + let moved = view.moved.includes(b) ? " moved" : "" + let image = " block_" + info.image + let steps = " r" + (info.steps - view.steps[b]) + let known = is_known_block(b) + + if (area !== NOWHERE || is_perma_dead(b)) { + // perma-dead nobles + if (area === NOWHERE || view.dead.includes(b)) { + moved = " moved" + known = 1 + steps = "" + } if (known) { - element.classList = info.owner + " known block" + image + steps + moved; + element.classList = info.owner + " known block" + image + steps + moved } else { - element.classList = info.owner + " block" + moved; + element.classList = info.owner + " block" + moved } + if (block_owner(b) === LANCASTER) - layout[area].Lancaster.push(element); + layout[area].Lancaster.push(element) else - layout[area].York.push(element); - show_block(element); + layout[area].York.push(element) + + show_block(element) } else { - hide_block(element); + hide_block(element) } } - for (let area in AREAS) { + for (let area = 1; area < AREAS.length; ++area) { if (area === POOL) { - layout_blocks("LPool", layout[POOL].Lancaster, layout[DEAD].Lancaster); - layout_blocks("YPool", layout[POOL].York, layout[DEAD].York); + layout_blocks(L_POOL, layout[POOL].Lancaster, layout[NOWHERE].Lancaster) + layout_blocks(Y_POOL, layout[POOL].York, layout[NOWHERE].York) } else if (area === MINOR) { - layout_blocks("LMinor", layout[area].Lancaster, []); - layout_blocks("YMinor", layout[area].York, []); + layout_blocks(L_MINOR, layout[area].Lancaster, []) + layout_blocks(Y_MINOR, layout[area].York, []) } else { - layout_blocks(area, layout[area].Lancaster, layout[area].York); + layout_blocks(area, layout[area].Lancaster, layout[area].York) } } - for (let area in AREAS) { + for (let area = 0; area < AREAS.length; ++area) { if (ui.areas[area]) { - ui.areas[area].classList.remove('highlight'); - ui.areas[area].classList.remove('where'); + ui.areas[area].classList.remove('highlight') + ui.areas[area].classList.remove('where') } } if (view.actions && view.actions.area) for (let area of view.actions.area) - ui.areas[area].classList.add('highlight'); + ui.areas[area].classList.add('highlight') if (view.where !== NOWHERE) - ui.areas[view.where].classList.add('where'); + ui.areas[view.where].classList.add('where') - for (let b in BLOCKS) { - ui.blocks[b].classList.remove('highlight'); - ui.blocks[b].classList.remove('selected'); + for (let b = 0; b < BLOCKS.length; ++b) { + ui.blocks[b].classList.remove('highlight') + ui.blocks[b].classList.remove('selected') } if (!view.battle) { if (view.actions && view.actions.block) for (let b of view.actions.block) - ui.blocks[b].classList.add('highlight'); + ui.blocks[b].classList.add('highlight') if (view.who !== NOBODY) - ui.blocks[view.who].classList.add('selected'); + ui.blocks[view.who].classList.add('selected') } } function update_cards() { - let cards = view.hand; + let cards = view.hand for (let c = 1; c <= 25; ++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') } - let n = view.hand.length; + let n = view.hand.length for (let c = 1; c <= 7; ++c) if (c <= n && player === 'Observer') - ui.card_backs[c].classList.add("show"); + ui.card_backs[c].classList.add("show") else - ui.card_backs[c].classList.remove("show"); + ui.card_backs[c].classList.remove("show") if (view.actions && view.actions.play) { for (let c of view.actions.play) - ui.cards[c].classList.add('enabled'); + ui.cards[c].classList.add('enabled') } if (!view.l_card) - document.getElementById("lancaster_card").className = "show card card_back"; + document.getElementById("lancaster_card").className = "show card card_back" else - document.getElementById("lancaster_card").className = "show card " + CARDS[view.l_card].image; + document.getElementById("lancaster_card").className = "show card " + CARDS[view.l_card].image if (!view.y_card) - document.getElementById("york_card").className = "show card card_back"; + document.getElementById("york_card").className = "show card card_back" else - document.getElementById("york_card").className = "show card " + CARDS[view.y_card].image; + document.getElementById("york_card").className = "show card " + CARDS[view.y_card].image } function compare_blocks(a, b) { - let aa = BLOCKS[a].combat; - let bb = BLOCKS[b].combat; + let aa = BLOCKS[a].combat + let bb = BLOCKS[b].combat // Bombard - if (aa === "D3" && view.battle.round <= 1) aa = "A3"; - if (bb === "D3" && view.battle.round <= 1) bb = "A3"; + if (aa === "D3" && view.battle.round <= 1) aa = "A3" + if (bb === "D3" && view.battle.round <= 1) bb = "A3" if (aa === bb) - return (a < b) ? -1 : (a > b) ? 1 : 0; - return (aa < bb) ? -1 : (aa > bb) ? 1 : 0; + return (a < b) ? -1 : (a > b) ? 1 : 0 + return (aa < bb) ? -1 : (aa > bb) ? 1 : 0 } function sort_battle_row(root) { - let swapped; - let children = root.children; + let swapped + let children = root.children do { - swapped = false; + swapped = false for (let i = 1; i < children.length; ++i) { if (compare_blocks(children[i-1].block, children[i].block) > 0) { - children[i].after(children[i-1]); - swapped = true; + children[i].after(children[i-1]) + swapped = true } } - } while (swapped); + } while (swapped) } function update_battle() { function fill_cell(name, list, reserve) { - let cell = window[name]; + let cell = window[name] - ui.present.clear(); + ui.present.clear() for (let block of list) { - ui.present.add(block); + ui.present.add(block) if (!cell.contains(ui.battle_menu[block])) - cell.appendChild(ui.battle_menu[block]); + cell.appendChild(ui.battle_menu[block]) if (block === view.who) - ui.battle_block[block].classList.add("selected"); + ui.battle_block[block].classList.add("selected") else - ui.battle_block[block].classList.remove("selected"); + ui.battle_block[block].classList.remove("selected") - ui.battle_block[block].classList.remove("highlight"); - ui.battle_menu[block].classList.remove('hit'); - ui.battle_menu[block].classList.remove('fire'); - ui.battle_menu[block].classList.remove('retreat'); - ui.battle_menu[block].classList.remove('pass'); - ui.battle_menu[block].classList.remove('charge'); - ui.battle_menu[block].classList.remove('treachery'); + ui.battle_block[block].classList.remove("highlight") + ui.battle_menu[block].classList.remove('hit') + ui.battle_menu[block].classList.remove('fire') + ui.battle_menu[block].classList.remove('retreat') + ui.battle_menu[block].classList.remove('pass') + ui.battle_menu[block].classList.remove('charge') + ui.battle_menu[block].classList.remove('treachery') if (view.actions && view.actions.block && view.actions.block.includes(block)) - ui.battle_block[block].classList.add("highlight"); + ui.battle_block[block].classList.add("highlight") if (view.actions && view.actions.battle_fire && view.actions.battle_fire.includes(block)) - ui.battle_menu[block].classList.add('fire'); + ui.battle_menu[block].classList.add('fire') if (view.actions && view.actions.battle_retreat && view.actions.battle_retreat.includes(block)) - ui.battle_menu[block].classList.add('retreat'); + ui.battle_menu[block].classList.add('retreat') if (view.actions && view.actions.battle_pass && view.actions.battle_pass.includes(block)) - ui.battle_menu[block].classList.add('pass'); + ui.battle_menu[block].classList.add('pass') if (view.actions && view.actions.battle_hit && view.actions.battle_hit.includes(block)) - ui.battle_menu[block].classList.add('hit'); + ui.battle_menu[block].classList.add('hit') if (view.actions && view.actions.battle_charge && view.actions.battle_charge.includes(block)) - ui.battle_menu[block].classList.add('charge'); + ui.battle_menu[block].classList.add('charge') if (view.actions && view.actions.battle_treachery && view.actions.battle_treachery.includes(block)) - ui.battle_menu[block].classList.add('treachery'); + ui.battle_menu[block].classList.add('treachery') - update_steps(block, view.steps[block], ui.battle_block[block]); + update_steps(block, view.steps[block], ui.battle_block[block]) if (reserve) - ui.battle_block[block].classList.add("secret"); + ui.battle_block[block].classList.add("secret") else - ui.battle_block[block].classList.remove("secret"); - if (view.moved[block]) - ui.battle_block[block].classList.add("moved"); + ui.battle_block[block].classList.remove("secret") + if (view.moved.includes(block)) + ui.battle_block[block].classList.add("moved") else - ui.battle_block[block].classList.remove("moved"); + ui.battle_block[block].classList.remove("moved") if (reserve) - ui.battle_block[block].classList.remove("known"); + ui.battle_block[block].classList.remove("known") else - ui.battle_block[block].classList.add("known"); + ui.battle_block[block].classList.add("known") } - for (let b in BLOCKS) { + for (let b = 0; b < BLOCKS.length; ++b) { if (!ui.present.has(b)) { if (cell.contains(ui.battle_menu[b])) - cell.removeChild(ui.battle_menu[b]); + cell.removeChild(ui.battle_menu[b]) } } - sort_battle_row(cell); + sort_battle_row(cell) } if (player === LANCASTER) { - fill_cell("FR", view.battle.LR, true); - fill_cell("FF", view.battle.LF, false); - fill_cell("EF", view.battle.YF, false); - fill_cell("ER", view.battle.YR, true); + fill_cell("FR", view.battle.LR, true) + fill_cell("FF", view.battle.LF, false) + fill_cell("EF", view.battle.YF, false) + fill_cell("ER", view.battle.YR, true) } else { - fill_cell("ER", view.battle.LR, true); - fill_cell("EF", view.battle.LF, false); - fill_cell("FF", view.battle.YF, false); - fill_cell("FR", view.battle.YR, true); + fill_cell("ER", view.battle.LR, true) + fill_cell("EF", view.battle.LF, false) + fill_cell("FF", view.battle.YF, false) + fill_cell("FR", view.battle.YR, true) } } function on_update() { - let king = block_owner(view.king); - document.getElementById("lancaster_vp").textContent = (king === LANCASTER ? KING_TEXT : PRETENDER_TEXT); - document.getElementById("york_vp").textContent = (king === YORK ? KING_TEXT : PRETENDER_TEXT); - - action_button("eliminate", "Eliminate"); - action_button("execute_clarence", "Execute Clarence"); - action_button("execute_exeter", "Execute Exeter"); - action_button("end_action_phase", "End action phase"); - action_button("end_supply_phase", "End supply phase"); - action_button("end_political_turn", "End political turn"); - action_button("end_exile_limits", "End exile limits"); - action_button("end_regroup", "End regroup"); - action_button("end_retreat", "End retreat"); - action_button("pass", "Pass"); - action_button("undo", "Undo"); - - update_cards(); - update_map(); + let king = block_owner(view.king) + document.getElementById("lancaster_vp").textContent = (king === LANCASTER ? KING_TEXT : PRETENDER_TEXT) + document.getElementById("york_vp").textContent = (king === YORK ? KING_TEXT : PRETENDER_TEXT) + + action_button("eliminate", "Eliminate") + action_button("execute_clarence", "Execute Clarence") + action_button("execute_exeter", "Execute Exeter") + action_button("end_action_phase", "End action phase") + action_button("end_supply_phase", "End supply phase") + action_button("end_political_turn", "End political turn") + action_button("end_exile_limits", "End exile limits") + action_button("end_regroup", "End regroup") + action_button("end_retreat", "End retreat") + action_button("pass", "Pass") + action_button("undo", "Undo") + + update_cards() + update_map() if (view.battle) { - document.getElementById("battle_header").textContent = view.battle.title; - document.getElementById("battle_message").textContent = view.battle.flash; - document.getElementById("battle").classList.add("show"); - update_battle(); + document.getElementById("battle_header").textContent = view.battle.title + document.getElementById("battle_message").textContent = view.battle.flash + document.getElementById("battle").classList.add("show") + update_battle() } else { - document.getElementById("battle").classList.remove("show"); + document.getElementById("battle").classList.remove("show") } } -build_map(); +build_map() -drag_element_with_mouse("#battle", "#battle_header"); -scroll_with_middle_mouse("main", 2); +drag_element_with_mouse("#battle", "#battle_header") +scroll_with_middle_mouse("main", 2) |