From d53aa3d5af6950d0ac4bfbcb5ab214a083c28e3a Mon Sep 17 00:00:00 2001 From: iainp5 Date: Fri, 11 Oct 2024 08:32:59 +0100 Subject: Added die images --- play.css | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'play.css') diff --git a/play.css b/play.css index 9171d3d..8b3f266 100644 --- a/play.css +++ b/play.css @@ -18,7 +18,6 @@ header.your_turn { background-color: orange; } } #deck_stat {padding-left: 5px; padding-bottom: 5px;} -#tank {margin-right: 0;} #log { background-color: whitesmoke; } #log .h1 { font-weight: bold; padding-top:2px; padding-bottom:2px; text-align: center; } @@ -43,10 +42,25 @@ header.your_turn { background-color: orange; } #log .card_name:hover { text-decoration: underline; } #log .space_tip:hover { cursor: pointer; text-decoration: underline; } -/* Below currently not used -#log .lord_tip:hover { cursor: pointer; text-decoration: underline; } - -#log .way_tip:hover { cursor: pointer; text-decoration: underline; } */ +#log .die { + display: inline-block; + vertical-align: -3px; + width: 12px; + height: 12px; + background-size: 600% 100%; + background-repeat: no-repeat; + background-image: url(images/die_black_pips.svg); + background-color: #fff; + border: 1px solid #444; +} + +#log .d0 { background-position: -100% 0 } +#log .d1 { background-position: 0% 0; } +#log .d2 { background-position: 20% 0; } +#log .d3 { background-position: 40% 0; } +#log .d4 { background-position: 60% 0; } +#log .d5 { background-position: 80% 0; } +#log .d6 { background-position: 100% 0; } .selected { cursor: pointer; -- cgit v1.2.3 From 6e7a3c69a79ecca8e45df60b59a22de504e1a2f5 Mon Sep 17 00:00:00 2001 From: iainp5 Date: Sat, 12 Oct 2024 14:21:30 +0100 Subject: Updates to events handling --- events.txt | 175 +++++++++--------- play.css | 2 +- play.js | 10 +- rules.js | 591 ++++++++++++++++++++++++++++++++++++------------------------- 4 files changed, 453 insertions(+), 325 deletions(-) (limited to 'play.css') diff --git a/events.txt b/events.txt index 7f83643..85b50bf 100644 --- a/events.txt +++ b/events.txt @@ -1,41 +1,41 @@ CARD 1 - Legacy of Martial Law* # Replace 1 Democratic SP with a Communist SP in Poland and make a Support Check using the Ops value of this card in Poland. +permanently_remove valid_spaces_country_opp 'Poland' prompt 'replace 1 Democratic SP in Poland with a Communist SP' legacy_of_martial_law valid_spaces_country_sc 'Poland' prompt 'make a Support Check in Poland' 1_support_check -permanently_remove CARD 2 - Solidarity Legalised* # Place a Democratic SP in every uncontrolled Worker and Farmer space in Poland. Allows play of Walesa. +permanently_remove solidarity_legalised valid_spaces_solidarity_legalised prompt 'to every uncontrolled Worker and Farmer space in Poland' add_limited_infl 9 1 -permanently_remove CARD 3 - Walesa # Place a total of 4 SPs in any spaces(s) in Poland. The Democratic Player may then may Support Checks in Poland using the Ops value of this card. Requires Solidarity Legalized* to be played as event. +permanently_remove valid_spaces_country 'Poland' prompt 'any space(s) in Poland' add_infl_free 4 valid_spaces_country_sc 'Poland' prompt 'make Support Checks in Poland' support_check 2 -permanently_remove CARD 4 - Michnik # Place 3 Democratic SPs in the Polish Intellectuals space. +permanently_remove valid_spaces 26 prompt 'the Polish Intellectuals space' add_x_infl 3 -permanently_remove CARD 5 - General strike @@ -50,9 +50,9 @@ brought_in_for_questioning CARD 7 - State Run Media* # Remove four Democratic SPs, no more than 2 per space. +permanently_remove valid_spaces_opponent remove_limited_opp_infl 4 2 -permanently_remove CARD 8 - Prudence @@ -62,18 +62,20 @@ prudence CARD 9 - The Wall* # Place in front of the Communist Player. In his next Support Check in Germany cancel drm for any adjacent spaces controlled by the Democratic Player. -the_wall permanently_remove +the_wall CARD 10 - Cult of Personality # Place 4 Communist SPs in Worker or Farmer spaces in Romania, no more than 2 per space. +permanently_remove if !game.the_tyrant_is_gone valid_spaces_country_socio_2 'Romania', 3, 4 prompt 'Worker or Farmer spaces in Romania, no more than 2 per space' add_limited_infl 4 2 +else +tyrant_block endif -permanently_remove CARD 11 - Dissident arrested @@ -85,16 +87,16 @@ remove_x_opp_infl 2 CARD 12 - Apparatchicks # Place 3 Communist SPs in any Bureaucratic space(s). +permanently_remove valid_spaces_socio 2 prompt ' to any Bureaucratic space(s)' add_infl_free 3 -permanently_remove CARD 13 - Stasi # For the rest this turn the Democratic Player must reveal the card he will play this action round before the Communist plays his card. -stasi permanently_remove +stasi CARD 14 - Gorbachev Charms the West @@ -114,8 +116,8 @@ honecker CARD 16 - Nomenklatura* # Place 3 SPs in any Elite space(s), or remove all Democratic SPs from Elite spaces. -nomenklatura permanently_remove +nomenklatura CARD 17 - Roundtable talks @@ -125,18 +127,18 @@ roundtable_talks CARD 18 - Poszgay Defends the Revolution # Place Communist SPs in 4 spaces in Hungary not under Democratic control. +permanently_remove poszgay prompt 'to 4 spaces in Hungary not under Democratic control' add_limited_infl 4 1 -permanently_remove CARD 19 - Papal vist # Place 3 SPs in any Catholic Church space. +permanently_remove valid_spaces 20 35 38 prompt 'any Catholic Church space' add_x_infl 3 -permanently_remove CARD 20 - Deutsche Marks* @@ -162,6 +164,7 @@ power_struggle CARD 24 - St Nicolas Church # Place sufficient Democratic SPs in the Lutheran Church space for Democratic control. Allows play of The Monday Demonstrations. +permanently_remove valid_spaces 6 prompt 'the Lutheran Church' take_control_prep 1 @@ -170,13 +173,14 @@ st_nicholas_church CARD 25 - Perestroika # +1 Ops value for cards played by the Communist for the rest of turn. +permanently_remove perestroika CARD 26 - Helsinki Final Act* # +1 VP for every Support Check die roll by the Communist Player in Student or Intellectual spaces the rest of the game. -helsinki_final_act permanently_remove +helsinki_final_act CARD 27 - Consumerism @@ -199,10 +203,10 @@ remove_limited_opp_infl 3 2 CARD 29 - Jan Palach Week* # Place 6 Democratic SPs in the Charles University space. +permanently_remove valid_spaces 30 prompt 'the Charles University space' add_x_infl 6 -permanently_remove CARD 30 - Tear Gas @@ -219,33 +223,33 @@ add_limited_infl 4 2 CARD 32 - Peasant Parties* # Place 4 Communist SPs in Farmer spaces, no more than 2 per space. +permanently_remove valid_spaces_socio 3 prompt 'Farmer spaces, no more than 2 per space' add_limited_infl 4 2 -permanently_remove CARD 33 - Sajudis* # +1 VP. Reduce USSR stability by 1. Place sufficient Democratic support in any Minorities space for control. Allows play of The Baltic Way. +permanently_remove sajudis_check prompt 'any Minorities space' take_control_prep 1 sajudis -permanently_remove CARD 34 - Fidesz* # Place 5 Democratic SPs in Hungary Student space. +permanently_remove valid_spaces 47 prompt 'the Hungary students space' add_x_infl 5 -permanently_remove CARD 35 - Heal our Bleeding Wounds* # If played in Early Year, -3 VPs. If played in Mid Year, -1 VP. If played in Late Year, +3 VPs. -heal_our_bleeding_wounds permanently_remove +heal_our_bleeding_wounds CARD 36 - Dash for the West* @@ -255,28 +259,28 @@ prompt 'Dash for the West: select any Democratic event with an asterix(*) from t dash_for_the_west - CARD 37 - Nagy Reburied* # Remove all Communist SPs from the Hungary Elite space. Then place 4 Communist SPs in Hungary, no more than 2 per space. +permanently_remove nagy_reburied prompt 'the Hungary Elite space' remove_all_infl 1 valid_spaces_country 'Hungary' prompt 'Hungary, no more than 2 per space' add_limited_infl 4 2 -permanently_remove CARD 38 - July Concept # Place 3 Communist SPs in Bulgaria +permanently_remove valid_spaces_country 'Bulgaria' prompt 'Bulgaria' add_infl_free 3 -permanently_remove CARD 39 - Eco-Glasnost* # Place 4 Democratic SPs in Ruse. +permanently_remove valid_spaces 66 prompt 'Ruse' add_x_infl 4 @@ -285,17 +289,18 @@ eco_glasnost CARD 40 - Hungarian Democratic Forum # Place 3 Democratic SPs in Hungary and make one Support Check in Hungary. +permanently_remove valid_spaces_country 'Hungary' prompt 'Hungary' add_infl_free 3 valid_spaces_country_sc 'Hungary' prompt 'make a Support Check in Hungary' 1_support_check -permanently_remove CARD 41 - Ceausescu* # Remove 3 Democratic SPs in Romania and make a Support Check in Romania using the Ops value of this card. If the Democratic Player has any SPs in spaces adjacent to Cluj at the end of this action round remove 1 Communist SP from Bucharest. May not be played as an event after The Tyrant is Gone. +permanently_remove if !game.the_tyrant_is_gone valid_spaces_country_opp 'Romania' prompt ' from Romania' @@ -305,8 +310,9 @@ prompt 'make a support check in Romania' 1_support_check prompt ' from Bucharesti' ceausescu +else +tyrant_block endif -permanently_remove CARD 42 - Power Struggle - East Germany @@ -321,6 +327,7 @@ power_struggle CARD 44 - Inflationary Currency # Target any Country where your opponent has Power. Place 2 SPs and make 1 Support Check in the Country using the Ops value of this card. Your opponent may cancel the Support Check by discarding a 3 Ops value card. +permanently_remove inflationary_currency valid_spaces_country_opp prompt ()=>` from ${country_name(game.vm_active_country)}` @@ -331,71 +338,70 @@ valid_spaces_country_sc prompt `make a Support Check in ${country_name(game.vm_active_country)}` 1_support_check endif -permanently_remove CARD 45 - Soviet Troop Withdrawals* # The Democratic Player may remove 5 Communist SPs from Eastern Europe, no more than 2 per space. +permanently_remove valid_spaces_region_opp 'Eastern Europe' prompt ' from Eastern Europe' remove_limited_opp_infl 5 2 -permanently_remove CARD 46 - Goodbye Lenin!* # The Communist Player must reveal all his events with title written in red. The Democrat may exchange this card for any of them with the event occurring immediately, or he may play this card for Operations. -goodbye_lenin permanently_remove +goodbye_lenin CARD 47 - Bulgarian Turks Expelled* # -2 VP. Remove any Democratic SPs in Razgrad. +permanently_remove bulgarian_turks_expelled prompt 'Razgrad' remove_all_infl 1 -permanently_remove CARD 48 - We are the People!* # The Democrat can move up to 4 SPs from the Lutheran Church space to any spaces in Germany, no more than 2 per space. The Communist may no longer make Support Checks in Leipzig. -we_are_the_people permanently_remove +we_are_the_people CARD 49 - Foreign Currency Debt Burden* # The Democrat designates 1 country in Eastern Europe. For the rest of this turn the Communist has a -2 modifier for support checks in this country. -foreign_currency_debt_burden permanently_remove +foreign_currency_debt_burden CARD 50 - The Sinatra Doctrine* # +1 Ops value for cards played by the Democratic Player the rest of this turn. -the_sinatra_doctrine permanently_remove +the_sinatra_doctrine CARD 51 - 40th Anniversary Celebration* # Place 2 Communist SPs in Germany. If Communist is ahead add 4 SPs. Then subtract 1 VP. +permanently_remove 40th_anniversary_celebration valid_spaces_country 'East_Germany' prompt 'East Germany' add_infl_free 40th_anniversary_celebration_vp -permanently_remove CARD 52 - Normalisation # Remove all Democratic SPs from the Czechoslovakia Elite and Bureaucrat Spaces. +permanently_remove normalisation prompt 'the Czechoslovakia Elite and Bureaucrat Spaces' remove_all_infl 2 -permanently_remove CARD 53 - Li Peng* # +1 modifier to all Communist Tiananmen Square track attempts for the rest of the game -li_peng permanently_remove +li_peng CARD 54 - The Crowd Turns Against Ceausescu* @@ -410,17 +416,17 @@ power_struggle CARD 56 - Foreign Television # Remove 4 Communist SPs no more than 2 per space. +permanently_remove foreign_television remove_limited_opp_infl 4 2 -permanently_remove CARD 57 - Central Committee Reshuffle* # Place 3 Communist SPs in any Country where the Communist holds Power. +permanently_remove central_committee_reshuffle prompt `${country_name(game.vm_active_country)}` add_infl_free 3 -permanently_remove CARD 58 - Austria-Hungary Border Reopened* @@ -435,21 +441,21 @@ grenztruppen CARD 60 - Toxic Waste* # Add 3 Democratic SPs in any Worker space(s). +permanently_remove valid_spaces_socio 4 prompt 'any Worker space(s)' add_infl_free 3 -permanently_remove CARD 61 - The Monday Demonstrations* # Place sufficient SPs in the Lutheran Church Space and Leipzig for Democratic control. Then the Democratic Player may make FIVE support checks in Germany using the Ops value of this card. Requires play of St. Nicholas Church as an event. +permanently_remove the_monday_demonstrations prompt 'the Lutheran Church Space and Leipzig' take_control_prep 2 valid_spaces_country_sc 'East_Germany' prompt 'make 5 Support Checks in East Germany' support_check 5 -permanently_remove CARD 62 - Yakovlev Counsels Gorbachev* @@ -464,24 +470,24 @@ genscher CARD 64 - Legacy of 1968* # The Democratic Player may place 1 SP in all spaces in Czechoslovakia not controlled by the Communist Player +permanently_remove legacy_of_1968 prompt 'all spaces in Czechoslovakia not controlled by the Communist Player' add_limited_infl 11 1 -permanently_remove CARD 65 - Presidential Visit* # The Communist's hand size is reduced to 7 next turn. -presidential_visit permanently_remove +presidential_visit CARD 66 - New Forum # Place a Democratic SP in 3 spaces in Germany +permanently_remove valid_spaces_country 'East_Germany' prompt '3 spaces in East Germany' add_limited_infl 3 1 -permanently_remove CARD 67 - Reformer Rehabilitated* @@ -492,19 +498,19 @@ reformer_rehabilitated CARD 68 - Klaus and Komarek* # Remove 2 Communist SPs and add 2 Democratic SPs in Prague. +permanently_remove klaus_and_komarek prompt 'Prague' remove_x_opp_infl 2 valid_spaces 29 add_x_infl 2 -permanently_remove CARD 69 - Systematization* # The Communist player may eliminate 1 space in Romania. Any Democratic SPs are eliminated. Communist SPs are relocated to Bucharest. The connections to the destroyed space are considered to pass through and connect the adjacent spaces directly. +permanently_remove valid_spaces_country 'Romania' systematization -permanently_remove CARD 70 - Securitate* @@ -525,6 +531,7 @@ peasant_parties_revolt CARD 73 - Laszlo Tokes* # Place 1 Democratic SP in Timisoara and Harghita/Covasna. The Democratic may then place SPs or make Support Check rolls in Romania using the Ops value of this card. Allows play of Massacre in Timisoara. +permanently_remove valid_spaces 50 56 prompt 'in Timisoara and Harghita/Covasna' add_limited_infl 2 1 @@ -536,8 +543,6 @@ else prompt 'make 2 Support Checks in Romania' support_check 2 endif -permanently_remove - CARD 74 - FRG Embassies @@ -547,12 +552,13 @@ frg_embassies CARD 75 - Exit Visas* # The Democratic Player may discard any cards in his hand and draw new cards from the deck. -exit_visas permanently_remove +exit_visas CARD 76 - Warsaw Pact Summit # The Warsaw Pact holds a summit in Bucharest. The Communist player chooses who dominates the summit, the hardliners or the reformers. The Communist may either make 2 Support Checks with a +2 drm against Student and intellectual spaces, or place 4 SPs in spaces with no influence that are not controlled by the Democratic player. +permanently_remove warsaw_pact_summit if game.phase === 3 prompt ' spaces with no Democratic SPs' @@ -562,13 +568,12 @@ prompt 'Select a Student or Intellectual space' valid_spaces_country_socio_2 3, 4 support_check_modified 2 2 endif -permanently_remove CARD 77 - Samizdat # The Democratic Player can put a card in his hand aside for next turn and draw a replacement card from the deck. -samizdat permanently_remove +samizdat CARD 78 - Workers Revolt @@ -578,95 +583,99 @@ workers_revolt CARD 79 - The Third Way* # -2 VP. Place 3 Communist SPs in the German writers space. +permanently_remove the_third_way valid_spaces 4 prompt 'the East German Writers space' add_x_infl 3 -permanently_remove CARD 80 - Nepotism* # Roll a die. 1-2: Place 4 Communist SPs in Worker spaces in the Balkans. 3-4: add 3 SPs in Worker spaces in the Balkans. 5-6: add 1 SP to a Worker space in the Balkans. +permanently_remove nepotism valid_spaces_region_socio 'Balkans', 4 prompt 'Worker spaces in the Balkans' add_infl_free -permanently_remove CARD 81 - The Baltic Way* # +2 VP. Reduce USSR stability by 1. Place sufficient Democratic SPs in any Minorities space for control. .Requires play of Sajudis. Allows play of Breakaway Baltic Republics. +permanently_remove the_baltic_way prompt 'any Minorities space' take_control_prep 1 -permanently_remove CARD 82 - Spitzel* # Remove 2 Democratic SPs in Germany. +permanently_remove valid_spaces_country_opp 'East_Germany' prompt ' from East Germany' remove_opp_infl 2 -permanently_remove CARD 83 - Modrow* # Roll a die. If the die roll exceeds the number of Democratically controlled spaces in Germany, then place 4 Communist SPs in Germany, no more than 2 per space. +permanently_remove modrow valid_spaces_country 'East_Germany' prompt 'East Germany' add_limited_infl 4 2 -permanently_remove CARD 84 - Breakaway Baltic Republics* # +3 VPs. Reduce USSR stability by 2. Place sufficient Democratic SPs in any Minorities space for control. Cancels the effect of Gorbachev Charms the West for the rest of the game. Make 1 Support Check using the Ops value of this card. Requires play of The Baltic Way as an event. +permanently_remove breakaway_baltic_republics prompt 'any Minorities space' take_control_prep 1 valid_spaces_sc prompt 'select a space for the support check' 1_support_check -permanently_remove CARD 85 - Tank Column/Tank Man* # Advance 1 space on the Tiananmen Square track. -tank_column permanently_remove +tank_column CARD 86 - The Wall Must Go!* # Reduce USSR stability by 1. The Democratic Player attempts to tear down the Berlin Wall. Each player rolls a die and adds the number of spaces in Germany they control. Higher total wins. This is best 2 out of 3. If successful +3 VPs and the Communist must remove 3 SPs from Germany. +permanently_remove the_wall_must_go remove_infl 3 -permanently_remove CARD 87 - Kohl Proposes Reunification* # +2 VP. The Democratic Player may place SPs or make Support Checks using the Ops value of this card if The Wall Must Go! has been played as an event successfully. -kohl_proposes_reunification permanently_remove +kohl_proposes_reunification + CARD 88 - Adamec* # Roll a die. On a 4-6 add 4 Communist SPs in Czechoslovakia, no more than 2 per space. -1 drm for every Worker or Farmer space in Czechoslovakia that is controlled by the Democratic Player. +permanently_remove adamec valid_spaces_country 'Czechoslovakia' prompt 'Czechoslovakia' add_limited_infl 4 2 -permanently_remove + CARD 89 - Domino Theory* # If the Democrat holds Power in at least 2 counties, he may retrieve any Power Struggle - card from the discard pile and play it immediately as an event. The Democrat receives a -1 drm to his dice rolls for this Power Struggle. -prompt 'Domino Theory: choose a Power Struggle card to play from the discard pile.' -domino_theory +prompt 'Domino Theory: choose a Power Struggle card to play from the discard pile' permanently_remove +domino_theory + CARD 90 - Civic Forum* # +1 VP. Place 4 SPs in Czechoslovakia. The Democratic Player may make Support Checks in Czechoslovakia using the Ops value of this card if the Czech Writers space is Democratically controlled. +permanently_remove valid_spaces_country 'Czechoslovakia' prompt 'Czechoslovakia' add_infl_free 4 @@ -674,45 +683,44 @@ civic_forum valid_spaces_country_sc 'Czechoslovakia' prompt 'Select a space in Czechoslovakia' support_check 2 -permanently_remove CARD 91 - My First Banana* # Remove 2 Communist SPs and make two Support Checks in Germany using the Ops value of this card. +permanently_remove valid_spaces_country_opp 'East_Germany' prompt ' from East Germany' remove_opp_infl 2 valid_spaces_country_sc 'East_Germany' prompt 'select a space in East Germany' support_check 2 -permanently_remove CARD 92 - Betrayal # Choose any Orthodox Church space. Replace all Democratic SPs with Communist SPs. +permanently_remove prompt 'choose any Orthodox Church space. Replace all Democratic SPs with Communist SPs' betrayal -permanently_remove CARD 93 - Shock Therapy* # Target country must be one where the Communist has been toppled from power. Successful 3-6. -1 for every Communist Worker or Farmer space. +2 VPs and place 3 SPs in the country +permanently_remove shock_therapy valid_spaces_country prompt ` ${country_name(game.vm_active_country)}` add_infl_free 3 -permanently_remove CARD 94 - Union of Democratic Forces* # Remove 4 Communist SPs from Bulgaria. Democratic Player may make Support Checks in Bulgaria using the Ops value of this card if the Bulgarian writers space is Democratically controlled. +permanently_remove valid_spaces_country_opp 'Bulgaria' prompt ' from Bulgaria' remove_opp_infl 4 valid_spaces_country_sc 'Bulgaria' prompt 'Make 2 Support Checks in Bulgaria' support_check 2 -permanently_remove CARD 95 - Power Struggle - Romania @@ -722,16 +730,16 @@ power_struggle CARD 96 - The Chinese Solution* # Can only take place if the Communist has reached the Protesters Massacred space on the Tiananmen Square track. The Communist may choose 1 country where he retains Power and conduct 5 Support Checks with a +3 modifier, but suffers a penalty of +3 VPs. +permanently_remove the_chinese_solution valid_spaces_country_sc -prompt `Make 5 Support Checks in ${country_name(game.vm_active_country)}` +prompt `make 5 Support Checks in ${country_name(game.vm_active_country)}` support_check_modified 5 3 -permanently_remove CARD 97 - The Tyrant is Gone* # Remove 4 Communist SPs from the Romanian Elite Space. The Democrat announces where the Ceausescus flee, choosing a space with no Democratic SPs. If the Democratic Player gains control of the space before the end of the game the Ceausescus are captured, +2 VP. If not they escape, -2 VP. Requires play of The Crowd Turns Against Ceausescu -if game.persistent_events['the_crowd_turns_against_ceausescu'] +if game.persistent_events.includes(54) valid_spaces 51 prompt 'the Romanian Elite Space' remove_x_opp_infl 4 @@ -744,35 +752,38 @@ endif CARD 98 - Politburo Intrigue* # Remove 3 Democratic SPs in Bulgaria, no more than 2 per space. Then make one Support Check in Bulgaria, using the Ops value of this card. +permanently_remove valid_spaces_country_opp 'Bulgaria' prompt ' from Bulgaria' remove_limited_opp_infl 3 2 valid_spaces_country_sc 'Bulgaria' prompt 'make a support check in Bulgaria' 1_support_check -permanently_remove CARD 99 - Ligachev* # -3 VP if the Democrat does not play Gorbachev Charms the West for the event his next action round. -3 VPs take effect as soon as the Democrat plays his card but before the effect of the Democrat's card takes place. -ligachev permanently_remove +ligachev CARD 100 - Stand Fast* # -1 to opponent Support Checks in spaces you control for the rest of this turn. -stand_fast permanently_remove +stand_fast CARD 101 - Elena* # Add 2 SPs to the Romania Elite Space. -1 drm for Democratic Player for Support Checks in Romania the rest of this turn. No longer playable after The Tyrant is Gone +permanently_remove if !game.the_tyrant_is_gone valid_spaces 51 prompt 'the Romania Elite Space' add_x_infl 2 -endif elena +else +tyrant_block +endif CARD 102 - National Salvation Front* @@ -795,19 +806,21 @@ new_years_eve_party CARD 105 - Public Against Violence* # Place 2 Democratic SPs each in Kosice and Presov. Make one Support Check in Bratislava using the Ops value of this card. -valid_spaces 36 37 -prompt 'Kosice and Presov' +permanently_remove +valid_spaces 36 +prompt 'Kosice' add_x_infl 2 -valid_spaces 36 37 +valid_spaces 37 +prompt 'Presov' add_x_infl 2 public_against_violence prompt 'Make a Support Check in Bratislava' support_check_modified 1 2 -permanently_remove CARD 106 - Social Democratic Platform Adopted* # Play as an event in a Country where the Democrat has Power. Add 2 SPs and make 1 Support Check in the Country using the Ops value of this card. +permanently_remove social_democratic_platform_adopted valid_spaces_country prompt `${country_name(game.vm_active_country)}` @@ -815,36 +828,38 @@ add_infl_free 2 valid_spaces_country_sc prompt `make a Support Check in ${country_name(game.vm_active_country)}` 1_support_check -permanently_remove CARD 107 - Massacre in Timisoara* # Communist Player makes Support Checks in Romania using the Ops value of this card with +2 drm. Requires play of Lazslo Tokes. +permanently_remove if !game.the_tyrant_is_gone massacre_in_timisoara valid_spaces_country_sc 'Romania' prompt 'Make Support Checks in Romania' support_check_modified 2 2 +else +tyrant_block endif -permanently_remove CARD 108 - Army Backs Revolution* # Place in front of the Democratic Player. Cancels effects of Securitate* event. -army_backs_revolution permanently_remove +army_backs_revolution CARD 109 - Kremlin Coup* # Can only take place if Breakaway Baltic Republics has been played as an event. -3 VPs. In all countries where the Communist retains Power, place sufficient SPs in Elite space for Communist control, then make a support check against the bureaucratic space with a +1 modifier, even if there are no Democratic SPs in the space. -kremlin_coup permanently_remove +kremlin_coup CARD 110 - Malta Summit* # Roll a die. The summit is successful 4-6. If successful, +3VPs and remove 5 Communist SPs from elite space(s). The Democrat receives a modifier based on the USSR Stability Track: +1 if Sajudis +2 if The Baltic Way +3 if Breakaway Baltic Republics Not playable for the event after Kremlin Coup. +permanently_remove malta_summit prompt ' from Elite spaces' remove_opp_infl 5 -permanently_remove + diff --git a/play.css b/play.css index 8b3f266..0e7ef68 100644 --- a/play.css +++ b/play.css @@ -143,7 +143,7 @@ header.your_turn { background-color: orange; } display: none; } -#events_panel, #played_card_panel, #table_panel { +#events_panel, #played_card_panel, #table_panel, #samizdat_panel { min-width: 200px; width: auto; /*display: inline-block;*/ diff --git a/play.js b/play.js index be10507..f8d5cf5 100644 --- a/play.js +++ b/play.js @@ -405,8 +405,8 @@ function on_update() { 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 in hand` - ui.com_hand_count.innerText = `${view.communist_hand} cards in hand` + 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` @@ -516,7 +516,8 @@ if (!view.is_pwr_struggle) { document.getElementById("opp_hand_panel").classList.add("hide") } } else { - if (view.show_opp_hand && view.opp_hand.length >0) { + 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] @@ -537,6 +538,7 @@ if (!view.is_pwr_struggle) { 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'); } @@ -682,7 +684,7 @@ if (view.persistent_events.includes(97)) { action_button("concede", "Concede") action_button("struggle", "Begin power struggle") action_button("raise", "Raise the stakes") - action_button("draw", "Draw cards") + action_button("draw", "Draw") action_button("scoring", "Scoring") action_button("event", "Event") action_button("opp_event", "Resolve opponent event") diff --git a/rules.js b/rules.js index 8250dfc..617dcb6 100644 --- a/rules.js +++ b/rules.js @@ -107,8 +107,9 @@ function start_game() { //starting influence // Draw cards - /* const card_numbers = cards.filter(card => card !== null && card !== undefined).map(card => card.number); - console.log('card numbers: ', card_numbers) */ + + console.log('start game') + game.strategy_deck = draw_deck(cards) reset_power() @@ -225,7 +226,7 @@ exports.view = function(state, player) { } else if (player === COM) { view.hand = game.communist_hand - view.opp_hand = game.dem_pwr_hand.sort((a, b) => a - b) /*Does the Communist ever see Democrat hand? */ + view.opp_hand = game.dem_pwr_hand.sort((a, b) => a - b) view.power_hand = game.com_pwr_hand.sort((a, b) => a - b) } @@ -267,7 +268,7 @@ exports.view = function(state, player) { // === ACTIONS =========== function gen_action(action, argument) { -//console.log('gen_action called with ', action, ' and ', argument) +console.log('gen_action called with ', action, ' and ', argument) if (argument === undefined) { //console.log('argument undefined') view.actions[action] = 1 @@ -316,6 +317,7 @@ exports.action = function (state, player, action, arg) { states.com_init = { inactive: 'place starting SPs', prompt() { + console.log('state:', game.state, 'game.valid_spaces', game.valid_spaces) if (game.available_ops == 0) { view.prompt = 'Place starting SPs: done.'; gen_action("done"); @@ -362,6 +364,7 @@ states.com_init = { states.dem_init = { inactive: 'place starting SPs.', prompt() { + console.log('state:', game.state) if (game.available_ops == 0) { view.prompt = 'Place starting SPs: done.'; gen_action("done"); @@ -400,6 +403,7 @@ states.dem_init = { states.start_game = { inactive: 'start Turn 1.', prompt() { + console.log('state:', game.state) view.prompt = 'Start Turn 1.' gen_action('start') }, @@ -413,6 +417,7 @@ states.start_game = { states.choose_card = { inactive: 'choose a card.', prompt() { + console.log('state:', game.state) if ((game.active===DEM && game.democrat_hand.length === 0) || game.active === COM && game.communist_hand.length === 0) { view.prompt = 'No cards remaining: you must pass.' gen_action('pass') @@ -431,6 +436,7 @@ states.choose_card = { }, card(card) { push_undo() + //Check if player is at risk of losing game due to held scoring card if (!scoring_cards.includes(card)) { let scoring_cards_count = count_scoring_cards() @@ -480,16 +486,6 @@ states.play_card ={ return } - - //Check for Tiananmen Square Track awards special abilities - if ((game.active === DEM && cards[game.played_card].side !== 'C' && game.dem_tst_position >= 7 && game.com_tst_position < 7 && !game.tst_7) || (game.active === COM && cards[game.played_card].side !== 'D' && game.com_tst_position >= 7 && game.dem_tst_position < 7 && !game.tst_7)){ - gen_action('tst_7') - } - - if ((game.active === DEM && cards[game.played_card].side !== 'C' && game.dem_tst_position >= 8 && game.com_tst_position < 8 && !game.tst_8) || (game.active === COM && cards[game.played_card].side !== 'D' && game.com_tst_position >= 8 && game.dem_tst_position < 8 && !game.tst_8)){ - gen_action('tst_8') - } - // Check for Reformer Rehabilitated //console.log('game.active', game.active, 'game.playable_cards[67].playable', game.playable_cards[67].playable) @@ -503,26 +499,32 @@ states.play_card ={ gen_action('event') } } + + //Check for events + console.log('event_is_playable(game.played_card)', event_is_playable(game.played_card)) + if (event_is_playable(game.played_card)) { + console.log('card is playable') + //Check for Tiananmen Square Track awards special abilities + console.log('game.tst_7', game.tst_7) + if ((game.active === DEM && cards[game.played_card].side === 'C' && game.dem_tst_position >= 7 && game.com_tst_position < 7 && !game.tst_7) || (game.active === COM && cards[game.played_card].side === 'D' && game.com_tst_position >= 7 && game.dem_tst_position < 7 && !game.tst_7)){ + gen_action('tst_7') + } - //Continue with normal logic - - //Check if it is a card with an event which is always playable - - if (cards[game.played_card].playable) { - get_events(game.played_card) - } - - // Resolve cards with variable events (not Reformer) + if ((game.active === DEM && cards[game.played_card].side !== 'C' && game.dem_tst_position >= 8 && game.com_tst_position < 8 && !game.tst_8) || (game.active === COM && cards[game.played_card].side !== 'D' && game.com_tst_position >= 8 && game.dem_tst_position < 8 && !game.tst_8)){ + gen_action('tst_8') + } - if (game.played_card !== 67 && game.playable_cards.includes(game.played_card)) { + //Continue with normal logic get_events(game.played_card) } gen_action('influence') - if (game.active === DEM && game.dem_tst_attempted_this_turn === 0 && game.dem_tst_position <=8 || game.active === COM && game.com_tst_attempted_this_turn === 0 && game.com_tst_position <= 8) { - gen_action('tst') - } gen_action('support_check') + + if ((game.active === DEM && game.dem_tst_attempted_this_turn === 0 && game.dem_tst_position < 8 ) || (game.active === COM && game.com_tst_attempted_this_turn === 0 && game.com_tst_position < 8)) { + gen_action('tst') + } + }, event() { push_undo() @@ -610,7 +612,7 @@ states.play_card ={ }, tst_7() { /*Cancel opponent event */ push_undo() - log('Event cancelled using Tiananmen Square Track Award') + log(`Played C${game.played_card}. Event cancelled using TST Award`) game.tst_7 = true game.vm_infl_to_do = true game.state = 'resolve_opponent_event' @@ -685,7 +687,7 @@ states.resolve_opponent_event = { }, tst_7() { push_undo() - log('Event cancelled using Tiananmen Square Track Award') + log('Event cancelled using TST Award') game.tst_7 = true game.vm_event_to_do = false }, @@ -1230,6 +1232,7 @@ states.raise_stakes_1 = { game.raised_stakes_discard ++ if (game.raised_stakes_discard === 3) { game.raised_stakes++ + game.valid_cards = [] } @@ -1244,6 +1247,7 @@ states.raise_stakes_1 = { log_gap('Raised the stakes') game.raised_stakes_discard = 0 next_player() + game.valid_cards = [...all_power_cards] game.state = 'raise_stakes_2' } } @@ -1278,6 +1282,7 @@ states.raise_stakes_2 = { game.raised_stakes_discard ++ if (game.raised_stakes_discard === 3) { game.raised_stakes++ + game.valid_cards = [] } }, @@ -1406,7 +1411,7 @@ states.power_struggle = { }, roll () { let roll = Math.floor(Math.random() * 6) + 1 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) if (roll >= power_cards[game.played_power_card].value) { log('Initiative roll successful') game.phase = 0 @@ -1516,7 +1521,7 @@ states.support_loss ={ let roll = Math.floor(Math.random() * 6) + 1 let rally_win = 0 let petition_win = 0 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) { rally_win = 2} if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.played_power_card === 54) { petition_win = 2} let modified_roll = roll + game.raised_stakes + rally_win - petition_win @@ -1585,7 +1590,7 @@ states.vp_roll = { }, roll () { let roll = Math.floor(Math.random() * 6) + 1 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) let rally_win = 0 let petition_win = 0 if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) {rally_win = 2} @@ -1785,11 +1790,22 @@ states.end_turn_4_5_4 = { } else { game.return_state = '' - new_turn() + game.state = 'end_turn' } } } +states.end_turn = { + inactive: 'end the turn.', + prompt() { + view.prompt = 'End Turn: done.' + gen_action('done') + }, + done() { + new_turn() + } +} + states.final_scoring_held = { inactive: 'resolve final scoring.', prompt() { @@ -1883,7 +1899,7 @@ states.general_strike = { view.prompt = 'General Strike: done.' gen_action('done') } else if (game.played_card > 0 ) { - view.prompt = 'Roll a die.' + view.prompt = 'General Strike: roll a die.' gen_action('roll') } }, @@ -1906,12 +1922,12 @@ states.general_strike = { roll() { clear_undo() let roll = Math.floor(Math.random() * 6) + 1 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) - log(`+${game.available_ops} ops`) + logi(`+${game.available_ops} ops`) let total = roll + game.available_ops - log(`TOTAL: ${total}`) + log(`Total: ${total}`) if (total > 5) { log('The strike is over.') @@ -2110,7 +2126,7 @@ states.stasi_play_card = { game.available_ops = get_card_ops(card) game.stasi_card = 0 - if (game.democrat_hand.includes(21)) { + if (game.democrat_hand.includes(21) && cards[card].side === "C") { game.state = 'stasi_resolve_common_european_home' } else { game.state = 'play_card' @@ -2139,7 +2155,7 @@ states.stasi_resolve_common_european_home = { gen_action('no') }, yes() { - log(`${clean_name(cards[game.played_card].name)}} played with Common European Home`) + log(`Played with Common European Home`) silent_discard(21) game.vm_infl_to_do = true game.vm_event_to_do = false @@ -2285,7 +2301,7 @@ function do_sc(space) { // Continue with Support Check Logic let roll = Math.floor(Math.random() * 6) + 1 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) console.log('game.vm_event', game.vm_event) console.log('game.is_pwr_struggle', game.is_pwr_struggle) /* @@ -2382,7 +2398,7 @@ function do_sc(space) { logi(`+${adj.dem_adj} adjacency`) } if (adj.com_adj > 0) { - logi(`-${adj.com_adj} opponenet adjacency`) + logi(`-${adj.com_adj} opponent adjacency`) } } else { roll += adj.com_adj @@ -2391,7 +2407,7 @@ function do_sc(space) { logi(`+${adj.com_adj} adjacency`) } if (adj.dem_adj > 0) { - logi(`-${adj.dem_adj} opponenet adjacency`) + logi(`-${adj.dem_adj} opponent adjacency`) } } } @@ -2399,12 +2415,12 @@ function do_sc(space) { } // Support check calcs - log(`TOTAL: ${roll}`) + log(`Total: ${roll}`) const stability = spaces[find_space_index(space)].stability logi(`-${stability*2} (stability * 2)`) const change_infl = Math.max(0, roll - stability*2) if (change_infl > 0) { - log_msg_gap(`CHANGE: ${change_infl} SP`) + log_msg_gap(`Change: ${change_infl} SP`) let clicked_space = find_space_index(space) if(game.active === DEM) { if (change_infl > game.comInfl[clicked_space]) { @@ -2432,7 +2448,7 @@ function do_sc(space) { check_control_change(clicked_space) } else { - log_msg_gap('CHANGE: 0 SP') + log_msg_gap('Change: 0 SP') } if (game.active === COM && game.persistent_events.includes(39) && spaces[clicked_space].space_id === 66) { log_msg_gap('+1 VP from C39') @@ -2456,8 +2472,8 @@ function do_sc(space) { function valid_spaces_setup() { game.valid_spaces = [] let valid_spaces_set = new Set(); - console.log('in vs setup, state', game.state) - for (let i =1 ; i < 75 ; i++) { + //console.log('in vs setup, state', game.state) + for (let i =1 ; i <= 75 ; i++) { space = spaces[i] if (game.state === 'com_init') { @@ -2482,7 +2498,7 @@ function valid_spaces_sc() { let valid_spaces_set = new Set(); console.log('valid spaces sc, persistent events', game.persistent_events) - for (let i = 1 ; i < 75; i++) { + for (let i = 1 ; i <= 75; i++) { space = spaces[i] if (game.active === DEM) { @@ -2761,34 +2777,34 @@ function check_com_control(space_id) { function do_tst_attempt() { let roll = Math.floor(Math.random() * 6) + 1; - log(`ROLL: D${roll}`); + log(`Roll: D${roll}`); roll += game.available_ops - log(`+${game.available_ops} from card ops`) + logi(`+${game.available_ops} from card ops`) // TIANANMEN SQUARE MODIFIERS if (game.active === DEM && game.dem_tst_attempted === 1 || game.active === COM && game.com_tst_attempted === 1) { roll ++; - log('+1 modifier from previous Tiananmen Square Track attempts') + logi('+1 from previous TST attempts') } if (game.active === DEM && game.dem_tst_position >= 1 && game.com_tst_position === 0) { roll ++ - log('+1 from TST award') + logi('+1 from TST award') } if (game.active === COM && game.com_tst_position >= 1 && game.dem_tst_position === 0) { roll ++ - log('+1 from TST award') + logi('+1 from TST award') } if ((game.active === DEM && cards[game.played_card].side === 'D') || (game.active === COM && cards[game.played_card].side === 'C')) { roll ++; - log('+1 for playing own card'); + logi('+1 for playing own card'); } if (game.active === COM && game.persistent_events.includes(53)) { roll ++ - log('+1 from C53') + logi('+1 from C53') } - log(`TOTAL: ${roll}`) + log(`Total: ${roll}`) // TIANANMEN SQUARE ATTEMPT game.return = game.active @@ -2830,21 +2846,27 @@ function do_tst_attempt() { if (roll >= com_tst_req[game.com_tst_position]) { log(`${com_tst_req[game.com_tst_position]} required: success`) game.com_tst_position++ + + //Check if they have reached the final box - Chinese Solution playable + if (game.com_tst_position === 8) { + game.playable_cards.push(96) + } + game.com_tst_attempted = 0 //Check if they have reached box 7 or 8 first - if (game.dem_tst_position === 7 && game.com_tst_position < 7) { + if (game.com_tst_position === 7 && game.dem_tst_position < 7) { game.tst_7 = false } - if (game.dem_tst_position === 8 && game.com_tst_position < 8) { + if (game.com_tst_position === 8 && game.dem_tst_position < 8) { game.tst_8 = false } //Check if they have caught up to box 7 or 8 - if (game.dem_tst_position >= 7 && game.com_tst_position >= 7) { + if (game.com_tst_position >= 7 && game.dem_tst_position >= 7) { delete game.tst_7 } - if (game.dem_tst_position >= 8 && game.com_tst_position >= 8) { + if (game.com_tst_position >= 8 && game.dem_tst_position >= 8) { delete game.tst_8 } @@ -3092,17 +3114,18 @@ function get_value(country) { } function permanently_remove(card) { - console.log('card:', card) + console.log('permanently removing card:', card) + if (game.strategy_removed.includes(card)) {return} log_msg_gap(`C${cards[card].number} permanently removed`) remove_from_discard(card) card_index = game.table_cards.indexOf(card) if (card_index !== -1) { - console.log('sub 2 called') + //console.log('sub 2 called') game.table_cards.splice(card_index, 1) } game.strategy_removed.push(card) - console.log('game.strategy_removed', game.strategy_removed) + //console.log('game.strategy_removed', game.strategy_removed) } function check_vp() { @@ -3206,15 +3229,37 @@ function find_event(card) { } function get_events(card){ - if (cards[card].side === 'D') { - if (game.active === DEM) {gen_action('event')} - if (game.active === COM) {gen_action('opp_event')} - } - else if (cards[card].side === 'C') { - if (game.active === COM) {gen_action('event')} - if (game.active === DEM) {gen_action('opp_event')} + if (event_is_playable(card)) { + if (cards[card].side === 'D') { + if (game.active === DEM) {gen_action('event')} + if (game.active === COM) {gen_action('opp_event')} + } + else if (cards[card].side === 'C') { + if (game.active === COM) {gen_action('event')} + if (game.active === DEM) {gen_action('opp_event')} + } + else { + gen_action('event') + } + } +} + +function event_is_playable(card) { + //Reformer never playable here + if (card === 67) { + return false + } + //Check for Common European Hmme under Stasi + else if (game.persistent_events.includes(13) && card === 21 && game.active === DEM) { + return false + } + //Then check normally + else if (cards[card].playable) { + return true + } else if (game.playable_cards.includes(card)) { + return true } else { - gen_action('event') + return false } } @@ -3616,11 +3661,11 @@ function new_turn() { //permanently_remove(65) game.persistent_events = game.persistent_events.filter(n => n !== 65) } - console.log('deck', game.strategy_deck) - console.log('game.com_hand_limit', game.com_hand_limit, 'communist hand before draw', game.communist_hand) + //console.log('deck', game.strategy_deck) + //console.log('game.com_hand_limit', game.com_hand_limit, 'communist hand before draw', game.communist_hand) draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.dem_hand_limit, game.com_hand_limit) game.com_hand_limit = 8 - console.log('communist hand after draw', game.communist_hand) + //console.log('communist hand after draw', game.communist_hand) } @@ -3693,7 +3738,7 @@ function draw_cards(deck, democrat_hand, communist_hand, dem_hand_limit, com_han //console.log('game.valid_cards at start of draw cards: ', game.valid_cards) let turn = 'communist'; // Start with the communist player //console.log('game.strategy_deck', game.strategy_deck) - console.log('deck', deck, 'democrat_hand', democrat_hand, 'communist_hand', communist_hand, 'dem_hand_limit', dem_hand_limit, 'com_hand_limit', com_hand_limit) + //console.log('deck', deck, 'democrat_hand', democrat_hand, 'communist_hand', communist_hand, 'dem_hand_limit', dem_hand_limit, 'com_hand_limit', com_hand_limit) while (democrat_hand.length < dem_hand_limit || communist_hand.length < com_hand_limit) { //console.log('deck.length: ', deck.length) //console.log('discard.length', game.strategy_discard ) @@ -3871,19 +3916,9 @@ function reset_power() { } function check_control_change(space_id) { - /*game.pieces[space_id].demCtrl = 0 - game.pieces[space_id].comCtrl = 0 - - if ((game.demInfl[space_id] - game.comInfl[space_id]) >= game.pieces[space_id].stability) { - game.pieces[space_id].demCtrl = 1 - } - if ((game.comInfl[space_id] - game.demInfl[space_id]) >= game.pieces[space_id].stability) { - game.pieces[space_id].comCtrl = 1 - }*/ // Check if the Tyrant is Gone has been fulfilled - console.log('check control change_player, game.the_tyrant_is_gone', game.the_tyrant_is_gone) - //console.log('dem control', check_dem_control(game.the_tyrant_is_gone)) + if (game.the_tyrant_is_gone > 0 && check_dem_control(game.the_tyrant_is_gone)) { console.log('in tyrant') log('+2 VP from C97') @@ -4287,6 +4322,8 @@ function pop_vm_prompt() { function vm_return() { + console.log('in vm_return') + //Remove temporary vm variables delete game.support_check_modifier delete game.vm_max_infl @@ -4299,10 +4336,14 @@ function vm_return() { } //Check if end event state is needed - if ((game.active === DEM && game.round_player !==DEM) || (game.active === COM && game.round_player !== COM)) { - game.state = 'vm_end_event' - } else { + if (game.is_pwr_struggle || game.state === 'vm_tst_6') { vm_end_event() + } else { + if ((game.active === DEM && game.round_player !==DEM) || (game.active === COM && game.round_player !== COM)) { + game.state = 'vm_end_event' + } else { + vm_end_event() + } } } @@ -5155,15 +5196,11 @@ function vm_domino_theory() { function vm_eco_glasnost() { game.persistent_events.push(39) - permanently_remove(39) vm_next() } function vm_elena(){ game.persistent_events.push(101) - permanently_remove(101) - //game.table_cards.push(101) - //remove_from_discard(101) vm_next() } @@ -5377,7 +5414,7 @@ function vm_inflationary_currency_discard() { } } else { for (let card of game.democrat_hand){ - if (get_cards_ops(card) >= 3) { + if (get_card_ops(card) >= 3) { game.valid_cards.push(card) } } @@ -5520,7 +5557,6 @@ function vm_peasant_parties_revolt() { function vm_perestroika() { game.persistent_events.push(25) log_msg_gap('C25 in effect') - permanently_remove(25) vm_next() } @@ -5667,7 +5703,6 @@ function vm_solidarity_legalised() { function vm_st_nicholas_church () { game.persistent_events.push(24) game.playable_cards.push(61) - permanently_remove(24) vm_next() } @@ -5760,10 +5795,7 @@ function vm_the_tyrant_is_gone() { game.valid_spaces.push(space.space_id) } } - /*game.playable_cards[10].playable = 0 - game.playable_cards[41].playable = 0 - game.playable_cards[101].playable = 0 - game.playable_cards[107].playable = 0*/ + console.log('game.vm_event', game.vm_event, 'game.played_card', game.played_card) game.state = 'vm_the_tyrant_is_gone' } @@ -5775,6 +5807,10 @@ function vm_the_tyrant_is_gone_prep() { vm_next() } +function vm_tyrant_block() { + game.state = 'vm_tyrant_block' +} + function vm_the_wall () { game.persistent_events.push(9) //game.strategy_removed.push(9) @@ -5883,7 +5919,7 @@ function vm_scare_tactics() { vm_next() } function vm_support_surges() { - game.state = 'vm_support_surges' + game.state = 'vm_support_surges_1' } function vm_support_falters() { @@ -5940,9 +5976,6 @@ states.vm_take_control = { push_undo() vm_take_control(space) game.vm_available_ops-- - if (game.vm_available_ops === 0) { - vm_next() - } }, done() { vm_next() @@ -5954,7 +5987,7 @@ states.vm_add_infl = { prompt () { console.log('in vm add infl') if (game.vm_available_ops > 0 && game.valid_spaces.length === 0 ) { - view.prompt = 'No available spaces remaining. Add SPs: done.' + view.prompt = `${clean_name(cards[this_card()].name)}. No available spaces remaining. Add SPs: done.` gen_action('done') } else if (game.vm_available_ops > 0 ) { @@ -5964,12 +5997,15 @@ states.vm_add_infl = { gen_action_infl(spaces[space_id].name_unique) } } else { - view.prompt = 'Add SP: done.' + view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` gen_action('done') } }, infl(space) { vm_do_add_infl(space) + if (game.vm_available_ops === 0) { + game.valid_spaces = [] + } }, done () { if (game.summary.length > 0) { @@ -5988,7 +6024,7 @@ states.vm_add_infl_free = { }, prompt () { if (game.vm_available_ops > 0 && game.valid_spaces.length === 0 ) { - view.prompt = 'No available spaces remaining. Add SPs: done.' + view.prompt = `${clean_name(cards[this_card()].name)}. No available spaces remaining. Add SPs: done.` gen_action('done') } else if (game.vm_available_ops > 0 ) { @@ -5998,15 +6034,15 @@ states.vm_add_infl_free = { gen_action_infl(spaces[space_id].name_unique); } } else { - view.prompt = `${clean_name(cards[this_card()].name)}. Add influence: done.` + view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` gen_action('done') } }, infl(space) { vm_do_add_infl_free(space) - /*if (game.vm_available_ops === 0 ) { - - }*/ + if (game.vm_available_ops === 0) { + game.valid_spaces = [] + } }, done () { game.valid_spaces = [] @@ -6032,7 +6068,7 @@ states.vm_add_x_infl = { gen_action_infl(spaces[space_id].name_unique) } } else { - view.prompt = `${clean_name(cards[this_card()].name)}. Add influence: done.` + view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` gen_action('done') } }, @@ -6070,22 +6106,9 @@ states.vm_add_limited_infl = { }, infl(space) { vm_do_add_limited_infl(space, game.vm_max_infl) - /*if (game.vm_available_ops === 0 || game.valid_spaces.length === 0) { - game.vm_event_done = true - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - }*/ - /*if (game.vm_available_ops === 0 || game.valid_spaces.length === 0 ) { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - game.vm_event_done = true - vm_next() - }*/ + if (game.vm_available_ops === 0) { + game.valid_spaces = [] + } }, done () { if (game.summary.length > 0) { @@ -6156,7 +6179,7 @@ states.vm_remove_x_infl = { gen_action_infl(spaces[space_id].name_unique); } } else { - view.prompt = `${clean_name(cards[this_card()].name)}. Remove influence: done.` + view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` gen_action('done') } }, @@ -6175,14 +6198,17 @@ states.vm_remove_limited_infl = { inactive: 'remove SP.', prompt () { if (game.vm_available_ops > 0 && game.valid_spaces.length > 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: remove ${game.vm_available_ops} SP${event_prompt()}, no more than ${game.vm_max_infl} per space.` + view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}, no more than ${game.vm_max_infl} per space.` for (let space_id of game.valid_spaces) { gen_action_infl(spaces[space_id].name_unique); } - } else if (game.valid_spaces.length === 0) { + } else if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { view.prompt = `${clean_name(cards[this_card()].name)}: no further SP to remove.` gen_action('done') + } else { + view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` + gen_action('done') } }, infl(space) { @@ -6436,7 +6462,7 @@ states.vm_adamec = { roll() { clear_undo() let roll = Math.floor(Math.random() * 6) + 1 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) let worker_spaces = spaces.filter(space => space && space.country === 'Czechoslovakia' && space.socio === 4 && check_dem_control(space.space_id)).length if (worker_spaces > 0) { log(`-${worker_spaces} from Democrat controlled worker spaces`) @@ -6503,7 +6529,7 @@ states.vm_central_committee_reshuffle = { return `resolve ${clean_name(cards[57].name)}.` }, prompt() { - view.prompt = 'Choose a country to add SP.' + view.prompt = 'Central Committee Reshuffle: choose a country to add SPs.' if (!game.revolutions[0]) {gen_action('poland')} if (!game.revolutions[1]) {gen_action('hungary')} if (!game.revolutions[2]) {gen_action('east_germany')} @@ -6623,7 +6649,7 @@ states.vm_dash_for_the_west = { roll() { clear_undo() let roll = Math.floor(Math.random() * 6) + 1 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) let com_control = check_presence('East_Germany').com_spaces if (roll > com_control) { @@ -6819,10 +6845,10 @@ states.vm_exit_visas_finish = { }, prompt() { if (game.temp > 0 ) { - view.prompt = 'Draw replacement cards.' + view.prompt = 'Exit Visas: draw replacement cards.' gen_action('draw') } else { - view.prompt = 'Exit Visas: done.' + view.prompt = 'Exit Visas. Draw cards: done.' gen_action('done') } }, @@ -6907,6 +6933,9 @@ states.vm_goodbye_lenin = { goto_vm(card) }, ops() { + if (game.valid_cards.length === 0) { + logi('No red events') + } log('C46 played for operations') game.view_opp_hand = false game.state = 'vm_goodbye_lenin_ops' @@ -7270,7 +7299,7 @@ states.vm_kremlin_coup_sc_prep = { return `resolve ${clean_name(cards[game.played_card].name)}.` }, prompt() { - view.prompt = `Kremlin Coup! Conduct a support check in ${game.vm_active_country}'s Bureaucratic space.` + view.prompt = `Kremlin Coup! Conduct a support check in ${country_name(game.vm_active_country)}'s Bureaucratic space.` gen_action_sc(spaces[game.selected_space].name_unique); }, sc(space) { @@ -7301,7 +7330,7 @@ states.vm_kremlin_coup_end = { return `resolve ${clean_name(cards[this_card()].name)}.` }, prompt() { - view.prompt = `${clean_name(cards[this_card()].name)}: done.` + view.prompt = `${clean_name(cards[this_card()].name)} Support checks: done.` gen_action('done') }, done() { @@ -7388,7 +7417,7 @@ states.vm_malta_summit = { roll() { clear_undo() let roll = Math.floor(Math.random() * 6) + 1 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) if (game.stability > 0) { log(`+${game.stability} from USSR Stability Track`) log(`Modified roll: ${roll + game.stability}`) @@ -7434,11 +7463,11 @@ states.vm_modrow = { let roll = Math.floor(Math.random() * 6) + 1 let dem_spaces = spaces.filter(space => space && space.country === 'East_Germany' && check_dem_control(space.space_id)).length if (roll > dem_spaces) { - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) log(`Success. More than the ${dem_spaces} Democratically controlled spaces`) vm_next() } else { - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) log(`Fail. More than ${dem_spaces} required`) permanently_remove(83) vm_return() @@ -7463,13 +7492,13 @@ states.vm_nepotism = { clear_undo() let roll = Math.floor(Math.random() * 6) + 1 if (roll < 3) { - log(`ROLL: D${roll} adds 4 SPs`) + log(`Roll: D${roll} adds 4 SPs`) game.vm_available_ops = 4} else if (roll < 5 ) { - log(`ROLL: D${roll} adds 3 SPs`) + log(`Roll: D${roll} adds 3 SPs`) game.vm_available_ops = 3} else { - log(`ROLL: D${roll} adds 1 SP`) + log(`Roll: D${roll} adds 1 SP`) game.vm_available_ops = 1} //game.phase = 2 vm_next() @@ -7557,7 +7586,7 @@ states.vm_nomenklatura_remove = { }, prompt() { if (game.vm_available_ops === 0 || game.valid_spaces.length === 0 ) { - view.prompt = 'Remove SPs: done.' + view.prompt = 'Nomenklatura. Remove SPs: done.' gen_action('done') } else { view.prompt = 'Nomenklatura: remove all Democratic SPs from Elite spaces.' @@ -7570,9 +7599,9 @@ states.vm_nomenklatura_remove = { infl(space) { push_undo() vm_do_remove_all_infl(space) - if (game.vm_available_ops === 0) { + /*if (game.vm_available_ops === 0) { vm_next() - } + }*/ }, done() { vm_next() @@ -7585,7 +7614,7 @@ states.vm_nomenklatura_add = { }, prompt() { if (game.vm_available_ops === 0 || game.valid_spaces.length === 0 ) { - view.prompt = 'Add SPs: done.' + view.prompt = 'Nomenklatura. Add SPs: done.' gen_action('done') } else { view.prompt = `Nomenklatura: add 3 SPs to any Elite space(s). ${pluralize(game.vm_available_ops, 'SP')} remaining.` @@ -7719,7 +7748,7 @@ states.vm_shock_therapy = { worker_farmer++ } } - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) log(`-${worker_farmer} from Communist controlled Worker and Farmer spaces`) log(`Modified roll: ${roll - worker_farmer}`) if ((roll - worker_farmer) > 2) { @@ -7817,7 +7846,7 @@ states.vm_the_chinese_solution = { return `resolve ${clean_name(cards[game.played_card].name)}.` }, prompt() { - view.prompt = 'You may give up 3 VP to conduct support checks in a country where you hold power.' + view.prompt = 'The Chinese Solution: you may give up 3 VP to conduct support checks in a country where you hold power.' if (!game.revolutions[0]) {gen_action('poland')} if (!game.revolutions[1]) {gen_action('hungary')} if (!game.revolutions[2]) {gen_action('east_germany')} @@ -7925,13 +7954,28 @@ states.vm_the_tyrant_is_gone = { } } +states.vm_tyrant_block ={ + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}.` + }, + prompt() { + view.prompt = `${clean_name(cards[this_card()].name)} has no effect after The Tyrant Has Gone.` + gen_action('done') + }, + done() { + push_undo() + vm_next() + } +} + + states.vm_the_wall_must_go = { get inactive() { return `resolve ${clean_name(cards[this_card()].name)}.` }, prompt() { if (game.the_wall_must_go['dem_wins'] === 2 || game.the_wall_must_go['com_wins'] === 2) { - view.prompt = 'The Wall Must Go! Done.' + view.prompt = '"The Wall Must Go!" Rolls: done.' gen_action('done') } else { view.prompt = ('The Wall Must Go! Roll a die.') @@ -7946,7 +7990,7 @@ states.vm_the_wall_must_go = { } let roll = Math.floor(Math.random() * 6) + 1 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) if (game.active === DEM) { let controlled_spaces = spaces.filter(space => space && space.country === 'East_Germany' && check_dem_control(space.space_id)).length if (controlled_spaces > 0) { @@ -8066,7 +8110,7 @@ states.vm_we_are_the_people_remove = { return `resolve ${clean_name(cards[game.played_card].name)}.` }, prompt() { - if (game.demInfl[6] === 0) { + if (game.demInfl[6] === 0 && game.vm_available_ops > 0) { view.prompt = '"We are the People!": no SPs to remove.' gen_action('done') } else if (game.vm_available_ops > 0 ) { @@ -8076,7 +8120,7 @@ states.vm_we_are_the_people_remove = { gen_action_infl(spaces[space_id].name_unique); } } else { - view.prompt = 'Remove SPs: done.' + view.prompt = '"We are the People!" Remove SPs: done.' gen_action('done') } }, @@ -8103,7 +8147,7 @@ states.vm_we_are_the_people_add = { }, prompt() { if (!game.vm_influence_added[6]) { - view.prompt = '"We are the People!": done.' + view.prompt = '"We are the People!" Add SPs: done.' gen_action('done') return } @@ -8115,7 +8159,6 @@ states.vm_we_are_the_people_add = { } }, infl(space) { - push_undo() vm_do_add_infl_free(space) game.vm_influence_added[6]-- if (game.vm_influence_added[6] === 0 ) {game.valid_spaces = []} @@ -8164,7 +8207,7 @@ states.vm_workers_revolt_finish = { roll() { clear_undo() let roll = Math.floor(Math.random() * 6) + 1 - log(`ROLL: D${roll}`) + log(`Roll: D${roll}`) let adj = count_adj(spaces[game.selected_space].name_unique) if (game.active === DEM) { log(`-${adj.com_adj} from opponent controlled spaces`) @@ -8238,7 +8281,7 @@ states.vm_tst_4 = { inactive: 'remove SPs', prompt () { if (game.vm_available_ops === 0 || game.valid_spaces.length === 0) { - view.prompt = 'Remove SPs: done.' + view.prompt = 'Tiananmen Square Track award. Remove SPs: done.' gen_action('done') return } @@ -8380,19 +8423,72 @@ states.vm_tst_8_ops = { // ========================= POWER STRUGGLE STATES ======================== -states.vm_support_surges = { +states.vm_support_surges_1 = { inactive: 'draw cards.', prompt() { - view.prompt = 'Support Surges: draw 2 cards.' + view.prompt = 'Support Surges: draw a card.' gen_action('draw') }, draw() { if (game.active === DEM) { - draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length+2, game.com_pwr_hand.length) + console.log('hand before', game.dem_pwr_hand) + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length+1, game.com_pwr_hand.length) + game.temp = game.dem_pwr_hand[game.dem_pwr_hand.length-1] + console.log('hand before', game.dem_pwr_hand, 'game.temp', game.temp) } else { - draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length, game.com_pwr_hand.length+2) + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length, game.com_pwr_hand.length+1) + game.temp = game.dem_pwr_hand[game.dem_pwr_hand.length-1] } + game.state = 'vm_support_surges_2' + + //game.phase = 0 + //log('Drew 2 cards') + //log('Surrenders initiative') + //vm_next() + } +} + +states.vm_support_surges_2 = { + inactive: 'draw cards.', + prompt() { + if (numberless_cards.includes(game.temp)) { + view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name}. Draw a second card.` + } else { + view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name} ${power_cards[game.temp].value}. Draw a second card.` + } + gen_action('draw') + }, + draw() { + if (game.active === DEM) { + console.log('hand before', game.dem_pwr_hand) + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length+1, game.com_pwr_hand.length) + game.temp = game.dem_pwr_hand[game.dem_pwr_hand.length - 1] + console.log('hand before', game.dem_pwr_hand, 'game.temp', game.temp) + } else { + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length, game.com_pwr_hand.length+1) + game.temp = game.dem_pwr_hand[game.dem_pwr_hand.length - 1] + } + game.state = 'vm_support_surges_3' + /*game.phase = 0 + log('Drew 2 cards') + log('Surrenders initiative') + vm_next()*/ + } +} + +states.vm_support_surges_3 = { + inactive: 'draw cards.', + prompt() { + if (numberless_cards.includes(game.temp)) { + view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name}. Done.` + } else { + view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name} ${power_cards[game.temp].value}. Done.` + } + gen_action('done') + }, + done() { game.phase = 0 + delete game.temp log('Drew 2 cards') log('Surrenders initiative') vm_next() @@ -8437,41 +8533,41 @@ states.vm_support_falters = { const CODE = [] CODE[1] = [ // Legacy of Martial Law* + [ vm_permanently_remove ], [ vm_valid_spaces_country_opp, 'Poland' ], [ vm_prompt, 'replace 1 Democratic SP in Poland with a Communist SP' ], [ vm_legacy_of_martial_law ], [ vm_valid_spaces_country_sc, 'Poland' ], [ vm_prompt, 'make a Support Check in Poland' ], [ vm_1_support_check ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[2] = [ // Solidarity Legalised* + [ vm_permanently_remove ], [ vm_solidarity_legalised ], [ vm_valid_spaces_solidarity_legalised ], [ vm_prompt, 'to every uncontrolled Worker and Farmer space in Poland' ], [ vm_add_limited_infl, 9, 1 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[3] = [ // Walesa + [ vm_permanently_remove ], [ vm_valid_spaces_country, 'Poland' ], [ vm_prompt, 'any space(s) in Poland' ], [ vm_add_infl_free, 4 ], [ vm_valid_spaces_country_sc, 'Poland' ], [ vm_prompt, 'make Support Checks in Poland' ], [ vm_support_check, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[4] = [ // Michnik + [ vm_permanently_remove ], [ vm_valid_spaces, 26 ], [ vm_prompt, 'the Polish Intellectuals space' ], [ vm_add_x_infl, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8486,9 +8582,9 @@ CODE[6] = [ // Brought in for Questioning ] CODE[7] = [ // State Run Media* + [ vm_permanently_remove ], [ vm_valid_spaces_opponent ], [ vm_remove_limited_opp_infl, 4, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8498,18 +8594,20 @@ CODE[8] = [ // Prudence ] CODE[9] = [ // The Wall* - [ vm_the_wall ], [ vm_permanently_remove ], + [ vm_the_wall ], [ vm_return ], ] CODE[10] = [ // Cult of Personality + [ vm_permanently_remove ], [ vm_if, ()=>!game.the_tyrant_is_gone ], [ vm_valid_spaces_country_socio_2, 'Romania', 3, 4 ], [ vm_prompt, 'Worker or Farmer spaces in Romania, no more than 2 per space' ], [ vm_add_limited_infl, 4, 2 ], + [ vm_else ], + [ vm_tyrant_block ], [ vm_endif ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8521,16 +8619,16 @@ CODE[11] = [ // Dissident arrested ] CODE[12] = [ // Apparatchicks + [ vm_permanently_remove ], [ vm_valid_spaces_socio, 2 ], [ vm_prompt, ' to any Bureaucratic space(s)' ], [ vm_add_infl_free, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[13] = [ // Stasi - [ vm_stasi ], [ vm_permanently_remove ], + [ vm_stasi ], [ vm_return ], ] @@ -8550,8 +8648,8 @@ CODE[15] = [ // Honecker ] CODE[16] = [ // Nomenklatura* - [ vm_nomenklatura ], [ vm_permanently_remove ], + [ vm_nomenklatura ], [ vm_return ], ] @@ -8561,18 +8659,18 @@ CODE[17] = [ // Roundtable talks ] CODE[18] = [ // Poszgay Defends the Revolution + [ vm_permanently_remove ], [ vm_poszgay ], [ vm_prompt, 'to 4 spaces in Hungary not under Democratic control' ], [ vm_add_limited_infl, 4, 1 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[19] = [ // Papal vist + [ vm_permanently_remove ], [ vm_valid_spaces, 20, 35, 38 ], [ vm_prompt, 'any Catholic Church space' ], [ vm_add_x_infl, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8598,6 +8696,7 @@ CODE[23] = [ // Power Struggle - Hungary ] CODE[24] = [ // St Nicolas Church + [ vm_permanently_remove ], [ vm_valid_spaces, 6 ], [ vm_prompt, 'the Lutheran Church' ], [ vm_take_control_prep, 1 ], @@ -8606,13 +8705,14 @@ CODE[24] = [ // St Nicolas Church ] CODE[25] = [ // Perestroika + [ vm_permanently_remove ], [ vm_perestroika ], [ vm_return ], ] CODE[26] = [ // Helsinki Final Act* - [ vm_helsinki_final_act ], [ vm_permanently_remove ], + [ vm_helsinki_final_act ], [ vm_return ], ] @@ -8635,10 +8735,10 @@ CODE[28] = [ // Factory Party Cells ] CODE[29] = [ // Jan Palach Week* + [ vm_permanently_remove ], [ vm_valid_spaces, 30 ], [ vm_prompt, 'the Charles University space' ], [ vm_add_x_infl, 6 ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8655,33 +8755,33 @@ CODE[31] = [ // Intelligentsia ] CODE[32] = [ // Peasant Parties* + [ vm_permanently_remove ], [ vm_valid_spaces_socio, 3 ], [ vm_prompt, 'Farmer spaces, no more than 2 per space' ], [ vm_add_limited_infl, 4, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[33] = [ // Sajudis* + [ vm_permanently_remove ], [ vm_sajudis_check ], [ vm_prompt, 'any Minorities space' ], [ vm_take_control_prep, 1 ], [ vm_sajudis ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[34] = [ // Fidesz* + [ vm_permanently_remove ], [ vm_valid_spaces, 47 ], [ vm_prompt, 'the Hungary students space' ], [ vm_add_x_infl, 5 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[35] = [ // Heal our Bleeding Wounds* - [ vm_heal_our_bleeding_wounds ], [ vm_permanently_remove ], + [ vm_heal_our_bleeding_wounds ], [ vm_return ], ] @@ -8693,25 +8793,26 @@ CODE[36] = [ // Dash for the West* ] CODE[37] = [ // Nagy Reburied* + [ vm_permanently_remove ], [ vm_nagy_reburied ], [ vm_prompt, 'the Hungary Elite space' ], [ vm_remove_all_infl, 1 ], [ vm_valid_spaces_country, 'Hungary' ], [ vm_prompt, 'Hungary, no more than 2 per space' ], [ vm_add_limited_infl, 4, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[38] = [ // July Concept + [ vm_permanently_remove ], [ vm_valid_spaces_country, 'Bulgaria' ], [ vm_prompt, 'Bulgaria' ], [ vm_add_infl_free, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[39] = [ // Eco-Glasnost* + [ vm_permanently_remove ], [ vm_valid_spaces, 66 ], [ vm_prompt, 'Ruse' ], [ vm_add_x_infl, 4 ], @@ -8720,17 +8821,18 @@ CODE[39] = [ // Eco-Glasnost* ] CODE[40] = [ // Hungarian Democratic Forum + [ vm_permanently_remove ], [ vm_valid_spaces_country, 'Hungary' ], [ vm_prompt, 'Hungary' ], [ vm_add_infl_free, 3 ], [ vm_valid_spaces_country_sc, 'Hungary' ], [ vm_prompt, 'make a Support Check in Hungary' ], [ vm_1_support_check ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[41] = [ // Ceausescu* + [ vm_permanently_remove ], [ vm_if, ()=>!game.the_tyrant_is_gone ], [ vm_valid_spaces_country_opp, 'Romania' ], [ vm_prompt, ' from Romania' ], @@ -8740,8 +8842,9 @@ CODE[41] = [ // Ceausescu* [ vm_1_support_check ], [ vm_prompt, ' from Bucharesti' ], [ vm_ceausescu ], + [ vm_else ], + [ vm_tyrant_block ], [ vm_endif ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8756,6 +8859,7 @@ CODE[43] = [ // Power Struggle - Bulgaria ] CODE[44] = [ // Inflationary Currency + [ vm_permanently_remove ], [ vm_inflationary_currency ], [ vm_valid_spaces_country_opp ], [ vm_prompt, ()=>` from ${country_name(game.vm_active_country)}` ], @@ -8766,71 +8870,70 @@ CODE[44] = [ // Inflationary Currency [ vm_prompt, ()=>`make a Support Check in ${country_name(game.vm_active_country)}` ], [ vm_1_support_check ], [ vm_endif ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[45] = [ // Soviet Troop Withdrawals* + [ vm_permanently_remove ], [ vm_valid_spaces_region_opp, 'Eastern Europe' ], [ vm_prompt, ' from Eastern Europe' ], [ vm_remove_limited_opp_infl, 5, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[46] = [ // Goodbye Lenin!* - [ vm_goodbye_lenin ], [ vm_permanently_remove ], + [ vm_goodbye_lenin ], [ vm_return ], ] CODE[47] = [ // Bulgarian Turks Expelled* + [ vm_permanently_remove ], [ vm_bulgarian_turks_expelled ], [ vm_prompt, 'Razgrad' ], [ vm_remove_all_infl, 1 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[48] = [ // We are the People!* - [ vm_we_are_the_people ], [ vm_permanently_remove ], + [ vm_we_are_the_people ], [ vm_return ], ] CODE[49] = [ // Foreign Currency Debt Burden* - [ vm_foreign_currency_debt_burden ], [ vm_permanently_remove ], + [ vm_foreign_currency_debt_burden ], [ vm_return ], ] CODE[50] = [ // The Sinatra Doctrine* - [ vm_the_sinatra_doctrine ], [ vm_permanently_remove ], + [ vm_the_sinatra_doctrine ], [ vm_return ], ] CODE[51] = [ // 40th Anniversary Celebration* + [ vm_permanently_remove ], [ vm_40th_anniversary_celebration ], [ vm_valid_spaces_country, 'East_Germany' ], [ vm_prompt, 'East Germany' ], [ vm_add_infl_free ], [ vm_40th_anniversary_celebration_vp ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[52] = [ // Normalisation + [ vm_permanently_remove ], [ vm_normalisation ], [ vm_prompt, 'the Czechoslovakia Elite and Bureaucrat Spaces' ], [ vm_remove_all_infl, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[53] = [ // Li Peng* - [ vm_li_peng ], [ vm_permanently_remove ], + [ vm_li_peng ], [ vm_return ], ] @@ -8845,17 +8948,17 @@ CODE[55] = [ // Power Struggle - Czechoslovakia ] CODE[56] = [ // Foreign Television + [ vm_permanently_remove ], [ vm_foreign_television ], [ vm_remove_limited_opp_infl, 4, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[57] = [ // Central Committee Reshuffle* + [ vm_permanently_remove ], [ vm_central_committee_reshuffle ], [ vm_prompt, ()=>`${country_name(game.vm_active_country)}` ], [ vm_add_infl_free, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8870,21 +8973,21 @@ CODE[59] = [ // GrenzTruppen* ] CODE[60] = [ // Toxic Waste* + [ vm_permanently_remove ], [ vm_valid_spaces_socio, 4 ], [ vm_prompt, 'any Worker space(s)' ], [ vm_add_infl_free, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[61] = [ // The Monday Demonstrations* + [ vm_permanently_remove ], [ vm_the_monday_demonstrations ], [ vm_prompt, 'the Lutheran Church Space and Leipzig' ], [ vm_take_control_prep, 2 ], [ vm_valid_spaces_country_sc, 'East_Germany' ], [ vm_prompt, 'make 5 Support Checks in East Germany' ], [ vm_support_check, 5 ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8899,24 +9002,24 @@ CODE[63] = [ // Genscher* ] CODE[64] = [ // Legacy of 1968* + [ vm_permanently_remove ], [ vm_legacy_of_1968 ], [ vm_prompt, 'all spaces in Czechoslovakia not controlled by the Communist Player' ], [ vm_add_limited_infl, 11, 1 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[65] = [ // Presidential Visit* - [ vm_presidential_visit ], [ vm_permanently_remove ], + [ vm_presidential_visit ], [ vm_return ], ] CODE[66] = [ // New Forum + [ vm_permanently_remove ], [ vm_valid_spaces_country, 'East_Germany' ], [ vm_prompt, '3 spaces in East Germany' ], [ vm_add_limited_infl, 3, 1 ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8927,19 +9030,19 @@ CODE[67] = [ // Reformer Rehabilitated* ] CODE[68] = [ // Klaus and Komarek* + [ vm_permanently_remove ], [ vm_klaus_and_komarek ], [ vm_prompt, 'Prague' ], [ vm_remove_x_opp_infl, 2 ], [ vm_valid_spaces, 29 ], [ vm_add_x_infl, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[69] = [ // Systematization* + [ vm_permanently_remove ], [ vm_valid_spaces_country, 'Romania' ], [ vm_systematization ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8960,6 +9063,7 @@ CODE[72] = [ // Peasant Parties Revolt ] CODE[73] = [ // Laszlo Tokes* + [ vm_permanently_remove ], [ vm_valid_spaces, 50, 56 ], [ vm_prompt, 'in Timisoara and Harghita/Covasna' ], [ vm_add_limited_infl, 2, 1 ], @@ -8971,7 +9075,6 @@ CODE[73] = [ // Laszlo Tokes* [ vm_prompt, 'make 2 Support Checks in Romania' ], [ vm_support_check, 2 ], [ vm_endif ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -8981,12 +9084,13 @@ CODE[74] = [ // FRG Embassies ] CODE[75] = [ // Exit Visas* - [ vm_exit_visas ], [ vm_permanently_remove ], + [ vm_exit_visas ], [ vm_return ], ] CODE[76] = [ // Warsaw Pact Summit + [ vm_permanently_remove ], [ vm_warsaw_pact_summit ], [ vm_if, ()=>game.phase === 3 ], [ vm_prompt, ' spaces with no Democratic SPs' ], @@ -8996,13 +9100,12 @@ CODE[76] = [ // Warsaw Pact Summit [ vm_valid_spaces_country_socio_2, 3,, 4 ], [ vm_support_check_modified, 2, 2 ], [ vm_endif ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[77] = [ // Samizdat - [ vm_samizdat ], [ vm_permanently_remove ], + [ vm_samizdat ], [ vm_return ], ] @@ -9012,95 +9115,96 @@ CODE[78] = [ // Workers Revolt ] CODE[79] = [ // The Third Way* + [ vm_permanently_remove ], [ vm_the_third_way ], [ vm_valid_spaces, 4 ], [ vm_prompt, 'the East German Writers space' ], [ vm_add_x_infl, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[80] = [ // Nepotism* + [ vm_permanently_remove ], [ vm_nepotism ], [ vm_valid_spaces_region_socio, 'Balkans', 4 ], [ vm_prompt, 'Worker spaces in the Balkans' ], [ vm_add_infl_free ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[81] = [ // The Baltic Way* + [ vm_permanently_remove ], [ vm_the_baltic_way ], [ vm_prompt, 'any Minorities space' ], [ vm_take_control_prep, 1 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[82] = [ // Spitzel* + [ vm_permanently_remove ], [ vm_valid_spaces_country_opp, 'East_Germany' ], [ vm_prompt, ' from East Germany' ], [ vm_remove_opp_infl, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[83] = [ // Modrow* + [ vm_permanently_remove ], [ vm_modrow ], [ vm_valid_spaces_country, 'East_Germany' ], [ vm_prompt, 'East Germany' ], [ vm_add_limited_infl, 4, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[84] = [ // Breakaway Baltic Republics* + [ vm_permanently_remove ], [ vm_breakaway_baltic_republics ], [ vm_prompt, 'any Minorities space' ], [ vm_take_control_prep, 1 ], [ vm_valid_spaces_sc ], [ vm_prompt, 'select a space for the support check' ], [ vm_1_support_check ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[85] = [ // Tank Column/Tank Man* - [ vm_tank_column ], [ vm_permanently_remove ], + [ vm_tank_column ], [ vm_return ], ] CODE[86] = [ // The Wall Must Go!* + [ vm_permanently_remove ], [ vm_the_wall_must_go ], [ vm_remove_infl, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[87] = [ // Kohl Proposes Reunification* - [ vm_kohl_proposes_reunification ], [ vm_permanently_remove ], + [ vm_kohl_proposes_reunification ], [ vm_return ], ] CODE[88] = [ // Adamec* + [ vm_permanently_remove ], [ vm_adamec ], [ vm_valid_spaces_country, 'Czechoslovakia' ], [ vm_prompt, 'Czechoslovakia' ], [ vm_add_limited_infl, 4, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[89] = [ // Domino Theory* - [ vm_prompt, 'Domino Theory: choose a Power Struggle card to play from the discard pile.' ], - [ vm_domino_theory ], + [ vm_prompt, 'Domino Theory: choose a Power Struggle card to play from the discard pile' ], [ vm_permanently_remove ], + [ vm_domino_theory ], [ vm_return ], ] CODE[90] = [ // Civic Forum* + [ vm_permanently_remove ], [ vm_valid_spaces_country, 'Czechoslovakia' ], [ vm_prompt, 'Czechoslovakia' ], [ vm_add_infl_free, 4 ], @@ -9108,45 +9212,44 @@ CODE[90] = [ // Civic Forum* [ vm_valid_spaces_country_sc, 'Czechoslovakia' ], [ vm_prompt, 'Select a space in Czechoslovakia' ], [ vm_support_check, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[91] = [ // My First Banana* + [ vm_permanently_remove ], [ vm_valid_spaces_country_opp, 'East_Germany' ], [ vm_prompt, ' from East Germany' ], [ vm_remove_opp_infl, 2 ], [ vm_valid_spaces_country_sc, 'East_Germany' ], [ vm_prompt, 'select a space in East Germany' ], [ vm_support_check, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[92] = [ // Betrayal + [ vm_permanently_remove ], [ vm_prompt, 'choose any Orthodox Church space. Replace all Democratic SPs with Communist SPs' ], [ vm_betrayal ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[93] = [ // Shock Therapy* + [ vm_permanently_remove ], [ vm_shock_therapy ], [ vm_valid_spaces_country ], [ vm_prompt, ()=>` ${country_name(game.vm_active_country)}` ], [ vm_add_infl_free, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[94] = [ // Union of Democratic Forces* + [ vm_permanently_remove ], [ vm_valid_spaces_country_opp, 'Bulgaria' ], [ vm_prompt, ' from Bulgaria' ], [ vm_remove_opp_infl, 4 ], [ vm_valid_spaces_country_sc, 'Bulgaria' ], [ vm_prompt, 'Make 2 Support Checks in Bulgaria' ], [ vm_support_check, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] @@ -9156,16 +9259,16 @@ CODE[95] = [ // Power Struggle - Romania ] CODE[96] = [ // The Chinese Solution* + [ vm_permanently_remove ], [ vm_the_chinese_solution ], [ vm_valid_spaces_country_sc ], - [ vm_prompt, ()=>`Make 5 Support Checks in ${country_name(game.vm_active_country)}` ], + [ vm_prompt, ()=>`make 5 Support Checks in ${country_name(game.vm_active_country)}` ], [ vm_support_check_modified, 5, 3 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[97] = [ // The Tyrant is Gone* - [ vm_if, ()=>game.persistent_events['the_crowd_turns_against_ceausescu'] ], + [ vm_if, ()=>game.persistent_events.includes(54) ], [ vm_valid_spaces, 51 ], [ vm_prompt, 'the Romanian Elite Space' ], [ vm_remove_x_opp_infl, 4 ], @@ -9178,35 +9281,38 @@ CODE[97] = [ // The Tyrant is Gone* ] CODE[98] = [ // Politburo Intrigue* + [ vm_permanently_remove ], [ vm_valid_spaces_country_opp, 'Bulgaria' ], [ vm_prompt, ' from Bulgaria' ], [ vm_remove_limited_opp_infl, 3, 2 ], [ vm_valid_spaces_country_sc, 'Bulgaria' ], [ vm_prompt, 'make a support check in Bulgaria' ], [ vm_1_support_check ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[99] = [ // Ligachev* - [ vm_ligachev ], [ vm_permanently_remove ], + [ vm_ligachev ], [ vm_return ], ] CODE[100] = [ // Stand Fast* - [ vm_stand_fast ], [ vm_permanently_remove ], + [ vm_stand_fast ], [ vm_return ], ] CODE[101] = [ // Elena* + [ vm_permanently_remove ], [ vm_if, ()=>!game.the_tyrant_is_gone ], [ vm_valid_spaces, 51 ], [ vm_prompt, 'the Romania Elite Space' ], [ vm_add_x_infl, 2 ], - [ vm_endif ], [ vm_elena ], + [ vm_else ], + [ vm_tyrant_block ], + [ vm_endif ], [ vm_return ], ] @@ -9229,19 +9335,21 @@ CODE[104] = [ // New Year's Eve Party* ] CODE[105] = [ // Public Against Violence* - [ vm_valid_spaces, 36, 37 ], - [ vm_prompt, 'Kosice and Presov' ], + [ vm_permanently_remove ], + [ vm_valid_spaces, 36 ], + [ vm_prompt, 'Kosice' ], [ vm_add_x_infl, 2 ], - [ vm_valid_spaces, 36, 37 ], + [ vm_valid_spaces, 37 ], + [ vm_prompt, 'Presov' ], [ vm_add_x_infl, 2 ], [ vm_public_against_violence ], [ vm_prompt, 'Make a Support Check in Bratislava' ], [ vm_support_check_modified, 1, 2 ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[106] = [ // Social Democratic Platform Adopted* + [ vm_permanently_remove ], [ vm_social_democratic_platform_adopted ], [ vm_valid_spaces_country ], [ vm_prompt, ()=>`${country_name(game.vm_active_country)}` ], @@ -9249,43 +9357,46 @@ CODE[106] = [ // Social Democratic Platform Adopted* [ vm_valid_spaces_country_sc ], [ vm_prompt, ()=>`make a Support Check in ${country_name(game.vm_active_country)}` ], [ vm_1_support_check ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[107] = [ // Massacre in Timisoara* + [ vm_permanently_remove ], [ vm_if, ()=>!game.the_tyrant_is_gone ], [ vm_massacre_in_timisoara ], [ vm_valid_spaces_country_sc, 'Romania' ], [ vm_prompt, 'Make Support Checks in Romania' ], [ vm_support_check_modified, 2, 2 ], + [ vm_else ], + [ vm_tyrant_block ], [ vm_endif ], - [ vm_permanently_remove ], [ vm_return ], ] CODE[108] = [ // Army Backs Revolution* - [ vm_army_backs_revolution ], [ vm_permanently_remove ], + [ vm_army_backs_revolution ], [ vm_return ], ] CODE[109] = [ // Kremlin Coup* - [ vm_kremlin_coup ], [ vm_permanently_remove ], + [ vm_kremlin_coup ], [ vm_return ], ] CODE[110] = [ // Malta Summit* + [ vm_permanently_remove ], [ vm_malta_summit ], [ vm_prompt, ' from Elite spaces' ], [ vm_remove_opp_infl, 5 ], - [ vm_permanently_remove ], [ vm_return ], ] // #endregion + + // ============= TIANANMEN SQUARE TRACK AWARDS ==================== CODE[203] = [//Tiananmen Square space 3 award [vm_tst_3], -- cgit v1.2.3 From 48c6287c7a4251b9043877265cca98970e8f88be Mon Sep 17 00:00:00 2001 From: iainp5 Date: Sat, 12 Oct 2024 16:51:29 +0100 Subject: Removed name unique from actions --- data.js | 2 +- play.css | 4 +- play.js | 17 +- rules.js | 558 +++++++++++++++++++++++++++++++-------------------------------- 4 files changed, 292 insertions(+), 289 deletions(-) (limited to 'play.css') diff --git a/data.js b/data.js index 897de39..a4a64a8 100644 --- a/data.js +++ b/data.js @@ -83,7 +83,7 @@ const cards = [ {number: 2, period: 1, side: 'D', name: 'Solidarity Legalized*', ops: 4, remove: 1, playable: true, red: true}, {number: 3, period: 1, side: 'D', name: 'Walesa*', ops: 3, remove: 1, playable: false, red: false}, {number: 4, period: 1, side: 'D', name: 'Michnik*', ops: 1, remove: 1, playable: true, red: false}, - {number: 5, period: 1, side: 'D', name: 'General Strike', ops: 3, remove: 0, playable: true, red: false}, + {number: 5, period: 1, side: 'D', name: 'General Strike*', ops: 3, remove: 0, playable: true, red: false}, {number: 6, period: 1, side: 'C', name: 'Brought in for Questioning', ops: 3, remove: 0, playable: true, red: false}, {number: 7, period: 1, side: 'C', name: 'State Run Media*', ops: 2, remove: 1, playable: true, red: false}, {number: 8, period: 1, side: 'N', name: 'Prudence', ops: 4, remove: 0, playable: true, red: false}, diff --git a/play.css b/play.css index 0e7ef68..535ba84 100644 --- a/play.css +++ b/play.css @@ -143,7 +143,7 @@ header.your_turn { background-color: orange; } display: none; } -#events_panel, #played_card_panel, #table_panel, #samizdat_panel { +#hand_panel, #events_panel, #played_card_panel, #table_panel, #samizdat_panel, #opp_hand_panel, #power_panel, #ceausescu_panel { min-width: 200px; width: auto; /*display: inline-block;*/ @@ -571,7 +571,7 @@ left: 660px} .discard_card, .event_card { background-size: contain; height: 150px; - padding: 5px; + margin: 5px; border-radius: 5px; transition: transform .3s ease; } diff --git a/play.js b/play.js index f8d5cf5..f90e207 100644 --- a/play.js +++ b/play.js @@ -71,7 +71,7 @@ const spaceCharacteristicsElement = document.getElementById('space-characteristi spaceArea.style.width = width + 'px'; spaceArea.style.height = height + 'px'; spaceArea.style.zIndex = 2; - spaceArea.my_space = space.name_unique; + spaceArea.my_space = space.space_id; spaceArea.addEventListener('mousedown', on_click_space); //CREATE DEMOCRATIC INFLUENCE MARKERS FOR EACH SPACE @@ -80,7 +80,7 @@ const spaceCharacteristicsElement = document.getElementById('space-characteristi dem_img.style.display = 'none' dem_img.id=`${space.name_unique}_demInfl` dem_img.style.zIndex = 1 - dem_img.my_space = space.name_unique; + dem_img.my_space = space.space_id; dem_img.addEventListener('mousedown', on_click_space); spaceArea.appendChild(dem_img) @@ -91,7 +91,7 @@ const spaceCharacteristicsElement = document.getElementById('space-characteristi demInflValue.id=`${space.name_unique}_demInflValue` demInflValue.innerText=space.demInfl demInflValue.style.zIndex = 1 - demInflValue.my_space = space.name_unique; + demInflValue.my_space = space.space_id; demInflValue.addEventListener('mousedown', on_click_space); spaceArea.appendChild(demInflValue) @@ -101,7 +101,7 @@ const spaceCharacteristicsElement = document.getElementById('space-characteristi com_img.style.display='none' com_img.id=`${space.name_unique}_comInfl` com_img.style.zIndex = 1 - com_img.my_space = space.name_unique; + com_img.my_space = space.space_id; com_img.addEventListener('mousedown', on_click_space); spaceArea.appendChild(com_img) @@ -112,7 +112,7 @@ const spaceCharacteristicsElement = document.getElementById('space-characteristi comInflValue.id=`${space.name_unique}_comInflValue` comInflValue.innerText=space.comInfl comInflValue.style.zIndex = 1 - comInflValue.my_space = space.name_unique; + comInflValue.my_space = space.space_id; comInflValue.addEventListener('mousedown', on_click_space); spaceArea.appendChild(comInflValue) //} @@ -182,11 +182,12 @@ function is_card_enabled(card) { function on_click_space(evt) { if (evt.button === 0) { const space = evt.target.my_space; - //console.log('on_click_space_called with space:', 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); + console.log('send_action with sc:', space); evt.stopPropagation(); } else { // console.log('send_action failed for space:', space); @@ -554,6 +555,8 @@ if (view.ceausescu_cards && view.ceausescu_cards.length > 0 && view.is_pwr_strug 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") diff --git a/rules.js b/rules.js index 617dcb6..cf074d3 100644 --- a/rules.js +++ b/rules.js @@ -230,9 +230,9 @@ exports.view = function(state, player) { view.power_hand = game.com_pwr_hand.sort((a, b) => a - b) } - if (game.active === DEM) { + if (player === DEM) { view.samizdat = game.samizdat_card - } + } if (game.state === "game_over") { view.prompt = game.victory @@ -268,7 +268,7 @@ exports.view = function(state, player) { // === ACTIONS =========== function gen_action(action, argument) { -console.log('gen_action called with ', action, ' and ', argument) +//console.log('gen_action called with ', action, ' and ', argument) if (argument === undefined) { //console.log('argument undefined') view.actions[action] = 1 @@ -315,7 +315,7 @@ exports.action = function (state, player, action, arg) { // ============= GAME STATES ======================= states.com_init = { - inactive: 'place starting SPs', + inactive: 'place starting SPs.', prompt() { console.log('state:', game.state, 'game.valid_spaces', game.valid_spaces) if (game.available_ops == 0) { @@ -328,9 +328,7 @@ states.com_init = { view.prompt = `Place ${pluralize(game.available_ops,'starting SP')}.` } for (let space_id of game.valid_spaces) { - if (space_id) { - gen_action_infl(spaces[space_id].name_unique); - } + gen_action_infl(space_id); } }, infl(space) { @@ -375,7 +373,7 @@ states.dem_init = { view.prompt = `Place ${pluralize(game.available_ops,'starting SP')}.` } for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } }, infl(space) { @@ -714,7 +712,7 @@ states.finish_add_infl = { // Generate actions for valid spaces for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique) + gen_action_infl(space_id) } }, infl(space) { @@ -740,13 +738,13 @@ states.finish_support_check_prep = { } else { view.prompt = `Select a space. ${pluralize(game.available_ops, 'support check')} remaining.` for (let space_id of game.valid_spaces) { - gen_action_sc(spaces[space_id].name_unique) + gen_action_sc(space_id) } } }, sc(space) { push_undo() - game.selected_space = find_space_index(space) + game.selected_space = space // Check for Austria-Hungary Border Reopened - check on first support check only //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) if (game.persistent_events.includes(58)){ @@ -789,7 +787,7 @@ states.finish_do_support_check = { }, roll() { clear_undo() - do_sc(spaces[game.selected_space].name_unique) + do_sc(game.selected_space) game.available_ops-- if (game.available_ops === 0) { game.valid_spaces = [] @@ -812,7 +810,7 @@ states.add_influence = { // Generate actions for valid spaces for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } }, infl(space) { @@ -847,11 +845,19 @@ states.tiananmen_square_attempt = { states.tiananmen_square_attempt_success = { inactive: 'do Tiananmen Square Attempt.', prompt () { - view.prompt = 'Tiananmen Square Track attempt successful.' + if (game.vm_event > 200) { + view.prompt = 'Tiananmen Square Track attempt successful. Go to TST Award.' + } else { + view.prompt = 'Tiananmen Square Track attempt successful.' + } gen_action('done') }, done () { - end_round() + if (game.vm_event > 200) { + goto_vm(game.vm_event) + } else { + game.state = 'tiananmen_square_attempt_done' + } } } @@ -861,6 +867,17 @@ states.tiananmen_square_attempt_fail = { view.prompt = 'Tiananmen Square Track attempt failed.' gen_action('done') }, + done () { + game.state = 'tiananmen_square_attempt_done' + } +} + +states.tiananmen_square_attempt_done = { + inactive: 'do Tiananmen Square Attempt.', + prompt () { + view.prompt = 'Tiananmen Square Track attempt: done.' + gen_action('done') + }, done () { end_round() } @@ -964,13 +981,13 @@ states.support_check_prep = { view.prompt = `Select a space. ${pluralize(game.available_ops, 'support check')} remaining.` for (let space_id of game.valid_spaces) { - gen_action_sc(spaces[space_id].name_unique) + gen_action_sc(space_id) } } }, sc(space) { push_undo() - game.selected_space = find_space_index(space) + game.selected_space = space // Check for Austria-Hungary Border Reopened - check on first support check only //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) @@ -1014,7 +1031,7 @@ states.do_support_check = { }, roll() { clear_undo() - do_sc(spaces[game.selected_space].name_unique) + do_sc(game.selected_space) game.available_ops-- if (game.available_ops === 0) { game.valid_spaces = [] @@ -1182,7 +1199,7 @@ states.the_crowd_turns_against_ceausescu_infl = { view.prompt = `Add SPs: ${game.vm_available_ops} remaining` for (let space of game.valid_spaces) { - gen_action_infl(spaces[space].name_unique) + gen_action_infl(space) } }, infl(space) { @@ -1506,7 +1523,7 @@ states.support_loss ={ view.prompt = `Support Loss: remove ${pluralize(game.available_ops,'SP')}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique) + gen_action_infl(space_id) } } else if (game.phase === 1 && game.available_ops === 0 ) { view.prompt = 'Support Loss: finished.' @@ -1712,6 +1729,11 @@ states.the_tyrant_is_gone ={ if (game.active !== DEM) { next_player() } + if (game.round_player === DEM) { + game.return = COM + } else { + game.return = DEM + } log_h3(`C97`) game.vm_event = 97 goto_vm(game.vm_event) @@ -1726,7 +1748,7 @@ states.finish_scoring ={ } , done() { console.log('game.return_state', game.return_state) - log('Power Struggle resolved') /*At this point log card dicarded or permanently removed? */ + log_msg_gap('Power Struggle resolved') /*At this point log card dicarded or permanently removed? */ if (game.persistent_events.includes(111)) { game.state = 'new_years_eve_party' return @@ -2173,24 +2195,22 @@ states.stasi_resolve_common_european_home = { function add_infl(space) { push_undo() console.log('adding infl to', space) - const clicked_space = find_space_index(space) - console.log('clicked_space', clicked_space) //console.log('at start, event', game.persistent_events['austria_hungary_border_reopened'], 'ahbr', game.austria_hungary_border_reopened, 'tracker', game.austria_hungary_border_reopened_tracker) - //log(`Added 1 influence in %${clicked_space}`) - log_summary(`Added £ SP in %${clicked_space}`) + //log(`Added 1 influence in %${space}`) + log_summary(`Added £ SP in %${space}`) //If AHBR - check AHBR conditions if (game.persistent_events.includes(58)) { - if (spaces[clicked_space].country !== 'East_Germany'){ + if (spaces[space].country !== 'East_Germany'){ game.austria_hungary_border_reopened_tracker = false } } // Check Genscher - if (game.persistent_events.includes(63) && game.active === DEM && spaces[clicked_space].country === 'East_Germany') { + if (game.persistent_events.includes(63) && game.active === DEM && spaces[space].country === 'East_Germany') { game.available_ops-- log_summary(`(-1 op due to C63)`) - } else if (check_opp_control(clicked_space)) { + } else if (check_opp_control(space)) { game.available_ops -= 2 //Check if Austria Hungary Border Reopened was used to place last SP in a controlled space in East Germany. If so, game.available_op will be negative if (game.available_ops < 0) { @@ -2202,13 +2222,13 @@ function add_infl(space) { // Update influence values if (game.active === COM) { - game.comInfl[clicked_space]++ + game.comInfl[space]++ } else { - game.demInfl[clicked_space]++ + game.demInfl[space]++ } // Check whether spaces are controlled - check_control_change(clicked_space) + check_control_change(space) // Check Austria Hungary Border Reopened is true and condition has been met if (game.available_ops === 0 && game.active === DEM && game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker) { @@ -2246,49 +2266,47 @@ function add_infl(space) { function remove_infl(space) { push_undo() - const clicked_space = find_space_index(space) - //log(`Removed 1 influence from %${clicked_space}.`) - log_summary(`Removed £ SP from %${clicked_space}.`) + //log(`Removed 1 influence from %${space}.`) + log_summary(`Removed £ SP from %${space}.`) if (game.remove_opponent_infl === true) { if (game.active === COM) { - game.demInfl[clicked_space]-- - if (game.demInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + game.demInfl[space]-- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } } else { - game.comInfl[clicked_space]-- - if (game.comInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + game.comInfl[space]-- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } } - check_control_change(clicked_space) + check_control_change(space) } else { if (game.active === COM) { - game.comInfl[clicked_space]-- - if (game.comInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + game.comInfl[space]-- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } } else { - game.demInfl[clicked_space]-- - if (game.demInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + game.demInfl[space]-- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } } - check_control_change(clicked_space) + check_control_change(space) } game.available_ops-- } function do_sc(space) { clear_undo() - let clicked_space = find_space_index(space) - log_gap(`Support check: %${clicked_space}`) + log_gap(`Support check: %${space}`) //Check Helsinki Final Act - if (game.active === COM && game.persistent_events.includes(26) && (spaces[clicked_space].socio === 5 || spaces[clicked_space].socio === 6) ) { + if (game.active === COM && game.persistent_events.includes(26) && (spaces[space].socio === 5 || spaces[space].socio === 6) ) { log('+1 VP from C26') game.vp ++ if (check_vp()) { @@ -2341,29 +2359,29 @@ function do_sc(space) { // Events which modify SC rolls //Tear Gas - if (game.active === COM && game.persistent_events.includes(30) && spaces[clicked_space].socio === 6) { + if (game.active === COM && game.persistent_events.includes(30) && spaces[space].socio === 6) { roll ++ logi('+1 C30') permanently_remove(30) game.persistent_events = game.persistent_events.filter(n => n !== 30) } //FRG Embassies - if (game.active === DEM && spaces[clicked_space].region === 'Eastern Europe' && game.persistent_events.includes(74)) { + if (game.active === DEM && spaces[space].region === 'Eastern Europe' && game.persistent_events.includes(74)) { roll++ logi('+1 C74') } //GrenzTruppen - if (game.active === DEM && spaces[clicked_space].country === 'East_Germany' && game.persistent_events.includes(59)) { + if (game.active === DEM && spaces[space].country === 'East_Germany' && game.persistent_events.includes(59)) { roll-- logi('-1 C59') } //Stand Fast - if ((game.active === COM && game.stand_fast === DEM && check_dem_control(clicked_space)) || (game.active === DEM && game.stand_fast === COM && check_com_control(clicked_space))){ + if ((game.active === COM && game.stand_fast === DEM && check_dem_control(space)) || (game.active === DEM && game.stand_fast === COM && check_com_control(space))){ roll-- logi('-1 C100') } //Elena - if (game.active === DEM && game.persistent_events.includes(101) && spaces[clicked_space].country === 'Romania') { + if (game.active === DEM && game.persistent_events.includes(101) && spaces[space].country === 'Romania') { roll-- logi('-1 C101') } @@ -2379,7 +2397,7 @@ function do_sc(space) { const adj = count_adj(space) console.log('adj', adj) - if (game.active === COM && game.persistent_events.includes(9) && spaces[clicked_space].country === 'East_Germany') { + if (game.active === COM && game.persistent_events.includes(9) && spaces[space].country === 'East_Germany') { logi('No adjacency for Democrats due to C9') logi('C9 no longer in effect') roll += adj.com_adj @@ -2416,41 +2434,40 @@ function do_sc(space) { // Support check calcs log(`Total: ${roll}`) - const stability = spaces[find_space_index(space)].stability + const stability = spaces[space].stability logi(`-${stability*2} (stability * 2)`) const change_infl = Math.max(0, roll - stability*2) if (change_infl > 0) { log_msg_gap(`Change: ${change_infl} SP`) - let clicked_space = find_space_index(space) if(game.active === DEM) { - if (change_infl > game.comInfl[clicked_space]) { - const residual = change_infl - game.comInfl[clicked_space] - game.comInfl[clicked_space] = 0 - game.demInfl[clicked_space] += residual + if (change_infl > game.comInfl[space]) { + const residual = change_infl - game.comInfl[space] + game.comInfl[space] = 0 + game.demInfl[space] += residual } else { - game.comInfl[clicked_space] -= change_infl + game.comInfl[space] -= change_infl } - if (game.comInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space) + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space) } } else { - if (change_infl > game.demInfl[clicked_space]) { - const residual = change_infl - game.demInfl[clicked_space] - game.demInfl[clicked_space] = 0 - game.comInfl[clicked_space] += residual + if (change_infl > game.demInfl[space]) { + const residual = change_infl - game.demInfl[space] + game.demInfl[space] = 0 + game.comInfl[space] += residual } else { - game.demInfl[clicked_space] -= change_infl + game.demInfl[space] -= change_infl } - if (game.demInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space) + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space) } } - check_control_change(clicked_space) + check_control_change(space) } else { log_msg_gap('Change: 0 SP') } - if (game.active === COM && game.persistent_events.includes(39) && spaces[clicked_space].space_id === 66) { + if (game.active === COM && game.persistent_events.includes(39) && spaces[space].space_id === 66) { log_msg_gap('+1 VP from C39') game.vp++ if (check_vp()) { @@ -2677,8 +2694,8 @@ function do_valid_cards() { valid_cards(game.com_pwr_hand, presence.com_leaders)} } -function count_adj(name_unique) { - const space = spaces[find_space_index(name_unique)] +function count_adj(id) { + const space = spaces[id] let dem_adj = 0 let com_adj = 0 @@ -2808,7 +2825,7 @@ function do_tst_attempt() { // TIANANMEN SQUARE ATTEMPT game.return = game.active - game.return_state = 'tiananmen_square_attempt_success' + game.return_state = 'tiananmen_square_attempt_done' if (game.active === DEM) { game.dem_tst_attempted_this_turn = 1 if (roll >= dem_tst_req[game.dem_tst_position]) { @@ -2833,9 +2850,9 @@ function do_tst_attempt() { } //Check if TST events occur - if (game.dem_tst_position === 3 && game.com_tst_position < 3) {goto_vm(203)} - else if (game.dem_tst_position === 4 && game.com_tst_position < 4) {goto_vm(204)} - else {game.state = 'tiananmen_square_attempt_success'} + if (game.dem_tst_position === 3 && game.com_tst_position < 3) {game.vm_event = 203} + else if (game.dem_tst_position === 4 && game.com_tst_position < 4) {game.vm_event = 204} + game.state = 'tiananmen_square_attempt_success' } else { log(`${dem_tst_req[game.dem_tst_position]} required: fail`) game.dem_tst_attempted = 1 @@ -2846,12 +2863,6 @@ function do_tst_attempt() { if (roll >= com_tst_req[game.com_tst_position]) { log(`${com_tst_req[game.com_tst_position]} required: success`) game.com_tst_position++ - - //Check if they have reached the final box - Chinese Solution playable - if (game.com_tst_position === 8) { - game.playable_cards.push(96) - } - game.com_tst_attempted = 0 //Check if they have reached box 7 or 8 first @@ -2871,9 +2882,9 @@ function do_tst_attempt() { } //Check if TST events occur - if (game.com_tst_position === 3 && game.dem_tst_position < 3) {goto_vm(203)} - else if (game.com_tst_position === 4 && game.dem_tst_position < 4) {goto_vm(204)} - else {game.state = 'tiananmen_square_attempt_success'} + if (game.com_tst_position === 3 && game.dem_tst_position < 3) {game.vm_event = 203} + else if (game.com_tst_position === 4 && game.dem_tst_position < 4) {game.vm_event = 204} + game.state = 'tiananmen_square_attempt_success' } else { log(`${com_tst_req[game.com_tst_position]} required: fail`) game.com_tst_attempted = 1 @@ -3253,6 +3264,10 @@ function event_is_playable(card) { else if (game.persistent_events.includes(13) && card === 21 && game.active === DEM) { return false } + //Check for The Chinese Solution + else if (game.com_tst_position === 8 && card === 96) { + return true + } //Then check normally else if (cards[card].playable) { return true @@ -3482,6 +3497,13 @@ function end_round() { // Resolve end action round //Stasi check if(game.round_player === COM && game.persistent_events.includes(13)) { + //If in Honecker, turn ends + if (game.round === 8) { + clear_undo() + game.state = 'end_turn_4_5_4' + return + } + //Otherwise go to Stasi game.round_player = DEM if (game.active !== DEM) { next_player() @@ -4610,54 +4632,52 @@ function vm_take_control_prep() { } function vm_take_control(space) { - let clicked_space = find_space_index(space) if (game.active === DEM) { - let current_infl = game.demInfl[clicked_space] - let opponent_infl = game.comInfl[clicked_space] - let stability = spaces[clicked_space].stability + let current_infl = game.demInfl[space] + let opponent_infl = game.comInfl[space] + let stability = spaces[space].stability if ((current_infl - opponent_infl) < stability) { - game.demInfl[clicked_space] += stability - current_infl + opponent_infl - //game.pieces[clicked_space].demCtrl = 1 - //game.pieces[clicked_space].comCtrl = 0 + game.demInfl[space] += stability - current_infl + opponent_infl + //game.pieces[space].demCtrl = 1 + //game.pieces[space].comCtrl = 0 } } else if (game.active === COM) { - let current_infl = game.comInfl[clicked_space] - let opponent_infl = game.demInfl[clicked_space] - let stability = spaces[clicked_space].stability + let current_infl = game.comInfl[space] + let opponent_infl = game.demInfl[space] + let stability = spaces[space].stability if ((current_infl - opponent_infl) < stability) { - game.comInfl[clicked_space] += stability - current_infl + opponent_infl - //game.pieces[clicked_space].comCtrl = 1 - //game.pieces[clicked_space].demCtrl = 0 + game.comInfl[space] += stability - current_infl + opponent_infl + //game.pieces[space].comCtrl = 1 + //game.pieces[space].demCtrl = 0 } } - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space) - log(`Took control of %${clicked_space}`) + game.valid_spaces = game.valid_spaces.filter(id => id !== space) + log(`Took control of %${space}`) } function vm_do_add_infl(space) { push_undo() console.log('in vm_do_add_infl, space', space, 'ops', game.vm_available_ops, 'ahbr tracker', game.austria_hungary_border_reopened_tracker, 'ahbr in events', game.persistent_events.includes(58)) - const clicked_space = find_space_index(space) - //log(`Added 1 influence in %${clicked_space}.`) + //log(`Added 1 influence in %${space}.`) - log_summary(`Added £ SP in %${clicked_space}.`) + log_summary(`Added £ SP in %${space}.`) //If AHBR - check AHBR condition if (game.persistent_events.includes(58)) { - if (spaces[clicked_space].country !== 'East_Germany'){ + if (spaces[space].country !== 'East_Germany'){ game.austria_hungary_border_reopened_tracker = false } } // Check Genscher - if (game.persistent_events.includes(63) && game.active === DEM && spaces[clicked_space].country === 'East_Germany') { + if (game.persistent_events.includes(63) && game.active === DEM && spaces[space].country === 'East_Germany') { game.vm_available_ops-- log_summary(`(-1 op due to C63)`) - } else if (check_opp_control(clicked_space)) { + } else if (check_opp_control(space)) { game.vm_available_ops -= 2 //Check if Austria Hungary Border Reopened was used to place last SP in a controlled space in East Germany. If so, game.vm_available_op will be negative if (game.vm_available_ops < 0) { @@ -4669,13 +4689,13 @@ function vm_do_add_infl(space) { // Update influence values if (game.active === COM) { - game.comInfl[clicked_space]++ + game.comInfl[space]++ } else { - game.demInfl[clicked_space]++ + game.demInfl[space]++ } // Check whether spaces are controlled - check_control_change(clicked_space) + check_control_change(space) console.log('before check, ahbr in events', game.persistent_events.includes(58), 'tracker', game.austria_hungary_border_reopened_tracker) // Check Austria Hungary Border Reopened is true and condition has been met @@ -4715,23 +4735,22 @@ function vm_do_add_infl(space) { function vm_do_add_infl_free(space) { push_undo() - const clicked_space = find_space_index(space) - //log(`Added 1 influence in %${clicked_space}.`) + //log(`Added 1 influence in %${space}.`) - log_summary(`Added £ SP in %${clicked_space}.`) + log_summary(`Added £ SP in %${space}.`) // Update influence values if (game.active === COM) { - game.comInfl[clicked_space]++ + game.comInfl[space]++ } else { - game.demInfl[clicked_space]++ + game.demInfl[space]++ } game.vm_available_ops-- // Check whether spaces are controlled - check_control_change(clicked_space) + check_control_change(space) - //console.log('game pieces:', game.pieces[clicked_space]) + //console.log('game pieces:', game.pieces[space]) } function vm_add_infl() { @@ -4751,16 +4770,15 @@ function vm_add_x_infl() { function vm_do_add_x_infl(space) { push_undo() - const clicked_space = find_space_index(space) - log(`Added ${game.vm_available_ops} SPs in %${clicked_space}.`) + log(`Added ${game.vm_available_ops} SPs in %${space}.`) if (game.active === COM) { - game.comInfl[clicked_space] += game.vm_available_ops + game.comInfl[space] += game.vm_available_ops } else { - game.demInfl[clicked_space] += game.vm_available_ops + game.demInfl[space] += game.vm_available_ops } - check_control_change(clicked_space) + check_control_change(space) game.vm_available_ops = 0 game.valid_spaces = [] } @@ -4773,34 +4791,33 @@ function vm_add_limited_infl() { function vm_do_add_limited_infl(space, max_infl) { push_undo() - const clicked_space = find_space_index(space) - //log(`Added 1 influence in %${clicked_space}.`) + //log(`Added 1 influence in %${space}.`) - log_summary(`Added £ SP in %${clicked_space}.`) + log_summary(`Added £ SP in %${space}.`) game.vm_available_ops -- if (!game.vm_influence_added) { game.vm_influence_added = {}; } - if (!game.vm_influence_added[clicked_space]) { - game.vm_influence_added[clicked_space] = 0; + if (!game.vm_influence_added[space]) { + game.vm_influence_added[space] = 0; } if (game.active === COM) { - game.comInfl[clicked_space] ++ + game.comInfl[space] ++ } else { - game.demInfl[clicked_space] ++ + game.demInfl[space] ++ } - game.vm_influence_added[clicked_space] ++ + game.vm_influence_added[space] ++ //console.log('valid_spaces before update', game.valid_spaces) - //console.log('influence added:', game.vm_influence_added[clicked_space], 'max infl', max_infl) - if (game.vm_influence_added[clicked_space] === max_infl) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + //console.log('influence added:', game.vm_influence_added[space], 'max infl', max_infl) + if (game.vm_influence_added[space] === max_infl) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } - check_control_change(clicked_space) + check_control_change(space) if (game.vm_available_ops === 0) {game.valid_spaces = [] } } @@ -4823,90 +4840,88 @@ function vm_remove_x_opp_infl() { function vm_do_remove_infl(space) { push_undo() - const clicked_space = find_space_index(space) - //log(`Removed 1 influence from %${clicked_space}.`) - log_summary(`Removed £ SP from %${clicked_space}.`) + //log(`Removed 1 influence from %${space}.`) + log_summary(`Removed £ SP from %${space}.`) if (!game.vm_influence_added) { game.vm_influence_added = {}; } - if (!game.vm_influence_added[clicked_space]) { - game.vm_influence_added[clicked_space] = 0; + if (!game.vm_influence_added[space]) { + game.vm_influence_added[space] = 0; } if (game.remove_opponent_infl === true) { if (game.active === COM) { - game.demInfl[clicked_space]-- - if (game.demInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + game.demInfl[space]-- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } } else { - game.comInfl[clicked_space]-- - if (game.comInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + game.comInfl[space]-- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } } } else { if (game.active === COM) { - game.comInfl[clicked_space]-- - if (game.comInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + game.comInfl[space]-- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } } else { - game.demInfl[clicked_space]-- - if (game.demInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + game.demInfl[space]-- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } } } - check_control_change(clicked_space) - game.vm_influence_added[clicked_space]++ + check_control_change(space) + game.vm_influence_added[space]++ game.vm_available_ops-- if (game.vm_available_ops===0) {game.valid_spaces = []} } function vm_do_remove_x_infl(space) { push_undo() - const clicked_space = find_space_index(space) if (game.remove_opponent_infl) { if (game.active === COM) { - if (game.demInfl[clicked_space] >= game.vm_available_ops) { - game.demInfl[clicked_space] -= game.vm_available_ops + if (game.demInfl[space] >= game.vm_available_ops) { + game.demInfl[space] -= game.vm_available_ops } else { - game.vm_available_ops = game.demInfl[clicked_space] - game.demInfl[clicked_space] -= game.vm_available_ops + game.vm_available_ops = game.demInfl[space] + game.demInfl[space] -= game.vm_available_ops } } else { - if (game.comInfl[clicked_space] >= game.vm_available_ops) { - game.comInfl[clicked_space] -= game.vm_available_ops + if (game.comInfl[space] >= game.vm_available_ops) { + game.comInfl[space] -= game.vm_available_ops } else { - game.vm_available_ops = game.comInfl[clicked_space] - game.comInfl[clicked_space] -= game.vm_available_ops + game.vm_available_ops = game.comInfl[space] + game.comInfl[space] -= game.vm_available_ops } } } else { if (game.active === COM) { - if (game.comInfl[clicked_space] >= game.vm_available_ops) { - game.comInfl[clicked_space] -= game.vm_available_ops + if (game.comInfl[space] >= game.vm_available_ops) { + game.comInfl[space] -= game.vm_available_ops } else { - game.vm_available_ops = game.comInfl[clicked_space] - game.comInfl[clicked_space] -= game.vm_available_ops + game.vm_available_ops = game.comInfl[space] + game.comInfl[space] -= game.vm_available_ops } } else { - if (game.demInfl[clicked_space] >= game.vm_available_ops) { - game.demInfl[clicked_space] -= game.vm_available_ops + if (game.demInfl[space] >= game.vm_available_ops) { + game.demInfl[space] -= game.vm_available_ops } else { - game.vm_available_ops = game.demInfl[clicked_space] - game.demInfl[clicked_space] -= game.vm_available_ops + game.vm_available_ops = game.demInfl[space] + game.demInfl[space] -= game.vm_available_ops } } } - log(`Removed ${game.vm_available_ops} SPs from %${clicked_space}`) - check_control_change(clicked_space) + log(`Removed ${game.vm_available_ops} SPs from %${space}`) + check_control_change(space) game.vm_available_ops = 0 game.valid_spaces = [] @@ -4921,8 +4936,7 @@ function vm_remove_limited_opp_infl() { function vm_do_remove_limited_infl(space, max_infl) { push_undo() - const clicked_space = find_space_index(space) - log(`Removed SP from %${clicked_space}.`) + log(`Removed SP from %${space}.`) game.vm_available_ops -- @@ -4930,29 +4944,29 @@ function vm_do_remove_limited_infl(space, max_infl) { game.vm_influence_added = {}; } - if (!game.vm_influence_added[clicked_space]) { - game.vm_influence_added[clicked_space] = 0; + if (!game.vm_influence_added[space]) { + game.vm_influence_added[space] = 0; } if (game.active === COM) { - game.demInfl[clicked_space] -- - if (game.demInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space) + game.demInfl[space] -- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space) } } else { - game.comInfl[clicked_space] -- - if (game.comInfl[clicked_space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space) + game.comInfl[space] -- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space) } } - game.vm_influence_added[clicked_space] ++ + game.vm_influence_added[space] ++ - if (game.vm_influence_added[clicked_space] === max_infl) { - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space); + if (game.vm_influence_added[space] === max_infl) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); } - check_control_change(clicked_space) + check_control_change(space) if (game.vm_available_ops === 0) {game.valid_spaces = []} } @@ -4963,27 +4977,26 @@ function vm_remove_all_infl() { function vm_do_remove_all_infl(space) { push_undo() - const clicked_space = find_space_index(space) - log(`Removed all SP from %${clicked_space}.`) + log(`Removed all SP from %${space}.`) if (game.remove_opponent_infl === true) { if (game.active === COM) { - game.demInfl[clicked_space] = 0 + game.demInfl[space] = 0 } else { - game.comInfl[clicked_space] = 0 + game.comInfl[space] = 0 } - check_control_change(clicked_space) + check_control_change(space) } else { if (game.active === COM) { - game.comInfl[clicked_space] = 0 + game.comInfl[space] = 0 } else { - game.demInfl[clicked_space] = 0 + game.demInfl[space] = 0 } - check_control_change(clicked_space) + check_control_change(space) } game.vm_available_ops -- - game.valid_spaces = game.valid_spaces.filter(id => id !== clicked_space) + game.valid_spaces = game.valid_spaces.filter(id => id !== space) } function vm_replace_all_infl(space_id) { @@ -5013,14 +5026,14 @@ function vm_support_check_modified() { game.state = 'vm_support_check_prep' } -function vm_switch_infl(space){ +function vm_switch_infl(id){ push_undo() - let clicked_space = find_space_index(space) - game.demInfl[clicked_space] -= game.vm_available_ops - game.comInfl[clicked_space] += game.vm_available_ops - log(`Replaced ${pluralize(game.vm_available_ops,'SP')} in ${spaces[clicked_space].name_unique}`) + + game.demInfl[id] -= game.vm_available_ops + game.comInfl[id] += game.vm_available_ops + log(`Replaced ${pluralize(game.vm_available_ops,'SP')} in %${id}`) game.vm_available_ops = 0 - check_control_change(clicked_space) + check_control_change(id) } /* ===================== EVENT SPECIFIC FUNCTIONS ========== */ @@ -5210,37 +5223,11 @@ function vm_eliminate(space_id) { //console.log('adjacency before: Iasi', game.pieces[53].adjacent, 'Ploesti:', game.pieces[59].adjacent, 'Bucharesti:', game.pieces[61].adjacent) - // Remove clicked_space from the adjacency lists of its adjacent spaces - /* adjacent_spaces.forEach(s => { - game.pieces[s].adjacent = spaces[s].adjacent.filter(id => id !== space_id); - }); - - //console.log('adjacency after: Iasi', game.pieces[53].adjacent, 'Ploesti:', game.pieces[59].adjacent, 'Bucharesti:', game.pieces[61].adjacent) - - // Connect adjacent spaces to each other - // No longer used - spaces done dynamically -/* - for (let i = 0; i < adjacent_spaces.length; i++) { - for (let j = i + 1; j < adjacent_spaces.length; j++) { - console.log(' checking i,', spaces[adjacent_spaces[i]].name, 'j', spaces[adjacent_spaces[j]].name) - if (!game.pieces[adjacent_spaces[i]].adjacent.includes(adjacent_spaces[j])) { - game.pieces[adjacent_spaces[i]].adjacent.push(adjacent_spaces[j]); - } - if (!game.pieces[adjacent_spaces[j]].adjacent.includes(adjacent_spaces[i])) { - game.pieces[adjacent_spaces[j]].adjacent.push(adjacent_spaces[i]); - } - } - } - - console.log('adjacency after addition: Iasi', game.pieces[53].adjacent, 'Ploesti:', game.pieces[59].adjacent, 'Bucharesti:', game.pieces[61].adjacent) - // Clear the adjacency list of the clicked space - game.pieces[space_id].adjacent = []; -*/ // Eliminate the democrat influence and move the communist influence to Bucuresti game.demInfl[space_id] = 0 game.comInfl[61] += game.comInfl[space_id] if (game.comInfl[space_id] > 0 ) { - log(`${game.comInfl[space_id]} Communist SP relocated to Bucuresti`) + log(`${pluralize(game.comInfl[space_id],'Communist SP')} relocated to %61`) } game.comInfl[space_id] = 0 @@ -5965,7 +5952,7 @@ states.vm_take_control = { } else if (game.vm_available_ops > 0 ) { view.prompt = `${clean_name(cards[this_card()].name)}: take control of ${event_prompt()}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } else { view.prompt = `${clean_name(cards[this_card()].name)}. Take control: done.` @@ -5994,7 +5981,7 @@ states.vm_add_infl = { view.prompt = `${clean_name(cards[this_card()].name)}: add ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique) + gen_action_infl(space_id) } } else { view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` @@ -6031,7 +6018,7 @@ states.vm_add_infl_free = { view.prompt = `${clean_name(cards[this_card()].name)}: add ${game.vm_available_ops} SPs to ${event_prompt()}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } else { view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` @@ -6065,7 +6052,7 @@ states.vm_add_x_infl = { view.prompt = `${clean_name(cards[this_card()].name)}: Add ${game.vm_available_ops} SPs to ${event_prompt()}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique) + gen_action_infl(space_id) } } else { view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` @@ -6075,6 +6062,9 @@ states.vm_add_x_infl = { infl(space) { push_undo() vm_do_add_x_infl(space) + if (game.vm_event === 105) { + vm_next() + } //game.vm_event_done = true //vm_next() }, @@ -6097,7 +6087,7 @@ states.vm_add_limited_infl = { view.prompt = `${clean_name(cards[this_card()].name)}: add ${pluralize(game.vm_available_ops,'SP')} to ${event_prompt()}.` } for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } else { view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` @@ -6141,14 +6131,13 @@ states.vm_remove_infl = { view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}.` } for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } }, infl(space) { push_undo() vm_do_remove_infl(space) - const clicked_space = find_space_index(space) - game.vm_active_country = spaces[clicked_space].country + game.vm_active_country = spaces[space].country /*if (game.vm_available_ops === 0 || game.valid_spaces.length === 0) { vm_next() }*/ @@ -6176,7 +6165,7 @@ states.vm_remove_x_infl = { view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')} from ${event_prompt()}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } else { view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` @@ -6201,7 +6190,7 @@ states.vm_remove_limited_infl = { view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}, no more than ${game.vm_max_infl} per space.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } else if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { view.prompt = `${clean_name(cards[this_card()].name)}: no further SP to remove.` @@ -6236,7 +6225,7 @@ states.vm_remove_all_infl = { } else if (game.vm_available_ops > 0) { view.prompt = `${clean_name(cards[this_card()].name)}: remove all SPs from ${event_prompt()}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } else { view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` @@ -6245,8 +6234,7 @@ states.vm_remove_all_infl = { }, infl(space) { vm_do_remove_all_infl(space) - const clicked_space = find_space_index(space) - game.vm_active_country = spaces[clicked_space].country + game.vm_active_country = spaces[space].country /*if (game.vm_available_ops === 0 || game.valid_spaces.length === 0) { vm_next() }*/ @@ -6272,13 +6260,13 @@ states.vm_support_check_prep = { } for (let space_id of game.valid_spaces) { if (!space_id) continue - gen_action_sc(spaces[space_id].name_unique); + gen_action_sc(space_id); } } }, sc(space) { push_undo() - game.selected_space = find_space_index(space) + game.selected_space = space // Check for Austria-Hungary Border Reopened - check on first support check only //First check for Monday Demonstrations - support checks will always be in East Germany @@ -6319,13 +6307,13 @@ states.vm_ceh_support_check_prep = { view.prompt = `Select a space. ${pluralize(game.vm_available_ops, 'support check')} remaining.` for (let space_id of game.valid_spaces) { - gen_action_sc(spaces[space_id].name_unique) + gen_action_sc(space_id) } } }, sc(space) { push_undo() - game.selected_space = find_space_index(space) + game.selected_space = space //Then check Austria-Hungary Border Reopened normally //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) @@ -6355,7 +6343,7 @@ states.vm_ceh_do_support_check = { }, roll() { clear_undo() - do_sc(spaces[game.selected_space].name_unique) + do_sc(game.selected_space) game.vm_available_ops-- if (game.vm_available_ops === 0) { @@ -6396,13 +6384,13 @@ states.vm_1_support_check_prep = { for (let space_id of game.valid_spaces) { if (!space_id) continue - gen_action_sc(spaces[space_id].name_unique); + gen_action_sc(space_id); } } }, sc(space) { push_undo() - game.selected_space = find_space_index(space) + game.selected_space = space game.state = 'vm_do_support_check' }, done () { @@ -6419,7 +6407,7 @@ states.vm_do_support_check = { }, roll() { clear_undo() - do_sc(spaces[game.selected_space].name_unique) + do_sc(game.selected_space) game.vm_available_ops-- if (game.vm_available_ops === 0) { game.valid_spaces = [] @@ -7263,13 +7251,17 @@ states.vm_kremlin_coup_take_control = { return `resolve ${clean_name(cards[game.played_card].name)}.` }, prompt() { - if (game.valid_spaces.length === 0){ + if (game.valid_spaces.includes(game.systematization)) { + view.prompt = `Kremlin Coup! ${country_name(game.vm_active_country)}'s Elite space no longer exists.` + gen_action('done') + } + else if (game.valid_spaces.length === 0){ view.prompt = `Kremlin Coup! ${country_name(game.vm_active_country)}'s Elite space is already controlled.` gen_action('done') } else { view.prompt = `Kremlin Coup! Take control of the Elite space in ${country_name(game.vm_active_country)}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } }, @@ -7300,10 +7292,10 @@ states.vm_kremlin_coup_sc_prep = { }, prompt() { view.prompt = `Kremlin Coup! Conduct a support check in ${country_name(game.vm_active_country)}'s Bureaucratic space.` - gen_action_sc(spaces[game.selected_space].name_unique); + gen_action_sc(game.selected_space); }, sc(space) { - //game.selected_space = find_space_index(space) + //game.selected_space = space game.state = 'vm_kremlin_coup_sc' } } @@ -7316,7 +7308,7 @@ states.vm_kremlin_coup_sc = { }, roll() { clear_undo() - do_sc(spaces[game.selected_space].name_unique) + do_sc(game.selected_space) if (game.temp.length > 0 ){ game.state = 'vm_kremlin_coup_choose_country' } else { @@ -7378,7 +7370,7 @@ states.vm_switch_infl = { /*if (game.vm_available_ops > 0 ) {*/ view.prompt = `${clean_name(cards[game.played_card].name)}: ${event_prompt()}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } /*else { view.prompt = 'Influence replaced.' @@ -7592,7 +7584,7 @@ states.vm_nomenklatura_remove = { view.prompt = 'Nomenklatura: remove all Democratic SPs from Elite spaces.' for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } }, @@ -7619,7 +7611,7 @@ states.vm_nomenklatura_add = { } else { view.prompt = `Nomenklatura: add 3 SPs to any Elite space(s). ${pluralize(game.vm_available_ops, 'SP')} remaining.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } }, @@ -7821,7 +7813,7 @@ states.vm_systematization = { /*if (game.systematization === 0) { */ view.prompt = 'Systematization: eliminate a space in Romania.' for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } /*} else { view.prompt = 'Systematization: done.' @@ -7830,9 +7822,9 @@ states.vm_systematization = { }, infl(space) { push_undo() - vm_eliminate(find_space_index(space)) + vm_eliminate(space) game.valid_spaces = [] - game.systematization = find_space_index(space) + game.systematization = space game.persistent_events.push(69) vm_next() }, @@ -7936,7 +7928,7 @@ states.vm_the_tyrant_is_gone = { view.prompt = 'The Tyrant is Gone: Select a space in Romania for the Ceausescus to flee to.' for (let space_id of game.valid_spaces) { if (!space_id) continue - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } else { view.prompt = 'Select a space: done.' @@ -7945,8 +7937,9 @@ states.vm_the_tyrant_is_gone = { }, infl(space) { push_undo() - log(`The Ceausescus flee to %${find_space_index(space)}`) - game.the_tyrant_is_gone = find_space_index(space) + log(`The Ceausescus flee to %${space}`) + game.the_tyrant_is_gone = space + game.valid_spaces = [] game.persistent_events.push(97) }, done () { @@ -8117,7 +8110,7 @@ states.vm_we_are_the_people_remove = { view.prompt = '"We are the People!": remove up to 4 SPs from the Lutherian Church.' gen_action('done') for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } } else { view.prompt = '"We are the People!" Remove SPs: done.' @@ -8155,7 +8148,7 @@ states.vm_we_are_the_people_add = { view.prompt = `"We are the People!": you must add the ${pluralize(game.vm_influence_added[6],'SP')} to spaces in Germany.` gen_action('done') for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } }, infl(space) { @@ -8177,13 +8170,22 @@ states.vm_workers_revolt = { return `resolve ${clean_name(cards[game.played_card].name)}.` }, prompt() { + if (game.valid_spaces.length === 0 ) { + view.prompt = 'Workers Revolt: no valid spaces to select.' + gen_action('pass') + return + } view.prompt = 'Workers Revolt: select a Worker Space in a country your opponent has power.' for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique) + gen_action_infl(space_id) } }, + pass() { + push_undo() + vm_next() + }, infl(space) { - game.selected_space = find_space_index(space) + game.selected_space = space log(`Chose %${game.selected_space}`) game.state = 'vm_workers_revolt_finish' } @@ -8208,7 +8210,7 @@ states.vm_workers_revolt_finish = { clear_undo() let roll = Math.floor(Math.random() * 6) + 1 log(`Roll: D${roll}`) - let adj = count_adj(spaces[game.selected_space].name_unique) + let adj = count_adj(game.selected_space) if (game.active === DEM) { log(`-${adj.com_adj} from opponent controlled spaces`) roll -= adj.com_adj @@ -8285,10 +8287,10 @@ states.vm_tst_4 = { gen_action('done') return } - view.prompt = 'Tiananmen Square Track award: select a space to remove SPs' + view.prompt = `Tiananmen Square Track award: remove ${pluralize(game.vm_available_ops,'SP')}.` for (let space_id of game.valid_spaces) { - gen_action_infl(spaces[space_id].name_unique); + gen_action_infl(space_id); } }, infl(space) { @@ -8314,14 +8316,14 @@ states.vm_tst_6 = { view.prompt = 'Tiananmen Square Track award: you have a free 2 Ops support check.' for (let space_id of game.valid_spaces) { if (space_id) { - gen_action_sc(spaces[space_id].name_unique); + gen_action_sc(space_id); } } } }, sc(space) { push_undo() - game.selected_space = find_space_index(space) + game.selected_space = space if (game.active === DEM && game.persistent_events.includes(58) && spaces[space].country === "East_Germany") { game.austria_hungary_border_reopened_tracker = true } @@ -8340,7 +8342,7 @@ states.vm_tst_6_sc = { }, roll() { clear_undo() - do_sc(spaces[game.selected_space].name_unique) + do_sc(game.selected_space) game.vm_available_ops-- game.valid_spaces = [] game.state = 'vm_tst_6' @@ -9395,8 +9397,6 @@ CODE[110] = [ // Malta Summit* // #endregion - - // ============= TIANANMEN SQUARE TRACK AWARDS ==================== CODE[203] = [//Tiananmen Square space 3 award [vm_tst_3], -- cgit v1.2.3 From 6d8ac00db1366e7b0c790e679bc439c8fcac5fed Mon Sep 17 00:00:00 2001 From: iainp5 Date: Fri, 18 Oct 2024 10:23:34 +0100 Subject: Added action toggles --- play.css | 15 +++++++-------- play.js | 29 ++++++++++++++++++----------- 2 files changed, 25 insertions(+), 19 deletions(-) (limited to 'play.css') diff --git a/play.css b/play.css index 535ba84..f9ed02e 100644 --- a/play.css +++ b/play.css @@ -194,10 +194,10 @@ header.your_turn { background-color: orange; } background-image: url(images/USd_blank.gif); background-size: contain; } - +/* .demInfl:hover { cursor: pointer; -} +}*/ .comInfl { position: absolute; @@ -207,10 +207,10 @@ header.your_turn { background-color: orange; } height: 35px; width: 35px; } - +/* .comInfl:hover { cursor: pointer; -} +}*/ .comInfl.controlled { background-image: url(images/SV_blank.gif); @@ -551,11 +551,10 @@ left: 660px} border-radius: 5px; transition: transform .3s ease 0.5s; } - +/* .hand_card:hover { cursor: pointer; - /*transform: scale(1.75);*/ -} +}*/ .zoom { transform: scale(1.75) @@ -577,7 +576,7 @@ left: 660px} } .discard_card:hover, .event_card:hover { - cursor: pointer; + /*cursor: pointer;*/ transform: scale(2); } diff --git a/play.js b/play.js index dd38b44..61e841f 100644 --- a/play.js +++ b/play.js @@ -182,12 +182,12 @@ function is_card_enabled(card) { function on_click_space(evt) { if (evt.button === 0) { const space = evt.target.my_space; - console.log('on_click_space_called with space:', space); + //console.log('on_click_space_called with space:', space); if (send_action('infl', space)) { - console.log('send_action with infl:', space); + //console.log('send_action with infl:', space); evt.stopPropagation(); } else if (send_action('sc', space)) { - console.log('send_action with sc:', space); + //console.log('send_action with sc:', space); evt.stopPropagation(); } else { // console.log('send_action failed for space:', space); @@ -199,9 +199,9 @@ function on_click_space(evt) { function on_click_card(evt) { if (evt.button === 0) { const card = evt.target.my_card; - console.log('on_click_card_called with card:', card); + //console.log('on_click_card_called with card:', card); if (is_action('card', card)) { - console.log('in action card') + //console.log('in action card') if (send_action('card', card)) { evt.stopPropagation(); } @@ -211,15 +211,15 @@ function on_click_card(evt) { function is_action(action) { //console.log('is_action called with: ', action) - console.log('view.actions', view.actions) + //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]) + //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 @@ -417,9 +417,15 @@ function on_update() { 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 { @@ -450,7 +456,7 @@ if (!view.is_pwr_struggle) { } // DISCARD FOR EVENTS -console.log('view.discard',view.discard) +//console.log('view.discard',view.discard) if(view.discard) { //document.getElementById("discard").replaceChildren() document.getElementById("discard_panel").classList.remove("hide") @@ -484,6 +490,7 @@ for (let c of view.strategy_removed) { 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") } @@ -517,7 +524,7 @@ if (!view.is_pwr_struggle) { 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 ) + //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) { @@ -699,7 +706,7 @@ if (view.persistent_events.includes(97)) { action_button("end_round", "End Round") action_button("undo", "Undo") -console.log('view.strategy_deck', view.strategy_deck) +console.log('view.actions', view.actions) } // =========================== LOG FUNCTIONS ============================================== -- cgit v1.2.3 From bf856d132261e7ca91ca6f8fbe5cecef6ba939d6 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Fri, 25 Oct 2024 12:06:40 +0200 Subject: Normalize line endings. Added .gitattributes with text=auto setting. Ran `git add --renormalize .` to update all the checked in files. --- .gitattributes | 3 + data.js | 506 +- play.css | 1482 ++--- play.html | 420 +- play.js | 1628 ++--- rules.js | 19784 +++++++++++++++++++++++++++---------------------------- 6 files changed, 11913 insertions(+), 11910 deletions(-) create mode 100644 .gitattributes (limited to 'play.css') diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..aee666c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +* text=auto +*.jpg binary +*.png binary diff --git a/data.js b/data.js index a4a64a8..17e7530 100644 --- a/data.js +++ b/data.js @@ -1,253 +1,253 @@ -const spaces = [ - null, - {name_unique: 'Schwerin', space_id: 1, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 111, y: 61}, adjacent: [2, 3, , , ]}, - {name_unique: 'Rostock', space_id: 2, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 228, y: 41}, adjacent: [1, 3, , , ]}, - {name_unique: 'Berlin', space_id: 3, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'East_Germany', region: 'Eastern Europe', box: {x: 251, y: 113}, adjacent: [1, 2, 5, 9, ]}, - {name_unique: 'German Writers', space_id: 4, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 58, y: 185}, adjacent: [5, , , , ]}, - {name_unique: 'Walter Ulbricht Academy', space_id: 5, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 175, y: 187}, adjacent: [3, 4, , , ]}, - {name_unique: 'Lutherian Church', space_id: 6, socio: 7, stability: 5, battleground: 1, demInfl: 1, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 300, y: 212}, adjacent: [9, , , , ]}, - {name_unique: 'Magdeburg', space_id: 7, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 58, y: 275}, adjacent: [8, 10, 11, , ]}, - {name_unique: 'Halle', space_id: 8, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 175, y: 278}, adjacent: [7, 9, 11, , ]}, - {name_unique: 'Leipzig', space_id: 9, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 297, y: 297}, adjacent: [3, 6, 8, 11, 12]}, - {name_unique: 'Erfurt', space_id: 10, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 23, y: 356}, adjacent: [7, , , , ]}, - {name_unique: 'Karl-Marx-Stadt', space_id: 11, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 138, y: 385}, adjacent: [7, 8, 9, 12, ]}, - {name_unique: 'Dresden', space_id: 12, socio: 1, stability: 4, battleground: 1, demInfl: 0, comInfl: 2, country: 'East_Germany', region: 'Eastern Europe', box: {x: 262, y: 375}, adjacent: [9, 11, 19, 27, ]}, - {name_unique: 'Szczecin', space_id: 13, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 434, y: 204}, adjacent: [14, 16, , , ]}, - {name_unique: 'Gdańsk', space_id: 14, socio: 4, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 699, y: 215}, adjacent: [13, 15, 16, 17, 18]}, - {name_unique: 'Bydgoszcz', space_id: 15, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 679, y: 304}, adjacent: [14, 17, , , ]}, - {name_unique: 'Poznań', space_id: 16, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 521, y: 355}, adjacent: [13, 14, 19, 20, ]}, - {name_unique: 'Warszawa', space_id: 17, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 806, y: 383}, adjacent: [14, 15, 18, 21, 24]}, - {name_unique: 'Białystok', space_id: 18, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 940, y: 342}, adjacent: [14, 17, 24, , ]}, - {name_unique: 'Wrocław', space_id: 19, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 462, y: 443}, adjacent: [12, 16, 20, 22, ]}, - {name_unique: 'Catholic Church, Poland', space_id: 20, socio: 7, stability: 5, battleground: 0, demInfl: 5, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 625, y: 437}, adjacent: [16, 19, 21, 22, 23]}, - {name_unique: 'Łódź', space_id: 21, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 749, y: 486}, adjacent: [17, 20, 23, 24, ]}, - {name_unique: 'Katowice', space_id: 22, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 570, y: 569}, adjacent: [19, 20, 23, 33, ]}, - {name_unique: 'Kraków', space_id: 23, socio: 4, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 711, y: 598}, adjacent: [20, 21, 22, 25, ]}, - {name_unique: 'Lublin', space_id: 24, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 879, y: 603}, adjacent: [17, 18, 21, , ]}, - {name_unique: 'Jagiellian University', space_id: 25, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 679, y: 681}, adjacent: [23, 26, , , ]}, - {name_unique: 'Polish Writers', space_id: 26, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 832, y: 694}, adjacent: [25, , , , ]}, - {name_unique: 'Plzeň', space_id: 27, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 2, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 159, y: 483}, adjacent: [12, 28, 29, , ]}, - {name_unique: 'České Budĕjovice', space_id: 28, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 196, y: 601}, adjacent: [27, 29, , , ]}, - {name_unique: 'Praha', space_id: 29, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 317, y: 614}, adjacent: [27, 28, 30, 32, ]}, - {name_unique: 'Charles University', space_id: 30, socio: 6, stability: 1, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 380, y: 532}, adjacent: [29, 31, , , ]}, - {name_unique: 'Czech Writers', space_id: 31, socio: 5, stability: 2, battleground: 1, demInfl: 2, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 444, y: 607}, adjacent: [30, , , , ]}, - {name_unique: 'Brno', space_id: 32, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 1, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 403, y: 711}, adjacent: [29, 33, 34, , ]}, - {name_unique: 'Ostrava', space_id: 33, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 523, y: 681}, adjacent: [22, 32, 34, 35, ]}, - {name_unique: 'Bratislava', space_id: 34, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 417, y: 797}, adjacent: [32, 33, 35, , ]}, - {name_unique: 'Catholic Church, Czechoslovakia', space_id: 35, socio: 7, stability: 5, battleground: 0, demInfl: 1, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 538, y: 794}, adjacent: [33, 34, 36, , ]}, - {name_unique: 'Prešov', space_id: 36, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 658, y: 794}, adjacent: [35, 37, , , ]}, - {name_unique: 'Košice', space_id: 37, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 777, y: 815}, adjacent: [36, 42, , , ]}, - {name_unique: 'Catholic Church, Hungary', space_id: 38, socio: 7, stability: 5, battleground: 0, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 314, y: 886}, adjacent: [39, 43, , , ]}, - {name_unique: 'Győr', space_id: 39, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 434, y: 887}, adjacent: [38, 40, 43, 44, ]}, - {name_unique: 'Tatabánya', space_id: 40, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 549, y: 886}, adjacent: [39, 41, 45, , ]}, - {name_unique: 'Miskolc', space_id: 41, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 664, y: 901}, adjacent: [40, 42, 45, , ]}, - {name_unique: 'Debrecen', space_id: 42, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 781, y: 938}, adjacent: [37, 41, , , ]}, - {name_unique: 'Szombathely', space_id: 43, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Hungary', region: 'Eastern Europe', box: {x: 316, y: 963}, adjacent: [38, 39, 44, , ]}, - {name_unique: 'Székesfehérvár', space_id: 44, socio: 4, stability: 3, battleground: 0, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 442, y: 962}, adjacent: [39, 43, 45, , ]}, - {name_unique: 'Budapest', space_id: 45, socio: 2, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 630, y: 983}, adjacent: [40, 41, 44, 47, 48]}, - {name_unique: 'Hungarian Writers', space_id: 46, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 348, y: 1040}, adjacent: [47, , , , ]}, - {name_unique: 'Eötvös Loránd University', space_id: 47, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 512, y: 1034}, adjacent: [46, 45, , , ]}, - {name_unique: 'Szeged', space_id: 48, socio: 3, stability: 4, battleground: 1, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 632, y: 1073}, adjacent: [45, 49, 50, , ]}, - {name_unique: 'Pécs', space_id: 49, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 486, y: 1105}, adjacent: [48, , , , ]}, - {name_unique: 'Timişoara', space_id: 50, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 597, y: 1204}, adjacent: [48, 51, 60, , ]}, - {name_unique: 'Cluj-Napoca', space_id: 51, socio: 1, stability: 4, battleground: 1, demInfl: 0, comInfl: 2, country: 'Romania', region: 'Balkans', box: {x: 756, y: 1125}, adjacent: [50, 54, 58, 61, ]}, - {name_unique: 'Târgu Mureş', space_id: 52, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 915, y: 1136}, adjacent: [53, 56, , , ]}, - {name_unique: 'Iaşi', space_id: 53, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1072, y: 1097}, adjacent: [52, 57, 62, , ]}, - {name_unique: 'Babeş-Bolyai University', space_id: 54, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 746, y: 1203}, adjacent: [51, 55, , , ]}, - {name_unique: 'Romanian Writers', space_id: 55, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 739, y: 1278}, adjacent: [54, , , , ]}, - {name_unique: 'Hargita/Covasna', space_id: 56, socio: 8, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 928, y: 1227}, adjacent: [52, , , , ]}, - {name_unique: 'Braşov', space_id: 57, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1049, y: 1225}, adjacent: [53, 59, 61, , ]}, - {name_unique: 'Orthodox Church Romania', space_id: 58, socio: 7, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 855, y: 1338}, adjacent: [51, 60, , , ]}, - {name_unique: 'Ploieşti', space_id: 59, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1061, y: 1316}, adjacent: [57, 61, 62, , ]}, - {name_unique: 'Craiova', space_id: 60, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 763, y: 1411}, adjacent: [50, 58, 61, , ]}, - {name_unique: 'Bucureşti', space_id: 61, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Romania', region: 'Balkans', box: {x: 929, y: 1445}, adjacent: [51, 57, 59, 60, 63]}, - {name_unique: 'Galaţi', space_id: 62, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1104, y: 1399}, adjacent: [53, 59, 63, , ]}, - {name_unique: 'Constanţa', space_id: 63, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1130, y: 1517}, adjacent: [61, 62, 72, , ]}, - {name_unique: 'Pleven', space_id: 64, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 764, y: 1534}, adjacent: [68, , , , ]}, - {name_unique: 'Orthodox Church Bulgaria', space_id: 65, socio: 7, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 882, y: 1540}, adjacent: [66, 68, , , ]}, - {name_unique: 'Ruse', space_id: 66, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 998, y: 1540}, adjacent: [65, 69, 70, 71, 72]}, - {name_unique: 'Sofia University', space_id: 67, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 645, y: 1650}, adjacent: [68, 73, , , ]}, - {name_unique: 'Sofia', space_id: 68, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Bulgaria', region: 'Balkans', box: {x: 768, y: 1653}, adjacent: [64, 65, 67, 69, 74]}, - {name_unique: 'Stara Zagora', space_id: 69, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Bulgaria', region: 'Balkans', box: {x: 886, y: 1694}, adjacent: [66, 68, 71, , ]}, - {name_unique: 'Razgrad', space_id: 70, socio: 8, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 954, y: 1620}, adjacent: [66, , , , ]}, - {name_unique: 'Burgas', space_id: 71, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 1004, y: 1695}, adjacent: [66, 69, 72, , ]}, - {name_unique: 'Varna', space_id: 72, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 1086, y: 1613}, adjacent: [63, 66, 71, , ]}, - {name_unique: 'Bulgarian Writers', space_id: 73, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 652, y: 1726}, adjacent: [67, , , , ]}, - {name_unique: 'Plovdiv', space_id: 74, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 771, y: 1739}, adjacent: [68, 75, , , ]}, - {name_unique: 'Sliven', space_id: 75, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 894, y: 1768}, adjacent: [74, , , , ]} -] - -const cards = [ - null, - {number: 1, period: 1, side: 'C', name: 'Legacy of Martial Law*', ops: 2, remove: 1, playable: true, red: false}, - {number: 2, period: 1, side: 'D', name: 'Solidarity Legalized*', ops: 4, remove: 1, playable: true, red: true}, - {number: 3, period: 1, side: 'D', name: 'Walesa*', ops: 3, remove: 1, playable: false, red: false}, - {number: 4, period: 1, side: 'D', name: 'Michnik*', ops: 1, remove: 1, playable: true, red: false}, - {number: 5, period: 1, side: 'D', name: 'General Strike*', ops: 3, remove: 0, playable: true, red: false}, - {number: 6, period: 1, side: 'C', name: 'Brought in for Questioning', ops: 3, remove: 0, playable: true, red: false}, - {number: 7, period: 1, side: 'C', name: 'State Run Media*', ops: 2, remove: 1, playable: true, red: false}, - {number: 8, period: 1, side: 'N', name: 'Prudence', ops: 4, remove: 0, playable: true, red: false}, - {number: 9, period: 1, side: 'C', name: 'The Wall*', ops: 1, remove: 1, playable: true, red: false}, - {number: 10, period: 1, side: 'C', name: 'Cult of Personality*', ops: 3, remove: 1, playable: true, red: false}, - {number: 11, period: 1, side: 'C', name: 'Dissident Arrested', ops: 2, remove: 0, playable: true, red: false}, - {number: 12, period: 1, side: 'C', name: 'Apparatchiks*', ops: 2, remove: 1, playable: true, red: false}, - {number: 13, period: 1, side: 'C', name: 'Stasi*', ops: 1, remove: 1, playable: true, red: false}, - {number: 14, period: 1, side: 'N', name: 'Gorbachev Charms the West', ops: 4, remove: 0, playable: true, red: false}, - {number: 15, period: 1, side: 'C', name: 'Honecker*', ops: 3, remove: 1, playable: true, red: false}, - {number: 16, period: 1, side: 'C', name: 'Nomenklatura*', ops: 2, remove: 1, playable: true, red: false}, - {number: 17, period: 1, side: 'D', name: 'Roundtable Talks', ops: 3, remove: 0, playable: true, red: false}, - {number: 18, period: 1, side: 'C', name: 'Poszgay Defends the Revolution*', ops: 2, remove: 1, playable: true, red: false}, - {number: 19, period: 1, side: 'D', name: 'Papal Visit*', ops: 2, remove: 1, playable: true, red: false}, - {number: 20, period: 1, side: 'C', name: 'Deutsche Marks*', ops: 4, remove: 1, playable: true, red: false}, - {number: 21, period: 1, side: 'N', name: 'Common European Home', ops: 2, remove: 0, playable: true, red: false}, - {number: 22, period: 1, side: 'N', name: 'Power Struggle - Poland', ops: 0, remove: 0, playable: true, red: false}, - {number: 23, period: 1, side: 'N', name: 'Power Struggle - Hungary', ops: 0, remove: 0, playable: true, red: false}, - {number: 24, period: 1, side: 'D', name: 'St. Nicholas Church*', ops: 1, remove: 1, playable: true, red: true}, - {number: 25, period: 1, side: 'C', name: 'Perestroika*', ops: 3, remove: 1, playable: true, red: false}, - {number: 26, period: 1, side: 'D', name: 'Helsinki Final Act*', ops: 1, remove: 1, playable: true, red: true}, - {number: 27, period: 1, side: 'D', name: 'Consumerism', ops: 3, remove: 0, playable: true, red: false}, - {number: 28, period: 1, side: 'C', name: 'Factory Party Cells', ops: 3, remove: 0, playable: true, red: false}, - {number: 29, period: 1, side: 'D', name: 'Jan Palach Week*', ops: 1, remove: 1, playable: true, red: false}, - {number: 30, period: 1, side: 'C', name: 'Tear Gas*', ops: 1, remove: 1, playable: true, red: false}, - {number: 31, period: 1, side: 'D', name: 'Intelligentsia', ops: 2, remove: 0, playable: true, red: false}, - {number: 32, period: 1, side: 'C', name: 'Peasant Parties*', ops: 2, remove: 1, playable: true, red: false}, - {number: 33, period: 1, side: 'D', name: 'Sajudis*', ops: 2, remove: 1, playable: true, red: true}, - {number: 34, period: 1, side: 'D', name: 'Fidesz*', ops: 2, remove: 1, playable: true, red: false}, - {number: 35, period: 1, side: 'C', name: 'Heal Our Bleeding Wound*', ops: 3, remove: 1, playable: true, red: false}, - {number: 36, period: 1, side: 'D', name: 'Dash for the West*', ops: 3, remove: 1, playable: true, red: false}, - {number: 37, period: 1, side: 'C', name: 'Nagy Reburied*', ops: 3, remove: 1, playable: true, red: false}, - {number: 38, period: 1, side: 'C', name: 'The July Concept*', ops: 3, remove: 1, playable: true, red: false}, - {number: 39, period: 1, side: 'D', name: 'Eco-Glasnost*', ops: 2, remove: 1, playable: true, red: false}, - {number: 40, period: 1, side: 'D', name: 'Hungarian Democratic Forum*', ops: 3, remove: 1, playable: true, red: false}, - {number: 41, period: 2, side: 'C', name: 'Ceausescu*', ops: 3, remove: 1, playable: true, red: false}, - {number: 42, period: 2, side: 'N', name: 'Power Struggle - East Germany', ops: 0, remove: 0, playable: true, red: false}, - {number: 43, period: 2, side: 'N', name: 'Power Struggle - Bulgaria', ops: 0, remove: 0, playable: true, red: false}, - {number: 44, period: 2, side: 'N', name: 'Inflationary Currency*', ops: 3, remove: 1, playable: true, red: false}, - {number: 45, period: 2, side: 'D', name: 'Soviet Troop Withdrawals*', ops: 4, remove: 1, playable: true, red: false}, - {number: 46, period: 2, side: 'D', name: 'Goodbye Lenin!*', ops: 3, remove: 1, playable: true, red: false}, - {number: 47, period: 2, side: 'C', name: 'Bulgarian Turks Expelled*', ops: 3, remove: 1, playable: true, red: false}, - {number: 48, period: 2, side: 'D', name: '\"We are the People!\"', ops: 3, remove: 1, playable: true, red: false}, - {number: 49, period: 2, side: 'D', name: 'Foreign Currency Debt Burden', ops: 1, remove: 1, playable: true, red: false}, - {number: 50, period: 2, side: 'D', name: 'The Sinatra Doctrine*', ops: 3, remove: 1, playable: true, red: false}, - {number: 51, period: 2, side: 'C', name: '40th Anniversary Celebration*', ops: 2, remove: 1, playable: true, red: false}, - {number: 52, period: 2, side: 'C', name: 'Normalization*', ops: 3, remove: 1, playable: true, red: false}, - {number: 53, period: 2, side: 'C', name: 'Li Peng*', ops: 2, remove: 1, playable: true, red: false}, - {number: 54, period: 2, side: 'D', name: 'The Crowd Turns Against Ceausescu*', ops: 3, remove: 1, playable: true, red: true}, - {number: 55, period: 2, side: 'N', name: 'Power Struggle - Czechoslovakia', ops: 0, remove: 0, playable: true, red: false}, - {number: 56, period: 2, side: 'D', name: 'Foreign Television*', ops: 2, remove: 1, playable: true, red: false}, - {number: 57, period: 2, side: 'C', name: 'Central Committee Reshuffle*', ops: 2, remove: 1, playable: true, red: false}, - {number: 58, period: 2, side: 'D', name: 'Austria-Hungary Border Reopened*', ops: 2, remove: 1, playable: true, red: false}, - {number: 59, period: 2, side: 'C', name: 'GrenzTruppen*', ops: 2, remove: 1, playable: true, red: false}, - {number: 60, period: 2, side: 'D', name: 'Toxic Waste*', ops: 2, remove: 1, playable: true, red: false}, - {number: 61, period: 2, side: 'D', name: 'The Monday Demonstrations*', ops: 4, remove: 1, playable: false, red: false}, - {number: 62, period: 2, side: 'D', name: 'Yakovlev Counsels Gorbachev*', ops: 2, remove: 1, playable: true, red: false}, - {number: 63, period: 2, side: 'D', name: 'Genscher*', ops: 2, remove: 1, playable: true, red: false}, - {number: 64, period: 2, side: 'D', name: 'Legacy of 1968*', ops: 4, remove: 1, playable: true, red: false}, - {number: 65, period: 2, side: 'D', name: 'Presidential Visit*', ops: 3, remove: 1, playable: true, red: false}, - {number: 66, period: 2, side: 'D', name: 'New Forum*', ops: 1, remove: 1, playable: true, red: false}, - {number: 67, period: 2, side: 'N', name: 'Reformer Rehabilitated*', ops: 2, remove: 1, playable: false, red: false}, - {number: 68, period: 2, side: 'D', name: 'Klaus and Komarek*', ops: 3, remove: 1, playable: true, red: false}, - {number: 69, period: 2, side: 'C', name: 'Systematization*', ops: 3, remove: 1, playable: true, red: false}, - {number: 70, period: 2, side: 'C', name: 'Securitate*', ops: 2, remove: 1, playable: true, red: false}, - {number: 71, period: 2, side: 'D', name: 'Kiss of Death*', ops: 3, remove: 1, playable: true, red: false}, - {number: 72, period: 2, side: 'D', name: 'Peasant Parties Revolt*', ops: 3, remove: 1, playable: true, red: false}, - {number: 73, period: 2, side: 'D', name: 'Laszlo Tokes*', ops: 2, remove: 1, playable: true, red: true}, - {number: 74, period: 2, side: 'D', name: 'FRG Embassies*', ops: 3, remove: 1, playable: true, red: false}, - {number: 75, period: 2, side: 'D', name: 'Exit Visas*', ops: 3, remove: 1, playable: true, red: false}, - {number: 76, period: 2, side: 'C', name: 'Warsaw Pact Summit*', ops: 2, remove: 1, playable: true, red: false}, - {number: 77, period: 2, side: 'D', name: 'Samizdat*', ops: 1, remove: 1, playable: true, red: false}, - {number: 78, period: 2, side: 'N', name: 'Workers Revolt', ops: 2, remove: 0, playable: true, red: false}, - {number: 79, period: 2, side: 'C', name: 'The Third Way*', ops: 2, remove: 1, playable: true, red: false}, - {number: 80, period: 2, side: 'C', name: 'Nepotism*', ops: 3, remove: 1, playable: true, red: false}, - {number: 81, period: 2, side: 'D', name: 'The Baltic Way*', ops: 3, remove: 1, playable: false, red: true}, - {number: 82, period: 3, side: 'C', name: 'Spitzel*', ops: 1, remove: 1, playable: true, red: false}, - {number: 83, period: 3, side: 'C', name: 'Modrow*', ops: 2, remove: 1, playable: true, red: false}, - {number: 84, period: 3, side: 'D', name: 'Breakaway Baltic Republics*', ops: 4, remove: 1, playable: false, red: true}, - {number: 85, period: 3, side: 'N', name: 'Tank Column/Tank Man*', ops: 2, remove: 1, playable: true, red: false}, - {number: 86, period: 3, side: 'D', name: '\"The Wall Must Go!\"*', ops: 3, remove: 1, playable: true, red: false}, - {number: 87, period: 3, side: 'D', name: 'Kohl Proposes Reunification*', ops: 3, remove: 1, playable: true, red: false}, - {number: 88, period: 3, side: 'C', name: 'Adamec*', ops: 2, remove: 1, playable: true, red: false}, - {number: 89, period: 3, side: 'D', name: 'Domino Theory*', ops: 3, remove: 1, playable: true, red: false}, - {number: 90, period: 3, side: 'D', name: 'Civic Forum*', ops: 4, remove: 1, playable: true, red: false}, - {number: 91, period: 3, side: 'D', name: 'My First Banana*', ops: 3, remove: 1, playable: true, red: false}, - {number: 92, period: 3, side: 'C', name: 'Betrayal*', ops: 3, remove: 1, playable: true, red: false}, - {number: 93, period: 3, side: 'D', name: 'Shock Therapy*', ops: 3, remove: 1, playable: true, red: false}, - {number: 94, period: 3, side: 'D', name: 'Union of Democratic Forces*', ops: 4, remove: 1, playable: true, red: false}, - {number: 95, period: 3, side: 'N', name: 'Power Struggle - Romania', ops: 0, remove: 0, playable: true, red: false}, - {number: 96, period: 3, side: 'C', name: 'The Chinese Solution*', ops: 1, remove: 1, playable: false, red: false}, - {number: 97, period: 3, side: 'D', name: 'The Tyrant is Gone*', ops: 2, remove: 1, playable: false, red: false}, - {number: 98, period: 3, side: 'C', name: 'Politburo Intrigue*', ops: 2, remove: 1, playable: true, red: false}, - {number: 99, period: 3, side: 'C', name: 'Ligachev*', ops: 3, remove: 1, playable: true, red: false}, - {number: 100, period: 3, side: 'N', name: 'Stand Fast*', ops: 3, remove: 1, playable: true, red: false}, - {number: 101, period: 3, side: 'C', name: 'Elena*', ops: 1, remove: 1, playable: true, red: false}, - {number: 102, period: 3, side: 'C', name: 'National Salvation Front*', ops: 3, remove: 1, playable: true, red: false}, - {number: 103, period: 3, side: 'D', name: 'Government Resigns*', ops: 1, remove: 1, playable: true, red: false}, - {number: 104, period: 3, side: 'C', name: 'New Year\'s Eve Party*', ops: 2, remove: 1, playable: true, red: false}, - {number: 105, period: 3, side: 'D', name: 'Public Against Violence*', ops: 3, remove: 1, playable: true, red: false}, - {number: 106, period: 3, side: 'C', name: 'Social Democratic Platform Adopted*', ops: 3, remove: 1, playable: true, red: false}, - {number: 107, period: 3, side: 'C', name: 'Massacre in Timisoara*', ops: 3, remove: 1, playable: false, red: false}, - {number: 108, period: 3, side: 'D', name: 'Army Backs Revolution*', ops: 3, remove: 1, playable: true, red: false}, - {number: 109, period: 3, side: 'C', name: 'Kremlin Coup!*', ops: 3, remove: 1, playable: false, red: false}, - {number: 110, period: 3, side: 'D', name: 'Malta Summit*', ops: 3, remove: 1, playable: true, red: false}, -] - -const power_cards = [ -null, -{number: 1, name: 'Strike', value: 6, socio: 0, url: 'ps2'}, -{number: 2, name: 'Strike', value: 6, socio: 0, url: 'ps2'}, -{number: 3, name: 'Strike', value: 5, socio: 0, url: 'ps3'}, -{number: 4, name: 'Strike', value: 5, socio: 0, url: 'ps3'}, -{number: 5, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, -{number: 6, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, -{number: 7, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, -{number: 8, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, -{number: 9, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, -{number: 10, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, -{number: 11, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, -{number: 12, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, -{number: 13, name: 'March', value: 6, socio: 0, url: 'ps6'}, -{number: 14, name: 'March', value: 6, socio: 0, url: 'ps6'}, -{number: 15, name: 'March', value: 5, socio: 0, url: 'ps7'}, -{number: 16, name: 'March', value: 5, socio: 0, url: 'ps7'}, -{number: 17, name: 'March', value: 4, socio: 0, url: 'ps8'}, -{number: 18, name: 'March', value: 4, socio: 0, url: 'ps8'}, -{number: 19, name: 'March', value: 4, socio: 0, url: 'ps8'}, -{number: 20, name: 'March', value: 4, socio: 0, url: 'ps8'}, -{number: 21, name: 'March', value: 3, socio: 0, url: 'ps9'}, -{number: 22, name: 'March', value: 3, socio: 0, url: 'ps9'}, -{number: 23, name: 'March', value: 3, socio: 0, url: 'ps9'}, -{number: 24, name: 'March', value: 3, socio: 0, url: 'ps9'}, -{number: 25, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 26, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 27, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 28, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 29, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 30, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 31, name: 'Petition', value: 6, socio: 0, url: 'ps10'}, -{number: 32, name: 'Petition', value: 6, socio: 0, url: 'ps10'}, -{number: 33, name: 'Petition', value: 6, socio: 0, url: 'ps10'}, -{number: 34, name: 'Petition', value: 5, socio: 0, url: 'ps11'}, -{number: 35, name: 'Petition', value: 5, socio: 0, url: 'ps11'}, -{number: 36, name: 'Petition', value: 5, socio: 0, url: 'ps11'}, -{number: 37, name: 'Elite Leader', value: 3, socio: 1, url: 'ps16'}, -{number: 38, name: 'Elite Leader', value: 3, socio: 1, url: 'ps17'}, -{number: 39, name: 'Elite Leader', value: 3, socio: 1, url: 'ps18'}, -{number: 40, name: 'Elite Leader', value: 3, socio: 1, url: 'ps19'}, -{number: 41, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps12'}, -{number: 42, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps13'}, -{number: 43, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps14'}, -{number: 44, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps15'}, -{number: 45, name: 'Worker Leader', value: 3, socio: 4, url: 'ps20'}, -{number: 46, name: 'Worker Leader', value: 3, socio: 4, url: 'ps21'}, -{number: 47, name: 'Church Leader', value: 3, socio: 7, url: 'ps23'}, -{number: 48, name: 'Student Leader', value: 3, socio: 6, url: 'ps22'}, -{number: 49, name: 'Scare Tactics', value: '', socio: 0, url: 'ps26'}, -{number: 50, name: 'Support Surges', value: '', socio: 0, url: 'ps25'}, -{number: 51, name: 'Support Falters', value: '', socio: 0, url: 'ps24'}, -{number: 52, name: 'Tactic Fails', value: '', socio: 0, url: 'ps27'}, -{number: 53, name: 'Rally in the Square', value: 3, socio: 0, url: 'ps1'}, -{number: 54, name: 'Petition', value: 3, socio: 0, url: 'ps10'}, -] - - -if (typeof module !== 'undefined') module.exports = { spaces, cards, power_cards } +const spaces = [ + null, + {name_unique: 'Schwerin', space_id: 1, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 111, y: 61}, adjacent: [2, 3, , , ]}, + {name_unique: 'Rostock', space_id: 2, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 228, y: 41}, adjacent: [1, 3, , , ]}, + {name_unique: 'Berlin', space_id: 3, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'East_Germany', region: 'Eastern Europe', box: {x: 251, y: 113}, adjacent: [1, 2, 5, 9, ]}, + {name_unique: 'German Writers', space_id: 4, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 58, y: 185}, adjacent: [5, , , , ]}, + {name_unique: 'Walter Ulbricht Academy', space_id: 5, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 175, y: 187}, adjacent: [3, 4, , , ]}, + {name_unique: 'Lutherian Church', space_id: 6, socio: 7, stability: 5, battleground: 1, demInfl: 1, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 300, y: 212}, adjacent: [9, , , , ]}, + {name_unique: 'Magdeburg', space_id: 7, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 58, y: 275}, adjacent: [8, 10, 11, , ]}, + {name_unique: 'Halle', space_id: 8, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 175, y: 278}, adjacent: [7, 9, 11, , ]}, + {name_unique: 'Leipzig', space_id: 9, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 297, y: 297}, adjacent: [3, 6, 8, 11, 12]}, + {name_unique: 'Erfurt', space_id: 10, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 23, y: 356}, adjacent: [7, , , , ]}, + {name_unique: 'Karl-Marx-Stadt', space_id: 11, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 138, y: 385}, adjacent: [7, 8, 9, 12, ]}, + {name_unique: 'Dresden', space_id: 12, socio: 1, stability: 4, battleground: 1, demInfl: 0, comInfl: 2, country: 'East_Germany', region: 'Eastern Europe', box: {x: 262, y: 375}, adjacent: [9, 11, 19, 27, ]}, + {name_unique: 'Szczecin', space_id: 13, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 434, y: 204}, adjacent: [14, 16, , , ]}, + {name_unique: 'Gdańsk', space_id: 14, socio: 4, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 699, y: 215}, adjacent: [13, 15, 16, 17, 18]}, + {name_unique: 'Bydgoszcz', space_id: 15, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 679, y: 304}, adjacent: [14, 17, , , ]}, + {name_unique: 'Poznań', space_id: 16, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 521, y: 355}, adjacent: [13, 14, 19, 20, ]}, + {name_unique: 'Warszawa', space_id: 17, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 806, y: 383}, adjacent: [14, 15, 18, 21, 24]}, + {name_unique: 'Białystok', space_id: 18, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 940, y: 342}, adjacent: [14, 17, 24, , ]}, + {name_unique: 'Wrocław', space_id: 19, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 462, y: 443}, adjacent: [12, 16, 20, 22, ]}, + {name_unique: 'Catholic Church, Poland', space_id: 20, socio: 7, stability: 5, battleground: 0, demInfl: 5, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 625, y: 437}, adjacent: [16, 19, 21, 22, 23]}, + {name_unique: 'Łódź', space_id: 21, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 749, y: 486}, adjacent: [17, 20, 23, 24, ]}, + {name_unique: 'Katowice', space_id: 22, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 570, y: 569}, adjacent: [19, 20, 23, 33, ]}, + {name_unique: 'Kraków', space_id: 23, socio: 4, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 711, y: 598}, adjacent: [20, 21, 22, 25, ]}, + {name_unique: 'Lublin', space_id: 24, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 879, y: 603}, adjacent: [17, 18, 21, , ]}, + {name_unique: 'Jagiellian University', space_id: 25, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 679, y: 681}, adjacent: [23, 26, , , ]}, + {name_unique: 'Polish Writers', space_id: 26, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 832, y: 694}, adjacent: [25, , , , ]}, + {name_unique: 'Plzeň', space_id: 27, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 2, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 159, y: 483}, adjacent: [12, 28, 29, , ]}, + {name_unique: 'České Budĕjovice', space_id: 28, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 196, y: 601}, adjacent: [27, 29, , , ]}, + {name_unique: 'Praha', space_id: 29, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 317, y: 614}, adjacent: [27, 28, 30, 32, ]}, + {name_unique: 'Charles University', space_id: 30, socio: 6, stability: 1, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 380, y: 532}, adjacent: [29, 31, , , ]}, + {name_unique: 'Czech Writers', space_id: 31, socio: 5, stability: 2, battleground: 1, demInfl: 2, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 444, y: 607}, adjacent: [30, , , , ]}, + {name_unique: 'Brno', space_id: 32, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 1, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 403, y: 711}, adjacent: [29, 33, 34, , ]}, + {name_unique: 'Ostrava', space_id: 33, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 523, y: 681}, adjacent: [22, 32, 34, 35, ]}, + {name_unique: 'Bratislava', space_id: 34, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 417, y: 797}, adjacent: [32, 33, 35, , ]}, + {name_unique: 'Catholic Church, Czechoslovakia', space_id: 35, socio: 7, stability: 5, battleground: 0, demInfl: 1, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 538, y: 794}, adjacent: [33, 34, 36, , ]}, + {name_unique: 'Prešov', space_id: 36, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 658, y: 794}, adjacent: [35, 37, , , ]}, + {name_unique: 'Košice', space_id: 37, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 777, y: 815}, adjacent: [36, 42, , , ]}, + {name_unique: 'Catholic Church, Hungary', space_id: 38, socio: 7, stability: 5, battleground: 0, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 314, y: 886}, adjacent: [39, 43, , , ]}, + {name_unique: 'Győr', space_id: 39, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 434, y: 887}, adjacent: [38, 40, 43, 44, ]}, + {name_unique: 'Tatabánya', space_id: 40, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 549, y: 886}, adjacent: [39, 41, 45, , ]}, + {name_unique: 'Miskolc', space_id: 41, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 664, y: 901}, adjacent: [40, 42, 45, , ]}, + {name_unique: 'Debrecen', space_id: 42, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 781, y: 938}, adjacent: [37, 41, , , ]}, + {name_unique: 'Szombathely', space_id: 43, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Hungary', region: 'Eastern Europe', box: {x: 316, y: 963}, adjacent: [38, 39, 44, , ]}, + {name_unique: 'Székesfehérvár', space_id: 44, socio: 4, stability: 3, battleground: 0, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 442, y: 962}, adjacent: [39, 43, 45, , ]}, + {name_unique: 'Budapest', space_id: 45, socio: 2, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 630, y: 983}, adjacent: [40, 41, 44, 47, 48]}, + {name_unique: 'Hungarian Writers', space_id: 46, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 348, y: 1040}, adjacent: [47, , , , ]}, + {name_unique: 'Eötvös Loránd University', space_id: 47, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 512, y: 1034}, adjacent: [46, 45, , , ]}, + {name_unique: 'Szeged', space_id: 48, socio: 3, stability: 4, battleground: 1, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 632, y: 1073}, adjacent: [45, 49, 50, , ]}, + {name_unique: 'Pécs', space_id: 49, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 486, y: 1105}, adjacent: [48, , , , ]}, + {name_unique: 'Timişoara', space_id: 50, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 597, y: 1204}, adjacent: [48, 51, 60, , ]}, + {name_unique: 'Cluj-Napoca', space_id: 51, socio: 1, stability: 4, battleground: 1, demInfl: 0, comInfl: 2, country: 'Romania', region: 'Balkans', box: {x: 756, y: 1125}, adjacent: [50, 54, 58, 61, ]}, + {name_unique: 'Târgu Mureş', space_id: 52, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 915, y: 1136}, adjacent: [53, 56, , , ]}, + {name_unique: 'Iaşi', space_id: 53, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1072, y: 1097}, adjacent: [52, 57, 62, , ]}, + {name_unique: 'Babeş-Bolyai University', space_id: 54, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 746, y: 1203}, adjacent: [51, 55, , , ]}, + {name_unique: 'Romanian Writers', space_id: 55, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 739, y: 1278}, adjacent: [54, , , , ]}, + {name_unique: 'Hargita/Covasna', space_id: 56, socio: 8, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 928, y: 1227}, adjacent: [52, , , , ]}, + {name_unique: 'Braşov', space_id: 57, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1049, y: 1225}, adjacent: [53, 59, 61, , ]}, + {name_unique: 'Orthodox Church Romania', space_id: 58, socio: 7, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 855, y: 1338}, adjacent: [51, 60, , , ]}, + {name_unique: 'Ploieşti', space_id: 59, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1061, y: 1316}, adjacent: [57, 61, 62, , ]}, + {name_unique: 'Craiova', space_id: 60, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 763, y: 1411}, adjacent: [50, 58, 61, , ]}, + {name_unique: 'Bucureşti', space_id: 61, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Romania', region: 'Balkans', box: {x: 929, y: 1445}, adjacent: [51, 57, 59, 60, 63]}, + {name_unique: 'Galaţi', space_id: 62, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1104, y: 1399}, adjacent: [53, 59, 63, , ]}, + {name_unique: 'Constanţa', space_id: 63, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1130, y: 1517}, adjacent: [61, 62, 72, , ]}, + {name_unique: 'Pleven', space_id: 64, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 764, y: 1534}, adjacent: [68, , , , ]}, + {name_unique: 'Orthodox Church Bulgaria', space_id: 65, socio: 7, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 882, y: 1540}, adjacent: [66, 68, , , ]}, + {name_unique: 'Ruse', space_id: 66, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 998, y: 1540}, adjacent: [65, 69, 70, 71, 72]}, + {name_unique: 'Sofia University', space_id: 67, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 645, y: 1650}, adjacent: [68, 73, , , ]}, + {name_unique: 'Sofia', space_id: 68, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Bulgaria', region: 'Balkans', box: {x: 768, y: 1653}, adjacent: [64, 65, 67, 69, 74]}, + {name_unique: 'Stara Zagora', space_id: 69, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Bulgaria', region: 'Balkans', box: {x: 886, y: 1694}, adjacent: [66, 68, 71, , ]}, + {name_unique: 'Razgrad', space_id: 70, socio: 8, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 954, y: 1620}, adjacent: [66, , , , ]}, + {name_unique: 'Burgas', space_id: 71, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 1004, y: 1695}, adjacent: [66, 69, 72, , ]}, + {name_unique: 'Varna', space_id: 72, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 1086, y: 1613}, adjacent: [63, 66, 71, , ]}, + {name_unique: 'Bulgarian Writers', space_id: 73, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 652, y: 1726}, adjacent: [67, , , , ]}, + {name_unique: 'Plovdiv', space_id: 74, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 771, y: 1739}, adjacent: [68, 75, , , ]}, + {name_unique: 'Sliven', space_id: 75, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 894, y: 1768}, adjacent: [74, , , , ]} +] + +const cards = [ + null, + {number: 1, period: 1, side: 'C', name: 'Legacy of Martial Law*', ops: 2, remove: 1, playable: true, red: false}, + {number: 2, period: 1, side: 'D', name: 'Solidarity Legalized*', ops: 4, remove: 1, playable: true, red: true}, + {number: 3, period: 1, side: 'D', name: 'Walesa*', ops: 3, remove: 1, playable: false, red: false}, + {number: 4, period: 1, side: 'D', name: 'Michnik*', ops: 1, remove: 1, playable: true, red: false}, + {number: 5, period: 1, side: 'D', name: 'General Strike*', ops: 3, remove: 0, playable: true, red: false}, + {number: 6, period: 1, side: 'C', name: 'Brought in for Questioning', ops: 3, remove: 0, playable: true, red: false}, + {number: 7, period: 1, side: 'C', name: 'State Run Media*', ops: 2, remove: 1, playable: true, red: false}, + {number: 8, period: 1, side: 'N', name: 'Prudence', ops: 4, remove: 0, playable: true, red: false}, + {number: 9, period: 1, side: 'C', name: 'The Wall*', ops: 1, remove: 1, playable: true, red: false}, + {number: 10, period: 1, side: 'C', name: 'Cult of Personality*', ops: 3, remove: 1, playable: true, red: false}, + {number: 11, period: 1, side: 'C', name: 'Dissident Arrested', ops: 2, remove: 0, playable: true, red: false}, + {number: 12, period: 1, side: 'C', name: 'Apparatchiks*', ops: 2, remove: 1, playable: true, red: false}, + {number: 13, period: 1, side: 'C', name: 'Stasi*', ops: 1, remove: 1, playable: true, red: false}, + {number: 14, period: 1, side: 'N', name: 'Gorbachev Charms the West', ops: 4, remove: 0, playable: true, red: false}, + {number: 15, period: 1, side: 'C', name: 'Honecker*', ops: 3, remove: 1, playable: true, red: false}, + {number: 16, period: 1, side: 'C', name: 'Nomenklatura*', ops: 2, remove: 1, playable: true, red: false}, + {number: 17, period: 1, side: 'D', name: 'Roundtable Talks', ops: 3, remove: 0, playable: true, red: false}, + {number: 18, period: 1, side: 'C', name: 'Poszgay Defends the Revolution*', ops: 2, remove: 1, playable: true, red: false}, + {number: 19, period: 1, side: 'D', name: 'Papal Visit*', ops: 2, remove: 1, playable: true, red: false}, + {number: 20, period: 1, side: 'C', name: 'Deutsche Marks*', ops: 4, remove: 1, playable: true, red: false}, + {number: 21, period: 1, side: 'N', name: 'Common European Home', ops: 2, remove: 0, playable: true, red: false}, + {number: 22, period: 1, side: 'N', name: 'Power Struggle - Poland', ops: 0, remove: 0, playable: true, red: false}, + {number: 23, period: 1, side: 'N', name: 'Power Struggle - Hungary', ops: 0, remove: 0, playable: true, red: false}, + {number: 24, period: 1, side: 'D', name: 'St. Nicholas Church*', ops: 1, remove: 1, playable: true, red: true}, + {number: 25, period: 1, side: 'C', name: 'Perestroika*', ops: 3, remove: 1, playable: true, red: false}, + {number: 26, period: 1, side: 'D', name: 'Helsinki Final Act*', ops: 1, remove: 1, playable: true, red: true}, + {number: 27, period: 1, side: 'D', name: 'Consumerism', ops: 3, remove: 0, playable: true, red: false}, + {number: 28, period: 1, side: 'C', name: 'Factory Party Cells', ops: 3, remove: 0, playable: true, red: false}, + {number: 29, period: 1, side: 'D', name: 'Jan Palach Week*', ops: 1, remove: 1, playable: true, red: false}, + {number: 30, period: 1, side: 'C', name: 'Tear Gas*', ops: 1, remove: 1, playable: true, red: false}, + {number: 31, period: 1, side: 'D', name: 'Intelligentsia', ops: 2, remove: 0, playable: true, red: false}, + {number: 32, period: 1, side: 'C', name: 'Peasant Parties*', ops: 2, remove: 1, playable: true, red: false}, + {number: 33, period: 1, side: 'D', name: 'Sajudis*', ops: 2, remove: 1, playable: true, red: true}, + {number: 34, period: 1, side: 'D', name: 'Fidesz*', ops: 2, remove: 1, playable: true, red: false}, + {number: 35, period: 1, side: 'C', name: 'Heal Our Bleeding Wound*', ops: 3, remove: 1, playable: true, red: false}, + {number: 36, period: 1, side: 'D', name: 'Dash for the West*', ops: 3, remove: 1, playable: true, red: false}, + {number: 37, period: 1, side: 'C', name: 'Nagy Reburied*', ops: 3, remove: 1, playable: true, red: false}, + {number: 38, period: 1, side: 'C', name: 'The July Concept*', ops: 3, remove: 1, playable: true, red: false}, + {number: 39, period: 1, side: 'D', name: 'Eco-Glasnost*', ops: 2, remove: 1, playable: true, red: false}, + {number: 40, period: 1, side: 'D', name: 'Hungarian Democratic Forum*', ops: 3, remove: 1, playable: true, red: false}, + {number: 41, period: 2, side: 'C', name: 'Ceausescu*', ops: 3, remove: 1, playable: true, red: false}, + {number: 42, period: 2, side: 'N', name: 'Power Struggle - East Germany', ops: 0, remove: 0, playable: true, red: false}, + {number: 43, period: 2, side: 'N', name: 'Power Struggle - Bulgaria', ops: 0, remove: 0, playable: true, red: false}, + {number: 44, period: 2, side: 'N', name: 'Inflationary Currency*', ops: 3, remove: 1, playable: true, red: false}, + {number: 45, period: 2, side: 'D', name: 'Soviet Troop Withdrawals*', ops: 4, remove: 1, playable: true, red: false}, + {number: 46, period: 2, side: 'D', name: 'Goodbye Lenin!*', ops: 3, remove: 1, playable: true, red: false}, + {number: 47, period: 2, side: 'C', name: 'Bulgarian Turks Expelled*', ops: 3, remove: 1, playable: true, red: false}, + {number: 48, period: 2, side: 'D', name: '\"We are the People!\"', ops: 3, remove: 1, playable: true, red: false}, + {number: 49, period: 2, side: 'D', name: 'Foreign Currency Debt Burden', ops: 1, remove: 1, playable: true, red: false}, + {number: 50, period: 2, side: 'D', name: 'The Sinatra Doctrine*', ops: 3, remove: 1, playable: true, red: false}, + {number: 51, period: 2, side: 'C', name: '40th Anniversary Celebration*', ops: 2, remove: 1, playable: true, red: false}, + {number: 52, period: 2, side: 'C', name: 'Normalization*', ops: 3, remove: 1, playable: true, red: false}, + {number: 53, period: 2, side: 'C', name: 'Li Peng*', ops: 2, remove: 1, playable: true, red: false}, + {number: 54, period: 2, side: 'D', name: 'The Crowd Turns Against Ceausescu*', ops: 3, remove: 1, playable: true, red: true}, + {number: 55, period: 2, side: 'N', name: 'Power Struggle - Czechoslovakia', ops: 0, remove: 0, playable: true, red: false}, + {number: 56, period: 2, side: 'D', name: 'Foreign Television*', ops: 2, remove: 1, playable: true, red: false}, + {number: 57, period: 2, side: 'C', name: 'Central Committee Reshuffle*', ops: 2, remove: 1, playable: true, red: false}, + {number: 58, period: 2, side: 'D', name: 'Austria-Hungary Border Reopened*', ops: 2, remove: 1, playable: true, red: false}, + {number: 59, period: 2, side: 'C', name: 'GrenzTruppen*', ops: 2, remove: 1, playable: true, red: false}, + {number: 60, period: 2, side: 'D', name: 'Toxic Waste*', ops: 2, remove: 1, playable: true, red: false}, + {number: 61, period: 2, side: 'D', name: 'The Monday Demonstrations*', ops: 4, remove: 1, playable: false, red: false}, + {number: 62, period: 2, side: 'D', name: 'Yakovlev Counsels Gorbachev*', ops: 2, remove: 1, playable: true, red: false}, + {number: 63, period: 2, side: 'D', name: 'Genscher*', ops: 2, remove: 1, playable: true, red: false}, + {number: 64, period: 2, side: 'D', name: 'Legacy of 1968*', ops: 4, remove: 1, playable: true, red: false}, + {number: 65, period: 2, side: 'D', name: 'Presidential Visit*', ops: 3, remove: 1, playable: true, red: false}, + {number: 66, period: 2, side: 'D', name: 'New Forum*', ops: 1, remove: 1, playable: true, red: false}, + {number: 67, period: 2, side: 'N', name: 'Reformer Rehabilitated*', ops: 2, remove: 1, playable: false, red: false}, + {number: 68, period: 2, side: 'D', name: 'Klaus and Komarek*', ops: 3, remove: 1, playable: true, red: false}, + {number: 69, period: 2, side: 'C', name: 'Systematization*', ops: 3, remove: 1, playable: true, red: false}, + {number: 70, period: 2, side: 'C', name: 'Securitate*', ops: 2, remove: 1, playable: true, red: false}, + {number: 71, period: 2, side: 'D', name: 'Kiss of Death*', ops: 3, remove: 1, playable: true, red: false}, + {number: 72, period: 2, side: 'D', name: 'Peasant Parties Revolt*', ops: 3, remove: 1, playable: true, red: false}, + {number: 73, period: 2, side: 'D', name: 'Laszlo Tokes*', ops: 2, remove: 1, playable: true, red: true}, + {number: 74, period: 2, side: 'D', name: 'FRG Embassies*', ops: 3, remove: 1, playable: true, red: false}, + {number: 75, period: 2, side: 'D', name: 'Exit Visas*', ops: 3, remove: 1, playable: true, red: false}, + {number: 76, period: 2, side: 'C', name: 'Warsaw Pact Summit*', ops: 2, remove: 1, playable: true, red: false}, + {number: 77, period: 2, side: 'D', name: 'Samizdat*', ops: 1, remove: 1, playable: true, red: false}, + {number: 78, period: 2, side: 'N', name: 'Workers Revolt', ops: 2, remove: 0, playable: true, red: false}, + {number: 79, period: 2, side: 'C', name: 'The Third Way*', ops: 2, remove: 1, playable: true, red: false}, + {number: 80, period: 2, side: 'C', name: 'Nepotism*', ops: 3, remove: 1, playable: true, red: false}, + {number: 81, period: 2, side: 'D', name: 'The Baltic Way*', ops: 3, remove: 1, playable: false, red: true}, + {number: 82, period: 3, side: 'C', name: 'Spitzel*', ops: 1, remove: 1, playable: true, red: false}, + {number: 83, period: 3, side: 'C', name: 'Modrow*', ops: 2, remove: 1, playable: true, red: false}, + {number: 84, period: 3, side: 'D', name: 'Breakaway Baltic Republics*', ops: 4, remove: 1, playable: false, red: true}, + {number: 85, period: 3, side: 'N', name: 'Tank Column/Tank Man*', ops: 2, remove: 1, playable: true, red: false}, + {number: 86, period: 3, side: 'D', name: '\"The Wall Must Go!\"*', ops: 3, remove: 1, playable: true, red: false}, + {number: 87, period: 3, side: 'D', name: 'Kohl Proposes Reunification*', ops: 3, remove: 1, playable: true, red: false}, + {number: 88, period: 3, side: 'C', name: 'Adamec*', ops: 2, remove: 1, playable: true, red: false}, + {number: 89, period: 3, side: 'D', name: 'Domino Theory*', ops: 3, remove: 1, playable: true, red: false}, + {number: 90, period: 3, side: 'D', name: 'Civic Forum*', ops: 4, remove: 1, playable: true, red: false}, + {number: 91, period: 3, side: 'D', name: 'My First Banana*', ops: 3, remove: 1, playable: true, red: false}, + {number: 92, period: 3, side: 'C', name: 'Betrayal*', ops: 3, remove: 1, playable: true, red: false}, + {number: 93, period: 3, side: 'D', name: 'Shock Therapy*', ops: 3, remove: 1, playable: true, red: false}, + {number: 94, period: 3, side: 'D', name: 'Union of Democratic Forces*', ops: 4, remove: 1, playable: true, red: false}, + {number: 95, period: 3, side: 'N', name: 'Power Struggle - Romania', ops: 0, remove: 0, playable: true, red: false}, + {number: 96, period: 3, side: 'C', name: 'The Chinese Solution*', ops: 1, remove: 1, playable: false, red: false}, + {number: 97, period: 3, side: 'D', name: 'The Tyrant is Gone*', ops: 2, remove: 1, playable: false, red: false}, + {number: 98, period: 3, side: 'C', name: 'Politburo Intrigue*', ops: 2, remove: 1, playable: true, red: false}, + {number: 99, period: 3, side: 'C', name: 'Ligachev*', ops: 3, remove: 1, playable: true, red: false}, + {number: 100, period: 3, side: 'N', name: 'Stand Fast*', ops: 3, remove: 1, playable: true, red: false}, + {number: 101, period: 3, side: 'C', name: 'Elena*', ops: 1, remove: 1, playable: true, red: false}, + {number: 102, period: 3, side: 'C', name: 'National Salvation Front*', ops: 3, remove: 1, playable: true, red: false}, + {number: 103, period: 3, side: 'D', name: 'Government Resigns*', ops: 1, remove: 1, playable: true, red: false}, + {number: 104, period: 3, side: 'C', name: 'New Year\'s Eve Party*', ops: 2, remove: 1, playable: true, red: false}, + {number: 105, period: 3, side: 'D', name: 'Public Against Violence*', ops: 3, remove: 1, playable: true, red: false}, + {number: 106, period: 3, side: 'C', name: 'Social Democratic Platform Adopted*', ops: 3, remove: 1, playable: true, red: false}, + {number: 107, period: 3, side: 'C', name: 'Massacre in Timisoara*', ops: 3, remove: 1, playable: false, red: false}, + {number: 108, period: 3, side: 'D', name: 'Army Backs Revolution*', ops: 3, remove: 1, playable: true, red: false}, + {number: 109, period: 3, side: 'C', name: 'Kremlin Coup!*', ops: 3, remove: 1, playable: false, red: false}, + {number: 110, period: 3, side: 'D', name: 'Malta Summit*', ops: 3, remove: 1, playable: true, red: false}, +] + +const power_cards = [ +null, +{number: 1, name: 'Strike', value: 6, socio: 0, url: 'ps2'}, +{number: 2, name: 'Strike', value: 6, socio: 0, url: 'ps2'}, +{number: 3, name: 'Strike', value: 5, socio: 0, url: 'ps3'}, +{number: 4, name: 'Strike', value: 5, socio: 0, url: 'ps3'}, +{number: 5, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, +{number: 6, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, +{number: 7, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, +{number: 8, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, +{number: 9, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, +{number: 10, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, +{number: 11, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, +{number: 12, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, +{number: 13, name: 'March', value: 6, socio: 0, url: 'ps6'}, +{number: 14, name: 'March', value: 6, socio: 0, url: 'ps6'}, +{number: 15, name: 'March', value: 5, socio: 0, url: 'ps7'}, +{number: 16, name: 'March', value: 5, socio: 0, url: 'ps7'}, +{number: 17, name: 'March', value: 4, socio: 0, url: 'ps8'}, +{number: 18, name: 'March', value: 4, socio: 0, url: 'ps8'}, +{number: 19, name: 'March', value: 4, socio: 0, url: 'ps8'}, +{number: 20, name: 'March', value: 4, socio: 0, url: 'ps8'}, +{number: 21, name: 'March', value: 3, socio: 0, url: 'ps9'}, +{number: 22, name: 'March', value: 3, socio: 0, url: 'ps9'}, +{number: 23, name: 'March', value: 3, socio: 0, url: 'ps9'}, +{number: 24, name: 'March', value: 3, socio: 0, url: 'ps9'}, +{number: 25, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, +{number: 26, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, +{number: 27, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, +{number: 28, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, +{number: 29, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, +{number: 30, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, +{number: 31, name: 'Petition', value: 6, socio: 0, url: 'ps10'}, +{number: 32, name: 'Petition', value: 6, socio: 0, url: 'ps10'}, +{number: 33, name: 'Petition', value: 6, socio: 0, url: 'ps10'}, +{number: 34, name: 'Petition', value: 5, socio: 0, url: 'ps11'}, +{number: 35, name: 'Petition', value: 5, socio: 0, url: 'ps11'}, +{number: 36, name: 'Petition', value: 5, socio: 0, url: 'ps11'}, +{number: 37, name: 'Elite Leader', value: 3, socio: 1, url: 'ps16'}, +{number: 38, name: 'Elite Leader', value: 3, socio: 1, url: 'ps17'}, +{number: 39, name: 'Elite Leader', value: 3, socio: 1, url: 'ps18'}, +{number: 40, name: 'Elite Leader', value: 3, socio: 1, url: 'ps19'}, +{number: 41, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps12'}, +{number: 42, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps13'}, +{number: 43, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps14'}, +{number: 44, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps15'}, +{number: 45, name: 'Worker Leader', value: 3, socio: 4, url: 'ps20'}, +{number: 46, name: 'Worker Leader', value: 3, socio: 4, url: 'ps21'}, +{number: 47, name: 'Church Leader', value: 3, socio: 7, url: 'ps23'}, +{number: 48, name: 'Student Leader', value: 3, socio: 6, url: 'ps22'}, +{number: 49, name: 'Scare Tactics', value: '', socio: 0, url: 'ps26'}, +{number: 50, name: 'Support Surges', value: '', socio: 0, url: 'ps25'}, +{number: 51, name: 'Support Falters', value: '', socio: 0, url: 'ps24'}, +{number: 52, name: 'Tactic Fails', value: '', socio: 0, url: 'ps27'}, +{number: 53, name: 'Rally in the Square', value: 3, socio: 0, url: 'ps1'}, +{number: 54, name: 'Petition', value: 3, socio: 0, url: 'ps10'}, +] + + +if (typeof module !== 'undefined') module.exports = { spaces, cards, power_cards } diff --git a/play.css b/play.css index f9ed02e..2a65885 100644 --- a/play.css +++ b/play.css @@ -1,741 +1,741 @@ -main { background-color: dimgray; } -header { background-color: silver; } -header.your_turn { background-color: orange; } -#role_Democrat { background-color: hsl(200, 80%, 80%); } -#role_Communist { background-color: hsl(0, 80%, 80%); } -#turn_info { background-color: white; } -/*.aside_events { - font-family: "Source Sans"; - font-style: normal; - font-size: 16px; - line-height: 1.5; -}*/ -#deck_data { - font-family: "Source Sans"; - font-style: normal; - font-size: 16px; - line-height: 1.5; -} -#deck_stat {padding-left: 5px; padding-bottom: 5px;} - - -#log { background-color: whitesmoke; } -#log .h1 { font-weight: bold; padding-top:2px; padding-bottom:2px; text-align: center; } -#log .h2 { padding-top:2px; padding-bottom:2px; text-align: center; } -#log .h3 { text-align: center; } -#log .h4 { text-decoration: underline; } -#log .h5 { text-decoration: underline; } - -#log .h2 { background-color: hsl(0,0%,80%);} -#log .h1 { background-color: hsl(0,0%,80%); } -#log .h2.dem { background-color: hsl(200, 80%, 80%); } -#log .h2.com { background-color: hsl(0, 80%, 80%); } -#log .h3.democrat { background-color: hsl(210,30%,90%); } -#log .h3.h2.communist { background-color: hsl(35,40%,90%); } - -#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 .card_name:hover { text-decoration: underline; } -#log .space_tip:hover { cursor: pointer; text-decoration: underline; } - -#log .die { - display: inline-block; - vertical-align: -3px; - width: 12px; - height: 12px; - background-size: 600% 100%; - background-repeat: no-repeat; - background-image: url(images/die_black_pips.svg); - background-color: #fff; - border: 1px solid #444; -} - -#log .d0 { background-position: -100% 0 } -#log .d1 { background-position: 0% 0; } -#log .d2 { background-position: 20% 0; } -#log .d3 { background-position: 40% 0; } -#log .d4 { background-position: 60% 0; } -#log .d5 { background-position: 80% 0; } -#log .d6 { background-position: 100% 0; } - -.selected { - cursor: pointer; -} - -#log { - font-variant-numeric: tabular-nums; -} - -/* TOOLBAR */ - -#toolbar { - justify-content: space-evenly; -} - -#prompt { - display: flex; - margin-left: auto; -} - -#button { - display: flex; - margin-left: auto; -} -/* MAP */ - -#map { - margin: 0 auto ; - position: relative; - background-repeat: no-repeat; - background-size: cover; - width: 1275px; /* was 1275*/ - height: 2000px; - /*border: solid black;*/ - overflow: clip; - box-shadow: 0px 1px 10px #0008; - /*z-index: 3;*/ -} - -#map { background-image: url(1989_map.jpg) } - -/* Containers to appear on hover*/ - #overlay { - position: relative; - top: 0; - left: 0; - width: 100%; - height: 100%; - /* background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent overlay */ - /* display: none;*/ - justify-content: center; - align-items: center; - text-align: left; - } - -/* SPACES */ - -.space-area { - position: absolute; - box-sizing: border-box; - border: transparent red 2px; -} - -/* PANELS AND HANDS */ - -.panel { - background-color: #555; - display: inline-block; -} - -.panel_header { - background-color: #444; - color: hsl(40, 60%, 90%); - font-weight: bold; - text-align: center; - padding: 3px 1em; -} - -.hide { - display: none; -} - -#hand_panel, #events_panel, #played_card_panel, #table_panel, #samizdat_panel, #opp_hand_panel, #power_panel, #ceausescu_panel { - min-width: 200px; - width: auto; - /*display: inline-block;*/ - margin: 10px; - border-radius: 5px; -} - -#events { - display: flex; -} - -#discard_panel, #removed_panel { - min-width: 200px; - width: auto; - display: inline-block; - margin: 10px; - border-radius: 5px; -} - -#discard_panel.hide, #removed_panel.hide { - display: none; -} - -#hand_panel { - margin: 10px; - border-radius: 5px; -} - -/* INFLUENCE MARKERS */ - -.demInfl { - position: absolute; - box-sizing: border-box; - bottom: 1px; - left: 6px; - height: 35px; - width: 35px; - border-radius: 5px; -} - -.demInfl.controlled { - background-image: url(images/US_blank.gif); - background-size: contain; -} - - -.demInfl.uncontrolled { - background-image: url(images/USd_blank.gif); - background-size: contain; -} -/* -.demInfl:hover { - cursor: pointer; -}*/ - -.comInfl { - position: absolute; - box-sizing: border-box; - bottom: 1px; - right: 6px; - height: 35px; - width: 35px; -} -/* -.comInfl:hover { - cursor: pointer; -}*/ - -.comInfl.controlled { - background-image: url(images/SV_blank.gif); - background-size: contain; -} - - -.comInfl.uncontrolled { - background-image: url(images/SVd_blank.gif); - background-size: contain; -} - -.demInflValue { - position: absolute; - box-sizing: border-box; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: 10px; - left: 16px; -} - -.demInflValue_10 { - position: absolute; - box-sizing: border-box; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: 10px; - left: 10px; -} - -.comInflValue { - position: absolute; - box-sizing: border-box; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: 12px; - left: 74px; -} - -.comInflValue_10 { - position: absolute; - box-sizing: border-box; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: 12px; - left: 68px; -} - -.comInflValue.controlled, .held { - color: whitesmoke; - text-shadow: - 1px 1px 0 #c2272d, /* Right bottom */ - -1px 1px 0 #c2272d, /* Left bottom */ - 1px -1px 0 #c2272d, /* Right top */ - -1px -1px 0 #c2272d; /* Left top */ -} - -.comInflValue.uncontrolled { - color: #c2272d; - text-shadow: - 1px 1px 0 #ffffff, /* Right bottom */ - -1px 1px 0 #ffffff, /* Left bottom */ - 1px -1px 0 #ffffff, /* Right top */ - -1px -1px 0 #ffffff; /* Left top */ -} - -.comInflValue_10.controlled, .held { - color: whitesmoke; - text-shadow: - 1px 1px 0 #c2272d, /* Right bottom */ - -1px 1px 0 #c2272d, /* Left bottom */ - 1px -1px 0 #c2272d, /* Right top */ - -1px -1px 0 #c2272d; /* Left top */ -} - -.comInflValue_10.uncontrolled { - color: #c2272d; - text-shadow: - 1px 1px 0 #ffffff, /* Right bottom */ - -1px 1px 0 #ffffff, /* Left bottom */ - 1px -1px 0 #ffffff, /* Right top */ - -1px -1px 0 #ffffff; /* Left top */ -} - - -/* GAME MARKERS */ - -.t0 {left: 511px} -.t1 {left: 511px} -.t2 {left: 553px} -.t3 {left: 595px} -.t4 {left: 637px} -.t5 {left: 679px} -.t6 {left: 721px} -.t7 {left: 763px} -.t8 {left: 805px} -.t9 {left: 847px} -.t10 {left: 889px} - -#turn-tracker { - position:absolute; - top: 65px; - height: 35px; - width: 36px; - /*display: block;*/ -} - -.r0 {left: 554px} -.r1 {left: 554px} -.r2 {left: 596px} -.r3 {left: 638px} -.r4 {left: 680px} -.r5 {left: 722px} -.r6 {left: 764px} -.r7 {left: 806px} -.r8 {left: 848px} - -.dem-action-round-tracker { background-image: url(images/US_Action_Round.gif);} -.com-action-round-tracker { background-image: url(images/SV_Action_Round.gif);} - -#action-round-tracker { - position: absolute; - top: 114px; - height: 30px; - width: 35px; - background-size: cover; -} - - - -#stability-track { - position:absolute; - left: 1085px; - height: 35px; - width: 35px; -} - -.s0 {top: 853px} -.s1 {top: 896px} -.s2 {top: 939px} -.s3 {top: 982px} -.s4 {top: 1025px} - - -.tst0 {left: 0} -.tst1 {left: 38px} -.tst2 {left: 93px} -.tst3 {left: 148px} -.tst4 {left: 203px} -.tst5 {left: 258px} -.tst6 {left: 313px} -.tst7 {left: 368px} -.tst8 {left: 436px} - -#dem-TST { - position: absolute; - top: 1680px; - height: 35px; - width: 35px; -} - -#com-TST { - position: absolute; - top: 1782px; - height: 35px; - width: 35px; -} - -.vp0 {top: 1913px; -left: 660px} - -.vp-20, .vp-18, .vp-16, .vp-14, .vp-12, .vp-10, .vp-8, .vp-6, .vp-4, .vp-2, .vp1, .vp3, .vp5, .vp7, .vp9, .vp11, .vp13, .vp15, .vp17, .vp19 {top: 1889px} -.vp-19, .vp-17, .vp-15, .vp-13, .vp-11, .vp-9, .vp-7, .vp-5, .vp-3, .vp-1, .vp2, .vp4, .vp6, .vp8, .vp10, .vp12, .vp14, .vp16, .vp18, .vp20 {top: 1938px} - -.vp-21 {top: 1912px; left: 117px} -.vp21 {top: 1912px; left: 1182px} - -.vp-20 {left: 165px} -.vp-19 {left: 189px} -.vp-18 {left: 214px} -.vp-17 {left: 238px} -.vp-16 {left: 263px} -.vp-15 {left: 287px} -.vp-14 {left: 312px} -.vp-13 {left: 336px} -.vp-12 {left: 361px} -.vp-11 {left: 385px} -.vp-10 {left: 410px} -.vp-9 {left: 434px} -.vp-8 {left: 459px} -.vp-7 {left: 483px} -.vp-6 {left: 508px} -.vp-5 {left: 532px} -.vp-4 {left: 557px} -.vp-3 {left: 581px} -.vp-2 {left: 606px} -.vp-1 {left: 630px} -.vp1 {left: 692px} -.vp2 {left: 717px} -.vp3 {left: 741px} -.vp4 {left: 766px} -.vp5 {left: 790px} -.vp6 {left: 815px} -.vp7 {left: 839px} -.vp8 {left: 864px} -.vp9 {left: 888px} -.vp10 {left: 913px} -.vp11 {left: 937px} -.vp12 {left: 962px} -.vp13 {left: 986px} -.vp14 {left: 1011px} -.vp15 {left: 1035px} -.vp16 {left: 1060px} -.vp17 {left: 1084px} -.vp18 {left: 1109px} -.vp19 {left: 1133px} -.vp20 {left: 1158px} - -#vp { - position: absolute; - height: 40px; - width: 40px; -} - -.marker { - position: absolute; - height: 30px; - width: 30px; -} - -.revolution {background-image: url(images/US_blank.gif); background-size: contain} -.held {background-image: url(images/SV_blank.gif); background-size: contain} - -.germany {top: 127px; left: 439px} -.poland { top: 232px; left: 934px} -.czech {top: 494px; left: 362px} -.hungary {top: 1041px; left: 813px} -.romania {top: 1063px; left: 1012px} -.bulgaria {top: 1578px; left: 720px} - -.times_held { - position: absolute; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: -18px; - left: 8px -} - -.outlined_text { - text-shadow: - 1px 1px 0 #ffffff, /* Right bottom */ - -1px 1px 0 #ffffff, /* Left bottom */ - 1px -1px 0 #ffffff, /* Right top */ - -1px -1px 0 #ffffff; /* Left top */ -} - -/* ============= EVENT MARKERS ========== */ - -.event-marker { - display: none; - position: absolute; - height: 30px; - width: 30px; - transition: transform 0.3s ease; -} - -.event-marker:hover { - cursor: pointer; - transform: scale(2); - z-index: 1; -} - -.event-marker.aside { - border: solid black 1.5px; - margin: 3px; - position: relative; -} - -#turn_info { - display: flex; - flex-direction: column; - align-items: flex-start; -} - -#turn_info > div { - display: flex; - margin-bottom: 8px; - gap: 4px; -} - -#turn_info > img { - display: block; - -} - -/*Solidarity legalised*/ -#event_2 { - top: 216px; - left: 612px; -} - -/*Systematisation*/ -#event_69 { - height: 65px; - width: 65px; -} - -/*The Tyrant is Gone*/ -#event_97 { - height: 40px; - width: 40px; -} - -/*The Wall*/ -#event_9 { - top: 143px; - left: 170px; -} - - -/* =========== CARDS ================= */ -/* -.playedCard { - display: flex; - margin: auto; - height: 300px; -}*/ - -.hand_card { - background-size: contain; - height: 250px; - margin: 10px; - border-radius: 5px; - transition: transform .3s ease 0.5s; -} -/* -.hand_card:hover { - cursor: pointer; -}*/ - -.zoom { - transform: scale(1.75) -} - -.power_card { - background-size: contain; - height: 250px; - margin: 10px; - border-radius: 5px; -} - -.discard_card, .event_card { - background-size: contain; - height: 150px; - margin: 5px; - border-radius: 5px; - transition: transform .3s ease; -} - -.discard_card:hover, .event_card:hover { - /*cursor: pointer;*/ - transform: scale(2); -} - -.selected.space-area { - background-color: #0002; - outline: solid white 2px; - /*box-shadow: 0 0 4px white; */ - border-radius: 10px 10px 0 0; -} - -.space-area.tip { - background-color: #ff08; - outline: solid white 2px; - box-shadow: 0 0 8px #ff08; - border-radius: 10px 10px 0 0; -} - -.selected.hand_card { - outline: solid silver 3px; - /*box-shadow: 0 0 4px white; */ - border-radius: 18px; -} - - -.selected.power_card { - outline: solid silver 3px; - /*box-shadow: 0 0 4px white; */ - border-radius: 18px; -} - -/* =============== OTHER ===============*/ -#space-characteristics {display: none} - -/* =============== CARD IMAGES =========*/ - -#tooltip { - position: fixed; - pointer-events: none; - z-index: 600; - right: 240px; - top: 60px; -} - -.card { - background-size: cover; - background-repeat: no-repeat; - width: 250px; - height: 350px; - border-radius: 16px; - box-shadow: 1px 2px 4px #0004; -} - -.card_1 {background-image: url(cards/e1.gif)} -.card_2 {background-image: url(cards/e2.gif)} -.card_3 {background-image: url(cards/e3.gif)} -.card_4 {background-image: url(cards/e4.gif)} -.card_5 {background-image: url(cards/e5.gif)} -.card_6 {background-image: url(cards/e6.gif)} -.card_7 {background-image: url(cards/e7.gif)} -.card_8 {background-image: url(cards/e8.gif)} -.card_9 {background-image: url(cards/e9.gif)} -.card_10 {background-image: url(cards/e10.gif)} -.card_11 {background-image: url(cards/e11.gif)} -.card_12 {background-image: url(cards/e12.gif)} -.card_13 {background-image: url(cards/e13.gif)} -.card_14 {background-image: url(cards/e14.gif)} -.card_15 {background-image: url(cards/e15.gif)} -.card_16 {background-image: url(cards/e16.gif)} -.card_17 {background-image: url(cards/e17.gif)} -.card_18 {background-image: url(cards/e18.gif)} -.card_19 {background-image: url(cards/e19.gif)} -.card_20 {background-image: url(cards/e20.gif)} -.card_21 {background-image: url(cards/e21.gif)} -.card_22 {background-image: url(cards/e22.gif)} -.card_23 {background-image: url(cards/e23.gif)} -.card_24 {background-image: url(cards/e24.gif)} -.card_25 {background-image: url(cards/e25.gif)} -.card_26 {background-image: url(cards/e26.gif)} -.card_27 {background-image: url(cards/e27.gif)} -.card_28 {background-image: url(cards/e28.gif)} -.card_29 {background-image: url(cards/e29.gif)} -.card_30 {background-image: url(cards/e30.gif)} -.card_31 {background-image: url(cards/e31.gif)} -.card_32 {background-image: url(cards/e32.gif)} -.card_33 {background-image: url(cards/e33.gif)} -.card_34 {background-image: url(cards/e34.gif)} -.card_35 {background-image: url(cards/e35.gif)} -.card_36 {background-image: url(cards/e36.gif)} -.card_37 {background-image: url(cards/e37.gif)} -.card_38 {background-image: url(cards/e38.gif)} -.card_39 {background-image: url(cards/e39.gif)} -.card_40 {background-image: url(cards/e40.gif)} -.card_41 {background-image: url(cards/e41.gif)} -.card_42 {background-image: url(cards/e42.gif)} -.card_43 {background-image: url(cards/e43.gif)} -.card_44 {background-image: url(cards/e44.gif)} -.card_45 {background-image: url(cards/e45.gif)} -.card_46 {background-image: url(cards/e46.gif)} -.card_47 {background-image: url(cards/e47.gif)} -.card_48 {background-image: url(cards/e48.gif)} -.card_49 {background-image: url(cards/e49.gif)} -.card_50 {background-image: url(cards/e50.gif)} -.card_51 {background-image: url(cards/e51.gif)} -.card_52 {background-image: url(cards/e52.gif)} -.card_53 {background-image: url(cards/e53.gif)} -.card_54 {background-image: url(cards/e54.gif)} -.card_55 {background-image: url(cards/e55.gif)} -.card_56 {background-image: url(cards/e56.gif)} -.card_57 {background-image: url(cards/e57.gif)} -.card_58 {background-image: url(cards/e58.gif)} -.card_59 {background-image: url(cards/e59.gif)} -.card_60 {background-image: url(cards/e60.gif)} -.card_61 {background-image: url(cards/e61.gif)} -.card_62 {background-image: url(cards/e62.gif)} -.card_63 {background-image: url(cards/e63.gif)} -.card_64 {background-image: url(cards/e64.gif)} -.card_65 {background-image: url(cards/e65.gif)} -.card_66 {background-image: url(cards/e66.gif)} -.card_67 {background-image: url(cards/e67.gif)} -.card_68 {background-image: url(cards/e68.gif)} -.card_69 {background-image: url(cards/e69.gif)} -.card_70 {background-image: url(cards/e70.gif)} -.card_71 {background-image: url(cards/e71.gif)} -.card_72 {background-image: url(cards/e72.gif)} -.card_73 {background-image: url(cards/e73.gif)} -.card_74 {background-image: url(cards/e74.gif)} -.card_75 {background-image: url(cards/e75.gif)} -.card_76 {background-image: url(cards/e76.gif)} -.card_77 {background-image: url(cards/e77.gif)} -.card_78 {background-image: url(cards/e78.gif)} -.card_79 {background-image: url(cards/e79.gif)} -.card_80 {background-image: url(cards/e80.gif)} -.card_81 {background-image: url(cards/e81.gif)} -.card_82 {background-image: url(cards/e82.gif)} -.card_83 {background-image: url(cards/e83.gif)} -.card_84 {background-image: url(cards/e84.gif)} -.card_85 {background-image: url(cards/e85.gif)} -.card_86 {background-image: url(cards/e86.gif)} -.card_87 {background-image: url(cards/e87.gif)} -.card_88 {background-image: url(cards/e88.gif)} -.card_89 {background-image: url(cards/e89.gif)} -.card_90 {background-image: url(cards/e90.gif)} -.card_91 {background-image: url(cards/e91.gif)} -.card_92 {background-image: url(cards/e92.gif)} -.card_93 {background-image: url(cards/e93.gif)} -.card_94 {background-image: url(cards/e94.gif)} -.card_95 {background-image: url(cards/e95.gif)} -.card_96 {background-image: url(cards/e96.gif)} -.card_97 {background-image: url(cards/e97.gif)} -.card_98 {background-image: url(cards/e98.gif)} -.card_99 {background-image: url(cards/e99.gif)} -.card_100 {background-image: url(cards/e100.gif)} -.card_101 {background-image: url(cards/e101.gif)} -.card_102 {background-image: url(cards/e102.gif)} -.card_103 {background-image: url(cards/e103.gif)} -.card_104 {background-image: url(cards/e104.gif)} -.card_105 {background-image: url(cards/e105.gif)} -.card_106 {background-image: url(cards/e106.gif)} -.card_107 {background-image: url(cards/e107.gif)} -.card_108 {background-image: url(cards/e108.gif)} -.card_109 {background-image: url(cards/e109.gif)} -.card_110 {background-image: url(cards/e110.gif)} +main { background-color: dimgray; } +header { background-color: silver; } +header.your_turn { background-color: orange; } +#role_Democrat { background-color: hsl(200, 80%, 80%); } +#role_Communist { background-color: hsl(0, 80%, 80%); } +#turn_info { background-color: white; } +/*.aside_events { + font-family: "Source Sans"; + font-style: normal; + font-size: 16px; + line-height: 1.5; +}*/ +#deck_data { + font-family: "Source Sans"; + font-style: normal; + font-size: 16px; + line-height: 1.5; +} +#deck_stat {padding-left: 5px; padding-bottom: 5px;} + + +#log { background-color: whitesmoke; } +#log .h1 { font-weight: bold; padding-top:2px; padding-bottom:2px; text-align: center; } +#log .h2 { padding-top:2px; padding-bottom:2px; text-align: center; } +#log .h3 { text-align: center; } +#log .h4 { text-decoration: underline; } +#log .h5 { text-decoration: underline; } + +#log .h2 { background-color: hsl(0,0%,80%);} +#log .h1 { background-color: hsl(0,0%,80%); } +#log .h2.dem { background-color: hsl(200, 80%, 80%); } +#log .h2.com { background-color: hsl(0, 80%, 80%); } +#log .h3.democrat { background-color: hsl(210,30%,90%); } +#log .h3.h2.communist { background-color: hsl(35,40%,90%); } + +#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 .card_name:hover { text-decoration: underline; } +#log .space_tip:hover { cursor: pointer; text-decoration: underline; } + +#log .die { + display: inline-block; + vertical-align: -3px; + width: 12px; + height: 12px; + background-size: 600% 100%; + background-repeat: no-repeat; + background-image: url(images/die_black_pips.svg); + background-color: #fff; + border: 1px solid #444; +} + +#log .d0 { background-position: -100% 0 } +#log .d1 { background-position: 0% 0; } +#log .d2 { background-position: 20% 0; } +#log .d3 { background-position: 40% 0; } +#log .d4 { background-position: 60% 0; } +#log .d5 { background-position: 80% 0; } +#log .d6 { background-position: 100% 0; } + +.selected { + cursor: pointer; +} + +#log { + font-variant-numeric: tabular-nums; +} + +/* TOOLBAR */ + +#toolbar { + justify-content: space-evenly; +} + +#prompt { + display: flex; + margin-left: auto; +} + +#button { + display: flex; + margin-left: auto; +} +/* MAP */ + +#map { + margin: 0 auto ; + position: relative; + background-repeat: no-repeat; + background-size: cover; + width: 1275px; /* was 1275*/ + height: 2000px; + /*border: solid black;*/ + overflow: clip; + box-shadow: 0px 1px 10px #0008; + /*z-index: 3;*/ +} + +#map { background-image: url(1989_map.jpg) } + +/* Containers to appear on hover*/ + #overlay { + position: relative; + top: 0; + left: 0; + width: 100%; + height: 100%; + /* background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent overlay */ + /* display: none;*/ + justify-content: center; + align-items: center; + text-align: left; + } + +/* SPACES */ + +.space-area { + position: absolute; + box-sizing: border-box; + border: transparent red 2px; +} + +/* PANELS AND HANDS */ + +.panel { + background-color: #555; + display: inline-block; +} + +.panel_header { + background-color: #444; + color: hsl(40, 60%, 90%); + font-weight: bold; + text-align: center; + padding: 3px 1em; +} + +.hide { + display: none; +} + +#hand_panel, #events_panel, #played_card_panel, #table_panel, #samizdat_panel, #opp_hand_panel, #power_panel, #ceausescu_panel { + min-width: 200px; + width: auto; + /*display: inline-block;*/ + margin: 10px; + border-radius: 5px; +} + +#events { + display: flex; +} + +#discard_panel, #removed_panel { + min-width: 200px; + width: auto; + display: inline-block; + margin: 10px; + border-radius: 5px; +} + +#discard_panel.hide, #removed_panel.hide { + display: none; +} + +#hand_panel { + margin: 10px; + border-radius: 5px; +} + +/* INFLUENCE MARKERS */ + +.demInfl { + position: absolute; + box-sizing: border-box; + bottom: 1px; + left: 6px; + height: 35px; + width: 35px; + border-radius: 5px; +} + +.demInfl.controlled { + background-image: url(images/US_blank.gif); + background-size: contain; +} + + +.demInfl.uncontrolled { + background-image: url(images/USd_blank.gif); + background-size: contain; +} +/* +.demInfl:hover { + cursor: pointer; +}*/ + +.comInfl { + position: absolute; + box-sizing: border-box; + bottom: 1px; + right: 6px; + height: 35px; + width: 35px; +} +/* +.comInfl:hover { + cursor: pointer; +}*/ + +.comInfl.controlled { + background-image: url(images/SV_blank.gif); + background-size: contain; +} + + +.comInfl.uncontrolled { + background-image: url(images/SVd_blank.gif); + background-size: contain; +} + +.demInflValue { + position: absolute; + box-sizing: border-box; + font-family: 'Open Sans'; + font-size: 20px; + font-weight: bold; + top: 10px; + left: 16px; +} + +.demInflValue_10 { + position: absolute; + box-sizing: border-box; + font-family: 'Open Sans'; + font-size: 20px; + font-weight: bold; + top: 10px; + left: 10px; +} + +.comInflValue { + position: absolute; + box-sizing: border-box; + font-family: 'Open Sans'; + font-size: 20px; + font-weight: bold; + top: 12px; + left: 74px; +} + +.comInflValue_10 { + position: absolute; + box-sizing: border-box; + font-family: 'Open Sans'; + font-size: 20px; + font-weight: bold; + top: 12px; + left: 68px; +} + +.comInflValue.controlled, .held { + color: whitesmoke; + text-shadow: + 1px 1px 0 #c2272d, /* Right bottom */ + -1px 1px 0 #c2272d, /* Left bottom */ + 1px -1px 0 #c2272d, /* Right top */ + -1px -1px 0 #c2272d; /* Left top */ +} + +.comInflValue.uncontrolled { + color: #c2272d; + text-shadow: + 1px 1px 0 #ffffff, /* Right bottom */ + -1px 1px 0 #ffffff, /* Left bottom */ + 1px -1px 0 #ffffff, /* Right top */ + -1px -1px 0 #ffffff; /* Left top */ +} + +.comInflValue_10.controlled, .held { + color: whitesmoke; + text-shadow: + 1px 1px 0 #c2272d, /* Right bottom */ + -1px 1px 0 #c2272d, /* Left bottom */ + 1px -1px 0 #c2272d, /* Right top */ + -1px -1px 0 #c2272d; /* Left top */ +} + +.comInflValue_10.uncontrolled { + color: #c2272d; + text-shadow: + 1px 1px 0 #ffffff, /* Right bottom */ + -1px 1px 0 #ffffff, /* Left bottom */ + 1px -1px 0 #ffffff, /* Right top */ + -1px -1px 0 #ffffff; /* Left top */ +} + + +/* GAME MARKERS */ + +.t0 {left: 511px} +.t1 {left: 511px} +.t2 {left: 553px} +.t3 {left: 595px} +.t4 {left: 637px} +.t5 {left: 679px} +.t6 {left: 721px} +.t7 {left: 763px} +.t8 {left: 805px} +.t9 {left: 847px} +.t10 {left: 889px} + +#turn-tracker { + position:absolute; + top: 65px; + height: 35px; + width: 36px; + /*display: block;*/ +} + +.r0 {left: 554px} +.r1 {left: 554px} +.r2 {left: 596px} +.r3 {left: 638px} +.r4 {left: 680px} +.r5 {left: 722px} +.r6 {left: 764px} +.r7 {left: 806px} +.r8 {left: 848px} + +.dem-action-round-tracker { background-image: url(images/US_Action_Round.gif);} +.com-action-round-tracker { background-image: url(images/SV_Action_Round.gif);} + +#action-round-tracker { + position: absolute; + top: 114px; + height: 30px; + width: 35px; + background-size: cover; +} + + + +#stability-track { + position:absolute; + left: 1085px; + height: 35px; + width: 35px; +} + +.s0 {top: 853px} +.s1 {top: 896px} +.s2 {top: 939px} +.s3 {top: 982px} +.s4 {top: 1025px} + + +.tst0 {left: 0} +.tst1 {left: 38px} +.tst2 {left: 93px} +.tst3 {left: 148px} +.tst4 {left: 203px} +.tst5 {left: 258px} +.tst6 {left: 313px} +.tst7 {left: 368px} +.tst8 {left: 436px} + +#dem-TST { + position: absolute; + top: 1680px; + height: 35px; + width: 35px; +} + +#com-TST { + position: absolute; + top: 1782px; + height: 35px; + width: 35px; +} + +.vp0 {top: 1913px; +left: 660px} + +.vp-20, .vp-18, .vp-16, .vp-14, .vp-12, .vp-10, .vp-8, .vp-6, .vp-4, .vp-2, .vp1, .vp3, .vp5, .vp7, .vp9, .vp11, .vp13, .vp15, .vp17, .vp19 {top: 1889px} +.vp-19, .vp-17, .vp-15, .vp-13, .vp-11, .vp-9, .vp-7, .vp-5, .vp-3, .vp-1, .vp2, .vp4, .vp6, .vp8, .vp10, .vp12, .vp14, .vp16, .vp18, .vp20 {top: 1938px} + +.vp-21 {top: 1912px; left: 117px} +.vp21 {top: 1912px; left: 1182px} + +.vp-20 {left: 165px} +.vp-19 {left: 189px} +.vp-18 {left: 214px} +.vp-17 {left: 238px} +.vp-16 {left: 263px} +.vp-15 {left: 287px} +.vp-14 {left: 312px} +.vp-13 {left: 336px} +.vp-12 {left: 361px} +.vp-11 {left: 385px} +.vp-10 {left: 410px} +.vp-9 {left: 434px} +.vp-8 {left: 459px} +.vp-7 {left: 483px} +.vp-6 {left: 508px} +.vp-5 {left: 532px} +.vp-4 {left: 557px} +.vp-3 {left: 581px} +.vp-2 {left: 606px} +.vp-1 {left: 630px} +.vp1 {left: 692px} +.vp2 {left: 717px} +.vp3 {left: 741px} +.vp4 {left: 766px} +.vp5 {left: 790px} +.vp6 {left: 815px} +.vp7 {left: 839px} +.vp8 {left: 864px} +.vp9 {left: 888px} +.vp10 {left: 913px} +.vp11 {left: 937px} +.vp12 {left: 962px} +.vp13 {left: 986px} +.vp14 {left: 1011px} +.vp15 {left: 1035px} +.vp16 {left: 1060px} +.vp17 {left: 1084px} +.vp18 {left: 1109px} +.vp19 {left: 1133px} +.vp20 {left: 1158px} + +#vp { + position: absolute; + height: 40px; + width: 40px; +} + +.marker { + position: absolute; + height: 30px; + width: 30px; +} + +.revolution {background-image: url(images/US_blank.gif); background-size: contain} +.held {background-image: url(images/SV_blank.gif); background-size: contain} + +.germany {top: 127px; left: 439px} +.poland { top: 232px; left: 934px} +.czech {top: 494px; left: 362px} +.hungary {top: 1041px; left: 813px} +.romania {top: 1063px; left: 1012px} +.bulgaria {top: 1578px; left: 720px} + +.times_held { + position: absolute; + font-family: 'Open Sans'; + font-size: 20px; + font-weight: bold; + top: -18px; + left: 8px +} + +.outlined_text { + text-shadow: + 1px 1px 0 #ffffff, /* Right bottom */ + -1px 1px 0 #ffffff, /* Left bottom */ + 1px -1px 0 #ffffff, /* Right top */ + -1px -1px 0 #ffffff; /* Left top */ +} + +/* ============= EVENT MARKERS ========== */ + +.event-marker { + display: none; + position: absolute; + height: 30px; + width: 30px; + transition: transform 0.3s ease; +} + +.event-marker:hover { + cursor: pointer; + transform: scale(2); + z-index: 1; +} + +.event-marker.aside { + border: solid black 1.5px; + margin: 3px; + position: relative; +} + +#turn_info { + display: flex; + flex-direction: column; + align-items: flex-start; +} + +#turn_info > div { + display: flex; + margin-bottom: 8px; + gap: 4px; +} + +#turn_info > img { + display: block; + +} + +/*Solidarity legalised*/ +#event_2 { + top: 216px; + left: 612px; +} + +/*Systematisation*/ +#event_69 { + height: 65px; + width: 65px; +} + +/*The Tyrant is Gone*/ +#event_97 { + height: 40px; + width: 40px; +} + +/*The Wall*/ +#event_9 { + top: 143px; + left: 170px; +} + + +/* =========== CARDS ================= */ +/* +.playedCard { + display: flex; + margin: auto; + height: 300px; +}*/ + +.hand_card { + background-size: contain; + height: 250px; + margin: 10px; + border-radius: 5px; + transition: transform .3s ease 0.5s; +} +/* +.hand_card:hover { + cursor: pointer; +}*/ + +.zoom { + transform: scale(1.75) +} + +.power_card { + background-size: contain; + height: 250px; + margin: 10px; + border-radius: 5px; +} + +.discard_card, .event_card { + background-size: contain; + height: 150px; + margin: 5px; + border-radius: 5px; + transition: transform .3s ease; +} + +.discard_card:hover, .event_card:hover { + /*cursor: pointer;*/ + transform: scale(2); +} + +.selected.space-area { + background-color: #0002; + outline: solid white 2px; + /*box-shadow: 0 0 4px white; */ + border-radius: 10px 10px 0 0; +} + +.space-area.tip { + background-color: #ff08; + outline: solid white 2px; + box-shadow: 0 0 8px #ff08; + border-radius: 10px 10px 0 0; +} + +.selected.hand_card { + outline: solid silver 3px; + /*box-shadow: 0 0 4px white; */ + border-radius: 18px; +} + + +.selected.power_card { + outline: solid silver 3px; + /*box-shadow: 0 0 4px white; */ + border-radius: 18px; +} + +/* =============== OTHER ===============*/ +#space-characteristics {display: none} + +/* =============== CARD IMAGES =========*/ + +#tooltip { + position: fixed; + pointer-events: none; + z-index: 600; + right: 240px; + top: 60px; +} + +.card { + background-size: cover; + background-repeat: no-repeat; + width: 250px; + height: 350px; + border-radius: 16px; + box-shadow: 1px 2px 4px #0004; +} + +.card_1 {background-image: url(cards/e1.gif)} +.card_2 {background-image: url(cards/e2.gif)} +.card_3 {background-image: url(cards/e3.gif)} +.card_4 {background-image: url(cards/e4.gif)} +.card_5 {background-image: url(cards/e5.gif)} +.card_6 {background-image: url(cards/e6.gif)} +.card_7 {background-image: url(cards/e7.gif)} +.card_8 {background-image: url(cards/e8.gif)} +.card_9 {background-image: url(cards/e9.gif)} +.card_10 {background-image: url(cards/e10.gif)} +.card_11 {background-image: url(cards/e11.gif)} +.card_12 {background-image: url(cards/e12.gif)} +.card_13 {background-image: url(cards/e13.gif)} +.card_14 {background-image: url(cards/e14.gif)} +.card_15 {background-image: url(cards/e15.gif)} +.card_16 {background-image: url(cards/e16.gif)} +.card_17 {background-image: url(cards/e17.gif)} +.card_18 {background-image: url(cards/e18.gif)} +.card_19 {background-image: url(cards/e19.gif)} +.card_20 {background-image: url(cards/e20.gif)} +.card_21 {background-image: url(cards/e21.gif)} +.card_22 {background-image: url(cards/e22.gif)} +.card_23 {background-image: url(cards/e23.gif)} +.card_24 {background-image: url(cards/e24.gif)} +.card_25 {background-image: url(cards/e25.gif)} +.card_26 {background-image: url(cards/e26.gif)} +.card_27 {background-image: url(cards/e27.gif)} +.card_28 {background-image: url(cards/e28.gif)} +.card_29 {background-image: url(cards/e29.gif)} +.card_30 {background-image: url(cards/e30.gif)} +.card_31 {background-image: url(cards/e31.gif)} +.card_32 {background-image: url(cards/e32.gif)} +.card_33 {background-image: url(cards/e33.gif)} +.card_34 {background-image: url(cards/e34.gif)} +.card_35 {background-image: url(cards/e35.gif)} +.card_36 {background-image: url(cards/e36.gif)} +.card_37 {background-image: url(cards/e37.gif)} +.card_38 {background-image: url(cards/e38.gif)} +.card_39 {background-image: url(cards/e39.gif)} +.card_40 {background-image: url(cards/e40.gif)} +.card_41 {background-image: url(cards/e41.gif)} +.card_42 {background-image: url(cards/e42.gif)} +.card_43 {background-image: url(cards/e43.gif)} +.card_44 {background-image: url(cards/e44.gif)} +.card_45 {background-image: url(cards/e45.gif)} +.card_46 {background-image: url(cards/e46.gif)} +.card_47 {background-image: url(cards/e47.gif)} +.card_48 {background-image: url(cards/e48.gif)} +.card_49 {background-image: url(cards/e49.gif)} +.card_50 {background-image: url(cards/e50.gif)} +.card_51 {background-image: url(cards/e51.gif)} +.card_52 {background-image: url(cards/e52.gif)} +.card_53 {background-image: url(cards/e53.gif)} +.card_54 {background-image: url(cards/e54.gif)} +.card_55 {background-image: url(cards/e55.gif)} +.card_56 {background-image: url(cards/e56.gif)} +.card_57 {background-image: url(cards/e57.gif)} +.card_58 {background-image: url(cards/e58.gif)} +.card_59 {background-image: url(cards/e59.gif)} +.card_60 {background-image: url(cards/e60.gif)} +.card_61 {background-image: url(cards/e61.gif)} +.card_62 {background-image: url(cards/e62.gif)} +.card_63 {background-image: url(cards/e63.gif)} +.card_64 {background-image: url(cards/e64.gif)} +.card_65 {background-image: url(cards/e65.gif)} +.card_66 {background-image: url(cards/e66.gif)} +.card_67 {background-image: url(cards/e67.gif)} +.card_68 {background-image: url(cards/e68.gif)} +.card_69 {background-image: url(cards/e69.gif)} +.card_70 {background-image: url(cards/e70.gif)} +.card_71 {background-image: url(cards/e71.gif)} +.card_72 {background-image: url(cards/e72.gif)} +.card_73 {background-image: url(cards/e73.gif)} +.card_74 {background-image: url(cards/e74.gif)} +.card_75 {background-image: url(cards/e75.gif)} +.card_76 {background-image: url(cards/e76.gif)} +.card_77 {background-image: url(cards/e77.gif)} +.card_78 {background-image: url(cards/e78.gif)} +.card_79 {background-image: url(cards/e79.gif)} +.card_80 {background-image: url(cards/e80.gif)} +.card_81 {background-image: url(cards/e81.gif)} +.card_82 {background-image: url(cards/e82.gif)} +.card_83 {background-image: url(cards/e83.gif)} +.card_84 {background-image: url(cards/e84.gif)} +.card_85 {background-image: url(cards/e85.gif)} +.card_86 {background-image: url(cards/e86.gif)} +.card_87 {background-image: url(cards/e87.gif)} +.card_88 {background-image: url(cards/e88.gif)} +.card_89 {background-image: url(cards/e89.gif)} +.card_90 {background-image: url(cards/e90.gif)} +.card_91 {background-image: url(cards/e91.gif)} +.card_92 {background-image: url(cards/e92.gif)} +.card_93 {background-image: url(cards/e93.gif)} +.card_94 {background-image: url(cards/e94.gif)} +.card_95 {background-image: url(cards/e95.gif)} +.card_96 {background-image: url(cards/e96.gif)} +.card_97 {background-image: url(cards/e97.gif)} +.card_98 {background-image: url(cards/e98.gif)} +.card_99 {background-image: url(cards/e99.gif)} +.card_100 {background-image: url(cards/e100.gif)} +.card_101 {background-image: url(cards/e101.gif)} +.card_102 {background-image: url(cards/e102.gif)} +.card_103 {background-image: url(cards/e103.gif)} +.card_104 {background-image: url(cards/e104.gif)} +.card_105 {background-image: url(cards/e105.gif)} +.card_106 {background-image: url(cards/e106.gif)} +.card_107 {background-image: url(cards/e107.gif)} +.card_108 {background-image: url(cards/e108.gif)} +.card_109 {background-image: url(cards/e109.gif)} +.card_110 {background-image: url(cards/e110.gif)} diff --git a/play.html b/play.html index 8e25b8c..e09e214 100644 --- a/play.html +++ b/play.html @@ -1,210 +1,210 @@ - - - - - - - -1989 - - - - - - - - - - - - - -
- -
-
-
- - -
  • Rules of Play -
  • Background Book -
  • Reference Sheets - -
  • -
    - - - -
    -
    - - - -
    - - -
    - -
    -
    -
    -

    - -
    - - - - -
    -

    1

    -
    -

    1

    -
    -

    1

    -
    -

    1

    -
    -

    1

    -
    -

    1

    - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    -
    Event Markers
    -
    - - - - - - - - - - - - - - - -
    -
    -
    - - -
    -
    -
    Cards on the Table
    -
    -
    -
    - - -
    -
    -
    Played Card
    -
    -
    - -
    - - -
    -
    -
    Discard
    -
    -
    -
    - - -
    -
    -
    Permanently Removed Events
    -
    -
    -
    - - -
    -
    -
    Ceausescu Cards
    -
    -
    -
    -
    Power Struggle Hand
    -
    -
    -
    - - - - -
    - -
    -
    Opponent Hand
    -
    -
    - -
    - - -
    -
    -
    Set aside card
    -
    -
    -
    - - - -
    - -
    -
    Hand
    -
    -
    - -
    - -
    - -
    - - - - + + + + + + + +1989 + + + + + + + + + + + + + +
    + +
    +
    +
    + + +
  • Rules of Play +
  • Background Book +
  • Reference Sheets + +
  • +
    + + + +
    +
    + + + +
    + + +
    + +
    +
    +
    +

    + +
    + + + + +
    +

    1

    +
    +

    1

    +
    +

    1

    +
    +

    1

    +
    +

    1

    +
    +

    1

    + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    +
    +
    Event Markers
    +
    + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    +
    Cards on the Table
    +
    +
    +
    + + +
    +
    +
    Played Card
    +
    +
    + +
    + + +
    +
    +
    Discard
    +
    +
    +
    + + +
    +
    +
    Permanently Removed Events
    +
    +
    +
    + + +
    +
    +
    Ceausescu Cards
    +
    +
    +
    +
    Power Struggle Hand
    +
    +
    +
    + + + + +
    + +
    +
    Opponent Hand
    +
    +
    + +
    + + +
    +
    +
    Set aside card
    +
    +
    +
    + + + +
    + +
    +
    Hand
    +
    +
    + +
    + +
    + +
    + + + + 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 `${cards[x].name}` -} - -function sub_power_card_name(match, p1) { - let x = p1 | 0 - return `${power_cards[x].name}` -} - -function sub_power_card_value(match, p1) { - let x = p1 | 0 - return `${x}` -} - -function sub_space_name(match, p1) { - let x = p1 | 0 - let id = spaces[x].space_id - let name = spaces[x].name_unique - return `${name}` -} - -function sub_die(match) { - return die[match] || match -} - -const die = { - D1: '', - D2: '', - D3: '', - D4: '', - D5: '', - D6: '' -} - -// =========================== 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 `${cards[x].name}` +} + +function sub_power_card_name(match, p1) { + let x = p1 | 0 + return `${power_cards[x].name}` +} + +function sub_power_card_value(match, p1) { + let x = p1 | 0 + return `${x}` +} + +function sub_space_name(match, p1) { + let x = p1 | 0 + let id = spaces[x].space_id + let name = spaces[x].name_unique + return `${name}` +} + +function sub_die(match) { + return die[match] || match +} + +const die = { + D1: '', + D2: '', + D3: '', + D4: '', + D5: '', + D6: '' +} + +// =========================== 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() diff --git a/rules.js b/rules.js index 91818c9..44bbef6 100644 --- a/rules.js +++ b/rules.js @@ -1,9892 +1,9892 @@ -//"use strict" - -const { spaces, cards, power_cards } = require("./data.js") - -var game, view, states = {} - -const DEM = "Democrat" -const COM = "Communist" - -const first_strategy_card = 1 -const last_strategy_card = 110 - -const dem_tst_req = [5, 5, 6, 6, 7, 8, 9, 10] -const com_tst_req = [6, 6, 7, 7, 8, 7, 6, 5] -const scoring_cards = [22, 23, 42, 43, 55, 95] -const leader_cards = [37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48] -const leaders = [1, 4, 5, 6, 7] -const support_loss_roll = [0, 0, 1, 1, 2, 2, 3, 4] -const vp_roll = [0, 0, 1, 1, 2, 2, 3, 4] -const countries = ['Poland', 'Hungary', 'East_Germany', 'Bulgaria', 'Czechoslovakia', 'Romania'] -const elite_spaces = [12, 15, 27, 43, 51, 69] -const all_power_cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 ] -const numberless_cards = [25, 26, 27, 28, 29, 30, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52] -const auto_resolve_events = [5, 8, 9, 13, 17, 25, 26, 30, 35, 50, 53, 54, 58, 59, 62, 63, 65, 70, 72, 74, 86, 99, 102, 108] -const switch_events = [6, 20, 71] - -exports.scenarios = [ "Standard" ] - -exports.roles = [ DEM, COM ] - -// --- SET UP --- - -exports.setup = function (seed, scenario, options) { - game = { - seed: seed, - log: [], - undo: [], - summary: [], - active: null, - state: "com_init", - return: '', - vm: null, - vm_event: 0, - vm_event_to_do: false, - vm_infl_to_do: false, - - played_card: 0, - table_cards: [], - available_ops: 0, - vm_available_ops: 0, - valid_spaces: [], - valid_cards: [], - - vp: 0, - turn: 0, - round: 0, - round_player: COM, - stability: 0, - dem_tst_position: 0, - com_tst_position: 0, - dem_tst_attempted: 0, - com_tst_attempted: 0, - dem_tst_attempted_this_turn: 0, - com_tst_attempted_this_turn: 0, - - demInfl: [], - comInfl: [], - - strategy_deck: [], - strategy_discard: [], - discard: false, - view_opp_hand: false, - strategy_removed: [], - persistent_events: [], - power_struggle_deck: [], - power_struggle_discard: [], - dem_hand_limit: 8, - com_hand_limit: 8, - democrat_hand: [], - communist_hand: [], - - pwr_struggle_in: [], - is_pwr_struggle: false, - dem_pwr_hand_limit: 0, - com_pwr_hand_limit: 0, - dem_pwr_hand: [], - com_pwr_hand: [], - raised_stakes_discard: 0, - raised_stakes: 0, - raised_stakes_round: 0, - phase: 0, - times_held: [0, 0, 0, 0, 0, 0], - revolutions: [false, false, false, false, false, false], - remove_opponent_infl: false, - tactics_fails: '', - } - - log_h1("1989 Dawn of Freedom") - - game.active = COM - start_game() - - return game -} - -function start_game() { - //starting influence - - // Draw cards - - //console.log('start game') - - game.strategy_deck = draw_deck(cards) - reset_power() - - //Set starting influence - spaces.forEach((space, index) => { - if (space !== null) { - game.demInfl[index] = space.demInfl - game.comInfl[index] = space.comInfl - } - }) - - //Set starting placement ops - game.starting_infl = { - com_starting_infl: 0, - dem_starting_infl: 0 - }, - - // Set variable event cards where event is playable at start of game - - game.playable_cards = [14, 15, 21, 70] - - //console.log('game.strategy_deck: ', game.strategy_deck[1]) - draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.dem_hand_limit, game.com_hand_limit) - //.log('game.strategy_deck: ', game.strategy_deck[1], 'democrat_hand:', game.democrat_hand) - - game.valid_spaces = valid_spaces_setup() - game.available_ops = 2 - game.phase = 0 - log_h1("Place starting Support Points") - log_side() -} - - -exports.view = function(state, player) { - game = state - - view = { - log: game.log, - active: game.active, - prompt: null, - actions: null, - - played_card: game.played_card, - table_cards: game.table_cards, - valid_spaces: game.valid_spaces, - valid_cards: game.valid_cards, - - demInfl: game.demInfl, - comInfl: game.comInfl, - turn: game.turn, - round: game.round, - round_player: game.round_player, - vp: game.vp, - stability: game.stability, - dem_tst: game.dem_tst_position, - com_tst: game.com_tst_position, - persistent_events: game.persistent_events, - systematization: game.systematization, - the_tyrant_is_gone: game.the_tyrant_is_gone, - - strategy_deck: game.strategy_deck.length, - strategy_removed: game.strategy_removed, - discard: game.discard, - show_opp_hand: game.view_opp_hand, - - democrat_hand: game.democrat_hand.length, - communist_hand: game.communist_hand.length, - democrat_power_hand: game.dem_pwr_hand.length, - communist_power_hand: game.com_pwr_hand.length, - ceausescu_cards: game.ceausescu_cards, - is_pwr_struggle: game.is_pwr_struggle, - times_held: game.times_held, - revolutions: game.revolutions, - - hand: [], - set_aside: [], - pwr_hand: [], - - - } - - if (game.is_pwr_struggle) { - view.strategy_discard = game.power_struggle_discard - } else { - view.strategy_discard = game.strategy_discard - } - - if (player === game.active && game.vm && game.vm.draw) - view.drawn = game.vm.draw - - if (player === game.active) { - if (game.selected_space > 0 ) { - view.valid_spaces = [game.selected_space] - } else { - view.valid_spaces = game.valid_spaces - } - } else { - view.valid_spaces = [] - } - - if (player === game.active) { - view.valid_cards = game.valid_cards - } else { - view.valid_cards = [] - } - - if (player === DEM) { - view.hand = game.democrat_hand - if (game.communist_hand_red) { - view.opp_hand = game.communist_hand_red - } - view.set_aside = game.democrat_set_aside /*Is this being used? */ - view.power_hand = [...game.dem_pwr_hand].sort((a, b) => a - b) - - } else if (player === COM) { - view.hand = game.communist_hand - view.opp_hand = [...game.dem_pwr_hand].sort((a, b) => a - b) - view.power_hand = [...game.com_pwr_hand].sort((a, b) => a - b) - } - - if (player === DEM) { - view.samizdat = game.samizdat_card - } - - if (game.state === "game_over") { - view.prompt = game.victory - } else if (player === "Observer" || (game.active !== player && game.active !== "Both")) { - if (states[game.state]) { - let inactive = states[game.state].inactive - if (typeof inactive === "function") - view.prompt = `Waiting for ${game.active} ${inactive()}` - else - view.prompt = `Waiting for ${game.active} to ${inactive}` - } else { - view.prompt = "A Unknown state: " + game.state - } - } else { - view.actions = {} - - if (states[game.state]) - states[game.state].prompt(player) - else - view.prompt = "B Unknown state: " + game.state - if (view.actions.undo === undefined) { - if (game.undo && game.undo.length > 0) - view.actions.undo = 1 - else - view.actions.undo = 0 - } - } - - return view -} - - -// === ACTIONS =========== - -function gen_action(action, argument) { -//console.log('gen_action called with ', action, ' and ', argument) - if (argument === undefined) { - //console.log('argument undefined') - view.actions[action] = 1 - } else { - if (!(action in view.actions)) { - //console.log('push argument') - view.actions[action] = [] - } - view.actions[action].push(argument) - } - //console.log('view.actions: ', view.actions, 'view.actions[action]: ', view.actions[action]) -} - -function gen_action_infl(space){ - gen_action("infl", space) -} - -function gen_action_card(card){ - gen_action("card", card) -} - -function gen_action_sc(space){ - gen_action("sc", space) -} - -function gen_action_scoring(){ - gen_action("scoring") -} - -exports.action = function (state, player, action, arg) { - //console.log('exports.action called with state:' , state, 'player:', player, 'action: ', action, 'arg: ', arg) - game = state - if (states[game.state] && action in states[game.state]) { - states[game.state][action](arg, player) - } else { - if (action === "undo" && game.undo && game.undo.length > 0) - pop_undo() - else - throw new Error("Invalid action: " + action) - } - return game -} - -// ============= GAME STATES ======================= - -states.com_init = { - inactive: 'place starting SPs.', - prompt() { - //console.log('state:', game.state, 'game.valid_spaces', game.valid_spaces) - if (game.starting_infl.dem_starting_infl === 2 && game.available_ops === 0 ) { - view.prompt = 'Place starting SPs: done. Start Turn 1.'; - gen_action("start"); - } else if (game.available_ops === 0) { - view.prompt = 'Place starting SPs: done.'; - gen_action("done"); - return; - } else if (game.starting_infl.dem_starting_infl === 2) { - view.prompt = `Place your last ${pluralize(game.available_ops,'starting SP')}.` - } else { - view.prompt = `Place ${pluralize(game.available_ops,'starting SP')}.` - } - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - }, - infl(space) { - add_infl(space) - - }, - done() { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - - game.starting_infl.com_starting_infl++ - if (game.starting_infl.com_starting_infl == 1){ - game.available_ops = 3 - game.state = 'dem_init' - valid_spaces_setup() - next_player() - } else if (game.starting_infl.com_starting_infl == 2) { - game.available_ops = 4 - game.state = 'dem_init' - valid_spaces_setup() - next_player() - } else if (game.starting_infl.com_starting_infl == 3) { - delete game.starting_infl - game.state = 'start_game' - } - }, - start() { - new_turn() - clear_undo() - game.state = 'choose_card' - } -} - -states.dem_init = { - inactive: 'place starting SPs.', - prompt() { - //console.log('state:', game.state) - if (game.available_ops == 0) { - view.prompt = 'Place starting SPs: done.'; - gen_action("done"); - return; - } else if (game.starting_infl.com_starting_infl === 2) { - view.prompt = `Place your last ${pluralize(game.available_ops,'starting SP')}.` - } else { - view.prompt = `Place ${pluralize(game.available_ops,'starting SP')}.` - } - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - }, - infl(space) { - add_infl(space) - }, - - done() { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - - game.starting_infl.dem_starting_infl++ - if (game.starting_infl.dem_starting_infl == 1){ - game.available_ops = 3 - } else if (game.starting_infl.dem_starting_infl == 2) { - game.available_ops = 2 - } - game.state = 'com_init' - valid_spaces_setup() - next_player() - } -} - - -states.choose_card = { - inactive: 'choose a card.', - prompt() { - if ((game.active===DEM && game.democrat_hand.length === 0) || game.active === COM && game.communist_hand.length === 0) { - view.prompt = 'No cards remaining: you must pass.' - gen_action('pass') - } else { - view.prompt = 'Choose a card.' - let available_cards - if (game.active === DEM) { - available_cards = game.democrat_hand - } else { - available_cards = game.communist_hand - } - for (let card of available_cards) { - gen_action_card(card) - } - } - }, - card(card) { - push_undo() - - //Check if player is at risk of losing game due to held scoring card - if (!scoring_cards.includes(card)) { - let scoring_cards_count = count_scoring_cards() - - if (game.round !== 8 && scoring_cards_count >= (8-game.round)){ - game.temp = card - game.state = 'confirm_card' - return - } - } - select_card(card) - }, - pass() { - log('No cards remaining. Passed') - //end_round() - game.state = 'end_round' - } -} - -states.confirm_card = { - inactive: 'choose a card.', - prompt() { - let scoring_cards_count = count_scoring_cards() - view.prompt = `${pluralize(scoring_cards_count,'scoring card')} in hand with ${pluralize(8-game.round,'turn')} remaining. Scoring cards may not be held. Continue?` - gen_action('continue') - }, - continue() { - select_card(game.temp) - } -} - -states.play_card ={ - get inactive() { - return `play ${clean_name(cards[game.played_card].name)}.` - }, - prompt () { - /*if (game.phase >= 1) { /*Finish here when playing your own event - console.log('in play card') - view.prompt = `${clean_name(cards[game.played_card].name)}: done. End the Action Round.` - gen_action('end_round') - return - }*/ - - view.prompt = `Play ${clean_name(cards[game.played_card].name)} for:` - - if (scoring_cards.includes(game.played_card)) { - /*view.prompt = 'Play for:'*/ - gen_action('event') - return - } - - // Check for Reformer Rehabilitated - - //console.log('game.active', game.active, 'game.playable_cards[67].playable', game.playable_cards[67].playable) - - - if (game.played_card === 67 && game.playable_cards.includes(67)){ - if (game.active === DEM && (game.dem_tst_position > game.com_tst_position)) { - gen_action('event') - } - if (game.active === COM && (game.dem_tst_position < game.com_tst_position)) { - gen_action('event') - } - } - - //Check for events - //console.log('event_is_playable(game.played_card)', event_is_playable(game.played_card)) - if (event_is_playable(game.played_card)) { - //console.log('card is playable') - //Check for Tiananmen Square Track awards special abilities - //console.log('game.tst_7', game.tst_7) - if ((game.active === DEM && cards[game.played_card].side === 'C' && game.dem_tst_position >= 7 && game.com_tst_position < 7 && !game.tst_7) || (game.active === COM && cards[game.played_card].side === 'D' && game.com_tst_position >= 7 && game.dem_tst_position < 7 && !game.tst_7)){ - gen_action('tst_7') - } - - if ((game.active === DEM && cards[game.played_card].side !== 'C' && game.dem_tst_position >= 8 && game.com_tst_position < 8 && !game.tst_8) || (game.active === COM && cards[game.played_card].side !== 'D' && game.com_tst_position >= 8 && game.dem_tst_position < 8 && !game.tst_8)){ - gen_action('tst_8') - } - - //Continue with normal logic - get_events(game.played_card) - } - - gen_action('influence') - gen_action('support_check') - - if ((game.active === DEM && game.dem_tst_attempted_this_turn === 0 && game.dem_tst_position < 8 ) || (game.active === COM && game.com_tst_attempted_this_turn === 0 && game.com_tst_position < 8)) { - gen_action('tst') - } - - }, - event() { - push_undo() - //console.log('played event, game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) - log_gap(`Played C${cards[game.played_card].number} for the event`) - game.vm_infl_to_do = false - if (scoring_cards.includes(game.played_card)) {game.phase = 0} - else {game.phase = 1} - game.return = game.active - if (switch_events.includes(game.played_card)) {next_player()} - game.vm_event = game.played_card - //console.log('before event, game.vm_infl_to_do', game.vm_infl_to_do) - goto_vm(game.vm_event) - }, - opp_event() { - push_undo() - log_gap(`Played C${cards[game.played_card].number} for the event`) - game.phase = 1 /*Do I still need this?*/ - game.vm_infl_to_do = true - game.return = game.active - game.vm_event = game.played_card - if (is_auto_resolve(game.played_card) || switch_events.includes(game.played_card)) { - goto_vm(game.vm_event)} - else { - next_player() - log(`C${game.vm_event}`) - goto_vm(game.vm_event) - } - }, - influence() { - push_undo() - log_gap(`Played C${cards[game.played_card].number} to place SPs`) - - - // Check if Common European Home played for influence - if (game.played_card === 21) { - if (game.active === DEM) { - game.vp -- - log('-1 VP') - if (check_vp()) { - return - } - } else { - game.vp ++ - log('+1 VP') - if (check_vp()) { - return - } - } - } - // Check if card is opponent card with event that needs to be resolved - - if (cards[game.played_card].playable || game.playable_cards.includes(game.played_card)) { - if ((game.active === DEM && cards[game.played_card].side === "C" ) || (game.active === COM && cards[game.played_card].side === "D")) { - //game.phase = 1 /*Do I need this? */ - game.vm_event_to_do = true - } - } - - // If ABHR - Set AHBR tracker to true - if (game.persistent_events.includes(58)) { - game.austria_hungary_border_reopened_tracker = true - } - game.state='add_influence' - valid_spaces_infl() - }, - tst() { - push_undo() - log_gap(`Played C${cards[game.played_card].number} to the Tiananmen Square Track`) - game.state='tiananmen_square_attempt' - }, - support_check() { - push_undo() - log_gap(`Played C${cards[game.played_card].number} for support checks`) - - // Check if card is opponent card with event that needs to be resolved - - if (cards[game.played_card].playable || game.playable_cards.includes(game.played_card)) { - if ((game.active === DEM && cards[game.played_card].side === "C" ) || (game.active === COM && cards[game.played_card].side === "D")) { - game.vm_event_to_do = true - } - } - - game.available_ops = 2 - game.state='support_check_prep' - valid_spaces_sc() - }, - tst_7() { /*Cancel opponent event */ - push_undo() - log(`Played C${game.played_card}. Event cancelled using TST Award`) - game.tst_7 = true - game.vm_infl_to_do = true - game.state = 'resolve_opponent_event' - }, - tst_8() { /*Play card for ops and event */ - push_undo() - game.vm_event_to_do = true - game.vm_infl_to_do = true - game.tst_8 = true - log(`Played C${game.played_card} for event and operations`) - game.state = 'vm_tst_8' - }, - end_round () { - end_round() - } - -} - -states.resolve_opponent_event = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - //console.log('in resolve opponent event: discard', game.strategy_discard) - if (game.vm_infl_to_do) { - view.prompt = 'Event resolved. Choose to play card for:' - gen_action('influence') - gen_action('support_check') - } else if (game.vm_event_to_do) { - // Check for Tiananmen Square Track ability - play opponent card without triggering event - if ((game.active === DEM && game.dem_tst_position >= 7 && game.com_tst_position < 7 && !game.tst_7) || (game.active === COM && game.com_tst_position >= 7 && game.dem_tst_position < 7 && !game.tst_7)){ - gen_action('tst_7') - } - view.prompt = `${clean_name(cards[game.played_card].name)}: you must resolve the opponent event.` - gen_action('opp_event') - } else { - view.prompt = 'Event resolved. End the action round.' - gen_action('end_round') - } - }, - influence(){ - push_undo() - // If ABHR - Set AHBR tracker to true - if (game.persistent_events.includes(58)) { - game.austria_hungary_border_reopened_tracker = true - } - game.state = 'finish_add_infl' - valid_spaces_infl() - }, - support_check() { - push_undo() - game.available_ops = 2 - game.state = 'finish_support_check_prep' - valid_spaces_sc() - }, - opp_event() { - game.vm_event_to_do = false - game.return_state = 'resolve_opponent_event' - if (is_auto_resolve(game.played_card) || switch_events.includes(game.played_card)) { - game.return = game.active - log(`Played C${game.played_card} for the event`) - goto_vm(game.played_card)} - else { - if (game.active === DEM) { - game.return = COM - } else { - game.return = DEM - } - next_player() - log(`C${game.played_card}`) - goto_vm(game.played_card) - } - }, - tst_7() { - push_undo() - log('Event cancelled using TST Award') - game.tst_7 = true - game.vm_event_to_do = false - }, - end_round() { - push_undo() - /*if(game.round_player === COM && game.active === DEM) { - log_h3('End of Communist Action Round') - change_player() - } */ - end_round() - } -} - - -states.finish_add_infl = { - inactive: 'add SPs.', - prompt () { - if (game.available_ops === 0) { - view.prompt = 'Place SPs: done.' - gen_action("end_round") - return; - } - - view.prompt = `Add SPs: ${game.available_ops} remaining.` - - // Generate actions for valid spaces - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id) - } - }, - infl(space) { - add_infl(space) - }, - end_round() { - push_undo() - if (game.summary.length > 0) { - pop_summary() - log_br() - } - - end_round() - //game.state = 'end_round' - } -} - -states.finish_support_check_prep = { - inactive: 'do support checks.', - prompt () { - if (game.available_ops === 0) { - view.prompt = 'Support checks: done.' - gen_action('end_round') - //return - } else { - view.prompt = `Select a space. ${pluralize(game.available_ops, 'support check')} remaining.` - for (let space_id of game.valid_spaces) { - gen_action_sc(space_id) - } - } - }, - sc(space) { - push_undo() - game.selected_space = space - // Check for Austria-Hungary Border Reopened - check on first support check only - //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) - if (game.persistent_events.includes(58)){ - if (game.active === DEM && game.available_ops > 1) { - //console.log('in ahb check, country, ', spaces[game.selected_space].country, 'ahb', 'austria_hungary_border_reopened']) - if (spaces[game.selected_space].country === 'East_Germany' && game.persistent_events.includes(58) && game.active === DEM) { - game.state = 'finish_austria_hungary_border_reopened_check' - return - } - } - } - game.state = 'finish_do_support_check' - }, - end_round () { - end_round() - //game.state = 'end_round' - } -} - -states.finish_austria_hungary_border_reopened_check = { - inactive: 'decide Austria-Hungary Border Reopened', - prompt() { - view.prompt = 'Austria-Hungary Border Reopened: will both support checks be in East Germany?' - gen_action('yes') - gen_action('no') - }, - yes() { - game.austria_hungary_border_reopened_tracker = true - game.state = 'finish_do_support_check' - }, - no() { - game.state = 'finish_do_support_check' - } -} - -states.finish_do_support_check = { - inactive: 'do support checks', - prompt () { - view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` - gen_action('roll') - }, - roll() { - clear_undo() - do_sc(game.selected_space) - game.available_ops-- - if (game.available_ops === 0) { - game.valid_spaces = [] - } - game.state = 'finish_support_check_prep' - return - } -} - -states.add_influence = { - inactive: 'add SPs.', - prompt () { - if (game.available_ops <= 0) { - view.prompt = 'Place SPs: done.' - if (!game.vm_event_to_do) { - gen_action("end_round") - } else { - gen_action('done') - } - } else { - - view.prompt = `Add SPs: ${game.available_ops} remaining.` - - // Generate actions for valid spaces - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } - }, - infl(space) { - add_infl(space) - }, - end_round() { - push_undo() - if (game.summary.length > 0) { - pop_summary() - log_br() - } - end_round() - }, - done() { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - reset_austria_hungary_border_reopened() - game.state = 'resolve_opponent_event' - } -} - -states.tiananmen_square_attempt = { - inactive: 'do Tiananmen Square Attempt.', - prompt () { - view.prompt = 'Tiananmen Square Track attempt: Roll a die.' - gen_action('roll') - }, - roll() { - clear_undo() - do_tst_attempt () - } -} - -states.tiananmen_square_attempt_success = { - inactive: 'do Tiananmen Square Attempt.', - prompt () { - if (game.vm_event > 200) { - view.prompt = 'Tiananmen Square Track attempt successful. Go to TST Award.' - gen_action('done') - } else { - view.prompt = 'Tiananmen Square Track attempt successful.' - gen_action('end_round') - } - - }, - done () { - push_undo() - //console.log('going to tst award, game.return_state', game.return_state) - goto_vm(game.vm_event) - }, - end_round () { - push_undo() - end_round() - } -} - -states.tiananmen_square_attempt_fail = { - inactive: 'do Tiananmen Square Attempt.', - prompt () { - view.prompt = 'Tiananmen Square Track attempt failed.' - gen_action('end_round') - }, - end_round () { - push_undo() - end_round() - //game.state = 'tiananmen_square_attempt_done' - } -} - -states.tiananmen_square_attempt_done = { - inactive: 'do Tiananmen Square Attempt.', - prompt () { - view.prompt = 'Tiananmen Square Track attempt: done.' - gen_action('end_round') - }, - end_round () { - end_round() - //game.state = 'end_round' - } -} - -states.tst_goddess = { - inactive: 'choose whether to discard a card.', - prompt() { - //if (game.phase === 0) { - view.prompt = 'Tiananmen Square Track award: you may discard a non-Power Struggle Card and draw a replacement.' - for (let card of game.valid_cards) { - gen_action_card(card) - } - gen_action('pass') - /*} else { - view.prompt = 'Discard a card: done.' - gen_action('done') - }*/ - }, - card(card) { - push_undo() - discard(card) - game.valid_cards = [] - game.state = 'tst_goddess_draw' - //game.phase++ - /*if (game.active === DEM) { - draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length +1, game.communist_hand.length) - } else { - draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length, game.communist_hand.length +1) - }*/ - }, - pass() { - log('Did not discard') - log_h2("Action Round " + game.round) - if (game.active === DEM) { - next_player() - } else { - log_side() - } - if (game.persistent_events.includes(5)) { - game.state = 'general_strike' - } else { - game.state = 'choose_card' - } - }, - done() { - - log_h2("Action Round " + game.round) - if (game.active === DEM) { - next_player() - } else { - log_side() - } - game.phase = 0 - if (game.persistent_events.includes(5)) { - game.state = 'general_strike' - } else { - game.state = 'choose_card' - } - } -} - -states.tst_goddess_draw = { - inactive: 'choose whether to discard a card.', - prompt() { - view.prompt = 'Draw a replacement card.' - gen_action('draw') - }, - draw() { - if (game.active === DEM) { - draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length +1, game.communist_hand.length) - } else { - draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length, game.communist_hand.length +1) - } - log_h2("Action Round " + game.round) - if (game.active === DEM) { - next_player() - } else { - log_side() - } - game.phase = 0 - if (game.persistent_events.includes(5)) { - game.state = 'general_strike' - } else { - game.state = 'choose_card' - } - } -} - - - -states.support_check_prep = { - inactive: 'do support checks', - prompt () { - if (game.available_ops === 0) { /*Needs another check for Support Checks done during Crowd Turns against Ceausescu*/ - if (game.is_pwr_struggle) { - view.prompt = 'The Crowd Turns Against Ceausescu. Support checks: done.' - gen_action('done') - } else if (!game.vm_event_to_do) { - view.prompt = 'Support checks: done.' - gen_action('end_round') - } else { - view.prompt = 'Support checks: done.' - gen_action('done') - } - } else if (game.available_ops > 0) { - view.prompt = `Select a space. ${pluralize(game.available_ops, 'support check')} remaining.` - - for (let space_id of game.valid_spaces) { - gen_action_sc(space_id) - } - } - }, - sc(space) { - push_undo() - game.selected_space = space - - // Check for Austria-Hungary Border Reopened - check on first support check only - //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) - if (game.persistent_events.includes(58)) { - if (game.active === DEM && game.available_ops > 1) { - if (spaces[game.selected_space].country === 'East_Germany' && game.persistent_events.includes(58) && game.active === DEM) { - game.state = 'austria_hungary_border_reopened_check' - return - } - //game.state = 'do_support_check' - } /*else { */ - } - game.state = 'do_support_check' - //} - }, - end_round() { - push_undo() - end_round() - }, - done() { - push_undo() - if (game.is_pwr_struggle) {/*Crowd Turns Against Ceausescu should be the only time you end up here during a power struggle */ - if (game.return !== game.active) { - next_player() - } - log_h2('Raise the Stakes') - game.state = 'raise_stakes_1' - return - } - reset_austria_hungary_border_reopened() - game.state = 'resolve_opponent_event' - } -} - -states.do_support_check = { - inactive: 'do support checks.', - prompt () { - // console.log('in do_support_check') - view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` - gen_action('roll') - }, - roll() { - clear_undo() - do_sc(game.selected_space) - game.available_ops-- - if (game.available_ops === 0) { - game.valid_spaces = [] - } - game.state = 'support_check_prep' - return - } -} - -states.austria_hungary_border_reopened_check = { - inactive: 'decide Austria-Hungary Border Reopened.', - prompt() { - view.prompt = 'Austria-Hungary Border Reopened: will both support checks be in East Germany?' - gen_action('yes') - gen_action('no') - }, - yes() { - game.austria_hungary_border_reopened_tracker = true - game.state = 'do_support_check' - }, - no() { - game.state = 'do_support_check' - } -} - -states.end_round = { - inactive: 'finish playing a card.', - prompt() { - view.prompt = 'End the Action Round.' - gen_action('end_round') - }, - end_round() { - push_undo() - end_round() - } -} - -//======================= POWER STRUGGLE =============================== - -states.draw_power_cards = { - inactive: 'draw cards.', - prompt() { - view.prompt = `${clean_name(cards[this_card()].name)}: draw cards.` - gen_action('draw') - }, - draw() { - push_undo() - game.power_struggle_deck = [...all_power_cards] - // console.log('game.power_struggle_deck.length', game.power_struggle_deck.length) - //console.log('called draw cards, country', game.pwr_struggle_in, 'game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) - //console.log('test3') - let presence = check_presence(game.pwr_struggle_in) - //console.log('test2') - if (presence.dem_spaces > 0) { - game.dem_pwr_hand_limit = 6 + 2*(presence.dem_spaces - 1) - } else { - game.dem_pwr_hand_limit = 0 - } - if (presence.com_spaces > 0 ) { - game.com_pwr_hand_limit = 6 + 2*(presence.com_spaces - 1) - } else { - game.com_pwr_hand_limit = 0 - } - // Events which affect cards drawn - if (game.persistent_events.includes(17) && game.com_pwr_hand_limit >= 2) { - log('Democrat receives 2 cards from Communist due to C17') - game.dem_pwr_hand_limit += 2 - game.com_pwr_hand_limit -= 2 - discard_from_table(17) - game.persistent_events = game.persistent_events.filter(n => n !== 17) - } - - if (game.persistent_events.includes(72)) { - let farmer_check - for (let space of spaces) { - if (space && space.country === game.pwr_struggle_in && space.socio === 3 && check_dem_control(space.space_id)) { - farmer_check = true - } - } - if (farmer_check && game.com_pwr_hand_limit > 0) { - log('Democrat receives 1 cards from Communist due to C72') - game.dem_pwr_hand_limit += 1 - game.com_pwr_hand_limit -= 1 - permanently_remove(72) - game.persistent_events = game.persistent_events.filter(n => n !== 72) - } - } - - if (game.persistent_events.includes(102) && game.dem_pwr_hand_limit >=2 && (game.pwr_struggle_in === 'Romania' || game.pwr_struggle_in === 'Bulgaria')) { - log('Communist receives 2 cards from Democrat due to C102') - game.dem_pwr_hand_limit -= 2 - game.com_pwr_hand_limit += 2 - permanently_remove(102) - game.persistent_events = game.persistent_events.filter(n => n !== 102) - } - - //Draw Power Cards - game.is_pwr_struggle = true - //console.log('game.dem_pwr_hand_limit', game.dem_pwr_hand_limit, 'game.com_pwr_hand_limit', game.com_pwr_hand_limit) - draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand_limit, game.com_pwr_hand_limit) - if (game.active === DEM) { - game.valid_cards = [...game.dem_pwr_hand] - } else { - game.valid_cards = [...game.com_pwr_hand] - } - //game.valid_cards = all_power_cards - - log(`Communist: ${game.com_pwr_hand.length} cards`) - log(`Democrat: ${game.dem_pwr_hand.length} cards`) - - //Check if The Crowd Turns Against Ceausescu occurs - if (game.table_cards.includes(54) && game.pwr_struggle_in === 'Romania') { - //console.log('draw cards: crowd subcheck, game.active', game.active) - if (game.active === COM) { - game.return = COM - next_player() - } - log_h3('C54') - game.persistent_events.push(54) - game.state = 'the_crowd_turns_against_ceausescu_prep' - } else { - log_h2('Raise the Stakes') - game.state = 'raise_stakes_1' - //console.log('game.state', game.state, 'game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) - } - } -} - -states.the_crowd_turns_against_ceausescu_prep = { - get inactive() { - return `resolve ${clean_name(cards[54].name)}.` - }, - prompt() { - view.prompt = 'The Crowd Turns Against Ceausescu: draw cards.' - gen_action('draw') - }, - draw() { - game.ceausescu_cards = [] - draw_cards(game.power_struggle_deck, game.ceausescu_cards, game.com_pwr_hand, 15, game.com_pwr_hand.length) - //console.log('game.ceausescu_cards', game.ceausescu_cards) - game.temp = game.ceausescu_cards.filter(card => card && card >=25 && card <= 30).length - log(`Drew ${pluralize(game.temp, 'Rally in the Square')}.`) - game.vm_available_ops = game.temp * 3 - log(`Democrat takes a ${game.vm_available_ops} Action Round`) - game.state = 'vm_the_crowd_turns_against_ceausescu' - } -} - -states.vm_the_crowd_turns_against_ceausescu = { - get inactive() { - return `resolve ${clean_name(cards[54].name)}.` - }, - prompt() { - view.prompt = `You have ${game.vm_available_ops} operations points. Play for:` - gen_action('influence') - gen_action('support_check') - }, - influence() { - push_undo() - delete game.ceausescu_cards - valid_spaces_infl() - game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'Romania') - game.state = 'the_crowd_turns_against_ceausescu_infl' /* Send this to add_infl. Add check at end of add_infl similar to valid_spaces*/ - }, - support_check() { - push_undo() - delete game.ceausescu_cards - valid_spaces_sc() - game.available_ops = 2 - game.state = 'support_check_prep' - } -} - -states.the_crowd_turns_against_ceausescu_infl = { - inactive: 'add SPs.', - prompt () { - if (game.vm_available_ops === 0) - { - view.prompt = 'Place SPs: done.'; - gen_action("done"); - return; - } - - view.prompt = `Add SPs: ${game.vm_available_ops} remaining` - for (let space of game.valid_spaces) { - gen_action_infl(space) - } - }, - infl(space) { - vm_do_add_infl(space) - }, - done() { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - - if (game.return !== game.active) { - next_player() - } - log_h2('Raise the Stakes') - game.state = 'raise_stakes_1' - } -} - -states.raise_stakes_1 = { - inactive: 'raise the stakes.', - - prompt () { - // console.log('raise stakes 1 - valid cards', game.valid_cards) - // console.log('raise the stakes: game.played_power_card', game.played_power_card, 'game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) - if ((game.active === DEM && game.dem_pwr_hand < 3) || (game.active === COM && game.com_pwr_hand < 3)) { - view.prompt = 'Raise the stakes: you must pass.' - gen_action('pass') - } - else if (game.raised_stakes_discard === 3) { - view.prompt = 'Raise the stakes: done.' - gen_action('done') - } else { - view.prompt = `Discard ${3-game.raised_stakes_discard} cards to raise the stakes.` - if (game.raised_stakes_discard === 0) { - gen_action('pass') - } - for (let card of game.valid_cards) { - gen_action_card(card) - } - } - }, - card(card) { - push_undo() - if (numberless_cards.includes(card)) { - log(`Discarded: P${card}`) - } else { - log(`Discarded: P${card} V${power_cards[card].value}`) - } - discard(card) - - game.raised_stakes_discard ++ - if (game.raised_stakes_discard === 3) { - game.raised_stakes++ - game.valid_cards = [] - } - }, - pass(){ - log('Did not raise the stakes') - game.raised_stakes_discard = 0 - next_player() - if (game.active === DEM) { - game.valid_cards = [...game.dem_pwr_hand] - } else { - game.valid_cards = [...game.com_pwr_hand] - } - game.state = 'raise_stakes_2' - }, - done () { - log_gap('Raised the stakes') - game.raised_stakes_discard = 0 - next_player() - //console.log('game.active', game.active) - if (game.active === DEM) { - game.valid_cards = [...game.dem_pwr_hand] - } else { - game.valid_cards = [...game.com_pwr_hand] - } - // console.log('game.valid_cards', game.valid_cards) - game.state = 'raise_stakes_2' - } -} - -states.raise_stakes_2 = { - inactive: 'raise the stakes.', - - prompt () { - if ((game.active === DEM && game.dem_pwr_hand < 3) || (game.active === COM && game.com_pwr_hand < 3)) { - view.prompt = 'Raise the stakes: you must pass.' - gen_action('pass') - return - } - if (game.raised_stakes_discard === 3) { - view.prompt = 'Raise the stakes: done.' - gen_action('done') - } else { - view.prompt = `Discard ${3-game.raised_stakes_discard} cards to raise the stakes.` - if (game.raised_stakes_discard === 0) { - gen_action('pass') - } - for (let card of game.valid_cards) { - gen_action_card(card) - } - } - }, - card(card) { - push_undo() - if (numberless_cards.includes(card)) { - log(`Discarded: P${card}`) - } else { - log(`Discarded: P${card} V${power_cards[card].value}`) - } - discard(card) - - game.raised_stakes_discard ++ - if (game.raised_stakes_discard === 3) { - game.raised_stakes++ - game.valid_cards = [] - } - - }, - pass() { - log('Did not raise the stakes') - game.raised_stakes_discard = 0 - game.valid_cards = [] - log_h2('Play Cards') - next_player() - game.state = 'begin_power_struggle' - }, - done () { - log_gap('Raised the stakes') - game.raised_stakes_discard = 0 - game.valid_cards = [] - log_h2('Play Cards') - next_player() - game.state = 'begin_power_struggle' - }, -} - -states.begin_power_struggle = { - inactive: 'begin power struggle.', - prompt() { - view.prompt = 'Begin power struggle.' - gen_action('struggle') - }, - struggle () { - do_valid_cards() - game.state = 'power_struggle' - } -} - -states.power_struggle = { - inactive: 'play a card.', - prompt () { - console.log('game.vm_event', game.vm_event) - if (game.phase === 0) { - if (game.valid_cards.length > 0) { - view.prompt = "Play a card." - for (let card of game.valid_cards) { - gen_action_card(card) - } - } else if ( game.valid_cards.length === 0) { - view.prompt = 'No valid cards. You must concede.' - gen_action('concede') - } - } - if (game.phase === 1) { - if (game.valid_cards.length > 0) { - view.prompt = `${power_cards[game.played_power_card].name} played. You must match or concede.` - gen_action('concede') - for (let card of game.valid_cards) { - gen_action_card(card) - } - } else if (game.valid_cards.length === 0) { - view.prompt = `${power_cards[game.played_power_card].name} played. You must concede.` - gen_action('concede') - } - } - else if (game.phase === 2) { - view.prompt = 'You matched. Roll a die.' - gen_action('roll') - } - else if (game.phase === 3) { - view.prompt = 'Play leader as:' - if (game.tactics_fails !== "Strike") {gen_action('strike')} - if (game.tactics_fails !== "March") {gen_action('march')} - if (game.tactics_fails !== "Rally in the Square") {gen_action('rally')} - if (game.tactics_fails !== "Petition") {gen_action('petition')} - } - }, - card(card) { - push_undo() - discard(card) - game.valid_cards=[] - game.return_state = 'power_struggle' - if (card === 52) { - log_gap(`Played P52: P${power_cards[game.played_power_card].number} no longer playable`) - - } else { - if (game.phase === 0 && leader_cards.includes(card)) {} /* Log nothing. Probably a better way to do this */ - else if (numberless_cards.includes(card)) { - log_gap(`Played: P${card}`) - } else { - log_gap(`Played: P${card} V${power_cards[card].value}`) - } - } - if (game.phase === 0) { - if (card >= 37 && card <= 48) { /*When a leader is played */ - game.played_power_card = card - game.phase = 3 - } else if (card === 49){ /*Scare Tactics */ - game.return = '' - goto_vm(349) /*Can I combine these 3 into a single stage where you goto_vm(300 + card) ? */ - } else if (card === 50) { /*Support Surges */ - if (game.active === DEM) { - game.return = COM - } else { - game.return = DEM - } - goto_vm(350) - } else if (game.phase === 0 && card === 51) { /*Support Falters */ - next_player() - goto_vm(351) - } else { - game.played_power_card = card - game.phase = 1 - next_player() - do_valid_cards() - } - } else if (game.phase === 1) { - if (card === 52) { - game.tactics_fails = power_cards[game.played_power_card].name - game.phase = 0 - next_player() - do_valid_cards() - } else if (power_cards[game.played_power_card].value === 1) { - log('Takes initiative') - game.phase = 0 - do_valid_cards() - } else { - game.phase = 2 - } - } - }, - roll () { - let roll = Math.floor(Math.random() * 6) + 1 - log(`Roll: D${roll}`) - if (roll >= power_cards[game.played_power_card].value) { - log('Initiative roll successful') - game.phase = 0 - do_valid_cards() - } else { - log(`Initiative roll failed. Required ${power_cards[game.played_power_card].value} or more`) - game.phase = 0 - next_player() - do_valid_cards() - } - }, - concede () { - push_undo() - game.valid_cards = [] - log('Conceded') - log_h2('Aftermath') - log_h3('Support Loss') - //if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) {game.rally_win = 2} - //if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.played_power_card === 54) {game.petition_win = 2} - if (game.phase === 0) { - game.played_power_card = 0 /*If conceded when held the initiative but had no playable cards, ignore the last played card */ - } - game.phase = 0 - game.state = 'support_loss' - }, - strike () { - log(`Played: P${power_cards[game.played_power_card].number} as a Strike`) - game.played_power_card = 9 - game.phase = 1 - next_player() - do_valid_cards() - }, - march () { - log(`Played: P${power_cards[game.played_power_card].number} as a March`) - game.played_power_card = 21 - game.phase = 1 - next_player() - do_valid_cards() - }, - rally () { - log(`Played: P${power_cards[game.played_power_card].number} as a Rally in the Square`) - game.played_power_card = 53 - game.phase = 1 - next_player() - do_valid_cards() - }, - petition () { - log(`Played: P${power_cards[game.played_power_card].number} as a Petition`) - game.played_power_card = 54 - game.phase = 1 - next_player() - do_valid_cards() - }, - /*draw () { - if (game.active === DEM) { - draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length+2, game.com_pwr_hand.length) - } else {draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length, game.com_pwr_hand.length+2)} - game.phase = 0 - next_player() - do_valid_cards() - },*/ - /*infl(space) { - game.remove_opponent_infl = true - remove_infl(space) - game.phase = 6 - }, - discard () { /*Is this still needed? - if (game.active === DEM) {discard_card(game.dem_pwr_hand)} - else {discard_card(game.com_pwr_hand)} - game.available_ops -- - }, */ - done () { - if (game.phase === 7) { /*Is this ever called anymore? */ - game.phase = 0 - log_msg_gap('Takes initiative') - do_valid_cards() - } else { - game.phase = 0 - next_player() - do_valid_cards() - } - } -} - -states.support_loss ={ - inactive: 'do Support Loss.', - prompt () { - if (!game.persistent_events.includes(111)) { - if (game.phase === 0) { - view.prompt = 'You lost the Power Struggle. Roll a die for Support Loss.' - gen_action('roll') - } else if (game.phase === 1 && game.available_ops > 0 && game.valid_spaces.length > 0) { - view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}. Support Loss: remove ${pluralize(game.available_ops,'SP')}.` - - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id) - } - } else if (game.phase === 1 && game.available_ops === 0 ) { - view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}. Support Loss: finished.` - gen_action('done') - } else if (game.phase === 1 && game.valid_spaces.length === 0) { - view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}. Support Loss: no remaining SPs to remove.` - gen_action('done') - } - } else { - if (game.phase === 0) { - view.prompt = 'You lost the Power Struggle. Roll a die for Support Loss.' - gen_action('roll') - } else if (game.phase === 1 && game.available_ops > 0 && game.valid_spaces.length > 0) { - view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}. Support Loss: remove ${pluralize(game.available_ops,'SP')}.` - - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id) - } - } else if (game.phase === 1 && game.available_ops === 0 ) { - view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}. Support Loss: finished.` - gen_action('done') - } else if (game.phase === 1 && game.valid_spaces.length === 0) { - view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}. Support Loss: no remaining SPs to remove.` - gen_action('done') - } - } - }, - roll () { - clear_undo() - let roll = Math.floor(Math.random() * 6) + 1 - let rally_win = 0 - let petition_win = 0 - log(`Roll: D${roll}`) - if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) { rally_win = 2} - if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.played_power_card === 54) { petition_win = 2} - let modified_roll = roll + game.raised_stakes + rally_win - petition_win - - // Roll modifiers - if (game.active === COM && game.persistent_events.includes(62)) { - log('+1 from C62') - modified_roll ++ - } - - if (modified_roll < 0) {modified_roll = 0} - else if (modified_roll > 7) {modified_roll = 7} - - - if (game.raised_stakes !== 0) { - log(`+${game.raised_stakes} from Raising the Stakes`) - } - if (rally_win !== 0) { - log('+2 from winning on a P25') - } - if (petition_win !== 0) { - log('-2 from winning on a P31') - } - if (modified_roll !== roll) { - log(`Modified roll: ${modified_roll}`) - } - game.available_ops = support_loss_roll[modified_roll] - if (game.available_ops === 0) { - log('Does not remove SPs') - } - game.phase++ - if (game.available_ops > 0) { - valid_spaces_support_loss() - } - }, - infl (space) { - game.remove_opponent_infl = false /* Don't know why this is needed... */ - remove_infl(space) - if (game.available_ops === 0 ) { - game.valid_spaces = [] - } - }, - done () { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - next_player() - log_h3('Victory Point') - game.phase = 0 - game.state = 'vp_roll' - } -} - -states.vp_roll = { - inactive: 'do VP Roll.', - prompt () { - if (!game.persistent_events.includes(111)) { - if (game.phase === 0) { - view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}: roll a die for Victory.` - gen_action('roll') - } else if (game.phase === 1) { - view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}: take power.` - gen_action('take') - } else if (game.phase === 2) { - view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}: proceed to scoring.` - gen_action('scoring') - } - } else { - if (game.phase === 0) { - view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}: roll a die for Victory.` - gen_action('roll') - } else if (game.phase === 1) { - view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}: take power.` - gen_action('take') - } else if (game.phase === 2) { - view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}: proceed to scoring.` - gen_action('scoring') - } - } - }, - roll () { - let roll = Math.floor(Math.random() * 6) + 1 - log(`Roll: D${roll}`) - let rally_win = 0 - let petition_win = 0 - if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) {rally_win = 2} - if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.played_power_card === 54) {petition_win = 2} - let modified_roll = roll + game.raised_stakes + rally_win - petition_win - if (game.active === DEM && game.persistent_events.includes(62)) { - log('+1 from C62') - modified_roll ++ - } - if (modified_roll < 0) {modified_roll = 0} - else if (modified_roll > 7) {modified_roll = 7} - - if (game.raised_stakes !== 0) { - log(`+${game.raised_stakes} from Raising the Stakes`) - } - if (rally_win !== 0) { - log('+2 from winning on a P25') - } - if (petition_win !== 0) { - log('-2 from winning on a P31') - } - if (modified_roll !== roll) { - log(`Modified roll: ${modified_roll}`) - } - let vp_change = vp_roll[modified_roll] - if (game.active === DEM) { - log(`+${vp_change} VP`) - } else { - log(`-${vp_change} VP`) - } - if (roll >= 4) - //console.log('VP before', game.vp) - if (game.active === DEM) {game.vp += vp_change} - else {game.vp -= vp_change} - //console.log('VP after', game.vp) - if (game.active === DEM && modified_roll >= 4) { - game.phase = 1 - } else { - game.phase = 0 - if (game.active === DEM) {next_player()} - game.state = 'choose_power' - } - }, - take () { - push_undo() - //Find name of scoring card - let scoring_card = scoring_cards[countries.indexOf(game.pwr_struggle_in)] - permanently_remove(scoring_card) - take_power(game.pwr_struggle_in) - game.phase = 2 - }, - scoring () { - push_undo() - log_h2('Scoring') - score_country(game.pwr_struggle_in) - - //Check if The Tyrant is Gone occurs - if (game.table_cards.includes(97) && game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(54)) { - game.return_state = 'finish_scoring' - if (game.active !== DEM) { - next_player() - } - game.state = 'the_tyrant_is_gone' - } else { - game.state = 'finish_scoring' - } - }, -} - -states.choose_power = { - inactive: 'choose whether to remain in power.', - prompt () { - if (game.phase === 0) { - view.prompt = 'Choose whether to remain in power.' - gen_action('retain') - gen_action('surrender') - } else if (game.phase === 1) { - view.prompt = 'Proceed to scoring.' - gen_action('scoring') - } - }, - retain() { - push_undo() - retain_power(game.pwr_struggle_in) - game.phase = 1 - }, - surrender () { - push_undo() - take_power(game.pwr_struggle_in) - permanently_remove(game.played_card) - game.phase = 1 - }, - scoring () { - push_undo() - score_country(game.pwr_struggle_in) - - //Check if The Tyrant is Gone occurs - if (game.table_cards.includes(97) && game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(54)) { - game.return_state = 'finish_scoring' - if (game.active !== DEM) { - next_player() - } - game.state = 'the_tyrant_is_gone' - } else { - game.state = 'finish_scoring' - } - } -} -/* -states.score_country = { - inactive: `score country`, - prompt () { - view.prompt = 'Scoring: done.' - gen_action('done') - }, - done () { - reset_power() - /*if (game.return !== game.active) { - next_player()} - game.state = 'finish_scoring' - } -} -*/ - -states.the_tyrant_is_gone ={ - inactive: 'resolve The Tyrant is Gone.', - prompt() { - view.prompt = 'Play The Tyrant is Gone for the event.' - gen_action('event') - }, - event() { - if (game.active !== DEM) { - next_player() - } - if (game.round_player === DEM) { - game.return = COM - } else { - game.return = DEM - } - log_h3(`C97`) - game.vm_event = 97 - goto_vm(game.vm_event) - } -} - -states.finish_scoring ={ - inactive: 'finish scoring.', - prompt() { - view.prompt = 'End power struggle.' - gen_action('done') - } , - done() { - //console.log('game.return_state', game.return_state) - log_msg_gap('Power Struggle resolved') /*At this point log card dicarded or permanently removed? */ - if (game.persistent_events.includes(111)) { - game.state = 'new_years_eve_party' - return - } - if (check_vp()) { - return - } - reset_power() - end_round() - //game.state = 'end_round' - } -} - -// ======================================= END TURN STATES ========================================== - -states.end_turn_4_5_4 = { - inactive: 'verify held cards.', - prompt() { - view.prompt = 'End Turn: verify held cards.' - gen_action('check') - }, - check() { - log_h2('Verify held cards') - const dem_has_scoring_card = game.democrat_hand.some(card => scoring_cards.includes(card)) - const com_has_scoring_card = game.communist_hand.some(card => scoring_cards.includes(card)) - if (!dem_has_scoring_card && !com_has_scoring_card) { - log('No held scoring cards') - } - - if (dem_has_scoring_card && com_has_scoring_card) { - log('Both players have held scoring cards') - game.state = 'game_end_tie' - } - else if (dem_has_scoring_card) { - log('Democrat player has a held scoring card') - goto_game_over(COM, `${COM} won by held scoring card!`) - } - else if (com_has_scoring_card) { - log('Communist player has a held scoring card') - goto_game_over(DEM, `${DEM} won by held scoring card!`) - } - else if (game.persistent_events.includes(104)) { - log_h1(`New Year's Eve Party`) - game.vm_event = 104 - //Check if the Communist receives VP from The Tyrant is Gone - if (game.persistent_events.includes(97)) { - game.vp -= 2 - log(`Communist receives 2 VP from C97`) - } - game.persistent_events.push(111) - if (game.active !== DEM) { - next_player() - } - game.state = 'new_years_eve_party' - } - else if(game.turn === 10) { - clear_undo() - log_h2('Final Scoring') - - //Check if the Communist receives VP from The Tyrant is Gone - if (game.persistent_events.includes(97)) { - game.vp -= 2 - log(`Communist receives 2 VP from C97`) - } - game.state = 'final_scoring_held' - - } else { - game.return_state = '' - game.state = 'end_turn' - } - } -} - -states.end_turn = { - inactive: 'end the turn.', - prompt() { - view.prompt = 'End Turn: done.' - gen_action('done') - }, - done() { - new_turn() - } -} - -states.final_scoring_held = { - inactive: 'resolve final scoring.', - prompt() { - view.prompt = 'Final Scoring: Communist scores VP bonus for the number of countries they retain power.' - gen_action('bonus') - }, - bonus() { - // console.log('game.revolutions: ', game.revolutions) - const held_countries = game.revolutions.filter(value => value === false).length - let vp_gain = 4*held_countries - log(`Communist holds ${held_countries} countries: -${vp_gain} VP`) - game.vp -= 4*held_countries - game.temp = {'East_Germany': false, 'Poland': false, 'Czechoslovakia': false, 'Hungary': false, 'Romania': false, 'Bulgaria': false} - game.state = 'final_scoring' - } -} - -states.final_scoring = { - inactive: 'score countries.', - prompt() { - if (game.temp['East_Germany'] && game.temp['Poland'] && game.temp['Czechoslovakia'] && game.temp['Hungary'] && game.temp['Romania'] && game.temp['Bulgaria']) { - view.prompt = 'Final scoring: done.' - gen_action('end') - } else { - view.prompt = 'Choose a country to score:' - if (!game.temp['East_Germany']) {gen_action('east_germany')} - if (!game.temp['Poland']) {gen_action('poland')} - if (!game.temp['Czechoslovakia']) {gen_action('czechoslovakia')} - if (!game.temp['Hungary']) {gen_action('hungary')} - if (!game.temp['Romania']) {gen_action('romania')} - if (!game.temp['Bulgaria']) {gen_action('bulgaria')} - } - }, - east_germany() { - score_country('East_Germany') - game.temp['East_Germany'] = true - }, - poland() { - score_country('Poland') - game.temp['Poland'] = true - }, - czechoslovakia() { - score_country('Czechoslovakia') - game.temp['Czechoslovakia'] = true - }, - hungary() { - score_country('Hungary') - game.temp['Hungary'] = true - }, - romania() { - score_country('Romania') - game.temp['Romania'] = true - }, - bulgaria() { - score_country('Bulgaria') - game.temp['Bulgaria'] = true - }, - end() { - delete game.temp - if (game.vp > 0) { - goto_game_over(DEM, `${DEM} wins on Victory Point Track!`) - } else if (game.vp < 0) { - goto_game_over(COM, `${COM} wins on Victory Point Track!`) - } else if (game.vp === 0) { - goto_game_over('', `The game is tied!`) /*Not sure what to pass for result */ - } - } -} - -states.game_over = { - get inactive() { - return game.victory - }, - prompt() { - view.prompt = game.victory - }, -} - -// ========================== EVENT SPECIFIC STATES ================================= - -states.general_strike = { - inactive: 'discard a card.', - prompt() { - if (game.played_card === 0 ) { - view.prompt = 'General Strike: you must discard a card or play a Scoring Card.' - available_cards = game.communist_hand - for (let card of available_cards) { - gen_action_card(card) - } - } /*else if (game.phase >= 1) { - view.prompt = 'General Strike: done.' - gen_action('done') - } */ else if (game.played_card > 0 ) { - view.prompt = 'General Strike: roll a die.' - gen_action('roll') - } - }, - card (card) { - push_undo() - game.played_card = card - let find_card - find_card = game.communist_hand.indexOf(card) - game.communist_hand.splice(find_card, 1) - game.available_ops = get_card_ops(card) - if (scoring_cards.includes(card)) { - game.vm_event = card - log(`Played C${card} for the event`) - game.return_state = 'general_strike' - goto_vm(game.vm_event) - } else { - log(`Discarded C${cards[card].number}`) - } - }, - roll() { - clear_undo() - let roll = Math.floor(Math.random() * 6) + 1 - log(`Roll: D${roll}`) - - logi(`+${game.available_ops} ops`) - - let total = roll + game.available_ops - log(`Total: ${total}`) - - if (total > 5) { - log('The strike is over.') - permanently_remove(5) - game.persistent_events = game.persistent_events.filter(n => n !== 5) - } else { - log('The strike continues. Required 6 or more') - } - //game.phase = 1 - game.state = 'end_round' - }, /* - done () { - //end_round() - game.state = 'end_round' - }*/ -} - -states.honecker ={ - inactive: 'resolve Honecker.', - prompt() { - view.prompt = 'Honecker: you may take an extra action round.' - gen_action('extra') - gen_action('pass') - }, - extra() { - push_undo() - game.round++ - game.round_player = COM - game.persistent_events = game.persistent_events.filter(n => n !== 15) - game.state = 'choose_card' - }, - pass() { - log('C15: passed') - game.persistent_events = game.persistent_events.filter(n => n !== 15) - //end_round() - game.state = 'end_round' - } -} - -states.new_years_eve_party = { - get inactive() { - return `resolve ${clean_name(cards[104].name)}.` - }, - prompt() { - if (!game.is_pwr_struggle) { - view.prompt = `New Year's Eve Party: you may choose a country to have a final power struggle.` - if (!game.revolutions[0]) {gen_action('poland')} - if (!game.revolutions[1]) {gen_action('hungary')} - if (!game.revolutions[2]) {gen_action('east_germany')} - if (!game.revolutions[3]) {gen_action('bulgaria')} - if (!game.revolutions[4]) {gen_action('czechoslovakia')} - if (!game.revolutions[5]) {gen_action('romania')} - gen_action('pass') - } else { - view.prompt = `New Year's Eve Party: done.` - gen_action('end') - } - }, - east_germany() { - push_undo() - log('Chose to score East Germany') - game.vm_event = 42 - goto_vm(42) - }, - poland() { - push_undo() - log('Chose to score Poland') - game.vm_event = 22 - goto_vm(22) - }, - czechoslovakia() { - push_undo() - log('Chose to score Czechoslovakia') - game.vm_event = 55 - goto_vm(55) - }, - hungary() { - push_undo() - log('Chose to score Hungary') - game.vm_event = 23 - goto_vm(23) - }, - romania() { - push_undo() - log('Chose to score Romania') - game.vm_event = 95 - goto_vm(95) - }, - bulgaria () { - push_undo() - log('Chose to score Bulgaria') - game.vm_event = 43 - goto_vm(43) - }, - pass() { - push_undo() - log('No final power struggle') - if (game.vp > 0) { - goto_game_over(DEM, `New Year's Eve Party: ${DEM} wins on Victory Point Track!`) - } else if (game.vp < 0) { - goto_game_over(COM, `New Year's Eve Party: ${COM} wins on Victory Point Track!`) - } else if (game.vp === 0) { - goto_game_over('', `New Year's Eve Party: The game is tied!`) /*Not sure what to pass for result */ - } - }, - end() { - if (game.vp > 0) { - goto_game_over(DEM, `New Year's Eve Party: ${DEM} wins on Victory Point Track!`) - } else if (game.vp < 0) { - goto_game_over(COM, `New Year's Eve Party: ${COM} wins on Victory Point Track!`) - } else if (game.vp === 0) { - goto_game_over('', `CNew Year's Eve Party: The game is tied!`) /*Not sure what to pass for result */ - } - } -} - -states.stasi_end_round = { - inactive: 'choose next card due to Stasi.', - prompt() { - //console.log('game.stasi_card', game.stasi_card) - let available_cards = game.democrat_hand - if (available_cards.length === 0) { - view.prompt = 'Stasi: no cards remaining.' - gen_action('pass') - return - } - view.prompt = 'Stasi: you must select your next card to play.' - - for (let card of available_cards) { - gen_action_card(card) - } - }, - card(card) { - push_undo() - log_gap(`Democrat selected C${cards[card].number} as next card.`) - game.stasi_card = card - game.state = 'stasi_finish' - }, - pass() { - log('Stasi: Democrat has no remaining cards') - game.stasi_card = 0 - end_stasi_choose_card() - }, - end_round() { - push_undo() - if (game.stasi_card === 21) { - game.state = 'stasi_confirm' - } else { - end_stasi_choose_card() - } - } -} - -states.stasi_finish = { - inactive: 'choose next card due to Stasi.', - prompt() { - view.prompt = 'Stasi. Choose card: done.' - gen_action('done') - }, - done() { - push_undo() - if (game.stasi_card === 21) { - game.state = 'stasi_confirm' - } else { - end_stasi_choose_card() - } - } -} - -states.stasi_confirm = { - inactive: 'choose next card due to Stasi.', - prompt() { - if (game.stasi_card === 21 ) { - view.prompt = `If Common European Home selected, it must be played for Operations. Otherwise select the opponent's card instead.` - gen_action('done') - } - }, - done() { - game.playable_cards = game.playable_cards.filter( n => n !== 21) - end_stasi_choose_card() - } -} - -states.stasi_play_card = { - inactive: 'play a card.', - prompt () { /*Should get rid of the play card 'done' prompt for consistency with general play */ - /*if (game.played_card > 0) { - game.state = 'play_card' - view.prompt = 'Play card: done.' - gen_action("done"); - return;*/ - //} else - if (game.democrat_hand.length === 0) { - view.prompt = 'Stasi: you must pass.' - gen_action('pass') - } else { - view.prompt = `Stasi: you must play ${clean_name(cards[game.stasi_card].name)}.` - let available_cards = [game.stasi_card] - for (let card of available_cards) { - gen_action_card(card) - } - } - }, - card(card) { - push_undo() - //log_msg_gap(`Stasi: played C${card}`) - game.played_card = card - let find_card - find_card = game.democrat_hand.indexOf(card); - game.democrat_hand.splice(find_card, 1); - game.available_ops = get_card_ops(card) - - if (game.democrat_hand.includes(21) && cards[card].side === "C") { - game.state = 'stasi_resolve_common_european_home' - } else { - game.state = 'play_card' - } - - }, - pass () { - log('No cards remaining. Passed') - //end_round() - game.state = 'end_round' - }, - done () { - //game.stasi_card = 0 - if (game.democrat_hand.includes(21)) { - game.state = 'stasi_resolve_common_european_home' - } else { - game.state = 'play_card' - } - } -} - -states.stasi_resolve_common_european_home = { - inactive: 'play a card.', - prompt () { - view.prompt = `Do you wish to play ${clean_name(cards[game.played_card].name)} with Common European Home?` - gen_action('yes') - gen_action('no') - }, - yes() { - log(`Played with Common European Home`) - silent_discard(21) - game.vm_infl_to_do = true - game.vm_event_to_do = false - game.state = 'resolve_opponent_event' - }, - no() { - game.state = 'play_card' - } -} - - -// ==================== SUPPORTING STATE FUNCTIONS ============================= - - -function add_infl(space) { - push_undo() - //console.log('adding infl to', space) - //console.log('at start, event', game.persistent_events['austria_hungary_border_reopened'], 'ahbr', game.austria_hungary_border_reopened, 'tracker', game.austria_hungary_border_reopened_tracker) - //log(`Added 1 influence in %${space}`) - log_summary(`Added £ SP in %${space}`) - - //If AHBR - check AHBR conditions - if (game.persistent_events.includes(58)) { - if (spaces[space].country !== 'East_Germany'){ - game.austria_hungary_border_reopened_tracker = false - } - } - - // Check Genscher - if (game.persistent_events.includes(63) && game.active === DEM && spaces[space].country === 'East_Germany' && check_com_control(space)) { - game.available_ops-- - log_summary(`(-1 op due to C63)`) - } else if (check_opp_control(space)) { - game.available_ops -= 2 - //Check if Austria Hungary Border Reopened was used to place last SP in a controlled space in East Germany. If so, game.available_op will be negative - if (game.available_ops < 0) { - log_summary(`(Used +1 op from C58)`) - } - } else { - game.available_ops-- - } - - // Update influence values - if (game.active === COM) { - game.comInfl[space]++ - } else { - game.demInfl[space]++ - } - - // Check whether spaces are controlled - check_control_change(space) - - // Check Austria Hungary Border Reopened is true and condition has been met - if (game.available_ops === 0 && game.active === DEM && game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker) { - game.available_ops ++ - log('+1 op from C58') - game.austria_hungary_border_reopened_tracker = false - game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'East_Germany') - } - - // If only 1 IP remaining, may not place in opponent controlled spaces - - // Check for Genscher & Austria Hungary Border Reopened - - if (game.available_ops === 1) { - //console.log(`in Genscher / AHBR check, game.persistent_events['genscher']`, game.persistent_events['genscher']) - if (game.active === DEM) { - if (game.persistent_events.includes(63) || (game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker)) { - //console.log('in gensher subcheck - remove non-East German controlled ') - game.valid_spaces = game.valid_spaces.filter(n => !(check_opp_control(n) && spaces[n].country !== 'East_Germany')) - } else { - //console.log('remove all controlled spaces') - game.valid_spaces = game.valid_spaces.filter(n => !check_opp_control(n)) - } - } else { - //console.log('remove all dem controlled spaces') - game.valid_spaces = game.valid_spaces.filter(n => !check_opp_control(n)) - } - } - - //Clear valid spaces if no IP remaining. - if (game.available_ops <= 0 ) { - game.valid_spaces = [] - } -} - -function remove_infl(space) { - push_undo() - //log(`Removed 1 influence from %${space}.`) - log_summary(`Removed £ SP from %${space}.`) - - if (game.remove_opponent_infl === true) { - if (game.active === COM) { - game.demInfl[space]-- - if (game.demInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - } else { - game.comInfl[space]-- - if (game.comInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - } - check_control_change(space) - - } else { - if (game.active === COM) { - game.comInfl[space]-- - if (game.comInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - } else { - game.demInfl[space]-- - if (game.demInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - } - check_control_change(space) - } - game.available_ops-- -} - -function do_sc(space) { - clear_undo() - log_gap(`Support check: %${space}`) - - //Check Helsinki Final Act - - if (game.active === COM && game.persistent_events.includes(26) && (spaces[space].socio === 5 || spaces[space].socio === 6) ) { - log('+1 VP from C26') - game.vp ++ - if (check_vp()) { - game.state = 'game.over' - //console.log('after check_vp, game.state', game.state) - return - } - } - - // Continue with Support Check Logic - - let roll = Math.floor(Math.random() * 6) + 1 - log(`Roll: D${roll}`) - - /* - //Check if support check is being done with game.played_card or a subsequent card (e.g. Common European Home, Dash for the West, etc) - if (game.vm_event > 0) { - roll+= cards[game.vm_event].ops - log(`+${cards[game.vm_event].ops} from card ops`) - } - */ - // Check for the Crowd Turns Against Ceausescu - - //else - if (game.is_pwr_struggle) { - roll += game.vm_available_ops - logi(`+${game.vm_available_ops} from Ceausescu`) - } - - // Check if in Tiananmen Square Track Award - - else if (game.state === 'vm_tst_6_sc') { - roll += get_tst_6_ops() - roll += 2 - logi('+2 TST award') - } - else { - //let modifier = 0 - let card_ops = get_card_ops(this_card()) - - roll += card_ops - logi(`+${card_ops} from card ops`) - } - - if (game.support_check_modifier > 0) { - roll += game.support_check_modifier - logi(`+${game.support_check_modifier} from event`) - } - - // Events which modify SC rolls - //Tear Gas - if (game.active === COM && game.persistent_events.includes(30) && spaces[space].socio === 6) { - roll ++ - logi('+1 from C30') - permanently_remove(30) - game.persistent_events = game.persistent_events.filter(n => n !== 30) - } - //FRG Embassies - if (game.active === DEM && spaces[space].region === 'Eastern Europe' && game.persistent_events.includes(74)) { - roll++ - logi('+1 from C74') - } - //GrenzTruppen - if (game.active === DEM && spaces[space].country === 'East_Germany' && game.persistent_events.includes(59)) { - roll-- - logi('-1 from C59') - } - //Stand Fast - if ((game.active === COM && game.stand_fast === DEM && check_dem_control(space)) || (game.active === DEM && game.stand_fast === COM && check_com_control(space))){ - roll-- - logi('-1 from C100') - } - //Elena - if (game.active === DEM && game.persistent_events.includes(101) && spaces[space].country === 'Romania') { - roll-- - logi('-1 from C101') - } - //Austria Hungary Border Reopened - if (game.active === DEM && game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker) { - roll++ - logi(`+1 from C58`) - } - - // Continue with logic - check for adjacency - - // Events which affect adjacency - The Wall - - const adj = count_adj(space) - //console.log('adj', adj) - if (game.active === COM && game.persistent_events.includes(9) && spaces[space].country === 'East_Germany') { - logi('No adjacency for Democrats due to C9') - logi('C9 no longer in effect') - roll += adj.com_adj - if (adj.com_adj > 0) { - logi(`+${adj.com_adj} adjacency`) - } - game.persistent_events = game.persistent_events.filter(n => n !== 9) - - // Standard adjacency - } else { - if (adj.dem_adj > 0 || adj.com_adj > 0 ){ - if (game.active === DEM) { - roll += adj.dem_adj - roll -= adj.com_adj - if (adj.dem_adj > 0) { - logi(`+${adj.dem_adj} from adjacency`) - } - if (adj.com_adj > 0) { - logi(`-${adj.com_adj} from opponent adjacency`) - } - } else { - roll += adj.com_adj - roll -= adj.dem_adj - if (adj.com_adj > 0) { - logi(`+${adj.com_adj} from adjacency`) - } - if (adj.dem_adj > 0) { - logi(`-${adj.dem_adj} from opponent adjacency`) - } - } - } - - } - - // Support check calcs - log(`Modified total: ${roll}`) - const stability = spaces[space].stability - logi(`-${stability*2} (stability * 2)`) - const change_infl = Math.max(0, roll - stability*2) - if (change_infl > 0) { - log_msg_gap(`Change influence: ${change_infl} SP`) - if(game.active === DEM) { - if (change_infl > game.comInfl[space]) { - const residual = change_infl - game.comInfl[space] - game.comInfl[space] = 0 - game.demInfl[space] += residual - } else { - game.comInfl[space] -= change_infl - } - if (game.comInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space) - } - } else { - if (change_infl > game.demInfl[space]) { - const residual = change_infl - game.demInfl[space] - game.demInfl[space] = 0 - game.comInfl[space] += residual - } else { - game.demInfl[space] -= change_infl - } - if (game.demInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space) - } - } - check_control_change(space) - - } else { - log_msg_gap('Change influence: 0 SP') - } - if (game.active === COM && game.persistent_events.includes(39) && spaces[space].space_id === 66) { - log_msg_gap('+1 VP from C39') - game.vp++ - if (check_vp()) { - return - } - } - - // If Austria-Hungary Border Reopened used, all future support checks must be in East Germany - if (game.persistent_events.includes(58)){ - if (game.austria_hungary_border_reopened_tracker) { - game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'East_Germany') - } - } - game.selected_space = 0 - -} - -function valid_spaces_setup() { - game.valid_spaces = [] - let valid_spaces_set = new Set(); - //console.log('in vs setup, state', game.state) - for (let i =1 ; i <= 75 ; i++) { - space = spaces[i] - - if (game.state === 'com_init') { - infl = game.demInfl[i] - - if (infl === 0) { - valid_spaces_set.add(space.space_id); - } - } else if (game.state === 'dem_init') { - infl = game.comInfl[i] - if (infl === 0) { - valid_spaces_set.add(space.space_id); - } - } - } - // Convert the set to an array before returning - game.valid_spaces = Array.from(valid_spaces_set); - return game.valid_spaces; -} - -function valid_spaces_sc() { - let valid_spaces_set = new Set(); - //console.log('valid spaces sc, persistent events', game.persistent_events) - - for (let i = 1 ; i <= 75; i++) { - space = spaces[i] - - if (game.active === DEM) { - infl = game.comInfl[i] - if (infl !== 0 ) { - valid_spaces_set.add(space.space_id); - } - } else { - infl = game.demInfl[i] - if (infl !== 0 ) { - // Check Solidarity Legalised - if (game.persistent_events.includes(2) && space.space_id === 14) {continue} - - // Check Civic Forum - if (game.persistent_events.includes(90) && space.space_id === 30) {continue} - - // Check We Are the People - if (game.persistent_events.includes(48) && space.space_id === 9) {continue} - - //Check for Foreign Currency Debt Burden - if (game.persistent_events.includes(49) && space.country === game.foreign_currency_debt_burden) {continue} { - - valid_spaces_set.add(space.space_id); - - } - } - } - } - - - // Convert the set to an array before returning - game.valid_spaces = Array.from(valid_spaces_set); - - //Check for the Crown Turns Against Ceausescu - if (game.is_pwr_struggle && game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(54)) { - game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'Romania') - } - return game.valid_spaces; -} - -function valid_spaces_support_loss() { - let valid_spaces_set = new Set(); - for (let i = 1; i < game.demInfl.length; i++) { - //console.log('spaces.length', game.demInfl.length, 'i', i) - space = spaces[i] - if (game.active === DEM) { - infl = game.demInfl[i] - if (infl > 0 && space.country === game.pwr_struggle_in) { - valid_spaces_set.add(space.space_id); - } - } else { - infl = game.comInfl[i] - if (infl > 0 && space.country === game.pwr_struggle_in) { - valid_spaces_set.add(space.space_id); - } - } - } - - // Convert the set to an array before returning - game.valid_spaces = Array.from(valid_spaces_set); - return game.valid_spaces; -} -/* -function valid_spaces_support_falters() { - let valid_spaces_set = new Set(); - if (game.active === DEM) { - for (let piece of game.pieces) { - if (!piece) continue - let space = spaces.find(s => s && s.space_id === piece.space_id); - if (space && piece.comInfl > 0 && space.country === game.pwr_struggle_in) { - valid_spaces_set.add(space.space_id); - } - } - } else { - for (let piece of game.pieces) { - if (!piece) continue - let space = spaces.find(s => s && s.space_id === piece.space_id); - if (space && piece.demInfl > 0 && space.country === game.pwr_struggle_in) { - valid_spaces_set.add(space.space_id); - } - } - } - // Convert the set to an array before returning - game.valid_spaces = Array.from(valid_spaces_set); - return game.valid_spaces; -} - */ - -function valid_spaces_infl() { - /*if (game.state.startsWith('vm')) { - console.log('valid_spaces_infl called from VM') - } else { - console.log('valid_spaces_infl called not from VM') - }*/ - // Check if function is called from the VM or not, take relevant ops variable - let ops = game.state.startsWith('vm') ? game.vm_available_ops : game.available_ops; - - let valid_spaces_set = new Set(); - // Iterate over all spaces to find the ones with the player's influence - for (let i = 1; i < game.demInfl.length; i++) { - //piece = game.pieces[i] - space = spaces[i] - - let player_influence = game.active === COM ? game.comInfl[i] : game.demInfl[i]; - - // If the piece has the player's influence, add it and its adjacent spaces to the set - if (player_influence > 0) { - valid_spaces_set.add(space.space_id); - - // Check adjacency information - let adjacent_spaces = get_adjusted_adjacency(space.space_id) - - for (let adj_space_id of adjacent_spaces) { - //console.log('adj_space_id', adj_space_id) - if (adj_space_id) { - - const adj_piece = spaces[adj_space_id]; - //console.log('adjacent piece name', adj_piece.name_unique) - - // Check if the adjacent space is controlled by the opponent - const opponent_control = check_opp_control(adj_piece.space_id) - //console.log('controlled?', opponent_control) - - //Check for Genscher. Can always place in East Germany even with 1 op - if (game.active === DEM && adj_piece.country === 'East_Germany' && game.persistent_events.includes(63)){ - // console.log('space added with genscher') - valid_spaces_set.add(adj_piece.space_id) - } - - // Otherwise, only add the adjacent space if the available_ops >= 2 or the space is not controlled by the opponent - if (ops >= 2 || !opponent_control) { - valid_spaces_set.add(adj_piece.space_id) - } - } - } - } - } - // Convert the set to an array before returning - game.valid_spaces = Array.from(valid_spaces_set); - return game.valid_spaces; -} - -function valid_cards(player_hand, presence) { - const valid_cards_set= new Set(); - if (game.phase === 0) { - for (let c of player_hand) { - let card = power_cards.find(card => card && card.number === c); - if (card.number === 52) {continue} // Never add tactics fails - if (card.name === game.tactics_fails) {continue} //Cannot play the suit of Tactics Fails - if (card.socio === 0) { - valid_cards_set.add(card.number); - } else if (leaders.includes(card.socio) && presence[card.socio]) { - valid_cards_set.add(card.number); - } - } - } else if (game.phase === 1) { - for (let c of player_hand) { - let card = power_cards.find(card => card && card.number === c); - if (card.name === power_cards[game.played_power_card].name) { - valid_cards_set.add(card.number); - } else if (leaders.includes(card.socio) && presence[card.socio]) { - valid_cards_set.add(card.number); - } else if (card.number === 52) {valid_cards_set.add(card.number)} - } - } - game.valid_cards = Array.from(valid_cards_set); - return game.valid_cards; -} - -function do_valid_cards() { - let presence = check_presence(game.pwr_struggle_in) - if (game.active === DEM) { - valid_cards(game.dem_pwr_hand, presence.dem_leaders) - - } else { - valid_cards(game.com_pwr_hand, presence.com_leaders)} -} - -function count_adj(id) { - const space = spaces[id] - let dem_adj = 0 - let com_adj = 0 - - let adjacent_spaces = get_adjusted_adjacency(space.space_id) - - for (let adj_space_id of adjacent_spaces) { - if (adj_space_id) { - const adj_piece = spaces.find(piece => piece && piece.space_id === adj_space_id); - //console.log('adj_piece.space_id', adj_piece.space_id, 'space', space) - if (adj_piece && adj_piece.space_id !== space.space_id) { - if (check_dem_control(adj_piece.space_id)) { - //console.log('added DEM space', spaces[adj_piece.space_id].name) - dem_adj++ - } - if (check_com_control(adj_piece.space_id)) { - //console.log('added COM space', spaces[adj_piece.space_id].name) - com_adj++ - } - } - } - } - //console.log('dem_adj: ', dem_adj, 'com_adj: ', com_adj) - return {dem_adj, com_adj} -} - -/*function count_adj_worker(space_id) { - const space = spaces[space_id] - let dem_adj = 0 - let com_adj = 0 - - for (let adj_space_id of space.adjacent) { - if (adj_space_id) { - const adj_space = spaces[adj_space_id] - if (adj_space && adj_space.socio === 4) { - const adj_piece = game.pieces.find(piece => piece && piece.space_id === adj_space_id ); - if (adj_piece) { - if (adj_piece.demCtrl === 1 ) { - dem_adj++ - } - if (adj_piece.comCtrl === 1 ) { - com_adj++ - } - } - } - } - } - return {dem_adj, com_adj} -} */ - -function check_control(space_id) { - //console.log('in check control, space', spaces[space_id].name_unique) - if ( (game.comInfl[space_id] - game.demInfl[space_id]) >= spaces[space_id].stability) { - return true; - } else if ((game.demInfl[space_id] - game.comInfl[space_id]) >= spaces[space_id].stability) { - //console.log('true') - return true; - } else { - //console.log('false') - return false; - } -} - -function check_opp_control(space_id) { - if (spaces[space_id].country === 'Romania') { - //console.log('in check opp control, space', spaces[space_id].name_unique) - } - if (game.active === DEM && ((game.comInfl[space_id] - game.demInfl[space_id]) >= spaces[space_id].stability)) { - if (spaces[space_id].country === 'Romania') { - //console.log('control true') - } - return true; - } else if (game.active === COM && ((game.demInfl[space_id] - game.comInfl[space_id]) >= spaces[space_id].stability)) { - //console.log('true') - return true; - } else { - //console.log('false') - return false; - } -} - -function check_dem_control(space_id) { - if ((game.demInfl[space_id] - game.comInfl[space_id]) >= spaces[space_id].stability) { - return true; - } else { - return false; - } -} - -function check_com_control(space_id) { - if ((game.comInfl[space_id] - game.demInfl[space_id]) >= spaces[space_id].stability) { - return true; - } else { - return false; - } -} - -function do_tst_attempt() { - let roll = Math.floor(Math.random() * 6) + 1; - log(`Roll: D${roll}`); - - roll += game.available_ops - logi(`+${game.available_ops} from card ops`) - - // TIANANMEN SQUARE MODIFIERS - - if (game.active === DEM && game.dem_tst_attempted === 1 || game.active === COM && game.com_tst_attempted === 1) { - roll ++; - logi('+1 from previous TST attempts') - } - if (game.active === DEM && game.dem_tst_position >= 1 && game.com_tst_position === 0) { - roll ++ - logi('+1 from TST award') - } - if (game.active === COM && game.com_tst_position >= 1 && game.dem_tst_position === 0) { - roll ++ - logi('+1 from TST award') - } - if ((game.active === DEM && cards[game.played_card].side === 'D') || (game.active === COM && cards[game.played_card].side === 'C')) { - roll ++; - logi('+1 for playing own card'); - } - if (game.active === COM && game.persistent_events.includes(53)) { - roll ++ - logi('+1 from C53') - } - log(`Modified total: ${roll}`) - - // TIANANMEN SQUARE ATTEMPT - game.return = game.active - game.return_state = 'tiananmen_square_attempt_done' - if (game.active === DEM) { - game.dem_tst_attempted_this_turn = 1 - if (roll >= dem_tst_req[game.dem_tst_position]) { - log(`${dem_tst_req[game.dem_tst_position]} required: success`) - game.dem_tst_position++ - game.dem_tst_attempted = 0 - - //Check if they have reached box 7 or 8 first - if (game.dem_tst_position === 7 && game.com_tst_position < 7) { - game.tst_7 = false - } - if (game.dem_tst_position === 8 && game.com_tst_position < 8) { - game.tst_8 = false - } - - //Check if they have caught up to box 7 or 8 - if (game.dem_tst_position >= 7 && game.com_tst_position >= 7) { - delete game.tst_7 - } - if (game.dem_tst_position >= 8 && game.com_tst_position >= 8) { - delete game.tst_8 - } - - //Check if TST events occur - if (game.dem_tst_position === 3 && game.com_tst_position < 3) {game.vm_event = 203} - else if (game.dem_tst_position === 4 && game.com_tst_position < 4) {game.vm_event = 204} - game.state = 'tiananmen_square_attempt_success' - } else { - log(`${dem_tst_req[game.dem_tst_position]} required: fail`) - game.dem_tst_attempted = 1 - game.state = 'tiananmen_square_attempt_fail' - } - } else { - game.com_tst_attempted_this_turn = 1 - if (roll >= com_tst_req[game.com_tst_position]) { - log(`${com_tst_req[game.com_tst_position]} required: success`) - game.com_tst_position++ - game.com_tst_attempted = 0 - - //Check if they have reached box 7 or 8 first - if (game.com_tst_position === 7 && game.dem_tst_position < 7) { - game.tst_7 = false - } - if (game.com_tst_position === 8 && game.dem_tst_position < 8) { - game.tst_8 = false - } - - //Check if they have caught up to box 7 or 8 - if (game.com_tst_position >= 7 && game.dem_tst_position >= 7) { - delete game.tst_7 - } - if (game.com_tst_position >= 8 && game.dem_tst_position >= 8) { - delete game.tst_8 - } - - //Check if TST events occur - if (game.com_tst_position === 3 && game.dem_tst_position < 3) {game.vm_event = 203} - else if (game.com_tst_position === 4 && game.dem_tst_position < 4) {game.vm_event = 204} - game.state = 'tiananmen_square_attempt_success' - } else { - log(`${com_tst_req[game.com_tst_position]} required: fail`) - game.com_tst_attempted = 1 - game.state = 'tiananmen_square_attempt_fail' - } - } -} - -function check_presence(country) { - - let dem_spaces = 0; - let com_spaces = 0; - let dem_battlegrounds = 0; - let com_battlegrounds = 0; - let dem_leaders = {1: false, 4: false, 5: false, 6: false, 7: false}; - let com_leaders = {1: false, 4: false, 5: false, 6: false, 7: false}; - - - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - if (space.country === country) { - - if (check_dem_control(i)) { - dem_spaces++; - if (space.battleground === 1) { - dem_battlegrounds++; - } - if (leaders.includes(space.socio)) { - dem_leaders[space.socio] = true; - } - } - if (check_com_control(i)) { - com_spaces++; - if (space.battleground === 1) { - com_battlegrounds++; - } - if (leaders.includes(space.socio)) { - com_leaders[space.socio] = true; - } - } - } - } - - // Determine domination - let dem_domination = dem_battlegrounds > com_battlegrounds && dem_spaces > com_spaces && dem_spaces - dem_battlegrounds > 0; - let com_domination = com_battlegrounds > dem_battlegrounds && com_spaces > dem_spaces && com_spaces - com_battlegrounds > 0; - - // Determine control - let total_battlegrounds = battlegrounds(country); - let dem_control = dem_battlegrounds === total_battlegrounds && dem_spaces > com_spaces; - let com_control = com_battlegrounds === total_battlegrounds && com_spaces > dem_spaces; - - return { - dem_spaces: dem_spaces, - com_spaces: com_spaces, - dem_battlegrounds: dem_battlegrounds, - com_battlegrounds: com_battlegrounds, - dem_domination: dem_domination, - com_domination: com_domination, - dem_control: dem_control, - com_control: com_control, - dem_leaders: dem_leaders, - com_leaders: com_leaders - }; -} - -function battlegrounds(country) { - let battlegrounds = 0; - if (country === "Hungary") { - battlegrounds = 4 - } else if (country === "Bulgaria") { - battlegrounds = 5 - } else { - battlegrounds = 6 - } - return battlegrounds; -} - -function take_power(country) { - - log(`Democrat takes power in ${game.pwr_struggle_in}`) - game.revolutions[find_country_index(country)] = true - game.times_held[find_country_index(country)] = 1 - -} - -function retain_power(country){ - game.times_held[find_country_index(country)]++ - let vp_gain = get_value(country)*game.times_held[find_country_index(country)] - log(`Chooses to retain power`) - log(`-${vp_gain} VP`) - game.vp -= vp_gain -} - -function score_country(country) { - log_h3(`Scoring: ${country}`) - -//Get scoring values - let value_presence = get_value(country) - let value_domination = value_presence*2 - let value_control - if (country !== "Hungary") { - value_control = value_presence*3 - } else { - value_control = 4 - } -//Log for scoring - - let dem_vp = 0 - let com_vp = 0 - //Check for presence - let presence = check_presence(country) -// console.log('presence: ', presence) - - //If one side has domination or control - if (presence.dem_control || presence.dem_domination) { - log(`Democrat:`) - if (presence.dem_control) { - log(`Control: +${value_control} VP`) - dem_vp += value_control - } - else { - log(`Domination: +${value_domination} VP`) - dem_vp += value_domination - } - log(`Battlegrounds: +${presence.dem_battlegrounds} VP`) - dem_vp += presence.dem_battlegrounds - log(`Total: +${dem_vp} VP`) - - log_gap('Communist:') - if (presence.com_spaces > 0) { - log(`Presence: -${value_presence} VP`) - com_vp -= value_presence - if (presence.com_battlegrounds >0) { - log(`Battlegrounds: -${presence.com_battlegrounds} VP`) - com_vp -= presence.com_battlegrounds - } - log(`Total: ${com_vp} VP`) - } else { - log('No presence: 0 VP') - } - - } - else if (presence.com_control || presence.com_domination) { - log('Communist:') - if (presence.com_control) { - log(`Control: -${value_control} VP`) - com_vp -= value_control - } - else { - log(`Domination: -${value_domination} VP`) - com_vp -= value_domination - } - log(`Battlegrounds: -${presence.com_battlegrounds} VP`) - com_vp -= presence.com_battlegrounds - log(`Total: ${com_vp} VP`) - - log_gap('Democrat:') - if (presence.dem_spaces > 0) { - log(`Presence: +${value_presence} VP`) - dem_vp += value_presence - if (presence.dem_battlegrounds > 0) { - log(`Battlegrounds: +${presence.dem_battlegrounds} VP`) - dem_vp += presence.dem_battlegrounds - } - log (`Total: +${dem_vp} VP`) - } else { - log('No presence: 0 VP') - } - - } - - //Otherwise, presence and battlegrounds - else { - log("No domination or control") - log_gap(`Communist:`) - if (presence.com_spaces > 0) { - log(`Presence: -${value_presence} VP`) - com_vp -= value_presence - if (presence.com_battlegrounds > 0) { - log(`Battlegrounds: -${presence.com_battlegrounds} VP`) - com_vp -= presence.com_battlegrounds - } else { - log('No battlegrounds') - } - log(`Total: ${com_vp} VP`) - } else { - log('No presence: 0 VP') - } - log_gap('Democrat:') - if (presence.dem_spaces > 0) { - log(`Presence: +${value_presence} VP`) - dem_vp += value_presence - if (presence.dem_battlegrounds > 0) { - log(`Battlegrounds: +${presence.dem_battlegrounds} VP`) - dem_vp += presence.dem_battlegrounds - } else { - log('No battlegrounds') - } - log(`Total: +${dem_vp} VP`) - } else { - log('No presence: 0 VP') - } - } - - -//Calculate change VP - /*let dem_vp = 0 - if (presence.dem_spaces > 0) {dem_vp += value_presence} - if (presence.dem_domination) {dem_vp += value_presence} - if (presence.dem_control && country !== "Hungary") { - dem_vp += value_control - } - else if (presence.dem_control && country === "Hungary") {dem_vp += 2} - dem_vp += presence.dem_battlegrounds - - let com_vp = 0 - if (presence.com_spaces > 0) {com_vp += value_presence} - if (presence.com_domination) {com_vp += value_presence} - if (presence.com_control && country !== "Hungary") {com_vp += value_presence} - else if (presence.com_control && country === "Hungary") {com_vp += 2} - com_vp += presence.com_battlegrounds */ - let change_vp = dem_vp + com_vp - game.vp += change_vp - if (change_vp > 0 ) { - log_gap(`Final change VP: +${change_vp} VP`) - } else { - log_gap(`Final change VP: ${change_vp} VP`) - } -} - -function get_value(country) { - let value - if (country === "East_Germany" || country === "Poland") {value = 3} - else if (country === "Czechoslovakia" || country === "Romania") {value = 2} - else value = 1 - return value -} - -function get_end_infl_prompt() { - view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` - if (!game.vm_infl_to_do) { - gen_action('end_round') - } else { - gen_action('done') - } -} - -function permanently_remove(card) { - //console.log('permanently removing card:', card) - if (game.strategy_removed.includes(card)) {return} - //log_msg_gap(`C${cards[card].number} permanently removed`) - remove_from_discard(card) - - card_index = game.table_cards.indexOf(card) - if (card_index !== -1) { - //console.log('sub 2 called') - game.table_cards.splice(card_index, 1) - } - game.strategy_removed.push(card) - //console.log('game.strategy_removed', game.strategy_removed) -} - -function check_vp() { - if (game.vp >= 20) { - goto_game_over(DEM, `${DEM} won an Automatic Victory!`) - //console.log('after goto_game_over, game.state', game.state) - return true - } else if(game.vp <= -20) { - goto_game_over(COM, `${COM} won an Automatic Victory!`) - return true - } - return false -} - -function game_over() { - if (game.vp >= 20 || game.vp <= -20) { - return true - } else { return false} -} - -function goto_game_over(result, victory) { - game.state = "game_over" - game.active = "None" - game.result = result - game.victory = victory - log_h1("Game Over") - log(game.victory) - //console.log('game over, game.state', game.state) - return - -} - -function reset_austria_hungary_border_reopened() { - //game.austria_hungary_border_reopened_checked = false - game.austria_hungary_border_reopened_tracker = false -} - -function end_stasi_choose_card() { - game.round_player = COM - game.round ++ - log_h2(`Action Round ${game.round}`) - next_player() - game.valid_spaces = [] - if (game.persistent_events.includes(5)) { - log_h3('C5') - game.state = 'general_strike' - } else { - game.state = 'choose_card' - } -} - -function check_reformer() { - if (game.dem_tst_position !== game.com_tst_position) { - if (!game.playable_cards.includes(67)) { - game.playable_cards.push(67) - } - } else { - game.playable_cards = game.playable_cards.filter(n => n !== 67) - } - -} - -function count_scoring_cards() { - let scoring_check - if (game.active === DEM) { - scoring_check = game.democrat_hand.filter(card => scoring_cards.includes(card)).length - } else { - scoring_check = game.communist_hand.filter(card => scoring_cards.includes(card)).length - } - return scoring_check -} - -function select_card(card){ - game.played_card = card - game.temp = 0 - let find_card - if (game.active === COM) { - find_card = game.communist_hand.indexOf(card) - game.communist_hand.splice(find_card, 1) - } else { - find_card = game.democrat_hand.indexOf(card) - game.democrat_hand.splice(find_card, 1) - } - game.available_ops = get_card_ops(card) - - //Check Ligachev - if (game.active === DEM && game.persistent_events.includes(99) && card !== 14) { - log('-3 VP from C99') - game.vp -= 3 - if (check_vp()) { - return - } - game.persistent_events = game.persistent_events.filter(n => n !== 99) - } - game.state = 'play_card' - //console.log('game.state', game.state) -} - -function find_event(card) { - return variable_events.indexOf(card) -} - -function is_auto_resolve(card) { - - let ceausecu_events = [10, 41, 101, 107] - - if (card === 97) { - if (!game.persistent_events.includes(54)) { - return true - } - } - else if (ceausecu_events.includes(card) && game.persistent_events.includes(97)) { - return true - } - else if (card === 87 && !game.persistent_events.includes(86)) { - return true - } - else if (auto_resolve_events.includes(card)) { - return true - } else { - return false - } -} - -function get_events(card){ - if (event_is_playable(card)) { - if (cards[card].side === 'D') { - if (game.active === DEM) {gen_action('event')} - if (game.active === COM) {gen_action('opp_event')} - } - else if (cards[card].side === 'C') { - if (game.active === COM) {gen_action('event')} - if (game.active === DEM) {gen_action('opp_event')} - } - else { - gen_action('event') - } - } -} - -function event_is_playable(card) { -// console.log('game.stasi_card', game.stasi_card, 'card', card) - //Reformer never playable here - if (card === 67) { - return false - } - //Check for Common European Hmme under Stasi - else if (game.stasi_card === 21 && card === 21 && game.active === DEM) { - return false - } - //Check for The Chinese Solution - else if (game.com_tst_position === 8 && card === 96) { - return true - } - //Then check normally - else if (cards[card].playable) { - return true - } else if (game.playable_cards.includes(card)) { - return true - } else { - return false - } -} - -function get_card_ops(card) { - let ops = 0 - - if (card) { - ops = cards[card].ops - } - if (game.persistent_events.includes(25) && game.active === COM) { - if(game.state === 'choose_card' || game.state === 'stasi_play_card') { - log('+1 op from C25') - } - ops ++ - } - if (game.persistent_events.includes(50) && game.active === DEM) { - if(game.state === 'choose_card' || game.state === 'stasi_play_card' || game.state === 'vm_laszlo_tokes') { - log('+1 op from C50') - } - ops ++ - } - - if ((game.active === DEM && game.dem_tst_position >= 2 && game.com_tst_position <= 1 && cards[card].ops === 1) || (game.active === COM && game.com_tst_position >=2 && game.dem_tst_position <= 1 && cards[card].ops === 1)) { - if(game.state === 'choose_card' || game.state === 'stasi_play_card') { - log('+1 op from Tiananmen Square Track') - } - ops ++ - } - - if ((game.active === DEM && game.prudence && game.prudence.DEM !== 0)) { - if(game.state === 'choose_card' || game.state === 'stasi_play_card' || game.state === 'vm_laszlo_tokes') { - if (ops > 2) { - log(`${pluralize(game.prudence.DEM,'op')} from C8`) - } else { - if (ops > 1) { - log(`-1 op from C8`) - } - } - } - ops += game.prudence.DEM - - if (ops < 1) { - ops = 1 - } - } - - if (game.active === COM && game.prudence && game.prudence.COM < 0) { - if(game.state === 'choose_card') { - if (ops > 2) { - log(`${pluralize(game.prudence.COM,'op')} from C8`) - } else if (ops > 1) { - log(`-1 op from C8`) - } - } - ops += game.prudence.COM - if (ops < 1) { - ops = 1 - } - } return ops -} - -function get_tst_6_ops() { - let ops = 0 - - if (game.persistent_events.includes(25) && game.active === COM) { - log('+1 op from C25') - ops ++ - } - if (game.persistent_events.includes(50) && game.active === DEM) { - log('+1 op from C50') - ops ++ - } - - if ((game.active === DEM && game.prudence && game.prudence.DEM !== 0)) { - if (ops > 0) { - log(`${pluralize(game.prudence.DEM,'op')} from C8`) - } else { - log(`-1 op from C8`) - } - - ops += game.prudence.DEM - - if (ops < -1) { - ops = -1 - } - } - - if (game.active === COM && game.prudence && game.prudence.COM < 0) { - - if (ops > 0) { - log(`${pluralize(game.prudence.COM,'op')} from C8`) - } else { - log(`-1 op from C8`) - } - - ops += game.prudence.COM - if (ops < -1) { - ops = -1 - } - } - return ops -} - -function finish_the_wall() { - if (game.the_wall_must_go['dem_wins'] === 2) { - game.persistent_events.push(86) - log('+3 VP') - game.vp += 3 - if (check_vp()) { - return - } - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - if (space.country === 'East_Germany' && game.comInfl[i] > 0){ - game.valid_spaces.push(space.space_id) - } - } - if (!game.vm_infl_to_do) { - if (game.round_player === DEM) { - game.return = COM - } else { - game.return = DEM - } - } - if (game.active === DEM) {next_player()} - vm_next () - } else { - permanently_remove(86) - delete game.the_wall_must_go - vm_return() - } -} - - -// =========== MOVING THROUGH TURNS ============ - -function end_round() { -// console.log('end round, game.persistent_events.includes(13)', game.persistent_events.includes(13)) - //Check if the game is over! - if (game.state === 'game_over') { - // console.log('in end') - return} - - //Check if the card has been removed or played to table, and if a card has been not been played. If not, discard. - if (!game.strategy_removed.includes(game.played_card) && !game.table_cards.includes(game.played_card) && game.played_card > 0) { - game.strategy_discard.push(game.played_card) - } - - //Reset - game.played_card = 0 - game.temp = 0 - game.vm_event = 0 - game.phase = 0 - game.remove_opponent_infl = false - game.is_pwr_struggle = false - game.vm_infl_to_do = false /*Can get rid of this and use game.return_state? */ - game.vm_event_to_do = false - game.vm_active_country = '' - game.return_state = '' - game.discard = false - game.return = '' - game.valid_cards = [] - game.valid_spaces = [] - check_common_european_home() - //game.playable_cards[find_event(21)] = true - reset_austria_hungary_border_reopened() /*This should be redundant! */ - - - // Check for duplicate card entries - let card_check - if (game.samizdat_card > 0) { - card_check = [...game.strategy_deck, ...game.strategy_discard, ...game.strategy_removed, ...game.table_cards, ...game.communist_hand, ... game.democrat_hand, game.samizdat_card]; - } else { - card_check = [...game.strategy_deck, ...game.strategy_discard, ...game.strategy_removed, ...game.table_cards, ...game.communist_hand, ... game.democrat_hand]; - } - - function check_duplicates(array) { - return new Set(array).size !== array.length; - } - - function find_duplicates(array) { - const duplicates = array.filter((item, index) => array.indexOf(item) !== index); - return [...new Set(duplicates)]; - } - - //console.log('game.strategy_deck', game.strategy_deck, 'game.strategy_discard', game.strategy_discard, 'game.strategy_removed', game.strategy_removed, 'game.table_cards', game.table_cards, 'game.communist_hand', game.communist_hand, 'game.democrat_hand', game.democrat_hand) - - if (check_duplicates(card_check)) { - console.log('card check', card_check) - const duplicates = find_duplicates(card_check) - console.log('game.strategy_deck', game.strategy_deck, 'game.strategy_discard', game.strategy_discard, 'game.strategy_removed', game.strategy_removed, 'game.table_cards', game.table_cards, 'game.communist_hand', game.communist_hand, 'game.democrat_hand', game.democrat_hand) - throw new Error(`Duplicate cards detected: ${duplicates.join(', ')}`) - } - //console.log('cards in game', card_check.length) - card_check = card_check.sort((a, b) => a - b) - //console.log('cards in game', card_check) - if (game.turn <= 3) { - if (card_check.length !== 40) { - throw new Error(`Wrong number of cards: ${card_check.length}`) - } - } else if (game.turn <=7) { - if (card_check.length !== 81) { - throw new Error(`Wrong number of cards: ${card_check.length}`) - } - } else if (card_check.length !== 110) { - throw new Error(`Wrong number of cards: ${card_check.length}`) - } - - - - //console.log('game.dem_tst_position ', game.dem_tst_position , 'game.com_tst_position ', game.com_tst_position ) - //Check if the Reformer is playable - check_reformer() - - // Check if last round and if so resolve end turn events - if (game.round_player === DEM && game.round === 7) { - if(game.persistent_events.includes(15)) { - if (game.active !== COM) { - next_player() - } - game.state = 'honecker' - return - } - else if (game.dem_tst_position >= 6 && game.com_tst_position <= 5) { - log_h2('Tiananmen Square Track Award') - if (game.active !== DEM) { - next_player() - } - game.return = game.active - clear_undo() - game.return_state = 'end_turn_4_5_4' - goto_vm(206) - return - } else if (game.com_tst_position >= 6 && game.dem_tst_position <= 5) { - log_h2('Tiananmen Square Track Award') - if (game.active !== COM) { - next_player() - } - game.return = game.active - clear_undo() - game.return_state = 'end_turn_4_5_4' - goto_vm(206) - return - } - else { - clear_undo() - game.state = 'end_turn_4_5_4' - return - } - } - - // Resolve end action round - //Stasi check - if(game.round_player === COM && game.persistent_events.includes(13)) { - //If in Honecker, turn ends - if (game.round === 8) { - clear_undo() - game.state = 'end_turn_4_5_4' - return - } - //Otherwise go to Stasi - game.round_player = DEM - if (game.active !== DEM) { - next_player() - } else { - log_h3('Democratic Action Round') - - } - if (game.democrat_hand.includes(game.stasi_card)) { - log_h3('C13') - game.state = 'stasi_play_card' - } else { - game.stasi_card = 0 - game.state = 'choose_card' - } - return - } - //Check if in extra Action Round - else if (game.round_player === COM && game.round === 8) { - clear_undo() - game.state = 'end_turn_4_5_4' - return - } - //Normal round end - else if (game.round_player===COM) { - game.round_player = DEM - if (game.active !== DEM) { - next_player() - } else { - log_h3('Democratic Action Round') - } - game.state = 'choose_card' - return - } - if (game.round_player === DEM) { - // console.log('checking stasi', game.persistent_events.includes(13)) - if(game.persistent_events.includes(13)) { - // console.log('stasi sub function') - if (game.active !== DEM) { - next_player() - } - log_h3('C13') - game.state = 'stasi_end_round' - return - } else if(game.round_player === DEM && game.persistent_events.includes(5)){ - game.state = 'general_strike' - game.round ++ - log_h2(`Action Round ${game.round}`) - game.round_player = COM - if (game.active !== COM) { - next_player() - } - log_h3('C5') - return - } else { - game.state = 'choose_card' - game.round_player = COM - game.round ++ - log_h2(`Action Round ${game.round}`) - if (game.active !== COM) { - next_player() - } - } - } - //game.state = 'choose_card' Does this do anything any more? -} - -/* -function end_turn(){ - /*End Turn sequence - TST support check - Verify held cards - New Year's Eve Party - Advance Turn Marker - -// CHECK FOR OPTIONAL SUPPORT CHECK - if (game.dem_tst_position >=6 && game.com_tst_position <= 5) { - if (game.active !== DEM) { - next_player_() - } - game.state = 'tst_support_check' - } - if (game.com_tst_position >=6 && game.dem_tst_position <= 5) { - if (game.active !== COM) { - next_player_() - } - game.state = 'tst_support_check' - } - - -//CHECK HELD CARDS - -} */ - -function new_turn() { - clear_undo() - game.turn ++ - game.round = 1 - game.valid_spaces=[] - game.active = COM - game.round_player = COM - game.dem_tst_attempted_this_turn = 0 - game.com_tst_attempted_this_turn = 0 - if (game.tst_7) {game.tst_7 = false} - if (game.tst_8) {game.tst_8 = false} - - //Remove events that only last one turn - game.persistent_events = game.persistent_events.filter(n => n !== 25) /*Perestroika*/ - game.persistent_events = game.persistent_events.filter(n => n !== 50) /*Sinatra Doctrine*/ - game.persistent_events = game.persistent_events.filter(n => n !== 13) /*Stasi*/ - game.persistent_events = game.persistent_events.filter(n => n !== 15) /*Honecker*/ - delete game.prudence - delete game.stasi_card - - //Austria Hungary Border Reopened - if (game.persistent_events.includes(58)) { - game.persistent_events = game.persistent_events.filter(n => n !== 58) - delete game.austria_hungary_border_reopened_tracker - log(`C58 no longer in effect`) - //permanently_remove(58) - } - //Elena - if (game.persistent_events.includes(101)) { - game.persistent_events = game.persistent_events.filter(n => n !== 101) - log(`C101 no longer in effect`) - //permanently_remove(101) - } - //GrenzTruppen - if (game.persistent_events.includes(59)) { - game.persistent_events = game.persistent_events.filter(n => n !== 59) - log(`C59 no longer in effect`) - //permanently_remove(59) - } - //Foreign Currency Debt Burden - if (game.persistent_events.includes(49)) { - game.persistent_events = game.persistent_events.filter(n => n !== 49) - delete game.foreign_currency_debt_burden - log(`C49 no longer in effect`) - //permanently_remove(49) - } - //FRG Embassies - if (game.persistent_events.includes(74)) { - game.persistent_events = game.persistent_events.filter(n => n !== 74) - log(`C74 no longer in effect`) - discard_from_table(74) - permanently_remove(74) - } - //Genscher - if (game.persistent_events.includes(63)) { - game.persistent_events = game.persistent_events.filter(n => n !== 63) - log(`C63 no longer in effect`) - discard_from_table(63) - permanently_remove(63) - } - //Stand Fast - if (game.persistent_events.includes(100)) { - game.persistent_events = game.persistent_events.filter(n => n !== 100) - delete game.stand_fast - log(`C100 no longer in effect`) - //permanently_remove(100) - } - - if (game.samizdat_card > 0 ) { - game.democrat_hand.push(game.samizdat_card) - delete game.samizdat_card - } - - log_h1("Turn " + game.turn) - - if (game.turn === 4) { - add_midyear() - } - if (game.turn === 8) { - add_lateyear() - } - if (game.turn > 1) { - if (game.persistent_events.includes(65)) { - game.com_hand_limit = 7 - log('Communist draws 7 cards due to C65') - //permanently_remove(65) - game.persistent_events = game.persistent_events.filter(n => n !== 65) - } - //console.log('deck', game.strategy_deck) - //console.log('game.com_hand_limit', game.com_hand_limit, 'communist hand before draw', game.communist_hand) - draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.dem_hand_limit, game.com_hand_limit) - game.com_hand_limit = 8 - //console.log('communist hand after draw', game.communist_hand) - - } - - //Check if TST effects need to be resolved - if (game.dem_tst_position >=5 && game.com_tst_position <= 4) { - log_h2('Tiananmen Square Track award') - if(game.active !== DEM) { next_player() } - for (let card of game.democrat_hand) { - if (scoring_cards.includes(card)) continue - game.valid_cards.push(card) - } - game.state = 'tst_goddess' /* Goddess only name of Democrat bonus, not Communist*/ - return - } - else if (game.com_tst_position >=5 && game.dem_tst_position <= 4) { - log_h2('Tiananmen Square Track award') - if(game.active !== COM) { next_player() } - for (let card of game.communist_hand) { - if (scoring_cards.includes(card)) continue - game.valid_cards.push(card) - } - game.state = 'tst_goddess' - } else { - log_h2("Action Round " + game.round) - log_side() - //console.log('in start new AR call, game.active', game.active) - if (game.persistent_events.includes(5)) { - log_h3('C5') - game.state = 'general_strike' - } - else { - game.state = 'choose_card' - } - } -} - -function next_player() { - clear_undo() - //console.log('next player called') - if (game.active === DEM) - game.active = COM - else - game.active = DEM - - log_side() -} - -function change_player() { - clear_undo() - //console.log('next player called') - if (game.active === DEM) - game.active = COM - else - game.active = DEM -} - -function find_space_index(name_unique) { - return spaces.findIndex(space => space && space.name_unique === name_unique) -} - -function find_country_index(country) { - return countries.indexOf(country) -} - -function draw_deck(deck) { - return deck.filter(card => card && card.period === 1).map(card => card.number) -} - -function draw_cards(deck, democrat_hand, communist_hand, dem_hand_limit, com_hand_limit) { - //console.log('game.valid_cards at start of draw cards: ', game.valid_cards) - let turn = 'communist'; // Start with the communist player - //console.log('game.strategy_deck', game.strategy_deck) - //console.log('deck', deck, 'democrat_hand', democrat_hand, 'communist_hand', communist_hand, 'dem_hand_limit', dem_hand_limit, 'com_hand_limit', com_hand_limit) - while (democrat_hand.length < dem_hand_limit || communist_hand.length < com_hand_limit) { - //console.log('deck.length: ', deck.length) - //console.log('discard.length', game.strategy_discard ) - if (deck.length === 0) { - log_h3('--- Reshuffle ---') - - deck.push(...game.strategy_discard) - game.strategy_discard = [] - } - - else if (turn === 'communist' && communist_hand.length < com_hand_limit) { - communist_hand.push(draw_card(deck)); - //console.log('game.valid_cards after communist draw: ', JSON.stringify(game.valid_cards)); - turn = 'democrat'; - } else if(turn === 'communist' && communist_hand.length === com_hand_limit) { - turn = 'democrat'; - } - else if (turn === 'democrat' && democrat_hand.length < dem_hand_limit) { - democrat_hand.push(draw_card(deck)); - //console.log('democrat_hand: ', democrat_hand) - - //console.log('game.valid_cards after democrat draw: ', JSON.stringify(game.valid_cards)); - turn = 'communist'; - } - else if (turn === 'democrat' && democrat_hand.length === dem_hand_limit) { - turn = 'communist'; - } - } - - clear_undo() -} - -function draw_card(deck) { - //console.log('draw card called with:', deck) - //console.log('game.strategy_deck before', game.strategy_deck) - if (deck.length === 0) { - log_h3('--- Reshuffle ---') - - deck.push(...game.strategy_discard) - game.strategy_discard = [] - } - const randomIndex = Math.floor(Math.random() * deck.length) - //console.log('card chosen:', randomIndex) - //console.log('game.strategy_deck after', game.strategy_deck) - return deck.splice(randomIndex, 1)[0]; -} - -function discard(card) { - //console.log('in discard(card)') - let find_card - if (!game.is_pwr_struggle) { - - if (game.active === COM) { - find_card = game.communist_hand.indexOf(card) - game.communist_hand.splice(find_card, 1) - } else { - find_card = game.democrat_hand.indexOf(card) - game.democrat_hand.splice(find_card, 1) - } - if (!game.strategy_discard.includes(card)) { - game.strategy_discard.push(card) - log(`Discarded C${cards[card].number}`) - } - } else if (game.is_pwr_struggle) { - if (game.active === COM) { - find_card = game.com_pwr_hand.indexOf(card); - game.com_pwr_hand.splice(find_card, 1); - } else { - find_card = game.dem_pwr_hand.indexOf(card); - game.dem_pwr_hand.splice(find_card, 1); - } - - game.power_struggle_discard.push(card) - //log(`Discarded P${power_cards[card].number}`) - } -} -function silent_discard(card) { - //console.log('in discard(card)') - let find_card - if (!game.is_pwr_struggle) { - if (game.active === COM) { - find_card = game.communist_hand.indexOf(card) - game.communist_hand.splice(find_card, 1) - } else { - find_card = game.democrat_hand.indexOf(card) - game.democrat_hand.splice(find_card, 1) - } - if (!game.strategy_discard.includes(card)) { - game.strategy_discard.push(card) - } - } else if (game.is_pwr_struggle) { - if (game.active === COM) { - find_card = game.com_pwr_hand.indexOf(card); - game.com_pwr_hand.splice(find_card, 1); - } else { - find_card = game.dem_pwr_hand.indexOf(card); - game.dem_pwr_hand.splice(find_card, 1); - } - game.power_struggle_discard.push(card) - } -} - -function remove_from_discard(card) { - let card_index = game.strategy_discard.indexOf(card) - if (card_index !== -1) { - game.strategy_discard.splice(card_index, 1) - } -} - -function discard_card(hand) { - //let find_card - let card = Math.floor(Math.random()*hand.length) - let discarded_card = hand.splice(card, 1)[0] - if (game.is_pwr_struggle) { - if (numberless_cards.includes(discarded_card)) { - log_gap(`Discarded: P${discarded_card}`) - } else { - log_gap(`Discarded: P${discarded_card} V${power_cards[discarded_card].value}`) - } - } else { - log(`Discarded C${cards[discarded_card].number}`) - game.strategy_discard.push(discarded_card) - } - return discarded_card -} - -function discard_from_table(card) { - find_card = game.table_cards.indexOf(card) - game.table_cards.splice(find_card, 1) - game.strategy_discard.push(card) -} - - -function add_midyear() { - const mid_year = cards.filter(card => card && card.period === 2).map(card => card.number); - game.strategy_deck.push(...mid_year); - log_h3('Mid-year cards added to draw deck') -} - - -function add_lateyear() { - const late_year = cards.filter(card => card && card.period === 3).map(card => card.number) - game.strategy_deck.push(...late_year) - log_h3('Late-year cards added to draw deck') -} - -function reset_power() { - game.power_struggle_deck = [] - game.power_struggle_discard = [] - game.dem_pwr_hand = [] - game.com_pwr_hand = [] - game.phase = 1 - game.raised_stakes_round = 0 - game.raised_stakes = 0 - game.played_power_card = 0 - game.tactics_fails = '' - game.view_opp_hand = false - - if (game.persistent_events.includes(72)){ - permanently_remove(72) - game.table_cards = game.table_cards.filter(card => card !== 72) - game.persistent_events = game.persistent_events.filter(n => n !== 72) - } - if (game.persistent_events.includes(62)) { - permanently_remove(62) - game.table_cards = game.table_cards.filter(card => card !== 62) - game.persistent_events = game.persistent_events.filter(n => n !== 62) - } - if (game.persistent_events.includes(54) && game.pwr_struggle_in === 'Romania'){ - permanently_remove(54) - //game.table_cards = game.table_cards.filter(card => card !== 54) - - } - if (game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(70)){ - //permanently_remove(70) - //game.table_cards = game.table_cards.filter(card => card !== 70) - game.persistent_events = game.persistent_events.filter(n => n !== 70) - } -} - -function check_control_change(space_id) { - - // Check if the Tyrant is Gone has been fulfilled - - if (game.the_tyrant_is_gone > 0 && check_dem_control(game.the_tyrant_is_gone)) { - log('+2 VP from C97') - game.vp += 2 - if (check_vp()) { - return - } - game.persistent_events = game.persistent_events.filter(n => n !== 97) - delete game.the_tyrant_is_gone - } -} - -function check_systematization() { - // Check for Systematization - may not use this space - if (game.systematization > 0) { - game.valid_spaces = game.valid_spaces.filter(n => n !== game.systematization) - } -} - -function check_common_european_home() { - if (!game.playable_cards.includes(21)) { - game.playable_cards.push(21) - } -} - -function this_card() { - return game.vm_event > 0 ? game.vm_event : game.played_card -} -/* -function get_ops(card) { - let ops = cards[card].ops - if (game.active === COM) { - //Check TST op bonus - if (ops === 1 && game.com_tst_position >=2 && game.dem_tst_position <=1) { - ops++ - } - //Events that influence ops - if (game.persistent_events.includes(25)) { - ops++ - } - if (game.prudence.COM && game.prudence.COM <0) { - ops += game.prudence.COM - } - - } else { - //Check TST op bonus - if (ops === 1 && game.dem_tst_position >=2 && game.com_tst_position <=1) { - ops++ - } - //Events that influence ops - if (game.persistent_events.includes(50)) { - ops++ - } - if (game.prudence.DEM && game.prudence.DEM <0) { - ops += game.prudence.DEM - } - } - //Ops can never be less than one - if (ops <1) { ops = 1 } - return ops -} - */ - -const pluralize = (count, noun, suffix = 's') => - `${count} ${noun}${Math.abs(count) !== 1 ? suffix : ''}` - -function clean_name(str) { - if (str && str.slice(-1) === '*') { - return str.slice(0, -1) - } else { - return str; - } -} - -function country_name(country) { - return country.replace(/_/g, ' ') -} - -// ======== LOG FUNCTIONS ============= - -function log(msg) { - game.log.push(msg) -} - -function log_br() { - if (game.log.length > 0 && game.log[game.log.length - 1] !== "") - game.log.push("") -} - -function logi(msg) { - game.log.push(">" + 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) -} - -function log_gap(msg) { - log_br() - game.log.push(msg) -} - -function log_msg_gap(msg) { - game.log.push(msg) - log_br() -} - - -function log_side() { - log_br() - if (game.active === DEM) - log(".h2d " + game.active) - else - log(".h2c " + game.active) - log_br() -} - -function log_sep() { - log(".hr") -} - -function log_action(msg) { - log_br() - log(msg) -} - -// ============= SUMMARY FUNCTIONS ============= - -function push_summary() { - if (game.summary) - throw "TOO MANY SUMMARIES" - game.summary = [] -} - -function log_summary(msg) { - - if (msg.startsWith('Added') || msg.startsWith('Removed')) { - for (let item of game.summary) { - if (item[1] === msg) { - item[0]++ - return - } - } - } - game.summary.push([1, msg]) -} - -function pop_summary() { - if (game.summary.length > 0) { - for (let [n, msg] of game.summary) { - if (n > 1) { - log(msg.replace("£ SP", `${n} SPs`)); - } else { - log(msg.replace("£ SP", `${n} SP`)); - } - } - } - game.summary = [] -} - -function log_summary_place(p) { - let from = piece_space(p) - if (from !== AVAILABLE) - log_summary("% " + piece_name(p) + " from S" + from) - else - log_summary("% " + piece_name(p)) -} - -function log_summary_move_to_from(p, to) { - log_summary("% " + piece_name(p) + " to S" + to + " from S" + piece_space(p)) -} - -function log_summary_remove(p) { - log_summary("Removed % " + piece_name(p)) -} - -function log_summary_activated(p) { - log_summary("Activated % " + piece_faction_name(p)) -} - -// ============ UNDO FUNCTIONS ================== - -function clear_undo() { - if (game.undo.length > 0) - game.undo = [] -} - -function push_undo() { - let copy = {} - for (let k in game) { - let v = game[k] - if (k === "undo") - continue - else if (k === "log") - v = v.length - else if (typeof v === "object" && v !== null) - v = object_copy(v) - copy[k] = v - } - game.undo.push(copy) -} - -function pop_undo() { - let save_log = game.log - let save_undo = game.undo - game = save_undo.pop() - save_log.length = game.log - game.log = save_log - game.undo = save_undo -} - -// Fast deep copy for objects without cycles -function object_copy(original) { - if (Array.isArray(original)) { - let n = original.length - let copy = new Array(n) - for (let i = 0; i < n; ++i) { - let v = original[i] - if (typeof v === "object" && v !== null) - copy[i] = object_copy(v) - else - copy[i] = v - } - return copy - } else { - let copy = {} - for (let i in original) { - let v = original[i] - if (typeof v === "object" && v !== null) - copy[i] = object_copy(v) - else - copy[i] = v - } - return copy - } -} - - -/* =================== VM FUNCTIONS ========================== */ - -function goto_vm(proc) { - let old_vm = game.vm; - - game.state = "vm"; - game.vm = { - prompt: 0, - fp: proc, - ip: 0, - }; - - if (old_vm) { - game.vm.return_vm = old_vm; - } - - vm_exec(); -} - -function vm_exec() { - vm_inst(0)(); -} - -function vm_inst(a) { - //console.log('game.vm.fp', game.vm.fp, 'game.vm.ip', game.vm.ip) - return CODE[game.vm.fp][game.vm.ip][a] -} - -function vm_next() { - game.vm.ip++; - //console.log('vm_next called, game.vm.ip', game.vm.ip) - vm_exec(); -} - -function vm_operand(a) { - let x = CODE[game.vm.fp][game.vm.ip][a] - if (a > 0 && typeof x === "function") - return x() - return x -} - -function vm_assert_argcount(n) { - const argcount = CODE[game.vm.fp][game.vm.ip].length - 1 - if (argcount !== n) - throw Error(`ASSERT Invalid number of arguments on event ${game.vm.fp}: ${argcount} instead of ${n}`) -} - -function vm_log() { - log(vm_operand(1)); - vm_next(); -} - -function vm_if() { - //console.log('game.temp', game.temp) -// console.log('vm_operand(1)', vm_operand(1)) - if (!vm_operand(1)) { - let balance = 1 - while (balance > 0) { - ++game.vm.ip - switch (vm_operand(0)) { - case vm_if: - ++balance - break - case vm_endif: - --balance - break - case vm_else: - if (balance === 1) - --balance - break - } - if (game.vm.ip < 0 || game.vm.ip > CODE[game.vm.fp].length) - throw "ERROR" - } - } - vm_next() -} - -function vm_else() { - vm_goto(vm_endif, vm_if, 1, 1) -} - -function vm_endif() { - vm_next() -} - -function vm_goto_step(step) { - // console.log('vm_goto_step called, target:', step) - //console.log('game.vm.ip', game.vp.ip) - for (let i = game.vm.ip; i < CODE[game.vm.fp].length; i++) { - //console.log('i', i) - //console.log('step', CODE[game.vm.fp][i][0]) - if (CODE[game.vm.fp][i][0] === step) { - game.vm.ip = i; - vm_exec(); - return; - } - } - - console.log("ERROR: Target operation not found in the current procedure."); -} - - -function vm_goto(op, nop, dir, step) { - //console.log('vm_inst(0)', vm_inst(0), op, nop) -// console.log('vm_inst(0)', vm_inst(1), op, nop) - let balance = 1 - while (balance > 0) { - game.vm.ip += dir - if (vm_inst(0) === op) - --balance - if (vm_inst(0) === nop) - ++balance - if (game.vm.ip < 0 || game.vm.ip > CODE[game.vm.fp].length) - throw "ERROR" - } - game.vm.ip += step - vm_exec() -} - -function event_prompt(str) { - //console.log('event_prompt called with', str) - if (typeof str === "undefined") - str = CODE[game.vm.fp][game.vm.prompt][1] - if (typeof str === "function") - str = str() - //console.log('str:', str) - if (!str) { - str = "" - } - return str -} - -function vm_prompt() { - if (game.vm.prompt) - game.vm._prompt = game.vm.prompt - game.vm.prompt = game.vm.ip - vm_next() -} - -function pop_vm_prompt() { - if (game.vm._prompt) { - game.vm.prompt = game.vm._prompt - delete game.vm._prompt - } else { - game.vm.prompt = 0 - } -} - -function vm_return() { - - //console.log('in vm_return, game.vm_infl_to_do', game.vm_infl_to_do, 'return state', game.return_state) - - //Remove temporary vm variables - delete game.support_check_modifier - delete game.vm_max_infl - delete game.vm_influence_added - delete game.communist_hand_red - - game.vm_event = 0 /*Reset to 0 now that event has been completed. Hopefully this doesn't cause issues! */ - if (game.persistent_events.includes(58)) { - reset_austria_hungary_border_reopened() - } - - //Check if end event state is needed - if (game.is_pwr_struggle || game.state === 'vm_tst_6' || game.return_state === 'tiananmen_square_attempt_done') { - vm_end_event() - } - //Check if auto-resolve opponent event - else if (is_auto_resolve(game.played_card) && ((cards[game.played_card].side === 'C' && game.active === DEM) || (cards[game.played_card].side === 'D' && game.active === COM) )) { - vm_end_event() - } - else { - - game.state = 'vm_end_event' - /*if (!game.vm_infl_to_do) { - /*if ((game.active === DEM && game.round_player !==DEM) || (game.active === COM && game.round_player !== COM)) { - game.state = 'vm_end_event' - } else { - game.state = 'vm_end_event' - //end_round() - //} - } else { - console.log('vm_infl_to_do true') - vm_end_event() - }*/ - } -} - -function vm_end_event() { - //game.view_opp_hand = false -// console.log('in vm_return, game.return:', game.return, 'game.return_state:', game.return_state, 'game.vm_infl_to_do', game.vm_infl_to_do, 'game.vm_event_to_do', game.vm_event_to_do) - /*if (!game.vm_infl_to_do && !game.vm_event_to_do) { - if (game.round_player !== game.active) { - change_player() - log_h2('End of Action Round') - } - end_round() - return - } /*Go direct to end round if card fully resolved */ - if (game.return !== game.active) { - next_player()} - if (game.return_state === 'power_struggle') { - do_valid_cards() - } - if (game.return_state && game.return_state !== '') { - game.state = game.return_state - //console.log( 'game.state', game.state) - } - else if (game.vm_infl_to_do) { - game.state = 'resolve_opponent_event'} /*Can use game.return state for this? */ - //else {game.state = "play_card"} - else{ - end_round()} -} - -/* ================== VM ACTIONS =========================== */ - -function vm_opp_hand_false() { - game.view_opp_hand = false - vm_next() -} - -function vm_valid_spaces() { - let space_1 = vm_operand(1) - let space_2 = vm_operand(2) - let space_3 = vm_operand(3) - let space_4 = vm_operand(4) - let space_5 = vm_operand(5) - let space_6 = vm_operand(6) - game.valid_spaces = [space_1, space_2, space_3, space_4, space_5, space_6] - game.valid_spaces = game.valid_spaces.filter( n => n ) - - // Check for Systematization - may not use this space - check_systematization() - - vm_next() -} - -function vm_valid_spaces_opponent () { - let valid_spaces = [] - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - - if (game.active === DEM) { - let infl = game.comInfl[i] - if (infl > 0) { - valid_spaces.push(space.space_id) - } - } else { - infl = game.demInfl[i] - if (infl > 0) { - valid_spaces.push(space.space_id) - } - } - } - game.valid_spaces = valid_spaces -// console.log('game.valid_spaces', game.valid_spaces) - vm_next() -} - -function vm_valid_spaces_socio () { - let valid_spaces = [] - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - - if (space.socio === vm_operand(1)) { - valid_spaces.push(space.space_id) - } - } - game.valid_spaces = valid_spaces - - // Check for Systematization - may not use this space - if (game.systematization && game.systematization > 0) { - game.valid_spaces = game.valid_spaces.filter(n => n !== game.systematization) - } - vm_next() -} - -function vm_valid_spaces_opponent_socio () { - let valid_spaces = [] - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - - if (game.active === DEM) { - let infl = game.comInfl[i] - if (infl > 0 && space.socio === vm_operand(1)) { - valid_spaces.push(space.space_id) - } - } else { - let infl = game.demInfl[i] - if (infl > 0 && space.socio === vm_operand(1)) { - valid_spaces.push(space.space_id) - } - } - } - game.valid_spaces = valid_spaces - // Check for Systematization - may not use this space - if (game.systematization && game.systematization > 0) { - game.valid_spaces = game.valid_spaces.filter(n => n !== game.systematization) - } - vm_next() -} - -function vm_valid_spaces_country () { - let country - if (vm_operand(1)) {country = vm_operand(1)} - else {country = game.vm_active_country} - for (let space of spaces) { - if (!space) continue - if (space.country === country) { - game.valid_spaces.push(space.space_id); - } - } - // Check for Systematization - may not use this space - if (game.systematization && game.systematization > 0) { - game.valid_spaces = game.valid_spaces.filter(n => n !== game.systematization) - } - vm_next() -} - -function vm_valid_spaces_sc () { - valid_spaces_sc() - vm_next() -} - -function vm_valid_spaces_country_opp () { - let country = '' - - if (vm_operand(1)) { - country = vm_operand(1) } - else { - country = game.vm_active_country - } - for (let space of spaces) { - if (!space) continue - if (game.active === DEM) { - if (space.country === country && game.comInfl[space.space_id] >0) { - game.valid_spaces.push(space.space_id); - } - } else { - if (space.country === country && game.demInfl[space.space_id]>0) { - game.valid_spaces.push(space.space_id); - } - } - } - vm_next() -} - -function vm_valid_spaces_country_sc () { - let valid_spaces = [] - let country = '' - //console.log('in vm_valid_spaces_country_sc') - if (vm_operand(1)) { - country = vm_operand(1) } - else { - country = game.vm_active_country - } - for (let space of spaces) { - if (!space) continue - if (game.active === DEM) { - if (space.country === country && game.comInfl[space.space_id] >0) { - valid_spaces.push(space.space_id); - } - } else { - if (space.country === country && game.demInfl[space.space_id] >0) { - //Check Solidarity Legalised - if (game.persistent_events.includes(2) && space.space_id === 14) {continue} - - //Check Civic Forum - if (game.persistent_events.includes(90) && space.space_id === 30) {continue} - - //Check We are the People - if (game.persistent_events.includes(48) && space.space_id === 9) {continue} - valid_spaces.push(space.space_id); - - //Check Foreign Currency Debt Burden - if (game.persistent_events.includes(49) && space.country === game.foreign_currency_debt_burden) {continue} - } - } - } - game.valid_spaces = valid_spaces - - //Check for Foreign Currency Debt Burden - /*if (game.persistent_events.includes(49) && game.active === COM) { - game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country !== game.foreign_currency_debt_burden) - }*/ - vm_next() -} - -function vm_valid_spaces_country_socio_2() { - for (let space of spaces) { - if (!space) continue - if (space.space_id === game.systematization) continue - if ((space.country === vm_operand(1) && space.socio === vm_operand(2)) || (space.country === vm_operand(1) && space.socio === vm_operand(3))) { - game.valid_spaces.push(space.space_id); - } - } - vm_next() -} - -function vm_valid_spaces_region_socio() { - let valid_spaces = [] - for (let space of spaces) { - if (!space) continue - if (space.space_id === game.systematization) continue - if (space.region === vm_operand(1) && space.socio === vm_operand(2)) { - valid_spaces.push(space.space_id); - } - } - game.valid_spaces = valid_spaces - vm_next() -} - -function vm_valid_spaces_region_opp() { - let valid_spaces = [] - for (let space of spaces) { - if (!space) continue - let s = space.space_id - if ((game.active === DEM && space.region === vm_operand(1) && game.comInfl[s] > 0 ) || (game.active === COM && space.region === vm_operand(1) && game.demInfl[s] > 0 )) { - valid_spaces.push(space.space_id); - } - } - game.valid_spaces = valid_spaces - vm_next() -} - -function vm_valid_spaces_solidarity_legalised() { - let valid_spaces = [] - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - let uncontrolled = (!check_control(i) && !check_opp_control(i)) - if ((space.country === 'Poland' && uncontrolled && space.socio === 3) || (space.country === 'Poland' && uncontrolled && space.socio === 4)) { - valid_spaces.push(space.space_id); - } - } - game.valid_spaces = valid_spaces - vm_next() -} - -function vm_active_country () { - game.valid_spaces = game.valid_spaces.filter(space_id => { - let space = spaces.find(s => s && s.space_id === space_id); - return space && space.country === game.vm_active_country; - }); - vm_next() -} - -function vm_take_control_prep() { - game.vm_available_ops = vm_operand(1) - game.state = 'vm_take_control' -} - -function vm_take_control(space) { - if (game.active === DEM) { - let current_infl = game.demInfl[space] - let opponent_infl = game.comInfl[space] - let stability = spaces[space].stability - - if ((current_infl - opponent_infl) < stability) { - game.demInfl[space] += stability - current_infl + opponent_infl - //game.pieces[space].demCtrl = 1 - //game.pieces[space].comCtrl = 0 - } - } else if (game.active === COM) { - let current_infl = game.comInfl[space] - let opponent_infl = game.demInfl[space] - let stability = spaces[space].stability - - if ((current_infl - opponent_infl) < stability) { - game.comInfl[space] += stability - current_infl + opponent_infl - //game.pieces[space].comCtrl = 1 - //game.pieces[space].demCtrl = 0 - } - } - game.valid_spaces = game.valid_spaces.filter(id => id !== space) - log(`Took control of %${space}`) -} - - -function vm_do_add_infl(space) { - push_undo() - //console.log('in vm_do_add_infl, space', space, 'ops', game.vm_available_ops, 'ahbr tracker', game.austria_hungary_border_reopened_tracker, 'ahbr in events', game.persistent_events.includes(58)) - - //log(`Added 1 influence in %${space}.`) - - log_summary(`Added £ SP in %${space}.`) - - //If AHBR - check AHBR condition - if (game.persistent_events.includes(58)) { - if (spaces[space].country !== 'East_Germany'){ - game.austria_hungary_border_reopened_tracker = false - } - } - - // Check Genscher - if (game.persistent_events.includes(63) && game.active === DEM && spaces[space].country === 'East_Germany') { - game.vm_available_ops-- - log_summary(`(-1 op due to C63)`) - } else if (check_opp_control(space)) { - game.vm_available_ops -= 2 - //Check if Austria Hungary Border Reopened was used to place last SP in a controlled space in East Germany. If so, game.vm_available_op will be negative - if (game.vm_available_ops < 0) { - log_summary(`(Used +1 op from C58)`) - } - } else { - game.vm_available_ops-- - } - - // Update influence values - if (game.active === COM) { - game.comInfl[space]++ - } else { - game.demInfl[space]++ - } - - // Check whether spaces are controlled - check_control_change(space) - - // Check Austria Hungary Border Reopened is true and condition has been met - if (game.vm_available_ops === 0 && game.active === DEM && game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker) { - //console.log('in award extra op') - game.vm_available_ops ++ - log('+1 Op from C58') - game.austria_hungary_border_reopened_tracker = false - game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'East_Germany') - } - - // If only 1 IP remaining, may not place in opponent controlled spaces - - // Check for Genscher & Austria Hungary Border Reopened - - if (game.vm_available_ops === 1) { - - if (game.active === DEM) { - //Check Genscher and AHBR - if (game.persistent_events.includes(63) || (game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker)) { - game.valid_spaces = game.valid_spaces.filter(n => !(check_com_control(n) && spaces[n].country !== 'East_Germany')) - } else { - game.valid_spaces = game.valid_spaces.filter(n => !check_com_control(n)) - } - } else { - game.valid_spaces = game.valid_spaces.filter(n => !check_dem_control(n)) - } - } - - //Clear valid spaces if no IP remaining. - if (game.vm_available_ops <= 0 ) { - game.valid_spaces = [] - } -} - -function vm_do_add_infl_free(space) { - push_undo() - //log(`Added 1 influence in %${space}.`) - - log_summary(`Added £ SP in %${space}.`) - - // Update influence values - if (game.active === COM) { - game.comInfl[space]++ - } else { - game.demInfl[space]++ - } - game.vm_available_ops-- - // Check whether spaces are controlled - check_control_change(space) - - - //console.log('game pieces:', game.pieces[space]) -} - -function vm_add_infl() { - if (vm_operand(1)) {game.vm_available_ops = vm_operand(1)} - game.state = 'vm_add_infl' -} - -function vm_add_infl_free() { - if (vm_operand(1)) {game.vm_available_ops = vm_operand(1)} - game.state = 'vm_add_infl_free' -} - -function vm_add_x_infl() { - game.vm_available_ops = vm_operand(1) - game.state = 'vm_add_x_infl' -} - -function vm_do_add_x_infl(space) { - push_undo() - log(`Added ${game.vm_available_ops} SPs in %${space}.`) - - - if (game.active === COM) { - game.comInfl[space] += game.vm_available_ops - } else { - game.demInfl[space] += game.vm_available_ops - } - check_control_change(space) - game.vm_available_ops = 0 - game.valid_spaces = [] -} - -function vm_add_limited_infl() { - game.vm_available_ops = vm_operand(1) - game.vm_max_infl = vm_operand(2) - game.state = 'vm_add_limited_infl' -} - -function vm_do_add_limited_infl(space, max_infl) { - push_undo() - //log(`Added 1 influence in %${space}.`) - - log_summary(`Added £ SP in %${space}.`) - game.vm_available_ops -- - - if (!game.vm_influence_added) { - game.vm_influence_added = {}; - } - - if (!game.vm_influence_added[space]) { - game.vm_influence_added[space] = 0; - } - - if (game.active === COM) { - game.comInfl[space] ++ - } else { - game.demInfl[space] ++ - } - - game.vm_influence_added[space] ++ - - //console.log('valid_spaces before update', game.valid_spaces) - //console.log('influence added:', game.vm_influence_added[space], 'max infl', max_infl) - if (game.vm_influence_added[space] === max_infl) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - check_control_change(space) - if (game.vm_available_ops === 0) {game.valid_spaces = [] } -} - -function vm_remove_infl() { - game.vm_available_ops = vm_operand(1) - game.state = 'vm_remove_infl' -} - -function vm_remove_opp_infl() { - game.vm_available_ops = vm_operand(1) - game.remove_opponent_infl = true - if (game.is_pwr_struggle) { - game.state = 'vm_scare_tactics' - } else { - game.state = 'vm_remove_infl' - } -} - -function vm_remove_x_opp_infl() { - game.vm_available_ops = vm_operand(1) - game.remove_opponent_infl = true - game.state = 'vm_remove_x_infl' -} - -function vm_do_remove_infl(space) { - push_undo() - //log(`Removed 1 influence from %${space}.`) - log_summary(`Removed £ SP from %${space}.`) - - if (!game.vm_influence_added) { - game.vm_influence_added = {}; - } - - if (!game.vm_influence_added[space]) { - game.vm_influence_added[space] = 0; - } - if (game.remove_opponent_infl === true) { - if (game.active === COM) { - game.demInfl[space]-- - if (game.demInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - } else { - game.comInfl[space]-- - if (game.comInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - } - - - } else { - if (game.active === COM) { - game.comInfl[space]-- - if (game.comInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - } else { - game.demInfl[space]-- - if (game.demInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - } - } - check_control_change(space) - game.vm_influence_added[space]++ - game.vm_available_ops-- - if (game.vm_available_ops===0) {game.valid_spaces = []} -} - -function vm_do_remove_x_infl(space) { - push_undo() - - if (game.remove_opponent_infl) { - if (game.active === COM) { - if (game.demInfl[space] >= game.vm_available_ops) { - game.demInfl[space] -= game.vm_available_ops - } else { - game.vm_available_ops = game.demInfl[space] - game.demInfl[space] -= game.vm_available_ops - } - } else { - if (game.comInfl[space] >= game.vm_available_ops) { - game.comInfl[space] -= game.vm_available_ops - } else { - game.vm_available_ops = game.comInfl[space] - game.comInfl[space] -= game.vm_available_ops - } - } - } else { - if (game.active === COM) { - if (game.comInfl[space] >= game.vm_available_ops) { - game.comInfl[space] -= game.vm_available_ops - } else { - game.vm_available_ops = game.comInfl[space] - game.comInfl[space] -= game.vm_available_ops - } - } else { - if (game.demInfl[space] >= game.vm_available_ops) { - game.demInfl[space] -= game.vm_available_ops - } else { - game.vm_available_ops = game.demInfl[space] - game.demInfl[space] -= game.vm_available_ops - } - } - } - - log(`Removed ${game.vm_available_ops} SPs from %${space}`) - check_control_change(space) - - game.vm_available_ops = 0 - game.valid_spaces = [] -} - -function vm_remove_limited_opp_infl() { - game.vm_available_ops = vm_operand(1) - game.vm_max_infl = vm_operand(2) - game.remove_opponent_infl = true - game.state = 'vm_remove_limited_infl' -} - -function vm_do_remove_limited_infl(space, max_infl) { - push_undo() - log(`Removed SP from %${space}.`) - game.vm_available_ops -- - - - if (!game.vm_influence_added) { - game.vm_influence_added = {}; - } - - if (!game.vm_influence_added[space]) { - game.vm_influence_added[space] = 0; - } - - if (game.active === COM) { - game.demInfl[space] -- - if (game.demInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space) - } - } else { - game.comInfl[space] -- - if (game.comInfl[space] === 0) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space) - } - } - - game.vm_influence_added[space] ++ - - if (game.vm_influence_added[space] === max_infl) { - game.valid_spaces = game.valid_spaces.filter(id => id !== space); - } - - check_control_change(space) - if (game.vm_available_ops === 0) {game.valid_spaces = []} -} - -function vm_remove_all_infl() { - game.vm_available_ops = vm_operand(1) - game.state = 'vm_remove_all_infl' -} - -function vm_do_remove_all_infl(space) { - push_undo() - log(`Removed all SP from %${space}.`) - - if (game.remove_opponent_infl === true) { - if (game.active === COM) { - game.demInfl[space] = 0 - } else { - game.comInfl[space] = 0 - } - check_control_change(space) - - } else { - if (game.active === COM) { - game.comInfl[space] = 0 - } else { - game.demInfl[space] = 0 - } - check_control_change(space) - } - game.vm_available_ops -- - game.valid_spaces = game.valid_spaces.filter(id => id !== space) -} - -function vm_replace_all_infl(space_id) { - if (game.active === DEM) { - game.demInfl[space_id] += game.comInfl[space_id] - game.comInfl[space_id] = 0 - } else { - game.comInfl[space_id] += game.demInfl[space_id] - game.demInfl[space_id] = 0 - } - check_control_change(space_id) -} - -function vm_1_support_check() { - game.vm_available_ops = 1 - game.state = 'vm_1_support_check_prep' -} - -function vm_support_check() { - game.vm_available_ops = vm_operand(1) - game.state = 'vm_support_check_prep' -} - -function vm_support_check_modified() { - game.vm_available_ops = vm_operand(1) - game.support_check_modifier = vm_operand(2) - game.state = 'vm_support_check_prep' -} - -function vm_switch_infl(id){ - push_undo() - - game.demInfl[id] -= game.vm_available_ops - game.comInfl[id] += game.vm_available_ops - log(`Replaced ${pluralize(game.vm_available_ops,'SP')} in %${id}`) - game.vm_available_ops = 0 - check_control_change(id) -} - -/* ===================== EVENT SPECIFIC FUNCTIONS ========== */ - -function vm_40th_anniversary_celebration() { - if (game.vp < 0 ) {game.vm_available_ops = 4} - else {game.vm_available_ops = 2} - vm_next() -} - -function vm_40th_anniversary_celebration_vp() { - game.vp -- - log('-1VP') - if (check_vp()) { - return - } - vm_next() -} - -function vm_adamec() { - game.state = 'vm_adamec' -} - -function vm_army_backs_revolution() { - game.persistent_events = game.persistent_events.filter(n => n !== 70) - game.playable_cards = game.playable_cards.filter(n => n !== 70) - /*if (game.table_cards.includes(70)) { - permanently_remove(70) - }*/ - vm_next() -} - -function vm_austria_hungary_border_reopened() { - game.persistent_events.push(58) - permanently_remove(58) - game.austria_hungary_border_reopened_tracker = false - //game.table_cards.push(58) - //remove_from_discard(58) - vm_next() -} - -function vm_betrayal() { - if (game.demInfl[58] > 0 ) { game.valid_spaces.push(58) } - if (game.demInfl[65] >0 ) { game.valid_spaces.push(65) } - game.vm_available_ops = Math.max(game.demInfl[58], game.demInfl[65]) - game.state = 'vm_switch_infl' -} - -function vm_breakaway_baltic_republics() { - log('+5 VP') - game.vp += 5 - game.stability++ - if (check_vp()) { - return - } - game.playable_cards.push(109) - game.playable_cards = game.playable_cards.filter(n => n !== 14) - if (!check_dem_control(56) && game.systematization !== 56) {game.valid_spaces.push(56)} - if (!check_dem_control(70)) {game.valid_spaces.push(70)} - vm_next() -} - -function vm_brought_in_for_questioning() { - if (game.active === COM) { - game.active = DEM - } - //game.return = game.active - game.phase = 0 - game.state = 'vm_brought_in_for_questioning' -} - -function vm_bulgarian_turks_expelled(){ - game.remove_opponent_infl = true - game.vp -= 2 - log('-2VP') - if (check_vp()) { - return - } - if (game.demInfl[70] > 0) {game.valid_spaces = [70]} - vm_next() -} - -function vm_ceausescu() { - let adj_cluj = false - if (game.demInfl[50] > 0 ) {adj_cluj = true} - if (game.demInfl[54] > 0 ) {adj_cluj = true} - if (game.demInfl[58] > 0 ) {adj_cluj = true} - if (game.demInfl[61] > 0 ) {adj_cluj = true} - - if (adj_cluj && game.comInfl[61]>0) { - game.valid_spaces = [61] - game.vm_available_ops = 1 - //next_player() - game.remove_opponent_infl = false - game.state = 'vm_remove_infl' - } - else {vm_next()} -} - -function vm_central_committee_reshuffle() { - game.state = 'vm_central_committee_reshuffle' -} - -function vm_civic_forum() { - log('+1 VP') - game.vp++ - if (check_vp()) { - return - } - game.persistent_events.push(90) - if (check_dem_control(31)) { - vm_next() - } else { - permanently_remove(90) - vm_return() - } -} - -function vm_common_european_home() { - let valid_cards = []; - for (let c of cards) { - //if (c === null) {continue} - if (game.active === DEM) { - if (c && c.side === 'C') { - valid_cards.push(c.number) - } - } else { - if (c && c.side === 'D') { - valid_cards.push(c.number) - } - } - } - game.valid_cards = valid_cards - game.state = 'vm_common_european_home_choose' -} - -function vm_dash_for_the_west() { - game.valid_cards = [] - for (let c of game.strategy_discard) { - if (cards[c].side === 'D' && cards[c].remove === 1 && (cards[c].playable || game.playable_cards.includes(c))) { - game.valid_cards.push(c) - } - } - game.state = 'vm_dash_for_the_west' -} - -function vm_deutsche_marks() { - let max_value = 1; - for (let c of game.democrat_hand) { - if (cards[c].ops > max_value) { - max_value = cards[c].ops - } - } - let valid_cards = []; - for (let c of game.democrat_hand) { - if (cards[c].ops === max_value) { - valid_cards.push(c); - } - } - game.valid_cards = valid_cards - game.state = 'vm_deutsche_marks_prep' -} - -function vm_domino_theory() { - game.discard = true - for (let card of game.strategy_discard) { - if (scoring_cards.includes(card)) {game.valid_cards.push(card) } - } - game.phase = 0 - game.state = 'vm_play_event_from_discard' -} - -function vm_eco_glasnost() { - game.persistent_events.push(39) - vm_next() -} - -function vm_elena(){ - game.persistent_events.push(101) - vm_next() -} - -function vm_eliminate(space_id) { - log(`Eliminated %${space_id}`) - const adjacent_spaces = spaces[space_id].adjacent.filter(Number.isInteger); - - //console.log('adjacency before: Iasi', game.pieces[53].adjacent, 'Ploesti:', game.pieces[59].adjacent, 'Bucharesti:', game.pieces[61].adjacent) - - // Eliminate the democrat influence and move the communist influence to Bucuresti - if (space_id === 61) { - game.demInfl[space_id] = 0 - game.comInfl[space_id] = 0 - } else { - game.demInfl[space_id] = 0 - game.comInfl[61] += game.comInfl[space_id] - if (game.comInfl[space_id] > 0 ) { - log(`${pluralize(game.comInfl[space_id],'Communist SP')} relocated to %61`) - } - game.comInfl[space_id] = 0 - } - //Update control in the eliminated space and in Bucuresti - check_control_change(space_id) - check_control_change(61) - -} - -function get_adjusted_adjacency(space_id) { - let adjacent_spaces = spaces[space_id].adjacent; - if (adjacent_spaces.includes(game.systematization)) { - //console.log('in get adjusted adjacency, systemization',game.systematization) - //console.log('adjacent_spaces', adjacent_spaces) - } - if (game.systematization !== 0) { - //console.log('in systematization check') - let eliminated_space_id = game.systematization; - - return adjacent_spaces.map(adj_space_id => { - if (adj_space_id === eliminated_space_id) { - // Replace the eliminated space with its adjacencies - //console.log('in map check, return', spaces[eliminated_space_id].adjacent) - return spaces[eliminated_space_id].adjacent; - } - //console.log('2nd check, return', adj_space_id) - return adj_space_id; - }).flat(); // Flatten in case the eliminated space has multiple adjacencies - } - //console.log('final adjacent spaces', adjacent_spaces) - return adjacent_spaces; -} - -function vm_exit_visas() { - game.state = 'vm_exit_visas' -} - -function vm_foreign_currency_debt_burden() { - log('+1VP') - game.vp++ - if (check_vp()) { - return - } - //game.table_cards.push(49) - //remove_from_discard(49) - game.persistent_events.push(49) - game.state = 'vm_foreign_currency_debt_burden' -} - -function vm_foreign_television() { - for (let i = 1 ; i < spaces.length; i++) { - if (i === 12) {continue} /*Does not apply to Dresden*/ - if (game.comInfl[i] > 0 ) { - game.valid_spaces.push(i) - } - } - vm_next() -} -function vm_frg_embassies() { - game.persistent_events.push(74) - game.table_cards.push(74) - remove_from_discard(74) - log('C74 in effect') - vm_next() -} - -function vm_general_strike() { - game.persistent_events.push(5) - game.table_cards.push(5) - remove_from_discard(5) - log('C5 in effect') - vm_next() -} - -function vm_genscher() { - game.persistent_events.push(63) - game.table_cards.push(63) - remove_from_discard(63) - log(`C63 in effect`) - vm_next() -} - -function vm_goodbye_lenin() { - game.view_opp_hand = true - game.communist_hand_red = [] - // Select Red cards to show - for (let card of game.communist_hand) { - if (cards[card].red) { - game.communist_hand_red.push(card) - } - } - //Check if these cards are playabl - for (let card of game.communist_hand_red) { - if (cards[card].playable || game.playable_cards.includes(card)) { - game.valid_cards.push(card) - } - } - game.state = 'vm_goodbye_lenin' -} - -function vm_government_resigns() { - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - if (space.socio === 1 && game.comInfl[i] > 0 && !check_control(i)) { - game.valid_spaces.push(i) - } - } - game.remove_opponent_infl = true - vm_next() -} - -function vm_grenztruppen() { - game.persistent_events.push(59) - permanently_remove(59) - //game.table_cards.push(59) - //remove_from_discard(59) - vm_next() -} - -function vm_heal_our_bleeding_wounds() { - let change_vp = 0 - if (game.turn <= 3) {change_vp = -3 } - else if (game.turn <= 7) {change_vp = -1} - else change_vp = 3 - if (change_vp >0) { - log(`+${change_vp} VP`) - } else { - log(`-${change_vp} VP`) - } - game.vp += change_vp - if (check_vp()) { - return - } - vm_next() -} - -function vm_helsinki_final_act() { - game.persistent_events.push(26) - vm_next() -} - -function vm_honecker() { - game.persistent_events.push(15) - game.valid_cards = [] - for (let c of game.strategy_discard) { - if (scoring_cards.includes(c)) { - continue} - else { - game.valid_cards.push(c) - } - } - game.discard = true - game.state = 'vm_honecker' -} - -function vm_inflationary_currency() { - game.state = 'vm_inflationary_currency' -} - -function vm_inflationary_currency_discard() { - // This function starts with the player who is playing Inflationary Currency for the Event - // Switch player and check the hand of their opponent to see if the have cards with ops > 3 to discard - next_player() - if (game.active === COM) { - for (let card of game.communist_hand){ - if (get_card_ops(card) >= 3) { - game.valid_cards.push(card) - } - } - } else { - for (let card of game.democrat_hand){ - if (get_card_ops(card) >= 3) { - game.valid_cards.push(card) - } - } - } - game.state = 'vm_inflationary_currency_discard' -} - -function vm_kiss_of_death() { - game.state = 'vm_kiss_of_death' -} - -function vm_klaus_and_komarek() { - if (game.comInfl[29] > 0 ) {game.valid_spaces = [29]} - vm_next() -} - -function vm_kohl_proposes_reunification() { - log('+2 VP') - game.vp += 2 - if (check_vp()) { - return - } - if (game.persistent_events.includes(86)) { - game.vm_event = 87 - game.state = 'vm_common_european_home_play' - } else { - permanently_remove(87) - vm_return() - } - -} - -function vm_kremlin_coup() { - log('-3 VP') - game.vp -= 3 - game.stability ++ - if (check_vp()) { - return - } - game.support_check_modifier = 1 - //countries = ['Poland', 'Hungary', 'East_Germany', 'Bulgaria', 'Czechoslovakia', 'Romania'] - //revolutions: {'East_Germany': false, 'Poland': false, 'Czechoslovakia': false, 'Hungary': false, 'Romania': false, 'Bulgaria': false} - game.temp = [] - countries.forEach(country => { - if (!game.revolutions[find_country_index(country)]) { - game.temp.push(country) - } - }) - game.state = 'vm_kremlin_coup_choose_country' -} - -function vm_laszlo_tokes() { - game.persistent_events.push(73) - game.playable_cards.push(107) - game.state = 'vm_laszlo_tokes' -} - -function vm_legacy_of_martial_law() { - game.vm_available_ops = 1 - game.state = 'vm_switch_infl' -} - -function vm_legacy_of_1968() { - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - if ((!check_com_control(i) && space.country === 'Czechoslovakia')) { - game.valid_spaces.push(space.space_id); - } - } - vm_next() -} - -function vm_li_peng() { - game.persistent_events.push(53) - //game.table_cards.push(53) - remove_from_discard(53) - vm_next() -} - -function vm_ligachev() { - game.persistent_events.push(99) - vm_next() -} - -function vm_malta_summit() { - game.state = 'vm_malta_summit' -} - -function vm_massacre_in_timisoara() { - game.persistent_events = game.persistent_events.filter(n => n !== 73) - vm_next() -} - -function vm_modrow() { - game.playable_cards.push(15) - game.state = 'vm_modrow' -} - -function vm_nagy_reburied(){ - if (game.comInfl[43] > 0) { - game.valid_spaces.push(43) - } - vm_next() -} - -function vm_national_salvation_front() { - game.persistent_events.push(102) - game.table_cards.push(102) - remove_from_discard(102) - vm_next() -} - -function vm_nepotism() { - game.state = 'vm_nepotism' -} - -function vm_new_years_eve_party() { - game.state = 'vm_new_years_eve_party' -} - -function vm_nomenklatura() { - game.state = 'vm_nomenklatura' -} - -function vm_normalisation() { - if (game.demInfl[27] >0) {game.valid_spaces.push(27)} - if (game.demInfl[29] > 0) {game.valid_spaces.push(29)} - game.remove_opponent_infl = true - vm_next() -} - -function vm_peasant_parties_revolt() { - game.persistent_events.push(72) - log_msg_gap('C72 in effect') - game.table_cards.push(72) - remove_from_discard(72) - vm_next() -} - -function vm_perestroika() { - game.persistent_events.push(25) - log_msg_gap('C25 in effect') - vm_next() -} - -function vm_poszgay() { - let valid_spaces = [] - for (let space of spaces) { - if (space && space.country === 'Hungary' && !check_dem_control(space.space_id)) { - valid_spaces.push(space.space_id); - } - } - game.valid_spaces = valid_spaces - vm_next() -} - -function vm_power_struggle() { - //console.log('in vm_power_struggle. game.vm_event', game.vm_event, 'game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) - game.is_pwr_struggle = true - - /* TO DELETE? - //Check if Power Struggle is because of an event - */ - - if (game.vm_event > 0) { - game.pwr_struggle_in = countries[scoring_cards.indexOf(game.vm_event)] - log_h2(`C${game.vm_event}`) - } -/* - //Otherwise set Power Struggle country normally - else { - console.log('vm_power_struggle, country set normally') - game.pwr_struggle_in = countries[scoring_cards.indexOf(game.played_card)] - log_h2(`C${game.played_card}`) - }*/ - - - //Check for Securitate - if (game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(70)) { - log('C70: Democrat reveals Power Struggle cards') - game.view_opp_hand = true - } - log_h2('Deal Cards') - game.state = 'draw_power_cards' -} - -function vm_presidential_visit() { - game.persistent_events.push(65) - //game.table_cards.push(65) - //remove_from_discard(65) - log_msg_gap('C65 in effect') - vm_next() -} - -function vm_prudence() { - if (!game.prudence) { - game.prudence = {DEM: 0, COM: 0} - } - if (game.active === DEM) { - game.prudence.COM -- - log(`${game.prudence.COM} to Communist ops this turn`) - } else { - game.prudence.DEM -- - log(`${game.prudence.DEM} to Democrat ops this turn`)} - vm_next() -} - -function vm_public_against_violence() { - game.valid_spaces = [] - if (game.comInfl[34] > 0 ) {game.valid_spaces.push(34)} - vm_next() -} - -function vm_reformer_rehabilitated () { - permanently_remove(67) - game.discard = true - for (let card of game.strategy_discard) { - if (!event_is_playable(card)) continue - if (card === game.played_card) continue - if (game.table_cards.includes(card)) continue - if (scoring_cards.includes(card)) continue - - game.valid_cards.push(card) - } - game.state = 'vm_play_event_from_discard' -} - -function vm_roundtable_talks() { - game.persistent_events.push(17) - game.table_cards.push(17) - remove_from_discard(17) - log_msg_gap('C17 in effect') - vm_next() -} - -function vm_sajudis_check() { - if (!check_dem_control(56)) { - game.valid_spaces.push(56) - } - if (!check_dem_control(70)) { - game.valid_spaces.push(70) - } - vm_next() -} - -function vm_sajudis() { - game.playable_cards.push(81) - game.stability++ - log('+1 VP') - game.vp++ - if (check_vp()) { - return - } - vm_next() -} - -function vm_samizdat() { - game.state = 'vm_samizdat' -} - -function vm_securitate() { - game.persistent_events.push(70) - permanently_remove(70) - //game.table_cards.push(70) - vm_next() -} - -function vm_shock_therapy() { - game.state = 'vm_shock_therapy' -} - -function vm_social_democratic_platform_adopted() { - game.state = 'vm_social_democratic_platform_adopted' -} - -function vm_solidarity_legalised() { - log_msg_gap(`C2 in effect`) - game.playable_cards.push(3) - game.persistent_events.push(2) - vm_next() -} - -function vm_st_nicholas_church () { - game.persistent_events.push(24) - game.playable_cards.push(61) - vm_next() -} - -function vm_stasi() { - log_msg_gap('C13 in effect') - game.persistent_events.push(13) - vm_next() -} - -function vm_stand_fast() { - game.persistent_events.push(100) - if (game.active === DEM) { - game.stand_fast = DEM - } else {game.stand_fast = COM} - //game.table_cards.push(100) - vm_next() -} - -function vm_systematization() { - game.state = 'vm_systematization' -} - -function vm_tank_column() { - if (game.active === DEM) { - game.dem_tst_position++ - game.dem_tst_attempted = 0 - } else { - game.com_tst_position++ - game.com_tst_attempted = 0 - } - vm_next() -} - -function vm_tear_gas () { - game.persistent_events.push(30) - game.table_cards.push(30) - remove_from_discard(30) - log_msg_gap('C30 in effect') - vm_next() -} - -function vm_the_baltic_way() { - game.playable_cards.push(84) - game.stability++ - if (!check_dem_control(56) && game.systematization !== 56) {game.valid_spaces.push(56)} - if (!check_dem_control(70) && game.systematization !== 70) {game.valid_spaces.push(70)} - log('+3 VP') - game.vp += 3 - if (check_vp()) { - return - } - vm_next() -} - -function vm_the_chinese_solution() { - game.state = 'vm_the_chinese_solution' -} - -function vm_the_crowd_turns_against_ceausescu() { - game.table_cards.push(54) - remove_from_discard(54) - game.playable_cards.push(97) - vm_next() -} - -function vm_the_monday_demonstrations() { - if (!check_dem_control(6)) {game.valid_spaces.push(6)} - if (!check_dem_control(9)) {game.valid_spaces.push(9)} - vm_next() -} - -function vm_the_sinatra_doctrine() { - game.persistent_events.push(50) - log_msg_gap('C50 in effect') - vm_next() -} - -function vm_the_third_way() { - log('-2VP') - vm_next() -} - -function vm_the_tyrant_is_gone() { - game.valid_spaces = [] - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - if (game.demInfl[i] === 0 && space.country === 'Romania') { - if (space.space_id === game.systematization) {continue} - game.valid_spaces.push(space.space_id) - } - } - game.state = 'vm_the_tyrant_is_gone' -} - - -function vm_the_tyrant_is_gone_prep() { - game.table_cards.push(97) - remove_from_discard(97) - vm_next() -} - -function vm_tyrant_block() { - logi(`Has no effect after C97`) - vm_next() - //game.state = 'vm_tyrant_block' -} - -function vm_the_wall () { - game.persistent_events.push(9) - //game.strategy_removed.push(9) - //game.table_cards.push(9) - log_msg_gap('C9 in effect') - vm_next() -} - -function vm_the_wall_must_go() { - game.the_wall_must_go = {} - game.the_wall_must_go['dem_wins'] = 0 - game.the_wall_must_go['com_wins'] = 0 - game.the_wall_must_go['dem_roll'] = 0 - game.the_wall_must_go['com_roll'] = 0 - game.state = 'vm_the_wall_must_go' -} - -function vm_warsaw_pact_summit() { - game.warsaw_pact_summit = true /*What does this do? */ - game.state = 'vm_warsaw_pact_summit' -} - -function vm_we_are_the_people() { - if (game.demInfl[6] > 0) {game.valid_spaces = [6]} - game.persistent_events.push(48) - if (!game.vm_influence_added) { - game.vm_influence_added = {}; - } - game.vm_influence_added[6] = 0 - game.vm_available_ops = 4 - game.state = 'vm_we_are_the_people_remove' -} - -function vm_workers_revolt() { - if (game.active === DEM) { - for (let space of spaces) { - if (!space) continue - let country = space.country - if (!game.revolutions[find_country_index(country)] && game.comInfl[space.space_id] > 0 && space.socio === 4) { - game.valid_spaces.push(space.space_id); - } - } - } else { - for (let space of spaces) { - if (!space) continue - let country = space.country - if (game.revolutions[find_country_index(country)] && game.demInfl[space.space_id] > 0 && space.socio === 4) { - game.valid_spaces.push(space.space_id); - } - } - } - game.state = 'vm_workers_revolt' -} - -function vm_yakovlev_counsels_gorbachev() { - game.persistent_events.push(62) - log_msg_gap('C62 in effect') - game.table_cards.push(62) - remove_from_discard(62) - vm_next() -} - -function vm_permanently_remove () { - // Check if the event is being played as the result of another card, e.g. Dash for the West, is a card which should be removed, and which hasn't already been removed! - if (game.vm_event !== 0 && cards[game.vm_event].remove === 1 && !game.strategy_removed.includes(game.vm_event)) { - permanently_remove(game.vm_event) - } - if (cards[game.played_card].remove ===1 && !game.strategy_removed.includes(game.played_card)) { - permanently_remove(game.played_card) - } /*This means the card that called the event being played is also removed if relevant. Think this makes sense */ - vm_next() -} - -function discarded_card() { - return game.temp > 0 -} - -// =================== TIANANMEN SQUARE TRACK FUNCTIONS ==================== - -function vm_tst_3() { - log_gap('Tiananmen Square Track award') - game.state = 'vm_tst_3_prep' -} - -function vm_tst_4() { - log_gap('Tiananmen Square Track award') - game.vm_available_ops = 2 - game.remove_opponent_infl = true - game.state = 'vm_tst_4' -} -function vm_tst_6() { - log_h3('Tiananmen Square Track award') - game.vm_available_ops = 1 - game.temp = 1 //Set temp to 1, so that Card 1 is called during the support check, which has 2 ops - game.state = 'vm_tst_6' -} - -function vm_tst_8() { - game.state = 'vm_goodbye_lenin_ops' // Use this to resolve ops. -} - -// ==================== POWER STRUGGLE FUNCTIONS ====================== - -function vm_scare_tactics() { - game.vm_active_country = game.pwr_struggle_in - vm_next() -} -function vm_support_surges() { - game.state = 'vm_support_surges_1' -} - -function vm_support_falters() { - game.vm_available_ops = 2 - game.return === game.active - game.state = 'vm_support_falters' -} - -function vm_kremlin_coup_elite() { - game.valid_spaces=[] - elite_spaces.forEach(space => { - if (spaces[space].country === game.vm_active_country && !check_com_control(space)) { - game.valid_spaces.push(space); - } - }) - game.state = 'vm_kremlin_coup_take_control' -} - -/* ================== VM STATES ============================== */ - -states.vm_end_event = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}.` - }, - prompt () { - view.prompt = `${clean_name(cards[this_card()].name)}: done.` - if (game.vm_infl_to_do || game.return_state === 'vm_tst_8') { - gen_action('done') - } else { - gen_action('end_round') - } - }, - done() { - push_undo() - vm_end_event() - }, - end_round() { - push_undo() - game.return_state = '' - vm_end_event() - } -} - -states.vm_take_control = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt () { - if (game.vm_available_ops > 0 && game.valid_spaces.length === 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: all spaces controlled. Continue.` - gen_action('done') - } else if (game.vm_available_ops > 0 ) { - view.prompt = `${clean_name(cards[this_card()].name)}: take control of ${event_prompt()}.` - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } else { - view.prompt = `${clean_name(cards[this_card()].name)}. Take control: done.` - if (game.vm_infl_to_do) { - gen_action('done') - } else { - gen_action('end_round') - } - } - }, - infl(space) { - push_undo() - vm_take_control(space) - game.vm_available_ops-- - if (game.vm_available_ops === 0) { - game.valid_spaces = [] - vm_next() - } - }, - done() { - push_undo() - vm_next() - }, - end_round() { - push_undo() - vm_next() - } -} - -states.vm_add_infl = { - inactive: 'add Support Points.', - prompt () { - if (game.vm_available_ops > 0 && game.valid_spaces.length === 0 ) { - view.prompt = `${clean_name(cards[this_card()].name)}. No available spaces remaining. Add SPs: done.` - gen_action('done') - } - else if (game.vm_available_ops > 0 ) { - view.prompt = `${clean_name(cards[this_card()].name)}: add ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}.` - - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id) - } - } else { - get_end_infl_prompt() - } - }, - infl(space) { - vm_do_add_infl(space) - if (game.vm_available_ops === 0) { - game.valid_spaces = [] - if (game.summary.length > 0) { - pop_summary() - log_br() - } - - game.vm_event_done = true - vm_next() - } - }, - done () { - push_undo() - if (game.summary.length > 0) { - pop_summary() - log_br() - } - - game.vm_event_done = true - vm_next() - }, - end_round() { - push_undo() - if (game.summary.length > 0) { - pop_summary() - log_br() - } - - game.vm_event_done = true - vm_next() - } -} - -states.vm_add_infl_free = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}: add SPs.` - }, - prompt () { - if (game.vm_available_ops > 0 && game.valid_spaces.length === 0 ) { - view.prompt = `${clean_name(cards[this_card()].name)}. No available spaces remaining. Add SPs: done.` - gen_action('done') - } else if (game.vm_available_ops > 0 ) { - view.prompt = `${clean_name(cards[this_card()].name)}: add ${game.vm_available_ops} SPs to ${event_prompt()}.` - - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } else { - get_end_infl_prompt() - } - }, - infl(space) { - vm_do_add_infl_free(space) - if (game.vm_available_ops === 0) { - game.valid_spaces = [] - if (game.summary.length > 0) { - pop_summary() - log_br() - } - - game.vm_event_done = true - vm_next() - } - }, - done () { - push_undo() - game.valid_spaces = [] - game.vm_event_done = true - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - }, - end_round () { - push_undo() - game.valid_spaces = [] - game.vm_event_done = true - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } -} - -states.vm_add_x_infl = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}: add Support Points.` - }, -// inactive: `resolve ${cards[this_card()].name}: add influence.`, - prompt () { - if (game.vm_event === 101 && game.valid_spaces.length === 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: the Romanian Elite space no longer exists.` - gen_action('done') - } - else if (game.vm_available_ops > 0 ) { - view.prompt = `${clean_name(cards[this_card()].name)}: Add ${game.vm_available_ops} SPs to ${event_prompt()}.` - - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id) - } - } /*else { - view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` - gen_action('done') - }*/ - }, - infl(space) { - push_undo() - vm_do_add_x_infl(space) - if (game.vm_available_ops === 0) { - game.vm_event_done = true - vm_next() - } - /*if (game.vm_event === (105 || 68) { - vm_next() - return - } */ - - - //game.vm_event_done = true - //vm_next() - }, - done () { - push_undo() - game.vm_event_done = true - vm_next() - } -} - -states.vm_add_limited_infl = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}: add Support Points.` - }, - prompt () { - if (game.vm_available_ops > 0 && game.valid_spaces.length > 0) { - if (game.vm_max_infl === 1) { - view.prompt = `${clean_name(cards[this_card()].name)}: add ${pluralize(game.vm_max_infl,'SP')} ${event_prompt()}.` - } - else { - view.prompt = `${clean_name(cards[this_card()].name)}: add ${pluralize(game.vm_available_ops,'SP')} to ${event_prompt()}.` - } - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } /*else { - view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` - gen_action('done') - }*/ - }, - infl(space) { - vm_do_add_limited_infl(space, game.vm_max_infl) - if (game.vm_available_ops === 0 || game.valid_spaces.length === 0) { - game.valid_spaces = [] - if (game.summary.length > 0) { - pop_summary() - log_br() - } - game.vm_event_done = true - vm_next() - } - }, - /*done () { - push_undo() - if (game.summary.length > 0) { - pop_summary() - log_br() - } - game.vm_event_done = true - vm_next() - }*/ -} - -states.vm_remove_infl = { - inactive: 'remove Support Points.', - prompt () { - // Keep this so that there is an undo option in, e.g., Scare Tactics - if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: no further SPs to remove.` - gen_action('done') - return - } - if (game.vm_available_ops === 0 ) { - view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` - gen_action('done') - return - } - if (game.remove_opponent_infl) { - view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops, 'opponent SP')}${event_prompt()}.` - } - else { - view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}.` - } - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - }, - infl(space) { - push_undo() - vm_do_remove_infl(space) - game.vm_active_country = spaces[space].country - if (game.vm_event !== 44) { - if (game.vm_available_ops === 0 ) { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } - } - }, - done() { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } -} - - -states.vm_remove_x_infl = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}: remove SP from ${event_prompt()}.` - }, - prompt () { - if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: no SPs to remove.` - gen_action('done') - } else if (game.vm_available_ops > 0) { - - view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')} from ${event_prompt()}.` - - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } /*else { - if (game.vm_infl_to_do) { - view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done. Return control to phasing player.` - gen_action('done') - return - } else { - view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` - gen_action('done') - return - } - }*/ - }, - infl(space) { - vm_do_remove_x_infl(space) - /*if (game.vm_event === 68) { - vm_next() - return - }*/ - if (game.vm_available_ops === 0) { - game.vm_event_done = true - vm_next() - } - /*game.vm_event_done = true - vm_next()*/ - }, - done () { - game.vm_event_done = true - vm_next() - } -} - -states.vm_remove_limited_infl = { - inactive: 'remove SP.', - prompt () { - if (game.vm_available_ops > 0 && game.valid_spaces.length > 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}, no more than ${game.vm_max_infl} per space.` - - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } else if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: no further SP to remove.` - gen_action('done') - } /*else { - if (game.vm_infl_to_do) { - view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done. Return control to phasing player.` - gen_action('done') - return - } else { - view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` - gen_action('done') - return - } - }*/ - }, - infl(space) { - vm_do_remove_limited_infl(space, game.vm_max_infl) - if (game.vm_available_ops === 0) { - game.vm_event_done = true - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } - }, - done () { - game.vm_event_done = true - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } -} - -states.vm_remove_all_infl = { - inactive: 'remove Support Points', - prompt () { - if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: no SPs to remove.` - gen_action('pass') - } else if (game.vm_available_ops > 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: remove all SPs from ${event_prompt()}.` - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } /*else { - view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` - gen_action('done') - }*/ - }, - infl(space) { - vm_do_remove_all_infl(space) - game.vm_active_country = spaces[space].country - if (game.vm_available_ops === 0) { - vm_next() - } - }, - pass() { - push_undo() - vm_next() - } -} - -states.vm_support_check_prep = { - inactive: 'do support checks.', - prompt () { - /*if (game.vm_available_ops === 0) { - view.prompt = `${clean_name(cards[this_card()].name)}. Support check: done.` - gen_action('done') - } else */ - if (game.valid_spaces.length === 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: no valid targets for support check.` - gen_action('done') - } else { - //if (game.vm_available_ops > 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: ${event_prompt()}. ${pluralize(game.vm_available_ops, 'support check')} remaining.` - //} - for (let space_id of game.valid_spaces) { - if (!space_id) continue - gen_action_sc(space_id); - } - } - }, - sc(space) { - push_undo() - game.selected_space = space - - // Check for Austria-Hungary Border Reopened - check on first support check only - //First check for Monday Demonstrations - support checks will always be in East Germany - if (game.vm_event === 61 && game.persistent_events.includes(58)) { - game.austria_hungary_border_reopened_tracker = true - game.state = 'vm_do_support_check' - return - } - - //Then check Austria-Hungary Border Reopened normally - //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) - if (game.persistent_events.includes(58)) { - if (game.active === DEM && game.vm_available_ops > 1) { - if (spaces[game.selected_space].country === 'East_Germany' && game.persistent_events.includes(58) && game.active === DEM) { - game.state = 'vm_austria_hungary_border_reopened_check' - return - } - //game.state = 'do_support_check' - } /*else { */ - } - game.state = 'vm_do_support_check' - }, - done () { - push_undo() - game.vm_available_ops = 0 - vm_next () - } -} - -states.vm_ceh_support_check_prep = { - inactive: 'do support checks.', - prompt () { - /*if (game.vm_available_ops === 0) { - view.prompt = 'Support checks: done.' - gen_action('done') - return - }*/ - if (game.vm_available_ops > 0) { - view.prompt = `Select a space. ${pluralize(game.vm_available_ops, 'support check')} remaining.` - - for (let space_id of game.valid_spaces) { - gen_action_sc(space_id) - } - } - }, - sc(space) { - push_undo() - game.selected_space = space - - //Then check Austria-Hungary Border Reopened normally - //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) - if (game.persistent_events.includes(58)) { - if (game.active === DEM && game.vm_available_ops > 1) { - - if (spaces[game.selected_space].country === 'East_Germany' && game.persistent_events.includes(58) && game.active === DEM) { - game.state = 'vm_austria_hungary_border_reopened_check' - return - } - //game.state = 'do_support_check' - } /*else { */ - } - game.state = 'vm_ceh_do_support_check' - }, - /*done () { - vm_next () - }*/ -} - - -states.vm_ceh_do_support_check = { - inactive: 'do support checks.', - prompt () { - view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` - gen_action('roll') - }, - roll() { - clear_undo() - do_sc(game.selected_space) - - game.vm_available_ops-- - if (game.vm_available_ops === 0) { - game.valid_spaces = [] - vm_next() - } else { - game.state = 'vm_ceh_support_check_prep' - return - } - } -} - -states.vm_austria_hungary_border_reopened_check = { - inactive: 'decide Austria-Hungary Border Reopened', - prompt() { - view.prompt = 'Austria-Hungary Border Reopened: will all support checks be in East Germany?' - gen_action('yes') - gen_action('no') - }, - yes() { - game.austria_hungary_border_reopened_tracker = true - game.state = 'vm_do_support_check' - }, - no() { - game.state = 'vm_do_support_check' - } -} - -states.vm_1_support_check_prep = { - inactive: 'do support checks.', - prompt () { - /*if (game.vm_available_ops === 0) { - view.prompt = `${clean_name(cards[this_card()].name)}. Support check: done.` - gen_action('done') - } else */if (game.valid_spaces.length === 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: no valid targets for support check.` - gen_action('done') - } else { - view.prompt = `${clean_name(cards[this_card()].name)}: ${event_prompt()}.` - - for (let space_id of game.valid_spaces) { - if (!space_id) continue - gen_action_sc(space_id); - } - } - }, - sc(space) { - push_undo() - game.selected_space = space - game.state = 'vm_do_support_check' - }, - done () { - push_undo() - game.vm_available_ops = 0 - vm_next () - } -} - -states.vm_do_support_check = { - inactive: 'do support checks.', - prompt () { - view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` - gen_action('roll') - }, - roll() { - clear_undo() - do_sc(game.selected_space) - game.vm_available_ops-- - if (game.vm_available_ops === 0) { - game.valid_spaces = [] - vm_next() - return - } else { - game.state = 'vm_support_check_prep' - return - } - } -} - -states.vm_tiananmen_square_attempt = { - inactive: 'do Tiananmen Square', - prompt () { - /*if (game.active === DEM && game.dem_tst_attempted_this_turn > 0 || game.active === COM && game.com_tst_attempted_this_turn > 0) { - view.prompt = 'Tiananmen Square Track attempt: done.' - gen_action('done') - return - }*/ - view.prompt = 'Tiananmen Square: roll a die' - gen_action('roll') - }, - roll() { - clear_undo() - do_tst_attempt () - }, - /*done () { - vm_next() - }*/ -} - -//================================== EVENT SPECIFIC STATES ====================================== - -states.vm_adamec = { - get inactive() { - return `resolve ${clean_name(cards[88].name)}.` - }, - prompt() { - view.prompt = 'Adamec: roll a die.' - gen_action('roll') - }, - roll() { - clear_undo() - let roll = Math.floor(Math.random() * 6) + 1 - log(`Roll: D${roll}`) - let worker_spaces = spaces.filter(space => space && space.country === 'Czechoslovakia' && space.socio === 4 && check_dem_control(space.space_id)).length - if (worker_spaces > 0) { - log(`-${worker_spaces} from Democrat controlled worker spaces`) - roll -= worker_spaces - } - log(`Modified roll: ${roll}`) - if (roll > 2) { - log('Adamec succeeds') - vm_next() - return - } - log('Adamec fails: 3 or more required') - permanently_remove(88) - vm_return() - } -} - -states.vm_brought_in_for_questioning = { - inactive: 'discard a card.', - prompt() { - /*if (game.phase === 1) { - view.prompt = 'Discard a card: done.' - gen_action('done') - } else */ - if (game.democrat_hand.length === 0) { - view.prompt = 'Brought in for Questioning. No cards to discard.' - gen_action('pass') - } else { - view.prompt = 'Brought in for Questioning: you must discard a random card.' - gen_action('discard') - } - }, - discard() { - clear_undo() - game.vm_event = discard_card(game.democrat_hand) - game.phase = 1 - if (cards[game.vm_event].side === 'C' && (cards[game.vm_event].playable || game.playable_cards.includes(game.vm_event))) { - //game.return = game.active - if (!game.vm_infl_to_do) { - if(game.round_player === DEM) { - game.return = COM - } else { - game.return = DEM - } - } - if (!is_auto_resolve(game.vm_event) && !switch_events.includes(game.vm_event)) { - next_player() - } - goto_vm(game.vm_event) - } else { - game.return = DEM - vm_return() - } - }, - pass() { - log('No cards to discard') - vm_return() - }, - /*done() { - vm_return() - }*/ -} - -states.vm_central_committee_reshuffle = { - get inactive() { - return `resolve ${clean_name(cards[57].name)}.` - }, - prompt() { - if (game.revolutions.every(n => n === true)) { - view.prompt = 'Central Committee Reshuffle: no countries to choose.' - gen_action('pass') - } else { - view.prompt = 'Central Committee Reshuffle: choose a country to add SPs.' - if (!game.revolutions[0]) {gen_action('poland')} - if (!game.revolutions[1]) {gen_action('hungary')} - if (!game.revolutions[2]) {gen_action('east_germany')} - if (!game.revolutions[3]) {gen_action('bulgaria')} - if (!game.revolutions[4]) {gen_action('czechoslovakia')} - if (!game.revolutions[5]) {gen_action('romania')} - } - }, - east_germany() { - push_undo() - game.vm_active_country = "East_Germany" - log(`Chose ${country_name(game.vm_active_country)}`) - game.valid_spaces = [1,2,3,4,5,6,7,8,9,10,11,12] - vm_next() - }, - poland() { - push_undo() - game.vm_active_country = "Poland" - log(`Chose ${country_name(game.vm_active_country)}`) - game.valid_spaces = [13,14,15,16,17,18,19,20,21,22,23,24,25,26] - vm_next() - }, - czechoslovakia() { - push_undo() - game.vm_active_country = "Czechoslovakia" - log(`Chose ${country_name(game.vm_active_country)}`) - game.valid_spaces = [27,28,29,30,31,32,33,34,35,36,37] - vm_next() - }, - hungary() { - push_undo() - game.vm_active_country = "Hungary" - log(`Chose ${country_name(game.vm_active_country)}`) - game.valid_spaces = [38,39,40,41,42,43,44,45,46,47,48,49] - vm_next() - }, - romania() { - push_undo() - game.vm_active_country = "Romania" - log(`Chose ${country_name(game.vm_active_country)}`) - game.valid_spaces = [50,51,52,53,54,55,56,57,58,59,60,61,62,63] - game.valid_spaces = game.valid_spaces.filter(space => space !== game.systematization) - vm_next() - }, - bulgaria () { - push_undo() - game.vm_active_country = "Bulgaria" - log(`Chose ${country_name(game.vm_active_country)}`) - game.valid_spaces = [64,65,66,67,68,69,70,71,72,73,74,75] - vm_next() - }, - pass() { - log('Passed') - vm_return() - } - -} - -states.vm_common_european_home_choose = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - view.prompt = `Common European Home: play an opponent's card, event does not occur.` - for (let card of game.valid_cards) { - gen_action_card(card) - } - }, - card(card) { - push_undo() - //log(`Played with C${cards[card].number}`) - game.valid_cards = [] - silent_discard(card) - game.vm_event = card - game.state = 'vm_common_european_home_play' - } -} - -states.vm_common_european_home_play = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}.` - }, - prompt() { - view.prompt = `Play ${clean_name(cards[this_card()].name)} for:` - gen_action('influence') - gen_action('support_check') - if (game.active === DEM && game.vm_event === 87 ) { - return /*Special condition if card is actually Kohl Proposes Reunification*/ - } - /*if (game.active === DEM && game.dem_tst_attempted_this_turn === 0 || game.active === COM && game.com_tst_attempted_this_turn === 0) { - gen_action('tst') - } */ - }, - influence(){ - push_undo() - log_gap(`Played C${cards[game.vm_event].number} to place SPs`) - game.vm_available_ops = cards[game.vm_event].ops - valid_spaces_infl() - // If ABHR - Set AHBR tracker to true - if (game.persistent_events.includes(58)) { - game.austria_hungary_border_reopened_tracker = true - } - game.state = 'vm_add_infl' - }, - support_check() { - push_undo() - log_gap(`Played C${cards[game.vm_event].number} for support checks`) - game.vm_available_ops = 2 - game.state = 'vm_ceh_support_check_prep' - valid_spaces_sc() - }, - tst() { - push_undo() - log_gap(`Played C${cards[game.vm_event].number} to the Tiananmen Square Track`) - game.state = 'vm_tiananmen_square_attempt' - } -} - -states.vm_dash_for_the_west = { - get inactive() { - return `resolve ${clean_name(cards[36].name)}.` - }, - prompt() { - /* if (game.phase === 1) {*/ - view.prompt = 'Dash for the West: roll a die' - gen_action('roll') - /*} else { - view.prompt = 'Dash for the West: roll a die. Done.' - gen_action('done') - }*/ - }, - roll() { - clear_undo() - let roll = Math.floor(Math.random() * 6) + 1 - log(`Roll: D${roll}`) - let com_control = check_presence('East_Germany').com_spaces - - if (roll > com_control) { - log(`Success. More than the ${com_control} Communist controlled spaces in East Germany`) - log('+1 VP') - game.vp++ - if (check_vp()) { - return - } - game.discard = true - game.state = 'vm_play_event_from_discard' - } else { - log(`Fail: more than a ${com_control} required`) - //game.phase++ - vm_next() - } - },/* - done() { - vm_next() - }*/ -} - -states.vm_play_event_from_discard = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.valid_cards.length === 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: no valid cards in discard.` - gen_action('pass') - } else if (game.temp === 0) { - view.prompt = `${event_prompt()}.` - for (let card of game.valid_cards) { - gen_action('pass') - gen_action_card(card) - } - } /*else { - view.prompt = 'Choose a card: done.' - gen_action('done') - }*/ - }, - card(card) { - push_undo() - log(`Chose C${cards[card].number}`) - game.vm_event = card - game.vm_available_ops = cards[card].ops - game.discard = false - //game.return = game.active Does turning this off cause problems? - if (switch_events.includes(card)) {next_player()} - goto_vm(card) - }, - pass(){ - push_undo() - if (game.valid_cards.length === 0) { - log('No valid cards to choose') - } else{ - log('Did not choose a card') - } - vm_next() - }, -/* done(){ - push_undo() - game.discard = false - vm_next() - }*/ -} - -states.vm_deutsche_marks_prep = { - inactive: 'choose a card.', - prompt() { - if (game.valid_cards.length === 0) { - view.prompt = 'Deutsche Marks: no cards to give.' - gen_action('pass') - } else { - view.prompt = 'Deutsche Marks: choose a card to give.' - for (let card of game.valid_cards) { - gen_action_card(card) - } - } - }, - card(card) { - push_undo() - log(`Gave C${cards[card].number}`) - game.valid_cards = [] - silent_discard(card) - //next_player() - game.state = 'vm_deutsche_marks_confirm' - game.vm_event = card - }, - pass() { - push_undo() - vm_next() - } -} - -states.vm_deutsche_marks_confirm = { - inactive: 'choose a card.', - prompt() { - view.prompt = `Deutsche Marks: gave ${cards[game.vm_event].name}.` - gen_action('done') - }, - done() { - next_player() - game.state = 'vm_deutsche_marks' - } -} - -states.vm_deutsche_marks = { - get inactive() { - return `resolve ${clean_name(cards[20].name)}.` - }, - prompt() { - if(cards[game.vm_event].side === 'C' && (cards[game.vm_event].playable || game.playable_cards.includes(game.vm_event))) { - view.prompt = `Deutsche Marks: you must play ${clean_name(cards[this_card()].name)} for the event.` - gen_action('event') - } else { - view.prompt = `Deutsche Marks: play ${clean_name(cards[this_card()].name)} for:` - gen_action('influence') - gen_action('support_check') - if (game.com_tst_attempted_this_turn === 0) { - gen_action('tst') - } - } - }, - event() { - push_undo() - log(`Played C${cards[game.vm_event].number} for the event`) - if (!game.vm_infl_to_do) { - game.return = game.active - } - goto_vm(game.vm_event) - }, - influence() { - push_undo() - log(`Played C${cards[game.vm_event].number} to place SPs`) - game.vm_available_ops = get_card_ops(game.vm_event) - - /*cards[game.vm_event].ops - if (game.persistent_events.includes(25)) {game.vm_available_ops++ } - if (game.prudence.COM && game.prudence.COM < 0 ) { - game.vm_available_ops += game.prudence.COM - }*/ - valid_spaces_infl() - game.state = 'vm_add_infl' - }, - support_check() { - push_undo() - log_gap(`Played C${cards[game.vm_event].number} for support checks`) - game.vm_available_ops = 2 - game.state='vm_support_check_prep' - valid_spaces_sc() - }, - tst() { - push_undo() - log_gap(`Played C${cards[game.vm_event].number} to the Tiananmen Square Track`) - game.state='vm_tiananmen_square_attempt' - } -} - -states.vm_exit_visas = { - get inactive() { - return `resolve ${clean_name(cards[75].name)}.` - }, - prompt() { - view.prompt = 'Exit Visas: you may discard cards from your hand and draw replacements.' - for (let card of game.democrat_hand) { - gen_action_card(card) - } - if (game.temp === 0) { - gen_action('pass') - } else { - gen_action('done') - } - }, - card(card){ - push_undo() - discard(card) - game.temp++ - }, - pass() { - push_undo() - game.state = 'vm_exit_visas_finish' - }, - done() { - push_undo() - game.state = 'vm_exit_visas_finish' - } -} - -states.vm_exit_visas_finish = { - get inactive() { - return `resolve ${clean_name(cards[75].name)}.` - }, - prompt() { - if (game.temp > 0 ) { - view.prompt = 'Exit Visas: draw replacement cards.' - gen_action('draw') - } /*else { - view.prompt = 'Exit Visas. Draw cards: done.' - gen_action('done') - } */ - }, - draw() { - clear_undo() - draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length + game.temp, game.communist_hand.length) - game.temp = 0 - vm_next() - }, - /*done() { - vm_next() - }*/ -} - -states.vm_foreign_currency_debt_burden = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - view.prompt = 'Choose a country. The Communist may not make support checks there for the rest of the turn.' - gen_action('east_germany') - gen_action('poland') - gen_action('czechoslovakia') - gen_action('hungary') - gen_action('bulgaria') - }, - east_germany() { - push_undo() - game.foreign_currency_debt_burden = 'East_Germany' - log('Selected East Germany') - vm_next() - }, - poland() { - push_undo() - game.foreign_currency_debt_burden = 'Poland' - log('Selected Poland') - vm_next() - }, - czechoslovakia() { - push_undo() - game.foreign_currency_debt_burden = 'Czechoslovakia' - log('Selected Czechoslovakia') - vm_next() - }, - hungary() { - push_undo() - game.foreign_currency_debt_burden = 'Hungary' - log('Selected Hungary') - vm_next() - }, - bulgaria() { - push_undo() - game.foreign_currency_debt_burden = 'Bulgaria' - log('Selected Bulgaria') - vm_next() - } -} - -states.vm_goodbye_lenin = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.valid_cards.length > 0 ) { - view.prompt = `Play a red event from your opponent's hand, or play Goodbye Lenin for operations.` - for (let card of game.valid_cards) { - gen_action_card(card) - gen_action('ops') - } - } else { - view.prompt = 'Communist has no red events. Play Goodbye Lenin for operations.' - gen_action('ops') - } - }, - card(card) { - push_undo() - log(`Chose to play C${card} for the event`) - let card_index = game.communist_hand.indexOf(card) - game.communist_hand.splice(card_index, 1) - game.vm_event = card - game.view_opp_hand = false - goto_vm(card) - }, - ops() { - push_undo() - if (game.valid_cards.length === 0) { - logi('No red events') - } - log('C46 played for operations') - game.view_opp_hand = false - game.state = 'vm_goodbye_lenin_ops' - } -} - -states.vm_goodbye_lenin_ops = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}.` - }, - prompt() { - view.prompt = `Play ${clean_name(cards[this_card()].name)} for:` - gen_action('influence') - gen_action('support_check') - if ((game.active === DEM && game.dem_tst_attempted_this_turn === 0 ) || (game.active === COM && game.com_tst_attempted_this_turn === 0 )) { - gen_action('tst') - } - }, - influence(){ - push_undo() - game.vm_available_ops = get_card_ops(this_card()) - /*if (game.persistent_events.includes(50)) { - log(`+1 from C50`) - game.vm_available_ops++ - }*/ - valid_spaces_infl() - - // If ABHR - Set AHBR tracker to true - if (game.persistent_events.includes(58)) { - game.austria_hungary_border_reopened_tracker = true - } - game.state = 'vm_add_infl' - }, - support_check() { - push_undo() - game.vm_available_ops = 2 - game.state = 'vm_support_check_prep' - valid_spaces_sc() - }, - tst() { - push_undo() - game.state = 'vm_tiananmen_square_attempt' - } -} - -states.vm_honecker = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.valid_cards.length === 0 && game.temp === 0) { - view.prompt = 'Honecker: no valid cards to choose.' - gen_action('pass') - } else - if (game.temp === 0) {view.prompt = 'Honecker: choose a card to add to your hand.' - for (let card of game.valid_cards) { - gen_action_card(card) - gen_action('pass') - } - } /*else { - view.prompt = 'Honecker. Choose a card: done.' - gen_action('done') - }*/ - }, - card(card) { - push_undo() - game.valid_cards = [] - log(`Took C${cards[card].number} into hand`) - game.temp = card - let card_index = game.strategy_discard.indexOf(card) - game.strategy_discard.splice(card_index, 1) - game.communist_hand.push(card) - vm_next() - }, - pass(){ - log('Did not take a card') - game.discard = false - vm_next() - }, - /*done(){ - if (game.temp === 0) { - log('Did not take a card') - } - game.discard = false - vm_next() - } */ - -} - -states.vm_inflationary_currency = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if ((game.active === COM && game.revolutions.every(n => n === false)) || (game.active === DEM && game.revolutions.every(n => n === true))) { - view.prompt = 'Inflationary Currency: no countries to choose.' - gen_action('pass') - } else { - view.prompt = 'Inflationary Currency: choose a country where your opponent has power.' - if (game.active === DEM) { - if (!game.revolutions[0]) {gen_action('poland')} - if (!game.revolutions[1]) {gen_action('hungary')} - if (!game.revolutions[2]) {gen_action('east_germany')} - if (!game.revolutions[3]) {gen_action('bulgaria')} - if (!game.revolutions[4]) {gen_action('czechoslovakia')} - if (!game.revolutions[5]) {gen_action('romania')} - } else { - if (game.revolutions[0]) {gen_action('poland')} - if (game.revolutions[1]) {gen_action('hungary')} - if (game.revolutions[2]) {gen_action('east_germany')} - if (game.revolutions[3]) {gen_action('bulgaria')} - if (game.revolutions[4]) {gen_action('czechoslovakia')} - if (game.revolutions[5]) {gen_action('romania')} - } - } - }, - east_germany() { - push_undo() - game.vm_active_country = 'East_Germany' - log(`Chose ${country_name(game.vm_active_country)}`) - vm_next() - }, - poland() { - push_undo() - game.vm_active_country = 'Poland' - log(`Chose ${country_name(game.vm_active_country)}`) - vm_next() - }, - czechoslovakia() { - push_undo() - game.vm_active_country = 'Czechoslovakia' - log(`Chose ${country_name(game.vm_active_country)}`) - vm_next() - }, - hungary() { - push_undo() - game.vm_active_country = 'Hungary' - log(`Chose ${country_name(game.vm_active_country)}`) - vm_next() - }, - romania() { - push_undo() - game.vm_active_country = 'Romania' - log(`Chose ${country_name(game.vm_active_country)}`) - vm_next() - }, - bulgaria () { - push_undo() - game.vm_active_country = 'Bulgaria' - log(`Chose ${country_name(game.vm_active_country)}`) - vm_next() - }, - pass() { - log('Passed') - vm_return() - } -} - -states.vm_inflationary_currency_discard = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.valid_cards.length === 0 ) { - view.prompt = 'Inflationary Currency: no valid cards to discard. You must pass.' - gen_action('pass') - } else if (game.temp === 0 ) { - view.prompt = 'Inflationary Currency: you may discard a 3 op or higher value card to cancel the support check.' - gen_action('pass') - for (let card of game.valid_cards) { - gen_action_card(card) - } - } /*else { - view.prompt = 'Inflationary Currency. Discard a card: done.' - gen_action('done') - } */ - }, - card(card) { - push_undo() - discard(card) - game.temp = card - if (!game.vm_infl_to_do) { - if(game.round_player === DEM) { - game.return = COM - } else { - game.return = DEM - } - } - vm_next() - }, - pass() { - push_undo() - log('Did not discard') - next_player() - game.vm_available_ops = 1 - vm_next() - //game.state = 'vm_support_check_prep' - }, - done() { - if (!game.vm_infl_to_do) { - if(game.round_player === DEM) { - game.return = COM - } else { - game.return = DEM - } - } - vm_next() - } -} - - -states.vm_kiss_of_death = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.communist_hand.length === 0) { - view.prompt = 'Kiss of Death. No cards to discard.' - gen_action('pass') - } else { - view.prompt = 'Kiss of Death: you must randomly discard a card.' - gen_action('discard') - } - }, - discard() { - clear_undo() - game.vm_event = discard_card(game.communist_hand) - //Only switch player if a playable non-communist event. Common European Home is not playable here - if (cards[game.vm_event].side !== "C" && event_is_playable(game.vm_event) && game.vm_event !== 21) { - next_player() - game.state = 'vm_kiss_of_death_finish' - } else { - log('Event does not occur') - vm_next() - } - }, - pass() { - log('No card to discard') - vm_next() - } -} - -states.vm_kiss_of_death_finish = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.vm_event > 0 && game.vm_event !== 21 && (cards[game.vm_event].side === 'D' || cards[game.vm_event].side === 'N')) { - view.prompt = `Play ${clean_name(cards[game.vm_event].name)} for the event.` - console.log('kiss of death before event button: game.stategy_discard', game.strategy_discard) - gen_action('event') - } else { - view.prompt = 'Event does not occur.' - gen_action('done') - } - }, - event() { - //game.return = game.active - // Remove game.vm_event from the discard - //game.strategy_discard = game.strategy_discard.filter(n => n !== game.vm_event) - - goto_vm(game.vm_event) - }, - done() { - vm_next() - } -} - -states.vm_kremlin_coup_choose_country = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}.` - }, - prompt() { - if (game.temp.length > 0) { - view.prompt = 'Kremlin Coup! Select a country where the Communist retains power.' - for (let country of countries) { - if (game.temp.includes(country)) { - gen_action(`${country.toLowerCase()}`) - } - } - } else { - view.prompt = 'Kremlin Coup! There are no countries where the Communist retains power.' - gen_action('done') - } - }, - east_germany() { - push_undo() - game.vm_active_country = 'East_Germany' - game.temp = game.temp.filter(country => country !== game.vm_active_country) - log(`${country_name(game.vm_active_country)}:`) - vm_kremlin_coup_elite() - }, - poland() { - push_undo() - game.vm_active_country = 'Poland' - log(`${country_name(game.vm_active_country)}:`) - game.temp = game.temp.filter(country => country !== game.vm_active_country) - vm_kremlin_coup_elite() - }, - czechoslovakia() { - push_undo() - game.vm_active_country = 'Czechoslovakia' - log(`${country_name(game.vm_active_country)}:`) - game.temp = game.temp.filter(country => country !== game.vm_active_country) - vm_kremlin_coup_elite() - }, - hungary() { - push_undo() - game.vm_active_country = 'Hungary' - log(`${country_name(game.vm_active_country)}:`) - game.temp = game.temp.filter(country => country !== game.vm_active_country) - vm_kremlin_coup_elite() - }, - romania() { - push_undo() - game.vm_active_country = 'Romania' - log(`${country_name(game.vm_active_country)}:`) - game.temp = game.temp.filter(country => country !== game.vm_active_country) - vm_kremlin_coup_elite() - }, - bulgaria () { - push_undo() - game.vm_active_country = 'Bulgaria' - log(`${country_name(game.vm_active_country)}:`) - game.temp = game.temp.filter(country => country !== game.vm_active_country) - vm_kremlin_coup_elite() - }, - done() { - game.temp = 0 - vm_next() - } -} - -states.vm_kremlin_coup_take_control = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.valid_spaces.includes(game.systematization)) { - view.prompt = `Kremlin Coup! ${country_name(game.vm_active_country)}'s Elite space no longer exists.` - gen_action('done') - } - else if (game.valid_spaces.length === 0){ - view.prompt = `Kremlin Coup! ${country_name(game.vm_active_country)}'s Elite space is already controlled.` - gen_action('done') - } else { - view.prompt = `Kremlin Coup! Take control of the Elite space in ${country_name(game.vm_active_country)}.` - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } - }, - infl(space) { - push_undo() - vm_take_control(space) - if (game.vm_active_country === 'East_Germany') {game.selected_space = 3 } - if (game.vm_active_country === 'Poland') {game.selected_space = 17} - if (game.vm_active_country === 'Czechoslovakia') {game.selected_space = 29} - if (game.vm_active_country === 'Hungary') {game.selected_space = 45} - if (game.vm_active_country === 'Romania') {game.selected_space = 61} - if (game.vm_active_country === 'Bulgaria') {game.selected_space = 68} - game.state = 'vm_kremlin_coup_sc_prep' - }, - done() { - push_undo() - if (game.vm_active_country === 'East_Germany') {game.selected_space = 3 } - if (game.vm_active_country === 'Poland') {game.selected_space = 17} - if (game.vm_active_country === 'Czechoslovakia') {game.selected_space = 29} - if (game.vm_active_country === 'Hungary') {game.selected_space = 45} - if (game.vm_active_country === 'Romania') {game.selected_space = 61} - if (game.vm_active_country === 'Bulgaria') {game.selected_space = 68} - game.state = 'vm_kremlin_coup_sc_prep' - } -} - -states.vm_kremlin_coup_sc_prep = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - view.prompt = `Kremlin Coup! Conduct a support check in ${country_name(game.vm_active_country)}'s Bureaucratic space.` - gen_action_sc(game.selected_space); - }, - sc(space) { - //game.selected_space = space - push_undo() - game.state = 'vm_kremlin_coup_sc' - } -} - -states.vm_kremlin_coup_sc = { - inactive: 'do support checks', - prompt () { - view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` - gen_action('roll') - }, - roll() { - clear_undo() - do_sc(game.selected_space) - if (game.temp.length > 0 ){ - game.state = 'vm_kremlin_coup_choose_country' - } else { - //game.state = 'vm_kremlin_coup_end' - vm_next() - } - } -} -/* -states.vm_kremlin_coup_end = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}.` - }, - prompt() { - view.prompt = `${clean_name(cards[this_card()].name)} Support checks: done.` - gen_action('done') - }, - done() { - vm_next() - } -} -*/ -states.vm_laszlo_tokes = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - view.prompt = `Laszlo Tokes. Choose to:` - gen_action('influence') - gen_action('support_check') - }, - influence(){ - push_undo() - game.vm_available_ops = get_card_ops(73) - valid_spaces_infl() - game.valid_spaces = game.valid_spaces.filter(space_id => spaces[space_id].country === 'Romania') - game.phase = 3 - vm_next() - //game.state = 'vm_add_infl' - }, - support_check() { - push_undo() - game.vm_available_ops = 2 - //game.state = 'vm_support_check_prep' - valid_spaces_sc() - game.valid_spaces = game.valid_spaces.filter(space_id => spaces[space_id].country === 'Romania') - vm_next() - } -} - -states.vm_switch_infl = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.valid_spaces.length === 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: No SPs to remove.` - gen_action('pass') - } else { - /*if (game.vm_available_ops > 0 ) {*/ - view.prompt = `${clean_name(cards[game.played_card].name)}: ${event_prompt()}.` - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } /*else { - view.prompt = 'Influence replaced.' - gen_action('done') - }*/ - }, - infl(space) { - push_undo() - vm_switch_infl(space) - if (game.vm_available_ops === 0) { - game.valid_spaces = [] - } - vm_next() - }, - pass() { - vm_next() - } - /*done() { - vm_next() - }*/ -} - -states.vm_malta_summit = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - /*if (game.phase === 1) {*/ - view.prompt = 'Malta Summit: roll a die.' - gen_action('roll') - /*} else { - view.prompt = 'Done.' - gen_action('done') - }*/ - }, - roll() { - clear_undo() - let roll = Math.floor(Math.random() * 6) + 1 - log(`Roll: D${roll}`) - if (game.stability > 0) { - log(`+${game.stability} from USSR Stability Track`) - log(`Modified roll: ${roll + game.stability}`) - } - if (roll + game.stability > 3) { - log('Summit successful') - game.vp += 3 - log('+3 VP') - if (check_vp()) { - return - } - if (game.comInfl[12] > 0 ) {game.valid_spaces.push(12)} - if (game.comInfl[15] > 0 ) {game.valid_spaces.push(15)} - if (game.comInfl[27] > 0 ) {game.valid_spaces.push(27)} - if (game.comInfl[43] > 0 ) {game.valid_spaces.push(43)} - if (game.comInfl[51] > 0 ) {game.valid_spaces.push(51)} - if (game.comInfl[69] > 0 ) {game.valid_spaces.push(69)} - //game.vm_available_ops = 5 - game.remove_opponent_infl = true - vm_next() - } - else { - log('Summit failed. Required 4 or more') - //game.phase++ - vm_goto_step(vm_permanently_remove) - } - }, - /*done() { - vm_next() - }*/ -} - -states.vm_modrow = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - view.prompt = `Modrow: roll a die.` - gen_action('roll') - }, - roll(){ - clear_undo() - let roll = Math.floor(Math.random() * 6) + 1 - let dem_spaces = spaces.filter(space => space && space.country === 'East_Germany' && check_dem_control(space.space_id)).length - if (roll > dem_spaces) { - log(`Roll: D${roll}`) - log(`Success. More than the ${dem_spaces} Democratically controlled spaces`) - vm_next() - } else { - log(`Roll: D${roll}`) - log(`Fail. More than ${dem_spaces} required`) - permanently_remove(83) - vm_return() - } - } -} - -states.vm_nepotism = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - //if (game.phase === 1 ) { - view.prompt = 'Nepotism: roll a die.' - gen_action('roll') - /*} else { - view.prompt = 'Roll a die: done.' - gen_action('done') - }*/ - }, - roll() { - clear_undo() - let roll = Math.floor(Math.random() * 6) + 1 - if (roll < 3) { - log(`Roll: D${roll} adds 4 SPs`) - game.vm_available_ops = 4} - else if (roll < 5 ) { - log(`Roll: D${roll} adds 3 SPs`) - game.vm_available_ops = 3} - else { - log(`Roll: D${roll} adds 1 SP`) - game.vm_available_ops = 1} - //game.phase = 2 - vm_next() - }, - /*done() { - vm_next() - }*/ -} - -states.vm_new_years_eve_party = { - get inactive() { - return `resolve ${clean_name(cards[104].name)}.` - }, - prompt() { - view.prompt = 'Choose whether the game ends at the end of this turn.' - gen_action('end') - gen_action('continue') - }, - end() { - push_undo() - game.persistent_events.push(104) - log('Chooses to end the game. There will be no final scoring') - let power = game.revolutions.filter(value => value === false).length - if (power > 3) { - log(`Communist holds power in ${power} countries. -3 VP`) - game.vp -= 3 - } else { - log(`Communist holds power in ${power} countries. +3 VP`) - game.vp += 3 - } - if (check_vp()) { - return - } - //game.table_cards.push(104) - permanently_remove(104) - vm_next() - }, - continue() { - push_undo() - log('Chooses to continue') - permanently_remove(104) - vm_next() - } -} - -states.vm_nomenklatura = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - view.prompt = 'Nomenklatura: choose to remove all Democratic SPs from Elite spaces or add 3 SPs to any Elite space(s).' - gen_action('remove') - gen_action('add') - }, - remove() { - push_undo() - game.valid_spaces = [] - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - - if (space.socio === 1 && game.demInfl[i] > 0) { - game.valid_spaces.push(space.space_id) - } - } - game.vm_available_ops = game.valid_spaces.length - game.remove_opponent_infl = true - game.state = 'vm_nomenklatura_remove' - }, - add() { - push_undo() - game.valid_spaces = [] - for (let space of spaces) { - if (!space) continue - if (space.socio === 1) { - game.valid_spaces.push(space.space_id) - } - } - check_systematization() - game.vm_available_ops = 3 - game.state = 'vm_nomenklatura_add' - } -} - -states.vm_nomenklatura_remove = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.valid_spaces.length === 0 ) { - view.prompt = 'Nomenklatura. No SPs to remove: pass.' - gen_action('pass') - } else { - view.prompt = 'Nomenklatura: remove all Democratic SPs from Elite spaces.' - - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } - }, - infl(space) { - push_undo() - vm_do_remove_all_infl(space) - if (game.valid_spaces.length === 0) { - vm_next() - } - }, - pass() { - push_undo() - vm_next() - } -} - -states.vm_nomenklatura_add = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - /*if (game.vm_available_ops === 0 || game.valid_spaces.length === 0 ) { - view.prompt = 'Nomenklatura. Add SPs: done.' - gen_action('done') - } else { */ - view.prompt = `Nomenklatura: add 3 SPs to any Elite space(s). ${pluralize(game.vm_available_ops, 'SP')} remaining.` - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - //} - }, - infl(space) { - push_undo() - vm_do_add_infl_free(space) - if (game.vm_available_ops === 0 ) { - game.valid_spaces = [] - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } - }, -/* done() { - push_undo() - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - }*/ -} - -states.vm_samizdat = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - view.prompt = 'Samizdat: you may set aside a card from your hand and draw a replacement.' - for (let card of game.democrat_hand) { - gen_action_card(card) - } - gen_action('pass') - }, - card(card) { - push_undo() - game.samizdat_card = card - game.democrat_hand = game.democrat_hand.filter(c => c !== card) - log('Set aside a card') - game.state = 'vm_samizdat_finish' - }, - pass() { - push_undo() - //if (game.samizdat_card > 0) {game.state = 'vm_samizdat_finish'} - /*else { */ - log('Did not set aside a card') - vm_next() - //} - } -} - -states.vm_samizdat_finish = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - /*if (game.phase ) { - view.prompt = 'Samizdat: done.' - gen_action('done') - } else {*/ - view.prompt = 'Draw a replacement card.' - gen_action('draw') - //} - }, - draw() { - clear_undo() - game.democrat_hand.push(draw_card(game.strategy_deck)) - vm_next() - //game.phase ++ - }, - /*done() { - vm_next() - }*/ -} - -states.vm_shock_therapy = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.revolutions.every(n => n === false)) { - view.prompt = 'Shock Therapy: no countries to choose.' - gen_action('pass') - } else { - if (game.vm_active_country === '' ) { - view.prompt = 'Shock Therapy: choose a country where you hold Power:' - if (game.revolutions[0]) {gen_action('poland')} - if (game.revolutions[1]) {gen_action('hungary')} - if (game.revolutions[2]) {gen_action('east_germany')} - if (game.revolutions[3]) {gen_action('bulgaria')} - if (game.revolutions[4]) {gen_action('czechoslovakia')} - if (game.revolutions[5]) {gen_action('romania')} - } /*else if (game.phase === 2) { - view.prompt = 'Shock Therapy: done.' - gen_action('done') - } */ - else { - view.prompt = 'Shock Therapy: roll a die.' - gen_action('roll') - } - } - }, - east_germany() { - push_undo() - game.vm_active_country = 'East_Germany' - log(`Chose ${country_name(game.vm_active_country)}`) - }, - poland() { - push_undo() - game.vm_active_country = 'Poland' - log(`Chose ${country_name(game.vm_active_country)}`) - }, - czechoslovakia() { - push_undo() - game.vm_active_country = 'Czechoslovakia' - log(`Chose ${country_name(game.vm_active_country)}`) - }, - hungary() { - push_undo() - game.vm_active_country = 'Hungary' - log(`Chose ${country_name(game.vm_active_country)}`) - }, - romania() { - push_undo() - game.vm_active_country = 'Romania' - log(`Chose ${country_name(game.vm_active_country)}`) - }, - bulgaria () { - push_undo() - game.vm_active_country = 'Bulgaria' - log(`Chose ${country_name(game.vm_active_country)}`) - }, - roll() { - clear_undo() - let roll = Math.floor(Math.random() * 6) + 1 - let worker_farmer = 0 - for (let space of spaces) { - if (space && space.country === game.vm_active_country && check_com_control(space.space_id) && (space.socio === 3 || space.socio === 4)) { - worker_farmer++ - } - } - log(`Roll: D${roll}`) - log(`-${worker_farmer} from Communist controlled Worker and Farmer spaces`) - log(`Modified roll: ${roll - worker_farmer}`) - if ((roll - worker_farmer) > 2) { - log('C93 is successful. +3 VP') - vm_next() - } else { - log('C93 is unsuccessful. Required 3 or more') - //game.phase++ - permanently_remove(93) - vm_return() - } - }, - pass() { - log('Passed') - vm_return() - } - /*done() { - permanently_remove(93) - vm_return() - }*/ -} - -states.vm_social_democratic_platform_adopted = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.revolutions.every(n => n === false)) { - view.prompt = 'Social Democratic Platform Adopted: no countries to choose.' - gen_action('pass') - } else { - view.prompt = 'Select a country where the Democrat holds Power.' - if (game.revolutions[0]) {gen_action('poland')} - if (game.revolutions[1]) {gen_action('hungary')} - if (game.revolutions[2]) {gen_action('east_germany')} - if (game.revolutions[3]) {gen_action('bulgaria')} - if (game.revolutions[4]) {gen_action('czechoslovakia')} - if (game.revolutions[5]) {gen_action('romania')} - } - }, - east_germany() { - push_undo() - game.vm_active_country = 'East_Germany' - log(`Selected ${country_name(game.vm_active_country)}`) - vm_next() - }, - poland() { - push_undo() - game.vm_active_country = 'Poland' - log(`Selected ${country_name(game.vm_active_country)}`) - vm_next()}, - czechoslovakia() { - push_undo() - game.vm_active_country = 'Czechoslovakia' - log(`Selected ${country_name(game.vm_active_country)}`) - vm_next()}, - hungary() { - push_undo() - game.vm_active_country = 'Hungary' - log(`Selected ${country_name(game.vm_active_country)}`) - vm_next() - }, - romania() { - push_undo() - game.vm_active_country = 'Romania' - log(`Selected ${country_name(game.vm_active_country)}`) - vm_next() - }, - bulgaria () { - push_undo() - game.vm_active_country = 'Bulgaria' - log(`Selected ${country_name(game.vm_active_country)}`) - vm_next() - }, - pass() { - log('Passed') - vm_return() - } -} - -states.vm_systematization = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - /*if (game.systematization === 0) { */ - view.prompt = 'Systematization: eliminate a space in Romania.' - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - /*} else { - view.prompt = 'Systematization: done.' - gen_action('done') - }*/ - }, - infl(space) { - push_undo() - vm_eliminate(space) - game.valid_spaces = [] - game.systematization = space - game.persistent_events.push(69) - vm_next() - }, -/* done() { - vm_next() - } */ -} - -states.vm_the_chinese_solution = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - view.prompt = 'The Chinese Solution: you may give up 3 VP to conduct support checks in a country where you hold power.' - if (!game.revolutions[0]) {gen_action('poland')} - if (!game.revolutions[1]) {gen_action('hungary')} - if (!game.revolutions[2]) {gen_action('east_germany')} - if (!game.revolutions[3]) {gen_action('bulgaria')} - if (!game.revolutions[4]) {gen_action('czechoslovakia')} - if (!game.revolutions[5]) {gen_action('romania')} - gen_action('pass') - }, - east_germany() { - push_undo() - game.vm_active_country = 'East_Germany' - log(`Chose ${country_name(game.vm_active_country)}`) - log('+3 VP') - game.vp += 3 - if (check_vp()) { - return - } - vm_next() - }, - poland() { - push_undo() - game.vm_active_country = 'Poland' - log(`Chose ${country_name(game.vm_active_country)}`) - log('+3 VP') - game.vp += 3 - if (check_vp()) { - return - } - vm_next() - }, - czechoslovakia() { - push_undo() - game.vm_active_country = 'Czechoslovakia' - log(`Chose ${country_name(game.vm_active_country)}`) - log('+3 VP') - game.vp += 3 - if (check_vp()) { - return - } - vm_next() - }, - hungary() { - push_undo() - game.vm_active_country = 'Hungary' - log(`Chose ${country_name(game.vm_active_country)}`) - log('+3 VP') - game.vp += 3 - if (check_vp()) { - return - } - vm_next() - }, - romania() { - push_undo() - game.vm_active_country = 'Romania' - log(`Chose ${country_name(game.vm_active_country)}`) - log('+3 VP') - game.vp += 3 - if (check_vp()) { - return - } - vm_next() - }, - bulgaria () { - push_undo() - game.vm_active_country = 'Bulgaria' - log(`Chose ${country_name(game.vm_active_country)}`) - log('+3 VP') - game.vp += 3 - if (check_vp()) { - return - } - vm_next() - }, - pass() { - push_undo() - permanently_remove(96) - vm_return() - } -} - -states.vm_the_tyrant_is_gone = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (!game.the_tyrant_is_gone) { - view.prompt = 'The Tyrant is Gone: Select a space in Romania for the Ceausescus to flee to.' - for (let space_id of game.valid_spaces) { - if (!space_id) continue - gen_action_infl(space_id); - } - } else { - view.prompt = 'The Tyrant is Gone: done.' - gen_action('done') - } - }, - infl(space) { - push_undo() - log(`The Ceausescus flee to %${space}`) - game.the_tyrant_is_gone = space - game.valid_spaces = [] - game.persistent_events.push(97) - - // vm_next() - }, - done () { - vm_next() - } -} -/* -states.vm_tyrant_block ={ - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}.` - }, - prompt() { - view.prompt = `${clean_name(cards[this_card()].name)} has no effect after The Tyrant Has Gone.` - gen_action('done') - }, - done() { - push_undo() - vm_next() - } -}*/ - - -states.vm_the_wall_must_go = { - get inactive() { - return `resolve ${clean_name(cards[this_card()].name)}.` - }, - prompt() { - /*if (game.the_wall_must_go['dem_wins'] === 2 || game.the_wall_must_go['com_wins'] === 2) { - view.prompt = '"The Wall Must Go!" Rolls: done.' - gen_action('done') - } else { */ - view.prompt = ('The Wall Must Go! Roll a die.') - gen_action('roll') - //} - }, - roll() { - clear_undo() - let attempt = game.the_wall_must_go['dem_wins'] + game.the_wall_must_go['com_wins'] - if (game.the_wall_must_go['dem_roll'] === 0 && game.the_wall_must_go['com_roll'] === 0) { - log_h3(`Round ${attempt+1}`) - } - - let roll = Math.floor(Math.random() * 6) + 1 - log(`Roll: D${roll}`) - if (game.active === DEM) { - let controlled_spaces = spaces.filter(space => space && space.country === 'East_Germany' && check_dem_control(space.space_id)).length - if (controlled_spaces > 0) { - log(`+${controlled_spaces} from controlled spaces in East Germany`) - log(`Modified roll: ${roll + controlled_spaces}`) - roll += controlled_spaces - } - game.the_wall_must_go['dem_roll'] = roll - } else { - let controlled_spaces = spaces.filter(space => space && space.country === 'East_Germany' && check_com_control(space.space_id)).length - if (controlled_spaces > 0) { - log(`+${controlled_spaces} from controlled spaces in East Germany`) - log(`Modified roll: ${roll + controlled_spaces}`) - roll += controlled_spaces - } - game.the_wall_must_go['com_roll'] = roll - - } - if (game.the_wall_must_go['dem_roll'] > 0 && game.the_wall_must_go['com_roll'] > 0) { - if (game.the_wall_must_go['dem_roll'] > game.the_wall_must_go['com_roll'] ) { - log('Democrat wins') - game.the_wall_must_go['dem_wins']++ - } else if (game.the_wall_must_go['dem_roll'] === game.the_wall_must_go['com_roll'] ) { - log('Tie. Re-roll') - } else { - log('Communist wins') - game.the_wall_must_go['com_wins']++ - } - - log(`Democrat: ${game.the_wall_must_go['dem_wins']}, Communist: ${game.the_wall_must_go['com_wins']}`) - } - if (game.the_wall_must_go['dem_wins'] === 2) { - log('The Democrat wins C86') - finish_the_wall() - return - } - if (game.the_wall_must_go['com_wins'] === 2) { - log('The Communist wins C86') - finish_the_wall() - return - } - if (game.the_wall_must_go['dem_roll'] === 0 || game.the_wall_must_go['com_roll'] === 0) { - next_player() - } else { - game.the_wall_must_go['dem_roll'] = 0 - game.the_wall_must_go['com_roll'] = 0 - } - }, - /*done() { - if (game.the_wall_must_go['dem_wins'] === 2) { - game.persistent_events.push(86) - log('+3 VP') - game.vp += 3 - if (check_vp()) { - return - } - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - if (space.country === 'East_Germany' && game.comInfl[i] > 0){ - game.valid_spaces.push(space.space_id) - } - } - if (!game.vm_infl_to_do) { - if (game.round_player === DEM) { - game.return = COM - } else { - game.return = DEM - } - } - if (game.active === DEM) {next_player()} - vm_next () - } else { - permanently_remove(86) - delete game.the_wall_must_go - vm_return() - } - }*/ -} - -states.vm_warsaw_pact_summit = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - view.prompt = 'Choose to play for support checks or place SPs.' - gen_action('influence') - gen_action('support_check') - }, - influence(){ - push_undo() - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - if (game.demInfl[i] === 0) { - game.valid_spaces.push(space.space_id); - } - } - game.vm_available_ops = 4 - game.phase = 3 - //game.state = 'vm_add_infl' - vm_next() - }, - support_check(){ - push_undo() - for (let i = 1; i < spaces.length; i++) { - let space = spaces[i] - if (game.demInfl[i] > 0 && (space.socio === 5 || space.socio === 6)) { - game.valid_spaces.push(space.space_id) - } - } - game.vm_available_ops = 2 - //game.state = 'vm_support_check_prep' - vm_next() - } -} - -states.vm_we_are_the_people_remove = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.demInfl[6] === 0 && game.vm_available_ops > 0) { - view.prompt = '"We are the People!": no SPs to remove.' - gen_action('done') - } else if (game.vm_available_ops > 0 ) { - view.prompt = '"We are the People!": remove up to 4 SPs from the Lutherian Church.' - gen_action('done') - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - } else { - view.prompt = '"We are the People!" Remove SPs: done.' - gen_action('done') - } - }, - infl(space) { - vm_do_remove_infl(space) - }, - done() { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - if (!game.vm_influence_added[6]) { - log('No SPs removed') - vm_next() - } else { - game.valid_spaces = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] - game.state = 'vm_we_are_the_people_add' - } - } -} -states.vm_we_are_the_people_add = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - /* if (!game.vm_influence_added[6]) { - view.prompt = '"We are the People!" Add SPs: done.' - gen_action('done') - return - }*/ - - view.prompt = `"We are the People!": you must add the ${pluralize(game.vm_influence_added[6],'SP')} to spaces in Germany.` - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - }, - infl(space) { - vm_do_add_infl_free(space) - game.vm_influence_added[6]-- - if (game.vm_influence_added[6] === 0 ) { - game.valid_spaces = [] - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } - }, - /*done() { - push_undo() - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - }*/ -} - -states.vm_workers_revolt = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - if (game.valid_spaces.length === 0 ) { - view.prompt = 'Workers Revolt: no valid spaces to select.' - gen_action('pass') - return - } - view.prompt = 'Workers Revolt: select a Worker Space in a country your opponent has power.' - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id) - } - }, - pass() { - push_undo() - vm_next() - }, - infl(space) { - push_undo() - game.selected_space = space - log(`Chose %${game.selected_space}`) - game.state = 'vm_workers_revolt_finish' - } -} - - -states.vm_workers_revolt_finish = { - get inactive() { - return `resolve ${clean_name(cards[game.played_card].name)}.` - }, - prompt() { - //if (game.selected_space > 0) { - view.prompt = `Target: ${spaces[game.selected_space].name_unique}. Roll a die.` - gen_action('roll') - /* } else { - view.prompt = 'Workers Revolt: done.' - gen_action('done') - }*/ - - }, - roll() { - clear_undo() - let roll = Math.floor(Math.random() * 6) + 1 - log(`Roll: D${roll}`) - let adj = count_adj(game.selected_space) - if (game.active === DEM) { - log(`-${adj.com_adj} from opponent controlled spaces`) - roll -= adj.com_adj - } else { - log(`-${adj.dem_adj} from opponent controlled spaces`) - roll -= adj.dem_adj - } - log(`Modified roll: ${roll}`) - if (roll >= 4) { - log('Workers Revolt successful') - vm_replace_all_infl(game.temp) - } else {log('Workers Revolt fails. Required 4 or more')} - game.selected_space = 0 - vm_next() - }, - /*done() { - vm_next() - }*/ -} - -// ==================== TIANANMEN SQUARE TRACK STATES ===================== - -states.vm_tst_3_prep = { - inactive: 'resolve Tiananmen Square Track award.', - prompt() { - view.prompt = 'Tiananmen Square Track award: draw 3 cards.' - gen_action('draw') - }, - draw() { - if (game.active === DEM) { - game.temp = game.democrat_hand.length - draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length + 3, game.communist_hand.length) - game.valid_cards = [game.democrat_hand[game.temp], game.democrat_hand[game.temp + 1], game.democrat_hand[game.temp + 2]] - } else { - game.temp = game.communist_hand.length - draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length, game.communist_hand.length + 3) - game.valid_cards = [game.communist_hand[game.temp], game.communist_hand[game.temp + 1], game.communist_hand[game.temp + 2]] - } - game.temp = 0 - game.state = 'vm_tst_3' - } -} - -states.vm_tst_3 = { - inactive: 'resolve Tiananmen Square Track bonus.', - prompt() { - if (game.temp < 2) { - view.prompt = `Discard 2 of the drawn cards.` - for (let card of game.valid_cards) { - gen_action_card(card) - } - } /*else { - view.prompt = 'Discard cards: done.' - gen_action('done') - }*/ - }, - card(card) { - push_undo() - discard(card) - game.temp ++ - if (game.temp === 2) { - game.valid_cards = [] - vm_next() - } - }, - /*done() { - vm_next() - }*/ -} - -states.vm_tst_4 = { - inactive: 'remove SPs', - prompt () { - if (game.vm_available_ops === 0 || game.valid_spaces.length === 0) { - view.prompt = 'Tiananmen Square Track award. Remove SPs: done.' - gen_action('done') - return - } - view.prompt = `Tiananmen Square Track award: remove ${pluralize(game.vm_available_ops,'SP')}.` - - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - }, - infl(space) { - vm_do_remove_infl(space) - if (game.vm_available_ops === 0) { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } - }, - done() { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } -} - -states.vm_tst_6 = { - inactive: 'make their free support check.', - prompt() { - /* if (game.vm_available_ops === 0) { - view.prompt = 'Tiananmen Square Track award support check: done.' - gen_action('done') - return - } else {*/ - view.prompt = 'Tiananmen Square Track award: you have a free 2 Ops support check.' - for (let space_id of game.valid_spaces) { - if (space_id) { - gen_action_sc(space_id); - } - } - //} - }, - sc(space) { - push_undo() - game.selected_space = space - if (game.active === DEM && game.persistent_events.includes(58) && spaces[space].country === "East_Germany") { - game.austria_hungary_border_reopened_tracker = true - } - game.state = 'vm_tst_6_sc' - }, - /*done () { - push_undo() - vm_next() - }*/ -} - -states.vm_tst_6_sc = { - inactive: 'do support check.', - prompt () { - view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die` - gen_action('roll') - }, - roll() { - clear_undo() - do_sc(game.selected_space) - game.vm_available_ops-- - game.valid_spaces = [] - game.state = 'vm_tst_6' - vm_next() - return - } -} - -states.vm_tst_8 = { - inactive: 'use Tiananmen Square Track award.', - prompt() { - if (game.vm_event_to_do && game.vm_infl_to_do) { - view.prompt = 'Choose whether to play for event or operations first.' - gen_action('event') - gen_action('ops') - } - else if (!game.vm_event_to_do && game.vm_infl_to_do) { - view.prompt = 'Event resolved. Use card for operations.' - gen_action('ops') - } - else if (game.vm_event_to_do && !game.vm_infl_to_do) { - view.prompt = 'Operations resolved. Use card for event.' - gen_action('event') - } - else if (!game.vm_event_to_do && !game.vm_infl_to_do) { - view.prompt = 'Event and operations: done.' - gen_action('end_round') - } - }, - event() { - push_undo() - log('Event') - game.vm_event_to_do = false - game.return_state = 'vm_tst_8' - game.return = game.active - game.vm_event = game.played_card - goto_vm(game.vm_event) - }, - ops() { - push_undo() - log('Operations') - game.vm_infl_to_do = false - game.return = game.active - game.return_state = 'vm_tst_8' - goto_vm(208) - }, - end_round() { - push_undo() - game.tst_8 = true - end_round() - } -} - - -states.vm_tst_8_ops = { - inactive: 'play card for operations.', - prompt() { - view.prompt = `Play ${clean_name(cards[game.played_card].name)} for:` - gen_action('influence') - gen_action('support_check') - if ((game.active === DEM && game.dem_tst_attempted_this_turn === 0 ) || (game.active === COM && game.com_tst_attempted_this_turn === 0 )) { - gen_action('tst') - } - }, - influence(){ - push_undo() - game.vm_available_ops = cards[game.played_card].ops - valid_spaces_infl() - // If ABHR - Set AHBR tracker to true - if (game.persistent_events.includes(58)) { - game.austria_hungary_border_reopened_tracker = true - } - game.state = 'vm_add_infl' - }, - support_check() { - push_undo() - game.vm_available_ops = 2 - game.state = 'vm_support_check_prep' - }, - tst() { - push_undo() - game.state = 'vm_tiananmen_square_attempt' - } -} - -// ========================= POWER STRUGGLE STATES ======================== - -states.vm_scare_tactics = { - inactive: 'remove a Support Point.', - prompt () { - if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { - view.prompt = `${clean_name(cards[this_card()].name)}: no SPs to remove.` - gen_action('done') - return - } - if (game.vm_available_ops === 0 ) { - view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` - gen_action('done') - return - } - view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops, 'opponent SP')}${event_prompt()}.` - for (let space_id of game.valid_spaces) { - gen_action_infl(space_id); - } - }, - infl(space) { - push_undo() - vm_do_remove_infl(space) - }, - done() { - if (game.summary.length > 0) { - pop_summary() - log_br() - } - vm_next() - } -} - -states.vm_support_surges_1 = { - inactive: 'draw cards.', - prompt() { - view.prompt = 'Support Surges: draw a card.' - gen_action('draw') - }, - draw() { - if (game.active === DEM) { - //console.log('hand before', game.dem_pwr_hand) - draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length+1, game.com_pwr_hand.length) - game.temp = game.dem_pwr_hand[game.dem_pwr_hand.length-1] - //console.log('hand after', game.dem_pwr_hand, 'game.temp', game.temp) - } else { - //console.log('hand before', game.com_pwr_hand) - draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length, game.com_pwr_hand.length+1) - game.temp = game.com_pwr_hand[game.com_pwr_hand.length-1] - //console.log('hand after', game.com_pwr_hand, 'game.temp', game.temp) - } - game.state = 'vm_support_surges_2' - - //game.phase = 0 - //log('Drew 2 cards') - //log('Surrenders initiative') - //vm_next() - } -} - -states.vm_support_surges_2 = { - inactive: 'draw cards.', - prompt() { - let special = [49,50,51,52] - let elite_leader = [37,38,39,40] - if (special.includes(game.temp)) { - view.prompt = `Support Surges: you drew ${power_cards[game.temp].name}. Draw a second card.` - } - else if (elite_leader.includes(game.temp)) { - view.prompt = `Support Surges: you drew an ${power_cards[game.temp].name}. Draw a second card.` - } - else if (numberless_cards.includes(game.temp)) { - view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name}. Draw a second card.` - } else { - view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name} ${power_cards[game.temp].value}. Draw a second card.` - } - gen_action('draw') - }, - draw() { - if (game.active === DEM) { - draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length+1, game.com_pwr_hand.length) - game.temp = game.dem_pwr_hand[game.dem_pwr_hand.length - 1] - } else { - draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length, game.com_pwr_hand.length+1) - game.temp = game.com_pwr_hand[game.com_pwr_hand.length - 1] - } - game.state = 'vm_support_surges_3' - /*game.phase = 0 - log('Drew 2 cards') - log('Surrenders initiative') - vm_next()*/ - } -} - -states.vm_support_surges_3 = { - inactive: 'draw cards.', - prompt() { - if (numberless_cards.includes(game.temp)) { - view.prompt = `Support Surges: you drew ${power_cards[game.temp].name}. Done.` - } else { - view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name} ${power_cards[game.temp].value}. Done.` - } - gen_action('done') - }, - done() { - game.phase = 0 - delete game.temp - log('Drew 2 cards') - log('Surrenders initiative') - vm_next() - } -} - -states.vm_support_falters = { - inactive: 'discard cards.', - prompt() { - if ((game.active === DEM && game.dem_pwr_hand.length === 0) || (game.active === COM && game.com_pwr_hand.length === 0)) { - view.prompt = 'Support Falters: no remaining cards to discard.' - gen_action('pass') - } else if (game.vm_available_ops > 0) { - view.prompt = 'Support Falters: discard a card.' - gen_action('discard') - } else { - view.prompt = 'Support Falters: done.' - gen_action('done') - } - }, - discard() { - if (game.active === DEM) {discard_card(game.dem_pwr_hand)} - else {discard_card(game.com_pwr_hand)} - game.vm_available_ops -- - }, - pass() { - log_msg_gap('Takes initiative') - game.return = game.active - vm_next() - }, - done() { - log_gap('Takes initiative') - game.return = game.active - vm_next() - } -} - -/* =================== EVENTS ================================ */ - -// #region GENERATED EVENT CODE -const CODE = [] - -CODE[1] = [ // Legacy of Martial Law* - [ vm_permanently_remove ], - [ vm_valid_spaces_country_opp, 'Poland' ], - [ vm_prompt, 'replace 1 Democratic SP in Poland with a Communist SP' ], - [ vm_legacy_of_martial_law ], - [ vm_valid_spaces_country_sc, 'Poland' ], - [ vm_prompt, 'make a Support Check in Poland' ], - [ vm_1_support_check ], - [ vm_return ], -] - -CODE[2] = [ // Solidarity Legalised* - [ vm_permanently_remove ], - [ vm_solidarity_legalised ], - [ vm_valid_spaces_solidarity_legalised ], - [ vm_prompt, 'to every uncontrolled Worker and Farmer space in Poland' ], - [ vm_add_limited_infl, 9, 1 ], - [ vm_return ], -] - -CODE[3] = [ // Walesa - [ vm_permanently_remove ], - [ vm_valid_spaces_country, 'Poland' ], - [ vm_prompt, 'any space(s) in Poland' ], - [ vm_add_infl_free, 4 ], - [ vm_valid_spaces_country_sc, 'Poland' ], - [ vm_prompt, 'make Support Checks in Poland' ], - [ vm_support_check, 2 ], - [ vm_return ], -] - -CODE[4] = [ // Michnik - [ vm_permanently_remove ], - [ vm_valid_spaces, 26 ], - [ vm_prompt, 'the Polish Intellectuals space' ], - [ vm_add_x_infl, 3 ], - [ vm_return ], -] - -CODE[5] = [ // General strike - [ vm_general_strike ], - [ vm_return ], -] - -CODE[6] = [ // Brought in for Questioning - [ vm_brought_in_for_questioning ], - [ vm_return ], -] - -CODE[7] = [ // State Run Media* - [ vm_permanently_remove ], - [ vm_valid_spaces_opponent ], - [ vm_remove_limited_opp_infl, 4, 2 ], - [ vm_return ], -] - -CODE[8] = [ // Prudence - [ vm_prudence ], - [ vm_return ], -] - -CODE[9] = [ // The Wall* - [ vm_permanently_remove ], - [ vm_the_wall ], - [ vm_return ], -] - -CODE[10] = [ // Cult of Personality - [ vm_permanently_remove ], - [ vm_if, ()=>!game.the_tyrant_is_gone ], - [ vm_valid_spaces_country_socio_2, 'Romania', 3, 4 ], - [ vm_prompt, 'Worker or Farmer spaces in Romania, no more than 2 per space' ], - [ vm_add_limited_infl, 4, 2 ], - [ vm_else ], - [ vm_tyrant_block ], - [ vm_endif ], - [ vm_return ], -] - -CODE[11] = [ // Dissident arrested - [ vm_valid_spaces_opponent_socio, 5 ], - [ vm_prompt, 'any Intellectuals space' ], - [ vm_remove_x_opp_infl, 2 ], - [ vm_return ], -] - -CODE[12] = [ // Apparatchicks - [ vm_permanently_remove ], - [ vm_valid_spaces_socio, 2 ], - [ vm_prompt, ' to any Bureaucratic space(s)' ], - [ vm_add_infl_free, 3 ], - [ vm_return ], -] - -CODE[13] = [ // Stasi - [ vm_permanently_remove ], - [ vm_stasi ], - [ vm_return ], -] - -CODE[14] = [ // Gorbachev Charms the West - [ vm_valid_spaces_opponent ], - [ vm_remove_opp_infl, 2 ], - [ vm_valid_spaces_sc ], - [ vm_prompt, 'select a space for the Support Check' ], - [ vm_1_support_check ], - [ vm_return ], -] - -CODE[15] = [ // Honecker - [ vm_permanently_remove ], - [ vm_honecker ], - [ vm_return ], -] - -CODE[16] = [ // Nomenklatura* - [ vm_permanently_remove ], - [ vm_nomenklatura ], - [ vm_return ], -] - -CODE[17] = [ // Roundtable talks - [ vm_roundtable_talks ], - [ vm_return ], -] - -CODE[18] = [ // Poszgay Defends the Revolution - [ vm_permanently_remove ], - [ vm_poszgay ], - [ vm_prompt, 'to 4 spaces in Hungary not under Democratic control' ], - [ vm_add_limited_infl, 4, 1 ], - [ vm_return ], -] - -CODE[19] = [ // Papal vist - [ vm_permanently_remove ], - [ vm_valid_spaces, 20, 35, 38 ], - [ vm_prompt, 'any Catholic Church space' ], - [ vm_add_x_infl, 3 ], - [ vm_return ], -] - -CODE[20] = [ // Deutsche Marks* - [ vm_permanently_remove ], - [ vm_deutsche_marks ], - [ vm_return ], -] - -CODE[21] = [ // Common European Home - [ vm_common_european_home ], - [ vm_return ], -] - -CODE[22] = [ // Power Struggle - Poland - [ vm_power_struggle ], - [ vm_return ], -] - -CODE[23] = [ // Power Struggle - Hungary - [ vm_power_struggle ], - [ vm_return ], -] - -CODE[24] = [ // St Nicolas Church - [ vm_permanently_remove ], - [ vm_valid_spaces, 6 ], - [ vm_prompt, 'the Lutheran Church' ], - [ vm_take_control_prep, 1 ], - [ vm_st_nicholas_church ], - [ vm_return ], -] - -CODE[25] = [ // Perestroika - [ vm_permanently_remove ], - [ vm_perestroika ], - [ vm_return ], -] - -CODE[26] = [ // Helsinki Final Act* - [ vm_permanently_remove ], - [ vm_helsinki_final_act ], - [ vm_return ], -] - -CODE[27] = [ // Consumerism - [ vm_valid_spaces_opponent_socio, 4 ], - [ vm_prompt, ' from a Worker space' ], - [ vm_remove_opp_infl, 1 ], - [ vm_valid_spaces_opponent_socio, 4 ], - [ vm_active_country ], - [ vm_prompt, ()=>`make a support check in a Worker space in ${country_name(game.vm_active_country)}` ], - [ vm_1_support_check ], - [ vm_return ], -] - -CODE[28] = [ // Factory Party Cells - [ vm_valid_spaces_opponent_socio, 4 ], - [ vm_prompt, ' from Worker spaces' ], - [ vm_remove_limited_opp_infl, 3, 2 ], - [ vm_return ], -] - -CODE[29] = [ // Jan Palach Week* - [ vm_permanently_remove ], - [ vm_valid_spaces, 30 ], - [ vm_prompt, 'the Charles University space' ], - [ vm_add_x_infl, 6 ], - [ vm_return ], -] - -CODE[30] = [ // Tear Gas - [ vm_tear_gas ], - [ vm_return ], -] - -CODE[31] = [ // Intelligentsia - [ vm_valid_spaces, 4, 26, 31, 46, 55, 73 ], - [ vm_prompt, 'Intellectual spaces, no more than 2 per space' ], - [ vm_add_limited_infl, 4, 2 ], - [ vm_return ], -] - -CODE[32] = [ // Peasant Parties* - [ vm_permanently_remove ], - [ vm_valid_spaces_socio, 3 ], - [ vm_prompt, 'Farmer spaces, no more than 2 per space' ], - [ vm_add_limited_infl, 4, 2 ], - [ vm_return ], -] - -CODE[33] = [ // Sajudis* - [ vm_permanently_remove ], - [ vm_sajudis_check ], - [ vm_prompt, 'any Minorities space' ], - [ vm_take_control_prep, 1 ], - [ vm_sajudis ], - [ vm_return ], -] - -CODE[34] = [ // Fidesz* - [ vm_permanently_remove ], - [ vm_valid_spaces, 47 ], - [ vm_prompt, 'the Hungary students space' ], - [ vm_add_x_infl, 5 ], - [ vm_return ], -] - -CODE[35] = [ // Heal our Bleeding Wounds* - [ vm_permanently_remove ], - [ vm_heal_our_bleeding_wounds ], - [ vm_return ], -] - -CODE[36] = [ // Dash for the West* - [ vm_permanently_remove ], - [ vm_prompt, 'Dash for the West: select any Democratic event with an asterix(*) from the discard pile. Event occurs immediately' ], - [ vm_dash_for_the_west ], - [ vm_return ], -] - -CODE[37] = [ // Nagy Reburied* - [ vm_permanently_remove ], - [ vm_nagy_reburied ], - [ vm_prompt, 'the Hungary Elite space' ], - [ vm_remove_all_infl, 1 ], - [ vm_valid_spaces_country, 'Hungary' ], - [ vm_prompt, 'Hungary, no more than 2 per space' ], - [ vm_add_limited_infl, 4, 2 ], - [ vm_return ], -] - -CODE[38] = [ // July Concept - [ vm_permanently_remove ], - [ vm_valid_spaces_country, 'Bulgaria' ], - [ vm_prompt, 'Bulgaria' ], - [ vm_add_infl_free, 3 ], - [ vm_return ], -] - -CODE[39] = [ // Eco-Glasnost* - [ vm_permanently_remove ], - [ vm_valid_spaces, 66 ], - [ vm_prompt, 'Ruse' ], - [ vm_add_x_infl, 4 ], - [ vm_eco_glasnost ], - [ vm_return ], -] - -CODE[40] = [ // Hungarian Democratic Forum - [ vm_permanently_remove ], - [ vm_valid_spaces_country, 'Hungary' ], - [ vm_prompt, 'Hungary' ], - [ vm_add_infl_free, 3 ], - [ vm_valid_spaces_country_sc, 'Hungary' ], - [ vm_prompt, 'make a Support Check in Hungary' ], - [ vm_1_support_check ], - [ vm_return ], -] - -CODE[41] = [ // Ceausescu* - [ vm_permanently_remove ], - [ vm_if, ()=>!game.the_tyrant_is_gone ], - [ vm_valid_spaces_country_opp, 'Romania' ], - [ vm_prompt, ' from Romania' ], - [ vm_remove_opp_infl, 3 ], - [ vm_valid_spaces_country_sc, 'Romania' ], - [ vm_prompt, 'make a support check in Romania' ], - [ vm_1_support_check ], - [ vm_prompt, ' from Bucharesti' ], - [ vm_ceausescu ], - [ vm_else ], - [ vm_tyrant_block ], - [ vm_endif ], - [ vm_return ], -] - -CODE[42] = [ // Power Struggle - East Germany - [ vm_power_struggle ], - [ vm_return ], -] - -CODE[43] = [ // Power Struggle - Bulgaria - [ vm_power_struggle ], - [ vm_return ], -] - -CODE[44] = [ // Inflationary Currency - [ vm_permanently_remove ], - [ vm_inflationary_currency ], - [ vm_valid_spaces_country_opp ], - [ vm_prompt, ()=>` from ${country_name(game.vm_active_country)}` ], - [ vm_remove_opp_infl, 2 ], - [ vm_inflationary_currency_discard ], - [ vm_if, ()=>!discarded_card() ], - [ vm_valid_spaces_country_sc ], - [ vm_prompt, ()=>`make a Support Check in ${country_name(game.vm_active_country)}` ], - [ vm_1_support_check ], - [ vm_endif ], - [ vm_return ], -] - -CODE[45] = [ // Soviet Troop Withdrawals* - [ vm_permanently_remove ], - [ vm_valid_spaces_region_opp, 'Eastern Europe' ], - [ vm_prompt, ' from Eastern Europe' ], - [ vm_remove_limited_opp_infl, 5, 2 ], - [ vm_return ], -] - -CODE[46] = [ // Goodbye Lenin!* - [ vm_permanently_remove ], - [ vm_goodbye_lenin ], - [ vm_return ], -] - -CODE[47] = [ // Bulgarian Turks Expelled* - [ vm_permanently_remove ], - [ vm_bulgarian_turks_expelled ], - [ vm_prompt, 'Razgrad' ], - [ vm_remove_all_infl, 1 ], - [ vm_return ], -] - -CODE[48] = [ // We are the People!* - [ vm_permanently_remove ], - [ vm_we_are_the_people ], - [ vm_return ], -] - -CODE[49] = [ // Foreign Currency Debt Burden* - [ vm_permanently_remove ], - [ vm_foreign_currency_debt_burden ], - [ vm_return ], -] - -CODE[50] = [ // The Sinatra Doctrine* - [ vm_permanently_remove ], - [ vm_the_sinatra_doctrine ], - [ vm_return ], -] - -CODE[51] = [ // 40th Anniversary Celebration* - [ vm_permanently_remove ], - [ vm_40th_anniversary_celebration ], - [ vm_valid_spaces_country, 'East_Germany' ], - [ vm_prompt, 'East Germany' ], - [ vm_add_infl_free ], - [ vm_40th_anniversary_celebration_vp ], - [ vm_return ], -] - -CODE[52] = [ // Normalisation - [ vm_permanently_remove ], - [ vm_normalisation ], - [ vm_prompt, 'the Czechoslovakia Elite and Bureaucrat Spaces' ], - [ vm_remove_all_infl, 2 ], - [ vm_return ], -] - -CODE[53] = [ // Li Peng* - [ vm_permanently_remove ], - [ vm_li_peng ], - [ vm_return ], -] - -CODE[54] = [ // The Crowd Turns Against Ceausescu* - [ vm_the_crowd_turns_against_ceausescu ], - [ vm_return ], -] - -CODE[55] = [ // Power Struggle - Czechoslovakia - [ vm_power_struggle ], - [ vm_return ], -] - -CODE[56] = [ // Foreign Television - [ vm_permanently_remove ], - [ vm_foreign_television ], - [ vm_remove_limited_opp_infl, 4, 2 ], - [ vm_return ], -] - -CODE[57] = [ // Central Committee Reshuffle* - [ vm_permanently_remove ], - [ vm_central_committee_reshuffle ], - [ vm_prompt, ()=>`${country_name(game.vm_active_country)}` ], - [ vm_add_infl_free, 3 ], - [ vm_return ], -] - -CODE[58] = [ // Austria-Hungary Border Reopened* - [ vm_austria_hungary_border_reopened ], - [ vm_return ], -] - -CODE[59] = [ // GrenzTruppen* - [ vm_grenztruppen ], - [ vm_return ], -] - -CODE[60] = [ // Toxic Waste* - [ vm_permanently_remove ], - [ vm_valid_spaces_socio, 4 ], - [ vm_prompt, 'any Worker space(s)' ], - [ vm_add_infl_free, 3 ], - [ vm_return ], -] - -CODE[61] = [ // The Monday Demonstrations* - [ vm_permanently_remove ], - [ vm_the_monday_demonstrations ], - [ vm_prompt, 'the Lutheran Church Space and Leipzig' ], - [ vm_take_control_prep, 2 ], - [ vm_valid_spaces_country_sc, 'East_Germany' ], - [ vm_prompt, 'make 5 Support Checks in East Germany' ], - [ vm_support_check, 5 ], - [ vm_return ], -] - -CODE[62] = [ // Yakovlev Counsels Gorbachev* - [ vm_yakovlev_counsels_gorbachev ], - [ vm_return ], -] - -CODE[63] = [ // Genscher* - [ vm_genscher ], - [ vm_return ], -] - -CODE[64] = [ // Legacy of 1968* - [ vm_permanently_remove ], - [ vm_legacy_of_1968 ], - [ vm_prompt, 'all spaces in Czechoslovakia not controlled by the Communist Player' ], - [ vm_add_limited_infl, 11, 1 ], - [ vm_return ], -] - -CODE[65] = [ // Presidential Visit* - [ vm_permanently_remove ], - [ vm_presidential_visit ], - [ vm_return ], -] - -CODE[66] = [ // New Forum - [ vm_permanently_remove ], - [ vm_valid_spaces_country, 'East_Germany' ], - [ vm_prompt, '3 spaces in East Germany' ], - [ vm_add_limited_infl, 3, 1 ], - [ vm_return ], -] - -CODE[67] = [ // Reformer Rehabilitated* - [ vm_prompt, 'Reformer Rehabilitated: chose any non-scoring card in the discard pile. Event takes place immediately' ], - [ vm_reformer_rehabilitated ], - [ vm_return ], -] - -CODE[68] = [ // Klaus and Komarek* - [ vm_permanently_remove ], - [ vm_klaus_and_komarek ], - [ vm_prompt, 'Prague' ], - [ vm_remove_x_opp_infl, 2 ], - [ vm_valid_spaces, 29 ], - [ vm_add_x_infl, 2 ], - [ vm_return ], -] - -CODE[69] = [ // Systematization* - [ vm_permanently_remove ], - [ vm_valid_spaces_country, 'Romania' ], - [ vm_systematization ], - [ vm_return ], -] - -CODE[70] = [ // Securitate* - [ vm_securitate ], - [ vm_return ], -] - -CODE[71] = [ // Kiss of Death* - [ vm_permanently_remove ], - [ vm_kiss_of_death ], - [ vm_return ], -] - -CODE[72] = [ // Peasant Parties Revolt - [ vm_peasant_parties_revolt ], - [ vm_return ], -] - -CODE[73] = [ // Laszlo Tokes* - [ vm_permanently_remove ], - [ vm_valid_spaces, 50, 56 ], - [ vm_prompt, 'in Timisoara and Harghita/Covasna' ], - [ vm_add_limited_infl, 2, 1 ], - [ vm_laszlo_tokes ], - [ vm_if, ()=>game.phase === 3 ], - [ vm_prompt, ' in Romania' ], - [ vm_add_infl ], - [ vm_else ], - [ vm_prompt, 'make 2 Support Checks in Romania' ], - [ vm_support_check, 2 ], - [ vm_endif ], - [ vm_return ], -] - -CODE[74] = [ // FRG Embassies - [ vm_frg_embassies ], - [ vm_return ], -] - -CODE[75] = [ // Exit Visas* - [ vm_permanently_remove ], - [ vm_exit_visas ], - [ vm_return ], -] - -CODE[76] = [ // Warsaw Pact Summit - [ vm_permanently_remove ], - [ vm_warsaw_pact_summit ], - [ vm_if, ()=>game.phase === 3 ], - [ vm_prompt, ' spaces with no Democratic SPs' ], - [ vm_add_infl_free, 4 ], - [ vm_else ], - [ vm_prompt, 'Select a Student or Intellectual space' ], - [ vm_valid_spaces_country_socio_2, 3,, 4 ], - [ vm_support_check_modified, 2, 2 ], - [ vm_endif ], - [ vm_return ], -] - -CODE[77] = [ // Samizdat - [ vm_permanently_remove ], - [ vm_samizdat ], - [ vm_return ], -] - -CODE[78] = [ // Workers Revolt - [ vm_workers_revolt ], - [ vm_return ], -] - -CODE[79] = [ // The Third Way* - [ vm_permanently_remove ], - [ vm_the_third_way ], - [ vm_valid_spaces, 4 ], - [ vm_prompt, 'the East German Writers space' ], - [ vm_add_x_infl, 3 ], - [ vm_return ], -] - -CODE[80] = [ // Nepotism* - [ vm_permanently_remove ], - [ vm_nepotism ], - [ vm_valid_spaces_region_socio, 'Balkans', 4 ], - [ vm_prompt, 'Worker spaces in the Balkans' ], - [ vm_add_infl_free ], - [ vm_return ], -] - -CODE[81] = [ // The Baltic Way* - [ vm_permanently_remove ], - [ vm_the_baltic_way ], - [ vm_prompt, 'any Minorities space' ], - [ vm_take_control_prep, 1 ], - [ vm_return ], -] - -CODE[82] = [ // Spitzel* - [ vm_permanently_remove ], - [ vm_valid_spaces_country_opp, 'East_Germany' ], - [ vm_prompt, ' from East Germany' ], - [ vm_remove_opp_infl, 2 ], - [ vm_return ], -] - -CODE[83] = [ // Modrow* - [ vm_permanently_remove ], - [ vm_modrow ], - [ vm_valid_spaces_country, 'East_Germany' ], - [ vm_prompt, 'East Germany, no more than 2 per space' ], - [ vm_add_limited_infl, 4, 2 ], - [ vm_return ], -] - -CODE[84] = [ // Breakaway Baltic Republics* - [ vm_permanently_remove ], - [ vm_breakaway_baltic_republics ], - [ vm_prompt, 'any Minorities space' ], - [ vm_take_control_prep, 1 ], - [ vm_valid_spaces_sc ], - [ vm_prompt, 'select a space for the support check' ], - [ vm_1_support_check ], - [ vm_return ], -] - -CODE[85] = [ // Tank Column/Tank Man* - [ vm_permanently_remove ], - [ vm_tank_column ], - [ vm_return ], -] - -CODE[86] = [ // The Wall Must Go!* - [ vm_permanently_remove ], - [ vm_the_wall_must_go ], - [ vm_remove_infl, 3 ], - [ vm_return ], -] - -CODE[87] = [ // Kohl Proposes Reunification* - [ vm_permanently_remove ], - [ vm_kohl_proposes_reunification ], - [ vm_return ], -] - -CODE[88] = [ // Adamec* - [ vm_permanently_remove ], - [ vm_adamec ], - [ vm_valid_spaces_country, 'Czechoslovakia' ], - [ vm_prompt, 'Czechoslovakia' ], - [ vm_add_limited_infl, 4, 2 ], - [ vm_return ], -] - -CODE[89] = [ // Domino Theory* - [ vm_prompt, 'Domino Theory: choose a Power Struggle card to play from the discard pile' ], - [ vm_permanently_remove ], - [ vm_domino_theory ], - [ vm_return ], -] - -CODE[90] = [ // Civic Forum* - [ vm_permanently_remove ], - [ vm_valid_spaces_country, 'Czechoslovakia' ], - [ vm_prompt, 'Czechoslovakia' ], - [ vm_add_infl_free, 4 ], - [ vm_civic_forum ], - [ vm_valid_spaces_country_sc, 'Czechoslovakia' ], - [ vm_prompt, 'Select a space in Czechoslovakia' ], - [ vm_support_check, 2 ], - [ vm_return ], -] - -CODE[91] = [ // My First Banana* - [ vm_permanently_remove ], - [ vm_valid_spaces_country_opp, 'East_Germany' ], - [ vm_prompt, ' from East Germany' ], - [ vm_remove_opp_infl, 2 ], - [ vm_valid_spaces_country_sc, 'East_Germany' ], - [ vm_prompt, 'select a space in East Germany' ], - [ vm_support_check, 2 ], - [ vm_return ], -] - -CODE[92] = [ // Betrayal - [ vm_permanently_remove ], - [ vm_prompt, 'choose any Orthodox Church space. Replace all Democratic SPs with Communist SPs' ], - [ vm_betrayal ], - [ vm_return ], -] - -CODE[93] = [ // Shock Therapy* - [ vm_permanently_remove ], - [ vm_shock_therapy ], - [ vm_valid_spaces_country ], - [ vm_prompt, ()=>` ${country_name(game.vm_active_country)}` ], - [ vm_add_infl_free, 3 ], - [ vm_return ], -] - -CODE[94] = [ // Union of Democratic Forces* - [ vm_permanently_remove ], - [ vm_valid_spaces_country_opp, 'Bulgaria' ], - [ vm_prompt, ' from Bulgaria' ], - [ vm_remove_opp_infl, 4 ], - [ vm_valid_spaces_country_sc, 'Bulgaria' ], - [ vm_prompt, 'Make 2 Support Checks in Bulgaria' ], - [ vm_support_check, 2 ], - [ vm_return ], -] - -CODE[95] = [ // Power Struggle - Romania - [ vm_power_struggle ], - [ vm_return ], -] - -CODE[96] = [ // The Chinese Solution* - [ vm_permanently_remove ], - [ vm_the_chinese_solution ], - [ vm_valid_spaces_country_sc ], - [ vm_prompt, ()=>`make 5 Support Checks in ${country_name(game.vm_active_country)}` ], - [ vm_support_check_modified, 5, 3 ], - [ vm_return ], -] - -CODE[97] = [ // The Tyrant is Gone* - [ vm_if, ()=>game.persistent_events.includes(54) ], - [ vm_valid_spaces, 51 ], - [ vm_prompt, 'the Romanian Elite Space' ], - [ vm_remove_x_opp_infl, 4 ], - [ vm_the_tyrant_is_gone ], - [ vm_permanently_remove ], - [ vm_else ], - [ vm_the_tyrant_is_gone_prep ], - [ vm_endif ], - [ vm_return ], -] - -CODE[98] = [ // Politburo Intrigue* - [ vm_permanently_remove ], - [ vm_valid_spaces_country_opp, 'Bulgaria' ], - [ vm_prompt, ' from Bulgaria' ], - [ vm_remove_limited_opp_infl, 3, 2 ], - [ vm_valid_spaces_country_sc, 'Bulgaria' ], - [ vm_prompt, 'make a support check in Bulgaria' ], - [ vm_1_support_check ], - [ vm_return ], -] - -CODE[99] = [ // Ligachev* - [ vm_permanently_remove ], - [ vm_ligachev ], - [ vm_return ], -] - -CODE[100] = [ // Stand Fast* - [ vm_permanently_remove ], - [ vm_stand_fast ], - [ vm_return ], -] - -CODE[101] = [ // Elena* - [ vm_permanently_remove ], - [ vm_if, ()=>!game.the_tyrant_is_gone ], - [ vm_valid_spaces, 51 ], - [ vm_prompt, 'the Romania Elite Space' ], - [ vm_add_x_infl, 2 ], - [ vm_elena ], - [ vm_else ], - [ vm_tyrant_block ], - [ vm_endif ], - [ vm_return ], -] - -CODE[102] = [ // National Salvation Front* - [ vm_national_salvation_front ], - [ vm_return ], -] - -CODE[103] = [ // Government Resigns* - [ vm_government_resigns ], - [ vm_prompt, 'any uncontrolled Elite space' ], - [ vm_remove_all_infl, 1 ], - [ vm_permanently_remove ], - [ vm_return ], -] - -CODE[104] = [ // New Year's Eve Party* - [ vm_new_years_eve_party ], - [ vm_return ], -] - -CODE[105] = [ // Public Against Violence* - [ vm_permanently_remove ], - [ vm_valid_spaces, 36 ], - [ vm_prompt, 'Kosice' ], - [ vm_add_x_infl, 2 ], - [ vm_valid_spaces, 37 ], - [ vm_prompt, 'Presov' ], - [ vm_add_x_infl, 2 ], - [ vm_public_against_violence ], - [ vm_prompt, 'Make a Support Check in Bratislava' ], - [ vm_support_check_modified, 1, 2 ], - [ vm_return ], -] - -CODE[106] = [ // Social Democratic Platform Adopted* - [ vm_permanently_remove ], - [ vm_social_democratic_platform_adopted ], - [ vm_valid_spaces_country ], - [ vm_prompt, ()=>`${country_name(game.vm_active_country)}` ], - [ vm_add_infl_free, 2 ], - [ vm_valid_spaces_country_sc ], - [ vm_prompt, ()=>`make a Support Check in ${country_name(game.vm_active_country)}` ], - [ vm_1_support_check ], - [ vm_return ], -] - -CODE[107] = [ // Massacre in Timisoara* - [ vm_permanently_remove ], - [ vm_if, ()=>!game.the_tyrant_is_gone ], - [ vm_massacre_in_timisoara ], - [ vm_valid_spaces_country_sc, 'Romania' ], - [ vm_prompt, 'Make Support Checks in Romania' ], - [ vm_support_check_modified, 2, 2 ], - [ vm_else ], - [ vm_tyrant_block ], - [ vm_endif ], - [ vm_return ], -] - -CODE[108] = [ // Army Backs Revolution* - [ vm_permanently_remove ], - [ vm_army_backs_revolution ], - [ vm_return ], -] - -CODE[109] = [ // Kremlin Coup* - [ vm_permanently_remove ], - [ vm_kremlin_coup ], - [ vm_return ], -] - -CODE[110] = [ // Malta Summit* - [ vm_permanently_remove ], - [ vm_malta_summit ], - [ vm_prompt, ' from Elite spaces' ], - [ vm_remove_opp_infl, 5 ], - [ vm_return ], -] -// #endregion - - -// ============= TIANANMEN SQUARE TRACK AWARDS ==================== -CODE[203] = [//Tiananmen Square space 3 award - [vm_tst_3], - [vm_return] -] -CODE[204] = [//Tiananmen Square space 4 award - [vm_valid_spaces_opponent], - [vm_tst_4], - [vm_return] -] -CODE[206] = [//Tiananmen Square space 6 - [vm_valid_spaces_sc], - [vm_tst_6], - [vm_return] -] -CODE[208] = [//Tiananmen Square space 8 event - [vm_tst_8], - [vm_return] -] - -// ============= POWER STRUGGLE WILDCARDS ========================= - -CODE[349] = [//Scare Tactics - [vm_scare_tactics], - [vm_valid_spaces_country_opp], - [vm_prompt, ()=>` from ${country_name(game.vm_active_country)}`], - [vm_remove_opp_infl, 1], - [vm_return] -] -CODE[350] = [//Support Surges - [vm_support_surges], - [vm_return] -] -CODE[351] = [//Support Falters - [vm_support_falters], - [vm_return] -] +//"use strict" + +const { spaces, cards, power_cards } = require("./data.js") + +var game, view, states = {} + +const DEM = "Democrat" +const COM = "Communist" + +const first_strategy_card = 1 +const last_strategy_card = 110 + +const dem_tst_req = [5, 5, 6, 6, 7, 8, 9, 10] +const com_tst_req = [6, 6, 7, 7, 8, 7, 6, 5] +const scoring_cards = [22, 23, 42, 43, 55, 95] +const leader_cards = [37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48] +const leaders = [1, 4, 5, 6, 7] +const support_loss_roll = [0, 0, 1, 1, 2, 2, 3, 4] +const vp_roll = [0, 0, 1, 1, 2, 2, 3, 4] +const countries = ['Poland', 'Hungary', 'East_Germany', 'Bulgaria', 'Czechoslovakia', 'Romania'] +const elite_spaces = [12, 15, 27, 43, 51, 69] +const all_power_cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 ] +const numberless_cards = [25, 26, 27, 28, 29, 30, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52] +const auto_resolve_events = [5, 8, 9, 13, 17, 25, 26, 30, 35, 50, 53, 54, 58, 59, 62, 63, 65, 70, 72, 74, 86, 99, 102, 108] +const switch_events = [6, 20, 71] + +exports.scenarios = [ "Standard" ] + +exports.roles = [ DEM, COM ] + +// --- SET UP --- + +exports.setup = function (seed, scenario, options) { + game = { + seed: seed, + log: [], + undo: [], + summary: [], + active: null, + state: "com_init", + return: '', + vm: null, + vm_event: 0, + vm_event_to_do: false, + vm_infl_to_do: false, + + played_card: 0, + table_cards: [], + available_ops: 0, + vm_available_ops: 0, + valid_spaces: [], + valid_cards: [], + + vp: 0, + turn: 0, + round: 0, + round_player: COM, + stability: 0, + dem_tst_position: 0, + com_tst_position: 0, + dem_tst_attempted: 0, + com_tst_attempted: 0, + dem_tst_attempted_this_turn: 0, + com_tst_attempted_this_turn: 0, + + demInfl: [], + comInfl: [], + + strategy_deck: [], + strategy_discard: [], + discard: false, + view_opp_hand: false, + strategy_removed: [], + persistent_events: [], + power_struggle_deck: [], + power_struggle_discard: [], + dem_hand_limit: 8, + com_hand_limit: 8, + democrat_hand: [], + communist_hand: [], + + pwr_struggle_in: [], + is_pwr_struggle: false, + dem_pwr_hand_limit: 0, + com_pwr_hand_limit: 0, + dem_pwr_hand: [], + com_pwr_hand: [], + raised_stakes_discard: 0, + raised_stakes: 0, + raised_stakes_round: 0, + phase: 0, + times_held: [0, 0, 0, 0, 0, 0], + revolutions: [false, false, false, false, false, false], + remove_opponent_infl: false, + tactics_fails: '', + } + + log_h1("1989 Dawn of Freedom") + + game.active = COM + start_game() + + return game +} + +function start_game() { + //starting influence + + // Draw cards + + //console.log('start game') + + game.strategy_deck = draw_deck(cards) + reset_power() + + //Set starting influence + spaces.forEach((space, index) => { + if (space !== null) { + game.demInfl[index] = space.demInfl + game.comInfl[index] = space.comInfl + } + }) + + //Set starting placement ops + game.starting_infl = { + com_starting_infl: 0, + dem_starting_infl: 0 + }, + + // Set variable event cards where event is playable at start of game + + game.playable_cards = [14, 15, 21, 70] + + //console.log('game.strategy_deck: ', game.strategy_deck[1]) + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.dem_hand_limit, game.com_hand_limit) + //.log('game.strategy_deck: ', game.strategy_deck[1], 'democrat_hand:', game.democrat_hand) + + game.valid_spaces = valid_spaces_setup() + game.available_ops = 2 + game.phase = 0 + log_h1("Place starting Support Points") + log_side() +} + + +exports.view = function(state, player) { + game = state + + view = { + log: game.log, + active: game.active, + prompt: null, + actions: null, + + played_card: game.played_card, + table_cards: game.table_cards, + valid_spaces: game.valid_spaces, + valid_cards: game.valid_cards, + + demInfl: game.demInfl, + comInfl: game.comInfl, + turn: game.turn, + round: game.round, + round_player: game.round_player, + vp: game.vp, + stability: game.stability, + dem_tst: game.dem_tst_position, + com_tst: game.com_tst_position, + persistent_events: game.persistent_events, + systematization: game.systematization, + the_tyrant_is_gone: game.the_tyrant_is_gone, + + strategy_deck: game.strategy_deck.length, + strategy_removed: game.strategy_removed, + discard: game.discard, + show_opp_hand: game.view_opp_hand, + + democrat_hand: game.democrat_hand.length, + communist_hand: game.communist_hand.length, + democrat_power_hand: game.dem_pwr_hand.length, + communist_power_hand: game.com_pwr_hand.length, + ceausescu_cards: game.ceausescu_cards, + is_pwr_struggle: game.is_pwr_struggle, + times_held: game.times_held, + revolutions: game.revolutions, + + hand: [], + set_aside: [], + pwr_hand: [], + + + } + + if (game.is_pwr_struggle) { + view.strategy_discard = game.power_struggle_discard + } else { + view.strategy_discard = game.strategy_discard + } + + if (player === game.active && game.vm && game.vm.draw) + view.drawn = game.vm.draw + + if (player === game.active) { + if (game.selected_space > 0 ) { + view.valid_spaces = [game.selected_space] + } else { + view.valid_spaces = game.valid_spaces + } + } else { + view.valid_spaces = [] + } + + if (player === game.active) { + view.valid_cards = game.valid_cards + } else { + view.valid_cards = [] + } + + if (player === DEM) { + view.hand = game.democrat_hand + if (game.communist_hand_red) { + view.opp_hand = game.communist_hand_red + } + view.set_aside = game.democrat_set_aside /*Is this being used? */ + view.power_hand = [...game.dem_pwr_hand].sort((a, b) => a - b) + + } else if (player === COM) { + view.hand = game.communist_hand + view.opp_hand = [...game.dem_pwr_hand].sort((a, b) => a - b) + view.power_hand = [...game.com_pwr_hand].sort((a, b) => a - b) + } + + if (player === DEM) { + view.samizdat = game.samizdat_card + } + + if (game.state === "game_over") { + view.prompt = game.victory + } else if (player === "Observer" || (game.active !== player && game.active !== "Both")) { + if (states[game.state]) { + let inactive = states[game.state].inactive + if (typeof inactive === "function") + view.prompt = `Waiting for ${game.active} ${inactive()}` + else + view.prompt = `Waiting for ${game.active} to ${inactive}` + } else { + view.prompt = "A Unknown state: " + game.state + } + } else { + view.actions = {} + + if (states[game.state]) + states[game.state].prompt(player) + else + view.prompt = "B Unknown state: " + game.state + if (view.actions.undo === undefined) { + if (game.undo && game.undo.length > 0) + view.actions.undo = 1 + else + view.actions.undo = 0 + } + } + + return view +} + + +// === ACTIONS =========== + +function gen_action(action, argument) { +//console.log('gen_action called with ', action, ' and ', argument) + if (argument === undefined) { + //console.log('argument undefined') + view.actions[action] = 1 + } else { + if (!(action in view.actions)) { + //console.log('push argument') + view.actions[action] = [] + } + view.actions[action].push(argument) + } + //console.log('view.actions: ', view.actions, 'view.actions[action]: ', view.actions[action]) +} + +function gen_action_infl(space){ + gen_action("infl", space) +} + +function gen_action_card(card){ + gen_action("card", card) +} + +function gen_action_sc(space){ + gen_action("sc", space) +} + +function gen_action_scoring(){ + gen_action("scoring") +} + +exports.action = function (state, player, action, arg) { + //console.log('exports.action called with state:' , state, 'player:', player, 'action: ', action, 'arg: ', arg) + game = state + if (states[game.state] && action in states[game.state]) { + states[game.state][action](arg, player) + } else { + if (action === "undo" && game.undo && game.undo.length > 0) + pop_undo() + else + throw new Error("Invalid action: " + action) + } + return game +} + +// ============= GAME STATES ======================= + +states.com_init = { + inactive: 'place starting SPs.', + prompt() { + //console.log('state:', game.state, 'game.valid_spaces', game.valid_spaces) + if (game.starting_infl.dem_starting_infl === 2 && game.available_ops === 0 ) { + view.prompt = 'Place starting SPs: done. Start Turn 1.'; + gen_action("start"); + } else if (game.available_ops === 0) { + view.prompt = 'Place starting SPs: done.'; + gen_action("done"); + return; + } else if (game.starting_infl.dem_starting_infl === 2) { + view.prompt = `Place your last ${pluralize(game.available_ops,'starting SP')}.` + } else { + view.prompt = `Place ${pluralize(game.available_ops,'starting SP')}.` + } + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + }, + infl(space) { + add_infl(space) + + }, + done() { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + + game.starting_infl.com_starting_infl++ + if (game.starting_infl.com_starting_infl == 1){ + game.available_ops = 3 + game.state = 'dem_init' + valid_spaces_setup() + next_player() + } else if (game.starting_infl.com_starting_infl == 2) { + game.available_ops = 4 + game.state = 'dem_init' + valid_spaces_setup() + next_player() + } else if (game.starting_infl.com_starting_infl == 3) { + delete game.starting_infl + game.state = 'start_game' + } + }, + start() { + new_turn() + clear_undo() + game.state = 'choose_card' + } +} + +states.dem_init = { + inactive: 'place starting SPs.', + prompt() { + //console.log('state:', game.state) + if (game.available_ops == 0) { + view.prompt = 'Place starting SPs: done.'; + gen_action("done"); + return; + } else if (game.starting_infl.com_starting_infl === 2) { + view.prompt = `Place your last ${pluralize(game.available_ops,'starting SP')}.` + } else { + view.prompt = `Place ${pluralize(game.available_ops,'starting SP')}.` + } + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + }, + infl(space) { + add_infl(space) + }, + + done() { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + + game.starting_infl.dem_starting_infl++ + if (game.starting_infl.dem_starting_infl == 1){ + game.available_ops = 3 + } else if (game.starting_infl.dem_starting_infl == 2) { + game.available_ops = 2 + } + game.state = 'com_init' + valid_spaces_setup() + next_player() + } +} + + +states.choose_card = { + inactive: 'choose a card.', + prompt() { + if ((game.active===DEM && game.democrat_hand.length === 0) || game.active === COM && game.communist_hand.length === 0) { + view.prompt = 'No cards remaining: you must pass.' + gen_action('pass') + } else { + view.prompt = 'Choose a card.' + let available_cards + if (game.active === DEM) { + available_cards = game.democrat_hand + } else { + available_cards = game.communist_hand + } + for (let card of available_cards) { + gen_action_card(card) + } + } + }, + card(card) { + push_undo() + + //Check if player is at risk of losing game due to held scoring card + if (!scoring_cards.includes(card)) { + let scoring_cards_count = count_scoring_cards() + + if (game.round !== 8 && scoring_cards_count >= (8-game.round)){ + game.temp = card + game.state = 'confirm_card' + return + } + } + select_card(card) + }, + pass() { + log('No cards remaining. Passed') + //end_round() + game.state = 'end_round' + } +} + +states.confirm_card = { + inactive: 'choose a card.', + prompt() { + let scoring_cards_count = count_scoring_cards() + view.prompt = `${pluralize(scoring_cards_count,'scoring card')} in hand with ${pluralize(8-game.round,'turn')} remaining. Scoring cards may not be held. Continue?` + gen_action('continue') + }, + continue() { + select_card(game.temp) + } +} + +states.play_card ={ + get inactive() { + return `play ${clean_name(cards[game.played_card].name)}.` + }, + prompt () { + /*if (game.phase >= 1) { /*Finish here when playing your own event + console.log('in play card') + view.prompt = `${clean_name(cards[game.played_card].name)}: done. End the Action Round.` + gen_action('end_round') + return + }*/ + + view.prompt = `Play ${clean_name(cards[game.played_card].name)} for:` + + if (scoring_cards.includes(game.played_card)) { + /*view.prompt = 'Play for:'*/ + gen_action('event') + return + } + + // Check for Reformer Rehabilitated + + //console.log('game.active', game.active, 'game.playable_cards[67].playable', game.playable_cards[67].playable) + + + if (game.played_card === 67 && game.playable_cards.includes(67)){ + if (game.active === DEM && (game.dem_tst_position > game.com_tst_position)) { + gen_action('event') + } + if (game.active === COM && (game.dem_tst_position < game.com_tst_position)) { + gen_action('event') + } + } + + //Check for events + //console.log('event_is_playable(game.played_card)', event_is_playable(game.played_card)) + if (event_is_playable(game.played_card)) { + //console.log('card is playable') + //Check for Tiananmen Square Track awards special abilities + //console.log('game.tst_7', game.tst_7) + if ((game.active === DEM && cards[game.played_card].side === 'C' && game.dem_tst_position >= 7 && game.com_tst_position < 7 && !game.tst_7) || (game.active === COM && cards[game.played_card].side === 'D' && game.com_tst_position >= 7 && game.dem_tst_position < 7 && !game.tst_7)){ + gen_action('tst_7') + } + + if ((game.active === DEM && cards[game.played_card].side !== 'C' && game.dem_tst_position >= 8 && game.com_tst_position < 8 && !game.tst_8) || (game.active === COM && cards[game.played_card].side !== 'D' && game.com_tst_position >= 8 && game.dem_tst_position < 8 && !game.tst_8)){ + gen_action('tst_8') + } + + //Continue with normal logic + get_events(game.played_card) + } + + gen_action('influence') + gen_action('support_check') + + if ((game.active === DEM && game.dem_tst_attempted_this_turn === 0 && game.dem_tst_position < 8 ) || (game.active === COM && game.com_tst_attempted_this_turn === 0 && game.com_tst_position < 8)) { + gen_action('tst') + } + + }, + event() { + push_undo() + //console.log('played event, game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) + log_gap(`Played C${cards[game.played_card].number} for the event`) + game.vm_infl_to_do = false + if (scoring_cards.includes(game.played_card)) {game.phase = 0} + else {game.phase = 1} + game.return = game.active + if (switch_events.includes(game.played_card)) {next_player()} + game.vm_event = game.played_card + //console.log('before event, game.vm_infl_to_do', game.vm_infl_to_do) + goto_vm(game.vm_event) + }, + opp_event() { + push_undo() + log_gap(`Played C${cards[game.played_card].number} for the event`) + game.phase = 1 /*Do I still need this?*/ + game.vm_infl_to_do = true + game.return = game.active + game.vm_event = game.played_card + if (is_auto_resolve(game.played_card) || switch_events.includes(game.played_card)) { + goto_vm(game.vm_event)} + else { + next_player() + log(`C${game.vm_event}`) + goto_vm(game.vm_event) + } + }, + influence() { + push_undo() + log_gap(`Played C${cards[game.played_card].number} to place SPs`) + + + // Check if Common European Home played for influence + if (game.played_card === 21) { + if (game.active === DEM) { + game.vp -- + log('-1 VP') + if (check_vp()) { + return + } + } else { + game.vp ++ + log('+1 VP') + if (check_vp()) { + return + } + } + } + // Check if card is opponent card with event that needs to be resolved + + if (cards[game.played_card].playable || game.playable_cards.includes(game.played_card)) { + if ((game.active === DEM && cards[game.played_card].side === "C" ) || (game.active === COM && cards[game.played_card].side === "D")) { + //game.phase = 1 /*Do I need this? */ + game.vm_event_to_do = true + } + } + + // If ABHR - Set AHBR tracker to true + if (game.persistent_events.includes(58)) { + game.austria_hungary_border_reopened_tracker = true + } + game.state='add_influence' + valid_spaces_infl() + }, + tst() { + push_undo() + log_gap(`Played C${cards[game.played_card].number} to the Tiananmen Square Track`) + game.state='tiananmen_square_attempt' + }, + support_check() { + push_undo() + log_gap(`Played C${cards[game.played_card].number} for support checks`) + + // Check if card is opponent card with event that needs to be resolved + + if (cards[game.played_card].playable || game.playable_cards.includes(game.played_card)) { + if ((game.active === DEM && cards[game.played_card].side === "C" ) || (game.active === COM && cards[game.played_card].side === "D")) { + game.vm_event_to_do = true + } + } + + game.available_ops = 2 + game.state='support_check_prep' + valid_spaces_sc() + }, + tst_7() { /*Cancel opponent event */ + push_undo() + log(`Played C${game.played_card}. Event cancelled using TST Award`) + game.tst_7 = true + game.vm_infl_to_do = true + game.state = 'resolve_opponent_event' + }, + tst_8() { /*Play card for ops and event */ + push_undo() + game.vm_event_to_do = true + game.vm_infl_to_do = true + game.tst_8 = true + log(`Played C${game.played_card} for event and operations`) + game.state = 'vm_tst_8' + }, + end_round () { + end_round() + } + +} + +states.resolve_opponent_event = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + //console.log('in resolve opponent event: discard', game.strategy_discard) + if (game.vm_infl_to_do) { + view.prompt = 'Event resolved. Choose to play card for:' + gen_action('influence') + gen_action('support_check') + } else if (game.vm_event_to_do) { + // Check for Tiananmen Square Track ability - play opponent card without triggering event + if ((game.active === DEM && game.dem_tst_position >= 7 && game.com_tst_position < 7 && !game.tst_7) || (game.active === COM && game.com_tst_position >= 7 && game.dem_tst_position < 7 && !game.tst_7)){ + gen_action('tst_7') + } + view.prompt = `${clean_name(cards[game.played_card].name)}: you must resolve the opponent event.` + gen_action('opp_event') + } else { + view.prompt = 'Event resolved. End the action round.' + gen_action('end_round') + } + }, + influence(){ + push_undo() + // If ABHR - Set AHBR tracker to true + if (game.persistent_events.includes(58)) { + game.austria_hungary_border_reopened_tracker = true + } + game.state = 'finish_add_infl' + valid_spaces_infl() + }, + support_check() { + push_undo() + game.available_ops = 2 + game.state = 'finish_support_check_prep' + valid_spaces_sc() + }, + opp_event() { + game.vm_event_to_do = false + game.return_state = 'resolve_opponent_event' + if (is_auto_resolve(game.played_card) || switch_events.includes(game.played_card)) { + game.return = game.active + log(`Played C${game.played_card} for the event`) + goto_vm(game.played_card)} + else { + if (game.active === DEM) { + game.return = COM + } else { + game.return = DEM + } + next_player() + log(`C${game.played_card}`) + goto_vm(game.played_card) + } + }, + tst_7() { + push_undo() + log('Event cancelled using TST Award') + game.tst_7 = true + game.vm_event_to_do = false + }, + end_round() { + push_undo() + /*if(game.round_player === COM && game.active === DEM) { + log_h3('End of Communist Action Round') + change_player() + } */ + end_round() + } +} + + +states.finish_add_infl = { + inactive: 'add SPs.', + prompt () { + if (game.available_ops === 0) { + view.prompt = 'Place SPs: done.' + gen_action("end_round") + return; + } + + view.prompt = `Add SPs: ${game.available_ops} remaining.` + + // Generate actions for valid spaces + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id) + } + }, + infl(space) { + add_infl(space) + }, + end_round() { + push_undo() + if (game.summary.length > 0) { + pop_summary() + log_br() + } + + end_round() + //game.state = 'end_round' + } +} + +states.finish_support_check_prep = { + inactive: 'do support checks.', + prompt () { + if (game.available_ops === 0) { + view.prompt = 'Support checks: done.' + gen_action('end_round') + //return + } else { + view.prompt = `Select a space. ${pluralize(game.available_ops, 'support check')} remaining.` + for (let space_id of game.valid_spaces) { + gen_action_sc(space_id) + } + } + }, + sc(space) { + push_undo() + game.selected_space = space + // Check for Austria-Hungary Border Reopened - check on first support check only + //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) + if (game.persistent_events.includes(58)){ + if (game.active === DEM && game.available_ops > 1) { + //console.log('in ahb check, country, ', spaces[game.selected_space].country, 'ahb', 'austria_hungary_border_reopened']) + if (spaces[game.selected_space].country === 'East_Germany' && game.persistent_events.includes(58) && game.active === DEM) { + game.state = 'finish_austria_hungary_border_reopened_check' + return + } + } + } + game.state = 'finish_do_support_check' + }, + end_round () { + end_round() + //game.state = 'end_round' + } +} + +states.finish_austria_hungary_border_reopened_check = { + inactive: 'decide Austria-Hungary Border Reopened', + prompt() { + view.prompt = 'Austria-Hungary Border Reopened: will both support checks be in East Germany?' + gen_action('yes') + gen_action('no') + }, + yes() { + game.austria_hungary_border_reopened_tracker = true + game.state = 'finish_do_support_check' + }, + no() { + game.state = 'finish_do_support_check' + } +} + +states.finish_do_support_check = { + inactive: 'do support checks', + prompt () { + view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` + gen_action('roll') + }, + roll() { + clear_undo() + do_sc(game.selected_space) + game.available_ops-- + if (game.available_ops === 0) { + game.valid_spaces = [] + } + game.state = 'finish_support_check_prep' + return + } +} + +states.add_influence = { + inactive: 'add SPs.', + prompt () { + if (game.available_ops <= 0) { + view.prompt = 'Place SPs: done.' + if (!game.vm_event_to_do) { + gen_action("end_round") + } else { + gen_action('done') + } + } else { + + view.prompt = `Add SPs: ${game.available_ops} remaining.` + + // Generate actions for valid spaces + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } + }, + infl(space) { + add_infl(space) + }, + end_round() { + push_undo() + if (game.summary.length > 0) { + pop_summary() + log_br() + } + end_round() + }, + done() { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + reset_austria_hungary_border_reopened() + game.state = 'resolve_opponent_event' + } +} + +states.tiananmen_square_attempt = { + inactive: 'do Tiananmen Square Attempt.', + prompt () { + view.prompt = 'Tiananmen Square Track attempt: Roll a die.' + gen_action('roll') + }, + roll() { + clear_undo() + do_tst_attempt () + } +} + +states.tiananmen_square_attempt_success = { + inactive: 'do Tiananmen Square Attempt.', + prompt () { + if (game.vm_event > 200) { + view.prompt = 'Tiananmen Square Track attempt successful. Go to TST Award.' + gen_action('done') + } else { + view.prompt = 'Tiananmen Square Track attempt successful.' + gen_action('end_round') + } + + }, + done () { + push_undo() + //console.log('going to tst award, game.return_state', game.return_state) + goto_vm(game.vm_event) + }, + end_round () { + push_undo() + end_round() + } +} + +states.tiananmen_square_attempt_fail = { + inactive: 'do Tiananmen Square Attempt.', + prompt () { + view.prompt = 'Tiananmen Square Track attempt failed.' + gen_action('end_round') + }, + end_round () { + push_undo() + end_round() + //game.state = 'tiananmen_square_attempt_done' + } +} + +states.tiananmen_square_attempt_done = { + inactive: 'do Tiananmen Square Attempt.', + prompt () { + view.prompt = 'Tiananmen Square Track attempt: done.' + gen_action('end_round') + }, + end_round () { + end_round() + //game.state = 'end_round' + } +} + +states.tst_goddess = { + inactive: 'choose whether to discard a card.', + prompt() { + //if (game.phase === 0) { + view.prompt = 'Tiananmen Square Track award: you may discard a non-Power Struggle Card and draw a replacement.' + for (let card of game.valid_cards) { + gen_action_card(card) + } + gen_action('pass') + /*} else { + view.prompt = 'Discard a card: done.' + gen_action('done') + }*/ + }, + card(card) { + push_undo() + discard(card) + game.valid_cards = [] + game.state = 'tst_goddess_draw' + //game.phase++ + /*if (game.active === DEM) { + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length +1, game.communist_hand.length) + } else { + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length, game.communist_hand.length +1) + }*/ + }, + pass() { + log('Did not discard') + log_h2("Action Round " + game.round) + if (game.active === DEM) { + next_player() + } else { + log_side() + } + if (game.persistent_events.includes(5)) { + game.state = 'general_strike' + } else { + game.state = 'choose_card' + } + }, + done() { + + log_h2("Action Round " + game.round) + if (game.active === DEM) { + next_player() + } else { + log_side() + } + game.phase = 0 + if (game.persistent_events.includes(5)) { + game.state = 'general_strike' + } else { + game.state = 'choose_card' + } + } +} + +states.tst_goddess_draw = { + inactive: 'choose whether to discard a card.', + prompt() { + view.prompt = 'Draw a replacement card.' + gen_action('draw') + }, + draw() { + if (game.active === DEM) { + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length +1, game.communist_hand.length) + } else { + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length, game.communist_hand.length +1) + } + log_h2("Action Round " + game.round) + if (game.active === DEM) { + next_player() + } else { + log_side() + } + game.phase = 0 + if (game.persistent_events.includes(5)) { + game.state = 'general_strike' + } else { + game.state = 'choose_card' + } + } +} + + + +states.support_check_prep = { + inactive: 'do support checks', + prompt () { + if (game.available_ops === 0) { /*Needs another check for Support Checks done during Crowd Turns against Ceausescu*/ + if (game.is_pwr_struggle) { + view.prompt = 'The Crowd Turns Against Ceausescu. Support checks: done.' + gen_action('done') + } else if (!game.vm_event_to_do) { + view.prompt = 'Support checks: done.' + gen_action('end_round') + } else { + view.prompt = 'Support checks: done.' + gen_action('done') + } + } else if (game.available_ops > 0) { + view.prompt = `Select a space. ${pluralize(game.available_ops, 'support check')} remaining.` + + for (let space_id of game.valid_spaces) { + gen_action_sc(space_id) + } + } + }, + sc(space) { + push_undo() + game.selected_space = space + + // Check for Austria-Hungary Border Reopened - check on first support check only + //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) + if (game.persistent_events.includes(58)) { + if (game.active === DEM && game.available_ops > 1) { + if (spaces[game.selected_space].country === 'East_Germany' && game.persistent_events.includes(58) && game.active === DEM) { + game.state = 'austria_hungary_border_reopened_check' + return + } + //game.state = 'do_support_check' + } /*else { */ + } + game.state = 'do_support_check' + //} + }, + end_round() { + push_undo() + end_round() + }, + done() { + push_undo() + if (game.is_pwr_struggle) {/*Crowd Turns Against Ceausescu should be the only time you end up here during a power struggle */ + if (game.return !== game.active) { + next_player() + } + log_h2('Raise the Stakes') + game.state = 'raise_stakes_1' + return + } + reset_austria_hungary_border_reopened() + game.state = 'resolve_opponent_event' + } +} + +states.do_support_check = { + inactive: 'do support checks.', + prompt () { + // console.log('in do_support_check') + view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` + gen_action('roll') + }, + roll() { + clear_undo() + do_sc(game.selected_space) + game.available_ops-- + if (game.available_ops === 0) { + game.valid_spaces = [] + } + game.state = 'support_check_prep' + return + } +} + +states.austria_hungary_border_reopened_check = { + inactive: 'decide Austria-Hungary Border Reopened.', + prompt() { + view.prompt = 'Austria-Hungary Border Reopened: will both support checks be in East Germany?' + gen_action('yes') + gen_action('no') + }, + yes() { + game.austria_hungary_border_reopened_tracker = true + game.state = 'do_support_check' + }, + no() { + game.state = 'do_support_check' + } +} + +states.end_round = { + inactive: 'finish playing a card.', + prompt() { + view.prompt = 'End the Action Round.' + gen_action('end_round') + }, + end_round() { + push_undo() + end_round() + } +} + +//======================= POWER STRUGGLE =============================== + +states.draw_power_cards = { + inactive: 'draw cards.', + prompt() { + view.prompt = `${clean_name(cards[this_card()].name)}: draw cards.` + gen_action('draw') + }, + draw() { + push_undo() + game.power_struggle_deck = [...all_power_cards] + // console.log('game.power_struggle_deck.length', game.power_struggle_deck.length) + //console.log('called draw cards, country', game.pwr_struggle_in, 'game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) + //console.log('test3') + let presence = check_presence(game.pwr_struggle_in) + //console.log('test2') + if (presence.dem_spaces > 0) { + game.dem_pwr_hand_limit = 6 + 2*(presence.dem_spaces - 1) + } else { + game.dem_pwr_hand_limit = 0 + } + if (presence.com_spaces > 0 ) { + game.com_pwr_hand_limit = 6 + 2*(presence.com_spaces - 1) + } else { + game.com_pwr_hand_limit = 0 + } + // Events which affect cards drawn + if (game.persistent_events.includes(17) && game.com_pwr_hand_limit >= 2) { + log('Democrat receives 2 cards from Communist due to C17') + game.dem_pwr_hand_limit += 2 + game.com_pwr_hand_limit -= 2 + discard_from_table(17) + game.persistent_events = game.persistent_events.filter(n => n !== 17) + } + + if (game.persistent_events.includes(72)) { + let farmer_check + for (let space of spaces) { + if (space && space.country === game.pwr_struggle_in && space.socio === 3 && check_dem_control(space.space_id)) { + farmer_check = true + } + } + if (farmer_check && game.com_pwr_hand_limit > 0) { + log('Democrat receives 1 cards from Communist due to C72') + game.dem_pwr_hand_limit += 1 + game.com_pwr_hand_limit -= 1 + permanently_remove(72) + game.persistent_events = game.persistent_events.filter(n => n !== 72) + } + } + + if (game.persistent_events.includes(102) && game.dem_pwr_hand_limit >=2 && (game.pwr_struggle_in === 'Romania' || game.pwr_struggle_in === 'Bulgaria')) { + log('Communist receives 2 cards from Democrat due to C102') + game.dem_pwr_hand_limit -= 2 + game.com_pwr_hand_limit += 2 + permanently_remove(102) + game.persistent_events = game.persistent_events.filter(n => n !== 102) + } + + //Draw Power Cards + game.is_pwr_struggle = true + //console.log('game.dem_pwr_hand_limit', game.dem_pwr_hand_limit, 'game.com_pwr_hand_limit', game.com_pwr_hand_limit) + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand_limit, game.com_pwr_hand_limit) + if (game.active === DEM) { + game.valid_cards = [...game.dem_pwr_hand] + } else { + game.valid_cards = [...game.com_pwr_hand] + } + //game.valid_cards = all_power_cards + + log(`Communist: ${game.com_pwr_hand.length} cards`) + log(`Democrat: ${game.dem_pwr_hand.length} cards`) + + //Check if The Crowd Turns Against Ceausescu occurs + if (game.table_cards.includes(54) && game.pwr_struggle_in === 'Romania') { + //console.log('draw cards: crowd subcheck, game.active', game.active) + if (game.active === COM) { + game.return = COM + next_player() + } + log_h3('C54') + game.persistent_events.push(54) + game.state = 'the_crowd_turns_against_ceausescu_prep' + } else { + log_h2('Raise the Stakes') + game.state = 'raise_stakes_1' + //console.log('game.state', game.state, 'game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) + } + } +} + +states.the_crowd_turns_against_ceausescu_prep = { + get inactive() { + return `resolve ${clean_name(cards[54].name)}.` + }, + prompt() { + view.prompt = 'The Crowd Turns Against Ceausescu: draw cards.' + gen_action('draw') + }, + draw() { + game.ceausescu_cards = [] + draw_cards(game.power_struggle_deck, game.ceausescu_cards, game.com_pwr_hand, 15, game.com_pwr_hand.length) + //console.log('game.ceausescu_cards', game.ceausescu_cards) + game.temp = game.ceausescu_cards.filter(card => card && card >=25 && card <= 30).length + log(`Drew ${pluralize(game.temp, 'Rally in the Square')}.`) + game.vm_available_ops = game.temp * 3 + log(`Democrat takes a ${game.vm_available_ops} Action Round`) + game.state = 'vm_the_crowd_turns_against_ceausescu' + } +} + +states.vm_the_crowd_turns_against_ceausescu = { + get inactive() { + return `resolve ${clean_name(cards[54].name)}.` + }, + prompt() { + view.prompt = `You have ${game.vm_available_ops} operations points. Play for:` + gen_action('influence') + gen_action('support_check') + }, + influence() { + push_undo() + delete game.ceausescu_cards + valid_spaces_infl() + game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'Romania') + game.state = 'the_crowd_turns_against_ceausescu_infl' /* Send this to add_infl. Add check at end of add_infl similar to valid_spaces*/ + }, + support_check() { + push_undo() + delete game.ceausescu_cards + valid_spaces_sc() + game.available_ops = 2 + game.state = 'support_check_prep' + } +} + +states.the_crowd_turns_against_ceausescu_infl = { + inactive: 'add SPs.', + prompt () { + if (game.vm_available_ops === 0) + { + view.prompt = 'Place SPs: done.'; + gen_action("done"); + return; + } + + view.prompt = `Add SPs: ${game.vm_available_ops} remaining` + for (let space of game.valid_spaces) { + gen_action_infl(space) + } + }, + infl(space) { + vm_do_add_infl(space) + }, + done() { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + + if (game.return !== game.active) { + next_player() + } + log_h2('Raise the Stakes') + game.state = 'raise_stakes_1' + } +} + +states.raise_stakes_1 = { + inactive: 'raise the stakes.', + + prompt () { + // console.log('raise stakes 1 - valid cards', game.valid_cards) + // console.log('raise the stakes: game.played_power_card', game.played_power_card, 'game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) + if ((game.active === DEM && game.dem_pwr_hand < 3) || (game.active === COM && game.com_pwr_hand < 3)) { + view.prompt = 'Raise the stakes: you must pass.' + gen_action('pass') + } + else if (game.raised_stakes_discard === 3) { + view.prompt = 'Raise the stakes: done.' + gen_action('done') + } else { + view.prompt = `Discard ${3-game.raised_stakes_discard} cards to raise the stakes.` + if (game.raised_stakes_discard === 0) { + gen_action('pass') + } + for (let card of game.valid_cards) { + gen_action_card(card) + } + } + }, + card(card) { + push_undo() + if (numberless_cards.includes(card)) { + log(`Discarded: P${card}`) + } else { + log(`Discarded: P${card} V${power_cards[card].value}`) + } + discard(card) + + game.raised_stakes_discard ++ + if (game.raised_stakes_discard === 3) { + game.raised_stakes++ + game.valid_cards = [] + } + }, + pass(){ + log('Did not raise the stakes') + game.raised_stakes_discard = 0 + next_player() + if (game.active === DEM) { + game.valid_cards = [...game.dem_pwr_hand] + } else { + game.valid_cards = [...game.com_pwr_hand] + } + game.state = 'raise_stakes_2' + }, + done () { + log_gap('Raised the stakes') + game.raised_stakes_discard = 0 + next_player() + //console.log('game.active', game.active) + if (game.active === DEM) { + game.valid_cards = [...game.dem_pwr_hand] + } else { + game.valid_cards = [...game.com_pwr_hand] + } + // console.log('game.valid_cards', game.valid_cards) + game.state = 'raise_stakes_2' + } +} + +states.raise_stakes_2 = { + inactive: 'raise the stakes.', + + prompt () { + if ((game.active === DEM && game.dem_pwr_hand < 3) || (game.active === COM && game.com_pwr_hand < 3)) { + view.prompt = 'Raise the stakes: you must pass.' + gen_action('pass') + return + } + if (game.raised_stakes_discard === 3) { + view.prompt = 'Raise the stakes: done.' + gen_action('done') + } else { + view.prompt = `Discard ${3-game.raised_stakes_discard} cards to raise the stakes.` + if (game.raised_stakes_discard === 0) { + gen_action('pass') + } + for (let card of game.valid_cards) { + gen_action_card(card) + } + } + }, + card(card) { + push_undo() + if (numberless_cards.includes(card)) { + log(`Discarded: P${card}`) + } else { + log(`Discarded: P${card} V${power_cards[card].value}`) + } + discard(card) + + game.raised_stakes_discard ++ + if (game.raised_stakes_discard === 3) { + game.raised_stakes++ + game.valid_cards = [] + } + + }, + pass() { + log('Did not raise the stakes') + game.raised_stakes_discard = 0 + game.valid_cards = [] + log_h2('Play Cards') + next_player() + game.state = 'begin_power_struggle' + }, + done () { + log_gap('Raised the stakes') + game.raised_stakes_discard = 0 + game.valid_cards = [] + log_h2('Play Cards') + next_player() + game.state = 'begin_power_struggle' + }, +} + +states.begin_power_struggle = { + inactive: 'begin power struggle.', + prompt() { + view.prompt = 'Begin power struggle.' + gen_action('struggle') + }, + struggle () { + do_valid_cards() + game.state = 'power_struggle' + } +} + +states.power_struggle = { + inactive: 'play a card.', + prompt () { + console.log('game.vm_event', game.vm_event) + if (game.phase === 0) { + if (game.valid_cards.length > 0) { + view.prompt = "Play a card." + for (let card of game.valid_cards) { + gen_action_card(card) + } + } else if ( game.valid_cards.length === 0) { + view.prompt = 'No valid cards. You must concede.' + gen_action('concede') + } + } + if (game.phase === 1) { + if (game.valid_cards.length > 0) { + view.prompt = `${power_cards[game.played_power_card].name} played. You must match or concede.` + gen_action('concede') + for (let card of game.valid_cards) { + gen_action_card(card) + } + } else if (game.valid_cards.length === 0) { + view.prompt = `${power_cards[game.played_power_card].name} played. You must concede.` + gen_action('concede') + } + } + else if (game.phase === 2) { + view.prompt = 'You matched. Roll a die.' + gen_action('roll') + } + else if (game.phase === 3) { + view.prompt = 'Play leader as:' + if (game.tactics_fails !== "Strike") {gen_action('strike')} + if (game.tactics_fails !== "March") {gen_action('march')} + if (game.tactics_fails !== "Rally in the Square") {gen_action('rally')} + if (game.tactics_fails !== "Petition") {gen_action('petition')} + } + }, + card(card) { + push_undo() + discard(card) + game.valid_cards=[] + game.return_state = 'power_struggle' + if (card === 52) { + log_gap(`Played P52: P${power_cards[game.played_power_card].number} no longer playable`) + + } else { + if (game.phase === 0 && leader_cards.includes(card)) {} /* Log nothing. Probably a better way to do this */ + else if (numberless_cards.includes(card)) { + log_gap(`Played: P${card}`) + } else { + log_gap(`Played: P${card} V${power_cards[card].value}`) + } + } + if (game.phase === 0) { + if (card >= 37 && card <= 48) { /*When a leader is played */ + game.played_power_card = card + game.phase = 3 + } else if (card === 49){ /*Scare Tactics */ + game.return = '' + goto_vm(349) /*Can I combine these 3 into a single stage where you goto_vm(300 + card) ? */ + } else if (card === 50) { /*Support Surges */ + if (game.active === DEM) { + game.return = COM + } else { + game.return = DEM + } + goto_vm(350) + } else if (game.phase === 0 && card === 51) { /*Support Falters */ + next_player() + goto_vm(351) + } else { + game.played_power_card = card + game.phase = 1 + next_player() + do_valid_cards() + } + } else if (game.phase === 1) { + if (card === 52) { + game.tactics_fails = power_cards[game.played_power_card].name + game.phase = 0 + next_player() + do_valid_cards() + } else if (power_cards[game.played_power_card].value === 1) { + log('Takes initiative') + game.phase = 0 + do_valid_cards() + } else { + game.phase = 2 + } + } + }, + roll () { + let roll = Math.floor(Math.random() * 6) + 1 + log(`Roll: D${roll}`) + if (roll >= power_cards[game.played_power_card].value) { + log('Initiative roll successful') + game.phase = 0 + do_valid_cards() + } else { + log(`Initiative roll failed. Required ${power_cards[game.played_power_card].value} or more`) + game.phase = 0 + next_player() + do_valid_cards() + } + }, + concede () { + push_undo() + game.valid_cards = [] + log('Conceded') + log_h2('Aftermath') + log_h3('Support Loss') + //if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) {game.rally_win = 2} + //if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.played_power_card === 54) {game.petition_win = 2} + if (game.phase === 0) { + game.played_power_card = 0 /*If conceded when held the initiative but had no playable cards, ignore the last played card */ + } + game.phase = 0 + game.state = 'support_loss' + }, + strike () { + log(`Played: P${power_cards[game.played_power_card].number} as a Strike`) + game.played_power_card = 9 + game.phase = 1 + next_player() + do_valid_cards() + }, + march () { + log(`Played: P${power_cards[game.played_power_card].number} as a March`) + game.played_power_card = 21 + game.phase = 1 + next_player() + do_valid_cards() + }, + rally () { + log(`Played: P${power_cards[game.played_power_card].number} as a Rally in the Square`) + game.played_power_card = 53 + game.phase = 1 + next_player() + do_valid_cards() + }, + petition () { + log(`Played: P${power_cards[game.played_power_card].number} as a Petition`) + game.played_power_card = 54 + game.phase = 1 + next_player() + do_valid_cards() + }, + /*draw () { + if (game.active === DEM) { + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length+2, game.com_pwr_hand.length) + } else {draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length, game.com_pwr_hand.length+2)} + game.phase = 0 + next_player() + do_valid_cards() + },*/ + /*infl(space) { + game.remove_opponent_infl = true + remove_infl(space) + game.phase = 6 + }, + discard () { /*Is this still needed? + if (game.active === DEM) {discard_card(game.dem_pwr_hand)} + else {discard_card(game.com_pwr_hand)} + game.available_ops -- + }, */ + done () { + if (game.phase === 7) { /*Is this ever called anymore? */ + game.phase = 0 + log_msg_gap('Takes initiative') + do_valid_cards() + } else { + game.phase = 0 + next_player() + do_valid_cards() + } + } +} + +states.support_loss ={ + inactive: 'do Support Loss.', + prompt () { + if (!game.persistent_events.includes(111)) { + if (game.phase === 0) { + view.prompt = 'You lost the Power Struggle. Roll a die for Support Loss.' + gen_action('roll') + } else if (game.phase === 1 && game.available_ops > 0 && game.valid_spaces.length > 0) { + view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}. Support Loss: remove ${pluralize(game.available_ops,'SP')}.` + + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id) + } + } else if (game.phase === 1 && game.available_ops === 0 ) { + view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}. Support Loss: finished.` + gen_action('done') + } else if (game.phase === 1 && game.valid_spaces.length === 0) { + view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}. Support Loss: no remaining SPs to remove.` + gen_action('done') + } + } else { + if (game.phase === 0) { + view.prompt = 'You lost the Power Struggle. Roll a die for Support Loss.' + gen_action('roll') + } else if (game.phase === 1 && game.available_ops > 0 && game.valid_spaces.length > 0) { + view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}. Support Loss: remove ${pluralize(game.available_ops,'SP')}.` + + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id) + } + } else if (game.phase === 1 && game.available_ops === 0 ) { + view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}. Support Loss: finished.` + gen_action('done') + } else if (game.phase === 1 && game.valid_spaces.length === 0) { + view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}. Support Loss: no remaining SPs to remove.` + gen_action('done') + } + } + }, + roll () { + clear_undo() + let roll = Math.floor(Math.random() * 6) + 1 + let rally_win = 0 + let petition_win = 0 + log(`Roll: D${roll}`) + if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) { rally_win = 2} + if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.played_power_card === 54) { petition_win = 2} + let modified_roll = roll + game.raised_stakes + rally_win - petition_win + + // Roll modifiers + if (game.active === COM && game.persistent_events.includes(62)) { + log('+1 from C62') + modified_roll ++ + } + + if (modified_roll < 0) {modified_roll = 0} + else if (modified_roll > 7) {modified_roll = 7} + + + if (game.raised_stakes !== 0) { + log(`+${game.raised_stakes} from Raising the Stakes`) + } + if (rally_win !== 0) { + log('+2 from winning on a P25') + } + if (petition_win !== 0) { + log('-2 from winning on a P31') + } + if (modified_roll !== roll) { + log(`Modified roll: ${modified_roll}`) + } + game.available_ops = support_loss_roll[modified_roll] + if (game.available_ops === 0) { + log('Does not remove SPs') + } + game.phase++ + if (game.available_ops > 0) { + valid_spaces_support_loss() + } + }, + infl (space) { + game.remove_opponent_infl = false /* Don't know why this is needed... */ + remove_infl(space) + if (game.available_ops === 0 ) { + game.valid_spaces = [] + } + }, + done () { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + next_player() + log_h3('Victory Point') + game.phase = 0 + game.state = 'vp_roll' + } +} + +states.vp_roll = { + inactive: 'do VP Roll.', + prompt () { + if (!game.persistent_events.includes(111)) { + if (game.phase === 0) { + view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}: roll a die for Victory.` + gen_action('roll') + } else if (game.phase === 1) { + view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}: take power.` + gen_action('take') + } else if (game.phase === 2) { + view.prompt = `Power Struggle - ${country_name(game.pwr_struggle_in)}: proceed to scoring.` + gen_action('scoring') + } + } else { + if (game.phase === 0) { + view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}: roll a die for Victory.` + gen_action('roll') + } else if (game.phase === 1) { + view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}: take power.` + gen_action('take') + } else if (game.phase === 2) { + view.prompt = `New Year's Eve Party - ${country_name(game.pwr_struggle_in)}: proceed to scoring.` + gen_action('scoring') + } + } + }, + roll () { + let roll = Math.floor(Math.random() * 6) + 1 + log(`Roll: D${roll}`) + let rally_win = 0 + let petition_win = 0 + if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) {rally_win = 2} + if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.played_power_card === 54) {petition_win = 2} + let modified_roll = roll + game.raised_stakes + rally_win - petition_win + if (game.active === DEM && game.persistent_events.includes(62)) { + log('+1 from C62') + modified_roll ++ + } + if (modified_roll < 0) {modified_roll = 0} + else if (modified_roll > 7) {modified_roll = 7} + + if (game.raised_stakes !== 0) { + log(`+${game.raised_stakes} from Raising the Stakes`) + } + if (rally_win !== 0) { + log('+2 from winning on a P25') + } + if (petition_win !== 0) { + log('-2 from winning on a P31') + } + if (modified_roll !== roll) { + log(`Modified roll: ${modified_roll}`) + } + let vp_change = vp_roll[modified_roll] + if (game.active === DEM) { + log(`+${vp_change} VP`) + } else { + log(`-${vp_change} VP`) + } + if (roll >= 4) + //console.log('VP before', game.vp) + if (game.active === DEM) {game.vp += vp_change} + else {game.vp -= vp_change} + //console.log('VP after', game.vp) + if (game.active === DEM && modified_roll >= 4) { + game.phase = 1 + } else { + game.phase = 0 + if (game.active === DEM) {next_player()} + game.state = 'choose_power' + } + }, + take () { + push_undo() + //Find name of scoring card + let scoring_card = scoring_cards[countries.indexOf(game.pwr_struggle_in)] + permanently_remove(scoring_card) + take_power(game.pwr_struggle_in) + game.phase = 2 + }, + scoring () { + push_undo() + log_h2('Scoring') + score_country(game.pwr_struggle_in) + + //Check if The Tyrant is Gone occurs + if (game.table_cards.includes(97) && game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(54)) { + game.return_state = 'finish_scoring' + if (game.active !== DEM) { + next_player() + } + game.state = 'the_tyrant_is_gone' + } else { + game.state = 'finish_scoring' + } + }, +} + +states.choose_power = { + inactive: 'choose whether to remain in power.', + prompt () { + if (game.phase === 0) { + view.prompt = 'Choose whether to remain in power.' + gen_action('retain') + gen_action('surrender') + } else if (game.phase === 1) { + view.prompt = 'Proceed to scoring.' + gen_action('scoring') + } + }, + retain() { + push_undo() + retain_power(game.pwr_struggle_in) + game.phase = 1 + }, + surrender () { + push_undo() + take_power(game.pwr_struggle_in) + permanently_remove(game.played_card) + game.phase = 1 + }, + scoring () { + push_undo() + score_country(game.pwr_struggle_in) + + //Check if The Tyrant is Gone occurs + if (game.table_cards.includes(97) && game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(54)) { + game.return_state = 'finish_scoring' + if (game.active !== DEM) { + next_player() + } + game.state = 'the_tyrant_is_gone' + } else { + game.state = 'finish_scoring' + } + } +} +/* +states.score_country = { + inactive: `score country`, + prompt () { + view.prompt = 'Scoring: done.' + gen_action('done') + }, + done () { + reset_power() + /*if (game.return !== game.active) { + next_player()} + game.state = 'finish_scoring' + } +} +*/ + +states.the_tyrant_is_gone ={ + inactive: 'resolve The Tyrant is Gone.', + prompt() { + view.prompt = 'Play The Tyrant is Gone for the event.' + gen_action('event') + }, + event() { + if (game.active !== DEM) { + next_player() + } + if (game.round_player === DEM) { + game.return = COM + } else { + game.return = DEM + } + log_h3(`C97`) + game.vm_event = 97 + goto_vm(game.vm_event) + } +} + +states.finish_scoring ={ + inactive: 'finish scoring.', + prompt() { + view.prompt = 'End power struggle.' + gen_action('done') + } , + done() { + //console.log('game.return_state', game.return_state) + log_msg_gap('Power Struggle resolved') /*At this point log card dicarded or permanently removed? */ + if (game.persistent_events.includes(111)) { + game.state = 'new_years_eve_party' + return + } + if (check_vp()) { + return + } + reset_power() + end_round() + //game.state = 'end_round' + } +} + +// ======================================= END TURN STATES ========================================== + +states.end_turn_4_5_4 = { + inactive: 'verify held cards.', + prompt() { + view.prompt = 'End Turn: verify held cards.' + gen_action('check') + }, + check() { + log_h2('Verify held cards') + const dem_has_scoring_card = game.democrat_hand.some(card => scoring_cards.includes(card)) + const com_has_scoring_card = game.communist_hand.some(card => scoring_cards.includes(card)) + if (!dem_has_scoring_card && !com_has_scoring_card) { + log('No held scoring cards') + } + + if (dem_has_scoring_card && com_has_scoring_card) { + log('Both players have held scoring cards') + game.state = 'game_end_tie' + } + else if (dem_has_scoring_card) { + log('Democrat player has a held scoring card') + goto_game_over(COM, `${COM} won by held scoring card!`) + } + else if (com_has_scoring_card) { + log('Communist player has a held scoring card') + goto_game_over(DEM, `${DEM} won by held scoring card!`) + } + else if (game.persistent_events.includes(104)) { + log_h1(`New Year's Eve Party`) + game.vm_event = 104 + //Check if the Communist receives VP from The Tyrant is Gone + if (game.persistent_events.includes(97)) { + game.vp -= 2 + log(`Communist receives 2 VP from C97`) + } + game.persistent_events.push(111) + if (game.active !== DEM) { + next_player() + } + game.state = 'new_years_eve_party' + } + else if(game.turn === 10) { + clear_undo() + log_h2('Final Scoring') + + //Check if the Communist receives VP from The Tyrant is Gone + if (game.persistent_events.includes(97)) { + game.vp -= 2 + log(`Communist receives 2 VP from C97`) + } + game.state = 'final_scoring_held' + + } else { + game.return_state = '' + game.state = 'end_turn' + } + } +} + +states.end_turn = { + inactive: 'end the turn.', + prompt() { + view.prompt = 'End Turn: done.' + gen_action('done') + }, + done() { + new_turn() + } +} + +states.final_scoring_held = { + inactive: 'resolve final scoring.', + prompt() { + view.prompt = 'Final Scoring: Communist scores VP bonus for the number of countries they retain power.' + gen_action('bonus') + }, + bonus() { + // console.log('game.revolutions: ', game.revolutions) + const held_countries = game.revolutions.filter(value => value === false).length + let vp_gain = 4*held_countries + log(`Communist holds ${held_countries} countries: -${vp_gain} VP`) + game.vp -= 4*held_countries + game.temp = {'East_Germany': false, 'Poland': false, 'Czechoslovakia': false, 'Hungary': false, 'Romania': false, 'Bulgaria': false} + game.state = 'final_scoring' + } +} + +states.final_scoring = { + inactive: 'score countries.', + prompt() { + if (game.temp['East_Germany'] && game.temp['Poland'] && game.temp['Czechoslovakia'] && game.temp['Hungary'] && game.temp['Romania'] && game.temp['Bulgaria']) { + view.prompt = 'Final scoring: done.' + gen_action('end') + } else { + view.prompt = 'Choose a country to score:' + if (!game.temp['East_Germany']) {gen_action('east_germany')} + if (!game.temp['Poland']) {gen_action('poland')} + if (!game.temp['Czechoslovakia']) {gen_action('czechoslovakia')} + if (!game.temp['Hungary']) {gen_action('hungary')} + if (!game.temp['Romania']) {gen_action('romania')} + if (!game.temp['Bulgaria']) {gen_action('bulgaria')} + } + }, + east_germany() { + score_country('East_Germany') + game.temp['East_Germany'] = true + }, + poland() { + score_country('Poland') + game.temp['Poland'] = true + }, + czechoslovakia() { + score_country('Czechoslovakia') + game.temp['Czechoslovakia'] = true + }, + hungary() { + score_country('Hungary') + game.temp['Hungary'] = true + }, + romania() { + score_country('Romania') + game.temp['Romania'] = true + }, + bulgaria() { + score_country('Bulgaria') + game.temp['Bulgaria'] = true + }, + end() { + delete game.temp + if (game.vp > 0) { + goto_game_over(DEM, `${DEM} wins on Victory Point Track!`) + } else if (game.vp < 0) { + goto_game_over(COM, `${COM} wins on Victory Point Track!`) + } else if (game.vp === 0) { + goto_game_over('', `The game is tied!`) /*Not sure what to pass for result */ + } + } +} + +states.game_over = { + get inactive() { + return game.victory + }, + prompt() { + view.prompt = game.victory + }, +} + +// ========================== EVENT SPECIFIC STATES ================================= + +states.general_strike = { + inactive: 'discard a card.', + prompt() { + if (game.played_card === 0 ) { + view.prompt = 'General Strike: you must discard a card or play a Scoring Card.' + available_cards = game.communist_hand + for (let card of available_cards) { + gen_action_card(card) + } + } /*else if (game.phase >= 1) { + view.prompt = 'General Strike: done.' + gen_action('done') + } */ else if (game.played_card > 0 ) { + view.prompt = 'General Strike: roll a die.' + gen_action('roll') + } + }, + card (card) { + push_undo() + game.played_card = card + let find_card + find_card = game.communist_hand.indexOf(card) + game.communist_hand.splice(find_card, 1) + game.available_ops = get_card_ops(card) + if (scoring_cards.includes(card)) { + game.vm_event = card + log(`Played C${card} for the event`) + game.return_state = 'general_strike' + goto_vm(game.vm_event) + } else { + log(`Discarded C${cards[card].number}`) + } + }, + roll() { + clear_undo() + let roll = Math.floor(Math.random() * 6) + 1 + log(`Roll: D${roll}`) + + logi(`+${game.available_ops} ops`) + + let total = roll + game.available_ops + log(`Total: ${total}`) + + if (total > 5) { + log('The strike is over.') + permanently_remove(5) + game.persistent_events = game.persistent_events.filter(n => n !== 5) + } else { + log('The strike continues. Required 6 or more') + } + //game.phase = 1 + game.state = 'end_round' + }, /* + done () { + //end_round() + game.state = 'end_round' + }*/ +} + +states.honecker ={ + inactive: 'resolve Honecker.', + prompt() { + view.prompt = 'Honecker: you may take an extra action round.' + gen_action('extra') + gen_action('pass') + }, + extra() { + push_undo() + game.round++ + game.round_player = COM + game.persistent_events = game.persistent_events.filter(n => n !== 15) + game.state = 'choose_card' + }, + pass() { + log('C15: passed') + game.persistent_events = game.persistent_events.filter(n => n !== 15) + //end_round() + game.state = 'end_round' + } +} + +states.new_years_eve_party = { + get inactive() { + return `resolve ${clean_name(cards[104].name)}.` + }, + prompt() { + if (!game.is_pwr_struggle) { + view.prompt = `New Year's Eve Party: you may choose a country to have a final power struggle.` + if (!game.revolutions[0]) {gen_action('poland')} + if (!game.revolutions[1]) {gen_action('hungary')} + if (!game.revolutions[2]) {gen_action('east_germany')} + if (!game.revolutions[3]) {gen_action('bulgaria')} + if (!game.revolutions[4]) {gen_action('czechoslovakia')} + if (!game.revolutions[5]) {gen_action('romania')} + gen_action('pass') + } else { + view.prompt = `New Year's Eve Party: done.` + gen_action('end') + } + }, + east_germany() { + push_undo() + log('Chose to score East Germany') + game.vm_event = 42 + goto_vm(42) + }, + poland() { + push_undo() + log('Chose to score Poland') + game.vm_event = 22 + goto_vm(22) + }, + czechoslovakia() { + push_undo() + log('Chose to score Czechoslovakia') + game.vm_event = 55 + goto_vm(55) + }, + hungary() { + push_undo() + log('Chose to score Hungary') + game.vm_event = 23 + goto_vm(23) + }, + romania() { + push_undo() + log('Chose to score Romania') + game.vm_event = 95 + goto_vm(95) + }, + bulgaria () { + push_undo() + log('Chose to score Bulgaria') + game.vm_event = 43 + goto_vm(43) + }, + pass() { + push_undo() + log('No final power struggle') + if (game.vp > 0) { + goto_game_over(DEM, `New Year's Eve Party: ${DEM} wins on Victory Point Track!`) + } else if (game.vp < 0) { + goto_game_over(COM, `New Year's Eve Party: ${COM} wins on Victory Point Track!`) + } else if (game.vp === 0) { + goto_game_over('', `New Year's Eve Party: The game is tied!`) /*Not sure what to pass for result */ + } + }, + end() { + if (game.vp > 0) { + goto_game_over(DEM, `New Year's Eve Party: ${DEM} wins on Victory Point Track!`) + } else if (game.vp < 0) { + goto_game_over(COM, `New Year's Eve Party: ${COM} wins on Victory Point Track!`) + } else if (game.vp === 0) { + goto_game_over('', `CNew Year's Eve Party: The game is tied!`) /*Not sure what to pass for result */ + } + } +} + +states.stasi_end_round = { + inactive: 'choose next card due to Stasi.', + prompt() { + //console.log('game.stasi_card', game.stasi_card) + let available_cards = game.democrat_hand + if (available_cards.length === 0) { + view.prompt = 'Stasi: no cards remaining.' + gen_action('pass') + return + } + view.prompt = 'Stasi: you must select your next card to play.' + + for (let card of available_cards) { + gen_action_card(card) + } + }, + card(card) { + push_undo() + log_gap(`Democrat selected C${cards[card].number} as next card.`) + game.stasi_card = card + game.state = 'stasi_finish' + }, + pass() { + log('Stasi: Democrat has no remaining cards') + game.stasi_card = 0 + end_stasi_choose_card() + }, + end_round() { + push_undo() + if (game.stasi_card === 21) { + game.state = 'stasi_confirm' + } else { + end_stasi_choose_card() + } + } +} + +states.stasi_finish = { + inactive: 'choose next card due to Stasi.', + prompt() { + view.prompt = 'Stasi. Choose card: done.' + gen_action('done') + }, + done() { + push_undo() + if (game.stasi_card === 21) { + game.state = 'stasi_confirm' + } else { + end_stasi_choose_card() + } + } +} + +states.stasi_confirm = { + inactive: 'choose next card due to Stasi.', + prompt() { + if (game.stasi_card === 21 ) { + view.prompt = `If Common European Home selected, it must be played for Operations. Otherwise select the opponent's card instead.` + gen_action('done') + } + }, + done() { + game.playable_cards = game.playable_cards.filter( n => n !== 21) + end_stasi_choose_card() + } +} + +states.stasi_play_card = { + inactive: 'play a card.', + prompt () { /*Should get rid of the play card 'done' prompt for consistency with general play */ + /*if (game.played_card > 0) { + game.state = 'play_card' + view.prompt = 'Play card: done.' + gen_action("done"); + return;*/ + //} else + if (game.democrat_hand.length === 0) { + view.prompt = 'Stasi: you must pass.' + gen_action('pass') + } else { + view.prompt = `Stasi: you must play ${clean_name(cards[game.stasi_card].name)}.` + let available_cards = [game.stasi_card] + for (let card of available_cards) { + gen_action_card(card) + } + } + }, + card(card) { + push_undo() + //log_msg_gap(`Stasi: played C${card}`) + game.played_card = card + let find_card + find_card = game.democrat_hand.indexOf(card); + game.democrat_hand.splice(find_card, 1); + game.available_ops = get_card_ops(card) + + if (game.democrat_hand.includes(21) && cards[card].side === "C") { + game.state = 'stasi_resolve_common_european_home' + } else { + game.state = 'play_card' + } + + }, + pass () { + log('No cards remaining. Passed') + //end_round() + game.state = 'end_round' + }, + done () { + //game.stasi_card = 0 + if (game.democrat_hand.includes(21)) { + game.state = 'stasi_resolve_common_european_home' + } else { + game.state = 'play_card' + } + } +} + +states.stasi_resolve_common_european_home = { + inactive: 'play a card.', + prompt () { + view.prompt = `Do you wish to play ${clean_name(cards[game.played_card].name)} with Common European Home?` + gen_action('yes') + gen_action('no') + }, + yes() { + log(`Played with Common European Home`) + silent_discard(21) + game.vm_infl_to_do = true + game.vm_event_to_do = false + game.state = 'resolve_opponent_event' + }, + no() { + game.state = 'play_card' + } +} + + +// ==================== SUPPORTING STATE FUNCTIONS ============================= + + +function add_infl(space) { + push_undo() + //console.log('adding infl to', space) + //console.log('at start, event', game.persistent_events['austria_hungary_border_reopened'], 'ahbr', game.austria_hungary_border_reopened, 'tracker', game.austria_hungary_border_reopened_tracker) + //log(`Added 1 influence in %${space}`) + log_summary(`Added £ SP in %${space}`) + + //If AHBR - check AHBR conditions + if (game.persistent_events.includes(58)) { + if (spaces[space].country !== 'East_Germany'){ + game.austria_hungary_border_reopened_tracker = false + } + } + + // Check Genscher + if (game.persistent_events.includes(63) && game.active === DEM && spaces[space].country === 'East_Germany' && check_com_control(space)) { + game.available_ops-- + log_summary(`(-1 op due to C63)`) + } else if (check_opp_control(space)) { + game.available_ops -= 2 + //Check if Austria Hungary Border Reopened was used to place last SP in a controlled space in East Germany. If so, game.available_op will be negative + if (game.available_ops < 0) { + log_summary(`(Used +1 op from C58)`) + } + } else { + game.available_ops-- + } + + // Update influence values + if (game.active === COM) { + game.comInfl[space]++ + } else { + game.demInfl[space]++ + } + + // Check whether spaces are controlled + check_control_change(space) + + // Check Austria Hungary Border Reopened is true and condition has been met + if (game.available_ops === 0 && game.active === DEM && game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker) { + game.available_ops ++ + log('+1 op from C58') + game.austria_hungary_border_reopened_tracker = false + game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'East_Germany') + } + + // If only 1 IP remaining, may not place in opponent controlled spaces + + // Check for Genscher & Austria Hungary Border Reopened + + if (game.available_ops === 1) { + //console.log(`in Genscher / AHBR check, game.persistent_events['genscher']`, game.persistent_events['genscher']) + if (game.active === DEM) { + if (game.persistent_events.includes(63) || (game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker)) { + //console.log('in gensher subcheck - remove non-East German controlled ') + game.valid_spaces = game.valid_spaces.filter(n => !(check_opp_control(n) && spaces[n].country !== 'East_Germany')) + } else { + //console.log('remove all controlled spaces') + game.valid_spaces = game.valid_spaces.filter(n => !check_opp_control(n)) + } + } else { + //console.log('remove all dem controlled spaces') + game.valid_spaces = game.valid_spaces.filter(n => !check_opp_control(n)) + } + } + + //Clear valid spaces if no IP remaining. + if (game.available_ops <= 0 ) { + game.valid_spaces = [] + } +} + +function remove_infl(space) { + push_undo() + //log(`Removed 1 influence from %${space}.`) + log_summary(`Removed £ SP from %${space}.`) + + if (game.remove_opponent_infl === true) { + if (game.active === COM) { + game.demInfl[space]-- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + } else { + game.comInfl[space]-- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + } + check_control_change(space) + + } else { + if (game.active === COM) { + game.comInfl[space]-- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + } else { + game.demInfl[space]-- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + } + check_control_change(space) + } + game.available_ops-- +} + +function do_sc(space) { + clear_undo() + log_gap(`Support check: %${space}`) + + //Check Helsinki Final Act + + if (game.active === COM && game.persistent_events.includes(26) && (spaces[space].socio === 5 || spaces[space].socio === 6) ) { + log('+1 VP from C26') + game.vp ++ + if (check_vp()) { + game.state = 'game.over' + //console.log('after check_vp, game.state', game.state) + return + } + } + + // Continue with Support Check Logic + + let roll = Math.floor(Math.random() * 6) + 1 + log(`Roll: D${roll}`) + + /* + //Check if support check is being done with game.played_card or a subsequent card (e.g. Common European Home, Dash for the West, etc) + if (game.vm_event > 0) { + roll+= cards[game.vm_event].ops + log(`+${cards[game.vm_event].ops} from card ops`) + } + */ + // Check for the Crowd Turns Against Ceausescu + + //else + if (game.is_pwr_struggle) { + roll += game.vm_available_ops + logi(`+${game.vm_available_ops} from Ceausescu`) + } + + // Check if in Tiananmen Square Track Award + + else if (game.state === 'vm_tst_6_sc') { + roll += get_tst_6_ops() + roll += 2 + logi('+2 TST award') + } + else { + //let modifier = 0 + let card_ops = get_card_ops(this_card()) + + roll += card_ops + logi(`+${card_ops} from card ops`) + } + + if (game.support_check_modifier > 0) { + roll += game.support_check_modifier + logi(`+${game.support_check_modifier} from event`) + } + + // Events which modify SC rolls + //Tear Gas + if (game.active === COM && game.persistent_events.includes(30) && spaces[space].socio === 6) { + roll ++ + logi('+1 from C30') + permanently_remove(30) + game.persistent_events = game.persistent_events.filter(n => n !== 30) + } + //FRG Embassies + if (game.active === DEM && spaces[space].region === 'Eastern Europe' && game.persistent_events.includes(74)) { + roll++ + logi('+1 from C74') + } + //GrenzTruppen + if (game.active === DEM && spaces[space].country === 'East_Germany' && game.persistent_events.includes(59)) { + roll-- + logi('-1 from C59') + } + //Stand Fast + if ((game.active === COM && game.stand_fast === DEM && check_dem_control(space)) || (game.active === DEM && game.stand_fast === COM && check_com_control(space))){ + roll-- + logi('-1 from C100') + } + //Elena + if (game.active === DEM && game.persistent_events.includes(101) && spaces[space].country === 'Romania') { + roll-- + logi('-1 from C101') + } + //Austria Hungary Border Reopened + if (game.active === DEM && game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker) { + roll++ + logi(`+1 from C58`) + } + + // Continue with logic - check for adjacency + + // Events which affect adjacency - The Wall + + const adj = count_adj(space) + //console.log('adj', adj) + if (game.active === COM && game.persistent_events.includes(9) && spaces[space].country === 'East_Germany') { + logi('No adjacency for Democrats due to C9') + logi('C9 no longer in effect') + roll += adj.com_adj + if (adj.com_adj > 0) { + logi(`+${adj.com_adj} adjacency`) + } + game.persistent_events = game.persistent_events.filter(n => n !== 9) + + // Standard adjacency + } else { + if (adj.dem_adj > 0 || adj.com_adj > 0 ){ + if (game.active === DEM) { + roll += adj.dem_adj + roll -= adj.com_adj + if (adj.dem_adj > 0) { + logi(`+${adj.dem_adj} from adjacency`) + } + if (adj.com_adj > 0) { + logi(`-${adj.com_adj} from opponent adjacency`) + } + } else { + roll += adj.com_adj + roll -= adj.dem_adj + if (adj.com_adj > 0) { + logi(`+${adj.com_adj} from adjacency`) + } + if (adj.dem_adj > 0) { + logi(`-${adj.dem_adj} from opponent adjacency`) + } + } + } + + } + + // Support check calcs + log(`Modified total: ${roll}`) + const stability = spaces[space].stability + logi(`-${stability*2} (stability * 2)`) + const change_infl = Math.max(0, roll - stability*2) + if (change_infl > 0) { + log_msg_gap(`Change influence: ${change_infl} SP`) + if(game.active === DEM) { + if (change_infl > game.comInfl[space]) { + const residual = change_infl - game.comInfl[space] + game.comInfl[space] = 0 + game.demInfl[space] += residual + } else { + game.comInfl[space] -= change_infl + } + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space) + } + } else { + if (change_infl > game.demInfl[space]) { + const residual = change_infl - game.demInfl[space] + game.demInfl[space] = 0 + game.comInfl[space] += residual + } else { + game.demInfl[space] -= change_infl + } + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space) + } + } + check_control_change(space) + + } else { + log_msg_gap('Change influence: 0 SP') + } + if (game.active === COM && game.persistent_events.includes(39) && spaces[space].space_id === 66) { + log_msg_gap('+1 VP from C39') + game.vp++ + if (check_vp()) { + return + } + } + + // If Austria-Hungary Border Reopened used, all future support checks must be in East Germany + if (game.persistent_events.includes(58)){ + if (game.austria_hungary_border_reopened_tracker) { + game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'East_Germany') + } + } + game.selected_space = 0 + +} + +function valid_spaces_setup() { + game.valid_spaces = [] + let valid_spaces_set = new Set(); + //console.log('in vs setup, state', game.state) + for (let i =1 ; i <= 75 ; i++) { + space = spaces[i] + + if (game.state === 'com_init') { + infl = game.demInfl[i] + + if (infl === 0) { + valid_spaces_set.add(space.space_id); + } + } else if (game.state === 'dem_init') { + infl = game.comInfl[i] + if (infl === 0) { + valid_spaces_set.add(space.space_id); + } + } + } + // Convert the set to an array before returning + game.valid_spaces = Array.from(valid_spaces_set); + return game.valid_spaces; +} + +function valid_spaces_sc() { + let valid_spaces_set = new Set(); + //console.log('valid spaces sc, persistent events', game.persistent_events) + + for (let i = 1 ; i <= 75; i++) { + space = spaces[i] + + if (game.active === DEM) { + infl = game.comInfl[i] + if (infl !== 0 ) { + valid_spaces_set.add(space.space_id); + } + } else { + infl = game.demInfl[i] + if (infl !== 0 ) { + // Check Solidarity Legalised + if (game.persistent_events.includes(2) && space.space_id === 14) {continue} + + // Check Civic Forum + if (game.persistent_events.includes(90) && space.space_id === 30) {continue} + + // Check We Are the People + if (game.persistent_events.includes(48) && space.space_id === 9) {continue} + + //Check for Foreign Currency Debt Burden + if (game.persistent_events.includes(49) && space.country === game.foreign_currency_debt_burden) {continue} { + + valid_spaces_set.add(space.space_id); + + } + } + } + } + + + // Convert the set to an array before returning + game.valid_spaces = Array.from(valid_spaces_set); + + //Check for the Crown Turns Against Ceausescu + if (game.is_pwr_struggle && game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(54)) { + game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'Romania') + } + return game.valid_spaces; +} + +function valid_spaces_support_loss() { + let valid_spaces_set = new Set(); + for (let i = 1; i < game.demInfl.length; i++) { + //console.log('spaces.length', game.demInfl.length, 'i', i) + space = spaces[i] + if (game.active === DEM) { + infl = game.demInfl[i] + if (infl > 0 && space.country === game.pwr_struggle_in) { + valid_spaces_set.add(space.space_id); + } + } else { + infl = game.comInfl[i] + if (infl > 0 && space.country === game.pwr_struggle_in) { + valid_spaces_set.add(space.space_id); + } + } + } + + // Convert the set to an array before returning + game.valid_spaces = Array.from(valid_spaces_set); + return game.valid_spaces; +} +/* +function valid_spaces_support_falters() { + let valid_spaces_set = new Set(); + if (game.active === DEM) { + for (let piece of game.pieces) { + if (!piece) continue + let space = spaces.find(s => s && s.space_id === piece.space_id); + if (space && piece.comInfl > 0 && space.country === game.pwr_struggle_in) { + valid_spaces_set.add(space.space_id); + } + } + } else { + for (let piece of game.pieces) { + if (!piece) continue + let space = spaces.find(s => s && s.space_id === piece.space_id); + if (space && piece.demInfl > 0 && space.country === game.pwr_struggle_in) { + valid_spaces_set.add(space.space_id); + } + } + } + // Convert the set to an array before returning + game.valid_spaces = Array.from(valid_spaces_set); + return game.valid_spaces; +} + */ + +function valid_spaces_infl() { + /*if (game.state.startsWith('vm')) { + console.log('valid_spaces_infl called from VM') + } else { + console.log('valid_spaces_infl called not from VM') + }*/ + // Check if function is called from the VM or not, take relevant ops variable + let ops = game.state.startsWith('vm') ? game.vm_available_ops : game.available_ops; + + let valid_spaces_set = new Set(); + // Iterate over all spaces to find the ones with the player's influence + for (let i = 1; i < game.demInfl.length; i++) { + //piece = game.pieces[i] + space = spaces[i] + + let player_influence = game.active === COM ? game.comInfl[i] : game.demInfl[i]; + + // If the piece has the player's influence, add it and its adjacent spaces to the set + if (player_influence > 0) { + valid_spaces_set.add(space.space_id); + + // Check adjacency information + let adjacent_spaces = get_adjusted_adjacency(space.space_id) + + for (let adj_space_id of adjacent_spaces) { + //console.log('adj_space_id', adj_space_id) + if (adj_space_id) { + + const adj_piece = spaces[adj_space_id]; + //console.log('adjacent piece name', adj_piece.name_unique) + + // Check if the adjacent space is controlled by the opponent + const opponent_control = check_opp_control(adj_piece.space_id) + //console.log('controlled?', opponent_control) + + //Check for Genscher. Can always place in East Germany even with 1 op + if (game.active === DEM && adj_piece.country === 'East_Germany' && game.persistent_events.includes(63)){ + // console.log('space added with genscher') + valid_spaces_set.add(adj_piece.space_id) + } + + // Otherwise, only add the adjacent space if the available_ops >= 2 or the space is not controlled by the opponent + if (ops >= 2 || !opponent_control) { + valid_spaces_set.add(adj_piece.space_id) + } + } + } + } + } + // Convert the set to an array before returning + game.valid_spaces = Array.from(valid_spaces_set); + return game.valid_spaces; +} + +function valid_cards(player_hand, presence) { + const valid_cards_set= new Set(); + if (game.phase === 0) { + for (let c of player_hand) { + let card = power_cards.find(card => card && card.number === c); + if (card.number === 52) {continue} // Never add tactics fails + if (card.name === game.tactics_fails) {continue} //Cannot play the suit of Tactics Fails + if (card.socio === 0) { + valid_cards_set.add(card.number); + } else if (leaders.includes(card.socio) && presence[card.socio]) { + valid_cards_set.add(card.number); + } + } + } else if (game.phase === 1) { + for (let c of player_hand) { + let card = power_cards.find(card => card && card.number === c); + if (card.name === power_cards[game.played_power_card].name) { + valid_cards_set.add(card.number); + } else if (leaders.includes(card.socio) && presence[card.socio]) { + valid_cards_set.add(card.number); + } else if (card.number === 52) {valid_cards_set.add(card.number)} + } + } + game.valid_cards = Array.from(valid_cards_set); + return game.valid_cards; +} + +function do_valid_cards() { + let presence = check_presence(game.pwr_struggle_in) + if (game.active === DEM) { + valid_cards(game.dem_pwr_hand, presence.dem_leaders) + + } else { + valid_cards(game.com_pwr_hand, presence.com_leaders)} +} + +function count_adj(id) { + const space = spaces[id] + let dem_adj = 0 + let com_adj = 0 + + let adjacent_spaces = get_adjusted_adjacency(space.space_id) + + for (let adj_space_id of adjacent_spaces) { + if (adj_space_id) { + const adj_piece = spaces.find(piece => piece && piece.space_id === adj_space_id); + //console.log('adj_piece.space_id', adj_piece.space_id, 'space', space) + if (adj_piece && adj_piece.space_id !== space.space_id) { + if (check_dem_control(adj_piece.space_id)) { + //console.log('added DEM space', spaces[adj_piece.space_id].name) + dem_adj++ + } + if (check_com_control(adj_piece.space_id)) { + //console.log('added COM space', spaces[adj_piece.space_id].name) + com_adj++ + } + } + } + } + //console.log('dem_adj: ', dem_adj, 'com_adj: ', com_adj) + return {dem_adj, com_adj} +} + +/*function count_adj_worker(space_id) { + const space = spaces[space_id] + let dem_adj = 0 + let com_adj = 0 + + for (let adj_space_id of space.adjacent) { + if (adj_space_id) { + const adj_space = spaces[adj_space_id] + if (adj_space && adj_space.socio === 4) { + const adj_piece = game.pieces.find(piece => piece && piece.space_id === adj_space_id ); + if (adj_piece) { + if (adj_piece.demCtrl === 1 ) { + dem_adj++ + } + if (adj_piece.comCtrl === 1 ) { + com_adj++ + } + } + } + } + } + return {dem_adj, com_adj} +} */ + +function check_control(space_id) { + //console.log('in check control, space', spaces[space_id].name_unique) + if ( (game.comInfl[space_id] - game.demInfl[space_id]) >= spaces[space_id].stability) { + return true; + } else if ((game.demInfl[space_id] - game.comInfl[space_id]) >= spaces[space_id].stability) { + //console.log('true') + return true; + } else { + //console.log('false') + return false; + } +} + +function check_opp_control(space_id) { + if (spaces[space_id].country === 'Romania') { + //console.log('in check opp control, space', spaces[space_id].name_unique) + } + if (game.active === DEM && ((game.comInfl[space_id] - game.demInfl[space_id]) >= spaces[space_id].stability)) { + if (spaces[space_id].country === 'Romania') { + //console.log('control true') + } + return true; + } else if (game.active === COM && ((game.demInfl[space_id] - game.comInfl[space_id]) >= spaces[space_id].stability)) { + //console.log('true') + return true; + } else { + //console.log('false') + return false; + } +} + +function check_dem_control(space_id) { + if ((game.demInfl[space_id] - game.comInfl[space_id]) >= spaces[space_id].stability) { + return true; + } else { + return false; + } +} + +function check_com_control(space_id) { + if ((game.comInfl[space_id] - game.demInfl[space_id]) >= spaces[space_id].stability) { + return true; + } else { + return false; + } +} + +function do_tst_attempt() { + let roll = Math.floor(Math.random() * 6) + 1; + log(`Roll: D${roll}`); + + roll += game.available_ops + logi(`+${game.available_ops} from card ops`) + + // TIANANMEN SQUARE MODIFIERS + + if (game.active === DEM && game.dem_tst_attempted === 1 || game.active === COM && game.com_tst_attempted === 1) { + roll ++; + logi('+1 from previous TST attempts') + } + if (game.active === DEM && game.dem_tst_position >= 1 && game.com_tst_position === 0) { + roll ++ + logi('+1 from TST award') + } + if (game.active === COM && game.com_tst_position >= 1 && game.dem_tst_position === 0) { + roll ++ + logi('+1 from TST award') + } + if ((game.active === DEM && cards[game.played_card].side === 'D') || (game.active === COM && cards[game.played_card].side === 'C')) { + roll ++; + logi('+1 for playing own card'); + } + if (game.active === COM && game.persistent_events.includes(53)) { + roll ++ + logi('+1 from C53') + } + log(`Modified total: ${roll}`) + + // TIANANMEN SQUARE ATTEMPT + game.return = game.active + game.return_state = 'tiananmen_square_attempt_done' + if (game.active === DEM) { + game.dem_tst_attempted_this_turn = 1 + if (roll >= dem_tst_req[game.dem_tst_position]) { + log(`${dem_tst_req[game.dem_tst_position]} required: success`) + game.dem_tst_position++ + game.dem_tst_attempted = 0 + + //Check if they have reached box 7 or 8 first + if (game.dem_tst_position === 7 && game.com_tst_position < 7) { + game.tst_7 = false + } + if (game.dem_tst_position === 8 && game.com_tst_position < 8) { + game.tst_8 = false + } + + //Check if they have caught up to box 7 or 8 + if (game.dem_tst_position >= 7 && game.com_tst_position >= 7) { + delete game.tst_7 + } + if (game.dem_tst_position >= 8 && game.com_tst_position >= 8) { + delete game.tst_8 + } + + //Check if TST events occur + if (game.dem_tst_position === 3 && game.com_tst_position < 3) {game.vm_event = 203} + else if (game.dem_tst_position === 4 && game.com_tst_position < 4) {game.vm_event = 204} + game.state = 'tiananmen_square_attempt_success' + } else { + log(`${dem_tst_req[game.dem_tst_position]} required: fail`) + game.dem_tst_attempted = 1 + game.state = 'tiananmen_square_attempt_fail' + } + } else { + game.com_tst_attempted_this_turn = 1 + if (roll >= com_tst_req[game.com_tst_position]) { + log(`${com_tst_req[game.com_tst_position]} required: success`) + game.com_tst_position++ + game.com_tst_attempted = 0 + + //Check if they have reached box 7 or 8 first + if (game.com_tst_position === 7 && game.dem_tst_position < 7) { + game.tst_7 = false + } + if (game.com_tst_position === 8 && game.dem_tst_position < 8) { + game.tst_8 = false + } + + //Check if they have caught up to box 7 or 8 + if (game.com_tst_position >= 7 && game.dem_tst_position >= 7) { + delete game.tst_7 + } + if (game.com_tst_position >= 8 && game.dem_tst_position >= 8) { + delete game.tst_8 + } + + //Check if TST events occur + if (game.com_tst_position === 3 && game.dem_tst_position < 3) {game.vm_event = 203} + else if (game.com_tst_position === 4 && game.dem_tst_position < 4) {game.vm_event = 204} + game.state = 'tiananmen_square_attempt_success' + } else { + log(`${com_tst_req[game.com_tst_position]} required: fail`) + game.com_tst_attempted = 1 + game.state = 'tiananmen_square_attempt_fail' + } + } +} + +function check_presence(country) { + + let dem_spaces = 0; + let com_spaces = 0; + let dem_battlegrounds = 0; + let com_battlegrounds = 0; + let dem_leaders = {1: false, 4: false, 5: false, 6: false, 7: false}; + let com_leaders = {1: false, 4: false, 5: false, 6: false, 7: false}; + + + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + if (space.country === country) { + + if (check_dem_control(i)) { + dem_spaces++; + if (space.battleground === 1) { + dem_battlegrounds++; + } + if (leaders.includes(space.socio)) { + dem_leaders[space.socio] = true; + } + } + if (check_com_control(i)) { + com_spaces++; + if (space.battleground === 1) { + com_battlegrounds++; + } + if (leaders.includes(space.socio)) { + com_leaders[space.socio] = true; + } + } + } + } + + // Determine domination + let dem_domination = dem_battlegrounds > com_battlegrounds && dem_spaces > com_spaces && dem_spaces - dem_battlegrounds > 0; + let com_domination = com_battlegrounds > dem_battlegrounds && com_spaces > dem_spaces && com_spaces - com_battlegrounds > 0; + + // Determine control + let total_battlegrounds = battlegrounds(country); + let dem_control = dem_battlegrounds === total_battlegrounds && dem_spaces > com_spaces; + let com_control = com_battlegrounds === total_battlegrounds && com_spaces > dem_spaces; + + return { + dem_spaces: dem_spaces, + com_spaces: com_spaces, + dem_battlegrounds: dem_battlegrounds, + com_battlegrounds: com_battlegrounds, + dem_domination: dem_domination, + com_domination: com_domination, + dem_control: dem_control, + com_control: com_control, + dem_leaders: dem_leaders, + com_leaders: com_leaders + }; +} + +function battlegrounds(country) { + let battlegrounds = 0; + if (country === "Hungary") { + battlegrounds = 4 + } else if (country === "Bulgaria") { + battlegrounds = 5 + } else { + battlegrounds = 6 + } + return battlegrounds; +} + +function take_power(country) { + + log(`Democrat takes power in ${game.pwr_struggle_in}`) + game.revolutions[find_country_index(country)] = true + game.times_held[find_country_index(country)] = 1 + +} + +function retain_power(country){ + game.times_held[find_country_index(country)]++ + let vp_gain = get_value(country)*game.times_held[find_country_index(country)] + log(`Chooses to retain power`) + log(`-${vp_gain} VP`) + game.vp -= vp_gain +} + +function score_country(country) { + log_h3(`Scoring: ${country}`) + +//Get scoring values + let value_presence = get_value(country) + let value_domination = value_presence*2 + let value_control + if (country !== "Hungary") { + value_control = value_presence*3 + } else { + value_control = 4 + } +//Log for scoring + + let dem_vp = 0 + let com_vp = 0 + //Check for presence + let presence = check_presence(country) +// console.log('presence: ', presence) + + //If one side has domination or control + if (presence.dem_control || presence.dem_domination) { + log(`Democrat:`) + if (presence.dem_control) { + log(`Control: +${value_control} VP`) + dem_vp += value_control + } + else { + log(`Domination: +${value_domination} VP`) + dem_vp += value_domination + } + log(`Battlegrounds: +${presence.dem_battlegrounds} VP`) + dem_vp += presence.dem_battlegrounds + log(`Total: +${dem_vp} VP`) + + log_gap('Communist:') + if (presence.com_spaces > 0) { + log(`Presence: -${value_presence} VP`) + com_vp -= value_presence + if (presence.com_battlegrounds >0) { + log(`Battlegrounds: -${presence.com_battlegrounds} VP`) + com_vp -= presence.com_battlegrounds + } + log(`Total: ${com_vp} VP`) + } else { + log('No presence: 0 VP') + } + + } + else if (presence.com_control || presence.com_domination) { + log('Communist:') + if (presence.com_control) { + log(`Control: -${value_control} VP`) + com_vp -= value_control + } + else { + log(`Domination: -${value_domination} VP`) + com_vp -= value_domination + } + log(`Battlegrounds: -${presence.com_battlegrounds} VP`) + com_vp -= presence.com_battlegrounds + log(`Total: ${com_vp} VP`) + + log_gap('Democrat:') + if (presence.dem_spaces > 0) { + log(`Presence: +${value_presence} VP`) + dem_vp += value_presence + if (presence.dem_battlegrounds > 0) { + log(`Battlegrounds: +${presence.dem_battlegrounds} VP`) + dem_vp += presence.dem_battlegrounds + } + log (`Total: +${dem_vp} VP`) + } else { + log('No presence: 0 VP') + } + + } + + //Otherwise, presence and battlegrounds + else { + log("No domination or control") + log_gap(`Communist:`) + if (presence.com_spaces > 0) { + log(`Presence: -${value_presence} VP`) + com_vp -= value_presence + if (presence.com_battlegrounds > 0) { + log(`Battlegrounds: -${presence.com_battlegrounds} VP`) + com_vp -= presence.com_battlegrounds + } else { + log('No battlegrounds') + } + log(`Total: ${com_vp} VP`) + } else { + log('No presence: 0 VP') + } + log_gap('Democrat:') + if (presence.dem_spaces > 0) { + log(`Presence: +${value_presence} VP`) + dem_vp += value_presence + if (presence.dem_battlegrounds > 0) { + log(`Battlegrounds: +${presence.dem_battlegrounds} VP`) + dem_vp += presence.dem_battlegrounds + } else { + log('No battlegrounds') + } + log(`Total: +${dem_vp} VP`) + } else { + log('No presence: 0 VP') + } + } + + +//Calculate change VP + /*let dem_vp = 0 + if (presence.dem_spaces > 0) {dem_vp += value_presence} + if (presence.dem_domination) {dem_vp += value_presence} + if (presence.dem_control && country !== "Hungary") { + dem_vp += value_control + } + else if (presence.dem_control && country === "Hungary") {dem_vp += 2} + dem_vp += presence.dem_battlegrounds + + let com_vp = 0 + if (presence.com_spaces > 0) {com_vp += value_presence} + if (presence.com_domination) {com_vp += value_presence} + if (presence.com_control && country !== "Hungary") {com_vp += value_presence} + else if (presence.com_control && country === "Hungary") {com_vp += 2} + com_vp += presence.com_battlegrounds */ + let change_vp = dem_vp + com_vp + game.vp += change_vp + if (change_vp > 0 ) { + log_gap(`Final change VP: +${change_vp} VP`) + } else { + log_gap(`Final change VP: ${change_vp} VP`) + } +} + +function get_value(country) { + let value + if (country === "East_Germany" || country === "Poland") {value = 3} + else if (country === "Czechoslovakia" || country === "Romania") {value = 2} + else value = 1 + return value +} + +function get_end_infl_prompt() { + view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` + if (!game.vm_infl_to_do) { + gen_action('end_round') + } else { + gen_action('done') + } +} + +function permanently_remove(card) { + //console.log('permanently removing card:', card) + if (game.strategy_removed.includes(card)) {return} + //log_msg_gap(`C${cards[card].number} permanently removed`) + remove_from_discard(card) + + card_index = game.table_cards.indexOf(card) + if (card_index !== -1) { + //console.log('sub 2 called') + game.table_cards.splice(card_index, 1) + } + game.strategy_removed.push(card) + //console.log('game.strategy_removed', game.strategy_removed) +} + +function check_vp() { + if (game.vp >= 20) { + goto_game_over(DEM, `${DEM} won an Automatic Victory!`) + //console.log('after goto_game_over, game.state', game.state) + return true + } else if(game.vp <= -20) { + goto_game_over(COM, `${COM} won an Automatic Victory!`) + return true + } + return false +} + +function game_over() { + if (game.vp >= 20 || game.vp <= -20) { + return true + } else { return false} +} + +function goto_game_over(result, victory) { + game.state = "game_over" + game.active = "None" + game.result = result + game.victory = victory + log_h1("Game Over") + log(game.victory) + //console.log('game over, game.state', game.state) + return + +} + +function reset_austria_hungary_border_reopened() { + //game.austria_hungary_border_reopened_checked = false + game.austria_hungary_border_reopened_tracker = false +} + +function end_stasi_choose_card() { + game.round_player = COM + game.round ++ + log_h2(`Action Round ${game.round}`) + next_player() + game.valid_spaces = [] + if (game.persistent_events.includes(5)) { + log_h3('C5') + game.state = 'general_strike' + } else { + game.state = 'choose_card' + } +} + +function check_reformer() { + if (game.dem_tst_position !== game.com_tst_position) { + if (!game.playable_cards.includes(67)) { + game.playable_cards.push(67) + } + } else { + game.playable_cards = game.playable_cards.filter(n => n !== 67) + } + +} + +function count_scoring_cards() { + let scoring_check + if (game.active === DEM) { + scoring_check = game.democrat_hand.filter(card => scoring_cards.includes(card)).length + } else { + scoring_check = game.communist_hand.filter(card => scoring_cards.includes(card)).length + } + return scoring_check +} + +function select_card(card){ + game.played_card = card + game.temp = 0 + let find_card + if (game.active === COM) { + find_card = game.communist_hand.indexOf(card) + game.communist_hand.splice(find_card, 1) + } else { + find_card = game.democrat_hand.indexOf(card) + game.democrat_hand.splice(find_card, 1) + } + game.available_ops = get_card_ops(card) + + //Check Ligachev + if (game.active === DEM && game.persistent_events.includes(99) && card !== 14) { + log('-3 VP from C99') + game.vp -= 3 + if (check_vp()) { + return + } + game.persistent_events = game.persistent_events.filter(n => n !== 99) + } + game.state = 'play_card' + //console.log('game.state', game.state) +} + +function find_event(card) { + return variable_events.indexOf(card) +} + +function is_auto_resolve(card) { + + let ceausecu_events = [10, 41, 101, 107] + + if (card === 97) { + if (!game.persistent_events.includes(54)) { + return true + } + } + else if (ceausecu_events.includes(card) && game.persistent_events.includes(97)) { + return true + } + else if (card === 87 && !game.persistent_events.includes(86)) { + return true + } + else if (auto_resolve_events.includes(card)) { + return true + } else { + return false + } +} + +function get_events(card){ + if (event_is_playable(card)) { + if (cards[card].side === 'D') { + if (game.active === DEM) {gen_action('event')} + if (game.active === COM) {gen_action('opp_event')} + } + else if (cards[card].side === 'C') { + if (game.active === COM) {gen_action('event')} + if (game.active === DEM) {gen_action('opp_event')} + } + else { + gen_action('event') + } + } +} + +function event_is_playable(card) { +// console.log('game.stasi_card', game.stasi_card, 'card', card) + //Reformer never playable here + if (card === 67) { + return false + } + //Check for Common European Hmme under Stasi + else if (game.stasi_card === 21 && card === 21 && game.active === DEM) { + return false + } + //Check for The Chinese Solution + else if (game.com_tst_position === 8 && card === 96) { + return true + } + //Then check normally + else if (cards[card].playable) { + return true + } else if (game.playable_cards.includes(card)) { + return true + } else { + return false + } +} + +function get_card_ops(card) { + let ops = 0 + + if (card) { + ops = cards[card].ops + } + if (game.persistent_events.includes(25) && game.active === COM) { + if(game.state === 'choose_card' || game.state === 'stasi_play_card') { + log('+1 op from C25') + } + ops ++ + } + if (game.persistent_events.includes(50) && game.active === DEM) { + if(game.state === 'choose_card' || game.state === 'stasi_play_card' || game.state === 'vm_laszlo_tokes') { + log('+1 op from C50') + } + ops ++ + } + + if ((game.active === DEM && game.dem_tst_position >= 2 && game.com_tst_position <= 1 && cards[card].ops === 1) || (game.active === COM && game.com_tst_position >=2 && game.dem_tst_position <= 1 && cards[card].ops === 1)) { + if(game.state === 'choose_card' || game.state === 'stasi_play_card') { + log('+1 op from Tiananmen Square Track') + } + ops ++ + } + + if ((game.active === DEM && game.prudence && game.prudence.DEM !== 0)) { + if(game.state === 'choose_card' || game.state === 'stasi_play_card' || game.state === 'vm_laszlo_tokes') { + if (ops > 2) { + log(`${pluralize(game.prudence.DEM,'op')} from C8`) + } else { + if (ops > 1) { + log(`-1 op from C8`) + } + } + } + ops += game.prudence.DEM + + if (ops < 1) { + ops = 1 + } + } + + if (game.active === COM && game.prudence && game.prudence.COM < 0) { + if(game.state === 'choose_card') { + if (ops > 2) { + log(`${pluralize(game.prudence.COM,'op')} from C8`) + } else if (ops > 1) { + log(`-1 op from C8`) + } + } + ops += game.prudence.COM + if (ops < 1) { + ops = 1 + } + } return ops +} + +function get_tst_6_ops() { + let ops = 0 + + if (game.persistent_events.includes(25) && game.active === COM) { + log('+1 op from C25') + ops ++ + } + if (game.persistent_events.includes(50) && game.active === DEM) { + log('+1 op from C50') + ops ++ + } + + if ((game.active === DEM && game.prudence && game.prudence.DEM !== 0)) { + if (ops > 0) { + log(`${pluralize(game.prudence.DEM,'op')} from C8`) + } else { + log(`-1 op from C8`) + } + + ops += game.prudence.DEM + + if (ops < -1) { + ops = -1 + } + } + + if (game.active === COM && game.prudence && game.prudence.COM < 0) { + + if (ops > 0) { + log(`${pluralize(game.prudence.COM,'op')} from C8`) + } else { + log(`-1 op from C8`) + } + + ops += game.prudence.COM + if (ops < -1) { + ops = -1 + } + } + return ops +} + +function finish_the_wall() { + if (game.the_wall_must_go['dem_wins'] === 2) { + game.persistent_events.push(86) + log('+3 VP') + game.vp += 3 + if (check_vp()) { + return + } + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + if (space.country === 'East_Germany' && game.comInfl[i] > 0){ + game.valid_spaces.push(space.space_id) + } + } + if (!game.vm_infl_to_do) { + if (game.round_player === DEM) { + game.return = COM + } else { + game.return = DEM + } + } + if (game.active === DEM) {next_player()} + vm_next () + } else { + permanently_remove(86) + delete game.the_wall_must_go + vm_return() + } +} + + +// =========== MOVING THROUGH TURNS ============ + +function end_round() { +// console.log('end round, game.persistent_events.includes(13)', game.persistent_events.includes(13)) + //Check if the game is over! + if (game.state === 'game_over') { + // console.log('in end') + return} + + //Check if the card has been removed or played to table, and if a card has been not been played. If not, discard. + if (!game.strategy_removed.includes(game.played_card) && !game.table_cards.includes(game.played_card) && game.played_card > 0) { + game.strategy_discard.push(game.played_card) + } + + //Reset + game.played_card = 0 + game.temp = 0 + game.vm_event = 0 + game.phase = 0 + game.remove_opponent_infl = false + game.is_pwr_struggle = false + game.vm_infl_to_do = false /*Can get rid of this and use game.return_state? */ + game.vm_event_to_do = false + game.vm_active_country = '' + game.return_state = '' + game.discard = false + game.return = '' + game.valid_cards = [] + game.valid_spaces = [] + check_common_european_home() + //game.playable_cards[find_event(21)] = true + reset_austria_hungary_border_reopened() /*This should be redundant! */ + + + // Check for duplicate card entries + let card_check + if (game.samizdat_card > 0) { + card_check = [...game.strategy_deck, ...game.strategy_discard, ...game.strategy_removed, ...game.table_cards, ...game.communist_hand, ... game.democrat_hand, game.samizdat_card]; + } else { + card_check = [...game.strategy_deck, ...game.strategy_discard, ...game.strategy_removed, ...game.table_cards, ...game.communist_hand, ... game.democrat_hand]; + } + + function check_duplicates(array) { + return new Set(array).size !== array.length; + } + + function find_duplicates(array) { + const duplicates = array.filter((item, index) => array.indexOf(item) !== index); + return [...new Set(duplicates)]; + } + + //console.log('game.strategy_deck', game.strategy_deck, 'game.strategy_discard', game.strategy_discard, 'game.strategy_removed', game.strategy_removed, 'game.table_cards', game.table_cards, 'game.communist_hand', game.communist_hand, 'game.democrat_hand', game.democrat_hand) + + if (check_duplicates(card_check)) { + console.log('card check', card_check) + const duplicates = find_duplicates(card_check) + console.log('game.strategy_deck', game.strategy_deck, 'game.strategy_discard', game.strategy_discard, 'game.strategy_removed', game.strategy_removed, 'game.table_cards', game.table_cards, 'game.communist_hand', game.communist_hand, 'game.democrat_hand', game.democrat_hand) + throw new Error(`Duplicate cards detected: ${duplicates.join(', ')}`) + } + //console.log('cards in game', card_check.length) + card_check = card_check.sort((a, b) => a - b) + //console.log('cards in game', card_check) + if (game.turn <= 3) { + if (card_check.length !== 40) { + throw new Error(`Wrong number of cards: ${card_check.length}`) + } + } else if (game.turn <=7) { + if (card_check.length !== 81) { + throw new Error(`Wrong number of cards: ${card_check.length}`) + } + } else if (card_check.length !== 110) { + throw new Error(`Wrong number of cards: ${card_check.length}`) + } + + + + //console.log('game.dem_tst_position ', game.dem_tst_position , 'game.com_tst_position ', game.com_tst_position ) + //Check if the Reformer is playable + check_reformer() + + // Check if last round and if so resolve end turn events + if (game.round_player === DEM && game.round === 7) { + if(game.persistent_events.includes(15)) { + if (game.active !== COM) { + next_player() + } + game.state = 'honecker' + return + } + else if (game.dem_tst_position >= 6 && game.com_tst_position <= 5) { + log_h2('Tiananmen Square Track Award') + if (game.active !== DEM) { + next_player() + } + game.return = game.active + clear_undo() + game.return_state = 'end_turn_4_5_4' + goto_vm(206) + return + } else if (game.com_tst_position >= 6 && game.dem_tst_position <= 5) { + log_h2('Tiananmen Square Track Award') + if (game.active !== COM) { + next_player() + } + game.return = game.active + clear_undo() + game.return_state = 'end_turn_4_5_4' + goto_vm(206) + return + } + else { + clear_undo() + game.state = 'end_turn_4_5_4' + return + } + } + + // Resolve end action round + //Stasi check + if(game.round_player === COM && game.persistent_events.includes(13)) { + //If in Honecker, turn ends + if (game.round === 8) { + clear_undo() + game.state = 'end_turn_4_5_4' + return + } + //Otherwise go to Stasi + game.round_player = DEM + if (game.active !== DEM) { + next_player() + } else { + log_h3('Democratic Action Round') + + } + if (game.democrat_hand.includes(game.stasi_card)) { + log_h3('C13') + game.state = 'stasi_play_card' + } else { + game.stasi_card = 0 + game.state = 'choose_card' + } + return + } + //Check if in extra Action Round + else if (game.round_player === COM && game.round === 8) { + clear_undo() + game.state = 'end_turn_4_5_4' + return + } + //Normal round end + else if (game.round_player===COM) { + game.round_player = DEM + if (game.active !== DEM) { + next_player() + } else { + log_h3('Democratic Action Round') + } + game.state = 'choose_card' + return + } + if (game.round_player === DEM) { + // console.log('checking stasi', game.persistent_events.includes(13)) + if(game.persistent_events.includes(13)) { + // console.log('stasi sub function') + if (game.active !== DEM) { + next_player() + } + log_h3('C13') + game.state = 'stasi_end_round' + return + } else if(game.round_player === DEM && game.persistent_events.includes(5)){ + game.state = 'general_strike' + game.round ++ + log_h2(`Action Round ${game.round}`) + game.round_player = COM + if (game.active !== COM) { + next_player() + } + log_h3('C5') + return + } else { + game.state = 'choose_card' + game.round_player = COM + game.round ++ + log_h2(`Action Round ${game.round}`) + if (game.active !== COM) { + next_player() + } + } + } + //game.state = 'choose_card' Does this do anything any more? +} + +/* +function end_turn(){ + /*End Turn sequence + TST support check + Verify held cards + New Year's Eve Party + Advance Turn Marker + +// CHECK FOR OPTIONAL SUPPORT CHECK + if (game.dem_tst_position >=6 && game.com_tst_position <= 5) { + if (game.active !== DEM) { + next_player_() + } + game.state = 'tst_support_check' + } + if (game.com_tst_position >=6 && game.dem_tst_position <= 5) { + if (game.active !== COM) { + next_player_() + } + game.state = 'tst_support_check' + } + + +//CHECK HELD CARDS + +} */ + +function new_turn() { + clear_undo() + game.turn ++ + game.round = 1 + game.valid_spaces=[] + game.active = COM + game.round_player = COM + game.dem_tst_attempted_this_turn = 0 + game.com_tst_attempted_this_turn = 0 + if (game.tst_7) {game.tst_7 = false} + if (game.tst_8) {game.tst_8 = false} + + //Remove events that only last one turn + game.persistent_events = game.persistent_events.filter(n => n !== 25) /*Perestroika*/ + game.persistent_events = game.persistent_events.filter(n => n !== 50) /*Sinatra Doctrine*/ + game.persistent_events = game.persistent_events.filter(n => n !== 13) /*Stasi*/ + game.persistent_events = game.persistent_events.filter(n => n !== 15) /*Honecker*/ + delete game.prudence + delete game.stasi_card + + //Austria Hungary Border Reopened + if (game.persistent_events.includes(58)) { + game.persistent_events = game.persistent_events.filter(n => n !== 58) + delete game.austria_hungary_border_reopened_tracker + log(`C58 no longer in effect`) + //permanently_remove(58) + } + //Elena + if (game.persistent_events.includes(101)) { + game.persistent_events = game.persistent_events.filter(n => n !== 101) + log(`C101 no longer in effect`) + //permanently_remove(101) + } + //GrenzTruppen + if (game.persistent_events.includes(59)) { + game.persistent_events = game.persistent_events.filter(n => n !== 59) + log(`C59 no longer in effect`) + //permanently_remove(59) + } + //Foreign Currency Debt Burden + if (game.persistent_events.includes(49)) { + game.persistent_events = game.persistent_events.filter(n => n !== 49) + delete game.foreign_currency_debt_burden + log(`C49 no longer in effect`) + //permanently_remove(49) + } + //FRG Embassies + if (game.persistent_events.includes(74)) { + game.persistent_events = game.persistent_events.filter(n => n !== 74) + log(`C74 no longer in effect`) + discard_from_table(74) + permanently_remove(74) + } + //Genscher + if (game.persistent_events.includes(63)) { + game.persistent_events = game.persistent_events.filter(n => n !== 63) + log(`C63 no longer in effect`) + discard_from_table(63) + permanently_remove(63) + } + //Stand Fast + if (game.persistent_events.includes(100)) { + game.persistent_events = game.persistent_events.filter(n => n !== 100) + delete game.stand_fast + log(`C100 no longer in effect`) + //permanently_remove(100) + } + + if (game.samizdat_card > 0 ) { + game.democrat_hand.push(game.samizdat_card) + delete game.samizdat_card + } + + log_h1("Turn " + game.turn) + + if (game.turn === 4) { + add_midyear() + } + if (game.turn === 8) { + add_lateyear() + } + if (game.turn > 1) { + if (game.persistent_events.includes(65)) { + game.com_hand_limit = 7 + log('Communist draws 7 cards due to C65') + //permanently_remove(65) + game.persistent_events = game.persistent_events.filter(n => n !== 65) + } + //console.log('deck', game.strategy_deck) + //console.log('game.com_hand_limit', game.com_hand_limit, 'communist hand before draw', game.communist_hand) + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.dem_hand_limit, game.com_hand_limit) + game.com_hand_limit = 8 + //console.log('communist hand after draw', game.communist_hand) + + } + + //Check if TST effects need to be resolved + if (game.dem_tst_position >=5 && game.com_tst_position <= 4) { + log_h2('Tiananmen Square Track award') + if(game.active !== DEM) { next_player() } + for (let card of game.democrat_hand) { + if (scoring_cards.includes(card)) continue + game.valid_cards.push(card) + } + game.state = 'tst_goddess' /* Goddess only name of Democrat bonus, not Communist*/ + return + } + else if (game.com_tst_position >=5 && game.dem_tst_position <= 4) { + log_h2('Tiananmen Square Track award') + if(game.active !== COM) { next_player() } + for (let card of game.communist_hand) { + if (scoring_cards.includes(card)) continue + game.valid_cards.push(card) + } + game.state = 'tst_goddess' + } else { + log_h2("Action Round " + game.round) + log_side() + //console.log('in start new AR call, game.active', game.active) + if (game.persistent_events.includes(5)) { + log_h3('C5') + game.state = 'general_strike' + } + else { + game.state = 'choose_card' + } + } +} + +function next_player() { + clear_undo() + //console.log('next player called') + if (game.active === DEM) + game.active = COM + else + game.active = DEM + + log_side() +} + +function change_player() { + clear_undo() + //console.log('next player called') + if (game.active === DEM) + game.active = COM + else + game.active = DEM +} + +function find_space_index(name_unique) { + return spaces.findIndex(space => space && space.name_unique === name_unique) +} + +function find_country_index(country) { + return countries.indexOf(country) +} + +function draw_deck(deck) { + return deck.filter(card => card && card.period === 1).map(card => card.number) +} + +function draw_cards(deck, democrat_hand, communist_hand, dem_hand_limit, com_hand_limit) { + //console.log('game.valid_cards at start of draw cards: ', game.valid_cards) + let turn = 'communist'; // Start with the communist player + //console.log('game.strategy_deck', game.strategy_deck) + //console.log('deck', deck, 'democrat_hand', democrat_hand, 'communist_hand', communist_hand, 'dem_hand_limit', dem_hand_limit, 'com_hand_limit', com_hand_limit) + while (democrat_hand.length < dem_hand_limit || communist_hand.length < com_hand_limit) { + //console.log('deck.length: ', deck.length) + //console.log('discard.length', game.strategy_discard ) + if (deck.length === 0) { + log_h3('--- Reshuffle ---') + + deck.push(...game.strategy_discard) + game.strategy_discard = [] + } + + else if (turn === 'communist' && communist_hand.length < com_hand_limit) { + communist_hand.push(draw_card(deck)); + //console.log('game.valid_cards after communist draw: ', JSON.stringify(game.valid_cards)); + turn = 'democrat'; + } else if(turn === 'communist' && communist_hand.length === com_hand_limit) { + turn = 'democrat'; + } + else if (turn === 'democrat' && democrat_hand.length < dem_hand_limit) { + democrat_hand.push(draw_card(deck)); + //console.log('democrat_hand: ', democrat_hand) + + //console.log('game.valid_cards after democrat draw: ', JSON.stringify(game.valid_cards)); + turn = 'communist'; + } + else if (turn === 'democrat' && democrat_hand.length === dem_hand_limit) { + turn = 'communist'; + } + } + + clear_undo() +} + +function draw_card(deck) { + //console.log('draw card called with:', deck) + //console.log('game.strategy_deck before', game.strategy_deck) + if (deck.length === 0) { + log_h3('--- Reshuffle ---') + + deck.push(...game.strategy_discard) + game.strategy_discard = [] + } + const randomIndex = Math.floor(Math.random() * deck.length) + //console.log('card chosen:', randomIndex) + //console.log('game.strategy_deck after', game.strategy_deck) + return deck.splice(randomIndex, 1)[0]; +} + +function discard(card) { + //console.log('in discard(card)') + let find_card + if (!game.is_pwr_struggle) { + + if (game.active === COM) { + find_card = game.communist_hand.indexOf(card) + game.communist_hand.splice(find_card, 1) + } else { + find_card = game.democrat_hand.indexOf(card) + game.democrat_hand.splice(find_card, 1) + } + if (!game.strategy_discard.includes(card)) { + game.strategy_discard.push(card) + log(`Discarded C${cards[card].number}`) + } + } else if (game.is_pwr_struggle) { + if (game.active === COM) { + find_card = game.com_pwr_hand.indexOf(card); + game.com_pwr_hand.splice(find_card, 1); + } else { + find_card = game.dem_pwr_hand.indexOf(card); + game.dem_pwr_hand.splice(find_card, 1); + } + + game.power_struggle_discard.push(card) + //log(`Discarded P${power_cards[card].number}`) + } +} +function silent_discard(card) { + //console.log('in discard(card)') + let find_card + if (!game.is_pwr_struggle) { + if (game.active === COM) { + find_card = game.communist_hand.indexOf(card) + game.communist_hand.splice(find_card, 1) + } else { + find_card = game.democrat_hand.indexOf(card) + game.democrat_hand.splice(find_card, 1) + } + if (!game.strategy_discard.includes(card)) { + game.strategy_discard.push(card) + } + } else if (game.is_pwr_struggle) { + if (game.active === COM) { + find_card = game.com_pwr_hand.indexOf(card); + game.com_pwr_hand.splice(find_card, 1); + } else { + find_card = game.dem_pwr_hand.indexOf(card); + game.dem_pwr_hand.splice(find_card, 1); + } + game.power_struggle_discard.push(card) + } +} + +function remove_from_discard(card) { + let card_index = game.strategy_discard.indexOf(card) + if (card_index !== -1) { + game.strategy_discard.splice(card_index, 1) + } +} + +function discard_card(hand) { + //let find_card + let card = Math.floor(Math.random()*hand.length) + let discarded_card = hand.splice(card, 1)[0] + if (game.is_pwr_struggle) { + if (numberless_cards.includes(discarded_card)) { + log_gap(`Discarded: P${discarded_card}`) + } else { + log_gap(`Discarded: P${discarded_card} V${power_cards[discarded_card].value}`) + } + } else { + log(`Discarded C${cards[discarded_card].number}`) + game.strategy_discard.push(discarded_card) + } + return discarded_card +} + +function discard_from_table(card) { + find_card = game.table_cards.indexOf(card) + game.table_cards.splice(find_card, 1) + game.strategy_discard.push(card) +} + + +function add_midyear() { + const mid_year = cards.filter(card => card && card.period === 2).map(card => card.number); + game.strategy_deck.push(...mid_year); + log_h3('Mid-year cards added to draw deck') +} + + +function add_lateyear() { + const late_year = cards.filter(card => card && card.period === 3).map(card => card.number) + game.strategy_deck.push(...late_year) + log_h3('Late-year cards added to draw deck') +} + +function reset_power() { + game.power_struggle_deck = [] + game.power_struggle_discard = [] + game.dem_pwr_hand = [] + game.com_pwr_hand = [] + game.phase = 1 + game.raised_stakes_round = 0 + game.raised_stakes = 0 + game.played_power_card = 0 + game.tactics_fails = '' + game.view_opp_hand = false + + if (game.persistent_events.includes(72)){ + permanently_remove(72) + game.table_cards = game.table_cards.filter(card => card !== 72) + game.persistent_events = game.persistent_events.filter(n => n !== 72) + } + if (game.persistent_events.includes(62)) { + permanently_remove(62) + game.table_cards = game.table_cards.filter(card => card !== 62) + game.persistent_events = game.persistent_events.filter(n => n !== 62) + } + if (game.persistent_events.includes(54) && game.pwr_struggle_in === 'Romania'){ + permanently_remove(54) + //game.table_cards = game.table_cards.filter(card => card !== 54) + + } + if (game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(70)){ + //permanently_remove(70) + //game.table_cards = game.table_cards.filter(card => card !== 70) + game.persistent_events = game.persistent_events.filter(n => n !== 70) + } +} + +function check_control_change(space_id) { + + // Check if the Tyrant is Gone has been fulfilled + + if (game.the_tyrant_is_gone > 0 && check_dem_control(game.the_tyrant_is_gone)) { + log('+2 VP from C97') + game.vp += 2 + if (check_vp()) { + return + } + game.persistent_events = game.persistent_events.filter(n => n !== 97) + delete game.the_tyrant_is_gone + } +} + +function check_systematization() { + // Check for Systematization - may not use this space + if (game.systematization > 0) { + game.valid_spaces = game.valid_spaces.filter(n => n !== game.systematization) + } +} + +function check_common_european_home() { + if (!game.playable_cards.includes(21)) { + game.playable_cards.push(21) + } +} + +function this_card() { + return game.vm_event > 0 ? game.vm_event : game.played_card +} +/* +function get_ops(card) { + let ops = cards[card].ops + if (game.active === COM) { + //Check TST op bonus + if (ops === 1 && game.com_tst_position >=2 && game.dem_tst_position <=1) { + ops++ + } + //Events that influence ops + if (game.persistent_events.includes(25)) { + ops++ + } + if (game.prudence.COM && game.prudence.COM <0) { + ops += game.prudence.COM + } + + } else { + //Check TST op bonus + if (ops === 1 && game.dem_tst_position >=2 && game.com_tst_position <=1) { + ops++ + } + //Events that influence ops + if (game.persistent_events.includes(50)) { + ops++ + } + if (game.prudence.DEM && game.prudence.DEM <0) { + ops += game.prudence.DEM + } + } + //Ops can never be less than one + if (ops <1) { ops = 1 } + return ops +} + */ + +const pluralize = (count, noun, suffix = 's') => + `${count} ${noun}${Math.abs(count) !== 1 ? suffix : ''}` + +function clean_name(str) { + if (str && str.slice(-1) === '*') { + return str.slice(0, -1) + } else { + return str; + } +} + +function country_name(country) { + return country.replace(/_/g, ' ') +} + +// ======== LOG FUNCTIONS ============= + +function log(msg) { + game.log.push(msg) +} + +function log_br() { + if (game.log.length > 0 && game.log[game.log.length - 1] !== "") + game.log.push("") +} + +function logi(msg) { + game.log.push(">" + 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) +} + +function log_gap(msg) { + log_br() + game.log.push(msg) +} + +function log_msg_gap(msg) { + game.log.push(msg) + log_br() +} + + +function log_side() { + log_br() + if (game.active === DEM) + log(".h2d " + game.active) + else + log(".h2c " + game.active) + log_br() +} + +function log_sep() { + log(".hr") +} + +function log_action(msg) { + log_br() + log(msg) +} + +// ============= SUMMARY FUNCTIONS ============= + +function push_summary() { + if (game.summary) + throw "TOO MANY SUMMARIES" + game.summary = [] +} + +function log_summary(msg) { + + if (msg.startsWith('Added') || msg.startsWith('Removed')) { + for (let item of game.summary) { + if (item[1] === msg) { + item[0]++ + return + } + } + } + game.summary.push([1, msg]) +} + +function pop_summary() { + if (game.summary.length > 0) { + for (let [n, msg] of game.summary) { + if (n > 1) { + log(msg.replace("£ SP", `${n} SPs`)); + } else { + log(msg.replace("£ SP", `${n} SP`)); + } + } + } + game.summary = [] +} + +function log_summary_place(p) { + let from = piece_space(p) + if (from !== AVAILABLE) + log_summary("% " + piece_name(p) + " from S" + from) + else + log_summary("% " + piece_name(p)) +} + +function log_summary_move_to_from(p, to) { + log_summary("% " + piece_name(p) + " to S" + to + " from S" + piece_space(p)) +} + +function log_summary_remove(p) { + log_summary("Removed % " + piece_name(p)) +} + +function log_summary_activated(p) { + log_summary("Activated % " + piece_faction_name(p)) +} + +// ============ UNDO FUNCTIONS ================== + +function clear_undo() { + if (game.undo.length > 0) + game.undo = [] +} + +function push_undo() { + let copy = {} + for (let k in game) { + let v = game[k] + if (k === "undo") + continue + else if (k === "log") + v = v.length + else if (typeof v === "object" && v !== null) + v = object_copy(v) + copy[k] = v + } + game.undo.push(copy) +} + +function pop_undo() { + let save_log = game.log + let save_undo = game.undo + game = save_undo.pop() + save_log.length = game.log + game.log = save_log + game.undo = save_undo +} + +// Fast deep copy for objects without cycles +function object_copy(original) { + if (Array.isArray(original)) { + let n = original.length + let copy = new Array(n) + for (let i = 0; i < n; ++i) { + let v = original[i] + if (typeof v === "object" && v !== null) + copy[i] = object_copy(v) + else + copy[i] = v + } + return copy + } else { + let copy = {} + for (let i in original) { + let v = original[i] + if (typeof v === "object" && v !== null) + copy[i] = object_copy(v) + else + copy[i] = v + } + return copy + } +} + + +/* =================== VM FUNCTIONS ========================== */ + +function goto_vm(proc) { + let old_vm = game.vm; + + game.state = "vm"; + game.vm = { + prompt: 0, + fp: proc, + ip: 0, + }; + + if (old_vm) { + game.vm.return_vm = old_vm; + } + + vm_exec(); +} + +function vm_exec() { + vm_inst(0)(); +} + +function vm_inst(a) { + //console.log('game.vm.fp', game.vm.fp, 'game.vm.ip', game.vm.ip) + return CODE[game.vm.fp][game.vm.ip][a] +} + +function vm_next() { + game.vm.ip++; + //console.log('vm_next called, game.vm.ip', game.vm.ip) + vm_exec(); +} + +function vm_operand(a) { + let x = CODE[game.vm.fp][game.vm.ip][a] + if (a > 0 && typeof x === "function") + return x() + return x +} + +function vm_assert_argcount(n) { + const argcount = CODE[game.vm.fp][game.vm.ip].length - 1 + if (argcount !== n) + throw Error(`ASSERT Invalid number of arguments on event ${game.vm.fp}: ${argcount} instead of ${n}`) +} + +function vm_log() { + log(vm_operand(1)); + vm_next(); +} + +function vm_if() { + //console.log('game.temp', game.temp) +// console.log('vm_operand(1)', vm_operand(1)) + if (!vm_operand(1)) { + let balance = 1 + while (balance > 0) { + ++game.vm.ip + switch (vm_operand(0)) { + case vm_if: + ++balance + break + case vm_endif: + --balance + break + case vm_else: + if (balance === 1) + --balance + break + } + if (game.vm.ip < 0 || game.vm.ip > CODE[game.vm.fp].length) + throw "ERROR" + } + } + vm_next() +} + +function vm_else() { + vm_goto(vm_endif, vm_if, 1, 1) +} + +function vm_endif() { + vm_next() +} + +function vm_goto_step(step) { + // console.log('vm_goto_step called, target:', step) + //console.log('game.vm.ip', game.vp.ip) + for (let i = game.vm.ip; i < CODE[game.vm.fp].length; i++) { + //console.log('i', i) + //console.log('step', CODE[game.vm.fp][i][0]) + if (CODE[game.vm.fp][i][0] === step) { + game.vm.ip = i; + vm_exec(); + return; + } + } + + console.log("ERROR: Target operation not found in the current procedure."); +} + + +function vm_goto(op, nop, dir, step) { + //console.log('vm_inst(0)', vm_inst(0), op, nop) +// console.log('vm_inst(0)', vm_inst(1), op, nop) + let balance = 1 + while (balance > 0) { + game.vm.ip += dir + if (vm_inst(0) === op) + --balance + if (vm_inst(0) === nop) + ++balance + if (game.vm.ip < 0 || game.vm.ip > CODE[game.vm.fp].length) + throw "ERROR" + } + game.vm.ip += step + vm_exec() +} + +function event_prompt(str) { + //console.log('event_prompt called with', str) + if (typeof str === "undefined") + str = CODE[game.vm.fp][game.vm.prompt][1] + if (typeof str === "function") + str = str() + //console.log('str:', str) + if (!str) { + str = "" + } + return str +} + +function vm_prompt() { + if (game.vm.prompt) + game.vm._prompt = game.vm.prompt + game.vm.prompt = game.vm.ip + vm_next() +} + +function pop_vm_prompt() { + if (game.vm._prompt) { + game.vm.prompt = game.vm._prompt + delete game.vm._prompt + } else { + game.vm.prompt = 0 + } +} + +function vm_return() { + + //console.log('in vm_return, game.vm_infl_to_do', game.vm_infl_to_do, 'return state', game.return_state) + + //Remove temporary vm variables + delete game.support_check_modifier + delete game.vm_max_infl + delete game.vm_influence_added + delete game.communist_hand_red + + game.vm_event = 0 /*Reset to 0 now that event has been completed. Hopefully this doesn't cause issues! */ + if (game.persistent_events.includes(58)) { + reset_austria_hungary_border_reopened() + } + + //Check if end event state is needed + if (game.is_pwr_struggle || game.state === 'vm_tst_6' || game.return_state === 'tiananmen_square_attempt_done') { + vm_end_event() + } + //Check if auto-resolve opponent event + else if (is_auto_resolve(game.played_card) && ((cards[game.played_card].side === 'C' && game.active === DEM) || (cards[game.played_card].side === 'D' && game.active === COM) )) { + vm_end_event() + } + else { + + game.state = 'vm_end_event' + /*if (!game.vm_infl_to_do) { + /*if ((game.active === DEM && game.round_player !==DEM) || (game.active === COM && game.round_player !== COM)) { + game.state = 'vm_end_event' + } else { + game.state = 'vm_end_event' + //end_round() + //} + } else { + console.log('vm_infl_to_do true') + vm_end_event() + }*/ + } +} + +function vm_end_event() { + //game.view_opp_hand = false +// console.log('in vm_return, game.return:', game.return, 'game.return_state:', game.return_state, 'game.vm_infl_to_do', game.vm_infl_to_do, 'game.vm_event_to_do', game.vm_event_to_do) + /*if (!game.vm_infl_to_do && !game.vm_event_to_do) { + if (game.round_player !== game.active) { + change_player() + log_h2('End of Action Round') + } + end_round() + return + } /*Go direct to end round if card fully resolved */ + if (game.return !== game.active) { + next_player()} + if (game.return_state === 'power_struggle') { + do_valid_cards() + } + if (game.return_state && game.return_state !== '') { + game.state = game.return_state + //console.log( 'game.state', game.state) + } + else if (game.vm_infl_to_do) { + game.state = 'resolve_opponent_event'} /*Can use game.return state for this? */ + //else {game.state = "play_card"} + else{ + end_round()} +} + +/* ================== VM ACTIONS =========================== */ + +function vm_opp_hand_false() { + game.view_opp_hand = false + vm_next() +} + +function vm_valid_spaces() { + let space_1 = vm_operand(1) + let space_2 = vm_operand(2) + let space_3 = vm_operand(3) + let space_4 = vm_operand(4) + let space_5 = vm_operand(5) + let space_6 = vm_operand(6) + game.valid_spaces = [space_1, space_2, space_3, space_4, space_5, space_6] + game.valid_spaces = game.valid_spaces.filter( n => n ) + + // Check for Systematization - may not use this space + check_systematization() + + vm_next() +} + +function vm_valid_spaces_opponent () { + let valid_spaces = [] + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + + if (game.active === DEM) { + let infl = game.comInfl[i] + if (infl > 0) { + valid_spaces.push(space.space_id) + } + } else { + infl = game.demInfl[i] + if (infl > 0) { + valid_spaces.push(space.space_id) + } + } + } + game.valid_spaces = valid_spaces +// console.log('game.valid_spaces', game.valid_spaces) + vm_next() +} + +function vm_valid_spaces_socio () { + let valid_spaces = [] + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + + if (space.socio === vm_operand(1)) { + valid_spaces.push(space.space_id) + } + } + game.valid_spaces = valid_spaces + + // Check for Systematization - may not use this space + if (game.systematization && game.systematization > 0) { + game.valid_spaces = game.valid_spaces.filter(n => n !== game.systematization) + } + vm_next() +} + +function vm_valid_spaces_opponent_socio () { + let valid_spaces = [] + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + + if (game.active === DEM) { + let infl = game.comInfl[i] + if (infl > 0 && space.socio === vm_operand(1)) { + valid_spaces.push(space.space_id) + } + } else { + let infl = game.demInfl[i] + if (infl > 0 && space.socio === vm_operand(1)) { + valid_spaces.push(space.space_id) + } + } + } + game.valid_spaces = valid_spaces + // Check for Systematization - may not use this space + if (game.systematization && game.systematization > 0) { + game.valid_spaces = game.valid_spaces.filter(n => n !== game.systematization) + } + vm_next() +} + +function vm_valid_spaces_country () { + let country + if (vm_operand(1)) {country = vm_operand(1)} + else {country = game.vm_active_country} + for (let space of spaces) { + if (!space) continue + if (space.country === country) { + game.valid_spaces.push(space.space_id); + } + } + // Check for Systematization - may not use this space + if (game.systematization && game.systematization > 0) { + game.valid_spaces = game.valid_spaces.filter(n => n !== game.systematization) + } + vm_next() +} + +function vm_valid_spaces_sc () { + valid_spaces_sc() + vm_next() +} + +function vm_valid_spaces_country_opp () { + let country = '' + + if (vm_operand(1)) { + country = vm_operand(1) } + else { + country = game.vm_active_country + } + for (let space of spaces) { + if (!space) continue + if (game.active === DEM) { + if (space.country === country && game.comInfl[space.space_id] >0) { + game.valid_spaces.push(space.space_id); + } + } else { + if (space.country === country && game.demInfl[space.space_id]>0) { + game.valid_spaces.push(space.space_id); + } + } + } + vm_next() +} + +function vm_valid_spaces_country_sc () { + let valid_spaces = [] + let country = '' + //console.log('in vm_valid_spaces_country_sc') + if (vm_operand(1)) { + country = vm_operand(1) } + else { + country = game.vm_active_country + } + for (let space of spaces) { + if (!space) continue + if (game.active === DEM) { + if (space.country === country && game.comInfl[space.space_id] >0) { + valid_spaces.push(space.space_id); + } + } else { + if (space.country === country && game.demInfl[space.space_id] >0) { + //Check Solidarity Legalised + if (game.persistent_events.includes(2) && space.space_id === 14) {continue} + + //Check Civic Forum + if (game.persistent_events.includes(90) && space.space_id === 30) {continue} + + //Check We are the People + if (game.persistent_events.includes(48) && space.space_id === 9) {continue} + valid_spaces.push(space.space_id); + + //Check Foreign Currency Debt Burden + if (game.persistent_events.includes(49) && space.country === game.foreign_currency_debt_burden) {continue} + } + } + } + game.valid_spaces = valid_spaces + + //Check for Foreign Currency Debt Burden + /*if (game.persistent_events.includes(49) && game.active === COM) { + game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country !== game.foreign_currency_debt_burden) + }*/ + vm_next() +} + +function vm_valid_spaces_country_socio_2() { + for (let space of spaces) { + if (!space) continue + if (space.space_id === game.systematization) continue + if ((space.country === vm_operand(1) && space.socio === vm_operand(2)) || (space.country === vm_operand(1) && space.socio === vm_operand(3))) { + game.valid_spaces.push(space.space_id); + } + } + vm_next() +} + +function vm_valid_spaces_region_socio() { + let valid_spaces = [] + for (let space of spaces) { + if (!space) continue + if (space.space_id === game.systematization) continue + if (space.region === vm_operand(1) && space.socio === vm_operand(2)) { + valid_spaces.push(space.space_id); + } + } + game.valid_spaces = valid_spaces + vm_next() +} + +function vm_valid_spaces_region_opp() { + let valid_spaces = [] + for (let space of spaces) { + if (!space) continue + let s = space.space_id + if ((game.active === DEM && space.region === vm_operand(1) && game.comInfl[s] > 0 ) || (game.active === COM && space.region === vm_operand(1) && game.demInfl[s] > 0 )) { + valid_spaces.push(space.space_id); + } + } + game.valid_spaces = valid_spaces + vm_next() +} + +function vm_valid_spaces_solidarity_legalised() { + let valid_spaces = [] + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + let uncontrolled = (!check_control(i) && !check_opp_control(i)) + if ((space.country === 'Poland' && uncontrolled && space.socio === 3) || (space.country === 'Poland' && uncontrolled && space.socio === 4)) { + valid_spaces.push(space.space_id); + } + } + game.valid_spaces = valid_spaces + vm_next() +} + +function vm_active_country () { + game.valid_spaces = game.valid_spaces.filter(space_id => { + let space = spaces.find(s => s && s.space_id === space_id); + return space && space.country === game.vm_active_country; + }); + vm_next() +} + +function vm_take_control_prep() { + game.vm_available_ops = vm_operand(1) + game.state = 'vm_take_control' +} + +function vm_take_control(space) { + if (game.active === DEM) { + let current_infl = game.demInfl[space] + let opponent_infl = game.comInfl[space] + let stability = spaces[space].stability + + if ((current_infl - opponent_infl) < stability) { + game.demInfl[space] += stability - current_infl + opponent_infl + //game.pieces[space].demCtrl = 1 + //game.pieces[space].comCtrl = 0 + } + } else if (game.active === COM) { + let current_infl = game.comInfl[space] + let opponent_infl = game.demInfl[space] + let stability = spaces[space].stability + + if ((current_infl - opponent_infl) < stability) { + game.comInfl[space] += stability - current_infl + opponent_infl + //game.pieces[space].comCtrl = 1 + //game.pieces[space].demCtrl = 0 + } + } + game.valid_spaces = game.valid_spaces.filter(id => id !== space) + log(`Took control of %${space}`) +} + + +function vm_do_add_infl(space) { + push_undo() + //console.log('in vm_do_add_infl, space', space, 'ops', game.vm_available_ops, 'ahbr tracker', game.austria_hungary_border_reopened_tracker, 'ahbr in events', game.persistent_events.includes(58)) + + //log(`Added 1 influence in %${space}.`) + + log_summary(`Added £ SP in %${space}.`) + + //If AHBR - check AHBR condition + if (game.persistent_events.includes(58)) { + if (spaces[space].country !== 'East_Germany'){ + game.austria_hungary_border_reopened_tracker = false + } + } + + // Check Genscher + if (game.persistent_events.includes(63) && game.active === DEM && spaces[space].country === 'East_Germany') { + game.vm_available_ops-- + log_summary(`(-1 op due to C63)`) + } else if (check_opp_control(space)) { + game.vm_available_ops -= 2 + //Check if Austria Hungary Border Reopened was used to place last SP in a controlled space in East Germany. If so, game.vm_available_op will be negative + if (game.vm_available_ops < 0) { + log_summary(`(Used +1 op from C58)`) + } + } else { + game.vm_available_ops-- + } + + // Update influence values + if (game.active === COM) { + game.comInfl[space]++ + } else { + game.demInfl[space]++ + } + + // Check whether spaces are controlled + check_control_change(space) + + // Check Austria Hungary Border Reopened is true and condition has been met + if (game.vm_available_ops === 0 && game.active === DEM && game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker) { + //console.log('in award extra op') + game.vm_available_ops ++ + log('+1 Op from C58') + game.austria_hungary_border_reopened_tracker = false + game.valid_spaces = game.valid_spaces.filter(n => spaces[n].country === 'East_Germany') + } + + // If only 1 IP remaining, may not place in opponent controlled spaces + + // Check for Genscher & Austria Hungary Border Reopened + + if (game.vm_available_ops === 1) { + + if (game.active === DEM) { + //Check Genscher and AHBR + if (game.persistent_events.includes(63) || (game.persistent_events.includes(58) && game.austria_hungary_border_reopened_tracker)) { + game.valid_spaces = game.valid_spaces.filter(n => !(check_com_control(n) && spaces[n].country !== 'East_Germany')) + } else { + game.valid_spaces = game.valid_spaces.filter(n => !check_com_control(n)) + } + } else { + game.valid_spaces = game.valid_spaces.filter(n => !check_dem_control(n)) + } + } + + //Clear valid spaces if no IP remaining. + if (game.vm_available_ops <= 0 ) { + game.valid_spaces = [] + } +} + +function vm_do_add_infl_free(space) { + push_undo() + //log(`Added 1 influence in %${space}.`) + + log_summary(`Added £ SP in %${space}.`) + + // Update influence values + if (game.active === COM) { + game.comInfl[space]++ + } else { + game.demInfl[space]++ + } + game.vm_available_ops-- + // Check whether spaces are controlled + check_control_change(space) + + + //console.log('game pieces:', game.pieces[space]) +} + +function vm_add_infl() { + if (vm_operand(1)) {game.vm_available_ops = vm_operand(1)} + game.state = 'vm_add_infl' +} + +function vm_add_infl_free() { + if (vm_operand(1)) {game.vm_available_ops = vm_operand(1)} + game.state = 'vm_add_infl_free' +} + +function vm_add_x_infl() { + game.vm_available_ops = vm_operand(1) + game.state = 'vm_add_x_infl' +} + +function vm_do_add_x_infl(space) { + push_undo() + log(`Added ${game.vm_available_ops} SPs in %${space}.`) + + + if (game.active === COM) { + game.comInfl[space] += game.vm_available_ops + } else { + game.demInfl[space] += game.vm_available_ops + } + check_control_change(space) + game.vm_available_ops = 0 + game.valid_spaces = [] +} + +function vm_add_limited_infl() { + game.vm_available_ops = vm_operand(1) + game.vm_max_infl = vm_operand(2) + game.state = 'vm_add_limited_infl' +} + +function vm_do_add_limited_infl(space, max_infl) { + push_undo() + //log(`Added 1 influence in %${space}.`) + + log_summary(`Added £ SP in %${space}.`) + game.vm_available_ops -- + + if (!game.vm_influence_added) { + game.vm_influence_added = {}; + } + + if (!game.vm_influence_added[space]) { + game.vm_influence_added[space] = 0; + } + + if (game.active === COM) { + game.comInfl[space] ++ + } else { + game.demInfl[space] ++ + } + + game.vm_influence_added[space] ++ + + //console.log('valid_spaces before update', game.valid_spaces) + //console.log('influence added:', game.vm_influence_added[space], 'max infl', max_infl) + if (game.vm_influence_added[space] === max_infl) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + check_control_change(space) + if (game.vm_available_ops === 0) {game.valid_spaces = [] } +} + +function vm_remove_infl() { + game.vm_available_ops = vm_operand(1) + game.state = 'vm_remove_infl' +} + +function vm_remove_opp_infl() { + game.vm_available_ops = vm_operand(1) + game.remove_opponent_infl = true + if (game.is_pwr_struggle) { + game.state = 'vm_scare_tactics' + } else { + game.state = 'vm_remove_infl' + } +} + +function vm_remove_x_opp_infl() { + game.vm_available_ops = vm_operand(1) + game.remove_opponent_infl = true + game.state = 'vm_remove_x_infl' +} + +function vm_do_remove_infl(space) { + push_undo() + //log(`Removed 1 influence from %${space}.`) + log_summary(`Removed £ SP from %${space}.`) + + if (!game.vm_influence_added) { + game.vm_influence_added = {}; + } + + if (!game.vm_influence_added[space]) { + game.vm_influence_added[space] = 0; + } + if (game.remove_opponent_infl === true) { + if (game.active === COM) { + game.demInfl[space]-- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + } else { + game.comInfl[space]-- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + } + + + } else { + if (game.active === COM) { + game.comInfl[space]-- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + } else { + game.demInfl[space]-- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + } + } + check_control_change(space) + game.vm_influence_added[space]++ + game.vm_available_ops-- + if (game.vm_available_ops===0) {game.valid_spaces = []} +} + +function vm_do_remove_x_infl(space) { + push_undo() + + if (game.remove_opponent_infl) { + if (game.active === COM) { + if (game.demInfl[space] >= game.vm_available_ops) { + game.demInfl[space] -= game.vm_available_ops + } else { + game.vm_available_ops = game.demInfl[space] + game.demInfl[space] -= game.vm_available_ops + } + } else { + if (game.comInfl[space] >= game.vm_available_ops) { + game.comInfl[space] -= game.vm_available_ops + } else { + game.vm_available_ops = game.comInfl[space] + game.comInfl[space] -= game.vm_available_ops + } + } + } else { + if (game.active === COM) { + if (game.comInfl[space] >= game.vm_available_ops) { + game.comInfl[space] -= game.vm_available_ops + } else { + game.vm_available_ops = game.comInfl[space] + game.comInfl[space] -= game.vm_available_ops + } + } else { + if (game.demInfl[space] >= game.vm_available_ops) { + game.demInfl[space] -= game.vm_available_ops + } else { + game.vm_available_ops = game.demInfl[space] + game.demInfl[space] -= game.vm_available_ops + } + } + } + + log(`Removed ${game.vm_available_ops} SPs from %${space}`) + check_control_change(space) + + game.vm_available_ops = 0 + game.valid_spaces = [] +} + +function vm_remove_limited_opp_infl() { + game.vm_available_ops = vm_operand(1) + game.vm_max_infl = vm_operand(2) + game.remove_opponent_infl = true + game.state = 'vm_remove_limited_infl' +} + +function vm_do_remove_limited_infl(space, max_infl) { + push_undo() + log(`Removed SP from %${space}.`) + game.vm_available_ops -- + + + if (!game.vm_influence_added) { + game.vm_influence_added = {}; + } + + if (!game.vm_influence_added[space]) { + game.vm_influence_added[space] = 0; + } + + if (game.active === COM) { + game.demInfl[space] -- + if (game.demInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space) + } + } else { + game.comInfl[space] -- + if (game.comInfl[space] === 0) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space) + } + } + + game.vm_influence_added[space] ++ + + if (game.vm_influence_added[space] === max_infl) { + game.valid_spaces = game.valid_spaces.filter(id => id !== space); + } + + check_control_change(space) + if (game.vm_available_ops === 0) {game.valid_spaces = []} +} + +function vm_remove_all_infl() { + game.vm_available_ops = vm_operand(1) + game.state = 'vm_remove_all_infl' +} + +function vm_do_remove_all_infl(space) { + push_undo() + log(`Removed all SP from %${space}.`) + + if (game.remove_opponent_infl === true) { + if (game.active === COM) { + game.demInfl[space] = 0 + } else { + game.comInfl[space] = 0 + } + check_control_change(space) + + } else { + if (game.active === COM) { + game.comInfl[space] = 0 + } else { + game.demInfl[space] = 0 + } + check_control_change(space) + } + game.vm_available_ops -- + game.valid_spaces = game.valid_spaces.filter(id => id !== space) +} + +function vm_replace_all_infl(space_id) { + if (game.active === DEM) { + game.demInfl[space_id] += game.comInfl[space_id] + game.comInfl[space_id] = 0 + } else { + game.comInfl[space_id] += game.demInfl[space_id] + game.demInfl[space_id] = 0 + } + check_control_change(space_id) +} + +function vm_1_support_check() { + game.vm_available_ops = 1 + game.state = 'vm_1_support_check_prep' +} + +function vm_support_check() { + game.vm_available_ops = vm_operand(1) + game.state = 'vm_support_check_prep' +} + +function vm_support_check_modified() { + game.vm_available_ops = vm_operand(1) + game.support_check_modifier = vm_operand(2) + game.state = 'vm_support_check_prep' +} + +function vm_switch_infl(id){ + push_undo() + + game.demInfl[id] -= game.vm_available_ops + game.comInfl[id] += game.vm_available_ops + log(`Replaced ${pluralize(game.vm_available_ops,'SP')} in %${id}`) + game.vm_available_ops = 0 + check_control_change(id) +} + +/* ===================== EVENT SPECIFIC FUNCTIONS ========== */ + +function vm_40th_anniversary_celebration() { + if (game.vp < 0 ) {game.vm_available_ops = 4} + else {game.vm_available_ops = 2} + vm_next() +} + +function vm_40th_anniversary_celebration_vp() { + game.vp -- + log('-1VP') + if (check_vp()) { + return + } + vm_next() +} + +function vm_adamec() { + game.state = 'vm_adamec' +} + +function vm_army_backs_revolution() { + game.persistent_events = game.persistent_events.filter(n => n !== 70) + game.playable_cards = game.playable_cards.filter(n => n !== 70) + /*if (game.table_cards.includes(70)) { + permanently_remove(70) + }*/ + vm_next() +} + +function vm_austria_hungary_border_reopened() { + game.persistent_events.push(58) + permanently_remove(58) + game.austria_hungary_border_reopened_tracker = false + //game.table_cards.push(58) + //remove_from_discard(58) + vm_next() +} + +function vm_betrayal() { + if (game.demInfl[58] > 0 ) { game.valid_spaces.push(58) } + if (game.demInfl[65] >0 ) { game.valid_spaces.push(65) } + game.vm_available_ops = Math.max(game.demInfl[58], game.demInfl[65]) + game.state = 'vm_switch_infl' +} + +function vm_breakaway_baltic_republics() { + log('+5 VP') + game.vp += 5 + game.stability++ + if (check_vp()) { + return + } + game.playable_cards.push(109) + game.playable_cards = game.playable_cards.filter(n => n !== 14) + if (!check_dem_control(56) && game.systematization !== 56) {game.valid_spaces.push(56)} + if (!check_dem_control(70)) {game.valid_spaces.push(70)} + vm_next() +} + +function vm_brought_in_for_questioning() { + if (game.active === COM) { + game.active = DEM + } + //game.return = game.active + game.phase = 0 + game.state = 'vm_brought_in_for_questioning' +} + +function vm_bulgarian_turks_expelled(){ + game.remove_opponent_infl = true + game.vp -= 2 + log('-2VP') + if (check_vp()) { + return + } + if (game.demInfl[70] > 0) {game.valid_spaces = [70]} + vm_next() +} + +function vm_ceausescu() { + let adj_cluj = false + if (game.demInfl[50] > 0 ) {adj_cluj = true} + if (game.demInfl[54] > 0 ) {adj_cluj = true} + if (game.demInfl[58] > 0 ) {adj_cluj = true} + if (game.demInfl[61] > 0 ) {adj_cluj = true} + + if (adj_cluj && game.comInfl[61]>0) { + game.valid_spaces = [61] + game.vm_available_ops = 1 + //next_player() + game.remove_opponent_infl = false + game.state = 'vm_remove_infl' + } + else {vm_next()} +} + +function vm_central_committee_reshuffle() { + game.state = 'vm_central_committee_reshuffle' +} + +function vm_civic_forum() { + log('+1 VP') + game.vp++ + if (check_vp()) { + return + } + game.persistent_events.push(90) + if (check_dem_control(31)) { + vm_next() + } else { + permanently_remove(90) + vm_return() + } +} + +function vm_common_european_home() { + let valid_cards = []; + for (let c of cards) { + //if (c === null) {continue} + if (game.active === DEM) { + if (c && c.side === 'C') { + valid_cards.push(c.number) + } + } else { + if (c && c.side === 'D') { + valid_cards.push(c.number) + } + } + } + game.valid_cards = valid_cards + game.state = 'vm_common_european_home_choose' +} + +function vm_dash_for_the_west() { + game.valid_cards = [] + for (let c of game.strategy_discard) { + if (cards[c].side === 'D' && cards[c].remove === 1 && (cards[c].playable || game.playable_cards.includes(c))) { + game.valid_cards.push(c) + } + } + game.state = 'vm_dash_for_the_west' +} + +function vm_deutsche_marks() { + let max_value = 1; + for (let c of game.democrat_hand) { + if (cards[c].ops > max_value) { + max_value = cards[c].ops + } + } + let valid_cards = []; + for (let c of game.democrat_hand) { + if (cards[c].ops === max_value) { + valid_cards.push(c); + } + } + game.valid_cards = valid_cards + game.state = 'vm_deutsche_marks_prep' +} + +function vm_domino_theory() { + game.discard = true + for (let card of game.strategy_discard) { + if (scoring_cards.includes(card)) {game.valid_cards.push(card) } + } + game.phase = 0 + game.state = 'vm_play_event_from_discard' +} + +function vm_eco_glasnost() { + game.persistent_events.push(39) + vm_next() +} + +function vm_elena(){ + game.persistent_events.push(101) + vm_next() +} + +function vm_eliminate(space_id) { + log(`Eliminated %${space_id}`) + const adjacent_spaces = spaces[space_id].adjacent.filter(Number.isInteger); + + //console.log('adjacency before: Iasi', game.pieces[53].adjacent, 'Ploesti:', game.pieces[59].adjacent, 'Bucharesti:', game.pieces[61].adjacent) + + // Eliminate the democrat influence and move the communist influence to Bucuresti + if (space_id === 61) { + game.demInfl[space_id] = 0 + game.comInfl[space_id] = 0 + } else { + game.demInfl[space_id] = 0 + game.comInfl[61] += game.comInfl[space_id] + if (game.comInfl[space_id] > 0 ) { + log(`${pluralize(game.comInfl[space_id],'Communist SP')} relocated to %61`) + } + game.comInfl[space_id] = 0 + } + //Update control in the eliminated space and in Bucuresti + check_control_change(space_id) + check_control_change(61) + +} + +function get_adjusted_adjacency(space_id) { + let adjacent_spaces = spaces[space_id].adjacent; + if (adjacent_spaces.includes(game.systematization)) { + //console.log('in get adjusted adjacency, systemization',game.systematization) + //console.log('adjacent_spaces', adjacent_spaces) + } + if (game.systematization !== 0) { + //console.log('in systematization check') + let eliminated_space_id = game.systematization; + + return adjacent_spaces.map(adj_space_id => { + if (adj_space_id === eliminated_space_id) { + // Replace the eliminated space with its adjacencies + //console.log('in map check, return', spaces[eliminated_space_id].adjacent) + return spaces[eliminated_space_id].adjacent; + } + //console.log('2nd check, return', adj_space_id) + return adj_space_id; + }).flat(); // Flatten in case the eliminated space has multiple adjacencies + } + //console.log('final adjacent spaces', adjacent_spaces) + return adjacent_spaces; +} + +function vm_exit_visas() { + game.state = 'vm_exit_visas' +} + +function vm_foreign_currency_debt_burden() { + log('+1VP') + game.vp++ + if (check_vp()) { + return + } + //game.table_cards.push(49) + //remove_from_discard(49) + game.persistent_events.push(49) + game.state = 'vm_foreign_currency_debt_burden' +} + +function vm_foreign_television() { + for (let i = 1 ; i < spaces.length; i++) { + if (i === 12) {continue} /*Does not apply to Dresden*/ + if (game.comInfl[i] > 0 ) { + game.valid_spaces.push(i) + } + } + vm_next() +} +function vm_frg_embassies() { + game.persistent_events.push(74) + game.table_cards.push(74) + remove_from_discard(74) + log('C74 in effect') + vm_next() +} + +function vm_general_strike() { + game.persistent_events.push(5) + game.table_cards.push(5) + remove_from_discard(5) + log('C5 in effect') + vm_next() +} + +function vm_genscher() { + game.persistent_events.push(63) + game.table_cards.push(63) + remove_from_discard(63) + log(`C63 in effect`) + vm_next() +} + +function vm_goodbye_lenin() { + game.view_opp_hand = true + game.communist_hand_red = [] + // Select Red cards to show + for (let card of game.communist_hand) { + if (cards[card].red) { + game.communist_hand_red.push(card) + } + } + //Check if these cards are playabl + for (let card of game.communist_hand_red) { + if (cards[card].playable || game.playable_cards.includes(card)) { + game.valid_cards.push(card) + } + } + game.state = 'vm_goodbye_lenin' +} + +function vm_government_resigns() { + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + if (space.socio === 1 && game.comInfl[i] > 0 && !check_control(i)) { + game.valid_spaces.push(i) + } + } + game.remove_opponent_infl = true + vm_next() +} + +function vm_grenztruppen() { + game.persistent_events.push(59) + permanently_remove(59) + //game.table_cards.push(59) + //remove_from_discard(59) + vm_next() +} + +function vm_heal_our_bleeding_wounds() { + let change_vp = 0 + if (game.turn <= 3) {change_vp = -3 } + else if (game.turn <= 7) {change_vp = -1} + else change_vp = 3 + if (change_vp >0) { + log(`+${change_vp} VP`) + } else { + log(`-${change_vp} VP`) + } + game.vp += change_vp + if (check_vp()) { + return + } + vm_next() +} + +function vm_helsinki_final_act() { + game.persistent_events.push(26) + vm_next() +} + +function vm_honecker() { + game.persistent_events.push(15) + game.valid_cards = [] + for (let c of game.strategy_discard) { + if (scoring_cards.includes(c)) { + continue} + else { + game.valid_cards.push(c) + } + } + game.discard = true + game.state = 'vm_honecker' +} + +function vm_inflationary_currency() { + game.state = 'vm_inflationary_currency' +} + +function vm_inflationary_currency_discard() { + // This function starts with the player who is playing Inflationary Currency for the Event + // Switch player and check the hand of their opponent to see if the have cards with ops > 3 to discard + next_player() + if (game.active === COM) { + for (let card of game.communist_hand){ + if (get_card_ops(card) >= 3) { + game.valid_cards.push(card) + } + } + } else { + for (let card of game.democrat_hand){ + if (get_card_ops(card) >= 3) { + game.valid_cards.push(card) + } + } + } + game.state = 'vm_inflationary_currency_discard' +} + +function vm_kiss_of_death() { + game.state = 'vm_kiss_of_death' +} + +function vm_klaus_and_komarek() { + if (game.comInfl[29] > 0 ) {game.valid_spaces = [29]} + vm_next() +} + +function vm_kohl_proposes_reunification() { + log('+2 VP') + game.vp += 2 + if (check_vp()) { + return + } + if (game.persistent_events.includes(86)) { + game.vm_event = 87 + game.state = 'vm_common_european_home_play' + } else { + permanently_remove(87) + vm_return() + } + +} + +function vm_kremlin_coup() { + log('-3 VP') + game.vp -= 3 + game.stability ++ + if (check_vp()) { + return + } + game.support_check_modifier = 1 + //countries = ['Poland', 'Hungary', 'East_Germany', 'Bulgaria', 'Czechoslovakia', 'Romania'] + //revolutions: {'East_Germany': false, 'Poland': false, 'Czechoslovakia': false, 'Hungary': false, 'Romania': false, 'Bulgaria': false} + game.temp = [] + countries.forEach(country => { + if (!game.revolutions[find_country_index(country)]) { + game.temp.push(country) + } + }) + game.state = 'vm_kremlin_coup_choose_country' +} + +function vm_laszlo_tokes() { + game.persistent_events.push(73) + game.playable_cards.push(107) + game.state = 'vm_laszlo_tokes' +} + +function vm_legacy_of_martial_law() { + game.vm_available_ops = 1 + game.state = 'vm_switch_infl' +} + +function vm_legacy_of_1968() { + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + if ((!check_com_control(i) && space.country === 'Czechoslovakia')) { + game.valid_spaces.push(space.space_id); + } + } + vm_next() +} + +function vm_li_peng() { + game.persistent_events.push(53) + //game.table_cards.push(53) + remove_from_discard(53) + vm_next() +} + +function vm_ligachev() { + game.persistent_events.push(99) + vm_next() +} + +function vm_malta_summit() { + game.state = 'vm_malta_summit' +} + +function vm_massacre_in_timisoara() { + game.persistent_events = game.persistent_events.filter(n => n !== 73) + vm_next() +} + +function vm_modrow() { + game.playable_cards.push(15) + game.state = 'vm_modrow' +} + +function vm_nagy_reburied(){ + if (game.comInfl[43] > 0) { + game.valid_spaces.push(43) + } + vm_next() +} + +function vm_national_salvation_front() { + game.persistent_events.push(102) + game.table_cards.push(102) + remove_from_discard(102) + vm_next() +} + +function vm_nepotism() { + game.state = 'vm_nepotism' +} + +function vm_new_years_eve_party() { + game.state = 'vm_new_years_eve_party' +} + +function vm_nomenklatura() { + game.state = 'vm_nomenklatura' +} + +function vm_normalisation() { + if (game.demInfl[27] >0) {game.valid_spaces.push(27)} + if (game.demInfl[29] > 0) {game.valid_spaces.push(29)} + game.remove_opponent_infl = true + vm_next() +} + +function vm_peasant_parties_revolt() { + game.persistent_events.push(72) + log_msg_gap('C72 in effect') + game.table_cards.push(72) + remove_from_discard(72) + vm_next() +} + +function vm_perestroika() { + game.persistent_events.push(25) + log_msg_gap('C25 in effect') + vm_next() +} + +function vm_poszgay() { + let valid_spaces = [] + for (let space of spaces) { + if (space && space.country === 'Hungary' && !check_dem_control(space.space_id)) { + valid_spaces.push(space.space_id); + } + } + game.valid_spaces = valid_spaces + vm_next() +} + +function vm_power_struggle() { + //console.log('in vm_power_struggle. game.vm_event', game.vm_event, 'game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) + game.is_pwr_struggle = true + + /* TO DELETE? + //Check if Power Struggle is because of an event + */ + + if (game.vm_event > 0) { + game.pwr_struggle_in = countries[scoring_cards.indexOf(game.vm_event)] + log_h2(`C${game.vm_event}`) + } +/* + //Otherwise set Power Struggle country normally + else { + console.log('vm_power_struggle, country set normally') + game.pwr_struggle_in = countries[scoring_cards.indexOf(game.played_card)] + log_h2(`C${game.played_card}`) + }*/ + + + //Check for Securitate + if (game.pwr_struggle_in === 'Romania' && game.persistent_events.includes(70)) { + log('C70: Democrat reveals Power Struggle cards') + game.view_opp_hand = true + } + log_h2('Deal Cards') + game.state = 'draw_power_cards' +} + +function vm_presidential_visit() { + game.persistent_events.push(65) + //game.table_cards.push(65) + //remove_from_discard(65) + log_msg_gap('C65 in effect') + vm_next() +} + +function vm_prudence() { + if (!game.prudence) { + game.prudence = {DEM: 0, COM: 0} + } + if (game.active === DEM) { + game.prudence.COM -- + log(`${game.prudence.COM} to Communist ops this turn`) + } else { + game.prudence.DEM -- + log(`${game.prudence.DEM} to Democrat ops this turn`)} + vm_next() +} + +function vm_public_against_violence() { + game.valid_spaces = [] + if (game.comInfl[34] > 0 ) {game.valid_spaces.push(34)} + vm_next() +} + +function vm_reformer_rehabilitated () { + permanently_remove(67) + game.discard = true + for (let card of game.strategy_discard) { + if (!event_is_playable(card)) continue + if (card === game.played_card) continue + if (game.table_cards.includes(card)) continue + if (scoring_cards.includes(card)) continue + + game.valid_cards.push(card) + } + game.state = 'vm_play_event_from_discard' +} + +function vm_roundtable_talks() { + game.persistent_events.push(17) + game.table_cards.push(17) + remove_from_discard(17) + log_msg_gap('C17 in effect') + vm_next() +} + +function vm_sajudis_check() { + if (!check_dem_control(56)) { + game.valid_spaces.push(56) + } + if (!check_dem_control(70)) { + game.valid_spaces.push(70) + } + vm_next() +} + +function vm_sajudis() { + game.playable_cards.push(81) + game.stability++ + log('+1 VP') + game.vp++ + if (check_vp()) { + return + } + vm_next() +} + +function vm_samizdat() { + game.state = 'vm_samizdat' +} + +function vm_securitate() { + game.persistent_events.push(70) + permanently_remove(70) + //game.table_cards.push(70) + vm_next() +} + +function vm_shock_therapy() { + game.state = 'vm_shock_therapy' +} + +function vm_social_democratic_platform_adopted() { + game.state = 'vm_social_democratic_platform_adopted' +} + +function vm_solidarity_legalised() { + log_msg_gap(`C2 in effect`) + game.playable_cards.push(3) + game.persistent_events.push(2) + vm_next() +} + +function vm_st_nicholas_church () { + game.persistent_events.push(24) + game.playable_cards.push(61) + vm_next() +} + +function vm_stasi() { + log_msg_gap('C13 in effect') + game.persistent_events.push(13) + vm_next() +} + +function vm_stand_fast() { + game.persistent_events.push(100) + if (game.active === DEM) { + game.stand_fast = DEM + } else {game.stand_fast = COM} + //game.table_cards.push(100) + vm_next() +} + +function vm_systematization() { + game.state = 'vm_systematization' +} + +function vm_tank_column() { + if (game.active === DEM) { + game.dem_tst_position++ + game.dem_tst_attempted = 0 + } else { + game.com_tst_position++ + game.com_tst_attempted = 0 + } + vm_next() +} + +function vm_tear_gas () { + game.persistent_events.push(30) + game.table_cards.push(30) + remove_from_discard(30) + log_msg_gap('C30 in effect') + vm_next() +} + +function vm_the_baltic_way() { + game.playable_cards.push(84) + game.stability++ + if (!check_dem_control(56) && game.systematization !== 56) {game.valid_spaces.push(56)} + if (!check_dem_control(70) && game.systematization !== 70) {game.valid_spaces.push(70)} + log('+3 VP') + game.vp += 3 + if (check_vp()) { + return + } + vm_next() +} + +function vm_the_chinese_solution() { + game.state = 'vm_the_chinese_solution' +} + +function vm_the_crowd_turns_against_ceausescu() { + game.table_cards.push(54) + remove_from_discard(54) + game.playable_cards.push(97) + vm_next() +} + +function vm_the_monday_demonstrations() { + if (!check_dem_control(6)) {game.valid_spaces.push(6)} + if (!check_dem_control(9)) {game.valid_spaces.push(9)} + vm_next() +} + +function vm_the_sinatra_doctrine() { + game.persistent_events.push(50) + log_msg_gap('C50 in effect') + vm_next() +} + +function vm_the_third_way() { + log('-2VP') + vm_next() +} + +function vm_the_tyrant_is_gone() { + game.valid_spaces = [] + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + if (game.demInfl[i] === 0 && space.country === 'Romania') { + if (space.space_id === game.systematization) {continue} + game.valid_spaces.push(space.space_id) + } + } + game.state = 'vm_the_tyrant_is_gone' +} + + +function vm_the_tyrant_is_gone_prep() { + game.table_cards.push(97) + remove_from_discard(97) + vm_next() +} + +function vm_tyrant_block() { + logi(`Has no effect after C97`) + vm_next() + //game.state = 'vm_tyrant_block' +} + +function vm_the_wall () { + game.persistent_events.push(9) + //game.strategy_removed.push(9) + //game.table_cards.push(9) + log_msg_gap('C9 in effect') + vm_next() +} + +function vm_the_wall_must_go() { + game.the_wall_must_go = {} + game.the_wall_must_go['dem_wins'] = 0 + game.the_wall_must_go['com_wins'] = 0 + game.the_wall_must_go['dem_roll'] = 0 + game.the_wall_must_go['com_roll'] = 0 + game.state = 'vm_the_wall_must_go' +} + +function vm_warsaw_pact_summit() { + game.warsaw_pact_summit = true /*What does this do? */ + game.state = 'vm_warsaw_pact_summit' +} + +function vm_we_are_the_people() { + if (game.demInfl[6] > 0) {game.valid_spaces = [6]} + game.persistent_events.push(48) + if (!game.vm_influence_added) { + game.vm_influence_added = {}; + } + game.vm_influence_added[6] = 0 + game.vm_available_ops = 4 + game.state = 'vm_we_are_the_people_remove' +} + +function vm_workers_revolt() { + if (game.active === DEM) { + for (let space of spaces) { + if (!space) continue + let country = space.country + if (!game.revolutions[find_country_index(country)] && game.comInfl[space.space_id] > 0 && space.socio === 4) { + game.valid_spaces.push(space.space_id); + } + } + } else { + for (let space of spaces) { + if (!space) continue + let country = space.country + if (game.revolutions[find_country_index(country)] && game.demInfl[space.space_id] > 0 && space.socio === 4) { + game.valid_spaces.push(space.space_id); + } + } + } + game.state = 'vm_workers_revolt' +} + +function vm_yakovlev_counsels_gorbachev() { + game.persistent_events.push(62) + log_msg_gap('C62 in effect') + game.table_cards.push(62) + remove_from_discard(62) + vm_next() +} + +function vm_permanently_remove () { + // Check if the event is being played as the result of another card, e.g. Dash for the West, is a card which should be removed, and which hasn't already been removed! + if (game.vm_event !== 0 && cards[game.vm_event].remove === 1 && !game.strategy_removed.includes(game.vm_event)) { + permanently_remove(game.vm_event) + } + if (cards[game.played_card].remove ===1 && !game.strategy_removed.includes(game.played_card)) { + permanently_remove(game.played_card) + } /*This means the card that called the event being played is also removed if relevant. Think this makes sense */ + vm_next() +} + +function discarded_card() { + return game.temp > 0 +} + +// =================== TIANANMEN SQUARE TRACK FUNCTIONS ==================== + +function vm_tst_3() { + log_gap('Tiananmen Square Track award') + game.state = 'vm_tst_3_prep' +} + +function vm_tst_4() { + log_gap('Tiananmen Square Track award') + game.vm_available_ops = 2 + game.remove_opponent_infl = true + game.state = 'vm_tst_4' +} +function vm_tst_6() { + log_h3('Tiananmen Square Track award') + game.vm_available_ops = 1 + game.temp = 1 //Set temp to 1, so that Card 1 is called during the support check, which has 2 ops + game.state = 'vm_tst_6' +} + +function vm_tst_8() { + game.state = 'vm_goodbye_lenin_ops' // Use this to resolve ops. +} + +// ==================== POWER STRUGGLE FUNCTIONS ====================== + +function vm_scare_tactics() { + game.vm_active_country = game.pwr_struggle_in + vm_next() +} +function vm_support_surges() { + game.state = 'vm_support_surges_1' +} + +function vm_support_falters() { + game.vm_available_ops = 2 + game.return === game.active + game.state = 'vm_support_falters' +} + +function vm_kremlin_coup_elite() { + game.valid_spaces=[] + elite_spaces.forEach(space => { + if (spaces[space].country === game.vm_active_country && !check_com_control(space)) { + game.valid_spaces.push(space); + } + }) + game.state = 'vm_kremlin_coup_take_control' +} + +/* ================== VM STATES ============================== */ + +states.vm_end_event = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}.` + }, + prompt () { + view.prompt = `${clean_name(cards[this_card()].name)}: done.` + if (game.vm_infl_to_do || game.return_state === 'vm_tst_8') { + gen_action('done') + } else { + gen_action('end_round') + } + }, + done() { + push_undo() + vm_end_event() + }, + end_round() { + push_undo() + game.return_state = '' + vm_end_event() + } +} + +states.vm_take_control = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt () { + if (game.vm_available_ops > 0 && game.valid_spaces.length === 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: all spaces controlled. Continue.` + gen_action('done') + } else if (game.vm_available_ops > 0 ) { + view.prompt = `${clean_name(cards[this_card()].name)}: take control of ${event_prompt()}.` + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } else { + view.prompt = `${clean_name(cards[this_card()].name)}. Take control: done.` + if (game.vm_infl_to_do) { + gen_action('done') + } else { + gen_action('end_round') + } + } + }, + infl(space) { + push_undo() + vm_take_control(space) + game.vm_available_ops-- + if (game.vm_available_ops === 0) { + game.valid_spaces = [] + vm_next() + } + }, + done() { + push_undo() + vm_next() + }, + end_round() { + push_undo() + vm_next() + } +} + +states.vm_add_infl = { + inactive: 'add Support Points.', + prompt () { + if (game.vm_available_ops > 0 && game.valid_spaces.length === 0 ) { + view.prompt = `${clean_name(cards[this_card()].name)}. No available spaces remaining. Add SPs: done.` + gen_action('done') + } + else if (game.vm_available_ops > 0 ) { + view.prompt = `${clean_name(cards[this_card()].name)}: add ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}.` + + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id) + } + } else { + get_end_infl_prompt() + } + }, + infl(space) { + vm_do_add_infl(space) + if (game.vm_available_ops === 0) { + game.valid_spaces = [] + if (game.summary.length > 0) { + pop_summary() + log_br() + } + + game.vm_event_done = true + vm_next() + } + }, + done () { + push_undo() + if (game.summary.length > 0) { + pop_summary() + log_br() + } + + game.vm_event_done = true + vm_next() + }, + end_round() { + push_undo() + if (game.summary.length > 0) { + pop_summary() + log_br() + } + + game.vm_event_done = true + vm_next() + } +} + +states.vm_add_infl_free = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}: add SPs.` + }, + prompt () { + if (game.vm_available_ops > 0 && game.valid_spaces.length === 0 ) { + view.prompt = `${clean_name(cards[this_card()].name)}. No available spaces remaining. Add SPs: done.` + gen_action('done') + } else if (game.vm_available_ops > 0 ) { + view.prompt = `${clean_name(cards[this_card()].name)}: add ${game.vm_available_ops} SPs to ${event_prompt()}.` + + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } else { + get_end_infl_prompt() + } + }, + infl(space) { + vm_do_add_infl_free(space) + if (game.vm_available_ops === 0) { + game.valid_spaces = [] + if (game.summary.length > 0) { + pop_summary() + log_br() + } + + game.vm_event_done = true + vm_next() + } + }, + done () { + push_undo() + game.valid_spaces = [] + game.vm_event_done = true + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + }, + end_round () { + push_undo() + game.valid_spaces = [] + game.vm_event_done = true + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } +} + +states.vm_add_x_infl = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}: add Support Points.` + }, +// inactive: `resolve ${cards[this_card()].name}: add influence.`, + prompt () { + if (game.vm_event === 101 && game.valid_spaces.length === 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: the Romanian Elite space no longer exists.` + gen_action('done') + } + else if (game.vm_available_ops > 0 ) { + view.prompt = `${clean_name(cards[this_card()].name)}: Add ${game.vm_available_ops} SPs to ${event_prompt()}.` + + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id) + } + } /*else { + view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` + gen_action('done') + }*/ + }, + infl(space) { + push_undo() + vm_do_add_x_infl(space) + if (game.vm_available_ops === 0) { + game.vm_event_done = true + vm_next() + } + /*if (game.vm_event === (105 || 68) { + vm_next() + return + } */ + + + //game.vm_event_done = true + //vm_next() + }, + done () { + push_undo() + game.vm_event_done = true + vm_next() + } +} + +states.vm_add_limited_infl = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}: add Support Points.` + }, + prompt () { + if (game.vm_available_ops > 0 && game.valid_spaces.length > 0) { + if (game.vm_max_infl === 1) { + view.prompt = `${clean_name(cards[this_card()].name)}: add ${pluralize(game.vm_max_infl,'SP')} ${event_prompt()}.` + } + else { + view.prompt = `${clean_name(cards[this_card()].name)}: add ${pluralize(game.vm_available_ops,'SP')} to ${event_prompt()}.` + } + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } /*else { + view.prompt = `${clean_name(cards[this_card()].name)}. Add SPs: done.` + gen_action('done') + }*/ + }, + infl(space) { + vm_do_add_limited_infl(space, game.vm_max_infl) + if (game.vm_available_ops === 0 || game.valid_spaces.length === 0) { + game.valid_spaces = [] + if (game.summary.length > 0) { + pop_summary() + log_br() + } + game.vm_event_done = true + vm_next() + } + }, + /*done () { + push_undo() + if (game.summary.length > 0) { + pop_summary() + log_br() + } + game.vm_event_done = true + vm_next() + }*/ +} + +states.vm_remove_infl = { + inactive: 'remove Support Points.', + prompt () { + // Keep this so that there is an undo option in, e.g., Scare Tactics + if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: no further SPs to remove.` + gen_action('done') + return + } + if (game.vm_available_ops === 0 ) { + view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` + gen_action('done') + return + } + if (game.remove_opponent_infl) { + view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops, 'opponent SP')}${event_prompt()}.` + } + else { + view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}.` + } + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + }, + infl(space) { + push_undo() + vm_do_remove_infl(space) + game.vm_active_country = spaces[space].country + if (game.vm_event !== 44) { + if (game.vm_available_ops === 0 ) { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } + } + }, + done() { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } +} + + +states.vm_remove_x_infl = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}: remove SP from ${event_prompt()}.` + }, + prompt () { + if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: no SPs to remove.` + gen_action('done') + } else if (game.vm_available_ops > 0) { + + view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')} from ${event_prompt()}.` + + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } /*else { + if (game.vm_infl_to_do) { + view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done. Return control to phasing player.` + gen_action('done') + return + } else { + view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` + gen_action('done') + return + } + }*/ + }, + infl(space) { + vm_do_remove_x_infl(space) + /*if (game.vm_event === 68) { + vm_next() + return + }*/ + if (game.vm_available_ops === 0) { + game.vm_event_done = true + vm_next() + } + /*game.vm_event_done = true + vm_next()*/ + }, + done () { + game.vm_event_done = true + vm_next() + } +} + +states.vm_remove_limited_infl = { + inactive: 'remove SP.', + prompt () { + if (game.vm_available_ops > 0 && game.valid_spaces.length > 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops,'SP')}${event_prompt()}, no more than ${game.vm_max_infl} per space.` + + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } else if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: no further SP to remove.` + gen_action('done') + } /*else { + if (game.vm_infl_to_do) { + view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done. Return control to phasing player.` + gen_action('done') + return + } else { + view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` + gen_action('done') + return + } + }*/ + }, + infl(space) { + vm_do_remove_limited_infl(space, game.vm_max_infl) + if (game.vm_available_ops === 0) { + game.vm_event_done = true + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } + }, + done () { + game.vm_event_done = true + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } +} + +states.vm_remove_all_infl = { + inactive: 'remove Support Points', + prompt () { + if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: no SPs to remove.` + gen_action('pass') + } else if (game.vm_available_ops > 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: remove all SPs from ${event_prompt()}.` + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } /*else { + view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` + gen_action('done') + }*/ + }, + infl(space) { + vm_do_remove_all_infl(space) + game.vm_active_country = spaces[space].country + if (game.vm_available_ops === 0) { + vm_next() + } + }, + pass() { + push_undo() + vm_next() + } +} + +states.vm_support_check_prep = { + inactive: 'do support checks.', + prompt () { + /*if (game.vm_available_ops === 0) { + view.prompt = `${clean_name(cards[this_card()].name)}. Support check: done.` + gen_action('done') + } else */ + if (game.valid_spaces.length === 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: no valid targets for support check.` + gen_action('done') + } else { + //if (game.vm_available_ops > 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: ${event_prompt()}. ${pluralize(game.vm_available_ops, 'support check')} remaining.` + //} + for (let space_id of game.valid_spaces) { + if (!space_id) continue + gen_action_sc(space_id); + } + } + }, + sc(space) { + push_undo() + game.selected_space = space + + // Check for Austria-Hungary Border Reopened - check on first support check only + //First check for Monday Demonstrations - support checks will always be in East Germany + if (game.vm_event === 61 && game.persistent_events.includes(58)) { + game.austria_hungary_border_reopened_tracker = true + game.state = 'vm_do_support_check' + return + } + + //Then check Austria-Hungary Border Reopened normally + //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) + if (game.persistent_events.includes(58)) { + if (game.active === DEM && game.vm_available_ops > 1) { + if (spaces[game.selected_space].country === 'East_Germany' && game.persistent_events.includes(58) && game.active === DEM) { + game.state = 'vm_austria_hungary_border_reopened_check' + return + } + //game.state = 'do_support_check' + } /*else { */ + } + game.state = 'vm_do_support_check' + }, + done () { + push_undo() + game.vm_available_ops = 0 + vm_next () + } +} + +states.vm_ceh_support_check_prep = { + inactive: 'do support checks.', + prompt () { + /*if (game.vm_available_ops === 0) { + view.prompt = 'Support checks: done.' + gen_action('done') + return + }*/ + if (game.vm_available_ops > 0) { + view.prompt = `Select a space. ${pluralize(game.vm_available_ops, 'support check')} remaining.` + + for (let space_id of game.valid_spaces) { + gen_action_sc(space_id) + } + } + }, + sc(space) { + push_undo() + game.selected_space = space + + //Then check Austria-Hungary Border Reopened normally + //console.log('game.austria_hungary_border_reopened_checked', game.austria_hungary_border_reopened_checked) + if (game.persistent_events.includes(58)) { + if (game.active === DEM && game.vm_available_ops > 1) { + + if (spaces[game.selected_space].country === 'East_Germany' && game.persistent_events.includes(58) && game.active === DEM) { + game.state = 'vm_austria_hungary_border_reopened_check' + return + } + //game.state = 'do_support_check' + } /*else { */ + } + game.state = 'vm_ceh_do_support_check' + }, + /*done () { + vm_next () + }*/ +} + + +states.vm_ceh_do_support_check = { + inactive: 'do support checks.', + prompt () { + view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` + gen_action('roll') + }, + roll() { + clear_undo() + do_sc(game.selected_space) + + game.vm_available_ops-- + if (game.vm_available_ops === 0) { + game.valid_spaces = [] + vm_next() + } else { + game.state = 'vm_ceh_support_check_prep' + return + } + } +} + +states.vm_austria_hungary_border_reopened_check = { + inactive: 'decide Austria-Hungary Border Reopened', + prompt() { + view.prompt = 'Austria-Hungary Border Reopened: will all support checks be in East Germany?' + gen_action('yes') + gen_action('no') + }, + yes() { + game.austria_hungary_border_reopened_tracker = true + game.state = 'vm_do_support_check' + }, + no() { + game.state = 'vm_do_support_check' + } +} + +states.vm_1_support_check_prep = { + inactive: 'do support checks.', + prompt () { + /*if (game.vm_available_ops === 0) { + view.prompt = `${clean_name(cards[this_card()].name)}. Support check: done.` + gen_action('done') + } else */if (game.valid_spaces.length === 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: no valid targets for support check.` + gen_action('done') + } else { + view.prompt = `${clean_name(cards[this_card()].name)}: ${event_prompt()}.` + + for (let space_id of game.valid_spaces) { + if (!space_id) continue + gen_action_sc(space_id); + } + } + }, + sc(space) { + push_undo() + game.selected_space = space + game.state = 'vm_do_support_check' + }, + done () { + push_undo() + game.vm_available_ops = 0 + vm_next () + } +} + +states.vm_do_support_check = { + inactive: 'do support checks.', + prompt () { + view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` + gen_action('roll') + }, + roll() { + clear_undo() + do_sc(game.selected_space) + game.vm_available_ops-- + if (game.vm_available_ops === 0) { + game.valid_spaces = [] + vm_next() + return + } else { + game.state = 'vm_support_check_prep' + return + } + } +} + +states.vm_tiananmen_square_attempt = { + inactive: 'do Tiananmen Square', + prompt () { + /*if (game.active === DEM && game.dem_tst_attempted_this_turn > 0 || game.active === COM && game.com_tst_attempted_this_turn > 0) { + view.prompt = 'Tiananmen Square Track attempt: done.' + gen_action('done') + return + }*/ + view.prompt = 'Tiananmen Square: roll a die' + gen_action('roll') + }, + roll() { + clear_undo() + do_tst_attempt () + }, + /*done () { + vm_next() + }*/ +} + +//================================== EVENT SPECIFIC STATES ====================================== + +states.vm_adamec = { + get inactive() { + return `resolve ${clean_name(cards[88].name)}.` + }, + prompt() { + view.prompt = 'Adamec: roll a die.' + gen_action('roll') + }, + roll() { + clear_undo() + let roll = Math.floor(Math.random() * 6) + 1 + log(`Roll: D${roll}`) + let worker_spaces = spaces.filter(space => space && space.country === 'Czechoslovakia' && space.socio === 4 && check_dem_control(space.space_id)).length + if (worker_spaces > 0) { + log(`-${worker_spaces} from Democrat controlled worker spaces`) + roll -= worker_spaces + } + log(`Modified roll: ${roll}`) + if (roll > 2) { + log('Adamec succeeds') + vm_next() + return + } + log('Adamec fails: 3 or more required') + permanently_remove(88) + vm_return() + } +} + +states.vm_brought_in_for_questioning = { + inactive: 'discard a card.', + prompt() { + /*if (game.phase === 1) { + view.prompt = 'Discard a card: done.' + gen_action('done') + } else */ + if (game.democrat_hand.length === 0) { + view.prompt = 'Brought in for Questioning. No cards to discard.' + gen_action('pass') + } else { + view.prompt = 'Brought in for Questioning: you must discard a random card.' + gen_action('discard') + } + }, + discard() { + clear_undo() + game.vm_event = discard_card(game.democrat_hand) + game.phase = 1 + if (cards[game.vm_event].side === 'C' && (cards[game.vm_event].playable || game.playable_cards.includes(game.vm_event))) { + //game.return = game.active + if (!game.vm_infl_to_do) { + if(game.round_player === DEM) { + game.return = COM + } else { + game.return = DEM + } + } + if (!is_auto_resolve(game.vm_event) && !switch_events.includes(game.vm_event)) { + next_player() + } + goto_vm(game.vm_event) + } else { + game.return = DEM + vm_return() + } + }, + pass() { + log('No cards to discard') + vm_return() + }, + /*done() { + vm_return() + }*/ +} + +states.vm_central_committee_reshuffle = { + get inactive() { + return `resolve ${clean_name(cards[57].name)}.` + }, + prompt() { + if (game.revolutions.every(n => n === true)) { + view.prompt = 'Central Committee Reshuffle: no countries to choose.' + gen_action('pass') + } else { + view.prompt = 'Central Committee Reshuffle: choose a country to add SPs.' + if (!game.revolutions[0]) {gen_action('poland')} + if (!game.revolutions[1]) {gen_action('hungary')} + if (!game.revolutions[2]) {gen_action('east_germany')} + if (!game.revolutions[3]) {gen_action('bulgaria')} + if (!game.revolutions[4]) {gen_action('czechoslovakia')} + if (!game.revolutions[5]) {gen_action('romania')} + } + }, + east_germany() { + push_undo() + game.vm_active_country = "East_Germany" + log(`Chose ${country_name(game.vm_active_country)}`) + game.valid_spaces = [1,2,3,4,5,6,7,8,9,10,11,12] + vm_next() + }, + poland() { + push_undo() + game.vm_active_country = "Poland" + log(`Chose ${country_name(game.vm_active_country)}`) + game.valid_spaces = [13,14,15,16,17,18,19,20,21,22,23,24,25,26] + vm_next() + }, + czechoslovakia() { + push_undo() + game.vm_active_country = "Czechoslovakia" + log(`Chose ${country_name(game.vm_active_country)}`) + game.valid_spaces = [27,28,29,30,31,32,33,34,35,36,37] + vm_next() + }, + hungary() { + push_undo() + game.vm_active_country = "Hungary" + log(`Chose ${country_name(game.vm_active_country)}`) + game.valid_spaces = [38,39,40,41,42,43,44,45,46,47,48,49] + vm_next() + }, + romania() { + push_undo() + game.vm_active_country = "Romania" + log(`Chose ${country_name(game.vm_active_country)}`) + game.valid_spaces = [50,51,52,53,54,55,56,57,58,59,60,61,62,63] + game.valid_spaces = game.valid_spaces.filter(space => space !== game.systematization) + vm_next() + }, + bulgaria () { + push_undo() + game.vm_active_country = "Bulgaria" + log(`Chose ${country_name(game.vm_active_country)}`) + game.valid_spaces = [64,65,66,67,68,69,70,71,72,73,74,75] + vm_next() + }, + pass() { + log('Passed') + vm_return() + } + +} + +states.vm_common_european_home_choose = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + view.prompt = `Common European Home: play an opponent's card, event does not occur.` + for (let card of game.valid_cards) { + gen_action_card(card) + } + }, + card(card) { + push_undo() + //log(`Played with C${cards[card].number}`) + game.valid_cards = [] + silent_discard(card) + game.vm_event = card + game.state = 'vm_common_european_home_play' + } +} + +states.vm_common_european_home_play = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}.` + }, + prompt() { + view.prompt = `Play ${clean_name(cards[this_card()].name)} for:` + gen_action('influence') + gen_action('support_check') + if (game.active === DEM && game.vm_event === 87 ) { + return /*Special condition if card is actually Kohl Proposes Reunification*/ + } + /*if (game.active === DEM && game.dem_tst_attempted_this_turn === 0 || game.active === COM && game.com_tst_attempted_this_turn === 0) { + gen_action('tst') + } */ + }, + influence(){ + push_undo() + log_gap(`Played C${cards[game.vm_event].number} to place SPs`) + game.vm_available_ops = cards[game.vm_event].ops + valid_spaces_infl() + // If ABHR - Set AHBR tracker to true + if (game.persistent_events.includes(58)) { + game.austria_hungary_border_reopened_tracker = true + } + game.state = 'vm_add_infl' + }, + support_check() { + push_undo() + log_gap(`Played C${cards[game.vm_event].number} for support checks`) + game.vm_available_ops = 2 + game.state = 'vm_ceh_support_check_prep' + valid_spaces_sc() + }, + tst() { + push_undo() + log_gap(`Played C${cards[game.vm_event].number} to the Tiananmen Square Track`) + game.state = 'vm_tiananmen_square_attempt' + } +} + +states.vm_dash_for_the_west = { + get inactive() { + return `resolve ${clean_name(cards[36].name)}.` + }, + prompt() { + /* if (game.phase === 1) {*/ + view.prompt = 'Dash for the West: roll a die' + gen_action('roll') + /*} else { + view.prompt = 'Dash for the West: roll a die. Done.' + gen_action('done') + }*/ + }, + roll() { + clear_undo() + let roll = Math.floor(Math.random() * 6) + 1 + log(`Roll: D${roll}`) + let com_control = check_presence('East_Germany').com_spaces + + if (roll > com_control) { + log(`Success. More than the ${com_control} Communist controlled spaces in East Germany`) + log('+1 VP') + game.vp++ + if (check_vp()) { + return + } + game.discard = true + game.state = 'vm_play_event_from_discard' + } else { + log(`Fail: more than a ${com_control} required`) + //game.phase++ + vm_next() + } + },/* + done() { + vm_next() + }*/ +} + +states.vm_play_event_from_discard = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.valid_cards.length === 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: no valid cards in discard.` + gen_action('pass') + } else if (game.temp === 0) { + view.prompt = `${event_prompt()}.` + for (let card of game.valid_cards) { + gen_action('pass') + gen_action_card(card) + } + } /*else { + view.prompt = 'Choose a card: done.' + gen_action('done') + }*/ + }, + card(card) { + push_undo() + log(`Chose C${cards[card].number}`) + game.vm_event = card + game.vm_available_ops = cards[card].ops + game.discard = false + //game.return = game.active Does turning this off cause problems? + if (switch_events.includes(card)) {next_player()} + goto_vm(card) + }, + pass(){ + push_undo() + if (game.valid_cards.length === 0) { + log('No valid cards to choose') + } else{ + log('Did not choose a card') + } + vm_next() + }, +/* done(){ + push_undo() + game.discard = false + vm_next() + }*/ +} + +states.vm_deutsche_marks_prep = { + inactive: 'choose a card.', + prompt() { + if (game.valid_cards.length === 0) { + view.prompt = 'Deutsche Marks: no cards to give.' + gen_action('pass') + } else { + view.prompt = 'Deutsche Marks: choose a card to give.' + for (let card of game.valid_cards) { + gen_action_card(card) + } + } + }, + card(card) { + push_undo() + log(`Gave C${cards[card].number}`) + game.valid_cards = [] + silent_discard(card) + //next_player() + game.state = 'vm_deutsche_marks_confirm' + game.vm_event = card + }, + pass() { + push_undo() + vm_next() + } +} + +states.vm_deutsche_marks_confirm = { + inactive: 'choose a card.', + prompt() { + view.prompt = `Deutsche Marks: gave ${cards[game.vm_event].name}.` + gen_action('done') + }, + done() { + next_player() + game.state = 'vm_deutsche_marks' + } +} + +states.vm_deutsche_marks = { + get inactive() { + return `resolve ${clean_name(cards[20].name)}.` + }, + prompt() { + if(cards[game.vm_event].side === 'C' && (cards[game.vm_event].playable || game.playable_cards.includes(game.vm_event))) { + view.prompt = `Deutsche Marks: you must play ${clean_name(cards[this_card()].name)} for the event.` + gen_action('event') + } else { + view.prompt = `Deutsche Marks: play ${clean_name(cards[this_card()].name)} for:` + gen_action('influence') + gen_action('support_check') + if (game.com_tst_attempted_this_turn === 0) { + gen_action('tst') + } + } + }, + event() { + push_undo() + log(`Played C${cards[game.vm_event].number} for the event`) + if (!game.vm_infl_to_do) { + game.return = game.active + } + goto_vm(game.vm_event) + }, + influence() { + push_undo() + log(`Played C${cards[game.vm_event].number} to place SPs`) + game.vm_available_ops = get_card_ops(game.vm_event) + + /*cards[game.vm_event].ops + if (game.persistent_events.includes(25)) {game.vm_available_ops++ } + if (game.prudence.COM && game.prudence.COM < 0 ) { + game.vm_available_ops += game.prudence.COM + }*/ + valid_spaces_infl() + game.state = 'vm_add_infl' + }, + support_check() { + push_undo() + log_gap(`Played C${cards[game.vm_event].number} for support checks`) + game.vm_available_ops = 2 + game.state='vm_support_check_prep' + valid_spaces_sc() + }, + tst() { + push_undo() + log_gap(`Played C${cards[game.vm_event].number} to the Tiananmen Square Track`) + game.state='vm_tiananmen_square_attempt' + } +} + +states.vm_exit_visas = { + get inactive() { + return `resolve ${clean_name(cards[75].name)}.` + }, + prompt() { + view.prompt = 'Exit Visas: you may discard cards from your hand and draw replacements.' + for (let card of game.democrat_hand) { + gen_action_card(card) + } + if (game.temp === 0) { + gen_action('pass') + } else { + gen_action('done') + } + }, + card(card){ + push_undo() + discard(card) + game.temp++ + }, + pass() { + push_undo() + game.state = 'vm_exit_visas_finish' + }, + done() { + push_undo() + game.state = 'vm_exit_visas_finish' + } +} + +states.vm_exit_visas_finish = { + get inactive() { + return `resolve ${clean_name(cards[75].name)}.` + }, + prompt() { + if (game.temp > 0 ) { + view.prompt = 'Exit Visas: draw replacement cards.' + gen_action('draw') + } /*else { + view.prompt = 'Exit Visas. Draw cards: done.' + gen_action('done') + } */ + }, + draw() { + clear_undo() + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length + game.temp, game.communist_hand.length) + game.temp = 0 + vm_next() + }, + /*done() { + vm_next() + }*/ +} + +states.vm_foreign_currency_debt_burden = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + view.prompt = 'Choose a country. The Communist may not make support checks there for the rest of the turn.' + gen_action('east_germany') + gen_action('poland') + gen_action('czechoslovakia') + gen_action('hungary') + gen_action('bulgaria') + }, + east_germany() { + push_undo() + game.foreign_currency_debt_burden = 'East_Germany' + log('Selected East Germany') + vm_next() + }, + poland() { + push_undo() + game.foreign_currency_debt_burden = 'Poland' + log('Selected Poland') + vm_next() + }, + czechoslovakia() { + push_undo() + game.foreign_currency_debt_burden = 'Czechoslovakia' + log('Selected Czechoslovakia') + vm_next() + }, + hungary() { + push_undo() + game.foreign_currency_debt_burden = 'Hungary' + log('Selected Hungary') + vm_next() + }, + bulgaria() { + push_undo() + game.foreign_currency_debt_burden = 'Bulgaria' + log('Selected Bulgaria') + vm_next() + } +} + +states.vm_goodbye_lenin = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.valid_cards.length > 0 ) { + view.prompt = `Play a red event from your opponent's hand, or play Goodbye Lenin for operations.` + for (let card of game.valid_cards) { + gen_action_card(card) + gen_action('ops') + } + } else { + view.prompt = 'Communist has no red events. Play Goodbye Lenin for operations.' + gen_action('ops') + } + }, + card(card) { + push_undo() + log(`Chose to play C${card} for the event`) + let card_index = game.communist_hand.indexOf(card) + game.communist_hand.splice(card_index, 1) + game.vm_event = card + game.view_opp_hand = false + goto_vm(card) + }, + ops() { + push_undo() + if (game.valid_cards.length === 0) { + logi('No red events') + } + log('C46 played for operations') + game.view_opp_hand = false + game.state = 'vm_goodbye_lenin_ops' + } +} + +states.vm_goodbye_lenin_ops = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}.` + }, + prompt() { + view.prompt = `Play ${clean_name(cards[this_card()].name)} for:` + gen_action('influence') + gen_action('support_check') + if ((game.active === DEM && game.dem_tst_attempted_this_turn === 0 ) || (game.active === COM && game.com_tst_attempted_this_turn === 0 )) { + gen_action('tst') + } + }, + influence(){ + push_undo() + game.vm_available_ops = get_card_ops(this_card()) + /*if (game.persistent_events.includes(50)) { + log(`+1 from C50`) + game.vm_available_ops++ + }*/ + valid_spaces_infl() + + // If ABHR - Set AHBR tracker to true + if (game.persistent_events.includes(58)) { + game.austria_hungary_border_reopened_tracker = true + } + game.state = 'vm_add_infl' + }, + support_check() { + push_undo() + game.vm_available_ops = 2 + game.state = 'vm_support_check_prep' + valid_spaces_sc() + }, + tst() { + push_undo() + game.state = 'vm_tiananmen_square_attempt' + } +} + +states.vm_honecker = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.valid_cards.length === 0 && game.temp === 0) { + view.prompt = 'Honecker: no valid cards to choose.' + gen_action('pass') + } else + if (game.temp === 0) {view.prompt = 'Honecker: choose a card to add to your hand.' + for (let card of game.valid_cards) { + gen_action_card(card) + gen_action('pass') + } + } /*else { + view.prompt = 'Honecker. Choose a card: done.' + gen_action('done') + }*/ + }, + card(card) { + push_undo() + game.valid_cards = [] + log(`Took C${cards[card].number} into hand`) + game.temp = card + let card_index = game.strategy_discard.indexOf(card) + game.strategy_discard.splice(card_index, 1) + game.communist_hand.push(card) + vm_next() + }, + pass(){ + log('Did not take a card') + game.discard = false + vm_next() + }, + /*done(){ + if (game.temp === 0) { + log('Did not take a card') + } + game.discard = false + vm_next() + } */ + +} + +states.vm_inflationary_currency = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if ((game.active === COM && game.revolutions.every(n => n === false)) || (game.active === DEM && game.revolutions.every(n => n === true))) { + view.prompt = 'Inflationary Currency: no countries to choose.' + gen_action('pass') + } else { + view.prompt = 'Inflationary Currency: choose a country where your opponent has power.' + if (game.active === DEM) { + if (!game.revolutions[0]) {gen_action('poland')} + if (!game.revolutions[1]) {gen_action('hungary')} + if (!game.revolutions[2]) {gen_action('east_germany')} + if (!game.revolutions[3]) {gen_action('bulgaria')} + if (!game.revolutions[4]) {gen_action('czechoslovakia')} + if (!game.revolutions[5]) {gen_action('romania')} + } else { + if (game.revolutions[0]) {gen_action('poland')} + if (game.revolutions[1]) {gen_action('hungary')} + if (game.revolutions[2]) {gen_action('east_germany')} + if (game.revolutions[3]) {gen_action('bulgaria')} + if (game.revolutions[4]) {gen_action('czechoslovakia')} + if (game.revolutions[5]) {gen_action('romania')} + } + } + }, + east_germany() { + push_undo() + game.vm_active_country = 'East_Germany' + log(`Chose ${country_name(game.vm_active_country)}`) + vm_next() + }, + poland() { + push_undo() + game.vm_active_country = 'Poland' + log(`Chose ${country_name(game.vm_active_country)}`) + vm_next() + }, + czechoslovakia() { + push_undo() + game.vm_active_country = 'Czechoslovakia' + log(`Chose ${country_name(game.vm_active_country)}`) + vm_next() + }, + hungary() { + push_undo() + game.vm_active_country = 'Hungary' + log(`Chose ${country_name(game.vm_active_country)}`) + vm_next() + }, + romania() { + push_undo() + game.vm_active_country = 'Romania' + log(`Chose ${country_name(game.vm_active_country)}`) + vm_next() + }, + bulgaria () { + push_undo() + game.vm_active_country = 'Bulgaria' + log(`Chose ${country_name(game.vm_active_country)}`) + vm_next() + }, + pass() { + log('Passed') + vm_return() + } +} + +states.vm_inflationary_currency_discard = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.valid_cards.length === 0 ) { + view.prompt = 'Inflationary Currency: no valid cards to discard. You must pass.' + gen_action('pass') + } else if (game.temp === 0 ) { + view.prompt = 'Inflationary Currency: you may discard a 3 op or higher value card to cancel the support check.' + gen_action('pass') + for (let card of game.valid_cards) { + gen_action_card(card) + } + } /*else { + view.prompt = 'Inflationary Currency. Discard a card: done.' + gen_action('done') + } */ + }, + card(card) { + push_undo() + discard(card) + game.temp = card + if (!game.vm_infl_to_do) { + if(game.round_player === DEM) { + game.return = COM + } else { + game.return = DEM + } + } + vm_next() + }, + pass() { + push_undo() + log('Did not discard') + next_player() + game.vm_available_ops = 1 + vm_next() + //game.state = 'vm_support_check_prep' + }, + done() { + if (!game.vm_infl_to_do) { + if(game.round_player === DEM) { + game.return = COM + } else { + game.return = DEM + } + } + vm_next() + } +} + + +states.vm_kiss_of_death = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.communist_hand.length === 0) { + view.prompt = 'Kiss of Death. No cards to discard.' + gen_action('pass') + } else { + view.prompt = 'Kiss of Death: you must randomly discard a card.' + gen_action('discard') + } + }, + discard() { + clear_undo() + game.vm_event = discard_card(game.communist_hand) + //Only switch player if a playable non-communist event. Common European Home is not playable here + if (cards[game.vm_event].side !== "C" && event_is_playable(game.vm_event) && game.vm_event !== 21) { + next_player() + game.state = 'vm_kiss_of_death_finish' + } else { + log('Event does not occur') + vm_next() + } + }, + pass() { + log('No card to discard') + vm_next() + } +} + +states.vm_kiss_of_death_finish = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.vm_event > 0 && game.vm_event !== 21 && (cards[game.vm_event].side === 'D' || cards[game.vm_event].side === 'N')) { + view.prompt = `Play ${clean_name(cards[game.vm_event].name)} for the event.` + console.log('kiss of death before event button: game.stategy_discard', game.strategy_discard) + gen_action('event') + } else { + view.prompt = 'Event does not occur.' + gen_action('done') + } + }, + event() { + //game.return = game.active + // Remove game.vm_event from the discard + //game.strategy_discard = game.strategy_discard.filter(n => n !== game.vm_event) + + goto_vm(game.vm_event) + }, + done() { + vm_next() + } +} + +states.vm_kremlin_coup_choose_country = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}.` + }, + prompt() { + if (game.temp.length > 0) { + view.prompt = 'Kremlin Coup! Select a country where the Communist retains power.' + for (let country of countries) { + if (game.temp.includes(country)) { + gen_action(`${country.toLowerCase()}`) + } + } + } else { + view.prompt = 'Kremlin Coup! There are no countries where the Communist retains power.' + gen_action('done') + } + }, + east_germany() { + push_undo() + game.vm_active_country = 'East_Germany' + game.temp = game.temp.filter(country => country !== game.vm_active_country) + log(`${country_name(game.vm_active_country)}:`) + vm_kremlin_coup_elite() + }, + poland() { + push_undo() + game.vm_active_country = 'Poland' + log(`${country_name(game.vm_active_country)}:`) + game.temp = game.temp.filter(country => country !== game.vm_active_country) + vm_kremlin_coup_elite() + }, + czechoslovakia() { + push_undo() + game.vm_active_country = 'Czechoslovakia' + log(`${country_name(game.vm_active_country)}:`) + game.temp = game.temp.filter(country => country !== game.vm_active_country) + vm_kremlin_coup_elite() + }, + hungary() { + push_undo() + game.vm_active_country = 'Hungary' + log(`${country_name(game.vm_active_country)}:`) + game.temp = game.temp.filter(country => country !== game.vm_active_country) + vm_kremlin_coup_elite() + }, + romania() { + push_undo() + game.vm_active_country = 'Romania' + log(`${country_name(game.vm_active_country)}:`) + game.temp = game.temp.filter(country => country !== game.vm_active_country) + vm_kremlin_coup_elite() + }, + bulgaria () { + push_undo() + game.vm_active_country = 'Bulgaria' + log(`${country_name(game.vm_active_country)}:`) + game.temp = game.temp.filter(country => country !== game.vm_active_country) + vm_kremlin_coup_elite() + }, + done() { + game.temp = 0 + vm_next() + } +} + +states.vm_kremlin_coup_take_control = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.valid_spaces.includes(game.systematization)) { + view.prompt = `Kremlin Coup! ${country_name(game.vm_active_country)}'s Elite space no longer exists.` + gen_action('done') + } + else if (game.valid_spaces.length === 0){ + view.prompt = `Kremlin Coup! ${country_name(game.vm_active_country)}'s Elite space is already controlled.` + gen_action('done') + } else { + view.prompt = `Kremlin Coup! Take control of the Elite space in ${country_name(game.vm_active_country)}.` + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } + }, + infl(space) { + push_undo() + vm_take_control(space) + if (game.vm_active_country === 'East_Germany') {game.selected_space = 3 } + if (game.vm_active_country === 'Poland') {game.selected_space = 17} + if (game.vm_active_country === 'Czechoslovakia') {game.selected_space = 29} + if (game.vm_active_country === 'Hungary') {game.selected_space = 45} + if (game.vm_active_country === 'Romania') {game.selected_space = 61} + if (game.vm_active_country === 'Bulgaria') {game.selected_space = 68} + game.state = 'vm_kremlin_coup_sc_prep' + }, + done() { + push_undo() + if (game.vm_active_country === 'East_Germany') {game.selected_space = 3 } + if (game.vm_active_country === 'Poland') {game.selected_space = 17} + if (game.vm_active_country === 'Czechoslovakia') {game.selected_space = 29} + if (game.vm_active_country === 'Hungary') {game.selected_space = 45} + if (game.vm_active_country === 'Romania') {game.selected_space = 61} + if (game.vm_active_country === 'Bulgaria') {game.selected_space = 68} + game.state = 'vm_kremlin_coup_sc_prep' + } +} + +states.vm_kremlin_coup_sc_prep = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + view.prompt = `Kremlin Coup! Conduct a support check in ${country_name(game.vm_active_country)}'s Bureaucratic space.` + gen_action_sc(game.selected_space); + }, + sc(space) { + //game.selected_space = space + push_undo() + game.state = 'vm_kremlin_coup_sc' + } +} + +states.vm_kremlin_coup_sc = { + inactive: 'do support checks', + prompt () { + view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die.` + gen_action('roll') + }, + roll() { + clear_undo() + do_sc(game.selected_space) + if (game.temp.length > 0 ){ + game.state = 'vm_kremlin_coup_choose_country' + } else { + //game.state = 'vm_kremlin_coup_end' + vm_next() + } + } +} +/* +states.vm_kremlin_coup_end = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}.` + }, + prompt() { + view.prompt = `${clean_name(cards[this_card()].name)} Support checks: done.` + gen_action('done') + }, + done() { + vm_next() + } +} +*/ +states.vm_laszlo_tokes = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + view.prompt = `Laszlo Tokes. Choose to:` + gen_action('influence') + gen_action('support_check') + }, + influence(){ + push_undo() + game.vm_available_ops = get_card_ops(73) + valid_spaces_infl() + game.valid_spaces = game.valid_spaces.filter(space_id => spaces[space_id].country === 'Romania') + game.phase = 3 + vm_next() + //game.state = 'vm_add_infl' + }, + support_check() { + push_undo() + game.vm_available_ops = 2 + //game.state = 'vm_support_check_prep' + valid_spaces_sc() + game.valid_spaces = game.valid_spaces.filter(space_id => spaces[space_id].country === 'Romania') + vm_next() + } +} + +states.vm_switch_infl = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.valid_spaces.length === 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: No SPs to remove.` + gen_action('pass') + } else { + /*if (game.vm_available_ops > 0 ) {*/ + view.prompt = `${clean_name(cards[game.played_card].name)}: ${event_prompt()}.` + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } /*else { + view.prompt = 'Influence replaced.' + gen_action('done') + }*/ + }, + infl(space) { + push_undo() + vm_switch_infl(space) + if (game.vm_available_ops === 0) { + game.valid_spaces = [] + } + vm_next() + }, + pass() { + vm_next() + } + /*done() { + vm_next() + }*/ +} + +states.vm_malta_summit = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + /*if (game.phase === 1) {*/ + view.prompt = 'Malta Summit: roll a die.' + gen_action('roll') + /*} else { + view.prompt = 'Done.' + gen_action('done') + }*/ + }, + roll() { + clear_undo() + let roll = Math.floor(Math.random() * 6) + 1 + log(`Roll: D${roll}`) + if (game.stability > 0) { + log(`+${game.stability} from USSR Stability Track`) + log(`Modified roll: ${roll + game.stability}`) + } + if (roll + game.stability > 3) { + log('Summit successful') + game.vp += 3 + log('+3 VP') + if (check_vp()) { + return + } + if (game.comInfl[12] > 0 ) {game.valid_spaces.push(12)} + if (game.comInfl[15] > 0 ) {game.valid_spaces.push(15)} + if (game.comInfl[27] > 0 ) {game.valid_spaces.push(27)} + if (game.comInfl[43] > 0 ) {game.valid_spaces.push(43)} + if (game.comInfl[51] > 0 ) {game.valid_spaces.push(51)} + if (game.comInfl[69] > 0 ) {game.valid_spaces.push(69)} + //game.vm_available_ops = 5 + game.remove_opponent_infl = true + vm_next() + } + else { + log('Summit failed. Required 4 or more') + //game.phase++ + vm_goto_step(vm_permanently_remove) + } + }, + /*done() { + vm_next() + }*/ +} + +states.vm_modrow = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + view.prompt = `Modrow: roll a die.` + gen_action('roll') + }, + roll(){ + clear_undo() + let roll = Math.floor(Math.random() * 6) + 1 + let dem_spaces = spaces.filter(space => space && space.country === 'East_Germany' && check_dem_control(space.space_id)).length + if (roll > dem_spaces) { + log(`Roll: D${roll}`) + log(`Success. More than the ${dem_spaces} Democratically controlled spaces`) + vm_next() + } else { + log(`Roll: D${roll}`) + log(`Fail. More than ${dem_spaces} required`) + permanently_remove(83) + vm_return() + } + } +} + +states.vm_nepotism = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + //if (game.phase === 1 ) { + view.prompt = 'Nepotism: roll a die.' + gen_action('roll') + /*} else { + view.prompt = 'Roll a die: done.' + gen_action('done') + }*/ + }, + roll() { + clear_undo() + let roll = Math.floor(Math.random() * 6) + 1 + if (roll < 3) { + log(`Roll: D${roll} adds 4 SPs`) + game.vm_available_ops = 4} + else if (roll < 5 ) { + log(`Roll: D${roll} adds 3 SPs`) + game.vm_available_ops = 3} + else { + log(`Roll: D${roll} adds 1 SP`) + game.vm_available_ops = 1} + //game.phase = 2 + vm_next() + }, + /*done() { + vm_next() + }*/ +} + +states.vm_new_years_eve_party = { + get inactive() { + return `resolve ${clean_name(cards[104].name)}.` + }, + prompt() { + view.prompt = 'Choose whether the game ends at the end of this turn.' + gen_action('end') + gen_action('continue') + }, + end() { + push_undo() + game.persistent_events.push(104) + log('Chooses to end the game. There will be no final scoring') + let power = game.revolutions.filter(value => value === false).length + if (power > 3) { + log(`Communist holds power in ${power} countries. -3 VP`) + game.vp -= 3 + } else { + log(`Communist holds power in ${power} countries. +3 VP`) + game.vp += 3 + } + if (check_vp()) { + return + } + //game.table_cards.push(104) + permanently_remove(104) + vm_next() + }, + continue() { + push_undo() + log('Chooses to continue') + permanently_remove(104) + vm_next() + } +} + +states.vm_nomenklatura = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + view.prompt = 'Nomenklatura: choose to remove all Democratic SPs from Elite spaces or add 3 SPs to any Elite space(s).' + gen_action('remove') + gen_action('add') + }, + remove() { + push_undo() + game.valid_spaces = [] + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + + if (space.socio === 1 && game.demInfl[i] > 0) { + game.valid_spaces.push(space.space_id) + } + } + game.vm_available_ops = game.valid_spaces.length + game.remove_opponent_infl = true + game.state = 'vm_nomenklatura_remove' + }, + add() { + push_undo() + game.valid_spaces = [] + for (let space of spaces) { + if (!space) continue + if (space.socio === 1) { + game.valid_spaces.push(space.space_id) + } + } + check_systematization() + game.vm_available_ops = 3 + game.state = 'vm_nomenklatura_add' + } +} + +states.vm_nomenklatura_remove = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.valid_spaces.length === 0 ) { + view.prompt = 'Nomenklatura. No SPs to remove: pass.' + gen_action('pass') + } else { + view.prompt = 'Nomenklatura: remove all Democratic SPs from Elite spaces.' + + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } + }, + infl(space) { + push_undo() + vm_do_remove_all_infl(space) + if (game.valid_spaces.length === 0) { + vm_next() + } + }, + pass() { + push_undo() + vm_next() + } +} + +states.vm_nomenklatura_add = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + /*if (game.vm_available_ops === 0 || game.valid_spaces.length === 0 ) { + view.prompt = 'Nomenklatura. Add SPs: done.' + gen_action('done') + } else { */ + view.prompt = `Nomenklatura: add 3 SPs to any Elite space(s). ${pluralize(game.vm_available_ops, 'SP')} remaining.` + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + //} + }, + infl(space) { + push_undo() + vm_do_add_infl_free(space) + if (game.vm_available_ops === 0 ) { + game.valid_spaces = [] + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } + }, +/* done() { + push_undo() + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + }*/ +} + +states.vm_samizdat = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + view.prompt = 'Samizdat: you may set aside a card from your hand and draw a replacement.' + for (let card of game.democrat_hand) { + gen_action_card(card) + } + gen_action('pass') + }, + card(card) { + push_undo() + game.samizdat_card = card + game.democrat_hand = game.democrat_hand.filter(c => c !== card) + log('Set aside a card') + game.state = 'vm_samizdat_finish' + }, + pass() { + push_undo() + //if (game.samizdat_card > 0) {game.state = 'vm_samizdat_finish'} + /*else { */ + log('Did not set aside a card') + vm_next() + //} + } +} + +states.vm_samizdat_finish = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + /*if (game.phase ) { + view.prompt = 'Samizdat: done.' + gen_action('done') + } else {*/ + view.prompt = 'Draw a replacement card.' + gen_action('draw') + //} + }, + draw() { + clear_undo() + game.democrat_hand.push(draw_card(game.strategy_deck)) + vm_next() + //game.phase ++ + }, + /*done() { + vm_next() + }*/ +} + +states.vm_shock_therapy = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.revolutions.every(n => n === false)) { + view.prompt = 'Shock Therapy: no countries to choose.' + gen_action('pass') + } else { + if (game.vm_active_country === '' ) { + view.prompt = 'Shock Therapy: choose a country where you hold Power:' + if (game.revolutions[0]) {gen_action('poland')} + if (game.revolutions[1]) {gen_action('hungary')} + if (game.revolutions[2]) {gen_action('east_germany')} + if (game.revolutions[3]) {gen_action('bulgaria')} + if (game.revolutions[4]) {gen_action('czechoslovakia')} + if (game.revolutions[5]) {gen_action('romania')} + } /*else if (game.phase === 2) { + view.prompt = 'Shock Therapy: done.' + gen_action('done') + } */ + else { + view.prompt = 'Shock Therapy: roll a die.' + gen_action('roll') + } + } + }, + east_germany() { + push_undo() + game.vm_active_country = 'East_Germany' + log(`Chose ${country_name(game.vm_active_country)}`) + }, + poland() { + push_undo() + game.vm_active_country = 'Poland' + log(`Chose ${country_name(game.vm_active_country)}`) + }, + czechoslovakia() { + push_undo() + game.vm_active_country = 'Czechoslovakia' + log(`Chose ${country_name(game.vm_active_country)}`) + }, + hungary() { + push_undo() + game.vm_active_country = 'Hungary' + log(`Chose ${country_name(game.vm_active_country)}`) + }, + romania() { + push_undo() + game.vm_active_country = 'Romania' + log(`Chose ${country_name(game.vm_active_country)}`) + }, + bulgaria () { + push_undo() + game.vm_active_country = 'Bulgaria' + log(`Chose ${country_name(game.vm_active_country)}`) + }, + roll() { + clear_undo() + let roll = Math.floor(Math.random() * 6) + 1 + let worker_farmer = 0 + for (let space of spaces) { + if (space && space.country === game.vm_active_country && check_com_control(space.space_id) && (space.socio === 3 || space.socio === 4)) { + worker_farmer++ + } + } + log(`Roll: D${roll}`) + log(`-${worker_farmer} from Communist controlled Worker and Farmer spaces`) + log(`Modified roll: ${roll - worker_farmer}`) + if ((roll - worker_farmer) > 2) { + log('C93 is successful. +3 VP') + vm_next() + } else { + log('C93 is unsuccessful. Required 3 or more') + //game.phase++ + permanently_remove(93) + vm_return() + } + }, + pass() { + log('Passed') + vm_return() + } + /*done() { + permanently_remove(93) + vm_return() + }*/ +} + +states.vm_social_democratic_platform_adopted = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.revolutions.every(n => n === false)) { + view.prompt = 'Social Democratic Platform Adopted: no countries to choose.' + gen_action('pass') + } else { + view.prompt = 'Select a country where the Democrat holds Power.' + if (game.revolutions[0]) {gen_action('poland')} + if (game.revolutions[1]) {gen_action('hungary')} + if (game.revolutions[2]) {gen_action('east_germany')} + if (game.revolutions[3]) {gen_action('bulgaria')} + if (game.revolutions[4]) {gen_action('czechoslovakia')} + if (game.revolutions[5]) {gen_action('romania')} + } + }, + east_germany() { + push_undo() + game.vm_active_country = 'East_Germany' + log(`Selected ${country_name(game.vm_active_country)}`) + vm_next() + }, + poland() { + push_undo() + game.vm_active_country = 'Poland' + log(`Selected ${country_name(game.vm_active_country)}`) + vm_next()}, + czechoslovakia() { + push_undo() + game.vm_active_country = 'Czechoslovakia' + log(`Selected ${country_name(game.vm_active_country)}`) + vm_next()}, + hungary() { + push_undo() + game.vm_active_country = 'Hungary' + log(`Selected ${country_name(game.vm_active_country)}`) + vm_next() + }, + romania() { + push_undo() + game.vm_active_country = 'Romania' + log(`Selected ${country_name(game.vm_active_country)}`) + vm_next() + }, + bulgaria () { + push_undo() + game.vm_active_country = 'Bulgaria' + log(`Selected ${country_name(game.vm_active_country)}`) + vm_next() + }, + pass() { + log('Passed') + vm_return() + } +} + +states.vm_systematization = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + /*if (game.systematization === 0) { */ + view.prompt = 'Systematization: eliminate a space in Romania.' + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + /*} else { + view.prompt = 'Systematization: done.' + gen_action('done') + }*/ + }, + infl(space) { + push_undo() + vm_eliminate(space) + game.valid_spaces = [] + game.systematization = space + game.persistent_events.push(69) + vm_next() + }, +/* done() { + vm_next() + } */ +} + +states.vm_the_chinese_solution = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + view.prompt = 'The Chinese Solution: you may give up 3 VP to conduct support checks in a country where you hold power.' + if (!game.revolutions[0]) {gen_action('poland')} + if (!game.revolutions[1]) {gen_action('hungary')} + if (!game.revolutions[2]) {gen_action('east_germany')} + if (!game.revolutions[3]) {gen_action('bulgaria')} + if (!game.revolutions[4]) {gen_action('czechoslovakia')} + if (!game.revolutions[5]) {gen_action('romania')} + gen_action('pass') + }, + east_germany() { + push_undo() + game.vm_active_country = 'East_Germany' + log(`Chose ${country_name(game.vm_active_country)}`) + log('+3 VP') + game.vp += 3 + if (check_vp()) { + return + } + vm_next() + }, + poland() { + push_undo() + game.vm_active_country = 'Poland' + log(`Chose ${country_name(game.vm_active_country)}`) + log('+3 VP') + game.vp += 3 + if (check_vp()) { + return + } + vm_next() + }, + czechoslovakia() { + push_undo() + game.vm_active_country = 'Czechoslovakia' + log(`Chose ${country_name(game.vm_active_country)}`) + log('+3 VP') + game.vp += 3 + if (check_vp()) { + return + } + vm_next() + }, + hungary() { + push_undo() + game.vm_active_country = 'Hungary' + log(`Chose ${country_name(game.vm_active_country)}`) + log('+3 VP') + game.vp += 3 + if (check_vp()) { + return + } + vm_next() + }, + romania() { + push_undo() + game.vm_active_country = 'Romania' + log(`Chose ${country_name(game.vm_active_country)}`) + log('+3 VP') + game.vp += 3 + if (check_vp()) { + return + } + vm_next() + }, + bulgaria () { + push_undo() + game.vm_active_country = 'Bulgaria' + log(`Chose ${country_name(game.vm_active_country)}`) + log('+3 VP') + game.vp += 3 + if (check_vp()) { + return + } + vm_next() + }, + pass() { + push_undo() + permanently_remove(96) + vm_return() + } +} + +states.vm_the_tyrant_is_gone = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (!game.the_tyrant_is_gone) { + view.prompt = 'The Tyrant is Gone: Select a space in Romania for the Ceausescus to flee to.' + for (let space_id of game.valid_spaces) { + if (!space_id) continue + gen_action_infl(space_id); + } + } else { + view.prompt = 'The Tyrant is Gone: done.' + gen_action('done') + } + }, + infl(space) { + push_undo() + log(`The Ceausescus flee to %${space}`) + game.the_tyrant_is_gone = space + game.valid_spaces = [] + game.persistent_events.push(97) + + // vm_next() + }, + done () { + vm_next() + } +} +/* +states.vm_tyrant_block ={ + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}.` + }, + prompt() { + view.prompt = `${clean_name(cards[this_card()].name)} has no effect after The Tyrant Has Gone.` + gen_action('done') + }, + done() { + push_undo() + vm_next() + } +}*/ + + +states.vm_the_wall_must_go = { + get inactive() { + return `resolve ${clean_name(cards[this_card()].name)}.` + }, + prompt() { + /*if (game.the_wall_must_go['dem_wins'] === 2 || game.the_wall_must_go['com_wins'] === 2) { + view.prompt = '"The Wall Must Go!" Rolls: done.' + gen_action('done') + } else { */ + view.prompt = ('The Wall Must Go! Roll a die.') + gen_action('roll') + //} + }, + roll() { + clear_undo() + let attempt = game.the_wall_must_go['dem_wins'] + game.the_wall_must_go['com_wins'] + if (game.the_wall_must_go['dem_roll'] === 0 && game.the_wall_must_go['com_roll'] === 0) { + log_h3(`Round ${attempt+1}`) + } + + let roll = Math.floor(Math.random() * 6) + 1 + log(`Roll: D${roll}`) + if (game.active === DEM) { + let controlled_spaces = spaces.filter(space => space && space.country === 'East_Germany' && check_dem_control(space.space_id)).length + if (controlled_spaces > 0) { + log(`+${controlled_spaces} from controlled spaces in East Germany`) + log(`Modified roll: ${roll + controlled_spaces}`) + roll += controlled_spaces + } + game.the_wall_must_go['dem_roll'] = roll + } else { + let controlled_spaces = spaces.filter(space => space && space.country === 'East_Germany' && check_com_control(space.space_id)).length + if (controlled_spaces > 0) { + log(`+${controlled_spaces} from controlled spaces in East Germany`) + log(`Modified roll: ${roll + controlled_spaces}`) + roll += controlled_spaces + } + game.the_wall_must_go['com_roll'] = roll + + } + if (game.the_wall_must_go['dem_roll'] > 0 && game.the_wall_must_go['com_roll'] > 0) { + if (game.the_wall_must_go['dem_roll'] > game.the_wall_must_go['com_roll'] ) { + log('Democrat wins') + game.the_wall_must_go['dem_wins']++ + } else if (game.the_wall_must_go['dem_roll'] === game.the_wall_must_go['com_roll'] ) { + log('Tie. Re-roll') + } else { + log('Communist wins') + game.the_wall_must_go['com_wins']++ + } + + log(`Democrat: ${game.the_wall_must_go['dem_wins']}, Communist: ${game.the_wall_must_go['com_wins']}`) + } + if (game.the_wall_must_go['dem_wins'] === 2) { + log('The Democrat wins C86') + finish_the_wall() + return + } + if (game.the_wall_must_go['com_wins'] === 2) { + log('The Communist wins C86') + finish_the_wall() + return + } + if (game.the_wall_must_go['dem_roll'] === 0 || game.the_wall_must_go['com_roll'] === 0) { + next_player() + } else { + game.the_wall_must_go['dem_roll'] = 0 + game.the_wall_must_go['com_roll'] = 0 + } + }, + /*done() { + if (game.the_wall_must_go['dem_wins'] === 2) { + game.persistent_events.push(86) + log('+3 VP') + game.vp += 3 + if (check_vp()) { + return + } + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + if (space.country === 'East_Germany' && game.comInfl[i] > 0){ + game.valid_spaces.push(space.space_id) + } + } + if (!game.vm_infl_to_do) { + if (game.round_player === DEM) { + game.return = COM + } else { + game.return = DEM + } + } + if (game.active === DEM) {next_player()} + vm_next () + } else { + permanently_remove(86) + delete game.the_wall_must_go + vm_return() + } + }*/ +} + +states.vm_warsaw_pact_summit = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + view.prompt = 'Choose to play for support checks or place SPs.' + gen_action('influence') + gen_action('support_check') + }, + influence(){ + push_undo() + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + if (game.demInfl[i] === 0) { + game.valid_spaces.push(space.space_id); + } + } + game.vm_available_ops = 4 + game.phase = 3 + //game.state = 'vm_add_infl' + vm_next() + }, + support_check(){ + push_undo() + for (let i = 1; i < spaces.length; i++) { + let space = spaces[i] + if (game.demInfl[i] > 0 && (space.socio === 5 || space.socio === 6)) { + game.valid_spaces.push(space.space_id) + } + } + game.vm_available_ops = 2 + //game.state = 'vm_support_check_prep' + vm_next() + } +} + +states.vm_we_are_the_people_remove = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.demInfl[6] === 0 && game.vm_available_ops > 0) { + view.prompt = '"We are the People!": no SPs to remove.' + gen_action('done') + } else if (game.vm_available_ops > 0 ) { + view.prompt = '"We are the People!": remove up to 4 SPs from the Lutherian Church.' + gen_action('done') + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + } else { + view.prompt = '"We are the People!" Remove SPs: done.' + gen_action('done') + } + }, + infl(space) { + vm_do_remove_infl(space) + }, + done() { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + if (!game.vm_influence_added[6]) { + log('No SPs removed') + vm_next() + } else { + game.valid_spaces = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + game.state = 'vm_we_are_the_people_add' + } + } +} +states.vm_we_are_the_people_add = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + /* if (!game.vm_influence_added[6]) { + view.prompt = '"We are the People!" Add SPs: done.' + gen_action('done') + return + }*/ + + view.prompt = `"We are the People!": you must add the ${pluralize(game.vm_influence_added[6],'SP')} to spaces in Germany.` + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + }, + infl(space) { + vm_do_add_infl_free(space) + game.vm_influence_added[6]-- + if (game.vm_influence_added[6] === 0 ) { + game.valid_spaces = [] + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } + }, + /*done() { + push_undo() + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + }*/ +} + +states.vm_workers_revolt = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + if (game.valid_spaces.length === 0 ) { + view.prompt = 'Workers Revolt: no valid spaces to select.' + gen_action('pass') + return + } + view.prompt = 'Workers Revolt: select a Worker Space in a country your opponent has power.' + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id) + } + }, + pass() { + push_undo() + vm_next() + }, + infl(space) { + push_undo() + game.selected_space = space + log(`Chose %${game.selected_space}`) + game.state = 'vm_workers_revolt_finish' + } +} + + +states.vm_workers_revolt_finish = { + get inactive() { + return `resolve ${clean_name(cards[game.played_card].name)}.` + }, + prompt() { + //if (game.selected_space > 0) { + view.prompt = `Target: ${spaces[game.selected_space].name_unique}. Roll a die.` + gen_action('roll') + /* } else { + view.prompt = 'Workers Revolt: done.' + gen_action('done') + }*/ + + }, + roll() { + clear_undo() + let roll = Math.floor(Math.random() * 6) + 1 + log(`Roll: D${roll}`) + let adj = count_adj(game.selected_space) + if (game.active === DEM) { + log(`-${adj.com_adj} from opponent controlled spaces`) + roll -= adj.com_adj + } else { + log(`-${adj.dem_adj} from opponent controlled spaces`) + roll -= adj.dem_adj + } + log(`Modified roll: ${roll}`) + if (roll >= 4) { + log('Workers Revolt successful') + vm_replace_all_infl(game.temp) + } else {log('Workers Revolt fails. Required 4 or more')} + game.selected_space = 0 + vm_next() + }, + /*done() { + vm_next() + }*/ +} + +// ==================== TIANANMEN SQUARE TRACK STATES ===================== + +states.vm_tst_3_prep = { + inactive: 'resolve Tiananmen Square Track award.', + prompt() { + view.prompt = 'Tiananmen Square Track award: draw 3 cards.' + gen_action('draw') + }, + draw() { + if (game.active === DEM) { + game.temp = game.democrat_hand.length + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length + 3, game.communist_hand.length) + game.valid_cards = [game.democrat_hand[game.temp], game.democrat_hand[game.temp + 1], game.democrat_hand[game.temp + 2]] + } else { + game.temp = game.communist_hand.length + draw_cards(game.strategy_deck, game.democrat_hand, game.communist_hand, game.democrat_hand.length, game.communist_hand.length + 3) + game.valid_cards = [game.communist_hand[game.temp], game.communist_hand[game.temp + 1], game.communist_hand[game.temp + 2]] + } + game.temp = 0 + game.state = 'vm_tst_3' + } +} + +states.vm_tst_3 = { + inactive: 'resolve Tiananmen Square Track bonus.', + prompt() { + if (game.temp < 2) { + view.prompt = `Discard 2 of the drawn cards.` + for (let card of game.valid_cards) { + gen_action_card(card) + } + } /*else { + view.prompt = 'Discard cards: done.' + gen_action('done') + }*/ + }, + card(card) { + push_undo() + discard(card) + game.temp ++ + if (game.temp === 2) { + game.valid_cards = [] + vm_next() + } + }, + /*done() { + vm_next() + }*/ +} + +states.vm_tst_4 = { + inactive: 'remove SPs', + prompt () { + if (game.vm_available_ops === 0 || game.valid_spaces.length === 0) { + view.prompt = 'Tiananmen Square Track award. Remove SPs: done.' + gen_action('done') + return + } + view.prompt = `Tiananmen Square Track award: remove ${pluralize(game.vm_available_ops,'SP')}.` + + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + }, + infl(space) { + vm_do_remove_infl(space) + if (game.vm_available_ops === 0) { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } + }, + done() { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } +} + +states.vm_tst_6 = { + inactive: 'make their free support check.', + prompt() { + /* if (game.vm_available_ops === 0) { + view.prompt = 'Tiananmen Square Track award support check: done.' + gen_action('done') + return + } else {*/ + view.prompt = 'Tiananmen Square Track award: you have a free 2 Ops support check.' + for (let space_id of game.valid_spaces) { + if (space_id) { + gen_action_sc(space_id); + } + } + //} + }, + sc(space) { + push_undo() + game.selected_space = space + if (game.active === DEM && game.persistent_events.includes(58) && spaces[space].country === "East_Germany") { + game.austria_hungary_border_reopened_tracker = true + } + game.state = 'vm_tst_6_sc' + }, + /*done () { + push_undo() + vm_next() + }*/ +} + +states.vm_tst_6_sc = { + inactive: 'do support check.', + prompt () { + view.prompt = `Support check: ${spaces[game.selected_space].name_unique}. Roll a die` + gen_action('roll') + }, + roll() { + clear_undo() + do_sc(game.selected_space) + game.vm_available_ops-- + game.valid_spaces = [] + game.state = 'vm_tst_6' + vm_next() + return + } +} + +states.vm_tst_8 = { + inactive: 'use Tiananmen Square Track award.', + prompt() { + if (game.vm_event_to_do && game.vm_infl_to_do) { + view.prompt = 'Choose whether to play for event or operations first.' + gen_action('event') + gen_action('ops') + } + else if (!game.vm_event_to_do && game.vm_infl_to_do) { + view.prompt = 'Event resolved. Use card for operations.' + gen_action('ops') + } + else if (game.vm_event_to_do && !game.vm_infl_to_do) { + view.prompt = 'Operations resolved. Use card for event.' + gen_action('event') + } + else if (!game.vm_event_to_do && !game.vm_infl_to_do) { + view.prompt = 'Event and operations: done.' + gen_action('end_round') + } + }, + event() { + push_undo() + log('Event') + game.vm_event_to_do = false + game.return_state = 'vm_tst_8' + game.return = game.active + game.vm_event = game.played_card + goto_vm(game.vm_event) + }, + ops() { + push_undo() + log('Operations') + game.vm_infl_to_do = false + game.return = game.active + game.return_state = 'vm_tst_8' + goto_vm(208) + }, + end_round() { + push_undo() + game.tst_8 = true + end_round() + } +} + + +states.vm_tst_8_ops = { + inactive: 'play card for operations.', + prompt() { + view.prompt = `Play ${clean_name(cards[game.played_card].name)} for:` + gen_action('influence') + gen_action('support_check') + if ((game.active === DEM && game.dem_tst_attempted_this_turn === 0 ) || (game.active === COM && game.com_tst_attempted_this_turn === 0 )) { + gen_action('tst') + } + }, + influence(){ + push_undo() + game.vm_available_ops = cards[game.played_card].ops + valid_spaces_infl() + // If ABHR - Set AHBR tracker to true + if (game.persistent_events.includes(58)) { + game.austria_hungary_border_reopened_tracker = true + } + game.state = 'vm_add_infl' + }, + support_check() { + push_undo() + game.vm_available_ops = 2 + game.state = 'vm_support_check_prep' + }, + tst() { + push_undo() + game.state = 'vm_tiananmen_square_attempt' + } +} + +// ========================= POWER STRUGGLE STATES ======================== + +states.vm_scare_tactics = { + inactive: 'remove a Support Point.', + prompt () { + if (game.valid_spaces.length === 0 && game.vm_available_ops > 0) { + view.prompt = `${clean_name(cards[this_card()].name)}: no SPs to remove.` + gen_action('done') + return + } + if (game.vm_available_ops === 0 ) { + view.prompt = `${clean_name(cards[this_card()].name)}. Remove SPs: done.` + gen_action('done') + return + } + view.prompt = `${clean_name(cards[this_card()].name)}: remove ${pluralize(game.vm_available_ops, 'opponent SP')}${event_prompt()}.` + for (let space_id of game.valid_spaces) { + gen_action_infl(space_id); + } + }, + infl(space) { + push_undo() + vm_do_remove_infl(space) + }, + done() { + if (game.summary.length > 0) { + pop_summary() + log_br() + } + vm_next() + } +} + +states.vm_support_surges_1 = { + inactive: 'draw cards.', + prompt() { + view.prompt = 'Support Surges: draw a card.' + gen_action('draw') + }, + draw() { + if (game.active === DEM) { + //console.log('hand before', game.dem_pwr_hand) + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length+1, game.com_pwr_hand.length) + game.temp = game.dem_pwr_hand[game.dem_pwr_hand.length-1] + //console.log('hand after', game.dem_pwr_hand, 'game.temp', game.temp) + } else { + //console.log('hand before', game.com_pwr_hand) + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length, game.com_pwr_hand.length+1) + game.temp = game.com_pwr_hand[game.com_pwr_hand.length-1] + //console.log('hand after', game.com_pwr_hand, 'game.temp', game.temp) + } + game.state = 'vm_support_surges_2' + + //game.phase = 0 + //log('Drew 2 cards') + //log('Surrenders initiative') + //vm_next() + } +} + +states.vm_support_surges_2 = { + inactive: 'draw cards.', + prompt() { + let special = [49,50,51,52] + let elite_leader = [37,38,39,40] + if (special.includes(game.temp)) { + view.prompt = `Support Surges: you drew ${power_cards[game.temp].name}. Draw a second card.` + } + else if (elite_leader.includes(game.temp)) { + view.prompt = `Support Surges: you drew an ${power_cards[game.temp].name}. Draw a second card.` + } + else if (numberless_cards.includes(game.temp)) { + view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name}. Draw a second card.` + } else { + view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name} ${power_cards[game.temp].value}. Draw a second card.` + } + gen_action('draw') + }, + draw() { + if (game.active === DEM) { + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length+1, game.com_pwr_hand.length) + game.temp = game.dem_pwr_hand[game.dem_pwr_hand.length - 1] + } else { + draw_cards(game.power_struggle_deck, game.dem_pwr_hand, game.com_pwr_hand, game.dem_pwr_hand.length, game.com_pwr_hand.length+1) + game.temp = game.com_pwr_hand[game.com_pwr_hand.length - 1] + } + game.state = 'vm_support_surges_3' + /*game.phase = 0 + log('Drew 2 cards') + log('Surrenders initiative') + vm_next()*/ + } +} + +states.vm_support_surges_3 = { + inactive: 'draw cards.', + prompt() { + if (numberless_cards.includes(game.temp)) { + view.prompt = `Support Surges: you drew ${power_cards[game.temp].name}. Done.` + } else { + view.prompt = `Support Surges: you drew a ${power_cards[game.temp].name} ${power_cards[game.temp].value}. Done.` + } + gen_action('done') + }, + done() { + game.phase = 0 + delete game.temp + log('Drew 2 cards') + log('Surrenders initiative') + vm_next() + } +} + +states.vm_support_falters = { + inactive: 'discard cards.', + prompt() { + if ((game.active === DEM && game.dem_pwr_hand.length === 0) || (game.active === COM && game.com_pwr_hand.length === 0)) { + view.prompt = 'Support Falters: no remaining cards to discard.' + gen_action('pass') + } else if (game.vm_available_ops > 0) { + view.prompt = 'Support Falters: discard a card.' + gen_action('discard') + } else { + view.prompt = 'Support Falters: done.' + gen_action('done') + } + }, + discard() { + if (game.active === DEM) {discard_card(game.dem_pwr_hand)} + else {discard_card(game.com_pwr_hand)} + game.vm_available_ops -- + }, + pass() { + log_msg_gap('Takes initiative') + game.return = game.active + vm_next() + }, + done() { + log_gap('Takes initiative') + game.return = game.active + vm_next() + } +} + +/* =================== EVENTS ================================ */ + +// #region GENERATED EVENT CODE +const CODE = [] + +CODE[1] = [ // Legacy of Martial Law* + [ vm_permanently_remove ], + [ vm_valid_spaces_country_opp, 'Poland' ], + [ vm_prompt, 'replace 1 Democratic SP in Poland with a Communist SP' ], + [ vm_legacy_of_martial_law ], + [ vm_valid_spaces_country_sc, 'Poland' ], + [ vm_prompt, 'make a Support Check in Poland' ], + [ vm_1_support_check ], + [ vm_return ], +] + +CODE[2] = [ // Solidarity Legalised* + [ vm_permanently_remove ], + [ vm_solidarity_legalised ], + [ vm_valid_spaces_solidarity_legalised ], + [ vm_prompt, 'to every uncontrolled Worker and Farmer space in Poland' ], + [ vm_add_limited_infl, 9, 1 ], + [ vm_return ], +] + +CODE[3] = [ // Walesa + [ vm_permanently_remove ], + [ vm_valid_spaces_country, 'Poland' ], + [ vm_prompt, 'any space(s) in Poland' ], + [ vm_add_infl_free, 4 ], + [ vm_valid_spaces_country_sc, 'Poland' ], + [ vm_prompt, 'make Support Checks in Poland' ], + [ vm_support_check, 2 ], + [ vm_return ], +] + +CODE[4] = [ // Michnik + [ vm_permanently_remove ], + [ vm_valid_spaces, 26 ], + [ vm_prompt, 'the Polish Intellectuals space' ], + [ vm_add_x_infl, 3 ], + [ vm_return ], +] + +CODE[5] = [ // General strike + [ vm_general_strike ], + [ vm_return ], +] + +CODE[6] = [ // Brought in for Questioning + [ vm_brought_in_for_questioning ], + [ vm_return ], +] + +CODE[7] = [ // State Run Media* + [ vm_permanently_remove ], + [ vm_valid_spaces_opponent ], + [ vm_remove_limited_opp_infl, 4, 2 ], + [ vm_return ], +] + +CODE[8] = [ // Prudence + [ vm_prudence ], + [ vm_return ], +] + +CODE[9] = [ // The Wall* + [ vm_permanently_remove ], + [ vm_the_wall ], + [ vm_return ], +] + +CODE[10] = [ // Cult of Personality + [ vm_permanently_remove ], + [ vm_if, ()=>!game.the_tyrant_is_gone ], + [ vm_valid_spaces_country_socio_2, 'Romania', 3, 4 ], + [ vm_prompt, 'Worker or Farmer spaces in Romania, no more than 2 per space' ], + [ vm_add_limited_infl, 4, 2 ], + [ vm_else ], + [ vm_tyrant_block ], + [ vm_endif ], + [ vm_return ], +] + +CODE[11] = [ // Dissident arrested + [ vm_valid_spaces_opponent_socio, 5 ], + [ vm_prompt, 'any Intellectuals space' ], + [ vm_remove_x_opp_infl, 2 ], + [ vm_return ], +] + +CODE[12] = [ // Apparatchicks + [ vm_permanently_remove ], + [ vm_valid_spaces_socio, 2 ], + [ vm_prompt, ' to any Bureaucratic space(s)' ], + [ vm_add_infl_free, 3 ], + [ vm_return ], +] + +CODE[13] = [ // Stasi + [ vm_permanently_remove ], + [ vm_stasi ], + [ vm_return ], +] + +CODE[14] = [ // Gorbachev Charms the West + [ vm_valid_spaces_opponent ], + [ vm_remove_opp_infl, 2 ], + [ vm_valid_spaces_sc ], + [ vm_prompt, 'select a space for the Support Check' ], + [ vm_1_support_check ], + [ vm_return ], +] + +CODE[15] = [ // Honecker + [ vm_permanently_remove ], + [ vm_honecker ], + [ vm_return ], +] + +CODE[16] = [ // Nomenklatura* + [ vm_permanently_remove ], + [ vm_nomenklatura ], + [ vm_return ], +] + +CODE[17] = [ // Roundtable talks + [ vm_roundtable_talks ], + [ vm_return ], +] + +CODE[18] = [ // Poszgay Defends the Revolution + [ vm_permanently_remove ], + [ vm_poszgay ], + [ vm_prompt, 'to 4 spaces in Hungary not under Democratic control' ], + [ vm_add_limited_infl, 4, 1 ], + [ vm_return ], +] + +CODE[19] = [ // Papal vist + [ vm_permanently_remove ], + [ vm_valid_spaces, 20, 35, 38 ], + [ vm_prompt, 'any Catholic Church space' ], + [ vm_add_x_infl, 3 ], + [ vm_return ], +] + +CODE[20] = [ // Deutsche Marks* + [ vm_permanently_remove ], + [ vm_deutsche_marks ], + [ vm_return ], +] + +CODE[21] = [ // Common European Home + [ vm_common_european_home ], + [ vm_return ], +] + +CODE[22] = [ // Power Struggle - Poland + [ vm_power_struggle ], + [ vm_return ], +] + +CODE[23] = [ // Power Struggle - Hungary + [ vm_power_struggle ], + [ vm_return ], +] + +CODE[24] = [ // St Nicolas Church + [ vm_permanently_remove ], + [ vm_valid_spaces, 6 ], + [ vm_prompt, 'the Lutheran Church' ], + [ vm_take_control_prep, 1 ], + [ vm_st_nicholas_church ], + [ vm_return ], +] + +CODE[25] = [ // Perestroika + [ vm_permanently_remove ], + [ vm_perestroika ], + [ vm_return ], +] + +CODE[26] = [ // Helsinki Final Act* + [ vm_permanently_remove ], + [ vm_helsinki_final_act ], + [ vm_return ], +] + +CODE[27] = [ // Consumerism + [ vm_valid_spaces_opponent_socio, 4 ], + [ vm_prompt, ' from a Worker space' ], + [ vm_remove_opp_infl, 1 ], + [ vm_valid_spaces_opponent_socio, 4 ], + [ vm_active_country ], + [ vm_prompt, ()=>`make a support check in a Worker space in ${country_name(game.vm_active_country)}` ], + [ vm_1_support_check ], + [ vm_return ], +] + +CODE[28] = [ // Factory Party Cells + [ vm_valid_spaces_opponent_socio, 4 ], + [ vm_prompt, ' from Worker spaces' ], + [ vm_remove_limited_opp_infl, 3, 2 ], + [ vm_return ], +] + +CODE[29] = [ // Jan Palach Week* + [ vm_permanently_remove ], + [ vm_valid_spaces, 30 ], + [ vm_prompt, 'the Charles University space' ], + [ vm_add_x_infl, 6 ], + [ vm_return ], +] + +CODE[30] = [ // Tear Gas + [ vm_tear_gas ], + [ vm_return ], +] + +CODE[31] = [ // Intelligentsia + [ vm_valid_spaces, 4, 26, 31, 46, 55, 73 ], + [ vm_prompt, 'Intellectual spaces, no more than 2 per space' ], + [ vm_add_limited_infl, 4, 2 ], + [ vm_return ], +] + +CODE[32] = [ // Peasant Parties* + [ vm_permanently_remove ], + [ vm_valid_spaces_socio, 3 ], + [ vm_prompt, 'Farmer spaces, no more than 2 per space' ], + [ vm_add_limited_infl, 4, 2 ], + [ vm_return ], +] + +CODE[33] = [ // Sajudis* + [ vm_permanently_remove ], + [ vm_sajudis_check ], + [ vm_prompt, 'any Minorities space' ], + [ vm_take_control_prep, 1 ], + [ vm_sajudis ], + [ vm_return ], +] + +CODE[34] = [ // Fidesz* + [ vm_permanently_remove ], + [ vm_valid_spaces, 47 ], + [ vm_prompt, 'the Hungary students space' ], + [ vm_add_x_infl, 5 ], + [ vm_return ], +] + +CODE[35] = [ // Heal our Bleeding Wounds* + [ vm_permanently_remove ], + [ vm_heal_our_bleeding_wounds ], + [ vm_return ], +] + +CODE[36] = [ // Dash for the West* + [ vm_permanently_remove ], + [ vm_prompt, 'Dash for the West: select any Democratic event with an asterix(*) from the discard pile. Event occurs immediately' ], + [ vm_dash_for_the_west ], + [ vm_return ], +] + +CODE[37] = [ // Nagy Reburied* + [ vm_permanently_remove ], + [ vm_nagy_reburied ], + [ vm_prompt, 'the Hungary Elite space' ], + [ vm_remove_all_infl, 1 ], + [ vm_valid_spaces_country, 'Hungary' ], + [ vm_prompt, 'Hungary, no more than 2 per space' ], + [ vm_add_limited_infl, 4, 2 ], + [ vm_return ], +] + +CODE[38] = [ // July Concept + [ vm_permanently_remove ], + [ vm_valid_spaces_country, 'Bulgaria' ], + [ vm_prompt, 'Bulgaria' ], + [ vm_add_infl_free, 3 ], + [ vm_return ], +] + +CODE[39] = [ // Eco-Glasnost* + [ vm_permanently_remove ], + [ vm_valid_spaces, 66 ], + [ vm_prompt, 'Ruse' ], + [ vm_add_x_infl, 4 ], + [ vm_eco_glasnost ], + [ vm_return ], +] + +CODE[40] = [ // Hungarian Democratic Forum + [ vm_permanently_remove ], + [ vm_valid_spaces_country, 'Hungary' ], + [ vm_prompt, 'Hungary' ], + [ vm_add_infl_free, 3 ], + [ vm_valid_spaces_country_sc, 'Hungary' ], + [ vm_prompt, 'make a Support Check in Hungary' ], + [ vm_1_support_check ], + [ vm_return ], +] + +CODE[41] = [ // Ceausescu* + [ vm_permanently_remove ], + [ vm_if, ()=>!game.the_tyrant_is_gone ], + [ vm_valid_spaces_country_opp, 'Romania' ], + [ vm_prompt, ' from Romania' ], + [ vm_remove_opp_infl, 3 ], + [ vm_valid_spaces_country_sc, 'Romania' ], + [ vm_prompt, 'make a support check in Romania' ], + [ vm_1_support_check ], + [ vm_prompt, ' from Bucharesti' ], + [ vm_ceausescu ], + [ vm_else ], + [ vm_tyrant_block ], + [ vm_endif ], + [ vm_return ], +] + +CODE[42] = [ // Power Struggle - East Germany + [ vm_power_struggle ], + [ vm_return ], +] + +CODE[43] = [ // Power Struggle - Bulgaria + [ vm_power_struggle ], + [ vm_return ], +] + +CODE[44] = [ // Inflationary Currency + [ vm_permanently_remove ], + [ vm_inflationary_currency ], + [ vm_valid_spaces_country_opp ], + [ vm_prompt, ()=>` from ${country_name(game.vm_active_country)}` ], + [ vm_remove_opp_infl, 2 ], + [ vm_inflationary_currency_discard ], + [ vm_if, ()=>!discarded_card() ], + [ vm_valid_spaces_country_sc ], + [ vm_prompt, ()=>`make a Support Check in ${country_name(game.vm_active_country)}` ], + [ vm_1_support_check ], + [ vm_endif ], + [ vm_return ], +] + +CODE[45] = [ // Soviet Troop Withdrawals* + [ vm_permanently_remove ], + [ vm_valid_spaces_region_opp, 'Eastern Europe' ], + [ vm_prompt, ' from Eastern Europe' ], + [ vm_remove_limited_opp_infl, 5, 2 ], + [ vm_return ], +] + +CODE[46] = [ // Goodbye Lenin!* + [ vm_permanently_remove ], + [ vm_goodbye_lenin ], + [ vm_return ], +] + +CODE[47] = [ // Bulgarian Turks Expelled* + [ vm_permanently_remove ], + [ vm_bulgarian_turks_expelled ], + [ vm_prompt, 'Razgrad' ], + [ vm_remove_all_infl, 1 ], + [ vm_return ], +] + +CODE[48] = [ // We are the People!* + [ vm_permanently_remove ], + [ vm_we_are_the_people ], + [ vm_return ], +] + +CODE[49] = [ // Foreign Currency Debt Burden* + [ vm_permanently_remove ], + [ vm_foreign_currency_debt_burden ], + [ vm_return ], +] + +CODE[50] = [ // The Sinatra Doctrine* + [ vm_permanently_remove ], + [ vm_the_sinatra_doctrine ], + [ vm_return ], +] + +CODE[51] = [ // 40th Anniversary Celebration* + [ vm_permanently_remove ], + [ vm_40th_anniversary_celebration ], + [ vm_valid_spaces_country, 'East_Germany' ], + [ vm_prompt, 'East Germany' ], + [ vm_add_infl_free ], + [ vm_40th_anniversary_celebration_vp ], + [ vm_return ], +] + +CODE[52] = [ // Normalisation + [ vm_permanently_remove ], + [ vm_normalisation ], + [ vm_prompt, 'the Czechoslovakia Elite and Bureaucrat Spaces' ], + [ vm_remove_all_infl, 2 ], + [ vm_return ], +] + +CODE[53] = [ // Li Peng* + [ vm_permanently_remove ], + [ vm_li_peng ], + [ vm_return ], +] + +CODE[54] = [ // The Crowd Turns Against Ceausescu* + [ vm_the_crowd_turns_against_ceausescu ], + [ vm_return ], +] + +CODE[55] = [ // Power Struggle - Czechoslovakia + [ vm_power_struggle ], + [ vm_return ], +] + +CODE[56] = [ // Foreign Television + [ vm_permanently_remove ], + [ vm_foreign_television ], + [ vm_remove_limited_opp_infl, 4, 2 ], + [ vm_return ], +] + +CODE[57] = [ // Central Committee Reshuffle* + [ vm_permanently_remove ], + [ vm_central_committee_reshuffle ], + [ vm_prompt, ()=>`${country_name(game.vm_active_country)}` ], + [ vm_add_infl_free, 3 ], + [ vm_return ], +] + +CODE[58] = [ // Austria-Hungary Border Reopened* + [ vm_austria_hungary_border_reopened ], + [ vm_return ], +] + +CODE[59] = [ // GrenzTruppen* + [ vm_grenztruppen ], + [ vm_return ], +] + +CODE[60] = [ // Toxic Waste* + [ vm_permanently_remove ], + [ vm_valid_spaces_socio, 4 ], + [ vm_prompt, 'any Worker space(s)' ], + [ vm_add_infl_free, 3 ], + [ vm_return ], +] + +CODE[61] = [ // The Monday Demonstrations* + [ vm_permanently_remove ], + [ vm_the_monday_demonstrations ], + [ vm_prompt, 'the Lutheran Church Space and Leipzig' ], + [ vm_take_control_prep, 2 ], + [ vm_valid_spaces_country_sc, 'East_Germany' ], + [ vm_prompt, 'make 5 Support Checks in East Germany' ], + [ vm_support_check, 5 ], + [ vm_return ], +] + +CODE[62] = [ // Yakovlev Counsels Gorbachev* + [ vm_yakovlev_counsels_gorbachev ], + [ vm_return ], +] + +CODE[63] = [ // Genscher* + [ vm_genscher ], + [ vm_return ], +] + +CODE[64] = [ // Legacy of 1968* + [ vm_permanently_remove ], + [ vm_legacy_of_1968 ], + [ vm_prompt, 'all spaces in Czechoslovakia not controlled by the Communist Player' ], + [ vm_add_limited_infl, 11, 1 ], + [ vm_return ], +] + +CODE[65] = [ // Presidential Visit* + [ vm_permanently_remove ], + [ vm_presidential_visit ], + [ vm_return ], +] + +CODE[66] = [ // New Forum + [ vm_permanently_remove ], + [ vm_valid_spaces_country, 'East_Germany' ], + [ vm_prompt, '3 spaces in East Germany' ], + [ vm_add_limited_infl, 3, 1 ], + [ vm_return ], +] + +CODE[67] = [ // Reformer Rehabilitated* + [ vm_prompt, 'Reformer Rehabilitated: chose any non-scoring card in the discard pile. Event takes place immediately' ], + [ vm_reformer_rehabilitated ], + [ vm_return ], +] + +CODE[68] = [ // Klaus and Komarek* + [ vm_permanently_remove ], + [ vm_klaus_and_komarek ], + [ vm_prompt, 'Prague' ], + [ vm_remove_x_opp_infl, 2 ], + [ vm_valid_spaces, 29 ], + [ vm_add_x_infl, 2 ], + [ vm_return ], +] + +CODE[69] = [ // Systematization* + [ vm_permanently_remove ], + [ vm_valid_spaces_country, 'Romania' ], + [ vm_systematization ], + [ vm_return ], +] + +CODE[70] = [ // Securitate* + [ vm_securitate ], + [ vm_return ], +] + +CODE[71] = [ // Kiss of Death* + [ vm_permanently_remove ], + [ vm_kiss_of_death ], + [ vm_return ], +] + +CODE[72] = [ // Peasant Parties Revolt + [ vm_peasant_parties_revolt ], + [ vm_return ], +] + +CODE[73] = [ // Laszlo Tokes* + [ vm_permanently_remove ], + [ vm_valid_spaces, 50, 56 ], + [ vm_prompt, 'in Timisoara and Harghita/Covasna' ], + [ vm_add_limited_infl, 2, 1 ], + [ vm_laszlo_tokes ], + [ vm_if, ()=>game.phase === 3 ], + [ vm_prompt, ' in Romania' ], + [ vm_add_infl ], + [ vm_else ], + [ vm_prompt, 'make 2 Support Checks in Romania' ], + [ vm_support_check, 2 ], + [ vm_endif ], + [ vm_return ], +] + +CODE[74] = [ // FRG Embassies + [ vm_frg_embassies ], + [ vm_return ], +] + +CODE[75] = [ // Exit Visas* + [ vm_permanently_remove ], + [ vm_exit_visas ], + [ vm_return ], +] + +CODE[76] = [ // Warsaw Pact Summit + [ vm_permanently_remove ], + [ vm_warsaw_pact_summit ], + [ vm_if, ()=>game.phase === 3 ], + [ vm_prompt, ' spaces with no Democratic SPs' ], + [ vm_add_infl_free, 4 ], + [ vm_else ], + [ vm_prompt, 'Select a Student or Intellectual space' ], + [ vm_valid_spaces_country_socio_2, 3,, 4 ], + [ vm_support_check_modified, 2, 2 ], + [ vm_endif ], + [ vm_return ], +] + +CODE[77] = [ // Samizdat + [ vm_permanently_remove ], + [ vm_samizdat ], + [ vm_return ], +] + +CODE[78] = [ // Workers Revolt + [ vm_workers_revolt ], + [ vm_return ], +] + +CODE[79] = [ // The Third Way* + [ vm_permanently_remove ], + [ vm_the_third_way ], + [ vm_valid_spaces, 4 ], + [ vm_prompt, 'the East German Writers space' ], + [ vm_add_x_infl, 3 ], + [ vm_return ], +] + +CODE[80] = [ // Nepotism* + [ vm_permanently_remove ], + [ vm_nepotism ], + [ vm_valid_spaces_region_socio, 'Balkans', 4 ], + [ vm_prompt, 'Worker spaces in the Balkans' ], + [ vm_add_infl_free ], + [ vm_return ], +] + +CODE[81] = [ // The Baltic Way* + [ vm_permanently_remove ], + [ vm_the_baltic_way ], + [ vm_prompt, 'any Minorities space' ], + [ vm_take_control_prep, 1 ], + [ vm_return ], +] + +CODE[82] = [ // Spitzel* + [ vm_permanently_remove ], + [ vm_valid_spaces_country_opp, 'East_Germany' ], + [ vm_prompt, ' from East Germany' ], + [ vm_remove_opp_infl, 2 ], + [ vm_return ], +] + +CODE[83] = [ // Modrow* + [ vm_permanently_remove ], + [ vm_modrow ], + [ vm_valid_spaces_country, 'East_Germany' ], + [ vm_prompt, 'East Germany, no more than 2 per space' ], + [ vm_add_limited_infl, 4, 2 ], + [ vm_return ], +] + +CODE[84] = [ // Breakaway Baltic Republics* + [ vm_permanently_remove ], + [ vm_breakaway_baltic_republics ], + [ vm_prompt, 'any Minorities space' ], + [ vm_take_control_prep, 1 ], + [ vm_valid_spaces_sc ], + [ vm_prompt, 'select a space for the support check' ], + [ vm_1_support_check ], + [ vm_return ], +] + +CODE[85] = [ // Tank Column/Tank Man* + [ vm_permanently_remove ], + [ vm_tank_column ], + [ vm_return ], +] + +CODE[86] = [ // The Wall Must Go!* + [ vm_permanently_remove ], + [ vm_the_wall_must_go ], + [ vm_remove_infl, 3 ], + [ vm_return ], +] + +CODE[87] = [ // Kohl Proposes Reunification* + [ vm_permanently_remove ], + [ vm_kohl_proposes_reunification ], + [ vm_return ], +] + +CODE[88] = [ // Adamec* + [ vm_permanently_remove ], + [ vm_adamec ], + [ vm_valid_spaces_country, 'Czechoslovakia' ], + [ vm_prompt, 'Czechoslovakia' ], + [ vm_add_limited_infl, 4, 2 ], + [ vm_return ], +] + +CODE[89] = [ // Domino Theory* + [ vm_prompt, 'Domino Theory: choose a Power Struggle card to play from the discard pile' ], + [ vm_permanently_remove ], + [ vm_domino_theory ], + [ vm_return ], +] + +CODE[90] = [ // Civic Forum* + [ vm_permanently_remove ], + [ vm_valid_spaces_country, 'Czechoslovakia' ], + [ vm_prompt, 'Czechoslovakia' ], + [ vm_add_infl_free, 4 ], + [ vm_civic_forum ], + [ vm_valid_spaces_country_sc, 'Czechoslovakia' ], + [ vm_prompt, 'Select a space in Czechoslovakia' ], + [ vm_support_check, 2 ], + [ vm_return ], +] + +CODE[91] = [ // My First Banana* + [ vm_permanently_remove ], + [ vm_valid_spaces_country_opp, 'East_Germany' ], + [ vm_prompt, ' from East Germany' ], + [ vm_remove_opp_infl, 2 ], + [ vm_valid_spaces_country_sc, 'East_Germany' ], + [ vm_prompt, 'select a space in East Germany' ], + [ vm_support_check, 2 ], + [ vm_return ], +] + +CODE[92] = [ // Betrayal + [ vm_permanently_remove ], + [ vm_prompt, 'choose any Orthodox Church space. Replace all Democratic SPs with Communist SPs' ], + [ vm_betrayal ], + [ vm_return ], +] + +CODE[93] = [ // Shock Therapy* + [ vm_permanently_remove ], + [ vm_shock_therapy ], + [ vm_valid_spaces_country ], + [ vm_prompt, ()=>` ${country_name(game.vm_active_country)}` ], + [ vm_add_infl_free, 3 ], + [ vm_return ], +] + +CODE[94] = [ // Union of Democratic Forces* + [ vm_permanently_remove ], + [ vm_valid_spaces_country_opp, 'Bulgaria' ], + [ vm_prompt, ' from Bulgaria' ], + [ vm_remove_opp_infl, 4 ], + [ vm_valid_spaces_country_sc, 'Bulgaria' ], + [ vm_prompt, 'Make 2 Support Checks in Bulgaria' ], + [ vm_support_check, 2 ], + [ vm_return ], +] + +CODE[95] = [ // Power Struggle - Romania + [ vm_power_struggle ], + [ vm_return ], +] + +CODE[96] = [ // The Chinese Solution* + [ vm_permanently_remove ], + [ vm_the_chinese_solution ], + [ vm_valid_spaces_country_sc ], + [ vm_prompt, ()=>`make 5 Support Checks in ${country_name(game.vm_active_country)}` ], + [ vm_support_check_modified, 5, 3 ], + [ vm_return ], +] + +CODE[97] = [ // The Tyrant is Gone* + [ vm_if, ()=>game.persistent_events.includes(54) ], + [ vm_valid_spaces, 51 ], + [ vm_prompt, 'the Romanian Elite Space' ], + [ vm_remove_x_opp_infl, 4 ], + [ vm_the_tyrant_is_gone ], + [ vm_permanently_remove ], + [ vm_else ], + [ vm_the_tyrant_is_gone_prep ], + [ vm_endif ], + [ vm_return ], +] + +CODE[98] = [ // Politburo Intrigue* + [ vm_permanently_remove ], + [ vm_valid_spaces_country_opp, 'Bulgaria' ], + [ vm_prompt, ' from Bulgaria' ], + [ vm_remove_limited_opp_infl, 3, 2 ], + [ vm_valid_spaces_country_sc, 'Bulgaria' ], + [ vm_prompt, 'make a support check in Bulgaria' ], + [ vm_1_support_check ], + [ vm_return ], +] + +CODE[99] = [ // Ligachev* + [ vm_permanently_remove ], + [ vm_ligachev ], + [ vm_return ], +] + +CODE[100] = [ // Stand Fast* + [ vm_permanently_remove ], + [ vm_stand_fast ], + [ vm_return ], +] + +CODE[101] = [ // Elena* + [ vm_permanently_remove ], + [ vm_if, ()=>!game.the_tyrant_is_gone ], + [ vm_valid_spaces, 51 ], + [ vm_prompt, 'the Romania Elite Space' ], + [ vm_add_x_infl, 2 ], + [ vm_elena ], + [ vm_else ], + [ vm_tyrant_block ], + [ vm_endif ], + [ vm_return ], +] + +CODE[102] = [ // National Salvation Front* + [ vm_national_salvation_front ], + [ vm_return ], +] + +CODE[103] = [ // Government Resigns* + [ vm_government_resigns ], + [ vm_prompt, 'any uncontrolled Elite space' ], + [ vm_remove_all_infl, 1 ], + [ vm_permanently_remove ], + [ vm_return ], +] + +CODE[104] = [ // New Year's Eve Party* + [ vm_new_years_eve_party ], + [ vm_return ], +] + +CODE[105] = [ // Public Against Violence* + [ vm_permanently_remove ], + [ vm_valid_spaces, 36 ], + [ vm_prompt, 'Kosice' ], + [ vm_add_x_infl, 2 ], + [ vm_valid_spaces, 37 ], + [ vm_prompt, 'Presov' ], + [ vm_add_x_infl, 2 ], + [ vm_public_against_violence ], + [ vm_prompt, 'Make a Support Check in Bratislava' ], + [ vm_support_check_modified, 1, 2 ], + [ vm_return ], +] + +CODE[106] = [ // Social Democratic Platform Adopted* + [ vm_permanently_remove ], + [ vm_social_democratic_platform_adopted ], + [ vm_valid_spaces_country ], + [ vm_prompt, ()=>`${country_name(game.vm_active_country)}` ], + [ vm_add_infl_free, 2 ], + [ vm_valid_spaces_country_sc ], + [ vm_prompt, ()=>`make a Support Check in ${country_name(game.vm_active_country)}` ], + [ vm_1_support_check ], + [ vm_return ], +] + +CODE[107] = [ // Massacre in Timisoara* + [ vm_permanently_remove ], + [ vm_if, ()=>!game.the_tyrant_is_gone ], + [ vm_massacre_in_timisoara ], + [ vm_valid_spaces_country_sc, 'Romania' ], + [ vm_prompt, 'Make Support Checks in Romania' ], + [ vm_support_check_modified, 2, 2 ], + [ vm_else ], + [ vm_tyrant_block ], + [ vm_endif ], + [ vm_return ], +] + +CODE[108] = [ // Army Backs Revolution* + [ vm_permanently_remove ], + [ vm_army_backs_revolution ], + [ vm_return ], +] + +CODE[109] = [ // Kremlin Coup* + [ vm_permanently_remove ], + [ vm_kremlin_coup ], + [ vm_return ], +] + +CODE[110] = [ // Malta Summit* + [ vm_permanently_remove ], + [ vm_malta_summit ], + [ vm_prompt, ' from Elite spaces' ], + [ vm_remove_opp_infl, 5 ], + [ vm_return ], +] +// #endregion + + +// ============= TIANANMEN SQUARE TRACK AWARDS ==================== +CODE[203] = [//Tiananmen Square space 3 award + [vm_tst_3], + [vm_return] +] +CODE[204] = [//Tiananmen Square space 4 award + [vm_valid_spaces_opponent], + [vm_tst_4], + [vm_return] +] +CODE[206] = [//Tiananmen Square space 6 + [vm_valid_spaces_sc], + [vm_tst_6], + [vm_return] +] +CODE[208] = [//Tiananmen Square space 8 event + [vm_tst_8], + [vm_return] +] + +// ============= POWER STRUGGLE WILDCARDS ========================= + +CODE[349] = [//Scare Tactics + [vm_scare_tactics], + [vm_valid_spaces_country_opp], + [vm_prompt, ()=>` from ${country_name(game.vm_active_country)}`], + [vm_remove_opp_infl, 1], + [vm_return] +] +CODE[350] = [//Support Surges + [vm_support_surges], + [vm_return] +] +CODE[351] = [//Support Falters + [vm_support_falters], + [vm_return] +] -- cgit v1.2.3 From 5d81b4294bd8f9b20ac8a396a185f6cf9550c00f Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Fri, 25 Oct 2024 11:58:58 +0200 Subject: Update client. Fixed some spelling errors in space data table. Create tools directory and add Makefile. Add layout.svg with boxes drawn on top of locations. Add genlayout.js to create list of box locations. Add gencolors.js to create beveled marker border colors. Major rewrite of play.js and play.css with official assets. --- Makefile | 9 + data.js | 1355 +++++++++++++++++++++++++++++++++++++++++++++++--- gencode.js | 107 ---- images/trash-can.svg | 1 + info/cards.html | 193 +++++++ play.css | 1010 +++++++++++++------------------------ play.html | 236 ++++----- play.js | 1080 +++++++++++++++++----------------------- rules.js | 71 ++- tools/colors.js | 110 ++++ tools/gencode.js | 106 ++++ tools/gencolors.js | 78 +++ tools/genlayout.js | 37 ++ tools/layout.svg | 920 ++++++++++++++++++++++++++++++++++ 14 files changed, 3651 insertions(+), 1662 deletions(-) create mode 100644 Makefile delete mode 100644 gencode.js create mode 100644 images/trash-can.svg create mode 100644 info/cards.html create mode 100644 tools/colors.js create mode 100644 tools/gencode.js create mode 100644 tools/gencolors.js create mode 100644 tools/genlayout.js create mode 100644 tools/layout.svg (limited to 'play.css') diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..daa5c21 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +default: rules.js play.js +rules.js: events.txt + sed '/const CODE /,$$d' < rules.js > /tmp/rules.js + node tools/gencode.js >> /tmp/rules.js + cp /tmp/rules.js rules.js +play.js: tools/layout.svg + sed '/var LAYOUT /,$$d' < play.js > /tmp/play.js + node tools/genlayout.js >> /tmp/play.js + cp /tmp/play.js play.js diff --git a/data.js b/data.js index 17e7530..6c37c50 100644 --- a/data.js +++ b/data.js @@ -1,80 +1,1280 @@ -const spaces = [ - null, - {name_unique: 'Schwerin', space_id: 1, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 111, y: 61}, adjacent: [2, 3, , , ]}, - {name_unique: 'Rostock', space_id: 2, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 228, y: 41}, adjacent: [1, 3, , , ]}, - {name_unique: 'Berlin', space_id: 3, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'East_Germany', region: 'Eastern Europe', box: {x: 251, y: 113}, adjacent: [1, 2, 5, 9, ]}, - {name_unique: 'German Writers', space_id: 4, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 58, y: 185}, adjacent: [5, , , , ]}, - {name_unique: 'Walter Ulbricht Academy', space_id: 5, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 175, y: 187}, adjacent: [3, 4, , , ]}, - {name_unique: 'Lutherian Church', space_id: 6, socio: 7, stability: 5, battleground: 1, demInfl: 1, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 300, y: 212}, adjacent: [9, , , , ]}, - {name_unique: 'Magdeburg', space_id: 7, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 58, y: 275}, adjacent: [8, 10, 11, , ]}, - {name_unique: 'Halle', space_id: 8, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 175, y: 278}, adjacent: [7, 9, 11, , ]}, - {name_unique: 'Leipzig', space_id: 9, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 297, y: 297}, adjacent: [3, 6, 8, 11, 12]}, - {name_unique: 'Erfurt', space_id: 10, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 23, y: 356}, adjacent: [7, , , , ]}, - {name_unique: 'Karl-Marx-Stadt', space_id: 11, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'East_Germany', region: 'Eastern Europe', box: {x: 138, y: 385}, adjacent: [7, 8, 9, 12, ]}, - {name_unique: 'Dresden', space_id: 12, socio: 1, stability: 4, battleground: 1, demInfl: 0, comInfl: 2, country: 'East_Germany', region: 'Eastern Europe', box: {x: 262, y: 375}, adjacent: [9, 11, 19, 27, ]}, - {name_unique: 'Szczecin', space_id: 13, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 434, y: 204}, adjacent: [14, 16, , , ]}, - {name_unique: 'Gdańsk', space_id: 14, socio: 4, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 699, y: 215}, adjacent: [13, 15, 16, 17, 18]}, - {name_unique: 'Bydgoszcz', space_id: 15, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 679, y: 304}, adjacent: [14, 17, , , ]}, - {name_unique: 'Poznań', space_id: 16, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 521, y: 355}, adjacent: [13, 14, 19, 20, ]}, - {name_unique: 'Warszawa', space_id: 17, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 806, y: 383}, adjacent: [14, 15, 18, 21, 24]}, - {name_unique: 'Białystok', space_id: 18, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 940, y: 342}, adjacent: [14, 17, 24, , ]}, - {name_unique: 'Wrocław', space_id: 19, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 462, y: 443}, adjacent: [12, 16, 20, 22, ]}, - {name_unique: 'Catholic Church, Poland', space_id: 20, socio: 7, stability: 5, battleground: 0, demInfl: 5, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 625, y: 437}, adjacent: [16, 19, 21, 22, 23]}, - {name_unique: 'Łódź', space_id: 21, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 749, y: 486}, adjacent: [17, 20, 23, 24, ]}, - {name_unique: 'Katowice', space_id: 22, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 570, y: 569}, adjacent: [19, 20, 23, 33, ]}, - {name_unique: 'Kraków', space_id: 23, socio: 4, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 711, y: 598}, adjacent: [20, 21, 22, 25, ]}, - {name_unique: 'Lublin', space_id: 24, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Poland', region: 'Eastern Europe', box: {x: 879, y: 603}, adjacent: [17, 18, 21, , ]}, - {name_unique: 'Jagiellian University', space_id: 25, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 679, y: 681}, adjacent: [23, 26, , , ]}, - {name_unique: 'Polish Writers', space_id: 26, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Poland', region: 'Eastern Europe', box: {x: 832, y: 694}, adjacent: [25, , , , ]}, - {name_unique: 'Plzeň', space_id: 27, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 2, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 159, y: 483}, adjacent: [12, 28, 29, , ]}, - {name_unique: 'České Budĕjovice', space_id: 28, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 196, y: 601}, adjacent: [27, 29, , , ]}, - {name_unique: 'Praha', space_id: 29, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 317, y: 614}, adjacent: [27, 28, 30, 32, ]}, - {name_unique: 'Charles University', space_id: 30, socio: 6, stability: 1, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 380, y: 532}, adjacent: [29, 31, , , ]}, - {name_unique: 'Czech Writers', space_id: 31, socio: 5, stability: 2, battleground: 1, demInfl: 2, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 444, y: 607}, adjacent: [30, , , , ]}, - {name_unique: 'Brno', space_id: 32, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 1, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 403, y: 711}, adjacent: [29, 33, 34, , ]}, - {name_unique: 'Ostrava', space_id: 33, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 523, y: 681}, adjacent: [22, 32, 34, 35, ]}, - {name_unique: 'Bratislava', space_id: 34, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 417, y: 797}, adjacent: [32, 33, 35, , ]}, - {name_unique: 'Catholic Church, Czechoslovakia', space_id: 35, socio: 7, stability: 5, battleground: 0, demInfl: 1, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 538, y: 794}, adjacent: [33, 34, 36, , ]}, - {name_unique: 'Prešov', space_id: 36, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 658, y: 794}, adjacent: [35, 37, , , ]}, - {name_unique: 'Košice', space_id: 37, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Czechoslovakia', region: 'Eastern Europe', box: {x: 777, y: 815}, adjacent: [36, 42, , , ]}, - {name_unique: 'Catholic Church, Hungary', space_id: 38, socio: 7, stability: 5, battleground: 0, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 314, y: 886}, adjacent: [39, 43, , , ]}, - {name_unique: 'Győr', space_id: 39, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 434, y: 887}, adjacent: [38, 40, 43, 44, ]}, - {name_unique: 'Tatabánya', space_id: 40, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 549, y: 886}, adjacent: [39, 41, 45, , ]}, - {name_unique: 'Miskolc', space_id: 41, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 664, y: 901}, adjacent: [40, 42, 45, , ]}, - {name_unique: 'Debrecen', space_id: 42, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 781, y: 938}, adjacent: [37, 41, , , ]}, - {name_unique: 'Szombathely', space_id: 43, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Hungary', region: 'Eastern Europe', box: {x: 316, y: 963}, adjacent: [38, 39, 44, , ]}, - {name_unique: 'Székesfehérvár', space_id: 44, socio: 4, stability: 3, battleground: 0, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 442, y: 962}, adjacent: [39, 43, 45, , ]}, - {name_unique: 'Budapest', space_id: 45, socio: 2, stability: 3, battleground: 1, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 630, y: 983}, adjacent: [40, 41, 44, 47, 48]}, - {name_unique: 'Hungarian Writers', space_id: 46, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 348, y: 1040}, adjacent: [47, , , , ]}, - {name_unique: 'Eötvös Loránd University', space_id: 47, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 512, y: 1034}, adjacent: [46, 45, , , ]}, - {name_unique: 'Szeged', space_id: 48, socio: 3, stability: 4, battleground: 1, demInfl: 1, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 632, y: 1073}, adjacent: [45, 49, 50, , ]}, - {name_unique: 'Pécs', space_id: 49, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Hungary', region: 'Eastern Europe', box: {x: 486, y: 1105}, adjacent: [48, , , , ]}, - {name_unique: 'Timişoara', space_id: 50, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 597, y: 1204}, adjacent: [48, 51, 60, , ]}, - {name_unique: 'Cluj-Napoca', space_id: 51, socio: 1, stability: 4, battleground: 1, demInfl: 0, comInfl: 2, country: 'Romania', region: 'Balkans', box: {x: 756, y: 1125}, adjacent: [50, 54, 58, 61, ]}, - {name_unique: 'Târgu Mureş', space_id: 52, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 915, y: 1136}, adjacent: [53, 56, , , ]}, - {name_unique: 'Iaşi', space_id: 53, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1072, y: 1097}, adjacent: [52, 57, 62, , ]}, - {name_unique: 'Babeş-Bolyai University', space_id: 54, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 746, y: 1203}, adjacent: [51, 55, , , ]}, - {name_unique: 'Romanian Writers', space_id: 55, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 739, y: 1278}, adjacent: [54, , , , ]}, - {name_unique: 'Hargita/Covasna', space_id: 56, socio: 8, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 928, y: 1227}, adjacent: [52, , , , ]}, - {name_unique: 'Braşov', space_id: 57, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1049, y: 1225}, adjacent: [53, 59, 61, , ]}, - {name_unique: 'Orthodox Church Romania', space_id: 58, socio: 7, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 855, y: 1338}, adjacent: [51, 60, , , ]}, - {name_unique: 'Ploieşti', space_id: 59, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1061, y: 1316}, adjacent: [57, 61, 62, , ]}, - {name_unique: 'Craiova', space_id: 60, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 763, y: 1411}, adjacent: [50, 58, 61, , ]}, - {name_unique: 'Bucureşti', space_id: 61, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Romania', region: 'Balkans', box: {x: 929, y: 1445}, adjacent: [51, 57, 59, 60, 63]}, - {name_unique: 'Galaţi', space_id: 62, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1104, y: 1399}, adjacent: [53, 59, 63, , ]}, - {name_unique: 'Constanţa', space_id: 63, socio: 4, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Romania', region: 'Balkans', box: {x: 1130, y: 1517}, adjacent: [61, 62, 72, , ]}, - {name_unique: 'Pleven', space_id: 64, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 764, y: 1534}, adjacent: [68, , , , ]}, - {name_unique: 'Orthodox Church Bulgaria', space_id: 65, socio: 7, stability: 3, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 882, y: 1540}, adjacent: [66, 68, , , ]}, - {name_unique: 'Ruse', space_id: 66, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 998, y: 1540}, adjacent: [65, 69, 70, 71, 72]}, - {name_unique: 'Sofia University', space_id: 67, socio: 6, stability: 1, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 645, y: 1650}, adjacent: [68, 73, , , ]}, - {name_unique: 'Sofia', space_id: 68, socio: 2, stability: 3, battleground: 1, demInfl: 0, comInfl: 2, country: 'Bulgaria', region: 'Balkans', box: {x: 768, y: 1653}, adjacent: [64, 65, 67, 69, 74]}, - {name_unique: 'Stara Zagora', space_id: 69, socio: 1, stability: 4, battleground: 0, demInfl: 0, comInfl: 1, country: 'Bulgaria', region: 'Balkans', box: {x: 886, y: 1694}, adjacent: [66, 68, 71, , ]}, - {name_unique: 'Razgrad', space_id: 70, socio: 8, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 954, y: 1620}, adjacent: [66, , , , ]}, - {name_unique: 'Burgas', space_id: 71, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 1004, y: 1695}, adjacent: [66, 69, 72, , ]}, - {name_unique: 'Varna', space_id: 72, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 1086, y: 1613}, adjacent: [63, 66, 71, , ]}, - {name_unique: 'Bulgarian Writers', space_id: 73, socio: 5, stability: 2, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 652, y: 1726}, adjacent: [67, , , , ]}, - {name_unique: 'Plovdiv', space_id: 74, socio: 4, stability: 3, battleground: 1, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 771, y: 1739}, adjacent: [68, 75, , , ]}, - {name_unique: 'Sliven', space_id: 75, socio: 3, stability: 4, battleground: 0, demInfl: 0, comInfl: 0, country: 'Bulgaria', region: 'Balkans', box: {x: 894, y: 1768}, adjacent: [74, , , , ]} +const spaces = [ + null, + { + name_unique: "Schwerin", + space_id: 1, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 111, + y: 61, + }, + adjacent: [ 2, 3 ], + ascii_name: "Schwerin", + }, + { + name_unique: "Rostock", + space_id: 2, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 228, + y: 41, + }, + adjacent: [ 1, 3 ], + ascii_name: "Rostock", + }, + { + name_unique: "Berlin", + space_id: 3, + socio: 2, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 2, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 251, + y: 113, + }, + adjacent: [ 1, 2, 5, 9 ], + ascii_name: "Berlin", + }, + { + name_unique: "German Writers", + space_id: 4, + socio: 5, + stability: 2, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 58, + y: 185, + }, + adjacent: [ 5 ], + ascii_name: "German Writers", + }, + { + name_unique: "Walter Ulbricht Academy", + space_id: 5, + socio: 6, + stability: 1, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 175, + y: 187, + }, + adjacent: [ 3, 4 ], + ascii_name: "Walter Ulbricht Academy", + }, + { + name_unique: "Lutheran Church", + space_id: 6, + socio: 7, + stability: 5, + battleground: 1, + demInfl: 1, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 300, + y: 212, + }, + adjacent: [ 9 ], + ascii_name: "Lutheran Church", + }, + { + name_unique: "Magdeburg", + space_id: 7, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 58, + y: 275, + }, + adjacent: [ 8, 10, 11 ], + ascii_name: "Magdeburg", + }, + { + name_unique: "Halle", + space_id: 8, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 175, + y: 278, + }, + adjacent: [ 7, 9, 11 ], + ascii_name: "Halle", + }, + { + name_unique: "Leipzig", + space_id: 9, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 297, + y: 297, + }, + adjacent: [ 3, 6, 8, 11, 12 ], + ascii_name: "Leipzig", + }, + { + name_unique: "Erfurt", + space_id: 10, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 23, + y: 356, + }, + adjacent: [ 7 ], + ascii_name: "Erfurt", + }, + { + name_unique: "Karl-Marx-Stadt", + space_id: 11, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 138, + y: 385, + }, + adjacent: [ 7, 8, 9, 12 ], + ascii_name: "Karl-Marx-Stadt", + }, + { + name_unique: "Dresden", + space_id: 12, + socio: 1, + stability: 4, + battleground: 1, + demInfl: 0, + comInfl: 2, + country: "East_Germany", + region: "Eastern Europe", + box: { + x: 262, + y: 375, + }, + adjacent: [ 9, 11, 19, 27 ], + ascii_name: "Dresden", + }, + { + name_unique: "Szczecin", + space_id: 13, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 434, + y: 204, + }, + adjacent: [ 14, 16 ], + ascii_name: "Szczecin", + }, + { + name_unique: "Gdańsk", + space_id: 14, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 1, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 699, + y: 215, + }, + adjacent: [ 13, 15, 16, 17, 18 ], + ascii_name: "Gdansk", + }, + { + name_unique: "Bydgoszcz", + space_id: 15, + socio: 1, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 1, + country: "Poland", + region: "Eastern Europe", + box: { + x: 679, + y: 304, + }, + adjacent: [ 14, 17 ], + ascii_name: "Bydgoszcz", + }, + { + name_unique: "Poznań", + space_id: 16, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 521, + y: 355, + }, + adjacent: [ 13, 14, 19, 20 ], + ascii_name: "Poznan", + }, + { + name_unique: "Warszawa", + space_id: 17, + socio: 2, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 1, + country: "Poland", + region: "Eastern Europe", + box: { + x: 806, + y: 383, + }, + adjacent: [ 14, 15, 18, 21, 24 ], + ascii_name: "Warszawa", + }, + { + name_unique: "Białystok", + space_id: 18, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 940, + y: 342, + }, + adjacent: [ 14, 17, 24 ], + ascii_name: "Bialystok", + }, + { + name_unique: "Wrocław", + space_id: 19, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 462, + y: 443, + }, + adjacent: [ 12, 16, 20, 22 ], + ascii_name: "Wroclaw", + }, + { + name_unique: "Catholic Church, Poland", + space_id: 20, + socio: 7, + stability: 5, + battleground: 0, + demInfl: 5, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 625, + y: 437, + }, + adjacent: [ 16, 19, 21, 22, 23 ], + ascii_name: "Catholic Church, Poland", + }, + { + name_unique: "Łódź", + space_id: 21, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 749, + y: 486, + }, + adjacent: [ 17, 20, 23, 24 ], + ascii_name: "Lodz", + }, + { + name_unique: "Katowice", + space_id: 22, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 570, + y: 569, + }, + adjacent: [ 19, 20, 23, 33 ], + ascii_name: "Katowice", + }, + { + name_unique: "Kraków", + space_id: 23, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 1, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 711, + y: 598, + }, + adjacent: [ 20, 21, 22, 25 ], + ascii_name: "Krakow", + }, + { + name_unique: "Lublin", + space_id: 24, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 1, + country: "Poland", + region: "Eastern Europe", + box: { + x: 879, + y: 603, + }, + adjacent: [ 17, 18, 21 ], + ascii_name: "Lublin", + }, + { + name_unique: "Jagiellonian University", + space_id: 25, + socio: 6, + stability: 1, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 679, + y: 681, + }, + adjacent: [ 23, 26 ], + ascii_name: "Jagiellonian University", + }, + { + name_unique: "Polish Writers", + space_id: 26, + socio: 5, + stability: 2, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Poland", + region: "Eastern Europe", + box: { + x: 832, + y: 694, + }, + adjacent: [ 25 ], + ascii_name: "Polish Writers", + }, + { + name_unique: "Plzeň", + space_id: 27, + socio: 1, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 2, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 159, + y: 483, + }, + adjacent: [ 12, 28, 29 ], + ascii_name: "Plzen", + }, + { + name_unique: "České Budĕjovice", + space_id: 28, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 196, + y: 601, + }, + adjacent: [ 27, 29 ], + ascii_name: "Ceske Budejovice", + }, + { + name_unique: "Praha", + space_id: 29, + socio: 2, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 2, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 317, + y: 614, + }, + adjacent: [ 27, 28, 30, 32 ], + ascii_name: "Praha", + }, + { + name_unique: "Charles University", + space_id: 30, + socio: 6, + stability: 1, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 380, + y: 532, + }, + adjacent: [ 29, 31 ], + ascii_name: "Charles University", + }, + { + name_unique: "Czech Writers", + space_id: 31, + socio: 5, + stability: 2, + battleground: 1, + demInfl: 2, + comInfl: 0, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 444, + y: 607, + }, + adjacent: [ 30 ], + ascii_name: "Czech Writers", + }, + { + name_unique: "Brno", + space_id: 32, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 1, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 403, + y: 711, + }, + adjacent: [ 29, 33, 34 ], + ascii_name: "Brno", + }, + { + name_unique: "Ostrava", + space_id: 33, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 523, + y: 681, + }, + adjacent: [ 22, 32, 34, 35 ], + ascii_name: "Ostrava", + }, + { + name_unique: "Bratislava", + space_id: 34, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 417, + y: 797, + }, + adjacent: [ 32, 33, 35 ], + ascii_name: "Bratislava", + }, + { + name_unique: "Catholic Church, Czechoslovakia", + space_id: 35, + socio: 7, + stability: 5, + battleground: 0, + demInfl: 1, + comInfl: 0, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 538, + y: 794, + }, + adjacent: [ 33, 34, 36 ], + ascii_name: "Catholic Church, Czechoslovakia", + }, + { + name_unique: "Prešov", + space_id: 36, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 658, + y: 794, + }, + adjacent: [ 35, 37 ], + ascii_name: "Presov", + }, + { + name_unique: "Košice", + space_id: 37, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Czechoslovakia", + region: "Eastern Europe", + box: { + x: 777, + y: 815, + }, + adjacent: [ 36, 42 ], + ascii_name: "Kosice", + }, + { + name_unique: "Catholic Church, Hungary", + space_id: 38, + socio: 7, + stability: 5, + battleground: 0, + demInfl: 1, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 314, + y: 886, + }, + adjacent: [ 39, 43 ], + ascii_name: "Catholic Church, Hungary", + }, + { + name_unique: "Győr", + space_id: 39, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 434, + y: 887, + }, + adjacent: [ 38, 40, 43, 44 ], + ascii_name: "Gyor", + }, + { + name_unique: "Tatabánya", + space_id: 40, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 549, + y: 886, + }, + adjacent: [ 39, 41, 45 ], + ascii_name: "Tatabanya", + }, + { + name_unique: "Miskolc", + space_id: 41, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 664, + y: 901, + }, + adjacent: [ 40, 42, 45 ], + ascii_name: "Miskolc", + }, + { + name_unique: "Debrecen", + space_id: 42, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 781, + y: 938, + }, + adjacent: [ 37, 41 ], + ascii_name: "Debrecen", + }, + { + name_unique: "Szombathely", + space_id: 43, + socio: 1, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 1, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 316, + y: 963, + }, + adjacent: [ 38, 39, 44 ], + ascii_name: "Szombathely", + }, + { + name_unique: "Székesfehérvár", + space_id: 44, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 1, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 442, + y: 962, + }, + adjacent: [ 39, 43, 45 ], + ascii_name: "Szekesfehervar", + }, + { + name_unique: "Budapest", + space_id: 45, + socio: 2, + stability: 3, + battleground: 1, + demInfl: 1, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 630, + y: 983, + }, + adjacent: [ 40, 41, 44, 47, 48 ], + ascii_name: "Budapest", + }, + { + name_unique: "Hungarian Writers", + space_id: 46, + socio: 5, + stability: 2, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 348, + y: 1040, + }, + adjacent: [ 47 ], + ascii_name: "Hungarian Writers", + }, + { + name_unique: "Eötvös Loránd University", + space_id: 47, + socio: 6, + stability: 1, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 512, + y: 1034, + }, + adjacent: [ 46, 45 ], + ascii_name: "Eotvos Lorand University", + }, + { + name_unique: "Szeged", + space_id: 48, + socio: 3, + stability: 4, + battleground: 1, + demInfl: 1, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 632, + y: 1073, + }, + adjacent: [ 45, 49, 50 ], + ascii_name: "Szeged", + }, + { + name_unique: "Pécs", + space_id: 49, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Hungary", + region: "Eastern Europe", + box: { + x: 486, + y: 1105, + }, + adjacent: [ 48 ], + ascii_name: "Pecs", + }, + { + name_unique: "Timişoara", + space_id: 50, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 597, + y: 1204, + }, + adjacent: [ 48, 51, 60 ], + ascii_name: "Timisoara", + }, + { + name_unique: "Cluj-Napoca", + space_id: 51, + socio: 1, + stability: 4, + battleground: 1, + demInfl: 0, + comInfl: 2, + country: "Romania", + region: "Balkans", + box: { + x: 756, + y: 1125, + }, + adjacent: [ 50, 54, 58, 61 ], + ascii_name: "Cluj-Napoca", + }, + { + name_unique: "Târgu Mureş", + space_id: 52, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 915, + y: 1136, + }, + adjacent: [ 53, 56 ], + ascii_name: "Targu Mures", + }, + { + name_unique: "Iaşi", + space_id: 53, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 1072, + y: 1097, + }, + adjacent: [ 52, 57, 62 ], + ascii_name: "Iasi", + }, + { + name_unique: "Babeş-Bolyai University", + space_id: 54, + socio: 6, + stability: 1, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 746, + y: 1203, + }, + adjacent: [ 51, 55 ], + ascii_name: "Babes-Bolyai University", + }, + { + name_unique: "Romanian Writers", + space_id: 55, + socio: 5, + stability: 2, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 739, + y: 1278, + }, + adjacent: [ 54 ], + ascii_name: "Romanian Writers", + }, + { + name_unique: "Harghita/Covasna", + space_id: 56, + socio: 8, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 928, + y: 1227, + }, + adjacent: [ 52 ], + ascii_name: "Harghita/Covasna", + }, + { + name_unique: "Braşov", + space_id: 57, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 1049, + y: 1225, + }, + adjacent: [ 53, 59, 61 ], + ascii_name: "Brasov", + }, + { + name_unique: "Orthodox Church, Romania", + space_id: 58, + socio: 7, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 855, + y: 1338, + }, + adjacent: [ 51, 60 ], + ascii_name: "Orthodox Church, Romania", + }, + { + name_unique: "Ploieşti", + space_id: 59, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 1061, + y: 1316, + }, + adjacent: [ 57, 61, 62 ], + ascii_name: "Ploiesti", + }, + { + name_unique: "Craiova", + space_id: 60, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 763, + y: 1411, + }, + adjacent: [ 50, 58, 61 ], + ascii_name: "Craiova", + }, + { + name_unique: "Bucureşti", + space_id: 61, + socio: 2, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 2, + country: "Romania", + region: "Balkans", + box: { + x: 929, + y: 1445, + }, + adjacent: [ 51, 57, 59, 60, 63 ], + ascii_name: "Bucuresti", + }, + { + name_unique: "Galaţi", + space_id: 62, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 1104, + y: 1399, + }, + adjacent: [ 53, 59, 63 ], + ascii_name: "Galati", + }, + { + name_unique: "Constanţa", + space_id: 63, + socio: 4, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Romania", + region: "Balkans", + box: { + x: 1130, + y: 1517, + }, + adjacent: [ 61, 62, 72 ], + ascii_name: "Constanta", + }, + { + name_unique: "Pleven", + space_id: 64, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 764, + y: 1534, + }, + adjacent: [ 68 ], + ascii_name: "Pleven", + }, + { + name_unique: "Orthodox Church, Bulgaria", + space_id: 65, + socio: 7, + stability: 3, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 882, + y: 1540, + }, + adjacent: [ 66, 68 ], + ascii_name: "Orthodox Church, Bulgaria", + }, + { + name_unique: "Ruse", + space_id: 66, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 998, + y: 1540, + }, + adjacent: [ 65, 69, 70, 71, 72 ], + ascii_name: "Ruse", + }, + { + name_unique: "Sofia University", + space_id: 67, + socio: 6, + stability: 1, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 645, + y: 1650, + }, + adjacent: [ 68, 73 ], + ascii_name: "Sofia University", + }, + { + name_unique: "Sofia", + space_id: 68, + socio: 2, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 2, + country: "Bulgaria", + region: "Balkans", + box: { + x: 768, + y: 1653, + }, + adjacent: [ 64, 65, 67, 69, 74 ], + ascii_name: "Sofia", + }, + { + name_unique: "Stara Zagora", + space_id: 69, + socio: 1, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 1, + country: "Bulgaria", + region: "Balkans", + box: { + x: 886, + y: 1694, + }, + adjacent: [ 66, 68, 71 ], + ascii_name: "Stara Zagora", + }, + { + name_unique: "Razgrad", + space_id: 70, + socio: 8, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 954, + y: 1620, + }, + adjacent: [ 66 ], + ascii_name: "Razgrad", + }, + { + name_unique: "Burgas", + space_id: 71, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 1004, + y: 1695, + }, + adjacent: [ 66, 69, 72 ], + ascii_name: "Burgas", + }, + { + name_unique: "Varna", + space_id: 72, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 1086, + y: 1613, + }, + adjacent: [ 63, 66, 71 ], + ascii_name: "Varna", + }, + { + name_unique: "Bulgarian Writers", + space_id: 73, + socio: 5, + stability: 2, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 652, + y: 1726, + }, + adjacent: [ 67 ], + ascii_name: "Bulgarian Writers", + }, + { + name_unique: "Plovdiv", + space_id: 74, + socio: 4, + stability: 3, + battleground: 1, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 771, + y: 1739, + }, + adjacent: [ 68, 75 ], + ascii_name: "Plovdiv", + }, + { + name_unique: "Sliven", + space_id: 75, + socio: 3, + stability: 4, + battleground: 0, + demInfl: 0, + comInfl: 0, + country: "Bulgaria", + region: "Balkans", + box: { + x: 894, + y: 1768, + }, + adjacent: [ 74 ], + ascii_name: "Sliven", + }, ] const cards = [ @@ -249,5 +1449,4 @@ null, {number: 54, name: 'Petition', value: 3, socio: 0, url: 'ps10'}, ] - if (typeof module !== 'undefined') module.exports = { spaces, cards, power_cards } diff --git a/gencode.js b/gencode.js deleted file mode 100644 index 6e66a02..0000000 --- a/gencode.js +++ /dev/null @@ -1,107 +0,0 @@ -"use strict" - -let fs = require("fs") - -let pc = 0 - -function tokenize(s) { - let list = [] - let p = 0, - n = s.length - while (p < n) { - while (p < n && s[p] === " ") - ++p - if (p < n) { - let m = p - while (p < n && s[p] !== " ") { - let q = s[p++] - switch (q) { - case "(": - case "[": - case "{": - for (let x = 1; p < n && x > 0; ++p) { - switch (s[p]) { - case "(": - case "[": - case "{": - ++x - break - case ")": - case "]": - case "}": - --x - break - } - } - break - case '"': - case "'": - case "`": - while (p < n && s[p] !== q) - ++p - break - } - } - list.push(s.substring(m, p)) - } - } - return list -} - -function emit(line) { - ++pc - line[0] = "vm_" + line[0] - for (let i = 1; i < line.length; ++i) { - if (typeof line[i] === "string") { - if (line[i] === "all") - line[i] = 999 - if (line[i][0] === "(" && !line[i].match(/\)=>/)) - line[i] = "()=>" + line[i] - if (line[i][0] === "`") - line[i] = "()=>" + line[i] - } - } - console.log("\t[ " + line.join(", ") + " ],") -} - -console.log("// #region GENERATED EVENT CODE") -console.log("const CODE = []") -let first = false - -for (let line of fs.readFileSync("events.txt", "utf-8").split("\n")) { - line = line.trim() - if (line.length === 0 || line[0] === "#") - continue - if (line === "EOF") - break - line = tokenize(line) - switch (line[0]) { - case "CARD": - if (first++) { - emit(["return"]) - console.log("]") - } - console.log("") - console.log("CODE[" + line[1] + "] = [ // " + line.slice(3).join(" ")) - break - - case "log": - case "prompt": - emit([ line[0], line.slice(1).join(" ") ]) - break - - case "asm": - case "if": - case "while": - emit([ line[0], "()=>" + line.slice(1).join(" ") ]) - break - - default: - emit(line) - break - } -} - -emit(["return"]) -console.log("]") -console.log("// #endregion") \ No newline at end of file diff --git a/images/trash-can.svg b/images/trash-can.svg new file mode 100644 index 0000000..7b8da5a --- /dev/null +++ b/images/trash-can.svg @@ -0,0 +1 @@ + diff --git a/info/cards.html b/info/cards.html new file mode 100644 index 0000000..479867d --- /dev/null +++ b/info/cards.html @@ -0,0 +1,193 @@ + + + +1989 - Cards + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/play.css b/play.css index 2a65885..3b49c7b 100644 --- a/play.css +++ b/play.css @@ -1,46 +1,14 @@ -main { background-color: dimgray; } -header { background-color: silver; } -header.your_turn { background-color: orange; } -#role_Democrat { background-color: hsl(200, 80%, 80%); } -#role_Communist { background-color: hsl(0, 80%, 80%); } -#turn_info { background-color: white; } -/*.aside_events { - font-family: "Source Sans"; - font-style: normal; - font-size: 16px; - line-height: 1.5; -}*/ -#deck_data { - font-family: "Source Sans"; - font-style: normal; - font-size: 16px; - line-height: 1.5; -} -#deck_stat {padding-left: 5px; padding-bottom: 5px;} - +main { background-color: slategray; } -#log { background-color: whitesmoke; } -#log .h1 { font-weight: bold; padding-top:2px; padding-bottom:2px; text-align: center; } -#log .h2 { padding-top:2px; padding-bottom:2px; text-align: center; } -#log .h3 { text-align: center; } -#log .h4 { text-decoration: underline; } -#log .h5 { text-decoration: underline; } +body.Democrat header.your_turn { background-color: hsl(206, 85%, 75%); } +body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } -#log .h2 { background-color: hsl(0,0%,80%);} -#log .h1 { background-color: hsl(0,0%,80%); } -#log .h2.dem { background-color: hsl(200, 80%, 80%); } -#log .h2.com { background-color: hsl(0, 80%, 80%); } -#log .h3.democrat { background-color: hsl(210,30%,90%); } -#log .h3.h2.communist { background-color: hsl(35,40%,90%); } +#role_Democrat { background-color: hsl(206, 80%, 80%); } +#role_Communist { background-color: hsl(355, 70%, 80%); } -#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 */ - -#log .card_name { font-style: italic; } -#log .card_name:hover { text-decoration: underline; } -#log .space_tip:hover { cursor: pointer; text-decoration: underline; } +#log { font-variant-numeric: tabular-nums; } #log .die { display: inline-block; @@ -62,555 +30,212 @@ header.your_turn { background-color: orange; } #log .d5 { background-position: 80% 0; } #log .d6 { background-position: 100% 0; } -.selected { - cursor: pointer; -} +#log .h1 { font-weight: bold; padding-top:2px; padding-bottom:2px; text-align: center; } +#log .h2 { padding-top:2px; padding-bottom:2px; text-align: center; } +#log .h3 { text-align: center; } +#log .h4 { text-decoration: underline; } +#log .h5 { text-decoration: underline; } -#log { - font-variant-numeric: tabular-nums; -} +#log { background-color: floralwhite } +#log .h1 { background-color: tan } +#log .h2 { background-color: wheat } +#log .h2.dem { background-color: hsl(206, 85%, 80%); } +#log .h2.com { background-color: hsl(355, 70%, 80%); } -/* TOOLBAR */ +#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; } -#toolbar { - justify-content: space-evenly; -} +#log .card_name { font-style: italic; } +#log .card_name:hover { text-decoration: underline; } +#log .space_tip:hover { cursor: pointer; text-decoration: underline; } -#prompt { - display: flex; - margin-left: auto; -} +/* MAP */ -#button { - display: flex; - margin-left: auto; +#mapwrap { + width: 1650px; + height: 2550px; } -/* MAP */ #map { - margin: 0 auto ; - position: relative; - background-repeat: no-repeat; - background-size: cover; - width: 1275px; /* was 1275*/ - height: 2000px; - /*border: solid black;*/ - overflow: clip; + width: 1650px; + height: 2550px; + background-size: 1650px 2550px; box-shadow: 0px 1px 10px #0008; - /*z-index: 3;*/ -} - -#map { background-image: url(1989_map.jpg) } - -/* Containers to appear on hover*/ - #overlay { - position: relative; - top: 0; - left: 0; - width: 100%; - height: 100%; - /* background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent overlay */ - /* display: none;*/ - justify-content: center; - align-items: center; - text-align: left; - } - -/* SPACES */ - -.space-area { - position: absolute; - box-sizing: border-box; - border: transparent red 2px; -} - -/* PANELS AND HANDS */ - -.panel { - background-color: #555; - display: inline-block; -} - -.panel_header { - background-color: #444; - color: hsl(40, 60%, 90%); - font-weight: bold; - text-align: center; - padding: 3px 1em; -} - -.hide { - display: none; -} - -#hand_panel, #events_panel, #played_card_panel, #table_panel, #samizdat_panel, #opp_hand_panel, #power_panel, #ceausescu_panel { - min-width: 200px; - width: auto; - /*display: inline-block;*/ - margin: 10px; - border-radius: 5px; -} - -#events { - display: flex; -} - -#discard_panel, #removed_panel { - min-width: 200px; - width: auto; - display: inline-block; - margin: 10px; - border-radius: 5px; -} - -#discard_panel.hide, #removed_panel.hide { - display: none; -} - -#hand_panel { - margin: 10px; - border-radius: 5px; -} - -/* INFLUENCE MARKERS */ - -.demInfl { - position: absolute; - box-sizing: border-box; - bottom: 1px; - left: 6px; - height: 35px; - width: 35px; - border-radius: 5px; -} - -.demInfl.controlled { - background-image: url(images/US_blank.gif); - background-size: contain; -} - - -.demInfl.uncontrolled { - background-image: url(images/USd_blank.gif); - background-size: contain; -} -/* -.demInfl:hover { - cursor: pointer; -}*/ - -.comInfl { - position: absolute; - box-sizing: border-box; - bottom: 1px; - right: 6px; - height: 35px; - width: 35px; -} -/* -.comInfl:hover { - cursor: pointer; -}*/ - -.comInfl.controlled { - background-image: url(images/SV_blank.gif); - background-size: contain; -} - - -.comInfl.uncontrolled { - background-image: url(images/SVd_blank.gif); - background-size: contain; -} - -.demInflValue { - position: absolute; - box-sizing: border-box; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: 10px; - left: 16px; } -.demInflValue_10 { - position: absolute; - box-sizing: border-box; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: 10px; - left: 10px; +#map { background-image: url("map75.jpg") } +@media (min-resolution: 97dpi) { + #map { background-image: url("map150.jpg") } } -.comInflValue { - position: absolute; - box-sizing: border-box; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: 12px; - left: 74px; -} +/* SPACES */ -.comInflValue_10 { +.space { position: absolute; box-sizing: border-box; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: 12px; - left: 68px; + border: 4px solid transparent; } -.comInflValue.controlled, .held { - color: whitesmoke; - text-shadow: - 1px 1px 0 #c2272d, /* Right bottom */ - -1px 1px 0 #c2272d, /* Left bottom */ - 1px -1px 0 #c2272d, /* Right top */ - -1px -1px 0 #c2272d; /* Left top */ +.space.action { + border-color: white; + box-shadow: 0 0 0 1px black, inset 0 0 0 1px black; } -.comInflValue.uncontrolled { - color: #c2272d; - text-shadow: - 1px 1px 0 #ffffff, /* Right bottom */ - -1px 1px 0 #ffffff, /* Left bottom */ - 1px -1px 0 #ffffff, /* Right top */ - -1px -1px 0 #ffffff; /* Left top */ -} +.space.East_Germany.action { border-color: white; } +.space.Poland.action { border-color: yellow; } +.space.Czechoslovakia.action { border-color: lightgreen; } +.space.Hungary.action { border-color: gold; } +.space.Romania.action { border-color: peachpuff; } +.space.Bulgaria.action { border-color: palegreen; } -.comInflValue_10.controlled, .held { - color: whitesmoke; - text-shadow: - 1px 1px 0 #c2272d, /* Right bottom */ - -1px 1px 0 #c2272d, /* Left bottom */ - 1px -1px 0 #c2272d, /* Right top */ - -1px -1px 0 #c2272d; /* Left top */ +.space.tip { + border-color: lime; + box-shadow: 0 0 0 1px black, inset 0 0 0 1px black; } -.comInflValue_10.uncontrolled { - color: #c2272d; - text-shadow: - 1px 1px 0 #ffffff, /* Right bottom */ - -1px 1px 0 #ffffff, /* Left bottom */ - 1px -1px 0 #ffffff, /* Right top */ - -1px -1px 0 #ffffff; /* Left top */ -} - - -/* GAME MARKERS */ - -.t0 {left: 511px} -.t1 {left: 511px} -.t2 {left: 553px} -.t3 {left: 595px} -.t4 {left: 637px} -.t5 {left: 679px} -.t6 {left: 721px} -.t7 {left: 763px} -.t8 {left: 805px} -.t9 {left: 847px} -.t10 {left: 889px} - -#turn-tracker { - position:absolute; - top: 65px; - height: 35px; - width: 36px; - /*display: block;*/ -} - -.r0 {left: 554px} -.r1 {left: 554px} -.r2 {left: 596px} -.r3 {left: 638px} -.r4 {left: 680px} -.r5 {left: 722px} -.r6 {left: 764px} -.r7 {left: 806px} -.r8 {left: 848px} +/* MARKERS */ -.dem-action-round-tracker { background-image: url(images/US_Action_Round.gif);} -.com-action-round-tracker { background-image: url(images/SV_Action_Round.gif);} +/* node tools/gencolors.js */ +.marker { background-color: #ffffff; border-color: #eeeeee #8a8a8a #8a8a8a #eeeeee; box-shadow: 0 0 0 1px #323232, 1px 2px 4px #0008; } +.demInfl.ctl { background-color: #c4e2f6; border-color: #e6ffff #8ca8bb #8ca8bb #e6ffff; box-shadow: 0 0 0 1px #274050, 1px 2px 4px #0008; } +.comInfl.ctl { background-color: #c1272d; border-color: #e74e4c #9c0009 #9c0009 #e74e4c; box-shadow: 0 0 0 1px #520000, 1px 2px 4px #0008; } +#marker_action_round.com { background-color: #147fc0; border-color: #44a3e6 #005c9b #005c9b #44a3e6; box-shadow: 0 0 0 1px #001a54, 1px 2px 4px #0008; } +#marker_action_round.dem { background-color: #c1272d; border-color: #e74e4c #9c0009 #9c0009 #e74e4c; box-shadow: 0 0 0 1px #520000, 1px 2px 4px #0008; } +#marker_vp, #marker_turn { background-color: #fadb04; border-color: #ffff51 #c0a100 #c0a100 #ffff51; box-shadow: 0 0 0 1px #563600, 1px 2px 4px #0008; } +#marker_com_tst { background-color: #f26649; border-color: #ff9273 #c2391c #c2391c #ff9273; box-shadow: 0 0 0 1px #640000, 1px 2px 4px #0008; } +#marker_dem_tst { background-color: #c4e2f4; border-color: #e6ffff #8ca8ba #8ca8ba #e6ffff; box-shadow: 0 0 0 1px #27404f, 1px 2px 4px #0008; } -#action-round-tracker { +#event_reminder_list { position: absolute; - top: 114px; - height: 30px; - width: 35px; - background-size: cover; -} - - - -#stability-track { - position:absolute; - left: 1085px; - height: 35px; - width: 35px; -} - -.s0 {top: 853px} -.s1 {top: 896px} -.s2 {top: 939px} -.s3 {top: 982px} -.s4 {top: 1025px} - - -.tst0 {left: 0} -.tst1 {left: 38px} -.tst2 {left: 93px} -.tst3 {left: 148px} -.tst4 {left: 203px} -.tst5 {left: 258px} -.tst6 {left: 313px} -.tst7 {left: 368px} -.tst8 {left: 436px} - -#dem-TST { - position: absolute; - top: 1680px; - height: 35px; - width: 35px; -} - -#com-TST { - position: absolute; - top: 1782px; - height: 35px; - width: 35px; -} - -.vp0 {top: 1913px; -left: 660px} - -.vp-20, .vp-18, .vp-16, .vp-14, .vp-12, .vp-10, .vp-8, .vp-6, .vp-4, .vp-2, .vp1, .vp3, .vp5, .vp7, .vp9, .vp11, .vp13, .vp15, .vp17, .vp19 {top: 1889px} -.vp-19, .vp-17, .vp-15, .vp-13, .vp-11, .vp-9, .vp-7, .vp-5, .vp-3, .vp-1, .vp2, .vp4, .vp6, .vp8, .vp10, .vp12, .vp14, .vp16, .vp18, .vp20 {top: 1938px} - -.vp-21 {top: 1912px; left: 117px} -.vp21 {top: 1912px; left: 1182px} - -.vp-20 {left: 165px} -.vp-19 {left: 189px} -.vp-18 {left: 214px} -.vp-17 {left: 238px} -.vp-16 {left: 263px} -.vp-15 {left: 287px} -.vp-14 {left: 312px} -.vp-13 {left: 336px} -.vp-12 {left: 361px} -.vp-11 {left: 385px} -.vp-10 {left: 410px} -.vp-9 {left: 434px} -.vp-8 {left: 459px} -.vp-7 {left: 483px} -.vp-6 {left: 508px} -.vp-5 {left: 532px} -.vp-4 {left: 557px} -.vp-3 {left: 581px} -.vp-2 {left: 606px} -.vp-1 {left: 630px} -.vp1 {left: 692px} -.vp2 {left: 717px} -.vp3 {left: 741px} -.vp4 {left: 766px} -.vp5 {left: 790px} -.vp6 {left: 815px} -.vp7 {left: 839px} -.vp8 {left: 864px} -.vp9 {left: 888px} -.vp10 {left: 913px} -.vp11 {left: 937px} -.vp12 {left: 962px} -.vp13 {left: 986px} -.vp14 {left: 1011px} -.vp15 {left: 1035px} -.vp16 {left: 1060px} -.vp17 {left: 1084px} -.vp18 {left: 1109px} -.vp19 {left: 1133px} -.vp20 {left: 1158px} - -#vp { - position: absolute; - height: 40px; - width: 40px; + display: flex; + flex-rap: wrap; + gap: 5px; + bottom: 165px; + right: 195px; } .marker { position: absolute; - height: 30px; - width: 30px; -} - -.revolution {background-image: url(images/US_blank.gif); background-size: contain} -.held {background-image: url(images/SV_blank.gif); background-size: contain} - -.germany {top: 127px; left: 439px} -.poland { top: 232px; left: 934px} -.czech {top: 494px; left: 362px} -.hungary {top: 1041px; left: 813px} -.romania {top: 1063px; left: 1012px} -.bulgaria {top: 1578px; left: 720px} - -.times_held { - position: absolute; - font-family: 'Open Sans'; - font-size: 20px; - font-weight: bold; - top: -18px; - left: 8px -} - -.outlined_text { - text-shadow: - 1px 1px 0 #ffffff, /* Right bottom */ - -1px 1px 0 #ffffff, /* Left bottom */ - 1px -1px 0 #ffffff, /* Right top */ - -1px -1px 0 #ffffff; /* Left top */ -} - -/* ============= EVENT MARKERS ========== */ - -.event-marker { - display: none; - position: absolute; - height: 30px; - width: 30px; - transition: transform 0.3s ease; -} - -.event-marker:hover { - cursor: pointer; - transform: scale(2); - z-index: 1; -} - -.event-marker.aside { - border: solid black 1.5px; - margin: 3px; - position: relative; -} - -#turn_info { - display: flex; - flex-direction: column; - align-items: flex-start; -} - -#turn_info > div { - display: flex; - margin-bottom: 8px; - gap: 4px; -} - -#turn_info > img { - display: block; - -} - -/*Solidarity legalised*/ -#event_2 { - top: 216px; - left: 612px; -} - -/*Systematisation*/ -#event_69 { - height: 65px; - width: 65px; -} + pointer-events: none; + width: 45px; + height: 45px; + border: 2px solid; + border-color: #eee #bbb #bbb #eee; + /* TODO: per marker border color */ + box-shadow: 0 0 0 1px #444; + //border-radius: 8px; +} + +.demInfl { background-color: #fff; } +.comInfl { background-color: #fff; } +.demInfl.ctl { background-color: #147fc0; } +.comInfl.ctl { background-color: #c1272d; } + +.demInfl.v1 { background-image: url(markers75/di1.png) } +.demInfl.v2 { background-image: url(markers75/di2.png) } +.demInfl.v3 { background-image: url(markers75/di3.png) } +.demInfl.v4 { background-image: url(markers75/di4.png) } +.demInfl.v5 { background-image: url(markers75/di5.png) } +.demInfl.v6 { background-image: url(markers75/di6.png) } +.demInfl.v7 { background-image: url(markers75/di7.png) } +.demInfl.v8 { background-image: url(markers75/di8.png) } +.demInfl.ctl.v1 { background-image: url(markers75/dc1.png) } +.demInfl.ctl.v2 { background-image: url(markers75/dc2.png) } +.demInfl.ctl.v3 { background-image: url(markers75/dc3.png) } +.demInfl.ctl.v4 { background-image: url(markers75/dc4.png) } +.demInfl.ctl.v5 { background-image: url(markers75/dc5.png) } +.demInfl.ctl.v6 { background-image: url(markers75/dc6.png) } +.demInfl.ctl.v7 { background-image: url(markers75/dc7.png) } +.demInfl.ctl.v8 { background-image: url(markers75/dc8.png) } + +.comInfl.v1 { background-image: url(markers75/ci1.png) } +.comInfl.v2 { background-image: url(markers75/ci2.png) } +.comInfl.v3 { background-image: url(markers75/ci3.png) } +.comInfl.v4 { background-image: url(markers75/ci4.png) } +.comInfl.v5 { background-image: url(markers75/ci5.png) } +.comInfl.v6 { background-image: url(markers75/ci6.png) } +.comInfl.v7 { background-image: url(markers75/ci7.png) } +.comInfl.v8 { background-image: url(markers75/ci8.png) } +.comInfl.ctl.v1 { background-image: url(markers75/cc1.png) } +.comInfl.ctl.v2 { background-image: url(markers75/cc2.png) } +.comInfl.ctl.v3 { background-image: url(markers75/cc3.png) } +.comInfl.ctl.v4 { background-image: url(markers75/cc4.png) } +.comInfl.ctl.v5 { background-image: url(markers75/cc5.png) } +.comInfl.ctl.v6 { background-image: url(markers75/cc6.png) } +.comInfl.ctl.v7 { background-image: url(markers75/cc7.png) } +.comInfl.ctl.v8 { background-image: url(markers75/cc8.png) } + +#marker_turn { background-image: url(markers75/turn.png) } +#marker_action_round.dem { background-image: url(markers75/action_round_blue.png) } +#marker_action_round.com { background-image: url(markers75/action_round_blue.png) } +#marker_stability_track { background-image: url(markers75/ussr_stability_track.png) } +#marker_dem_tst { background-image: url(markers75/ts_blue.png) } +#marker_com_tst { background-image: url(markers75/ts_red.png) } +#marker_vp { background-image: url(markers75/vp.png) } + +/* EVENT MARKERS */ + +.marker.aside { + position: static; +} + +#event_2 { background-image: url(markers75/event_solidarity_legalized.png) } +#event_9 { background-image: url(markers75/event_the_wall.png) } +#event_15 { background-image: url(markers75/event_honecker.png) } +#event_24 { background-image: url(markers75/event_st_nicholas.png) } +#event_26 { background-image: url(markers75/event_helsinki.png) } +#event_39 { background-image: url(markers75/event_eco_glasnost.png) } +#event_48 { background-image: url(markers75/event_we_are_the_people.png) } +#event_49 { background-image: url(markers75/event_foreign_currency.png) } +#event_53 { background-image: url(markers75/event_li_peng.png) } +#event_58 { background-image: url(markers75/event_austria_hungary.png) } +#event_59 { background-image: url(markers75/event_grenz_truppen.png) } +#event_65 { background-image: url(markers75/event_pres_visit.png) } +#event_69 { background-image: url(markers75/event_systematization.png) } +#event_70 { background-image: url(markers75/event_securitate.png) } +#event_73 { background-image: url(markers75/event_laszlo_tokes.png) } +#event_97 { background-image: url(markers75/event_tyrant.png) } +#event_100 { background-image: url(markers75/event_stand_fast.png) } +#event_101 { background-image: url(markers75/event_elena.png) } +#event_104 { background-image: url(markers75/event_nye_party.png) } + +/* Solidarity legalized */ +#event_2 { top: 265px; left: 778px; } + +/* The Wall */ +#event_9 { top: 175px; left: 216px; } + +/* CARD PANELS */ -/*The Tyrant is Gone*/ -#event_97 { - height: 40px; - width: 40px; +.panel { + background-color: #607080; + max-width: 1650px; + margin: 24px auto; } -/*The Wall*/ -#event_9 { - top: 143px; - left: 170px; +.panel_header { + background-color: #506070; + color: white; + font-weight: bold; + padding: 3px; + text-align: center; } - -/* =========== CARDS ================= */ -/* -.playedCard { +.panel_body { + margin-top: 3px; display: flex; - margin: auto; - height: 300px; -}*/ - -.hand_card { - background-size: contain; - height: 250px; - margin: 10px; - border-radius: 5px; - transition: transform .3s ease 0.5s; -} -/* -.hand_card:hover { - cursor: pointer; -}*/ - -.zoom { - transform: scale(1.75) -} - -.power_card { - background-size: contain; - height: 250px; - margin: 10px; - border-radius: 5px; -} - -.discard_card, .event_card { - background-size: contain; - height: 150px; - margin: 5px; - border-radius: 5px; - transition: transform .3s ease; -} - -.discard_card:hover, .event_card:hover { - /*cursor: pointer;*/ - transform: scale(2); + flex-wrap: wrap; + padding: 16px; + gap: 16px; + min-height: 350px; } -.selected.space-area { - background-color: #0002; - outline: solid white 2px; - /*box-shadow: 0 0 4px white; */ - border-radius: 10px 10px 0 0; -} - -.space-area.tip { - background-color: #ff08; - outline: solid white 2px; - box-shadow: 0 0 8px #ff08; - border-radius: 10px 10px 0 0; -} - -.selected.hand_card { - outline: solid silver 3px; - /*box-shadow: 0 0 4px white; */ - border-radius: 18px; -} - - -.selected.power_card { - outline: solid silver 3px; - /*box-shadow: 0 0 4px white; */ - border-radius: 18px; +.panel:has(.panel_body:empty) { + display: none; } -/* =============== OTHER ===============*/ -#space-characteristics {display: none} - -/* =============== CARD IMAGES =========*/ +/* CARD IMAGES */ #tooltip { position: fixed; @@ -626,116 +251,179 @@ left: 660px} width: 250px; height: 350px; border-radius: 16px; - box-shadow: 1px 2px 4px #0004; -} - -.card_1 {background-image: url(cards/e1.gif)} -.card_2 {background-image: url(cards/e2.gif)} -.card_3 {background-image: url(cards/e3.gif)} -.card_4 {background-image: url(cards/e4.gif)} -.card_5 {background-image: url(cards/e5.gif)} -.card_6 {background-image: url(cards/e6.gif)} -.card_7 {background-image: url(cards/e7.gif)} -.card_8 {background-image: url(cards/e8.gif)} -.card_9 {background-image: url(cards/e9.gif)} -.card_10 {background-image: url(cards/e10.gif)} -.card_11 {background-image: url(cards/e11.gif)} -.card_12 {background-image: url(cards/e12.gif)} -.card_13 {background-image: url(cards/e13.gif)} -.card_14 {background-image: url(cards/e14.gif)} -.card_15 {background-image: url(cards/e15.gif)} -.card_16 {background-image: url(cards/e16.gif)} -.card_17 {background-image: url(cards/e17.gif)} -.card_18 {background-image: url(cards/e18.gif)} -.card_19 {background-image: url(cards/e19.gif)} -.card_20 {background-image: url(cards/e20.gif)} -.card_21 {background-image: url(cards/e21.gif)} -.card_22 {background-image: url(cards/e22.gif)} -.card_23 {background-image: url(cards/e23.gif)} -.card_24 {background-image: url(cards/e24.gif)} -.card_25 {background-image: url(cards/e25.gif)} -.card_26 {background-image: url(cards/e26.gif)} -.card_27 {background-image: url(cards/e27.gif)} -.card_28 {background-image: url(cards/e28.gif)} -.card_29 {background-image: url(cards/e29.gif)} -.card_30 {background-image: url(cards/e30.gif)} -.card_31 {background-image: url(cards/e31.gif)} -.card_32 {background-image: url(cards/e32.gif)} -.card_33 {background-image: url(cards/e33.gif)} -.card_34 {background-image: url(cards/e34.gif)} -.card_35 {background-image: url(cards/e35.gif)} -.card_36 {background-image: url(cards/e36.gif)} -.card_37 {background-image: url(cards/e37.gif)} -.card_38 {background-image: url(cards/e38.gif)} -.card_39 {background-image: url(cards/e39.gif)} -.card_40 {background-image: url(cards/e40.gif)} -.card_41 {background-image: url(cards/e41.gif)} -.card_42 {background-image: url(cards/e42.gif)} -.card_43 {background-image: url(cards/e43.gif)} -.card_44 {background-image: url(cards/e44.gif)} -.card_45 {background-image: url(cards/e45.gif)} -.card_46 {background-image: url(cards/e46.gif)} -.card_47 {background-image: url(cards/e47.gif)} -.card_48 {background-image: url(cards/e48.gif)} -.card_49 {background-image: url(cards/e49.gif)} -.card_50 {background-image: url(cards/e50.gif)} -.card_51 {background-image: url(cards/e51.gif)} -.card_52 {background-image: url(cards/e52.gif)} -.card_53 {background-image: url(cards/e53.gif)} -.card_54 {background-image: url(cards/e54.gif)} -.card_55 {background-image: url(cards/e55.gif)} -.card_56 {background-image: url(cards/e56.gif)} -.card_57 {background-image: url(cards/e57.gif)} -.card_58 {background-image: url(cards/e58.gif)} -.card_59 {background-image: url(cards/e59.gif)} -.card_60 {background-image: url(cards/e60.gif)} -.card_61 {background-image: url(cards/e61.gif)} -.card_62 {background-image: url(cards/e62.gif)} -.card_63 {background-image: url(cards/e63.gif)} -.card_64 {background-image: url(cards/e64.gif)} -.card_65 {background-image: url(cards/e65.gif)} -.card_66 {background-image: url(cards/e66.gif)} -.card_67 {background-image: url(cards/e67.gif)} -.card_68 {background-image: url(cards/e68.gif)} -.card_69 {background-image: url(cards/e69.gif)} -.card_70 {background-image: url(cards/e70.gif)} -.card_71 {background-image: url(cards/e71.gif)} -.card_72 {background-image: url(cards/e72.gif)} -.card_73 {background-image: url(cards/e73.gif)} -.card_74 {background-image: url(cards/e74.gif)} -.card_75 {background-image: url(cards/e75.gif)} -.card_76 {background-image: url(cards/e76.gif)} -.card_77 {background-image: url(cards/e77.gif)} -.card_78 {background-image: url(cards/e78.gif)} -.card_79 {background-image: url(cards/e79.gif)} -.card_80 {background-image: url(cards/e80.gif)} -.card_81 {background-image: url(cards/e81.gif)} -.card_82 {background-image: url(cards/e82.gif)} -.card_83 {background-image: url(cards/e83.gif)} -.card_84 {background-image: url(cards/e84.gif)} -.card_85 {background-image: url(cards/e85.gif)} -.card_86 {background-image: url(cards/e86.gif)} -.card_87 {background-image: url(cards/e87.gif)} -.card_88 {background-image: url(cards/e88.gif)} -.card_89 {background-image: url(cards/e89.gif)} -.card_90 {background-image: url(cards/e90.gif)} -.card_91 {background-image: url(cards/e91.gif)} -.card_92 {background-image: url(cards/e92.gif)} -.card_93 {background-image: url(cards/e93.gif)} -.card_94 {background-image: url(cards/e94.gif)} -.card_95 {background-image: url(cards/e95.gif)} -.card_96 {background-image: url(cards/e96.gif)} -.card_97 {background-image: url(cards/e97.gif)} -.card_98 {background-image: url(cards/e98.gif)} -.card_99 {background-image: url(cards/e99.gif)} -.card_100 {background-image: url(cards/e100.gif)} -.card_101 {background-image: url(cards/e101.gif)} -.card_102 {background-image: url(cards/e102.gif)} -.card_103 {background-image: url(cards/e103.gif)} -.card_104 {background-image: url(cards/e104.gif)} -.card_105 {background-image: url(cards/e105.gif)} -.card_106 {background-image: url(cards/e106.gif)} -.card_107 {background-image: url(cards/e107.gif)} -.card_108 {background-image: url(cards/e108.gif)} -.card_109 {background-image: url(cards/e109.gif)} -.card_110 {background-image: url(cards/e110.gif)} + box-shadow: 0 0 0 1px #444, 1px 2px 4px #0004; +} + +.card.action { + box-shadow: 0 0 0 1px #444, 0 0 0 4px white; +} + +.card.selected { + box-shadow: 0 0 0 1px #444, 0 0 0 4px yellow; +} + +.card.event_0 { background-image: url(cards100/event_back.webp) } +.card.event_1 { background-image: url(cards100/event_1.webp) } +.card.event_2 { background-image: url(cards100/event_2.webp) } +.card.event_3 { background-image: url(cards100/event_3.webp) } +.card.event_4 { background-image: url(cards100/event_4.webp) } +.card.event_5 { background-image: url(cards100/event_5.webp) } +.card.event_6 { background-image: url(cards100/event_6.webp) } +.card.event_7 { background-image: url(cards100/event_7.webp) } +.card.event_8 { background-image: url(cards100/event_8.webp) } +.card.event_9 { background-image: url(cards100/event_9.webp) } +.card.event_10 { background-image: url(cards100/event_10.webp) } +.card.event_11 { background-image: url(cards100/event_11.webp) } +.card.event_12 { background-image: url(cards100/event_12.webp) } +.card.event_13 { background-image: url(cards100/event_13.webp) } +.card.event_14 { background-image: url(cards100/event_14.webp) } +.card.event_15 { background-image: url(cards100/event_15.webp) } +.card.event_16 { background-image: url(cards100/event_16.webp) } +.card.event_17 { background-image: url(cards100/event_17.webp) } +.card.event_18 { background-image: url(cards100/event_18.webp) } +.card.event_19 { background-image: url(cards100/event_19.webp) } +.card.event_20 { background-image: url(cards100/event_20.webp) } +.card.event_21 { background-image: url(cards100/event_21.webp) } +.card.event_22 { background-image: url(cards100/event_22.webp) } +.card.event_23 { background-image: url(cards100/event_23.webp) } +.card.event_24 { background-image: url(cards100/event_24.webp) } +.card.event_25 { background-image: url(cards100/event_25.webp) } +.card.event_26 { background-image: url(cards100/event_26.webp) } +.card.event_27 { background-image: url(cards100/event_27.webp) } +.card.event_28 { background-image: url(cards100/event_28.webp) } +.card.event_29 { background-image: url(cards100/event_29.webp) } +.card.event_30 { background-image: url(cards100/event_30.webp) } +.card.event_31 { background-image: url(cards100/event_31.webp) } +.card.event_32 { background-image: url(cards100/event_32.webp) } +.card.event_33 { background-image: url(cards100/event_33.webp) } +.card.event_34 { background-image: url(cards100/event_34.webp) } +.card.event_35 { background-image: url(cards100/event_35.webp) } +.card.event_36 { background-image: url(cards100/event_36.webp) } +.card.event_37 { background-image: url(cards100/event_37.webp) } +.card.event_38 { background-image: url(cards100/event_38.webp) } +.card.event_39 { background-image: url(cards100/event_39.webp) } +.card.event_40 { background-image: url(cards100/event_40.webp) } +.card.event_41 { background-image: url(cards100/event_41.webp) } +.card.event_42 { background-image: url(cards100/event_42.webp) } +.card.event_43 { background-image: url(cards100/event_43.webp) } +.card.event_44 { background-image: url(cards100/event_44.webp) } +.card.event_45 { background-image: url(cards100/event_45.webp) } +.card.event_46 { background-image: url(cards100/event_46.webp) } +.card.event_47 { background-image: url(cards100/event_47.webp) } +.card.event_48 { background-image: url(cards100/event_48.webp) } +.card.event_49 { background-image: url(cards100/event_49.webp) } +.card.event_50 { background-image: url(cards100/event_50.webp) } +.card.event_51 { background-image: url(cards100/event_51.webp) } +.card.event_52 { background-image: url(cards100/event_52.webp) } +.card.event_53 { background-image: url(cards100/event_53.webp) } +.card.event_54 { background-image: url(cards100/event_54.webp) } +.card.event_55 { background-image: url(cards100/event_55.webp) } +.card.event_56 { background-image: url(cards100/event_56.webp) } +.card.event_57 { background-image: url(cards100/event_57.webp) } +.card.event_58 { background-image: url(cards100/event_58.webp) } +.card.event_59 { background-image: url(cards100/event_59.webp) } +.card.event_60 { background-image: url(cards100/event_60.webp) } +.card.event_61 { background-image: url(cards100/event_61.webp) } +.card.event_62 { background-image: url(cards100/event_62.webp) } +.card.event_63 { background-image: url(cards100/event_63.webp) } +.card.event_64 { background-image: url(cards100/event_64.webp) } +.card.event_65 { background-image: url(cards100/event_65.webp) } +.card.event_66 { background-image: url(cards100/event_66.webp) } +.card.event_67 { background-image: url(cards100/event_67.webp) } +.card.event_68 { background-image: url(cards100/event_68.webp) } +.card.event_69 { background-image: url(cards100/event_69.webp) } +.card.event_70 { background-image: url(cards100/event_70.webp) } +.card.event_71 { background-image: url(cards100/event_71.webp) } +.card.event_72 { background-image: url(cards100/event_72.webp) } +.card.event_73 { background-image: url(cards100/event_73.webp) } +.card.event_74 { background-image: url(cards100/event_74.webp) } +.card.event_75 { background-image: url(cards100/event_75.webp) } +.card.event_76 { background-image: url(cards100/event_76.webp) } +.card.event_77 { background-image: url(cards100/event_77.webp) } +.card.event_78 { background-image: url(cards100/event_78.webp) } +.card.event_79 { background-image: url(cards100/event_79.webp) } +.card.event_80 { background-image: url(cards100/event_80.webp) } +.card.event_81 { background-image: url(cards100/event_81.webp) } +.card.event_82 { background-image: url(cards100/event_82.webp) } +.card.event_83 { background-image: url(cards100/event_83.webp) } +.card.event_84 { background-image: url(cards100/event_84.webp) } +.card.event_85 { background-image: url(cards100/event_85.webp) } +.card.event_86 { background-image: url(cards100/event_86.webp) } +.card.event_87 { background-image: url(cards100/event_87.webp) } +.card.event_88 { background-image: url(cards100/event_88.webp) } +.card.event_89 { background-image: url(cards100/event_89.webp) } +.card.event_90 { background-image: url(cards100/event_90.webp) } +.card.event_91 { background-image: url(cards100/event_91.webp) } +.card.event_92 { background-image: url(cards100/event_92.webp) } +.card.event_93 { background-image: url(cards100/event_93.webp) } +.card.event_94 { background-image: url(cards100/event_94.webp) } +.card.event_95 { background-image: url(cards100/event_95.webp) } +.card.event_96 { background-image: url(cards100/event_96.webp) } +.card.event_97 { background-image: url(cards100/event_97.webp) } +.card.event_98 { background-image: url(cards100/event_98.webp) } +.card.event_99 { background-image: url(cards100/event_99.webp) } +.card.event_100 { background-image: url(cards100/event_100.webp) } +.card.event_101 { background-image: url(cards100/event_101.webp) } +.card.event_102 { background-image: url(cards100/event_102.webp) } +.card.event_103 { background-image: url(cards100/event_103.webp) } +.card.event_104 { background-image: url(cards100/event_104.webp) } +.card.event_105 { background-image: url(cards100/event_105.webp) } +.card.event_106 { background-image: url(cards100/event_106.webp) } +.card.event_107 { background-image: url(cards100/event_107.webp) } +.card.event_108 { background-image: url(cards100/event_108.webp) } +.card.event_109 { background-image: url(cards100/event_109.webp) } +.card.event_110 { background-image: url(cards100/event_110.webp) } + +.card.power_0 { background-image: url(cards100/power_back.webp) } +.card.power_1 { background-image: url(cards100/power_1.webp) } +.card.power_2 { background-image: url(cards100/power_2.webp) } +.card.power_3 { background-image: url(cards100/power_3.webp) } +.card.power_4 { background-image: url(cards100/power_4.webp) } +.card.power_5 { background-image: url(cards100/power_5.webp) } +.card.power_6 { background-image: url(cards100/power_6.webp) } +.card.power_7 { background-image: url(cards100/power_7.webp) } +.card.power_8 { background-image: url(cards100/power_8.webp) } +.card.power_9 { background-image: url(cards100/power_9.webp) } +.card.power_10 { background-image: url(cards100/power_10.webp) } +.card.power_11 { background-image: url(cards100/power_11.webp) } +.card.power_12 { background-image: url(cards100/power_12.webp) } +.card.power_13 { background-image: url(cards100/power_13.webp) } +.card.power_14 { background-image: url(cards100/power_14.webp) } +.card.power_15 { background-image: url(cards100/power_15.webp) } +.card.power_16 { background-image: url(cards100/power_16.webp) } +.card.power_17 { background-image: url(cards100/power_17.webp) } +.card.power_18 { background-image: url(cards100/power_18.webp) } +.card.power_19 { background-image: url(cards100/power_19.webp) } +.card.power_20 { background-image: url(cards100/power_20.webp) } +.card.power_21 { background-image: url(cards100/power_21.webp) } +.card.power_22 { background-image: url(cards100/power_22.webp) } +.card.power_23 { background-image: url(cards100/power_23.webp) } +.card.power_24 { background-image: url(cards100/power_24.webp) } +.card.power_25 { background-image: url(cards100/power_25.webp) } +.card.power_26 { background-image: url(cards100/power_26.webp) } +.card.power_27 { background-image: url(cards100/power_27.webp) } +.card.power_28 { background-image: url(cards100/power_28.webp) } +.card.power_29 { background-image: url(cards100/power_29.webp) } +.card.power_30 { background-image: url(cards100/power_30.webp) } +.card.power_31 { background-image: url(cards100/power_31.webp) } +.card.power_32 { background-image: url(cards100/power_32.webp) } +.card.power_33 { background-image: url(cards100/power_33.webp) } +.card.power_34 { background-image: url(cards100/power_34.webp) } +.card.power_35 { background-image: url(cards100/power_35.webp) } +.card.power_36 { background-image: url(cards100/power_36.webp) } +.card.power_37 { background-image: url(cards100/power_37.webp) } +.card.power_38 { background-image: url(cards100/power_38.webp) } +.card.power_39 { background-image: url(cards100/power_39.webp) } +.card.power_40 { background-image: url(cards100/power_40.webp) } +.card.power_41 { background-image: url(cards100/power_41.webp) } +.card.power_42 { background-image: url(cards100/power_42.webp) } +.card.power_43 { background-image: url(cards100/power_43.webp) } +.card.power_44 { background-image: url(cards100/power_44.webp) } +.card.power_45 { background-image: url(cards100/power_45.webp) } +.card.power_46 { background-image: url(cards100/power_46.webp) } +.card.power_47 { background-image: url(cards100/power_47.webp) } +.card.power_48 { background-image: url(cards100/power_48.webp) } +.card.power_49 { background-image: url(cards100/power_49.webp) } +.card.power_50 { background-image: url(cards100/power_50.webp) } +.card.power_51 { background-image: url(cards100/power_51.webp) } +.card.power_52 { background-image: url(cards100/power_52.webp) } diff --git a/play.html b/play.html index e09e214..eb2f495 100644 --- a/play.html +++ b/play.html @@ -7,204 +7,140 @@ 1989 - - - +
    - + + +
  • Rules of Play +
  • Background Book +
  • Reference Sheets +
  • +
  • Card Gallery +
  • +
    +
    + -
  • Rules of Play -
  • Background Book -
  • Reference Sheets - +
  • Show removed events +
  • Show discard
  • - - -
    -
    - - -
    - -
    -
    -
    -

    - -
    - - - - -
    -

    1

    -
    -

    1

    -
    -

    1

    -
    -

    1

    -
    -

    1

    -
    -

    1

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + - - - - - - - -
    -
    +
    -
    - - - -
    -
    -
    Event Markers
    -
    - - - - - - - - - - - - - - - -
    -
    -
    + -
    -
    -
    Cards on the Table
    -
    -
    -
    +
    +
    Cards on the Table
    +
    +
    -
    -
    -
    Played Card
    -
    +
    +
    Played Card
    +
    -
    - - -
    -
    -
    Discard
    -
    -
    -
    - - -
    -
    -
    Permanently Removed Events
    -
    -
    -
    + +
    +
    Hand
    +
    +
    -
    -
    -
    Ceausescu Cards
    -
    -
    -
    -
    Power Struggle Hand
    -
    -
    -
    - - +
    +
    Ceausescu Cards
    +
    +
    +
    +
    Power Struggle Hand
    +
    +
    -
    +
    +
    Opponent Hand
    +
    +
    -
    -
    Opponent Hand
    -
    -
    - -
    +
    +
    Opponent Power Struggle Hand
    +
    +
    -
    -
    -
    Set aside card
    -
    -
    -
    - +
    +
    Samizdat Card
    +
    +
    - -
    + +
    +
    Permanently Removed Events
    +
    +
    -
    -
    Hand
    -
    + +
    +
    Discard
    +
    -
    - - diff --git a/play.js b/play.js index 5ccf136..9ac9e60 100644 --- a/play.js +++ b/play.js @@ -1,677 +1,417 @@ +"use strict" -const seed = 'none' -const scenario = 'standard' -const options = 'none' -//const rules = require("./rules") +let action_register = [] +function register_action(target, action, id) { + target.my_action = action + target.my_id = id + target.onmousedown = on_click_action + action_register.push(target) +} + +function is_action(action, arg) { + return !!(view.actions && view.actions[action] && view.actions[action].includes(arg)) +} + +function on_click_action(evt) { + if (evt.button === 0) + send_action(evt.target.my_action, evt.target.my_id) +} + +const last_space = 75 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 countries = [ "Poland", "Hungary", "East_Germany", "Bulgaria", "Czechoslovakia", "Romania" ] +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 ui = { + favicon: document.getElementById("favicon"), + turn_info: document.getElementById("turn_info"), + + turn: document.getElementById("marker_turn"), + round: document.getElementById("marker_action_round"), + stability: document.getElementById("marker_stability_track"), + dem_tst: document.getElementById("marker_dem_tst"), + com_tst: document.getElementById("marker_com_tst"), + vp: document.getElementById("marker_vp"), + + event_reminder_list: document.getElementById("event_reminder_list"), + + played_card: document.getElementById("played_card"), + hand: document.getElementById("hand"), + power_hand: document.getElementById("power_hand"), + opp_hand: document.getElementById("opp_hand"), + opp_power_hand: document.getElementById("opp_power_hand"), + discard: document.getElementById("discard"), + removed: document.getElementById("removed"), + table_cards: document.getElementById("table_cards"), + + ceausescu_hand: document.getElementById("ceausescu_hand"), + samizdat_card: document.getElementById("samizdat_card"), +} + +function create_country(id, name) { + let [ x, y, w, h ] = LAYOUT[name] + let xc = Math.round(x + w / 2) + let yc = Math.round(y + h / 2) + + let e = document.createElement("div") + e.className = "marker demInfl" + e.style.left = xc - 25 + "px" + e.style.top = yc - 25 + "px" + ui.countries[id] = e + document.getElementById("markers").appendChild(e) +} + +function create_ui() { + ui.layout_xy = [] + ui.spaces = [] + ui.dem_inf = [] + ui.com_inf = [] + + for (let s = 1; s <= last_space; ++s) { + let info = spaces[s] + let [ x, y, w, h ] = LAYOUT[info.ascii_name] + let xc = Math.round( x + w / 2 ) + let yc = Math.round( y + h / 2 ) + x -= 6 + y -= 6 + w += 12 + h += 12 + + ui.layout_xy[s] = [ xc, yc ] + + let space_e = document.createElement("div") + register_action(space_e, "space", s) + space_e.className = "space " + info.country + space_e.style.left = x + "px" + space_e.style.top = y + "px" + space_e.style.width = w + "px" + space_e.style.height = h + "px" + ui.spaces[s] = space_e + + let com_e = document.createElement("div") + com_e.className = "marker comInfl hide" + com_e.style.left = (xc + 32 - 25) + "px" + com_e.style.top = (yc + 12 - 25) + "px" + ui.com_inf[s] = com_e + + let dem_e = document.createElement("div") + dem_e.className = "marker demInfl hide" + dem_e.style.left = (xc - 32 - 25) + "px" + dem_e.style.top = (yc + 12 - 25) + "px" + ui.dem_inf[s] = dem_e + + document.getElementById("spaces").append(space_e) + document.getElementById("markers").appendChild(com_e) + document.getElementById("markers").appendChild(dem_e) + } - const is_mobile = window.matchMedia("(pointer: coarse)").matches + ui.cards = [] for (let c = 1; c <= last_card; ++c) { + const card_e = document.createElement("div") + register_action(card_e, "card", c) + card_e.className = "card event_" + c + ui.cards[c] = card_e + } - 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.power_cards = [] + for (let c = 1; c <= last_power_card; ++c) { + const power_card_e = document.createElement("div") + register_action(power_card_e, "power_card", c) + power_card_e.className = "card power_" + c + ui.power_cards[c] = power_card_e + } - ui.cards.push(hand_card); + ui.events = [] + for (let id of box_events) { + ui.events[id] = document.createElement("div") + ui.events[id].id = "event_" + id + ui.events[id].className = "marker event aside" } - - - - 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); + for (let id of board_events) { + ui.events[id] = document.createElement("div") + ui.events[id].id = "event_" + id + ui.events[id].className = "marker event" + document.getElementById("markers").appendChild(ui.events[id]) } -} - - - -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 + ui.countries = [] + create_country(0, "country_poland") + create_country(1, "country_hungary") + create_country(2, "country_east_germany") + create_country(3, "country_bulgaria") + create_country(4, "country_czechoslovakia") + create_country(5, "country_romania") } // 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)) { + 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)) { + evt.stopPropagation() + } else if (send_action("sc", space)) { //console.log('send_action with sc:', space); - evt.stopPropagation(); + 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(); - } - } - if (is_action('power_card', card)) { - if (send_action('power_card', card)) { - evt.stopPropagation(); - } + // console.log('send_action failed for space:', space); } } + //hide_popup_menu(); } -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 +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' + p.className = "i" } - text = text.replace(/_/g, ' ') + 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/)) { + p.className = "h1" + } else if (text.match(/^\.h2d/)) { text = text.substring(5) - p.className = 'h2 dem' - } - else if (text.match(/^\.h2c/)) { + p.className = "h2 dem" + } else if (text.match(/^\.h2c/)) { text = text.substring(5) - p.className = 'h2 com' - } - else if (text.match(/^\.h2/)) { + p.className = "h2 com" + } else if (text.match(/^\.h2/)) { text = text.substring(4) - p.className = 'h2' - } - else if (text.match(/^\.h3/)) { + p.className = "h2" + } else if (text.match(/^\.h3/)) { text = text.substring(4) - p.className = 'h3' + 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 layout_turn_marker() { + let x = 654 + 24 + (view.turn - 1) * 53 + let y = 80 + 24 + ui.turn.style.left = (x - 25) + "px" + ui.turn.style.top = (y - 25) + "px" +} +function layout_round_marker() { + let x = 709 + 24 + (view.turn - 1) * 53 + let y = 142 + 24 + ui.round.style.left = (x - 25) + "px" + ui.round.style.top = (y - 25) + "px" + if (view.round_player === "Democrat") // TODO: bit flag? + ui.round.className = "marker dem" + else + ui.round.className = "marker com" } +function layout_stability_marker() { + let x = 24 + 1381 + let y = 24 + 1081 + view.stability * 54 + ui.stability.style.left = (x - 25) + "px" + ui.stability.style.top = (y - 25) + "px" +} -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'; - } - - } +let TST_X = [ 53, 53+69, 53+69*2, 53+69*3, 53+69*4, 53+69*5, 53+69*6, 556 ] +let TST_Y = [ 2128, 2257 ] -// 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'} - } +function layout_tst_marker(e, v, top) { + let x = TST_X[v] + 24 + let y = TST_Y[top] + 24 + e.style.left = (x - 25) + "px" + e.style.top = (y - 25) + "px" +} -// 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` +function layout_vp_marker() { + let x, y + if (view.vp === 0) { + y = 2425 + 25 + x = 843 + 28 } - 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 if (view.vp < 0) { + if (view.vp & 1) { + y = 2456 + 25 + x = 803 + 28 - (-view.vp - 1)/2 * 62 + } else { + y = 2395 + 25 + x = 772 + 28 - (-view.vp - 2)/2 * 62 } - } 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 if (view.vp > 0) { + if (view.vp & 1) { + y = 2396 + 25 + x = 883 + 28 + (view.vp - 1)/2 * 62 } else { - discard_card.classList.remove('selected') + y = 2455 + 25 + x = 913 + 28 + (view.vp - 2)/2 * 62 } - } -} else { - if (!show_discard) { - document.getElementById("discard_panel").classList.add("hide") + } + ui.vp.style.left = (x - 25) + "px" + ui.vp.style.top = (y - 25) + "px" +} + +function layout_country(id) { + for (let i = 0; i < 6; i++) { + // TODO: what number to display? + if (view.revolutions[id]) + ui.countries[id].className = "marker comInfl ctl v" + view.times_held[id] + else if (view.times_held[id] > 0) + ui.countries[id].className = "marker demInfl ctl v" + view.times_held[id] + else + ui.countries[id].className = "marker 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") -} +function on_update() { + if (!ui.spaces) + create_ui() -// 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') - } - } - } + // UPDATE ASIDE + if (view.is_pwr_struggle) { + roles.Democrat.stat.textContent = `${view.democrat_power_hand} Power cards` + roles.Communist.stat.textContent = `${view.communist_power_hand} Power cards` } else { - document.getElementById("opp_hand_panel").classList.add("hide") + roles.Democrat.stat.textContent = `${view.democrat_hand} cards` + roles.Communist.stat.innerText = `${view.communist_hand} cards` } -} 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') - } + ui.turn_info.innerText = `Strategy deck: ${view.strategy_deck} cards` + + // UPDATE TRACK MARKERS + layout_turn_marker() + layout_round_marker() + layout_stability_marker() + layout_vp_marker() + layout_tst_marker(ui.dem_tst, view.dem_tst, 0) + layout_tst_marker(ui.com_tst, view.com_tst, 1) + + // UPDATE EVENT MARKERS ON THE BOARD + + if (view.persistent_events.includes(2)) + ui.events[2].style.display = "block" + else + ui.events[2].style.display = "none" + + if (view.persistent_events.includes(9)) + ui.events[9].style.display = "block" + else + ui.events[9].style.display = "none" + + if (view.persistent_events.includes(69)) { + ui.events[69].style.display = "block" + ui.events[69].style.left = ui.layout_xy[view.systematization][0] - 25 + "px" + ui.events[69].style.top = ui.layout_xy[view.systematization][1] - 25 + "px" } else { - document.getElementById("opp_hand_panel").classList.add("hide") + ui.events[69].style.display = "none" } -} -// 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'); - } - } + if (view.persistent_events.includes(97)) { + ui.events[97].style.display = "block" + ui.events[97].style.left = ui.layout_xy[view.the_tyrant_is_gone][0] - 25 + "px" + ui.events[97].style.top = ui.layout_xy[view.the_tyrant_is_gone][1] - 25 + "px" } else { - document.getElementById("power_panel").classList.add("hide") + ui.events[97].style.display = "none" } -// CEAUSESCU + // EVENT REMINDER LIST + + ui.event_reminder_list.replaceChildren() + for (let id of box_events) + if (view.persistent_events.includes(id)) + ui.event_reminder_list.appendChild(ui.events[id]) + + // UPDATE INFLUENCE VALUES + for (let s = 1; s <= last_space; ++s) { + const demInfl = view.demInfl[s] + const comInfl = view.comInfl[s] + + if (demInfl - comInfl >= spaces[s].stability) + ui.dem_inf[s].className = "marker demInfl ctl v" + demInfl + else if (demInfl > 0) + ui.dem_inf[s].className = "marker demInfl v" + demInfl + else + ui.dem_inf[s].className = "marker demInfl hide" + + if (comInfl - demInfl >= spaces[s].stability) + ui.com_inf[s].className = "marker comInfl ctl v" + comInfl + else if (comInfl > 0) + ui.com_inf[s].className = "marker comInfl v" + comInfl + else + ui.com_inf[s].className = "marker comInfl hide" + } -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') + // UPDATE COUNTRY MARKERS - } -} else { - document.getElementById("ceausescu_panel").classList.add("hide") -} + for (let i = 0; i < 6; ++i) + layout_country(i) -// 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 CARD DISPLAYS -// 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) + ui.played_card.replaceChildren() + if (view.played_card > 0) + ui.played_card.appendChild(ui.cards[view.played_card]) -// UPDATE EVENT MARKERS ON THE BOARD + ui.samizdat_card.replaceChildren() + if (view.samizdat > 0) + ui.samizdat_card.appendChild(ui.cards[view.samizdat]) -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' - } -} + ui.hand.replaceChildren() + for (let c of view.hand) + ui.hand.appendChild(ui.cards[c]) + ui.power_hand.replaceChildren() + if (view.power_hand) + for (let c of view.power_hand) + ui.hand.appendChild(ui.power_cards[c]) -// UPDATE EVENT MARKERS BELOW THE BOARD + ui.opp_hand.replaceChildren() + if (view.opp_hand) + for (let c of view.opp_hand) + ui.opp_hand.appendChild(ui.cards[c]) -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' - } -} + // TODO: fix rules to set view.opp_power_hand + ui.opp_power_hand.replaceChildren() + if (view.opp_power_hand) + for (let c of view.opp_power_hand) + ui.opp_hand.appendChild(ui.power_cards[c]) + ui.ceausescu_hand.replaceChildren() + if (view.ceausescu_cards) + for (let c of view.ceausescu_cards) + ui.ceausescu_hand.appendChild(ui.power_cards[c]) -// 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 - } - */ -} + ui.discard.replaceChildren() + for (let c of view.strategy_discard) + ui.discard.appendChild(ui.cards[c]) -if (box_events_showing) { - document.getElementById('events_panel').classList.remove("hide") -} else { - document.getElementById('events_panel').classList.add("hide") -} + ui.removed.replaceChildren() + for (let c of view.strategy_removed) + ui.discard.appendChild(ui.cards[c]) -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'; -} + ui.table_cards.replaceChildren() + if (view.table_cards) + for (let c of view.table_cards) + ui.table_cards.appendChild(ui.cards[c]) -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'} + for (let e of action_register) + e.classList.toggle("action", is_action(e.my_action, e.my_id)) action_button("yes", "Yes") action_button("no", "No") @@ -696,7 +436,7 @@ if (view.persistent_events.includes(97)) { action_button("strike", "Strike") action_button("march", "March") action_button("rally", "Rally in the Square") - action_button("petition", "Petition") + action_button("petition", "Petition") action_button("bonus", "Calculate VP bonus") action_button("scoring", "Score country") action_button("retain", "Retain Power") @@ -704,9 +444,9 @@ if (view.persistent_events.includes(97)) { 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("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") @@ -716,8 +456,6 @@ if (view.persistent_events.includes(97)) { action_button("done", "Done") action_button("end_round", "End Round") action_button("undo", "Undo") - -console.log('view.actions', view.actions) } // =========================== LOG FUNCTIONS ============================================== @@ -738,9 +476,8 @@ function sub_power_card_value(match, p1) { } function sub_space_name(match, p1) { - let x = p1 | 0 - let id = spaces[x].space_id - let name = spaces[x].name_unique + let id = p1 | 0 + let name = spaces[id].name_unique return `${name}` } @@ -754,45 +491,32 @@ const die = { D3: '', D4: '', D5: '', - D6: '' + D6: '', } // =========================== VISUAL FUNCTIONS ==========================================# -function on_focus_card_tip(card_number) { - document.getElementById("tooltip").className = "card card_" + card_number +function on_focus_card_tip(card_number) { + document.getElementById("tooltip").className = "card event_" + card_number } -function on_blur_card_tip() { +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) + ui.spaces[id].classList.add("tip") } function on_blur_space_tip(id) { - space = document.getElementById(`space_${id}`) - space.classList.remove("tip") + ui.spaces[id].classList.remove("tip") } -function toggle_pieces() { - document.getElementById("pieces").classList.toggle("hide") +function on_click_space_tip(id) { + scroll_into_view(ui.spaces[id]) } - function toggle_discard() { - if (show_discard) { - show_discard = false - } else { - show_discard = true - } document.getElementById("discard_panel").classList.toggle("hide") } @@ -800,20 +524,118 @@ 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() +// #region GENERATED LAYOUT DATA + +var LAYOUT = { + "Babes-Bolyai University": [958,1529,127,75], + "Berlin": [329,148,127,75], + "Bialystok": [1202,436,127,76], + "Brasov": [1339,1556,127,75], + "Bratislava": [539,1013,127,76], + "Brno": [521,904,127,76], + "Bucuresti": [1186,1837,127,76], + "Budapest": [809,1249,127,76], + "Bulgarian Writers": [838,2192,127,76], + "Burgas": [1289,2152,127,76], + "Bydgoszcz": [872,388,127,76], + "Catholic Church, Czechoslovakia": [692,1010,127,75], + "Catholic Church, Hungary": [409,1126,127,76], + "Catholic Church, Poland": [802,558,127,75], + "Ceske Budejovice": [260,765,127,77], + "Charles University": [491,677,128,76], + "Cluj-Napoca": [970,1429,127,76], + "Constanta": [1443,1925,127,76], + "Craiova": [977,1793,127,76], + "Czech Writers": [573,773,127,76], + "Debrecen": [1000,1192,127,76], + "Dresden": [343,479,127,76], + "Eotvos Lorand University": [658,1314,127,76], + "Erfurt": [38,455,127,76], + "Galati": [1409,1778,127,76], + "Gdansk": [896,277,127,76], + "German Writers": [81,239,127,76], + "Gyor": [560,1129,127,76], + "Halle": [231,357,127,75], + "Harghita/Covasna": [1186,1560,127,75], + "Hungarian Writers": [452,1322,127,76], + "Iasi": [1369,1395,127,76], + "Jagiellonian University": [870,867,127,76], + "Karl-Marx-Stadt": [184,492,127,75], + "Katowice": [733,723,127,76], + "Kosice": [995,1037,127,76], + "Krakow": [911,761,127,76], + "Leipzig": [387,379,127,76], + "Lodz": [959,620,127,76], + "Lublin": [1124,754,127,76], + "Lutheran Church": [391,271,127,76], + "Magdeburg": [79,352,127,75], + "Miskolc": [851,1146,127,76], + "Orthodox Church, Bulgaria": [1130,1956,127,76], + "Orthodox Church, Romania": [1094,1700,127,76], + "Ostrava": [673,868,127,75], + "Pecs": [626,1406,127,75], + "Pleven": [979,1948,127,76], + "Ploiesti": [1356,1671,127,76], + "Plovdiv": [987,2209,127,75], + "Plzen": [211,615,127,76], + "Polish Writers": [1051,883,127,75], + "Poznan": [671,452,127,76], + "Praha": [412,782,127,75], + "Presov": [844,1010,127,75], + "Razgrad": [1219,2057,127,76], + "Romanian Writers": [947,1625,127,75], + "Rostock": [299,53,127,76], + "Ruse": [1277,1956,127,76], + "Schwerin": [148,86,127,76], + "Sliven": [1144,2251,127,75], + "Sofia": [983,2098,127,76], + "Sofia University": [828,2095,127,76], + "Stara Zagora": [1133,2153,127,75], + "Szczecin": [574,263,127,75], + "Szeged": [812,1364,127,76], + "Szekesfehervar": [571,1223,127,75], + "Szombathely": [410,1224,127,76], + "Targu Mures": [1169,1443,127,76], + "Tatabanya": [706,1126,127,75], + "Timisoara": [767,1531,127,76], + "Varna": [1387,2051,127,76], + "Walter Ulbricht Academy": [234,240,127,76], + "Warszawa": [1032,490,127,75], + "Wroclaw": [595,565,127,75], + "action_1": [708,143,48,44], + "action_8": [1080,143,47,43], + "country_bulgaria": [915,1999,46,41], + "country_czechoslovakia": [463,624,44,39], + "country_east_germany": [560,160,43,37], + "country_hungary": [1034,1319,44,39], + "country_poland": [1188,292,44,39], + "country_romania": [1287,1349,44,39], + "event_solidarity_legalized": [779,270,44,43], + "event_the_wall": [222,179,40,41], + "tst_com_1": [53,2257,47,47], + "tst_com_7": [469,2257,47,47], + "tst_com_8": [556,2257,47,47], + "tst_dem_1": [53,2128,47,47], + "tst_dem_7": [469,2128,47,47], + "tst_dem_8": [556,2128,47,47], + "turn_1": [655,81,47,48], + "turn_10": [1133,80,48,48], + "ussr_1": [1381,1080,48,48], + "ussr_2": [1381,1134,48,48], + "ussr_3": [1381,1188,48,48], + "ussr_4": [1381,1243,48,48], + "ussr_5": [1381,1297,48,48], + "vp_0": [843,2425,55,51], + "vp_1": [883,2395,55,50], + "vp_19": [1440,2395,55,50], + "vp_2": [913,2455,56,51], + "vp_20": [1471,2455,55,51], + "vp_neg_1": [803,2455,56,51], + "vp_neg_19": [246,2456,55,50], + "vp_neg_2": [772,2395,56,51], + "vp_neg_20": [215,2395,55,51], +} diff --git a/rules.js b/rules.js index 877c4d8..6ce54dd 100644 --- a/rules.js +++ b/rules.js @@ -268,18 +268,13 @@ exports.view = function(state, player) { // === ACTIONS =========== function gen_action(action, argument) { -//console.log('gen_action called with ', action, ' and ', argument) if (argument === undefined) { - //console.log('argument undefined') view.actions[action] = 1 } else { - if (!(action in view.actions)) { - //console.log('push argument') + if (!(action in view.actions)) view.actions[action] = [] - } view.actions[action].push(argument) } - //console.log('view.actions: ', view.actions, 'view.actions[action]: ', view.actions[action]) } function gen_action_space(space){ @@ -9013,6 +9008,7 @@ states.vm_support_falters = { /* =================== EVENTS ================================ */ // #region GENERATED EVENT CODE + const CODE = [] CODE[1] = [ // Legacy of Martial Law* @@ -9875,43 +9871,44 @@ CODE[110] = [ // Malta Summit* [ vm_remove_opp_infl, 5 ], [ vm_return ], ] -// #endregion - -// ============= TIANANMEN SQUARE TRACK AWARDS ==================== -CODE[203] = [//Tiananmen Square space 3 award - [vm_tst_3], - [vm_return] -] -CODE[204] = [//Tiananmen Square space 4 award - [vm_valid_spaces_opponent], - [vm_tst_4], - [vm_return] +CODE[203] = [ // Tiananmen Square space 3 award + [ vm_tst_3 ], + [ vm_return ], ] -CODE[206] = [//Tiananmen Square space 6 - [vm_valid_spaces_sc], - [vm_tst_6], - [vm_return] + +CODE[204] = [ // Tiananmen Square space 4 award + [ vm_valid_spaces_opponent ], + [ vm_tst_4 ], + [ vm_return ], ] -CODE[208] = [//Tiananmen Square space 8 event - [vm_tst_8], - [vm_return] + +CODE[206] = [ // Tiananmen Square space 6 + [ vm_valid_spaces_sc ], + [ vm_tst_6 ], + [ vm_return ], ] -// ============= POWER STRUGGLE WILDCARDS ========================= +CODE[208] = [ // Tiananmen Square space 8 event + [ vm_tst_8 ], + [ vm_return ], +] -CODE[349] = [//Scare Tactics - [vm_scare_tactics], - [vm_valid_spaces_country_opp], - [vm_prompt, ()=>` from ${country_name(game.vm_active_country)}`], - [vm_remove_opp_infl, 1], - [vm_return] +CODE[349] = [ // Scare Tactics + [ vm_scare_tactics ], + [ vm_valid_spaces_country_opp ], + [ vm_prompt, ()=>` from ${country_name(game.vm_active_country)}` ], + [ vm_remove_opp_infl, 1 ], + [ vm_return ], ] -CODE[350] = [//Support Surges - [vm_support_surges], - [vm_return] + +CODE[350] = [ // Support Surges + [ vm_support_surges ], + [ vm_return ], ] -CODE[351] = [//Support Falters - [vm_support_falters], - [vm_return] + +CODE[351] = [ // Support Falters + [ vm_support_falters ], + [ vm_return ], ] +// #endregion diff --git a/tools/colors.js b/tools/colors.js new file mode 100644 index 0000000..f8f7ace --- /dev/null +++ b/tools/colors.js @@ -0,0 +1,110 @@ +"use strict" + +function rgb_from_any(color) { + switch (color.mode) { + case "rgb": return color + case "lrgb": return rgb_from_lrgb(color) + case "oklab": return rgb_from_oklab(color) + } +} + +function lrgb_from_any(color) { + switch (color.mode) { + case "rgb": return lrgb_from_rgb(color) + case "lrgb": return color + case "oklab": return lrgb_from_oklab(color) + } +} + +function oklab_from_any(color) { + switch (color.mode) { + case "rgb": return oklab_from_rgb(color) + case "lrgb": return oklab_from_lrgb(color) + case "oklab": return color + } +} + +function format_hex(color) { + let {r, g, b} = rgb_from_any(color) + let adj = 1 + r = Math.round(Math.max(0, Math.min(1, r)) * 255) + g = Math.round(Math.max(0, Math.min(1, g)) * 255) + b = Math.round(Math.max(0, Math.min(1, b)) * 255) + let x = (r << 16) | (g << 8) | b + return "#" + x.toString(16).padStart(6, "0") +} + +function parse_hex(str) { + let x = parseInt(str.substring(1), 16) + return { + mode: "rgb", + r: ((x >> 16) & 255) / 255.0, + g: ((x >> 8) & 255) / 255.0, + b: ((x) & 255) / 255.0 + } +} + +function lrgb_from_rgb({ r, g, b }) { + function to_linear(c) { + let ac = Math.abs(c) + if (ac < 0.04045) + return c / 12.92 + return (Math.sign(c) || 1) * Math.pow((ac + 0.055) / 1.055, 2.4) + } + return { + mode: "lrgb", + r: to_linear(r), + g: to_linear(g), + b: to_linear(b) + } +} + +function rgb_from_lrgb({ r, g, b }) { + function from_linear(c) { + let ac = Math.abs(c) + if (ac > 0.0031308) + return (Math.sign(c) || 1) * (1.055 * Math.pow(ac, 1 / 2.4) - 0.055) + return c * 12.92 + } + return { + mode: "rgb", + r: from_linear(r), + g: from_linear(g), + b: from_linear(b) + } +} + +function oklab_from_lrgb({ r, g, b }) { + let L = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b) + let M = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b) + let S = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b) + return { + mode: "oklab", + l: 0.2104542553 * L + 0.793617785 * M - 0.0040720468 * S, + a: 1.9779984951 * L - 2.428592205 * M + 0.4505937099 * S, + b: 0.0259040371 * L + 0.7827717662 * M - 0.808675766 * S + } +} + +function lrgb_from_oklab({ l, a, b }) { + let L = Math.pow(l + 0.3963377774 * a + 0.2158037573 * b, 3) + let M = Math.pow(l - 0.1055613458 * a - 0.0638541728 * b, 3) + let S = Math.pow(l - 0.0894841775 * a - 1.291485548 * b, 3) + return { + mode: "lrgb", + r: +4.0767416621 * L - 3.3077115913 * M + 0.2309699292 * S, + g: -1.2684380046 * L + 2.6097574011 * M - 0.3413193965 * S, + b: -0.0041960863 * L - 0.7034186147 * M + 1.707614701 * S + } +} + +function oklab_from_rgb(rgb) { + return oklab_from_lrgb(lrgb_from_rgb(rgb)) +} + +function rgb_from_oklab(oklab) { + return rgb_from_lrgb(lrgb_from_oklab(oklab)) +} + +if (typeof module === "object") + module.exports = { format_hex, parse_hex, rgb_from_any, lrgb_from_any, oklab_from_any } diff --git a/tools/gencode.js b/tools/gencode.js new file mode 100644 index 0000000..f2e3a26 --- /dev/null +++ b/tools/gencode.js @@ -0,0 +1,106 @@ +"use strict" + +let fs = require("fs") + +let pc = 0 + +function tokenize(s) { + let list = [] + let p = 0, + n = s.length + while (p < n) { + while (p < n && s[p] === " ") + ++p + if (p < n) { + let m = p + while (p < n && s[p] !== " ") { + let q = s[p++] + switch (q) { + case "(": + case "[": + case "{": + for (let x = 1; p < n && x > 0; ++p) { + switch (s[p]) { + case "(": + case "[": + case "{": + ++x + break + case ")": + case "]": + case "}": + --x + break + } + } + break + case '"': + case "'": + case "`": + while (p < n && s[p] !== q) + ++p + break + } + } + list.push(s.substring(m, p)) + } + } + return list +} + +function emit(line) { + ++pc + line[0] = "vm_" + line[0] + for (let i = 1; i < line.length; ++i) { + if (typeof line[i] === "string") { + if (line[i] === "all") + line[i] = 999 + if (line[i][0] === "(" && !line[i].match(/\)=>/)) + line[i] = "()=>" + line[i] + if (line[i][0] === "`") + line[i] = "()=>" + line[i] + } + } + console.log("\t[ " + line.join(", ") + " ],") +} + +console.log("const CODE = []") +let first = false + +for (let line of fs.readFileSync("events.txt", "utf-8").split("\n")) { + line = line.trim() + if (line.length === 0 || line[0] === "#") + continue + if (line === "EOF") + break + line = tokenize(line) + switch (line[0]) { + case "CARD": + if (first++) { + emit(["return"]) + console.log("]") + } + console.log("") + console.log("CODE[" + line[1] + "] = [ // " + line.slice(3).join(" ")) + break + + case "log": + case "prompt": + emit([ line[0], line.slice(1).join(" ") ]) + break + + case "asm": + case "if": + case "while": + emit([ line[0], "()=>" + line.slice(1).join(" ") ]) + break + + default: + emit(line) + break + } +} + +emit(["return"]) +console.log("]") +console.log("// #endregion") diff --git a/tools/gencolors.js b/tools/gencolors.js new file mode 100644 index 0000000..5904741 --- /dev/null +++ b/tools/gencolors.js @@ -0,0 +1,78 @@ +const { parse_hex, format_hex, lrgb_from_any, rgb_from_any, oklab_from_any } = require("./colors.js") + +const white = "#ffffff" +const black = "#000000" + +function lerp(a, b, n) { + return a + (b - a) * n +} + +function blend(a, b, n) { + a = lrgb_from_any(parse_hex(a)) + b = lrgb_from_any(parse_hex(b)) + return format_hex({ + mode: "lrgb", + r: lerp(a.r, b.r, n), + g: lerp(a.g, b.g, n), + b: lerp(a.b, b.b, n) + }) +} + +function multiply_luminance(hex, m) { + let oklab = oklab_from_any(parse_hex(hex)) + oklab.l = Math.max(0, Math.min(1, oklab.l * m)) + return format_hex(oklab) +} + +function add_luminance(hex, m) { + let oklab = oklab_from_any(parse_hex(hex)) + oklab.l = Math.max(0, Math.min(1, oklab.l + m)) + return format_hex(oklab) +} + +function make_3d_colors(base) { + return [ + base, + multiply_luminance(base, 0.9), + multiply_luminance(base, 0.8), + multiply_luminance(base, 0.7), + multiply_luminance(base, 0.4) + ] +} + +function make_2d_colors(base) { + return [ + base, + multiply_luminance(base, 1.2), + multiply_luminance(base, 0.8), + multiply_luminance(base, 0.4) + ] +} + +function make_2d_colors_add(base) { + return [ + base, + add_luminance(base, 0.2), + add_luminance(base, -0.2), + add_luminance(base, -0.5), + ] +} + +function print(x) { + console.log(x) +} + +function gencss(color, sel) { + let [ bg, hi, lo, sh ] = make_2d_colors(color) + print(`${sel} { background-color: ${color}; border-color: ${hi} ${lo} ${lo} ${hi}; box-shadow: 0 0 0 1px ${sh}, 1px 2px 4px #0008; }`) +} + +gencss("#bbbbbb", ".marker") +gencss("#c4e2f6", ".demInfl.ctl") +gencss("#c1272d", ".comInfl.ctl") +gencss("#147fc0", "#marker_action_round.com") +gencss("#c1272d", "#marker_action_round.dem") +gencss("#fadb04", "#marker_vp, #marker_turn") +gencss("#f26649", "#marker_com_tst") +gencss("#c4e2f4", "#marker_dem_tst") + diff --git a/tools/genlayout.js b/tools/genlayout.js new file mode 100644 index 0000000..37f419d --- /dev/null +++ b/tools/genlayout.js @@ -0,0 +1,37 @@ +const fs = require("fs") + +let boxes = [] +let mode, name, x, y, w, h + +function flush() { + if (mode === 'rect') { + boxes[name] = [ x |0, y |0, w |0, h |0 ] + } + x = y = w = h = 0 + name = null +} + +for (let line of fs.readFileSync("tools/layout.svg", "utf-8").split("\n")) { + line = line.trim() + if (line.startsWith(" + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From be53b4b3373da546644ce71ee6a311be406a27aa Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sat, 26 Oct 2024 00:06:21 +0200 Subject: Fix mixed up colors and images in action round marker. --- play.css | 6 +++--- tools/gencolors.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'play.css') diff --git a/play.css b/play.css index 3b49c7b..d98c8ce 100644 --- a/play.css +++ b/play.css @@ -100,8 +100,8 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } .marker { background-color: #ffffff; border-color: #eeeeee #8a8a8a #8a8a8a #eeeeee; box-shadow: 0 0 0 1px #323232, 1px 2px 4px #0008; } .demInfl.ctl { background-color: #c4e2f6; border-color: #e6ffff #8ca8bb #8ca8bb #e6ffff; box-shadow: 0 0 0 1px #274050, 1px 2px 4px #0008; } .comInfl.ctl { background-color: #c1272d; border-color: #e74e4c #9c0009 #9c0009 #e74e4c; box-shadow: 0 0 0 1px #520000, 1px 2px 4px #0008; } -#marker_action_round.com { background-color: #147fc0; border-color: #44a3e6 #005c9b #005c9b #44a3e6; box-shadow: 0 0 0 1px #001a54, 1px 2px 4px #0008; } -#marker_action_round.dem { background-color: #c1272d; border-color: #e74e4c #9c0009 #9c0009 #e74e4c; box-shadow: 0 0 0 1px #520000, 1px 2px 4px #0008; } +#marker_action_round.dem { background-color: #147fc0; border-color: #44a3e6 #005c9b #005c9b #44a3e6; box-shadow: 0 0 0 1px #001a54, 1px 2px 4px #0008; } +#marker_action_round.com { background-color: #c1272d; border-color: #e74e4c #9c0009 #9c0009 #e74e4c; box-shadow: 0 0 0 1px #520000, 1px 2px 4px #0008; } #marker_vp, #marker_turn { background-color: #fadb04; border-color: #ffff51 #c0a100 #c0a100 #ffff51; box-shadow: 0 0 0 1px #563600, 1px 2px 4px #0008; } #marker_com_tst { background-color: #f26649; border-color: #ff9273 #c2391c #c2391c #ff9273; box-shadow: 0 0 0 1px #640000, 1px 2px 4px #0008; } #marker_dem_tst { background-color: #c4e2f4; border-color: #e6ffff #8ca8ba #8ca8ba #e6ffff; box-shadow: 0 0 0 1px #27404f, 1px 2px 4px #0008; } @@ -168,7 +168,7 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } #marker_turn { background-image: url(markers75/turn.png) } #marker_action_round.dem { background-image: url(markers75/action_round_blue.png) } -#marker_action_round.com { background-image: url(markers75/action_round_blue.png) } +#marker_action_round.com { background-image: url(markers75/action_round_red.png) } #marker_stability_track { background-image: url(markers75/ussr_stability_track.png) } #marker_dem_tst { background-image: url(markers75/ts_blue.png) } #marker_com_tst { background-image: url(markers75/ts_red.png) } diff --git a/tools/gencolors.js b/tools/gencolors.js index 5904741..cff0fe2 100644 --- a/tools/gencolors.js +++ b/tools/gencolors.js @@ -70,8 +70,8 @@ function gencss(color, sel) { gencss("#bbbbbb", ".marker") gencss("#c4e2f6", ".demInfl.ctl") gencss("#c1272d", ".comInfl.ctl") -gencss("#147fc0", "#marker_action_round.com") -gencss("#c1272d", "#marker_action_round.dem") +gencss("#147fc0", "#marker_action_round.dem") +gencss("#c1272d", "#marker_action_round.com") gencss("#fadb04", "#marker_vp, #marker_turn") gencss("#f26649", "#marker_com_tst") gencss("#c4e2f4", "#marker_dem_tst") -- cgit v1.2.3 From 3e30593e9986187aff35a4440bdbcb309025c58c Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sat, 26 Oct 2024 00:12:25 +0200 Subject: Move event reminder location on top of Yugoslavia. Initialize marker locations to their starting positions. --- play.css | 7 ++++--- play.html | 27 ++++++--------------------- play.js | 6 +++++- 3 files changed, 15 insertions(+), 25 deletions(-) (limited to 'play.css') diff --git a/play.css b/play.css index d98c8ce..c339351 100644 --- a/play.css +++ b/play.css @@ -109,10 +109,11 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } #event_reminder_list { position: absolute; display: flex; - flex-rap: wrap; + flex-wrap: wrap; gap: 5px; - bottom: 165px; - right: 195px; + top: 1650px; + left: 600px; + width: 200px; } .marker { diff --git a/play.html b/play.html index eb2f495..473be26 100644 --- a/play.html +++ b/play.html @@ -53,27 +53,12 @@
    -
    -
    -
    -
    -
    -
    - - +
    +
    +
    +
    +
    +
    diff --git a/play.js b/play.js index 9ac9e60..4658044 100644 --- a/play.js +++ b/play.js @@ -284,7 +284,8 @@ function on_update() { if (!ui.spaces) create_ui() - // UPDATE ASIDE + // UPDATE PLAYER INFO + if (view.is_pwr_struggle) { roles.Democrat.stat.textContent = `${view.democrat_power_hand} Power cards` roles.Communist.stat.textContent = `${view.communist_power_hand} Power cards` @@ -292,9 +293,11 @@ function on_update() { roles.Democrat.stat.textContent = `${view.democrat_hand} cards` roles.Communist.stat.innerText = `${view.communist_hand} cards` } + ui.turn_info.innerText = `Strategy deck: ${view.strategy_deck} cards` // UPDATE TRACK MARKERS + layout_turn_marker() layout_round_marker() layout_stability_marker() @@ -338,6 +341,7 @@ function on_update() { ui.event_reminder_list.appendChild(ui.events[id]) // UPDATE INFLUENCE VALUES + for (let s = 1; s <= last_space; ++s) { const demInfl = view.demInfl[s] const comInfl = view.comInfl[s] -- cgit v1.2.3 From f71d3ff7dd4e6b4536049fe034e934182cb36cf4 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sat, 26 Oct 2024 00:24:38 +0200 Subject: Animate transitions. Card background color while image is loading. --- play.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'play.css') diff --git a/play.css b/play.css index c339351..1a9b4dd 100644 --- a/play.css +++ b/play.css @@ -123,9 +123,10 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } height: 45px; border: 2px solid; border-color: #eee #bbb #bbb #eee; - /* TODO: per marker border color */ box-shadow: 0 0 0 1px #444; - //border-radius: 8px; + transition-property: top, left; + transition-duration: 700ms; + transition-timing-function: ease; } .demInfl { background-color: #fff; } @@ -249,6 +250,7 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } .card { background-size: cover; background-repeat: no-repeat; + background-color: #fffde9; width: 250px; height: 350px; border-radius: 16px; -- cgit v1.2.3 From c2df9cc16c98db5286509e2bf6deef028b111fac Mon Sep 17 00:00:00 2001 From: iainp5 Date: Sat, 26 Oct 2024 15:14:48 +0100 Subject: New power cards --- data.js | 106 ++++++++++++++++++++++++++++++------------------------------- events.txt | 16 +++++----- play.css | 4 +-- play.js | 6 ++-- rules.js | 79 +++++++++++++++++++++++++++------------------ 5 files changed, 113 insertions(+), 98 deletions(-) (limited to 'play.css') diff --git a/data.js b/data.js index c8194f1..17291e8 100644 --- a/data.js +++ b/data.js @@ -1391,60 +1391,58 @@ const cards = [ const power_cards = [ null, -{number: 1, name: 'Strike', value: 6, socio: 0, url: 'ps2'}, -{number: 2, name: 'Strike', value: 6, socio: 0, url: 'ps2'}, -{number: 3, name: 'Strike', value: 5, socio: 0, url: 'ps3'}, -{number: 4, name: 'Strike', value: 5, socio: 0, url: 'ps3'}, -{number: 5, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, -{number: 6, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, -{number: 7, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, -{number: 8, name: 'Strike', value: 4, socio: 0, url: 'ps4'}, -{number: 9, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, -{number: 10, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, -{number: 11, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, -{number: 12, name: 'Strike', value: 3, socio: 0, url: 'ps5'}, -{number: 13, name: 'March', value: 6, socio: 0, url: 'ps6'}, -{number: 14, name: 'March', value: 6, socio: 0, url: 'ps6'}, -{number: 15, name: 'March', value: 5, socio: 0, url: 'ps7'}, -{number: 16, name: 'March', value: 5, socio: 0, url: 'ps7'}, -{number: 17, name: 'March', value: 4, socio: 0, url: 'ps8'}, -{number: 18, name: 'March', value: 4, socio: 0, url: 'ps8'}, -{number: 19, name: 'March', value: 4, socio: 0, url: 'ps8'}, -{number: 20, name: 'March', value: 4, socio: 0, url: 'ps8'}, -{number: 21, name: 'March', value: 3, socio: 0, url: 'ps9'}, -{number: 22, name: 'March', value: 3, socio: 0, url: 'ps9'}, -{number: 23, name: 'March', value: 3, socio: 0, url: 'ps9'}, -{number: 24, name: 'March', value: 3, socio: 0, url: 'ps9'}, -{number: 25, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 26, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 27, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 28, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 29, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 30, name: 'Rally in the Square', value: 1, socio: 0, url: 'ps1'}, -{number: 31, name: 'Petition', value: 6, socio: 0, url: 'ps10'}, -{number: 32, name: 'Petition', value: 6, socio: 0, url: 'ps10'}, -{number: 33, name: 'Petition', value: 6, socio: 0, url: 'ps10'}, -{number: 34, name: 'Petition', value: 5, socio: 0, url: 'ps11'}, -{number: 35, name: 'Petition', value: 5, socio: 0, url: 'ps11'}, -{number: 36, name: 'Petition', value: 5, socio: 0, url: 'ps11'}, -{number: 37, name: 'Elite Leader', value: 3, socio: 1, url: 'ps16'}, -{number: 38, name: 'Elite Leader', value: 3, socio: 1, url: 'ps17'}, -{number: 39, name: 'Elite Leader', value: 3, socio: 1, url: 'ps18'}, -{number: 40, name: 'Elite Leader', value: 3, socio: 1, url: 'ps19'}, -{number: 41, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps12'}, -{number: 42, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps13'}, -{number: 43, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps14'}, -{number: 44, name: 'Intellectual Leader', value: 3, socio: 5, url: 'ps15'}, -{number: 45, name: 'Worker Leader', value: 3, socio: 4, url: 'ps20'}, -{number: 46, name: 'Worker Leader', value: 3, socio: 4, url: 'ps21'}, -{number: 47, name: 'Church Leader', value: 3, socio: 7, url: 'ps23'}, -{number: 48, name: 'Student Leader', value: 3, socio: 6, url: 'ps22'}, -{number: 49, name: 'Scare Tactics', value: '', socio: 0, url: 'ps26'}, -{number: 50, name: 'Support Surges', value: '', socio: 0, url: 'ps25'}, -{number: 51, name: 'Support Falters', value: '', socio: 0, url: 'ps24'}, -{number: 52, name: 'Tactic Fails', value: '', socio: 0, url: 'ps27'}, -{number: 53, name: 'Rally in the Square', value: 3, socio: 0, url: 'ps1'}, -{number: 54, name: 'Petition', value: 3, socio: 0, url: 'ps10'}, +{number: 1, name: 'Rally in the Square', value: 1, socio: 0}, +{number: 2, name: 'Rally in the Square', value: 1, socio: 0}, +{number: 3, name: 'Rally in the Square', value: 1, socio: 0}, +{number: 4, name: 'Rally in the Square', value: 1, socio: 0}, +{number: 5, name: 'Rally in the Square', value: 1, socio: 0}, +{number: 6, name: 'Rally in the Square', value: 1, socio: 0}, +{number: 7, name: 'Strike', value: 6, socio: 0}, +{number: 8, name: 'Strike', value: 6, socio: 0}, +{number: 9, name: 'Strike', value: 5, socio: 0}, +{number: 10, name: 'Strike', value: 5, socio: 0}, +{number: 11, name: 'Strike', value: 4, socio: 0}, +{number: 12, name: 'Strike', value: 4, socio: 0}, +{number: 13, name: 'Strike', value: 4, socio: 0}, +{number: 14, name: 'Strike', value: 3, socio: 0}, +{number: 15, name: 'Strike', value: 3, socio: 0}, +{number: 16, name: 'Strike', value: 3, socio: 0}, +{number: 17, name: 'Strike', value: 3, socio: 0}, +{number: 18, name: 'Strike', value: 4, socio: 0}, +{number: 19, name: 'March', value: 6, socio: 0}, +{number: 20, name: 'March', value: 6, socio: 0}, +{number: 21, name: 'March', value: 5, socio: 0}, +{number: 22, name: 'March', value: 5, socio: 0}, +{number: 23, name: 'March', value: 4, socio: 0}, +{number: 24, name: 'March', value: 4, socio: 0}, +{number: 25, name: 'March', value: 4, socio: 0}, +{number: 26, name: 'March', value: 4, socio: 0}, +{number: 27, name: 'March', value: 3, socio: 0}, +{number: 28, name: 'March', value: 3, socio: 0}, +{number: 29, name: 'March', value: 3, socio: 0}, +{number: 30, name: 'March', value: 3, socio: 0}, +{number: 31, name: 'Petition', value: 6, socio: 0}, +{number: 32, name: 'Petition', value: 6, socio: 0}, +{number: 33, name: 'Petition', value: 6, socio: 0}, +{number: 34, name: 'Petition', value: 5, socio: 0}, +{number: 35, name: 'Petition', value: 5, socio: 0}, +{number: 36, name: 'Petition', value: 5, socio: 0}, +{number: 37, name: 'Intellectual Leader', value: 3, socio: 5}, +{number: 38, name: 'Intellectual Leader', value: 3, socio: 5}, +{number: 39, name: 'Intellectual Leader', value: 3, socio: 5}, +{number: 40, name: 'Intellectual Leader', value: 3, socio: 5}, +{number: 41, name: 'Elite Leader', value: 3, socio: 1}, +{number: 42, name: 'Elite Leader', value: 3, socio: 1}, +{number: 43, name: 'Elite Leader', value: 3, socio: 1}, +{number: 44, name: 'Elite Leader', value: 3, socio: 1}, +{number: 45, name: 'Worker Leader', value: 3, socio: 4}, +{number: 46, name: 'Worker Leader', value: 3, socio: 4}, +{number: 47, name: 'Student Leader', value: 3, socio: 6}, +{number: 48, name: 'Church Leader', value: 3, socio: 7}, +{number: 49, name: 'Support Falters', value: '', socio: 0}, +{number: 50, name: 'Support Surges', value: '', socio: 0}, +{number: 51, name: 'Scare Tactics', value: '', socio: 0}, +{number: 52, name: 'Tactic Fails', value: '', socio: 0}, ] if (typeof module !== 'undefined') module.exports = { spaces, cards, power_cards } diff --git a/events.txt b/events.txt index 82d3c59..eaf585d 100644 --- a/events.txt +++ b/events.txt @@ -880,15 +880,15 @@ tst_8 #// ============= POWER STRUGGLE WILDCARDS ========================= -CARD 349 - Scare Tactics -scare_tactics -valid_spaces_country_opp -prompt ()=>` from ${country_name(game.vm_active_country)}` -remove_opp_infl 1 + +CARD 349 - Support Falters +support_falters CARD 350 - Support Surges support_surges -CARD 351 - Support Falters -support_falters - +CARD 351 - Scare Tactics +scare_tactics +valid_spaces_country_opp +prompt ()=>` from ${country_name(game.vm_active_country)}` +remove_opp_infl 1 \ No newline at end of file diff --git a/play.css b/play.css index 1a9b4dd..ec93266 100644 --- a/play.css +++ b/play.css @@ -391,11 +391,11 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } .card.power_11 { background-image: url(cards100/power_11.webp) } .card.power_12 { background-image: url(cards100/power_12.webp) } .card.power_13 { background-image: url(cards100/power_13.webp) } -.card.power_14 { background-image: url(cards100/power_14.webp) } +.card.power_14 { background-image: url(cards100/power_18.webp) } .card.power_15 { background-image: url(cards100/power_15.webp) } .card.power_16 { background-image: url(cards100/power_16.webp) } .card.power_17 { background-image: url(cards100/power_17.webp) } -.card.power_18 { background-image: url(cards100/power_18.webp) } +.card.power_18 { background-image: url(cards100/power_14.webp) } .card.power_19 { background-image: url(cards100/power_19.webp) } .card.power_20 { background-image: url(cards100/power_20.webp) } .card.power_21 { background-image: url(cards100/power_21.webp) } diff --git a/play.js b/play.js index dc2c592..03f58f5 100644 --- a/play.js +++ b/play.js @@ -20,7 +20,7 @@ function on_click_action(evt) { const last_space = 74 const last_card = 110 -const last_power_card = 52 +const last_power_card = 54 const countries = [ "Poland", "Hungary", "East_Germany", "Bulgaria", "Czechoslovakia", "Romania" ] const board_events = [ 2, 9, 69, 97 ] @@ -273,9 +273,9 @@ function layout_country(id) { for (let i = 0; i < 6; i++) { // TODO: what number to display? if (view.revolutions[id]) - ui.countries[id].className = "marker comInfl ctl v" + view.times_held[id] - else if (view.times_held[id] > 0) ui.countries[id].className = "marker demInfl ctl v" + view.times_held[id] + else if (view.times_held[id] > 0) + ui.countries[id].className = "marker comInfl ctl v" + view.times_held[id] else ui.countries[id].className = "marker hide" } diff --git a/rules.js b/rules.js index a691129..bebde72 100644 --- a/rules.js +++ b/rules.js @@ -18,9 +18,9 @@ const leaders = [1, 4, 5, 6, 7] const support_loss_roll = [0, 0, 1, 1, 2, 2, 3, 4] const vp_roll = [0, 0, 1, 1, 2, 2, 3, 4] const countries = ['Poland', 'Hungary', 'East_Germany', 'Bulgaria', 'Czechoslovakia', 'Romania'] -const elite_spaces = [12, 15, 27, 43, 51, 69] +const elite_spaces = [11, 14, 26, 42, 50, 68] const all_power_cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 ] -const numberless_cards = [25, 26, 27, 28, 29, 30, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52] +const numberless_cards = [1, 2, 3, 4, 5, 6, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 ] const auto_resolve_events = [5, 8, 9, 13, 17, 25, 26, 30, 35, 50, 53, 54, 58, 59, 62, 63, 65, 70, 72, 74, 86, 99, 102, 108] const switch_events = [6, 20, 71] @@ -194,9 +194,9 @@ exports.view = function(state, player) { if (game.is_pwr_struggle) { view.power_struggle_discard = game.power_struggle_discard view.played_power_card = game.played_power_card - } else { - view.strategy_discard = game.strategy_discard - } + } + view.strategy_discard = game.strategy_discard + if (player === game.active && game.vm && game.vm.draw) view.drawn = game.vm.draw @@ -1276,7 +1276,7 @@ states.raise_stakes_1 = { inactive: 'raise the stakes.', prompt () { - // console.log('raise stakes 1 - valid cards', game.valid_cards) + console.log('raise stakes 1 - com hand', game.com_pwr_hand, 'dem hand', game.dem_pwr_hand) // console.log('raise the stakes: game.played_power_card', game.played_power_card, 'game.active', game.active, 'game.view_opp_hand', game.view_opp_hand) if ((game.active === DEM && game.dem_pwr_hand < 3) || (game.active === COM && game.com_pwr_hand < 3)) { view.prompt = 'Raise the stakes: you must pass.' @@ -1421,13 +1421,21 @@ states.power_struggle = { } if (game.phase === 1) { if (game.valid_cards.length > 0) { - view.prompt = `${power_cards[game.played_power_card].name} played. You must match or concede.` - gen_action('concede') + if (leader_cards.includes(game.played_power_card)) { + view.prompt = `${power_cards[game.played_power_card].name} played as a ${game.proxy_power_card}. You must match or concede.` + } else { + view.prompt = `${power_cards[game.played_power_card].name} played. You must match or concede.` + } + gen_action('concede') for (let card of game.valid_cards) { gen_action_power_card(card) } } else if (game.valid_cards.length === 0) { - view.prompt = `${power_cards[game.played_power_card].name} played. You must concede.` + if (leader_cards.includes(game.played_power_card)) { + view.prompt = `${power_cards[game.played_power_card].name} played as a ${game.proxy_power_card}. You must concede.` + } else { + view.prompt = `${power_cards[game.played_power_card].name} played. You must concede.` + } gen_action('concede') } } @@ -1448,6 +1456,7 @@ states.power_struggle = { discard(card) game.valid_cards=[] game.return_state = 'power_struggle' + if (game.phase === 0) {delete game.proxy_power_card} if (card === 52) { log_gap(`Played P52: P${power_cards[game.played_power_card].number} no longer playable`) @@ -1463,9 +1472,9 @@ states.power_struggle = { if (card >= 37 && card <= 48) { /*When a leader is played */ game.played_power_card = card game.phase = 3 - } else if (card === 49){ /*Scare Tactics */ + } else if (card === 51){ /*Scare Tactics */ game.return = '' - goto_vm(349) /*Can I combine these 3 into a single stage where you goto_vm(300 + card) ? */ + goto_vm(351) /*Can I combine these 3 into a single stage where you goto_vm(300 + card) ? */ } else if (card === 50) { /*Support Surges */ if (game.active === DEM) { game.return = COM @@ -1473,9 +1482,9 @@ states.power_struggle = { game.return = DEM } goto_vm(350) - } else if (game.phase === 0 && card === 51) { /*Support Falters */ + } else if (game.phase === 0 && card === 49) { /*Support Falters */ next_player() - goto_vm(351) + goto_vm(349) } else { game.played_power_card = card game.phase = 1 @@ -1527,28 +1536,28 @@ states.power_struggle = { }, strike () { log(`Played: P${power_cards[game.played_power_card].number} as a Strike`) - game.played_power_card = 9 + game.proxy_power_card = 'Strike' game.phase = 1 next_player() do_valid_cards() }, march () { log(`Played: P${power_cards[game.played_power_card].number} as a March`) - game.played_power_card = 21 + game.proxy_power_card = 'March' game.phase = 1 next_player() do_valid_cards() }, rally () { log(`Played: P${power_cards[game.played_power_card].number} as a Rally in the Square`) - game.played_power_card = 53 + game.proxy_power_card = 'Rally in the Square' game.phase = 1 next_player() do_valid_cards() }, petition () { log(`Played: P${power_cards[game.played_power_card].number} as a Petition`) - game.played_power_card = 54 + game.proxy_power_card = 'Petition' game.phase = 1 next_player() do_valid_cards() @@ -1629,8 +1638,8 @@ states.support_loss ={ let rally_win = 0 let petition_win = 0 log(`Roll: D${roll}`) - if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) { rally_win = 2} - if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.played_power_card === 54) { petition_win = 2} + if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.proxy_power_card === 'Rally in the Square') { rally_win = 2} + if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.proxy_power_card === 'Petition') { petition_win = 2} let modified_roll = roll + game.raised_stakes + rally_win - petition_win // Roll modifiers @@ -1647,7 +1656,7 @@ states.support_loss ={ log(`+${game.raised_stakes} from Raising the Stakes`) } if (rally_win !== 0) { - log('+2 from winning on a P25') + log('+2 from winning on a P1') } if (petition_win !== 0) { log('-2 from winning on a P31') @@ -1715,8 +1724,8 @@ states.vp_roll = { log(`Roll: D${roll}`) let rally_win = 0 let petition_win = 0 - if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.played_power_card === 53) {rally_win = 2} - if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.played_power_card === 54) {petition_win = 2} + if ((game.played_power_card >= 25 && game.played_power_card <= 30) || game.proxy_power_card === 'Rally in the Square') { rally_win = 2} + if ((game.played_power_card >= 31 && game.played_power_card <= 36) || game.proxy_power_card === 'Petition') { petition_win = 2} let modified_roll = roll + game.raised_stakes + rally_win - petition_win if (game.active === DEM && game.persistent_events.includes(62)) { log('+1 from C62') @@ -1729,7 +1738,7 @@ states.vp_roll = { log(`+${game.raised_stakes} from Raising the Stakes`) } if (rally_win !== 0) { - log('+2 from winning on a P25') + log('+2 from winning on a P1') } if (petition_win !== 0) { log('-2 from winning on a P31') @@ -2810,9 +2819,13 @@ function valid_cards(player_hand, presence) { } else if (game.phase === 1) { for (let c of player_hand) { let card = power_cards.find(card => card && card.number === c); + console.log('card', card, ) if (card.name === power_cards[game.played_power_card].name) { valid_cards_set.add(card.number); - } else if (leaders.includes(card.socio) && presence[card.socio]) { + } else if (card.name === game.proxy_power_card) { + valid_cards_set.add(card.number) + } + else if (leaders.includes(card.socio) && presence[card.socio]) { valid_cards_set.add(card.number); } else if (card.number === 52) {valid_cards_set.add(card.number)} } @@ -9911,11 +9924,8 @@ CODE[208] = [ // Tiananmen Square space 8 event [ vm_return ], ] -CODE[349] = [ // Scare Tactics - [ vm_scare_tactics ], - [ vm_valid_spaces_country_opp ], - [ vm_prompt, ()=>` from ${country_name(game.vm_active_country)}` ], - [ vm_remove_opp_infl, 1 ], +CODE[349] = [ // Support Falters + [ vm_support_falters ], [ vm_return ], ] @@ -9924,9 +9934,16 @@ CODE[350] = [ // Support Surges [ vm_return ], ] -CODE[351] = [ // Support Falters - [ vm_support_falters ], +CODE[351] = [ // Scare Tactics + [ vm_scare_tactics ], + [ vm_valid_spaces_country_opp ], + [ vm_prompt, ()=>` from ${country_name(game.vm_active_country)}` ], + [ vm_remove_opp_infl, 1 ], [ vm_return ], ] + + + + // #endregion -- cgit v1.2.3 From 071612221465ec4bf05cf855043278230636f966 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sun, 27 Oct 2024 10:21:29 +0100 Subject: New power card image numbering. --- data.js | 107 +++++++++--------- info/cards.html | 336 +++++++++++++++++++++++++++++--------------------------- play.css | 334 +++++++++++++++++++++++++++---------------------------- play.js | 2 +- 4 files changed, 394 insertions(+), 385 deletions(-) (limited to 'play.css') diff --git a/data.js b/data.js index 17291e8..dceeca1 100644 --- a/data.js +++ b/data.js @@ -1275,6 +1275,7 @@ const spaces = [         ascii_name: "Sliven", }, ] + const cards = [ null, {number: 1, period: 1, side: 'C', name: 'Legacy of Martial Law*', ops: 2, remove: 1, playable: true, red: false}, @@ -1390,59 +1391,59 @@ const cards = [ ] const power_cards = [ -null, -{number: 1, name: 'Rally in the Square', value: 1, socio: 0}, -{number: 2, name: 'Rally in the Square', value: 1, socio: 0}, -{number: 3, name: 'Rally in the Square', value: 1, socio: 0}, -{number: 4, name: 'Rally in the Square', value: 1, socio: 0}, -{number: 5, name: 'Rally in the Square', value: 1, socio: 0}, -{number: 6, name: 'Rally in the Square', value: 1, socio: 0}, -{number: 7, name: 'Strike', value: 6, socio: 0}, -{number: 8, name: 'Strike', value: 6, socio: 0}, -{number: 9, name: 'Strike', value: 5, socio: 0}, -{number: 10, name: 'Strike', value: 5, socio: 0}, -{number: 11, name: 'Strike', value: 4, socio: 0}, -{number: 12, name: 'Strike', value: 4, socio: 0}, -{number: 13, name: 'Strike', value: 4, socio: 0}, -{number: 14, name: 'Strike', value: 3, socio: 0}, -{number: 15, name: 'Strike', value: 3, socio: 0}, -{number: 16, name: 'Strike', value: 3, socio: 0}, -{number: 17, name: 'Strike', value: 3, socio: 0}, -{number: 18, name: 'Strike', value: 4, socio: 0}, -{number: 19, name: 'March', value: 6, socio: 0}, -{number: 20, name: 'March', value: 6, socio: 0}, -{number: 21, name: 'March', value: 5, socio: 0}, -{number: 22, name: 'March', value: 5, socio: 0}, -{number: 23, name: 'March', value: 4, socio: 0}, -{number: 24, name: 'March', value: 4, socio: 0}, -{number: 25, name: 'March', value: 4, socio: 0}, -{number: 26, name: 'March', value: 4, socio: 0}, -{number: 27, name: 'March', value: 3, socio: 0}, -{number: 28, name: 'March', value: 3, socio: 0}, -{number: 29, name: 'March', value: 3, socio: 0}, -{number: 30, name: 'March', value: 3, socio: 0}, -{number: 31, name: 'Petition', value: 6, socio: 0}, -{number: 32, name: 'Petition', value: 6, socio: 0}, -{number: 33, name: 'Petition', value: 6, socio: 0}, -{number: 34, name: 'Petition', value: 5, socio: 0}, -{number: 35, name: 'Petition', value: 5, socio: 0}, -{number: 36, name: 'Petition', value: 5, socio: 0}, -{number: 37, name: 'Intellectual Leader', value: 3, socio: 5}, -{number: 38, name: 'Intellectual Leader', value: 3, socio: 5}, -{number: 39, name: 'Intellectual Leader', value: 3, socio: 5}, -{number: 40, name: 'Intellectual Leader', value: 3, socio: 5}, -{number: 41, name: 'Elite Leader', value: 3, socio: 1}, -{number: 42, name: 'Elite Leader', value: 3, socio: 1}, -{number: 43, name: 'Elite Leader', value: 3, socio: 1}, -{number: 44, name: 'Elite Leader', value: 3, socio: 1}, -{number: 45, name: 'Worker Leader', value: 3, socio: 4}, -{number: 46, name: 'Worker Leader', value: 3, socio: 4}, -{number: 47, name: 'Student Leader', value: 3, socio: 6}, -{number: 48, name: 'Church Leader', value: 3, socio: 7}, -{number: 49, name: 'Support Falters', value: '', socio: 0}, -{number: 50, name: 'Support Surges', value: '', socio: 0}, -{number: 51, name: 'Scare Tactics', value: '', socio: 0}, -{number: 52, name: 'Tactic Fails', value: '', socio: 0}, + null, + { number: 1, name: "Rally in the Square", value: 1, socio: 0 }, + { number: 2, name: "Rally in the Square", value: 1, socio: 0 }, + { number: 3, name: "Rally in the Square", value: 1, socio: 0 }, + { number: 4, name: "Rally in the Square", value: 1, socio: 0 }, + { number: 5, name: "Rally in the Square", value: 1, socio: 0 }, + { number: 6, name: "Rally in the Square", value: 1, socio: 0 }, + { number: 7, name: "Strike", value: 6, socio: 0 }, + { number: 8, name: "Strike", value: 6, socio: 0 }, + { number: 9, name: "Strike", value: 5, socio: 0 }, + { number: 10, name: "Strike", value: 5, socio: 0 }, + { number: 11, name: "Strike", value: 4, socio: 0 }, + { number: 12, name: "Strike", value: 4, socio: 0 }, + { number: 13, name: "Strike", value: 4, socio: 0 }, + { number: 18, name: "Strike", value: 4, socio: 0 }, + { number: 14, name: "Strike", value: 3, socio: 0 }, + { number: 15, name: "Strike", value: 3, socio: 0 }, + { number: 16, name: "Strike", value: 3, socio: 0 }, + { number: 17, name: "Strike", value: 3, socio: 0 }, + { number: 19, name: "March", value: 6, socio: 0 }, + { number: 20, name: "March", value: 6, socio: 0 }, + { number: 21, name: "March", value: 5, socio: 0 }, + { number: 22, name: "March", value: 5, socio: 0 }, + { number: 23, name: "March", value: 4, socio: 0 }, + { number: 24, name: "March", value: 4, socio: 0 }, + { number: 25, name: "March", value: 4, socio: 0 }, + { number: 26, name: "March", value: 4, socio: 0 }, + { number: 27, name: "March", value: 3, socio: 0 }, + { number: 28, name: "March", value: 3, socio: 0 }, + { number: 29, name: "March", value: 3, socio: 0 }, + { number: 30, name: "March", value: 3, socio: 0 }, + { number: 31, name: "Petition", value: 6, socio: 0 }, + { number: 32, name: "Petition", value: 6, socio: 0 }, + { number: 33, name: "Petition", value: 6, socio: 0 }, + { number: 34, name: "Petition", value: 5, socio: 0 }, + { number: 35, name: "Petition", value: 5, socio: 0 }, + { number: 36, name: "Petition", value: 5, socio: 0 }, + { number: 37, name: "Intellectual Leader", value: 3, socio: 5 }, + { number: 38, name: "Intellectual Leader", value: 3, socio: 5 }, + { number: 39, name: "Intellectual Leader", value: 3, socio: 5 }, + { number: 40, name: "Intellectual Leader", value: 3, socio: 5 }, + { number: 41, name: "Elite Leader", value: 3, socio: 1 }, + { number: 42, name: "Elite Leader", value: 3, socio: 1 }, + { number: 43, name: "Elite Leader", value: 3, socio: 1 }, + { number: 44, name: "Elite Leader", value: 3, socio: 1 }, + { number: 45, name: "Worker Leader", value: 3, socio: 4 }, + { number: 46, name: "Worker Leader", value: 3, socio: 4 }, + { number: 47, name: "Student Leader", value: 3, socio: 6 }, + { number: 48, name: "Church Leader", value: 3, socio: 7 }, + { number: 49, name: "Support Falters", value: 0, socio: 0 }, + { number: 50, name: "Support Surges", value: 0, socio: 0 }, + { number: 51, name: "Scare Tactics", value: 0, socio: 0 }, + { number: 52, name: "Tactic Fails", value: 0, socio: 0 }, ] if (typeof module !== 'undefined') module.exports = { spaces, cards, power_cards } diff --git a/info/cards.html b/info/cards.html index 479867d..8498d00 100644 --- a/info/cards.html +++ b/info/cards.html @@ -21,173 +21,181 @@ img {
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/play.css b/play.css index ec93266..90a5a57 100644 --- a/play.css +++ b/play.css @@ -64,9 +64,9 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } box-shadow: 0px 1px 10px #0008; } -#map { background-image: url("map75.jpg") } +#map { background-image: url("map75.avif") } @media (min-resolution: 97dpi) { - #map { background-image: url("map150.jpg") } + #map { background-image: url("map150.avif") } } /* SPACES */ @@ -265,168 +265,168 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } box-shadow: 0 0 0 1px #444, 0 0 0 4px yellow; } -.card.event_0 { background-image: url(cards100/event_back.webp) } -.card.event_1 { background-image: url(cards100/event_1.webp) } -.card.event_2 { background-image: url(cards100/event_2.webp) } -.card.event_3 { background-image: url(cards100/event_3.webp) } -.card.event_4 { background-image: url(cards100/event_4.webp) } -.card.event_5 { background-image: url(cards100/event_5.webp) } -.card.event_6 { background-image: url(cards100/event_6.webp) } -.card.event_7 { background-image: url(cards100/event_7.webp) } -.card.event_8 { background-image: url(cards100/event_8.webp) } -.card.event_9 { background-image: url(cards100/event_9.webp) } -.card.event_10 { background-image: url(cards100/event_10.webp) } -.card.event_11 { background-image: url(cards100/event_11.webp) } -.card.event_12 { background-image: url(cards100/event_12.webp) } -.card.event_13 { background-image: url(cards100/event_13.webp) } -.card.event_14 { background-image: url(cards100/event_14.webp) } -.card.event_15 { background-image: url(cards100/event_15.webp) } -.card.event_16 { background-image: url(cards100/event_16.webp) } -.card.event_17 { background-image: url(cards100/event_17.webp) } -.card.event_18 { background-image: url(cards100/event_18.webp) } -.card.event_19 { background-image: url(cards100/event_19.webp) } -.card.event_20 { background-image: url(cards100/event_20.webp) } -.card.event_21 { background-image: url(cards100/event_21.webp) } -.card.event_22 { background-image: url(cards100/event_22.webp) } -.card.event_23 { background-image: url(cards100/event_23.webp) } -.card.event_24 { background-image: url(cards100/event_24.webp) } -.card.event_25 { background-image: url(cards100/event_25.webp) } -.card.event_26 { background-image: url(cards100/event_26.webp) } -.card.event_27 { background-image: url(cards100/event_27.webp) } -.card.event_28 { background-image: url(cards100/event_28.webp) } -.card.event_29 { background-image: url(cards100/event_29.webp) } -.card.event_30 { background-image: url(cards100/event_30.webp) } -.card.event_31 { background-image: url(cards100/event_31.webp) } -.card.event_32 { background-image: url(cards100/event_32.webp) } -.card.event_33 { background-image: url(cards100/event_33.webp) } -.card.event_34 { background-image: url(cards100/event_34.webp) } -.card.event_35 { background-image: url(cards100/event_35.webp) } -.card.event_36 { background-image: url(cards100/event_36.webp) } -.card.event_37 { background-image: url(cards100/event_37.webp) } -.card.event_38 { background-image: url(cards100/event_38.webp) } -.card.event_39 { background-image: url(cards100/event_39.webp) } -.card.event_40 { background-image: url(cards100/event_40.webp) } -.card.event_41 { background-image: url(cards100/event_41.webp) } -.card.event_42 { background-image: url(cards100/event_42.webp) } -.card.event_43 { background-image: url(cards100/event_43.webp) } -.card.event_44 { background-image: url(cards100/event_44.webp) } -.card.event_45 { background-image: url(cards100/event_45.webp) } -.card.event_46 { background-image: url(cards100/event_46.webp) } -.card.event_47 { background-image: url(cards100/event_47.webp) } -.card.event_48 { background-image: url(cards100/event_48.webp) } -.card.event_49 { background-image: url(cards100/event_49.webp) } -.card.event_50 { background-image: url(cards100/event_50.webp) } -.card.event_51 { background-image: url(cards100/event_51.webp) } -.card.event_52 { background-image: url(cards100/event_52.webp) } -.card.event_53 { background-image: url(cards100/event_53.webp) } -.card.event_54 { background-image: url(cards100/event_54.webp) } -.card.event_55 { background-image: url(cards100/event_55.webp) } -.card.event_56 { background-image: url(cards100/event_56.webp) } -.card.event_57 { background-image: url(cards100/event_57.webp) } -.card.event_58 { background-image: url(cards100/event_58.webp) } -.card.event_59 { background-image: url(cards100/event_59.webp) } -.card.event_60 { background-image: url(cards100/event_60.webp) } -.card.event_61 { background-image: url(cards100/event_61.webp) } -.card.event_62 { background-image: url(cards100/event_62.webp) } -.card.event_63 { background-image: url(cards100/event_63.webp) } -.card.event_64 { background-image: url(cards100/event_64.webp) } -.card.event_65 { background-image: url(cards100/event_65.webp) } -.card.event_66 { background-image: url(cards100/event_66.webp) } -.card.event_67 { background-image: url(cards100/event_67.webp) } -.card.event_68 { background-image: url(cards100/event_68.webp) } -.card.event_69 { background-image: url(cards100/event_69.webp) } -.card.event_70 { background-image: url(cards100/event_70.webp) } -.card.event_71 { background-image: url(cards100/event_71.webp) } -.card.event_72 { background-image: url(cards100/event_72.webp) } -.card.event_73 { background-image: url(cards100/event_73.webp) } -.card.event_74 { background-image: url(cards100/event_74.webp) } -.card.event_75 { background-image: url(cards100/event_75.webp) } -.card.event_76 { background-image: url(cards100/event_76.webp) } -.card.event_77 { background-image: url(cards100/event_77.webp) } -.card.event_78 { background-image: url(cards100/event_78.webp) } -.card.event_79 { background-image: url(cards100/event_79.webp) } -.card.event_80 { background-image: url(cards100/event_80.webp) } -.card.event_81 { background-image: url(cards100/event_81.webp) } -.card.event_82 { background-image: url(cards100/event_82.webp) } -.card.event_83 { background-image: url(cards100/event_83.webp) } -.card.event_84 { background-image: url(cards100/event_84.webp) } -.card.event_85 { background-image: url(cards100/event_85.webp) } -.card.event_86 { background-image: url(cards100/event_86.webp) } -.card.event_87 { background-image: url(cards100/event_87.webp) } -.card.event_88 { background-image: url(cards100/event_88.webp) } -.card.event_89 { background-image: url(cards100/event_89.webp) } -.card.event_90 { background-image: url(cards100/event_90.webp) } -.card.event_91 { background-image: url(cards100/event_91.webp) } -.card.event_92 { background-image: url(cards100/event_92.webp) } -.card.event_93 { background-image: url(cards100/event_93.webp) } -.card.event_94 { background-image: url(cards100/event_94.webp) } -.card.event_95 { background-image: url(cards100/event_95.webp) } -.card.event_96 { background-image: url(cards100/event_96.webp) } -.card.event_97 { background-image: url(cards100/event_97.webp) } -.card.event_98 { background-image: url(cards100/event_98.webp) } -.card.event_99 { background-image: url(cards100/event_99.webp) } -.card.event_100 { background-image: url(cards100/event_100.webp) } -.card.event_101 { background-image: url(cards100/event_101.webp) } -.card.event_102 { background-image: url(cards100/event_102.webp) } -.card.event_103 { background-image: url(cards100/event_103.webp) } -.card.event_104 { background-image: url(cards100/event_104.webp) } -.card.event_105 { background-image: url(cards100/event_105.webp) } -.card.event_106 { background-image: url(cards100/event_106.webp) } -.card.event_107 { background-image: url(cards100/event_107.webp) } -.card.event_108 { background-image: url(cards100/event_108.webp) } -.card.event_109 { background-image: url(cards100/event_109.webp) } -.card.event_110 { background-image: url(cards100/event_110.webp) } - -.card.power_0 { background-image: url(cards100/power_back.webp) } -.card.power_1 { background-image: url(cards100/power_1.webp) } -.card.power_2 { background-image: url(cards100/power_2.webp) } -.card.power_3 { background-image: url(cards100/power_3.webp) } -.card.power_4 { background-image: url(cards100/power_4.webp) } -.card.power_5 { background-image: url(cards100/power_5.webp) } -.card.power_6 { background-image: url(cards100/power_6.webp) } -.card.power_7 { background-image: url(cards100/power_7.webp) } -.card.power_8 { background-image: url(cards100/power_8.webp) } -.card.power_9 { background-image: url(cards100/power_9.webp) } -.card.power_10 { background-image: url(cards100/power_10.webp) } -.card.power_11 { background-image: url(cards100/power_11.webp) } -.card.power_12 { background-image: url(cards100/power_12.webp) } -.card.power_13 { background-image: url(cards100/power_13.webp) } -.card.power_14 { background-image: url(cards100/power_18.webp) } -.card.power_15 { background-image: url(cards100/power_15.webp) } -.card.power_16 { background-image: url(cards100/power_16.webp) } -.card.power_17 { background-image: url(cards100/power_17.webp) } -.card.power_18 { background-image: url(cards100/power_14.webp) } -.card.power_19 { background-image: url(cards100/power_19.webp) } -.card.power_20 { background-image: url(cards100/power_20.webp) } -.card.power_21 { background-image: url(cards100/power_21.webp) } -.card.power_22 { background-image: url(cards100/power_22.webp) } -.card.power_23 { background-image: url(cards100/power_23.webp) } -.card.power_24 { background-image: url(cards100/power_24.webp) } -.card.power_25 { background-image: url(cards100/power_25.webp) } -.card.power_26 { background-image: url(cards100/power_26.webp) } -.card.power_27 { background-image: url(cards100/power_27.webp) } -.card.power_28 { background-image: url(cards100/power_28.webp) } -.card.power_29 { background-image: url(cards100/power_29.webp) } -.card.power_30 { background-image: url(cards100/power_30.webp) } -.card.power_31 { background-image: url(cards100/power_31.webp) } -.card.power_32 { background-image: url(cards100/power_32.webp) } -.card.power_33 { background-image: url(cards100/power_33.webp) } -.card.power_34 { background-image: url(cards100/power_34.webp) } -.card.power_35 { background-image: url(cards100/power_35.webp) } -.card.power_36 { background-image: url(cards100/power_36.webp) } -.card.power_37 { background-image: url(cards100/power_37.webp) } -.card.power_38 { background-image: url(cards100/power_38.webp) } -.card.power_39 { background-image: url(cards100/power_39.webp) } -.card.power_40 { background-image: url(cards100/power_40.webp) } -.card.power_41 { background-image: url(cards100/power_41.webp) } -.card.power_42 { background-image: url(cards100/power_42.webp) } -.card.power_43 { background-image: url(cards100/power_43.webp) } -.card.power_44 { background-image: url(cards100/power_44.webp) } -.card.power_45 { background-image: url(cards100/power_45.webp) } -.card.power_46 { background-image: url(cards100/power_46.webp) } -.card.power_47 { background-image: url(cards100/power_47.webp) } -.card.power_48 { background-image: url(cards100/power_48.webp) } -.card.power_49 { background-image: url(cards100/power_49.webp) } -.card.power_50 { background-image: url(cards100/power_50.webp) } -.card.power_51 { background-image: url(cards100/power_51.webp) } -.card.power_52 { background-image: url(cards100/power_52.webp) } +.card.event_0 { background-image: url(cards100/event_back.avif) } +.card.event_1 { background-image: url(cards100/event_1.avif) } +.card.event_2 { background-image: url(cards100/event_2.avif) } +.card.event_3 { background-image: url(cards100/event_3.avif) } +.card.event_4 { background-image: url(cards100/event_4.avif) } +.card.event_5 { background-image: url(cards100/event_5.avif) } +.card.event_6 { background-image: url(cards100/event_6.avif) } +.card.event_7 { background-image: url(cards100/event_7.avif) } +.card.event_8 { background-image: url(cards100/event_8.avif) } +.card.event_9 { background-image: url(cards100/event_9.avif) } +.card.event_10 { background-image: url(cards100/event_10.avif) } +.card.event_11 { background-image: url(cards100/event_11.avif) } +.card.event_12 { background-image: url(cards100/event_12.avif) } +.card.event_13 { background-image: url(cards100/event_13.avif) } +.card.event_14 { background-image: url(cards100/event_14.avif) } +.card.event_15 { background-image: url(cards100/event_15.avif) } +.card.event_16 { background-image: url(cards100/event_16.avif) } +.card.event_17 { background-image: url(cards100/event_17.avif) } +.card.event_18 { background-image: url(cards100/event_18.avif) } +.card.event_19 { background-image: url(cards100/event_19.avif) } +.card.event_20 { background-image: url(cards100/event_20.avif) } +.card.event_21 { background-image: url(cards100/event_21.avif) } +.card.event_22 { background-image: url(cards100/event_22.avif) } +.card.event_23 { background-image: url(cards100/event_23.avif) } +.card.event_24 { background-image: url(cards100/event_24.avif) } +.card.event_25 { background-image: url(cards100/event_25.avif) } +.card.event_26 { background-image: url(cards100/event_26.avif) } +.card.event_27 { background-image: url(cards100/event_27.avif) } +.card.event_28 { background-image: url(cards100/event_28.avif) } +.card.event_29 { background-image: url(cards100/event_29.avif) } +.card.event_30 { background-image: url(cards100/event_30.avif) } +.card.event_31 { background-image: url(cards100/event_31.avif) } +.card.event_32 { background-image: url(cards100/event_32.avif) } +.card.event_33 { background-image: url(cards100/event_33.avif) } +.card.event_34 { background-image: url(cards100/event_34.avif) } +.card.event_35 { background-image: url(cards100/event_35.avif) } +.card.event_36 { background-image: url(cards100/event_36.avif) } +.card.event_37 { background-image: url(cards100/event_37.avif) } +.card.event_38 { background-image: url(cards100/event_38.avif) } +.card.event_39 { background-image: url(cards100/event_39.avif) } +.card.event_40 { background-image: url(cards100/event_40.avif) } +.card.event_41 { background-image: url(cards100/event_41.avif) } +.card.event_42 { background-image: url(cards100/event_42.avif) } +.card.event_43 { background-image: url(cards100/event_43.avif) } +.card.event_44 { background-image: url(cards100/event_44.avif) } +.card.event_45 { background-image: url(cards100/event_45.avif) } +.card.event_46 { background-image: url(cards100/event_46.avif) } +.card.event_47 { background-image: url(cards100/event_47.avif) } +.card.event_48 { background-image: url(cards100/event_48.avif) } +.card.event_49 { background-image: url(cards100/event_49.avif) } +.card.event_50 { background-image: url(cards100/event_50.avif) } +.card.event_51 { background-image: url(cards100/event_51.avif) } +.card.event_52 { background-image: url(cards100/event_52.avif) } +.card.event_53 { background-image: url(cards100/event_53.avif) } +.card.event_54 { background-image: url(cards100/event_54.avif) } +.card.event_55 { background-image: url(cards100/event_55.avif) } +.card.event_56 { background-image: url(cards100/event_56.avif) } +.card.event_57 { background-image: url(cards100/event_57.avif) } +.card.event_58 { background-image: url(cards100/event_58.avif) } +.card.event_59 { background-image: url(cards100/event_59.avif) } +.card.event_60 { background-image: url(cards100/event_60.avif) } +.card.event_61 { background-image: url(cards100/event_61.avif) } +.card.event_62 { background-image: url(cards100/event_62.avif) } +.card.event_63 { background-image: url(cards100/event_63.avif) } +.card.event_64 { background-image: url(cards100/event_64.avif) } +.card.event_65 { background-image: url(cards100/event_65.avif) } +.card.event_66 { background-image: url(cards100/event_66.avif) } +.card.event_67 { background-image: url(cards100/event_67.avif) } +.card.event_68 { background-image: url(cards100/event_68.avif) } +.card.event_69 { background-image: url(cards100/event_69.avif) } +.card.event_70 { background-image: url(cards100/event_70.avif) } +.card.event_71 { background-image: url(cards100/event_71.avif) } +.card.event_72 { background-image: url(cards100/event_72.avif) } +.card.event_73 { background-image: url(cards100/event_73.avif) } +.card.event_74 { background-image: url(cards100/event_74.avif) } +.card.event_75 { background-image: url(cards100/event_75.avif) } +.card.event_76 { background-image: url(cards100/event_76.avif) } +.card.event_77 { background-image: url(cards100/event_77.avif) } +.card.event_78 { background-image: url(cards100/event_78.avif) } +.card.event_79 { background-image: url(cards100/event_79.avif) } +.card.event_80 { background-image: url(cards100/event_80.avif) } +.card.event_81 { background-image: url(cards100/event_81.avif) } +.card.event_82 { background-image: url(cards100/event_82.avif) } +.card.event_83 { background-image: url(cards100/event_83.avif) } +.card.event_84 { background-image: url(cards100/event_84.avif) } +.card.event_85 { background-image: url(cards100/event_85.avif) } +.card.event_86 { background-image: url(cards100/event_86.avif) } +.card.event_87 { background-image: url(cards100/event_87.avif) } +.card.event_88 { background-image: url(cards100/event_88.avif) } +.card.event_89 { background-image: url(cards100/event_89.avif) } +.card.event_90 { background-image: url(cards100/event_90.avif) } +.card.event_91 { background-image: url(cards100/event_91.avif) } +.card.event_92 { background-image: url(cards100/event_92.avif) } +.card.event_93 { background-image: url(cards100/event_93.avif) } +.card.event_94 { background-image: url(cards100/event_94.avif) } +.card.event_95 { background-image: url(cards100/event_95.avif) } +.card.event_96 { background-image: url(cards100/event_96.avif) } +.card.event_97 { background-image: url(cards100/event_97.avif) } +.card.event_98 { background-image: url(cards100/event_98.avif) } +.card.event_99 { background-image: url(cards100/event_99.avif) } +.card.event_100 { background-image: url(cards100/event_100.avif) } +.card.event_101 { background-image: url(cards100/event_101.avif) } +.card.event_102 { background-image: url(cards100/event_102.avif) } +.card.event_103 { background-image: url(cards100/event_103.avif) } +.card.event_104 { background-image: url(cards100/event_104.avif) } +.card.event_105 { background-image: url(cards100/event_105.avif) } +.card.event_106 { background-image: url(cards100/event_106.avif) } +.card.event_107 { background-image: url(cards100/event_107.avif) } +.card.event_108 { background-image: url(cards100/event_108.avif) } +.card.event_109 { background-image: url(cards100/event_109.avif) } +.card.event_110 { background-image: url(cards100/event_110.avif) } + +.card.power_0 { background-image: url(cards100/power_back.avif) } +.card.power_1 { background-image: url(cards100/power_1_6.avif) } +.card.power_2 { background-image: url(cards100/power_1_6.avif) } +.card.power_3 { background-image: url(cards100/power_1_6.avif) } +.card.power_4 { background-image: url(cards100/power_1_6.avif) } +.card.power_5 { background-image: url(cards100/power_1_6.avif) } +.card.power_6 { background-image: url(cards100/power_1_6.avif) } +.card.power_7 { background-image: url(cards100/power_7_8.avif) } +.card.power_8 { background-image: url(cards100/power_7_8.avif) } +.card.power_9 { background-image: url(cards100/power_9_10.avif) } +.card.power_10 { background-image: url(cards100/power_9_10.avif) } +.card.power_11 { background-image: url(cards100/power_11_14.avif) } +.card.power_12 { background-image: url(cards100/power_11_14.avif) } +.card.power_13 { background-image: url(cards100/power_11_14.avif) } +.card.power_14 { background-image: url(cards100/power_11_14.avif) } +.card.power_15 { background-image: url(cards100/power_15_18.avif) } +.card.power_16 { background-image: url(cards100/power_15_18.avif) } +.card.power_17 { background-image: url(cards100/power_15_18.avif) } +.card.power_18 { background-image: url(cards100/power_15_18.avif) } +.card.power_19 { background-image: url(cards100/power_19_20.avif) } +.card.power_20 { background-image: url(cards100/power_19_20.avif) } +.card.power_21 { background-image: url(cards100/power_21_22.avif) } +.card.power_22 { background-image: url(cards100/power_21_22.avif) } +.card.power_23 { background-image: url(cards100/power_23_26.avif) } +.card.power_24 { background-image: url(cards100/power_23_26.avif) } +.card.power_25 { background-image: url(cards100/power_23_26.avif) } +.card.power_26 { background-image: url(cards100/power_23_26.avif) } +.card.power_27 { background-image: url(cards100/power_27_30.avif) } +.card.power_28 { background-image: url(cards100/power_27_30.avif) } +.card.power_29 { background-image: url(cards100/power_27_30.avif) } +.card.power_30 { background-image: url(cards100/power_27_30.avif) } +.card.power_31 { background-image: url(cards100/power_31_33.avif) } +.card.power_32 { background-image: url(cards100/power_31_33.avif) } +.card.power_33 { background-image: url(cards100/power_31_33.avif) } +.card.power_34 { background-image: url(cards100/power_34_36.avif) } +.card.power_35 { background-image: url(cards100/power_34_36.avif) } +.card.power_36 { background-image: url(cards100/power_34_36.avif) } +.card.power_37 { background-image: url(cards100/power_37.avif) } +.card.power_38 { background-image: url(cards100/power_38.avif) } +.card.power_39 { background-image: url(cards100/power_39.avif) } +.card.power_40 { background-image: url(cards100/power_40.avif) } +.card.power_41 { background-image: url(cards100/power_41.avif) } +.card.power_42 { background-image: url(cards100/power_42.avif) } +.card.power_43 { background-image: url(cards100/power_43.avif) } +.card.power_44 { background-image: url(cards100/power_44.avif) } +.card.power_45 { background-image: url(cards100/power_45.avif) } +.card.power_46 { background-image: url(cards100/power_46.avif) } +.card.power_47 { background-image: url(cards100/power_47.avif) } +.card.power_48 { background-image: url(cards100/power_48.avif) } +.card.power_49 { background-image: url(cards100/power_49.avif) } +.card.power_50 { background-image: url(cards100/power_50.avif) } +.card.power_51 { background-image: url(cards100/power_51.avif) } +.card.power_52 { background-image: url(cards100/power_52.avif) } diff --git a/play.js b/play.js index cf78f62..3c6b1af 100644 --- a/play.js +++ b/play.js @@ -329,7 +329,7 @@ function on_click_action(evt) { const last_space = 74 const last_card = 110 -const last_power_card = 54 +const last_power_card = 52 const board_events = [ C_SOLIDARITY_LEGALIZED, -- cgit v1.2.3 From 3e36074596d23d78b48c0a999b57d5a6f3808030 Mon Sep 17 00:00:00 2001 From: iainp5 Date: Sun, 27 Oct 2024 20:41:10 +0000 Subject: New power struggle card layout --- play.css | 12 ++++++++++++ play.html | 13 +++++++------ play.js | 19 +++++++++++++++---- rules.js | 22 +++++++++++++++++----- 4 files changed, 51 insertions(+), 15 deletions(-) (limited to 'play.css') diff --git a/play.css b/play.css index 90a5a57..a0d7094 100644 --- a/play.css +++ b/play.css @@ -237,6 +237,18 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } display: none; } +#scoring_card_panel { + display: flex; + flex-direction: column; + width: 100%; +} + +#scoring_card_panel .card_row { + display: flex; + gap: 10px; +} + + /* CARD IMAGES */ #tooltip { diff --git a/play.html b/play.html index 50fb00d..97882fd 100644 --- a/play.html +++ b/play.html @@ -85,16 +85,17 @@
    Power Struggle
    -
    -
    Power Struggle
    -
    -
    - +
    +
    +
    +
    +
    +
    -
    Played Power Card
    +
    Power Struggle
    diff --git a/play.js b/play.js index 9e00d94..7446aad 100644 --- a/play.js +++ b/play.js @@ -372,6 +372,8 @@ const ui = { played_card: document.getElementById("played_card"), scoring_card: document.getElementById("scoring_card"), played_power_card: document.getElementById("played_power_card"), + power_card_1: document.getElementById("power_card_1"), + power_card_2: document.getElementById("power_card_2"), hand: document.getElementById("hand"), power_hand: document.getElementById("power_hand"), opp_hand: document.getElementById("opp_hand"), @@ -642,17 +644,26 @@ function on_update() { // UPDATE CARD DISPLAYS ui.played_card.replaceChildren() - + ui.power_card_1.replaceChildren() + ui.power_card_2.replaceChildren() + + console.log('view.is_pwr_struggle', view.is_pwr_struggle, 'view.power_card_1', view.power_card_1, 'view.power_card_2', view.power_card_2) if (!view.is_pwr_struggle) { if (view.played_card > 0) ui.played_card.appendChild(ui.cards[view.played_card]) + document.getElementById("scoring_card_panel").style.display = "none" } else { + document.getElementById("scoring_card_panel").style.display = "flex" if (view.played_card > 0) ui.scoring_card.appendChild(ui.cards[view.played_card]) + if (view.power_card_1) + ui.power_card_1.appendChild(ui.power_cards[view.power_card_1]) + if (view.power_card_2) + ui.power_card_2.appendChild(ui.power_cards[view.power_card_2]) } - ui.played_power_card.replaceChildren() +/* ui.played_power_card.replaceChildren() if (view.played_power_card > 0) - ui.played_power_card.appendChild(ui.power_cards[view.played_power_card]) + ui.played_power_card.appendChild(ui.power_cards[view.played_power_card])*/ ui.samizdat_card.replaceChildren() if (view.samizdat > 0) @@ -812,7 +823,7 @@ function on_log(text) { p.className = "h3" } - text = text.replace(/([a-zA-Z])\*/g, "") + text = text.replace(/([a-zA-Z])\*/g, "$1") p.innerHTML = text return p } diff --git a/rules.js b/rules.js index 48b34af..5654997 100644 --- a/rules.js +++ b/rules.js @@ -400,6 +400,9 @@ exports.view = function(state, player) { if (game.is_pwr_struggle) { view.power_struggle_discard = game.power_struggle_discard view.played_power_card = game.played_power_card + console.log('game.com_power_card', game.com_power_card, 'game.dem_power_card', game.dem_power_card) + view.power_card_1 = game.power_card_1 + view.power_card_2 = game.power_card_2 } view.strategy_discard = game.strategy_discard @@ -1574,6 +1577,13 @@ states.power_struggle = { power_card(card) { push_undo() discard(card) + if (game.phase === 0) { + game.power_card_1 = card + delete game.power_card_2 + } + if (game.phase === 1) { + game.power_card_2 = card + } game.valid_cards=[] game.return_state = 'power_struggle' if (game.phase === 0) {delete game.proxy_power_card} @@ -1643,6 +1653,8 @@ states.power_struggle = { concede () { push_undo() game.valid_cards = [] + delete game.power_card_1 + delete game.power_card_2 log('Conceded') log_h2('Aftermath') log_h3('Support Loss') @@ -2114,8 +2126,8 @@ states.general_strike = { prompt() { if (game.played_card === 0 ) { view.prompt = 'General Strike: you must discard a card or play a Scoring Card.' - available_cards = game.communist_hand - for (let card of available_cards) { + game.communist_hand + for (let card of game.communist_hand) { gen_action_card(card) } } else if (game.played_card > 0 ) { @@ -3884,11 +3896,11 @@ function find_country_index(country) { } function draw_deck() { - let hand = [] + let deck = [] for (let c = first_strategy_card; c <= last_strategy_card; ++c) if (cards[c].period === 1) - hand.push(c) - return c + deck.push(c) + return deck } function draw_cards(deck, democrat_hand, communist_hand, dem_hand_limit, com_hand_limit) { -- cgit v1.2.3 From 3598e7f1f7b2a3ec6ebb1458baae576e4e65aa95 Mon Sep 17 00:00:00 2001 From: iainp5 Date: Tue, 29 Oct 2024 17:53:37 +0000 Subject: Add small power cards --- play.css | 129 +++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 64 insertions(+), 65 deletions(-) (limited to 'play.css') diff --git a/play.css b/play.css index a0d7094..0619a98 100644 --- a/play.css +++ b/play.css @@ -39,6 +39,7 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } #log { background-color: floralwhite } #log .h1 { background-color: tan } #log .h2 { background-color: wheat } +#log .h3 { background-color: wheat } #log .h2.dem { background-color: hsl(206, 85%, 80%); } #log .h2.com { background-color: hsl(355, 70%, 80%); } @@ -233,22 +234,14 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } min-height: 350px; } -.panel:has(.panel_body:empty) { - display: none; +.panel_body.power { + min-height: 263px; } -#scoring_card_panel { - display: flex; - flex-direction: column; - width: 100%; -} - -#scoring_card_panel .card_row { - display: flex; - gap: 10px; +.panel.autohide:has(.panel_body:empty) { + display: none; } - /* CARD IMAGES */ #tooltip { @@ -269,6 +262,12 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } box-shadow: 0 0 0 1px #444, 1px 2px 4px #0004; } +.power_card { + width: 188px; + height: 263px; + border-radius: 12px; +} + .card.action { box-shadow: 0 0 0 1px #444, 0 0 0 4px white; } @@ -389,56 +388,56 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } .card.event_109 { background-image: url(cards100/event_109.avif) } .card.event_110 { background-image: url(cards100/event_110.avif) } -.card.power_0 { background-image: url(cards100/power_back.avif) } -.card.power_1 { background-image: url(cards100/power_1_6.avif) } -.card.power_2 { background-image: url(cards100/power_1_6.avif) } -.card.power_3 { background-image: url(cards100/power_1_6.avif) } -.card.power_4 { background-image: url(cards100/power_1_6.avif) } -.card.power_5 { background-image: url(cards100/power_1_6.avif) } -.card.power_6 { background-image: url(cards100/power_1_6.avif) } -.card.power_7 { background-image: url(cards100/power_7_8.avif) } -.card.power_8 { background-image: url(cards100/power_7_8.avif) } -.card.power_9 { background-image: url(cards100/power_9_10.avif) } -.card.power_10 { background-image: url(cards100/power_9_10.avif) } -.card.power_11 { background-image: url(cards100/power_11_14.avif) } -.card.power_12 { background-image: url(cards100/power_11_14.avif) } -.card.power_13 { background-image: url(cards100/power_11_14.avif) } -.card.power_14 { background-image: url(cards100/power_11_14.avif) } -.card.power_15 { background-image: url(cards100/power_15_18.avif) } -.card.power_16 { background-image: url(cards100/power_15_18.avif) } -.card.power_17 { background-image: url(cards100/power_15_18.avif) } -.card.power_18 { background-image: url(cards100/power_15_18.avif) } -.card.power_19 { background-image: url(cards100/power_19_20.avif) } -.card.power_20 { background-image: url(cards100/power_19_20.avif) } -.card.power_21 { background-image: url(cards100/power_21_22.avif) } -.card.power_22 { background-image: url(cards100/power_21_22.avif) } -.card.power_23 { background-image: url(cards100/power_23_26.avif) } -.card.power_24 { background-image: url(cards100/power_23_26.avif) } -.card.power_25 { background-image: url(cards100/power_23_26.avif) } -.card.power_26 { background-image: url(cards100/power_23_26.avif) } -.card.power_27 { background-image: url(cards100/power_27_30.avif) } -.card.power_28 { background-image: url(cards100/power_27_30.avif) } -.card.power_29 { background-image: url(cards100/power_27_30.avif) } -.card.power_30 { background-image: url(cards100/power_27_30.avif) } -.card.power_31 { background-image: url(cards100/power_31_33.avif) } -.card.power_32 { background-image: url(cards100/power_31_33.avif) } -.card.power_33 { background-image: url(cards100/power_31_33.avif) } -.card.power_34 { background-image: url(cards100/power_34_36.avif) } -.card.power_35 { background-image: url(cards100/power_34_36.avif) } -.card.power_36 { background-image: url(cards100/power_34_36.avif) } -.card.power_37 { background-image: url(cards100/power_37.avif) } -.card.power_38 { background-image: url(cards100/power_38.avif) } -.card.power_39 { background-image: url(cards100/power_39.avif) } -.card.power_40 { background-image: url(cards100/power_40.avif) } -.card.power_41 { background-image: url(cards100/power_41.avif) } -.card.power_42 { background-image: url(cards100/power_42.avif) } -.card.power_43 { background-image: url(cards100/power_43.avif) } -.card.power_44 { background-image: url(cards100/power_44.avif) } -.card.power_45 { background-image: url(cards100/power_45.avif) } -.card.power_46 { background-image: url(cards100/power_46.avif) } -.card.power_47 { background-image: url(cards100/power_47.avif) } -.card.power_48 { background-image: url(cards100/power_48.avif) } -.card.power_49 { background-image: url(cards100/power_49.avif) } -.card.power_50 { background-image: url(cards100/power_50.avif) } -.card.power_51 { background-image: url(cards100/power_51.avif) } -.card.power_52 { background-image: url(cards100/power_52.avif) } +.card.power_0 { background-image: url(cards75/power_back.avif) } +.card.power_1 { background-image: url(cards75/power_1_6.avif) } +.card.power_2 { background-image: url(cards75/power_1_6.avif) } +.card.power_3 { background-image: url(cards75/power_1_6.avif) } +.card.power_4 { background-image: url(cards75/power_1_6.avif) } +.card.power_5 { background-image: url(cards75/power_1_6.avif) } +.card.power_6 { background-image: url(cards75/power_1_6.avif) } +.card.power_7 { background-image: url(cards75/power_7_8.avif) } +.card.power_8 { background-image: url(cards75/power_7_8.avif) } +.card.power_9 { background-image: url(cards75/power_9_10.avif) } +.card.power_10 { background-image: url(cards75/power_9_10.avif) } +.card.power_11 { background-image: url(cards75/power_11_14.avif) } +.card.power_12 { background-image: url(cards75/power_11_14.avif) } +.card.power_13 { background-image: url(cards75/power_11_14.avif) } +.card.power_14 { background-image: url(cards75/power_11_14.avif) } +.card.power_15 { background-image: url(cards75/power_15_18.avif) } +.card.power_16 { background-image: url(cards75/power_15_18.avif) } +.card.power_17 { background-image: url(cards75/power_15_18.avif) } +.card.power_18 { background-image: url(cards75/power_15_18.avif) } +.card.power_19 { background-image: url(cards75/power_19_20.avif) } +.card.power_20 { background-image: url(cards75/power_19_20.avif) } +.card.power_21 { background-image: url(cards75/power_21_22.avif) } +.card.power_22 { background-image: url(cards75/power_21_22.avif) } +.card.power_23 { background-image: url(cards75/power_23_26.avif) } +.card.power_24 { background-image: url(cards75/power_23_26.avif) } +.card.power_25 { background-image: url(cards75/power_23_26.avif) } +.card.power_26 { background-image: url(cards75/power_23_26.avif) } +.card.power_27 { background-image: url(cards75/power_27_30.avif) } +.card.power_28 { background-image: url(cards75/power_27_30.avif) } +.card.power_29 { background-image: url(cards75/power_27_30.avif) } +.card.power_30 { background-image: url(cards75/power_27_30.avif) } +.card.power_31 { background-image: url(cards75/power_31_33.avif) } +.card.power_32 { background-image: url(cards75/power_31_33.avif) } +.card.power_33 { background-image: url(cards75/power_31_33.avif) } +.card.power_34 { background-image: url(cards75/power_34_36.avif) } +.card.power_35 { background-image: url(cards75/power_34_36.avif) } +.card.power_36 { background-image: url(cards75/power_34_36.avif) } +.card.power_37 { background-image: url(cards75/power_37.avif) } +.card.power_38 { background-image: url(cards75/power_38.avif) } +.card.power_39 { background-image: url(cards75/power_39.avif) } +.card.power_40 { background-image: url(cards75/power_40.avif) } +.card.power_41 { background-image: url(cards75/power_41.avif) } +.card.power_42 { background-image: url(cards75/power_42.avif) } +.card.power_43 { background-image: url(cards75/power_43.avif) } +.card.power_44 { background-image: url(cards75/power_44.avif) } +.card.power_45 { background-image: url(cards75/power_45.avif) } +.card.power_46 { background-image: url(cards75/power_46.avif) } +.card.power_47 { background-image: url(cards75/power_47.avif) } +.card.power_48 { background-image: url(cards75/power_48.avif) } +.card.power_49 { background-image: url(cards75/power_49.avif) } +.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) } \ No newline at end of file -- cgit v1.2.3 From 4090f2cebe2bae78979260bb8aa7f5ee7e9a4b72 Mon Sep 17 00:00:00 2001 From: iainp5 Date: Thu, 31 Oct 2024 09:31:25 +0000 Subject: Increase size of systematisation marker --- play.css | 3 +++ 1 file changed, 3 insertions(+) (limited to 'play.css') diff --git a/play.css b/play.css index 0619a98..8b8d19f 100644 --- a/play.css +++ b/play.css @@ -209,6 +209,9 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } /* The Wall */ #event_9 { top: 175px; left: 216px; } +/* Systematisation */ +#event_69 {height: 65px; width: 65px; background-size: cover;} + /* CARD PANELS */ .panel { -- cgit v1.2.3 From 1640855336f524cf44f61571b0bb25c10f70c34b Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sat, 2 Nov 2024 00:13:34 +0100 Subject: stack influence markers to go above 8 --- play.css | 1 + play.js | 50 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 14 deletions(-) (limited to 'play.css') diff --git a/play.css b/play.css index 8b8d19f..f2113ed 100644 --- a/play.css +++ b/play.css @@ -266,6 +266,7 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } } .power_card { + background-color: #093a5b; width: 188px; height: 263px; border-radius: 12px; diff --git a/play.js b/play.js index 73357fe..aa7a8b6 100644 --- a/play.js +++ b/play.js @@ -395,11 +395,16 @@ function create_country(id, name) { document.getElementById("markers").appendChild(e) } +const INF_DX = 35 +const INF_DY = 10 + function create_ui() { ui.layout_xy = [] ui.spaces = [] ui.dem_inf = [] ui.com_inf = [] + ui.dem_inf2 = [] + ui.com_inf2 = [] for (let s = 0; s <= last_space; ++s) { let info = spaces[s] @@ -428,15 +433,29 @@ function create_ui() { com_e.style.top = yc + 12 - 25 + "px" ui.com_inf[s] = com_e + let com_e2 = document.createElement("div") + com_e2.className = "marker comInfl hide" + com_e2.style.left = xc + 32 - 25 + INF_DX + "px" + com_e2.style.top = yc + 12 - 25 + INF_DY + "px" + ui.com_inf2[s] = com_e2 + let dem_e = document.createElement("div") dem_e.className = "marker demInfl hide" dem_e.style.left = xc - 32 - 25 + "px" dem_e.style.top = yc + 12 - 25 + "px" ui.dem_inf[s] = dem_e + let dem_e2 = document.createElement("div") + dem_e2.className = "marker demInfl hide" + dem_e2.style.left = xc - 32 - 25 - INF_DX + "px" + dem_e2.style.top = yc + 12 - 25 + INF_DY + "px" + ui.dem_inf2[s] = dem_e2 + document.getElementById("spaces").append(space_e) document.getElementById("markers").appendChild(com_e) + document.getElementById("markers").appendChild(com_e2) document.getElementById("markers").appendChild(dem_e) + document.getElementById("markers").appendChild(dem_e2) } ui.cards = [] @@ -550,6 +569,21 @@ function layout_country(id) { } } +function layout_inf_markers(cn, one, two, v, ctl) { + if (ctl) + cn += " ctl" + if (v > 8) { + one.className = cn + " v" + 8 + two.className = cn + " v" + (v - 8) + } else if (v > 0) { + one.className = cn + " v" + v + two.className = "hide" + } else { + one.className = "hide" + two.className = "hide" + } +} + function on_update() { if (!ui.spaces) create_ui() @@ -615,20 +649,8 @@ function on_update() { for (let s = 0; s <= last_space; ++s) { const demInfl = view.demInfl[s] const comInfl = view.comInfl[s] - - if (demInfl - comInfl >= spaces[s].stability) - ui.dem_inf[s].className = "marker demInfl ctl v" + demInfl - else if (demInfl > 0) - ui.dem_inf[s].className = "marker demInfl v" + demInfl - else - ui.dem_inf[s].className = "marker demInfl hide" - - if (comInfl - demInfl >= spaces[s].stability) - ui.com_inf[s].className = "marker comInfl ctl v" + comInfl - else if (comInfl > 0) - ui.com_inf[s].className = "marker comInfl v" + comInfl - else - ui.com_inf[s].className = "marker comInfl hide" + layout_inf_markers("marker demInfl", ui.dem_inf[s], ui.dem_inf2[s], demInfl, demInfl - comInfl >= spaces[s].stability) + layout_inf_markers("marker comInfl", ui.com_inf[s], ui.com_inf2[s], comInfl, comInfl - demInfl >= spaces[s].stability) } // UPDATE COUNTRY MARKERS -- cgit v1.2.3 From 1d073110c0937e2a057efd0eeeef5223036c1187 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sat, 2 Nov 2024 20:36:16 +0100 Subject: Highlight selected space. --- play.css | 5 +++++ play.js | 3 +++ rules.js | 17 +++-------------- 3 files changed, 11 insertions(+), 14 deletions(-) (limited to 'play.css') diff --git a/play.css b/play.css index f2113ed..dc801f8 100644 --- a/play.css +++ b/play.css @@ -90,6 +90,11 @@ body.Communist header.your_turn { background-color: hsl(355, 70%, 75%); } .space.Romania.action { border-color: peachpuff; } .space.Bulgaria.action { border-color: palegreen; } +.space.selected { + border-color: aqua; + box-shadow: 0 0 0 1px black, inset 0 0 0 1px black; +} + .space.tip { border-color: lime; box-shadow: 0 0 0 1px black, inset 0 0 0 1px black; diff --git a/play.js b/play.js index aa7a8b6..a201e8a 100644 --- a/play.js +++ b/play.js @@ -715,6 +715,9 @@ function on_update() { for (let e of action_register) e.classList.toggle("action", is_action(e.my_action, e.my_id)) + for (let s = 0; s <= last_space; ++s) + ui.spaces[s].classList.toggle("selected", view.selected_space === s) + action_button("yes", "Yes") action_button("no", "No") action_button("start", "Start") diff --git a/rules.js b/rules.js index dff42c5..3e4a867 100644 --- a/rules.js +++ b/rules.js @@ -387,19 +387,8 @@ exports.view = function(state, player) { view.drawn = game.vm.draw if (player === game.active) { - if (game.selected_space) { - view.valid_spaces = [game.selected_space] - } else { - view.valid_spaces = game.valid_spaces - } - } else { - view.valid_spaces = [] - } - - if (player === game.active) { - view.valid_cards = game.valid_cards - } else { - view.valid_cards = [] + if (game.selected_space >= 0) + view.selected_space = game.selected_space } if (player === DEM) { @@ -422,7 +411,7 @@ exports.view = function(state, player) { if (game.state === "game_over") { view.prompt = game.victory - } else if (player === "Observer" || (game.active !== player && game.active !== "Both")) { + } else if (game.active !== player) { if (states[game.state]) { let inactive = states[game.state].inactive if (typeof inactive === "function") -- cgit v1.2.3