summaryrefslogtreecommitdiff
path: root/play.js
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2024-10-25 12:06:40 +0200
committerTor Andersson <tor@ccxvii.net>2024-10-25 12:07:59 +0200
commitbf856d132261e7ca91ca6f8fbe5cecef6ba939d6 (patch)
tree66ecc7171093bed9981ea2870254ceb952122c76 /play.js
parentc8b701953f1b0a6349d738895df738d4899ab1f5 (diff)
download1989-dawn-of-freedom-bf856d132261e7ca91ca6f8fbe5cecef6ba939d6.tar.gz
Normalize line endings.
Added .gitattributes with text=auto setting. Ran `git add --renormalize .` to update all the checked in files.
Diffstat (limited to 'play.js')
-rw-r--r--play.js1628
1 files changed, 814 insertions, 814 deletions
diff --git a/play.js b/play.js
index a98c671..f0f4390 100644
--- a/play.js
+++ b/play.js
@@ -1,814 +1,814 @@
-
-const seed = 'none'
-const scenario = 'standard'
-const options = 'none'
-//const rules = require("./rules")
-
-const last_card = 110
-const last_power_card = 52
-let hover_timeout
-const height = 65
-const width = 105
-const toolbar = document.getElementById('toolbar')
-const vpMarker = document.getElementById('vp')
-const counters = document.getElementById('counters')
-
-const countries= ['Poland', 'Hungary', 'East_Germany', 'Bulgaria', 'Czechoslovakia', 'Romania']
-
-/*const aside_events = [
- "honecker",
- "st_nicholas_church",
- "helsinki_final_act",
- "eco_glasnost",
- "we_are_the_people",
- "foreign_currency_debt_burden",
- "li_peng",
- "austria_hungary_border_reopened",
- "grenztruppen",
- "presidential_visit",
- "securitate",
- "laslzo_tokes",
- "stand_fast",
- "elena",
- "new_years_eve_party"
-]*/
-const board_events = [2, 9, 69, 97]
-const box_events = [ 15, 24, 26, 39, 48, 49, 53, 58, 59, 65, 70, 73, 100, 101, 104 ]
-let box_events_showing = false
-let show_discard = false
-
-const overlay = document.getElementById('overlay');
-const spaceNameElement = document.getElementById('space-name');
-const spaceCharacteristicsElement = document.getElementById('space-characteristics');
-
-
-// Event listener to track mouse movement over the map
- document.querySelector('.map').addEventListener('mousemove', function(event) {
- const x = event.offsetX; // X-coordinate of mouse relative to container
- const y = event.offsetY; // Y-coordinate of mouse relative to container
- spaceCharacteristicsElement.innerText = `X: ${x}, Y: ${y}`;
- })
-
-
- // Create map areas dynamically based on coordinates
-
- function create_ui() {
-
-// CREATE MAP
-
- spaces.forEach((space) => {
-
-
- if (space && space.box) {
-
- //CREATE SPACES
- const { x, y} = space.box;
- const spaceArea = document.createElement('div');
- spaceArea.classList.add('space-area', space.country)
- spaceArea.id=`space_${space.space_id}`;
- spaceArea.style.left = x + 'px';
- spaceArea.style.top = y + 'px';
- spaceArea.style.width = width + 'px';
- spaceArea.style.height = height + 'px';
- spaceArea.style.zIndex = 2;
- spaceArea.my_space = space.space_id;
- spaceArea.addEventListener('mousedown', on_click_space);
-
- //CREATE DEMOCRATIC INFLUENCE MARKERS FOR EACH SPACE
- const dem_img = document.createElement('div')
- dem_img.classList.add('demInfl', space.country)
- dem_img.style.display = 'none'
- dem_img.id=`${space.name_unique}_demInfl`
- dem_img.style.zIndex = 1
- dem_img.my_space = space.space_id;
- dem_img.addEventListener('mousedown', on_click_space);
- spaceArea.appendChild(dem_img)
-
- //CREATE DEMOCRATIC INFLUENCE VALUES
- const demInflValue = document.createElement('p')
- demInflValue.className='demInflValue'
- demInflValue.style.display = 'none'
- demInflValue.id=`${space.name_unique}_demInflValue`
- demInflValue.innerText=space.demInfl
- demInflValue.style.zIndex = 1
- demInflValue.my_space = space.space_id;
- demInflValue.addEventListener('mousedown', on_click_space);
- spaceArea.appendChild(demInflValue)
-
- //CREATE COMMUNIST INFLUENCE MARKERS FOR EACH SPACE
- const com_img = document.createElement('div')
- com_img.className='comInfl'
- com_img.style.display='none'
- com_img.id=`${space.name_unique}_comInfl`
- com_img.style.zIndex = 1
- com_img.my_space = space.space_id;
- com_img.addEventListener('mousedown', on_click_space);
- spaceArea.appendChild(com_img)
-
- //CREATE COMMUNIST INFLUENCE VALUES
- const comInflValue = document.createElement('p')
- comInflValue.className='comInflValue'
- comInflValue.style.display='none'
- comInflValue.id=`${space.name_unique}_comInflValue`
- comInflValue.innerText=space.comInfl
- comInflValue.style.zIndex = 1
- comInflValue.my_space = space.space_id;
- comInflValue.addEventListener('mousedown', on_click_space);
- spaceArea.appendChild(comInflValue)
- //}
-
- counters.appendChild(spaceArea);
- }
- });
-
-// CREATE CARDS
-
- const is_mobile = window.matchMedia("(pointer: coarse)").matches
-
- for (let c = 1; c <= last_card; ++c) {
-
- const hand_card = document.createElement('img');
- hand_card.classList.add('hand_card')
- hand_card.id=`card_${c}`;
- hand_card.src = `cards/e${c}.gif`
- hand_card.my_card = c;
- hand_card.addEventListener('click', on_click_card);
-
- if(!is_mobile) {
- hand_card.addEventListener('mouseenter', () => {
- hover_timeout = setTimeout(() => {
- hand_card.classList.add('zoom');
- }, 500) })
- hand_card.addEventListener('mouseleave', () => {
- clearTimeout(hover_timeout);
- hand_card.classList.remove('zoom');
- });
- }
-
- ui.cards.push(hand_card);
- }
-
-
-
- for (let card of power_cards) {
- if (!card) continue;
- const power_card = document.createElement('img');
- power_card.classList.add('power_card');
- power_card.id = `power_card_${card.number}`;
- power_card.src = `cards_2/${card.url}.gif`;
- power_card.my_card = card.number;
- power_card.addEventListener('mousedown', on_click_card);
- ui.power_cards.push(power_card);
- }
-}
-
-
-
-
-function is_card_enabled(card) {
- if (view.actions) {
- if (card_action_menu.some(a => view.actions[a] && view.actions[a].includes(card)))
- return true
- if (view.actions.card_select && view.actions.card_select.includes(card))
- return true
- if (view.actions.card && view.actions.card.includes(card))
- return true
- }
- return false
-}
-
-// SUPPORTING FUNCTIONS
-
-function on_click_space(evt) {
- if (evt.button === 0) {
- const space = evt.target.my_space;
- //console.log('on_click_space_called with space:', space);
- if (send_action('infl', space)) {
- //console.log('send_action with infl:', space);
- evt.stopPropagation();
- } else if (send_action('sc', space)) {
- //console.log('send_action with sc:', space);
- evt.stopPropagation();
- } else {
- // console.log('send_action failed for space:', space);
- }
- }
- //hide_popup_menu();
-}
-
-function on_click_card(evt) {
- if (evt.button === 0) {
- const card = evt.target.my_card;
- //console.log('on_click_card_called with card:', card);
- if (is_action('card', card)) {
- //console.log('in action card')
- if (send_action('card', card)) {
- evt.stopPropagation();
- }
- }
- }
-}
-
-function is_action(action) {
- //console.log('is_action called with: ', action)
- //console.log('view.actions', view.actions)
- if (view.actions && view.actions[action])
- return true
- return false
-}
-
-function is_card_action(action, card) {
- //console.log('is_card_action called with action', action, 'card', card)
- //console.log('view.actions', view.actions, 'view.actions[action]', view.actions[action])
- if (view.actions && view.actions[action] && view.actions[action].includes(card))
- return true
- return false
-}
-
-function on_log(text) { // eslint-disable-line no-unused-vars
-
- let p = document.createElement("div")
-
- if (text.match(/^>/)) {
- text = text.substring(1)
- p.className = 'i'
- }
-
- text = text.replace(/_/g, ' ')
- text = text.replace(/C(\d+)/g, sub_card_name)
- text = text.replace(/P(\d+)/g, sub_power_card_name)
- text = text.replace(/V(\d+)/g, sub_power_card_value)
- text = text.replace(/%(\d+)/g, sub_space_name)
- text = text.replace(/D[1-6]/g, sub_die)
-
-
- if (text.match(/^\.h1/)) {
- text = text.substring(4)
- p.className = 'h1'
- }
- else if (text.match(/^\.h2d/)) {
- text = text.substring(5)
- p.className = 'h2 dem'
- }
- else if (text.match(/^\.h2c/)) {
- text = text.substring(5)
- p.className = 'h2 com'
- }
- else if (text.match(/^\.h2/)) {
- text = text.substring(4)
- p.className = 'h2'
- }
- else if (text.match(/^\.h3/)) {
- text = text.substring(4)
- p.className = 'h3'
- }
-
- p.innerHTML = text
- return p
-}
-
-let ui = {
- favicon: document.getElementById('favicon'),
- player: [
- document.getElementById("role_Democrat"),
- document.getElementById("role_Communist"),
- ],
- cards: [ null ],
- power_cards: [null],
- dem_hand_count: document.getElementById("role_stat_dem"),
- com_hand_count: document.getElementById("role_stat_com"),
- deck_length: document.getElementById("deck_length"),
- played_card: 0,
- table_panel: document.getElementById("table_panel"),
- hand_panel: document.getElementById("hand_panel"),
- turn: document.getElementById("turn-tracker"),
- round: document.getElementById("action-round-tracker"),
- stability: document.getElementById("stability-track"),
- dem_TST: document.getElementById("dem-TST"),
- com_TST: document.getElementById("com-TST"),
- vp: document.getElementById("vp"),
- spaces: document.getElementsByClassName("space-area")
-
-}
-
-
-function on_update() {
- //console.log('on_update called')
- //console.log('view.valid_spaces: ', view.valid_spaces)
- //console.log('view.actions: ', view.actions)
- //console.log('view.power_cards:', view.power_cards)
- document.querySelectorAll('[id^="space_"].selected').forEach(spaceElement => {spaceElement.classList.remove('selected');});
- document.getElementById("power_hand")?.querySelectorAll('.selected').forEach(cardElement => {cardElement.classList.remove('selected');});
- view.valid_spaces.forEach(space_id => {
- const spaceElementId = `space_${space_id}`;
- const spaceElement = document.getElementById(spaceElementId);
-
- if (spaceElement) {
- spaceElement.classList.add('selected');
- }
- });
-
- //Check influence values
-
- for (let i = 1; i < spaces.length; i ++) {
-
- const space = spaces[i]
- const demInfl = view.demInfl[i]
- const comInfl = view.comInfl[i]
- //console.log('piece', piece)
- //console.log('space', space)
- const dem_marker = document.getElementById(`${space.name_unique}_demInfl`);
- const dem_number = document.getElementById(`${space.name_unique}_demInflValue`);
- const com_marker = document.getElementById(`${space.name_unique}_comInfl`);
- const com_number = document.getElementById(`${space.name_unique}_comInflValue`);
-
- dem_number.innerText=demInfl
- if (demInfl > 0) {
- dem_marker.style.display = 'block';
- dem_number.style.display = 'block';
-
- if (demInfl > 9) {
- dem_number.classList.remove('demInflValue')
- dem_number.classList.add('demInflValue_10')
- } else {
- dem_number.classList.add('demInflValue')
- dem_number.classList.remove('demInflValue_10')
- }
-
- if(check_dem_control(demInfl, comInfl, space)){
- dem_marker.classList.add('controlled')
- dem_number.classList.add('outlined_text')
- dem_marker.classList.remove('uncontrolled')
- } else {
- dem_marker.classList.add('uncontrolled')
- dem_marker.classList.remove('controlled')
- dem_number.classList.remove('outlined_text')
- }
- } else {
- dem_marker.style.display = 'none';
- dem_number.style.display = 'none';
- }
- com_number.innerText=comInfl
- if (comInfl > 0) {
- com_marker.style.display = 'block';
- com_number.style.display = 'block';
-
- if (comInfl > 9) {
- com_number.classList.remove('comInflValue')
- com_number.classList.add('comInflValue_10')
- } else {
- com_number.classList.add('comInflValue')
- com_number.classList.remove('comInflValue_10')
- }
-
- if(check_com_control(demInfl, comInfl, space)){
- com_marker.classList.add('controlled')
- com_number.classList.add('controlled')
- com_marker.classList.remove('uncontrolled')
- com_number.classList.remove('uncontrolled')
- } else {
- com_marker.classList.add('uncontrolled')
- com_number.classList.add('uncontrolled')
- com_marker.classList.remove('controlled')
- com_number.classList.remove('controlled')
- }
- } else {
- com_marker.style.display = 'none';
- com_number.style.display = 'none';
- }
-
- }
-
-// UPDATE COUNTRY MARKERS
- for (let i = 0; i < countries.length; i++) {
- const country = countries[i];
- const marker = document.getElementById(country)
- const times_held = document.getElementById(`${country}_times_held`)
-
- if (view.revolutions[find_country_index(country)]) {
- marker.classList.add('revolution')
- marker.classList.remove('held')
- marker.style.display = 'block'
- times_held.classList.add('outlined_text')
- times_held.classList.remove('hide')
- } else if (view.times_held[find_country_index(country)] > 0 ) {
- //console.log('setting ', country)
- marker.classList.add('held')
- marker.style.display = 'block'
- times_held.classList.remove('hide')
- times_held.innerHTML = view.times_held[find_country_index(country)]
- }
- else {marker.style.display = 'none'}
- }
-
-// UPDATE ASIDE
- if (view.is_pwr_struggle) {
- ui.dem_hand_count.innerText = `${view.democrat_power_hand} Power cards`
- ui.com_hand_count.innerText = `${view.communist_power_hand} Power cards`
- } else{
- ui.dem_hand_count.innerText = `${view.democrat_hand} cards`
- ui.com_hand_count.innerText = `${view.communist_hand} cards`
- }
- ui.deck_length.innerText = `${view.strategy_deck} cards`
-
-// UPDATE HAND
- document.getElementById("hand").replaceChildren()
- document.getElementById("played_card").replaceChildren()
-
- if (view.hand.length && view.is_pwr_struggle === false) {
- document.getElementById("hand_panel").classList.remove("hide")
- //console.log('view.actions.card', view.actions.card)
- for (let c of view.hand) {
- let card = ui.cards[c]
- document.getElementById("hand").appendChild(card);
- if (view.actions && view.actions.card && view.actions.card.includes(c)) {
- card.classList.add('action')
- } else {
- card.classList.remove('action')
- }
- if (view.valid_cards.includes(c)) {
- card.classList.add('selected')
- } else {
- card.classList.remove('selected')
- }
- card.classList.remove('discard_card')
- }
- } else {
- document.getElementById("hand_panel").classList.add("hide")
- }
-
-// UPDATE DISCARD
-document.getElementById("discard").replaceChildren()
-if (!view.is_pwr_struggle) {
- for (let c of view.strategy_discard) {
- let discard_card = ui.cards[c]
- document.getElementById("discard").appendChild(discard_card)
- discard_card.classList.add('discard_card')
- discard_card.classList.remove('selected')
- }
-} else if (view.is_pwr_struggle) {
- for (let c of view.strategy_discard) {
- let discard_card = ui.power_cards[c]
- document.getElementById("discard").appendChild(discard_card)
- discard_card.classList.add('discard_card')
- discard_card.classList.remove('selected')
- }
-}
-
-// DISCARD FOR EVENTS
-//console.log('view.discard',view.discard)
-if(view.discard) {
- //document.getElementById("discard").replaceChildren()
- document.getElementById("discard_panel").classList.remove("hide")
- for (let c of view.strategy_discard) {
- let discard_card = ui.cards[c]
- document.getElementById("discard").appendChild(discard_card)
- discard_card.classList.add('discard_card')
- if (view.valid_cards.includes(c)) {
- discard_card.classList.add('selected')
- } else {
- discard_card.classList.remove('selected')
- }
- }
-} else {
- if (!show_discard) {
- document.getElementById("discard_panel").classList.add("hide")
- }
-}
-
-// UPDATE PERMANENTLY REMOVED CARDS
-document.getElementById("removed").replaceChildren()
-for (let c of view.strategy_removed) {
- let discard_card = ui.cards[c]
- document.getElementById("removed").appendChild(discard_card)
- discard_card.classList.add('discard_card')
- discard_card.classList.remove('selected')
-}
-
-
-// PLAYED CARD PANEL
-if (view.played_card > 0) {
- document.getElementById("played_card_panel").classList.remove("hide")
- document.getElementById("played_card").appendChild(ui.cards[view.played_card]);
- document.getElementById("played_card").classList.remove("hand_card")
-} else {
- document.getElementById("played_card_panel").classList.add("hide")
-}
-
-// TABLE CARDS PANEL
-document.getElementById("table_cards").replaceChildren()
-if (view.table_cards.length > 0) {
- document.getElementById("table_panel").classList.remove("hide")
- for (let c of view.table_cards) {
- let card = ui.cards[c]
- document.getElementById("table_cards").appendChild(card);
- card.classList.remove("hand_card")
- card.classList.add('event_card');
- }
- } else {
- document.getElementById("table_panel").classList.add("hide")
-}
-
-// OPPONENT HAND
-document.getElementById("opp_hand").replaceChildren()
-if (!view.is_pwr_struggle) {
- if (view.show_opp_hand && view.opp_hand.length >0) {
- document.getElementById("opp_hand_panel").classList.remove("hide")
- for (let c of view.opp_hand) {
- let card = ui.cards[c]
- document.getElementById("opp_hand").appendChild(card);
- card.classList.remove('discard_card')
- if (!view.is_pwr_struggle) {
- if (view.valid_cards.includes(c)) {
- card.classList.add('selected')
- } else {
- card.classList.remove('selected')
- }
- }
- }
- } else {
- document.getElementById("opp_hand_panel").classList.add("hide")
- }
-} else {
- //console.log('power struggle, show opp hand', view.show_opp_hand, 'view opp hand', view.opp_hand )
- if (view.show_opp_hand && view.opp_hand && view.opp_hand.length > 0) {
- document.getElementById("opp_hand_panel").classList.remove("hide")
- for (let c of view.opp_hand) {
- let card = ui.power_cards[c]
- //console.log('power_card:', power_card)
- document.getElementById("opp_hand").appendChild(card);
- card.classList.remove('discard_card')
- }
- } else {
- document.getElementById("opp_hand_panel").classList.add("hide")
- }
-}
-
-// POWER STRUGGLE HAND
- document.getElementById("power_hand").replaceChildren()
-
- if (view.power_hand.length && view.is_pwr_struggle) {
- document.getElementById("power_panel").classList.remove("hide")
- for (let c of view.power_hand) {
- let power_card = ui.power_cards[c]
- document.getElementById("power_hand").appendChild(power_card);
- power_card.classList.remove('discard_card')
- if (view.valid_cards.includes(c)) {
- power_card.classList.add('selected');
- }
- }
- } else {
- document.getElementById("power_panel").classList.add("hide")
- }
-
-// CEAUSESCU
-
-if (view.ceausescu_cards && view.ceausescu_cards.length > 0 && view.is_pwr_struggle === true) {
- document.getElementById("ceausescu_panel").classList.remove("hide")
- for (let c of view.ceausescu_cards) {
- let power_card = ui.power_cards[c]
- document.getElementById("ceausescu_hand").appendChild(power_card);
- power_card.classList.remove('discard_card')
-
- }
-} else {
- document.getElementById("ceausescu_panel").classList.add("hide")
-}
-
-// SAMIZDAT CARD
-if (view.samizdat > 0 ) {
- let samizdat_card = ui.cards[view.samizdat]
- document.getElementById("samizdat_panel").classList.remove("hide")
- document.getElementById("samizdat_card").appendChild(samizdat_card)
-} else {
- document.getElementById("samizdat_panel").classList.add("hide")
-}
-
-// UPDATE BOARD MARKERS
- ui.turn.className = `t${view.turn}`
- if (view.round_player === 'Democrat') {
- ui.round.className = `dem-action-round-tracker r${view.round}`
- } else {
- ui.round.className = `com-action-round-tracker r${view.round}`
- }
- ui.stability.className = `s${view.stability}`
- ui.dem_TST.className = `tst${view.dem_tst}`
- ui.com_TST.className = `tst${view.com_tst}`
- if (view.vp >= -20 && view.vp <= 20) {
- ui.vp.className = `vp${view.vp}`
- } else if (view.vp > 20) {
- ui.vp.className = `vp21`
- } else if (view.vp < -20) {
- ui.vp.className = `vp-21`
- }
-
-//console.log('strategy discard: ', view.strategy_discard)
-//console.log('valid spaces: ', view.valid_spaces)
-
-//console.log('view.persistent_events', view.persistent_events)
-
-// UPDATE EVENT MARKERS ON THE BOARD
-
-for (let id of board_events) {
- let marker = document.getElementById(`event_${id}`)
- //console.log('event', id, marker)
- if (view.persistent_events.includes(id)) {
- marker.style.display = 'block'
- } else {
- marker.style.display = 'none'
- }
-}
-
-
-// UPDATE EVENT MARKERS BELOW THE BOARD
-
-for (let id of box_events) {
- let marker = document.getElementById(`event_${id}`)
- //console.log('event', id, marker)
- if (view.persistent_events.includes(id)) {
- marker.style.display = 'block'
- } else {
- marker.style.display = 'none'
- }
-}
-
-
-// CHECK WHETHER ANY EVENT MARKERS ARE SHOWING IN THE EVENTS BOX
-box_events_showing = false
-for (let id of box_events) {
- if (view.persistent_events.includes(id)) {
- box_events_showing = true;
- }
-/*
- //Special check for events which are not true/false
- if (view.persistent_events['foreign_currency_debt_burden'] !== '') {
- aside_events_showing = true
- }
- if (view.persistent_events['stand_fast'] !== '') {
- aside_events_showing = true
- }
- */
-}
-
-if (box_events_showing) {
- document.getElementById('events_panel').classList.remove("hide")
-} else {
- document.getElementById('events_panel').classList.add("hide")
-}
-
-let systematization = document.getElementById('event_69')
-if (view.persistent_events.includes(69)) {
- systematization.style.left = (spaces[view.systematization].box.x +20) + 'px';
- systematization.style.top = spaces[view.systematization].box.y + 'px';
-}
-
-let tyrant = document.getElementById('event_97')
-if (view.persistent_events.includes(97)) {
- tyrant.style.left = (spaces[view.the_tyrant_is_gone].box.x - 41) + 'px';
- tyrant.style.top = (spaces[view.the_tyrant_is_gone].box.y + 23) + 'px';
-} else {tyrant.style.display = 'none'}
-
- action_button("yes", "Yes")
- action_button("no", "No")
- action_button("start", "Start")
- action_button("check", "Check held cards")
- action_button("tst_7", "Cancel opponent event")
- action_button("tst_8", "Event and operations")
- action_button("end", "End Game")
- action_button("continue", "Continue playing")
- action_button("east_germany", "East Germany")
- action_button("poland", "Poland")
- action_button("czechoslovakia", "Czechoslovakia")
- action_button("hungary", "Hungary")
- action_button("romania", "Romania")
- action_button("bulgaria", "Bulgaria")
- action_button("extra", "Take action round")
- action_button("pass", "Pass")
- action_button("remove", "Remove SPs")
- action_button("add", "Add SPs")
- action_button("ops", "Operations")
- action_button("discard", "Discard")
- action_button("strike", "Strike")
- action_button("march", "March")
- action_button("rally", "Rally in the Square")
- action_button("petition", "Petition")
- action_button("bonus", "Calculate VP bonus")
- action_button("scoring", "Score country")
- action_button("retain", "Retain Power")
- action_button("surrender", "Surrender Power")
- action_button("take", "Take Power")
- action_button("concede", "Concede")
- action_button("struggle", "Begin power struggle")
- action_button("raise", "Raise the stakes")
- action_button("draw", "Draw")
- action_button("scoring", "Scoring")
- action_button("event", "Event")
- action_button("opp_event", "Resolve opponent event")
- action_button("influence", "Place SPs")
- action_button("support_check", "Support Checks")
- action_button("tst", "Tiananmen Square Track")
- action_button("roll", "Roll a die")
- action_button("done", "Done")
- action_button("end_round", "End Round")
- action_button("undo", "Undo")
-
-console.log('view.actions', view.actions)
-}
-
-// =========================== LOG FUNCTIONS ==============================================
-
-function sub_card_name(match, p1) {
- let x = p1 | 0
- return `<span class="card_name" onmouseenter="on_focus_card_tip(${x})" onmouseleave="on_blur_card_tip()">${cards[x].name}</span>`
-}
-
-function sub_power_card_name(match, p1) {
- let x = p1 | 0
- return `<span class="card_name">${power_cards[x].name}</span>`
-}
-
-function sub_power_card_value(match, p1) {
- let x = p1 | 0
- return `<span class="card_name">${x}</span>`
-}
-
-function sub_space_name(match, p1) {
- let x = p1 | 0
- let id = spaces[x].space_id
- let name = spaces[x].name_unique
- return `<span class="space_tip" onmouseenter="on_focus_space_tip(${id})" onmouseleave="on_blur_space_tip(${id})" onclick="on_click_space_tip(${id})">${name}</span>`
-}
-
-function sub_die(match) {
- return die[match] || match
-}
-
-const die = {
- D1: '<span class="die white d1"></span>',
- D2: '<span class="die white d2"></span>',
- D3: '<span class="die white d3"></span>',
- D4: '<span class="die white d4"></span>',
- D5: '<span class="die white d5"></span>',
- D6: '<span class="die white d6"></span>'
-}
-
-// =========================== VISUAL FUNCTIONS ==========================================#
-
-function on_focus_card_tip(card_number) {
- document.getElementById("tooltip").className = "card card_" + card_number
-}
-
-function on_blur_card_tip() {
- document.getElementById("tooltip").classList = "card hide"
-}
-
-function on_focus_space_tip(id) {
- space = document.getElementById(`space_${id}`)
- space.classList.add("tip")
-}
-
-function on_click_space_tip(id) {
- space = document.getElementById(`space_${id}`)
- scroll_into_view(space)
-}
-
-function on_blur_space_tip(id) {
- space = document.getElementById(`space_${id}`)
- space.classList.remove("tip")
-}
-
-function toggle_pieces() {
- document.getElementById("pieces").classList.toggle("hide")
-}
-
-
-function toggle_discard() {
- if (show_discard) {
- show_discard = false
- } else {
- show_discard = true
- }
- document.getElementById("discard_panel").classList.toggle("hide")
-}
-
-function toggle_removed() {
- document.getElementById("removed_panel").classList.toggle("hide")
-}
-
-function check_dem_control(demInfl, comInfl, space) {
- if ((demInfl - comInfl) >= space.stability) {
- return true
- } else{ false}
-}
-
-function check_com_control(demInfl, comInfl, space) {
- if ((comInfl - demInfl) >= space.stability) {
- return true
- } else{ false}
-}
-
-function find_country_index(country) {
- return countries.indexOf(country)
-}
-
-create_ui()
+
+const seed = 'none'
+const scenario = 'standard'
+const options = 'none'
+//const rules = require("./rules")
+
+const last_card = 110
+const last_power_card = 52
+let hover_timeout
+const height = 65
+const width = 105
+const toolbar = document.getElementById('toolbar')
+const vpMarker = document.getElementById('vp')
+const counters = document.getElementById('counters')
+
+const countries= ['Poland', 'Hungary', 'East_Germany', 'Bulgaria', 'Czechoslovakia', 'Romania']
+
+/*const aside_events = [
+ "honecker",
+ "st_nicholas_church",
+ "helsinki_final_act",
+ "eco_glasnost",
+ "we_are_the_people",
+ "foreign_currency_debt_burden",
+ "li_peng",
+ "austria_hungary_border_reopened",
+ "grenztruppen",
+ "presidential_visit",
+ "securitate",
+ "laslzo_tokes",
+ "stand_fast",
+ "elena",
+ "new_years_eve_party"
+]*/
+const board_events = [2, 9, 69, 97]
+const box_events = [ 15, 24, 26, 39, 48, 49, 53, 58, 59, 65, 70, 73, 100, 101, 104 ]
+let box_events_showing = false
+let show_discard = false
+
+const overlay = document.getElementById('overlay');
+const spaceNameElement = document.getElementById('space-name');
+const spaceCharacteristicsElement = document.getElementById('space-characteristics');
+
+
+// Event listener to track mouse movement over the map
+ document.querySelector('.map').addEventListener('mousemove', function(event) {
+ const x = event.offsetX; // X-coordinate of mouse relative to container
+ const y = event.offsetY; // Y-coordinate of mouse relative to container
+ spaceCharacteristicsElement.innerText = `X: ${x}, Y: ${y}`;
+ })
+
+
+ // Create map areas dynamically based on coordinates
+
+ function create_ui() {
+
+// CREATE MAP
+
+ spaces.forEach((space) => {
+
+
+ if (space && space.box) {
+
+ //CREATE SPACES
+ const { x, y} = space.box;
+ const spaceArea = document.createElement('div');
+ spaceArea.classList.add('space-area', space.country)
+ spaceArea.id=`space_${space.space_id}`;
+ spaceArea.style.left = x + 'px';
+ spaceArea.style.top = y + 'px';
+ spaceArea.style.width = width + 'px';
+ spaceArea.style.height = height + 'px';
+ spaceArea.style.zIndex = 2;
+ spaceArea.my_space = space.space_id;
+ spaceArea.addEventListener('mousedown', on_click_space);
+
+ //CREATE DEMOCRATIC INFLUENCE MARKERS FOR EACH SPACE
+ const dem_img = document.createElement('div')
+ dem_img.classList.add('demInfl', space.country)
+ dem_img.style.display = 'none'
+ dem_img.id=`${space.name_unique}_demInfl`
+ dem_img.style.zIndex = 1
+ dem_img.my_space = space.space_id;
+ dem_img.addEventListener('mousedown', on_click_space);
+ spaceArea.appendChild(dem_img)
+
+ //CREATE DEMOCRATIC INFLUENCE VALUES
+ const demInflValue = document.createElement('p')
+ demInflValue.className='demInflValue'
+ demInflValue.style.display = 'none'
+ demInflValue.id=`${space.name_unique}_demInflValue`
+ demInflValue.innerText=space.demInfl
+ demInflValue.style.zIndex = 1
+ demInflValue.my_space = space.space_id;
+ demInflValue.addEventListener('mousedown', on_click_space);
+ spaceArea.appendChild(demInflValue)
+
+ //CREATE COMMUNIST INFLUENCE MARKERS FOR EACH SPACE
+ const com_img = document.createElement('div')
+ com_img.className='comInfl'
+ com_img.style.display='none'
+ com_img.id=`${space.name_unique}_comInfl`
+ com_img.style.zIndex = 1
+ com_img.my_space = space.space_id;
+ com_img.addEventListener('mousedown', on_click_space);
+ spaceArea.appendChild(com_img)
+
+ //CREATE COMMUNIST INFLUENCE VALUES
+ const comInflValue = document.createElement('p')
+ comInflValue.className='comInflValue'
+ comInflValue.style.display='none'
+ comInflValue.id=`${space.name_unique}_comInflValue`
+ comInflValue.innerText=space.comInfl
+ comInflValue.style.zIndex = 1
+ comInflValue.my_space = space.space_id;
+ comInflValue.addEventListener('mousedown', on_click_space);
+ spaceArea.appendChild(comInflValue)
+ //}
+
+ counters.appendChild(spaceArea);
+ }
+ });
+
+// CREATE CARDS
+
+ const is_mobile = window.matchMedia("(pointer: coarse)").matches
+
+ for (let c = 1; c <= last_card; ++c) {
+
+ const hand_card = document.createElement('img');
+ hand_card.classList.add('hand_card')
+ hand_card.id=`card_${c}`;
+ hand_card.src = `cards/e${c}.gif`
+ hand_card.my_card = c;
+ hand_card.addEventListener('click', on_click_card);
+
+ if(!is_mobile) {
+ hand_card.addEventListener('mouseenter', () => {
+ hover_timeout = setTimeout(() => {
+ hand_card.classList.add('zoom');
+ }, 500) })
+ hand_card.addEventListener('mouseleave', () => {
+ clearTimeout(hover_timeout);
+ hand_card.classList.remove('zoom');
+ });
+ }
+
+ ui.cards.push(hand_card);
+ }
+
+
+
+ for (let card of power_cards) {
+ if (!card) continue;
+ const power_card = document.createElement('img');
+ power_card.classList.add('power_card');
+ power_card.id = `power_card_${card.number}`;
+ power_card.src = `cards_2/${card.url}.gif`;
+ power_card.my_card = card.number;
+ power_card.addEventListener('mousedown', on_click_card);
+ ui.power_cards.push(power_card);
+ }
+}
+
+
+
+
+function is_card_enabled(card) {
+ if (view.actions) {
+ if (card_action_menu.some(a => view.actions[a] && view.actions[a].includes(card)))
+ return true
+ if (view.actions.card_select && view.actions.card_select.includes(card))
+ return true
+ if (view.actions.card && view.actions.card.includes(card))
+ return true
+ }
+ return false
+}
+
+// SUPPORTING FUNCTIONS
+
+function on_click_space(evt) {
+ if (evt.button === 0) {
+ const space = evt.target.my_space;
+ //console.log('on_click_space_called with space:', space);
+ if (send_action('infl', space)) {
+ //console.log('send_action with infl:', space);
+ evt.stopPropagation();
+ } else if (send_action('sc', space)) {
+ //console.log('send_action with sc:', space);
+ evt.stopPropagation();
+ } else {
+ // console.log('send_action failed for space:', space);
+ }
+ }
+ //hide_popup_menu();
+}
+
+function on_click_card(evt) {
+ if (evt.button === 0) {
+ const card = evt.target.my_card;
+ //console.log('on_click_card_called with card:', card);
+ if (is_action('card', card)) {
+ //console.log('in action card')
+ if (send_action('card', card)) {
+ evt.stopPropagation();
+ }
+ }
+ }
+}
+
+function is_action(action) {
+ //console.log('is_action called with: ', action)
+ //console.log('view.actions', view.actions)
+ if (view.actions && view.actions[action])
+ return true
+ return false
+}
+
+function is_card_action(action, card) {
+ //console.log('is_card_action called with action', action, 'card', card)
+ //console.log('view.actions', view.actions, 'view.actions[action]', view.actions[action])
+ if (view.actions && view.actions[action] && view.actions[action].includes(card))
+ return true
+ return false
+}
+
+function on_log(text) { // eslint-disable-line no-unused-vars
+
+ let p = document.createElement("div")
+
+ if (text.match(/^>/)) {
+ text = text.substring(1)
+ p.className = 'i'
+ }
+
+ text = text.replace(/_/g, ' ')
+ text = text.replace(/C(\d+)/g, sub_card_name)
+ text = text.replace(/P(\d+)/g, sub_power_card_name)
+ text = text.replace(/V(\d+)/g, sub_power_card_value)
+ text = text.replace(/%(\d+)/g, sub_space_name)
+ text = text.replace(/D[1-6]/g, sub_die)
+
+
+ if (text.match(/^\.h1/)) {
+ text = text.substring(4)
+ p.className = 'h1'
+ }
+ else if (text.match(/^\.h2d/)) {
+ text = text.substring(5)
+ p.className = 'h2 dem'
+ }
+ else if (text.match(/^\.h2c/)) {
+ text = text.substring(5)
+ p.className = 'h2 com'
+ }
+ else if (text.match(/^\.h2/)) {
+ text = text.substring(4)
+ p.className = 'h2'
+ }
+ else if (text.match(/^\.h3/)) {
+ text = text.substring(4)
+ p.className = 'h3'
+ }
+
+ p.innerHTML = text
+ return p
+}
+
+let ui = {
+ favicon: document.getElementById('favicon'),
+ player: [
+ document.getElementById("role_Democrat"),
+ document.getElementById("role_Communist"),
+ ],
+ cards: [ null ],
+ power_cards: [null],
+ dem_hand_count: document.getElementById("role_stat_dem"),
+ com_hand_count: document.getElementById("role_stat_com"),
+ deck_length: document.getElementById("deck_length"),
+ played_card: 0,
+ table_panel: document.getElementById("table_panel"),
+ hand_panel: document.getElementById("hand_panel"),
+ turn: document.getElementById("turn-tracker"),
+ round: document.getElementById("action-round-tracker"),
+ stability: document.getElementById("stability-track"),
+ dem_TST: document.getElementById("dem-TST"),
+ com_TST: document.getElementById("com-TST"),
+ vp: document.getElementById("vp"),
+ spaces: document.getElementsByClassName("space-area")
+
+}
+
+
+function on_update() {
+ //console.log('on_update called')
+ //console.log('view.valid_spaces: ', view.valid_spaces)
+ //console.log('view.actions: ', view.actions)
+ //console.log('view.power_cards:', view.power_cards)
+ document.querySelectorAll('[id^="space_"].selected').forEach(spaceElement => {spaceElement.classList.remove('selected');});
+ document.getElementById("power_hand")?.querySelectorAll('.selected').forEach(cardElement => {cardElement.classList.remove('selected');});
+ view.valid_spaces.forEach(space_id => {
+ const spaceElementId = `space_${space_id}`;
+ const spaceElement = document.getElementById(spaceElementId);
+
+ if (spaceElement) {
+ spaceElement.classList.add('selected');
+ }
+ });
+
+ //Check influence values
+
+ for (let i = 1; i < spaces.length; i ++) {
+
+ const space = spaces[i]
+ const demInfl = view.demInfl[i]
+ const comInfl = view.comInfl[i]
+ //console.log('piece', piece)
+ //console.log('space', space)
+ const dem_marker = document.getElementById(`${space.name_unique}_demInfl`);
+ const dem_number = document.getElementById(`${space.name_unique}_demInflValue`);
+ const com_marker = document.getElementById(`${space.name_unique}_comInfl`);
+ const com_number = document.getElementById(`${space.name_unique}_comInflValue`);
+
+ dem_number.innerText=demInfl
+ if (demInfl > 0) {
+ dem_marker.style.display = 'block';
+ dem_number.style.display = 'block';
+
+ if (demInfl > 9) {
+ dem_number.classList.remove('demInflValue')
+ dem_number.classList.add('demInflValue_10')
+ } else {
+ dem_number.classList.add('demInflValue')
+ dem_number.classList.remove('demInflValue_10')
+ }
+
+ if(check_dem_control(demInfl, comInfl, space)){
+ dem_marker.classList.add('controlled')
+ dem_number.classList.add('outlined_text')
+ dem_marker.classList.remove('uncontrolled')
+ } else {
+ dem_marker.classList.add('uncontrolled')
+ dem_marker.classList.remove('controlled')
+ dem_number.classList.remove('outlined_text')
+ }
+ } else {
+ dem_marker.style.display = 'none';
+ dem_number.style.display = 'none';
+ }
+ com_number.innerText=comInfl
+ if (comInfl > 0) {
+ com_marker.style.display = 'block';
+ com_number.style.display = 'block';
+
+ if (comInfl > 9) {
+ com_number.classList.remove('comInflValue')
+ com_number.classList.add('comInflValue_10')
+ } else {
+ com_number.classList.add('comInflValue')
+ com_number.classList.remove('comInflValue_10')
+ }
+
+ if(check_com_control(demInfl, comInfl, space)){
+ com_marker.classList.add('controlled')
+ com_number.classList.add('controlled')
+ com_marker.classList.remove('uncontrolled')
+ com_number.classList.remove('uncontrolled')
+ } else {
+ com_marker.classList.add('uncontrolled')
+ com_number.classList.add('uncontrolled')
+ com_marker.classList.remove('controlled')
+ com_number.classList.remove('controlled')
+ }
+ } else {
+ com_marker.style.display = 'none';
+ com_number.style.display = 'none';
+ }
+
+ }
+
+// UPDATE COUNTRY MARKERS
+ for (let i = 0; i < countries.length; i++) {
+ const country = countries[i];
+ const marker = document.getElementById(country)
+ const times_held = document.getElementById(`${country}_times_held`)
+
+ if (view.revolutions[find_country_index(country)]) {
+ marker.classList.add('revolution')
+ marker.classList.remove('held')
+ marker.style.display = 'block'
+ times_held.classList.add('outlined_text')
+ times_held.classList.remove('hide')
+ } else if (view.times_held[find_country_index(country)] > 0 ) {
+ //console.log('setting ', country)
+ marker.classList.add('held')
+ marker.style.display = 'block'
+ times_held.classList.remove('hide')
+ times_held.innerHTML = view.times_held[find_country_index(country)]
+ }
+ else {marker.style.display = 'none'}
+ }
+
+// UPDATE ASIDE
+ if (view.is_pwr_struggle) {
+ ui.dem_hand_count.innerText = `${view.democrat_power_hand} Power cards`
+ ui.com_hand_count.innerText = `${view.communist_power_hand} Power cards`
+ } else{
+ ui.dem_hand_count.innerText = `${view.democrat_hand} cards`
+ ui.com_hand_count.innerText = `${view.communist_hand} cards`
+ }
+ ui.deck_length.innerText = `${view.strategy_deck} cards`
+
+// UPDATE HAND
+ document.getElementById("hand").replaceChildren()
+ document.getElementById("played_card").replaceChildren()
+
+ if (view.hand.length && view.is_pwr_struggle === false) {
+ document.getElementById("hand_panel").classList.remove("hide")
+ //console.log('view.actions.card', view.actions.card)
+ for (let c of view.hand) {
+ let card = ui.cards[c]
+ document.getElementById("hand").appendChild(card);
+ if (view.actions && view.actions.card && view.actions.card.includes(c)) {
+ card.classList.add('action')
+ } else {
+ card.classList.remove('action')
+ }
+ if (view.valid_cards.includes(c)) {
+ card.classList.add('selected')
+ } else {
+ card.classList.remove('selected')
+ }
+ card.classList.remove('discard_card')
+ }
+ } else {
+ document.getElementById("hand_panel").classList.add("hide")
+ }
+
+// UPDATE DISCARD
+document.getElementById("discard").replaceChildren()
+if (!view.is_pwr_struggle) {
+ for (let c of view.strategy_discard) {
+ let discard_card = ui.cards[c]
+ document.getElementById("discard").appendChild(discard_card)
+ discard_card.classList.add('discard_card')
+ discard_card.classList.remove('selected')
+ }
+} else if (view.is_pwr_struggle) {
+ for (let c of view.strategy_discard) {
+ let discard_card = ui.power_cards[c]
+ document.getElementById("discard").appendChild(discard_card)
+ discard_card.classList.add('discard_card')
+ discard_card.classList.remove('selected')
+ }
+}
+
+// DISCARD FOR EVENTS
+//console.log('view.discard',view.discard)
+if(view.discard) {
+ //document.getElementById("discard").replaceChildren()
+ document.getElementById("discard_panel").classList.remove("hide")
+ for (let c of view.strategy_discard) {
+ let discard_card = ui.cards[c]
+ document.getElementById("discard").appendChild(discard_card)
+ discard_card.classList.add('discard_card')
+ if (view.valid_cards.includes(c)) {
+ discard_card.classList.add('selected')
+ } else {
+ discard_card.classList.remove('selected')
+ }
+ }
+} else {
+ if (!show_discard) {
+ document.getElementById("discard_panel").classList.add("hide")
+ }
+}
+
+// UPDATE PERMANENTLY REMOVED CARDS
+document.getElementById("removed").replaceChildren()
+for (let c of view.strategy_removed) {
+ let discard_card = ui.cards[c]
+ document.getElementById("removed").appendChild(discard_card)
+ discard_card.classList.add('discard_card')
+ discard_card.classList.remove('selected')
+}
+
+
+// PLAYED CARD PANEL
+if (view.played_card > 0) {
+ document.getElementById("played_card_panel").classList.remove("hide")
+ document.getElementById("played_card").appendChild(ui.cards[view.played_card]);
+ document.getElementById("played_card").classList.remove("hand_card")
+} else {
+ document.getElementById("played_card_panel").classList.add("hide")
+}
+
+// TABLE CARDS PANEL
+document.getElementById("table_cards").replaceChildren()
+if (view.table_cards.length > 0) {
+ document.getElementById("table_panel").classList.remove("hide")
+ for (let c of view.table_cards) {
+ let card = ui.cards[c]
+ document.getElementById("table_cards").appendChild(card);
+ card.classList.remove("hand_card")
+ card.classList.add('event_card');
+ }
+ } else {
+ document.getElementById("table_panel").classList.add("hide")
+}
+
+// OPPONENT HAND
+document.getElementById("opp_hand").replaceChildren()
+if (!view.is_pwr_struggle) {
+ if (view.show_opp_hand && view.opp_hand.length >0) {
+ document.getElementById("opp_hand_panel").classList.remove("hide")
+ for (let c of view.opp_hand) {
+ let card = ui.cards[c]
+ document.getElementById("opp_hand").appendChild(card);
+ card.classList.remove('discard_card')
+ if (!view.is_pwr_struggle) {
+ if (view.valid_cards.includes(c)) {
+ card.classList.add('selected')
+ } else {
+ card.classList.remove('selected')
+ }
+ }
+ }
+ } else {
+ document.getElementById("opp_hand_panel").classList.add("hide")
+ }
+} else {
+ //console.log('power struggle, show opp hand', view.show_opp_hand, 'view opp hand', view.opp_hand )
+ if (view.show_opp_hand && view.opp_hand && view.opp_hand.length > 0) {
+ document.getElementById("opp_hand_panel").classList.remove("hide")
+ for (let c of view.opp_hand) {
+ let card = ui.power_cards[c]
+ //console.log('power_card:', power_card)
+ document.getElementById("opp_hand").appendChild(card);
+ card.classList.remove('discard_card')
+ }
+ } else {
+ document.getElementById("opp_hand_panel").classList.add("hide")
+ }
+}
+
+// POWER STRUGGLE HAND
+ document.getElementById("power_hand").replaceChildren()
+
+ if (view.power_hand.length && view.is_pwr_struggle) {
+ document.getElementById("power_panel").classList.remove("hide")
+ for (let c of view.power_hand) {
+ let power_card = ui.power_cards[c]
+ document.getElementById("power_hand").appendChild(power_card);
+ power_card.classList.remove('discard_card')
+ if (view.valid_cards.includes(c)) {
+ power_card.classList.add('selected');
+ }
+ }
+ } else {
+ document.getElementById("power_panel").classList.add("hide")
+ }
+
+// CEAUSESCU
+
+if (view.ceausescu_cards && view.ceausescu_cards.length > 0 && view.is_pwr_struggle === true) {
+ document.getElementById("ceausescu_panel").classList.remove("hide")
+ for (let c of view.ceausescu_cards) {
+ let power_card = ui.power_cards[c]
+ document.getElementById("ceausescu_hand").appendChild(power_card);
+ power_card.classList.remove('discard_card')
+
+ }
+} else {
+ document.getElementById("ceausescu_panel").classList.add("hide")
+}
+
+// SAMIZDAT CARD
+if (view.samizdat > 0 ) {
+ let samizdat_card = ui.cards[view.samizdat]
+ document.getElementById("samizdat_panel").classList.remove("hide")
+ document.getElementById("samizdat_card").appendChild(samizdat_card)
+} else {
+ document.getElementById("samizdat_panel").classList.add("hide")
+}
+
+// UPDATE BOARD MARKERS
+ ui.turn.className = `t${view.turn}`
+ if (view.round_player === 'Democrat') {
+ ui.round.className = `dem-action-round-tracker r${view.round}`
+ } else {
+ ui.round.className = `com-action-round-tracker r${view.round}`
+ }
+ ui.stability.className = `s${view.stability}`
+ ui.dem_TST.className = `tst${view.dem_tst}`
+ ui.com_TST.className = `tst${view.com_tst}`
+ if (view.vp >= -20 && view.vp <= 20) {
+ ui.vp.className = `vp${view.vp}`
+ } else if (view.vp > 20) {
+ ui.vp.className = `vp21`
+ } else if (view.vp < -20) {
+ ui.vp.className = `vp-21`
+ }
+
+//console.log('strategy discard: ', view.strategy_discard)
+//console.log('valid spaces: ', view.valid_spaces)
+
+//console.log('view.persistent_events', view.persistent_events)
+
+// UPDATE EVENT MARKERS ON THE BOARD
+
+for (let id of board_events) {
+ let marker = document.getElementById(`event_${id}`)
+ //console.log('event', id, marker)
+ if (view.persistent_events.includes(id)) {
+ marker.style.display = 'block'
+ } else {
+ marker.style.display = 'none'
+ }
+}
+
+
+// UPDATE EVENT MARKERS BELOW THE BOARD
+
+for (let id of box_events) {
+ let marker = document.getElementById(`event_${id}`)
+ //console.log('event', id, marker)
+ if (view.persistent_events.includes(id)) {
+ marker.style.display = 'block'
+ } else {
+ marker.style.display = 'none'
+ }
+}
+
+
+// CHECK WHETHER ANY EVENT MARKERS ARE SHOWING IN THE EVENTS BOX
+box_events_showing = false
+for (let id of box_events) {
+ if (view.persistent_events.includes(id)) {
+ box_events_showing = true;
+ }
+/*
+ //Special check for events which are not true/false
+ if (view.persistent_events['foreign_currency_debt_burden'] !== '') {
+ aside_events_showing = true
+ }
+ if (view.persistent_events['stand_fast'] !== '') {
+ aside_events_showing = true
+ }
+ */
+}
+
+if (box_events_showing) {
+ document.getElementById('events_panel').classList.remove("hide")
+} else {
+ document.getElementById('events_panel').classList.add("hide")
+}
+
+let systematization = document.getElementById('event_69')
+if (view.persistent_events.includes(69)) {
+ systematization.style.left = (spaces[view.systematization].box.x +20) + 'px';
+ systematization.style.top = spaces[view.systematization].box.y + 'px';
+}
+
+let tyrant = document.getElementById('event_97')
+if (view.persistent_events.includes(97)) {
+ tyrant.style.left = (spaces[view.the_tyrant_is_gone].box.x - 41) + 'px';
+ tyrant.style.top = (spaces[view.the_tyrant_is_gone].box.y + 23) + 'px';
+} else {tyrant.style.display = 'none'}
+
+ action_button("yes", "Yes")
+ action_button("no", "No")
+ action_button("start", "Start")
+ action_button("check", "Check held cards")
+ action_button("tst_7", "Cancel opponent event")
+ action_button("tst_8", "Event and operations")
+ action_button("end", "End Game")
+ action_button("continue", "Continue playing")
+ action_button("east_germany", "East Germany")
+ action_button("poland", "Poland")
+ action_button("czechoslovakia", "Czechoslovakia")
+ action_button("hungary", "Hungary")
+ action_button("romania", "Romania")
+ action_button("bulgaria", "Bulgaria")
+ action_button("extra", "Take action round")
+ action_button("pass", "Pass")
+ action_button("remove", "Remove SPs")
+ action_button("add", "Add SPs")
+ action_button("ops", "Operations")
+ action_button("discard", "Discard")
+ action_button("strike", "Strike")
+ action_button("march", "March")
+ action_button("rally", "Rally in the Square")
+ action_button("petition", "Petition")
+ action_button("bonus", "Calculate VP bonus")
+ action_button("scoring", "Score country")
+ action_button("retain", "Retain Power")
+ action_button("surrender", "Surrender Power")
+ action_button("take", "Take Power")
+ action_button("concede", "Concede")
+ action_button("struggle", "Begin power struggle")
+ action_button("raise", "Raise the stakes")
+ action_button("draw", "Draw")
+ action_button("scoring", "Scoring")
+ action_button("event", "Event")
+ action_button("opp_event", "Resolve opponent event")
+ action_button("influence", "Place SPs")
+ action_button("support_check", "Support Checks")
+ action_button("tst", "Tiananmen Square Track")
+ action_button("roll", "Roll a die")
+ action_button("done", "Done")
+ action_button("end_round", "End Round")
+ action_button("undo", "Undo")
+
+console.log('view.actions', view.actions)
+}
+
+// =========================== LOG FUNCTIONS ==============================================
+
+function sub_card_name(match, p1) {
+ let x = p1 | 0
+ return `<span class="card_name" onmouseenter="on_focus_card_tip(${x})" onmouseleave="on_blur_card_tip()">${cards[x].name}</span>`
+}
+
+function sub_power_card_name(match, p1) {
+ let x = p1 | 0
+ return `<span class="card_name">${power_cards[x].name}</span>`
+}
+
+function sub_power_card_value(match, p1) {
+ let x = p1 | 0
+ return `<span class="card_name">${x}</span>`
+}
+
+function sub_space_name(match, p1) {
+ let x = p1 | 0
+ let id = spaces[x].space_id
+ let name = spaces[x].name_unique
+ return `<span class="space_tip" onmouseenter="on_focus_space_tip(${id})" onmouseleave="on_blur_space_tip(${id})" onclick="on_click_space_tip(${id})">${name}</span>`
+}
+
+function sub_die(match) {
+ return die[match] || match
+}
+
+const die = {
+ D1: '<span class="die white d1"></span>',
+ D2: '<span class="die white d2"></span>',
+ D3: '<span class="die white d3"></span>',
+ D4: '<span class="die white d4"></span>',
+ D5: '<span class="die white d5"></span>',
+ D6: '<span class="die white d6"></span>'
+}
+
+// =========================== VISUAL FUNCTIONS ==========================================#
+
+function on_focus_card_tip(card_number) {
+ document.getElementById("tooltip").className = "card card_" + card_number
+}
+
+function on_blur_card_tip() {
+ document.getElementById("tooltip").classList = "card hide"
+}
+
+function on_focus_space_tip(id) {
+ space = document.getElementById(`space_${id}`)
+ space.classList.add("tip")
+}
+
+function on_click_space_tip(id) {
+ space = document.getElementById(`space_${id}`)
+ scroll_into_view(space)
+}
+
+function on_blur_space_tip(id) {
+ space = document.getElementById(`space_${id}`)
+ space.classList.remove("tip")
+}
+
+function toggle_pieces() {
+ document.getElementById("pieces").classList.toggle("hide")
+}
+
+
+function toggle_discard() {
+ if (show_discard) {
+ show_discard = false
+ } else {
+ show_discard = true
+ }
+ document.getElementById("discard_panel").classList.toggle("hide")
+}
+
+function toggle_removed() {
+ document.getElementById("removed_panel").classList.toggle("hide")
+}
+
+function check_dem_control(demInfl, comInfl, space) {
+ if ((demInfl - comInfl) >= space.stability) {
+ return true
+ } else{ false}
+}
+
+function check_com_control(demInfl, comInfl, space) {
+ if ((comInfl - demInfl) >= space.stability) {
+ return true
+ } else{ false}
+}
+
+function find_country_index(country) {
+ return countries.indexOf(country)
+}
+
+create_ui()