diff options
-rw-r--r-- | images/icon_com.png | bin | 0 -> 451 bytes | |||
-rw-r--r-- | images/icon_com.svg | 4 | ||||
-rw-r--r-- | images/icon_dem.png | bin | 0 -> 929 bytes | |||
-rw-r--r-- | images/icon_dem.svg | 20 | ||||
-rw-r--r-- | play.css | 85 | ||||
-rw-r--r-- | play.js | 20 | ||||
-rw-r--r-- | rules.js | 143 |
7 files changed, 155 insertions, 117 deletions
diff --git a/images/icon_com.png b/images/icon_com.png Binary files differnew file mode 100644 index 0000000..047a943 --- /dev/null +++ b/images/icon_com.png diff --git a/images/icon_com.svg b/images/icon_com.svg new file mode 100644 index 0000000..709c306 --- /dev/null +++ b/images/icon_com.svg @@ -0,0 +1,4 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="43" height="43"> +<path fill="#ffd400" d="M12.081 20.407 8.935 17.39l7.163-7.162 5.171.955-4.058 4.138s19.046 18.007 19.841 18.882.053 1.808-.346 2.285-1.441 1.09-2.245.295c-.857-.845-19.064-19.603-19.064-19.603Z" /> +<path fill="#ffd400" d="M12.073 27.125s7.686 4.087 12.201 3.6c4.515-.488 8.785-2.624 8.602-10.86S21.223 4.339 21.223 4.339s15.803 3.996 16.168 16.532c.305 10.471-6.04 14.399-12.445 14.094-6.407-.304-12.325-5.644-12.325-5.644l-.487.427.017.035s.481 1.006.085 1.463c-.754.869-1.453-.051-1.844.354-.392.404-1.18 3.02-2.377 4.197-1.198 1.176-2.273 1.645-3.078 1.241l-.319-.253c-.5-.75-.166-1.875.854-3.208 1.02-1.332 3.519-2.437 3.873-2.874s-.646-1.021.125-1.874c.405-.448 1.463-.095 1.463-.095z" /> +</svg> diff --git a/images/icon_dem.png b/images/icon_dem.png Binary files differnew file mode 100644 index 0000000..01fdd51 --- /dev/null +++ b/images/icon_dem.png diff --git a/images/icon_dem.svg b/images/icon_dem.svg new file mode 100644 index 0000000..31654df --- /dev/null +++ b/images/icon_dem.svg @@ -0,0 +1,20 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="43" height="43"> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M9.697 18.176c1.229 1.103 1.812 2.751 2.541 4.266.334.694.803 1.32 1.06 2.002-1.729.156-1.724 1.983-1.949 3.364-.27 1.663-1.669 2.281-2.181 3.717-.486 1.365.811 3.24 1.334 4.501.667 1.603 1.121 2.721 2.259 3.962a81 81 0 0 0 1.965 2.048c.2.202 16.654.169 16.566-.045-.938-2.285-1.303-5.005-1.824-7.386-.334-1.531-.861-3.291-1.696-4.705-.876-1.485-1.919-2.637-2.523-4.296-1.112-3.058-1.771-6.128-2.198-9.284-.213-1.585-.068-3.161-.385-4.728-.311-1.539-.538-3.028-.768-4.596-.111-.764-.448-1.586-.632-2.332-.189-.773-.185-1.65-.573-2.371-.725-1.348-2.679-1.442-3.481-.135-.836 1.36-.065 3.101.106 4.514.193 1.577.518 3.085.536 4.708.016 1.426-.087 3.044.07 4.446.121 1.063 1.278 4.716-.247 5.263-1.458.521-3.033-4.282-3.841-5.16-1.084-1.181-1.944-2.376-2.922-3.654-.494-.644-1.277-1.122-1.781-1.78-.477-.625-.793-1.307-1.267-1.917-.892-1.145-1.941-2.649-3.579-2.184-2.451.697-.799 2.27-.05 3.47.907 1.452 1.628 3.07 2.429 4.575.892 1.681 1.628 2.477 3.031 3.737z"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M16.8 33.111c.02.722 2.211 3.294 2.94 3.556.714.258 1.634-.251 2.051-.816.57-.776.188-1.182-.048-2.017"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M16.832 27.927c-.851-1.77-1.971-3.413-3.742-3.483"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M13.326 30.189c-.648-.262-1.488-1.775-2.003-2.253"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M10.116 34.26c1.34.676 3.202.848 4.669 1.521.998.459 3.481 2.272 3.962.184"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M20.263 36.73c-.146 1.165 1.205 4.106 2.293 4.525"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M27.521 40.59c1.14-.574 1.276-2.417 1.301-3.498"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M18.824 33.976c.033-.078-.106-.224.046-.154.173.852.373 1.437 1.242 1.398 1.009-.045 1.3-.79 1.03-1.441"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M17.519 34.604c-.274.067-.58.277-.819.412.283.859 1.293 1.405 2.095.811"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M7.109 12.732c.534-.41 1.137-.712 1.639-1.132"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M17.844 7.109c.153.342 2.378-.004 2.963-.048"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M18.975 11.849c.583.483 1.914.346 2.545.038"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M9.454 16.888c.621-.717 1.83-1.275 2.578-2.044"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M11.745 36.693c-.038-.013-.284-.001-.151-.044.53-.293 1.276-.816 1.606-1.231"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M21.469 24.433c.007.982-.367 2.246-.651 3.185"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M26.943 29.84c2.635.032.927 4.769.161 4.633"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M25.526 28.568c-.784.818-3.318.04-4.231-.37-1.434-.643-2.843-.89-4.403-.439-1.265.365-3.183 1.022-3.348 2.58-.174 1.667 1.858 2.454 3.149 2.795 2.466.652 4.956.583 7.401 1.293"/> +<path fill="#c4e3f5" stroke="#226d9b" stroke-width=".75" d="M18.039 30.677c-.251 1.043-.621 1.581-1.71 1.515-.863-.051-1.968-.637-1.607-1.669.739-2.116 4.617-1.011 2.745 1.349"/> +</svg> @@ -37,39 +37,53 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } #log .h5 { text-decoration: underline; } #log { background-color: floralwhite } -#log .h1 { background-color: tan ;} +#log .h1 { background-color: tan } #log .h2 { background-color: wheat } #log .h3 { background-color: wheat } -#log .h1, .h2:not(.group), .h3 { - text-transform: uppercase; +#log .marginalia { + display: block; + float: right; + text-indent: 0; + margin: 0; + margin-right: 6px; + padding: 0; +} + +#log .group .marginalia { + margin-right: 0; +} + +#log > div { clear: right } + +#log .h1, .h2, .h3 { + font-variant-caps: small-caps; border-top: 1px solid black; border-bottom: 1px solid black; - font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif; } -#log .h2:not(.group).dem { - font-size: 10px; - background-color: hsl(206, 85%, 80%); border-top: 1px solid hsl(206, 85%, 25%); border-bottom: 1px solid hsl(206, 85%, 25%);} -#log .h2:not(.group).com { - font-size: 10px; - background-color: hsl(355, 70%, 80%); - border-top: 1px solid hsl(355, 70%, 25%); +#log .h2.dem { + background-color: hsl(206, 85%, 80%); + border-top: 1px solid hsl(206, 85%, 25%); + border-bottom: 1px solid hsl(206, 85%, 25%); +} +#log .h2.com { + background-color: hsl(355, 70%, 80%); + border-top: 1px solid hsl(355, 70%, 25%); border-bottom: 1px solid hsl(355, 70%, 25%); } #log .group.dem { background-color: hsl(206, 85%, 90%); } #log .group.com { background-color: hsl(355, 70%, 90%); } #log .group.both { background-color: gainsboro; } -#log .h1, #log .h2, #log .h3 { margin: 6px 0; } - -#log .group {margin: 0 6px} +#log .group { margin: 0 6px; } +#log .header.group.dem { background-color: hsl(206, 85%, 85%); } +#log .header.group.com { background-color: hsl(355, 70%, 85%); } #log div { padding-left: 20px; text-indent: -12px; } #log div.i { padding-left: 32px; text-indent: -12px; } #log div.ii { padding-left: 44px; text-indent: -12px; } #log .card_name { font-style: italic; } -#log div.h2 .card_name { font-style: normal; } #log .card_name:hover { text-decoration: underline; } #log .space_tip:hover { cursor: pointer; text-decoration: underline; } @@ -90,27 +104,24 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } #log .icon { display: inline-block; vertical-align: -2px; - width: 12px; - height: 12px; - box-shadow: none; - border: none; - background-size: contain; - background-position: center; + background-size: 10px 10px; background-repeat: no-repeat; -} - -#log .icon.number { - background-color: white; + background-color: white; border: 1px solid #444; width: 10px; height: 10px; -} +} + +X#log .com_nc { background-image: url(images/icon_com.png) } +X#log .dem_nc { background-image: url(images/icon_dem.png) } -#log .com_nc { background-image: url(images/SVd_blank.gif);} -#log .com_c {background-image: url(images/SV_blank.gif);} -#log .dem_nc { background-image: url(images/USd_blank.gif);} -#log .dem_c {background-image: url(images/favicon_dem.svg);} +#log .com_c { background-image: url(images/icon_com.png) } +#log .dem_c { background-image: url(images/icon_dem.png) } +#log .com_c { background-color: hsl(358, 66%, 45%) } +#log .com_nc { background-color: hsl(358, 66%, 80%) } +#log .dem_c { background-color: #147fc0 } +#log .dem_nc { background-color: #c4e2f6 } /* MAP */ @@ -179,7 +190,7 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } height: 15px; width: 100px; } - + .box.d_pres { background: linear-gradient(to right, rgba(0, 0, 255, 0.75) 0%, rgba(0, 0, 255, 0.75) 20%, transparent 20%, transparent 100%); } .box.c_pres { background: linear-gradient(to right, transparent 0%, transparent 80%,rgba(255, 0, 0, 0.75) 80%, rgba(255, 0, 0, 0.75) 100%); } @@ -197,7 +208,7 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } .box.c_pres.c_dom { background: linear-gradient(to right, transparent 50%, rgba(255, 0, 0, 0.75) 50%, rgba(255, 0, 0, 0.75) 100%); } .box.d_pres.c_pres.c_dom { background: linear-gradient(to right, rgba(0, 0, 255, 0.75) 0%, rgba(0, 0, 255, 0.75) 20%, transparent 20%, transparent 50%, rgba(255, 0, 0, 0.75) 50%, rgba(255, 0, 0, 0.75) 100%); } - + .box.c_pres.c_ctrl { background: linear-gradient(to right, transparent 20%, rgba(255, 0, 0, 0.75) 20%, rgba(255, 0, 0, 0.75) 100%); } .box.d_pres.c_pres.c_ctrl { background: linear-gradient(to right, rgba(0, 0, 255, 0.75) 0%, rgba(0, 0, 255, 0.75) 20%, transparent 20%, rgba(255, 0, 0, 0.75) 20%, rgba(255, 0, 0, 0.75) 100%); } @@ -540,12 +551,4 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } .card.power_50 { background-image: url(cards75/power_50.avif) } .card.power_51 { background-image: url(cards75/power_51.avif) } .card.power_52 { background-image: url(cards75/power_52.avif) } -/*.card.power_53 { background-image: url(cards75/power_back.avif) } -.card.power_card.power_53 { - background-color: transparent; - width: 188px; - height: 263px; - border-radius: 0; - border: none; - box-shadow: none; -} */
\ No newline at end of file +.card.power_53 { background-image: url(cards75/power_back.avif) } @@ -624,7 +624,7 @@ function layout_vp_marker() { } function layout_country(id) { - // TODO: what number to display? + // TODO: what number to display? if (view.revolutions[id]) ui.countries[id].className = "marker demInfl ctl v" + view.times_held[id] else if (view.times_held[id] > 0) @@ -848,11 +848,12 @@ function on_update() { ui.hand.appendChild(ui.cards[c]) ui.power_hand.replaceChildren() - if (view.is_pwr_struggle) + if (view.is_pwr_struggle) { ui.power_hand.appendChild(ui.power_cards[53]) if (view.power_hand.length > 0) for (let c of view.power_hand) ui.power_hand.appendChild(ui.power_cards[c]) + } ui.power_discard.replaceChildren() if (view.power_struggle_discard) @@ -992,15 +993,14 @@ function sub_icon(match) { return ICONS[match] || match } -function sub_arrow(match) { - return '<span> → </span>' +function sub_arrow(_match) { + return " \u2192 " } function wrap_icons(match) { - return `<span class="icon_holder">${match}</span>`; + return `<span class="marginalia">${match.replace("(", "").replace(")", "")}</span>` } - const ICONS = { '£CC': '<span class="icon com_c"></span>', '£CU': '<span class="icon com_nc"></span>', @@ -1045,9 +1045,7 @@ function on_log(text, ix) { p.className = "i" } -/* - text = text.replace(/(\(£[CDU][CU]\s\.to\s£[CDU][CU]\))/g, wrap_icons) -*/ + text = text.replace(/(\(£[CDU][CU]\s\.to\s£[CDU][CU]\))/g, wrap_icons) text = text.replace(/_/g, " ") text = text.replace(/C(\d+)/g, sub_card_name) @@ -1122,13 +1120,13 @@ function on_log(text, ix) { log_event = 0 } -//Group events + // Group events // Reset group box counters (when log is rewound) if (ix <= log_event) log_event = 0 if (!scoring_cards.includes(event_n)) { if (text.match(/^.E:/)) { - p.classList.add("h2") + p.classList.add("header") log_event = ix text = text.replace(".E:", "") } @@ -679,7 +679,7 @@ states.play_card = { view.actions.event = 0 } } - + // Special check for Reformer Rehabilitated if (game.played_card === C_REFORMER_REHABILITATED && game.playable_cards.includes(C_REFORMER_REHABILITATED)) { if (game.active === DEM && (game.dem_tst_position > game.com_tst_position)) { @@ -1969,7 +1969,6 @@ states.general_strike_roll = { }, } - states.honecker = { inactive: 'resolve Honecker', prompt() { @@ -2204,10 +2203,10 @@ states.stasi_play_ceh = { return `play ${quoted_card_name[game.played_card]}` }, prompt() { - view.prompt = "Play " + quoted_card_name[game.played_card] - gen_action('influence') - gen_action('support_check') - }, + view.prompt = 'Play ' + quoted_card_name[game.played_card] + gen_action('influence') + gen_action('support_check') + }, influence() { push_undo() log_ops_banner() @@ -2272,7 +2271,7 @@ function add_infl(space, ops) { game.demInfl[space]++ } - let end_control = check_control(space) + let end_control = check_control(space) log_summary('£ in %' + space + get_icons(starting_control,end_control)) check_tyrant() @@ -2777,7 +2776,7 @@ function check_control(space) { return 'd_ahead' else if (game.comInfl[space] > game.demInfl[space]) return 'c_ahead' - else + else return "none" } @@ -2814,9 +2813,9 @@ function get_icons(starting_control, end_control) { return ' (£UU .to £DC)' else if (starting_control === 'none' && end_control === COM) return ' (£UU .to £CC)' - else + else return '' - } + } else return '' } @@ -3094,7 +3093,7 @@ function score_country(country) { if (presence.com_battlegrounds > 0) { logi(`${presence.com_battlegrounds} VP for Battlegrounds`) com_vp -= presence.com_battlegrounds - } + } } else { logi('0 VP') } @@ -3105,7 +3104,7 @@ function score_country(country) { if (presence.dem_battlegrounds > 0) { logi(`${presence.dem_battlegrounds} VP for Battlegrounds`) dem_vp += presence.dem_battlegrounds - } + } } else { logi('0 VP') } @@ -3242,7 +3241,7 @@ function end_stasi_choose_card() { if (game.stasi_card === C_COMMON_EUROPEAN_HOME) { game.state = 'stasi_confirm' } else { - end_stasi() + end_stasi() } } @@ -3265,7 +3264,7 @@ function end_goddess() { log_h2("Action Round " + game.round) if (game.active === DEM) { change_player() - } + } if (game.persistent_events.includes(C_GENERAL_STRIKE)) { game.state = 'general_strike' } else { @@ -3875,7 +3874,7 @@ function end_round() { game.round_player = DEM if (game.active !== DEM) { change_player() - } + } if (game.democrat_hand.includes(game.stasi_card)) { game.state = 'stasi_play_card' } else { @@ -4011,7 +4010,7 @@ function new_turn() { } if (game.active === DEM) log('Democrat:') - else + else log('Communist:') game.state = 'tst_goddess' } else { @@ -4254,7 +4253,7 @@ function check_systematization() { if (game.systematization > 0) { game.valid_spaces = game.valid_spaces.filter(n => n !== game.systematization) } -} +} function this_card() { return game.vm_event > 0 ? game.vm_event : game.played_card @@ -4290,34 +4289,42 @@ function log(msg) { } function log_ops_banner() { + log_br() if (game.active === DEM) log('.O.d') - else + else log('.O.c') + log_br() finish_select_card() } function log_event_banner() { + log_br() if (game.active === DEM) log('.V.d') - else + else log('.V.c') + log_br() } function log_struggle_banner(n) { + log_br() if (game.active === DEM) log('.S.dC' + n) else log('.S.cC' + n) + log_br() } function log_tst_8_banner() { + log_br() if (game.active === DEM) log('.T.d') - else + else log('.T.c') + log_br() finish_select_card() -} +} function log_event(n) { log_br() @@ -4326,7 +4333,7 @@ function log_event(n) { else if (cards[n].side === "D") game.log.push(".E:C" + n + ".D") else - game.log.push(".E:C" + n + ".N") + game.log.push(".E:C" + n + ".N") } function log_br() { @@ -4344,15 +4351,21 @@ function logii(msg) { } function log_h1(msg) { + log_br() log(".h1 " + msg) + log_br() } function log_h2(msg) { + log_br() log(".h2 " + msg) + log_br() } function log_h3(msg) { + log_br() log(".h3 " + msg) + log_br() } function log_h4(msg) { @@ -4378,7 +4391,7 @@ function log_msg_gap(msg) { function logi_msg_gap(msg) { game.log.push(">" + msg) log_br() -} +} function log_round() { log_h2(`Action Round ${game.round}`) @@ -4436,75 +4449,75 @@ function pop_summary_i() { function pop_summary_i() { if (game.summary.length > 0) { // Create a map to group by space and track totals and details - let grouped_summary = new Map(); - let c63_logged = false; - let deferred_logs = []; + let grouped_summary = new Map() + let c63_logged = false + let deferred_logs = [] - for (let [n, msg] of game.summary) { + for (let [ n, msg ] of game.summary) { // Special case: Log C63 only once - if (msg === "(-1 Op due to C63)") { + if (msg === '(-1 Op due to C63)') { if (!c63_logged) { - logi(msg); - c63_logged = true; + logi(msg) + c63_logged = true } - continue; + continue } // Direct log for messages like C50, C123 if (!/^£/.test(msg)) { if (msg.includes('VP')) { - deferred_logs.push(msg); - } else { - logi(msg); - } + deferred_logs.push(msg) + } else { + logi(msg) + } } // Extract the space identifier (e.g., %33) and type (e.g., "in" or "from") - let space_match = msg.match(/(in|from) (%\d+)/); - if (!space_match) continue; // Skip if no valid match + let space_match = msg.match(/(in|from) (%\d+)/) + if (!space_match) + continue // Skip if no valid match - let type = space_match[1]; - let space = space_match[2]; + let type = space_match[1] + let space = space_match[2] // Extract additional details (e.g., £DC .to £UU) - let details_match = msg.match(/\((.*?)\)$/); - let details = details_match ? details_match[1] : ""; + let details_match = msg.match(/\((.*?)\)$/) + let details = details_match ? details_match[1] : '' // Split the details into "start" and "end" parts - let [start, end] = details.split(" .to "); + let [ start, end ] = details.split(' .to ') // Group by type and space - let key = `${type} ${space}`; + let key = `${type} ${space}` if (!grouped_summary.has(key)) { - grouped_summary.set(key, { total: 0, start: "", end: "" }); + grouped_summary.set(key, { total: 0, start: '', end: '' }) } - let entry = grouped_summary.get(key); - entry.total += n; + let entry = grouped_summary.get(key) + entry.total += n // Update the start only if it's not already set if (start && !entry.start) { - entry.start = start; + entry.start = start } // Always update the end with the most recent value if (end) { - entry.end = end; + entry.end = end } } // Log the grouped results - for (let [key, { total, start, end }] of grouped_summary) { - let details = start && end ? ` (${start} .to ${end})` : ""; - logi(`${total} ${key}${details}`); + for (let [ key, { total, start, end } ] of grouped_summary) { + let details = start && end ? ` (${start} .to ${end})` : '' + logi(`${total} ${key}${details}`) } for (let msg of deferred_logs) { - logi(msg); - } + logi(msg) + } } - game.summary = []; -} - + game.summary = [] +} function do_log_summary() { if (game.summary.length > 0) { @@ -4702,7 +4715,7 @@ function vm_return() { delete game.vm_max_infl delete game.vm_influence_added delete game.communist_hand_red - game.vm_event = 0 + game.vm_event = 0 if (game.persistent_events.includes(C_AUSTRIA_HUNGARY_BORDER_REOPENED)) { reset_austria_hungary_border_reopened() } @@ -4956,7 +4969,7 @@ function vm_take_control(space) { let end_control = check_control(space) if (game.state === 'vm_kremlin_coup_take_control') logi('Took control of %' + space + get_icons(starting_control, end_control) +'.') - else + else log('Took control of %' + space + get_icons(starting_control, end_control) +'.') } @@ -4991,7 +5004,7 @@ function vm_add_infl_free() { function vm_add_x_infl() { game.vm_available_ops = vm_operand(1) - if (!(game.vm_event === C_PUBLIC_AGAINST_VIOLENCE && + if (!(game.vm_event === C_PUBLIC_AGAINST_VIOLENCE && event_prompt() === 'Presov')) log('Placed SP:') game.state = 'vm_add_x_infl' @@ -5000,7 +5013,7 @@ function vm_add_x_infl() { function vm_do_add_x_infl(space) { push_undo() let starting_control = check_control(space) - + if (game.active === COM) { game.comInfl[space] += game.vm_available_ops } else { @@ -5350,7 +5363,7 @@ function vm_ceausescu_prep() { function vm_ceausescu() { game.persistent_events = game.persistent_events.filter(n => n!== C_CEAUSESCU) let adj_cluj = false - + if (game.demInfl[S_TIMISOARA] > 0) { adj_cluj = true } @@ -6437,7 +6450,7 @@ states.vm_remove_infl = { else { if (game.vm_event === C_CEAUSESCU) prompt_event(`${event_prompt()}.`) - else + else prompt_event(`Remove ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}.`) } for (let space_id of game.valid_spaces) { @@ -6897,7 +6910,7 @@ states.vm_common_european_home_play = { game.state = 'vm_ceh_support_check_prep' valid_spaces_sc() }, - tst() { + tst() { push_undo() log_gap(`Played C${game.vm_event} to the Tiananmen Square Track`) game.state = 'vm_tiananmen_square_attempt' @@ -8191,7 +8204,7 @@ states.vm_we_are_the_people_remove = { space(space) { remove_infl(space, 'vm_available_ops') if (game.vm_influence_added[S_LUTHERAN_CHURCH] === 4 || - game.valid_spaces.length === 0 + game.valid_spaces.length === 0 ) { do_log_summary() finish_we_are_the_people() @@ -8383,7 +8396,7 @@ states.vm_tst_6 = { if (game.active === DEM) log('Democrat free 2 Ops support check.') else - log('Communist free 2 Ops support check.') + log('Communist free 2 Ops support check.') game.selected_space = space if ( game.active === DEM && |