summaryrefslogtreecommitdiff
path: root/rules.js
diff options
context:
space:
mode:
authoriainp5 <iain.pearce.ip@gmail.com>2024-10-07 23:12:06 +0100
committeriainp5 <iain.pearce.ip@gmail.com>2024-10-07 23:12:06 +0100
commit929a9f44d6599426c7cd05fd5aa621bf83085c58 (patch)
treee52585b08baae7cce793d2250f333f085bb721ee /rules.js
parent9e7c1420da9c57f5af27e24ef8a84e7c3cc13116 (diff)
parent709c5f22e4e3c2e71f7385edbee0ce9922b25863 (diff)
download1989-dawn-of-freedom-929a9f44d6599426c7cd05fd5aa621bf83085c58.tar.gz
Merge branch 'new-view' into work-in-progress
Diffstat (limited to 'rules.js')
-rw-r--r--rules.js402
1 files changed, 367 insertions, 35 deletions
diff --git a/rules.js b/rules.js
index 1511719..f4357d2 100644
--- a/rules.js
+++ b/rules.js
@@ -266,10 +266,13 @@ exports.view = function(state, player) {
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))
+ 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])
@@ -417,7 +420,7 @@ states.choose_card = {
view.prompt = 'No cards remaining: you must pass.'
gen_action('pass')
} else {
- view.prompt = 'Choose a card.'
+ view.prompt = 'Play a card.'
let available_cards
if (game.active === DEM) {
available_cards = game.democrat_hand
@@ -425,11 +428,61 @@ states.choose_card = {
available_cards = game.communist_hand
}
for (let card of available_cards) {
- gen_action_card(card)
+ //gen_action('card_event', card)
+
+ if (scoring_cards.includes(card)) {
+ /*view.prompt = 'Play for:'*/
+ gen_action('card_event', card)
+ }
+
+
+ //Check for Tiananmen Square Track awards special abilities
+ console.log('game.tst_8', game.tst_8)
+ if ((game.active === DEM && cards[card].side !== 'C' && game.dem_tst_position >= 8 && game.com_tst_position < 8 && !game.tst_8) || (game.active === COM && cards[card].side !== 'D' && game.com_tst_position >= 8 && game.dem_tst_position < 8 && !game.tst_8)){
+ gen_action('card_tst_8', card)
+ }
+
+ // Check for Reformer Rehabilitated
+
+ //console.log('game.active', game.active, 'game.playable_cards[67].playable', game.playable_cards[67].playable)
+
+
+ if (card === 67 && game.playable_cards.includes(67)){
+ if (game.active === DEM && (game.dem_tst_position > game.com_tst_position)) {
+ gen_action('card_event', card)
+ }
+ if (game.active === COM && (game.dem_tst_position < game.com_tst_position)) {
+ gen_action('card_event', card)
+ }
+ }
+
+ //Continue with normal logic
+
+ //Check if it is a card with an event which is always playable
+
+ if (cards[card].playable) {
+ get_events(card)
+ }
+
+ // Resolve cards with variable events (not Reformer)
+
+ if (card !== 67 && game.playable_cards.includes(card)) {
+ get_events(card)
+ }
+
+ //Actions for non-scoring cards
+
+ if (!scoring_cards.includes(card)) {
+ gen_action('card_influence', card)
+ 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('card_tst', card)
+ }
+ gen_action('card_support_check', card)
+ }
}
}
},
- card(card) {
+ /*card_event(card) {
push_undo()
//Check if player is at risk of losing game due to held scoring card
if (!scoring_cards.includes(card)) {
@@ -442,11 +495,111 @@ states.choose_card = {
}
}
select_card(card)
- },
+ },*/
pass() {
log('No cards remaining. Passed')
end_round()
- }
+ },
+ card_event(card) {
+ push_undo()
+ select_card(card)
+ 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`)
+ 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
+ goto_vm(game.vm_event)
+ },
+ card_opp_event(card) {
+ push_undo()
+ select_card(card)
+ 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 (auto_resolve_events.includes(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)
+ }
+ },
+ card_influence(card) {
+ push_undo()
+ select_card(card)
+ 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()
+ },
+ card_tst(card) {
+ push_undo()
+ select_card(card)
+ log_gap(`Played C${cards[game.played_card].number} to the Tiananmen Square Track`)
+ game.state='tiananmen_square_attempt'
+ },
+ card_support_check(card) {
+ push_undo()
+ select_card(card)
+ 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 (game.phase === 0 && game.active === DEM && cards[game.played_card].side === "C" && game.playable_cards[game.played_card].playable === 1 || game.phase === 0 && game.active === COM && cards[game.played_card].side === "D" && game.playable_cards[game.played_card].playable === 1 ) {
+ game.vm_event_to_do = true
+ }*/
+
+ 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()
+ },
+ card_tst_8(card) { /*Play card for ops and event */
+ select_card(card)
+ game.vm_event_to_do = true
+ game.vm_infl_to_do = true
+ game.tst_8 = true
+ game.state = 'vm_tst_8'
+ },
+
/*done () {
game.state = 'play_card'
} */
@@ -2093,9 +2246,81 @@ states.stasi_play_card = {
gen_action('pass')
} else {
view.prompt = `Stasi: you must play ${clean_name(cards[game.stasi_card].name)}.`
- let available_cards = [game.stasi_card]
+ /*let available_cards = [game.stasi_card]
for (let card of available_cards) {
gen_action_card(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_event', card)
+
+ if (scoring_cards.includes(card)) {
+ /*view.prompt = 'Play for:'*/
+ gen_action('card_event', card)
+ return
+ }
+
+ //Check if Player has Common European Home in hand
+ if (game.active === DEM) {
+ if (game.democrat_hand.includes(21) && cards[card].side === "C" && card !== 21) {
+ gen_action('card_ceh', card)
+ }
+ } else {
+ if (game.communist_hand.includes(21) && cards[card].side === "D" && card !== 21) {
+ gen_action('card_ceh', card)
+ }
+ }
+
+ //Check for Tiananmen Square Track awards special abilities
+ if ((game.active === DEM && cards[card].side !== 'C' && game.dem_tst_position >= 8 && game.com_tst_position < 8 && !game.tst_8) || (game.active === COM && cards[card].side !== 'D' && game.com_tst_position >= 8 && game.dem_tst_position < 8 && !game.tst_8)){
+ gen_action('card_tst_8', card)
+ }
+
+ // Check for Reformer Rehabilitated
+
+ //console.log('game.active', game.active, 'game.playable_cards[67].playable', game.playable_cards[67].playable)
+
+
+ if (card === 67 && game.playable_cards.includes(67)){
+ if (game.active === DEM && (game.dem_tst_position > game.com_tst_position)) {
+ gen_action('card_event', card)
+ }
+ if (game.active === COM && (game.dem_tst_position < game.com_tst_position)) {
+ gen_action('card_event', card)
+ }
+ }
+
+ //Continue with normal logic
+
+ //Check if it is a card with an event which is always playable. May not play Common European Home for event in Stasi
+
+ if (cards[card].playable && card !== 21) {
+ console.log('get events called normally for card', card)
+ get_events(card)
+ }
+
+ // Resolve cards with variable events (not Reformer, not Common European Home in Stasi)
+
+ if (card !== 67 && card !== 21 && game.playable_cards.includes(card)) {
+ console.log('get events called variable for card', card)
+ get_events(card)
+ } /*
+ if ((game.active === DEM && cards[game.played_card].side === 'D' && game.playable_cards[game.played_card].playable === 1) || (game.active === COM && cards[game.played_card].side === 'C' && game.playable_cards[game.played_card].playable ===1) || (cards[game.played_card].side === 'N'&& game.playable_cards[game.played_card].playable ===1)) {
+ gen_action('event')
+ } else if ((game.active === DEM && (cards[game.played_card].side === 'C' && game.playable_cards[game.played_card].playable ===1)) || game.active === COM && (cards[game.played_card].side === 'D' && game.playable_cards[game.played_card].playable ===1)) {
+ gen_action('opp_event')
+ } */
+
+ gen_action('card_influence', card)
+ 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('card_tst', card)
+ }
+ gen_action('card_support_check', card)
}
}
},
@@ -2107,24 +2332,7 @@ states.stasi_play_card = {
find_card = game.democrat_hand.indexOf(card);
game.democrat_hand.splice(find_card, 1);
game.available_ops = get_card_ops(card)
- /*
- //Check for events which influence ops
- if (game.persistent_events['sinatra_doctrine'] && game.active === DEM) {
- log('+1 op from C50')
- game.available_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)) {
- log('+1 op from Tiananmen Square Track')
- game.available_ops ++
- }
- if (game.available_ops > 1 && game.prudence.DEM !== 0) {
- log(`${pluralize(game.prudence.DEM, ' op')} from C8`)
- game.available_ops += game.prudence.DEM
- if (game.available_ops < 1) {
- game.available_ops = 1
- }
- }*/
game.stasi_card = 0
if (game.democrat_hand.includes(21)) {
game.state = 'stasi_resolve_common_european_home'
@@ -2137,6 +2345,120 @@ states.stasi_play_card = {
log('No cards remaining. Passed')
end_round()
},
+ card_ceh(card) {
+ push_undo()
+ select_card(card)
+ game.stasi_card = 0
+ log(`${clean_name(cards[game.played_card].name)} 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'
+ },
+
+ card_event(card) {
+ push_undo()
+ select_card(card)
+ game.stasi_card = 0
+ 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`)
+ 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
+ goto_vm(game.vm_event)
+ },
+ card_opp_event(card) {
+ push_undo()
+ select_card(card)
+ game.stasi_card = 0
+ 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 (auto_resolve_events.includes(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)
+ }
+ },
+ card_influence(card) {
+ push_undo()
+ select_card(card)
+ game.stasi_card = 0
+ 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()
+ },
+ card_tst(card) {
+ push_undo()
+ select_card(card)
+ game.stasi_card = 0
+ log_gap(`Played C${cards[game.played_card].number} to the Tiananmen Square Track`)
+ game.state='tiananmen_square_attempt'
+ },
+ card_support_check(card) {
+ push_undo()
+ select_card(card)
+ 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 (game.phase === 0 && game.active === DEM && cards[game.played_card].side === "C" && game.playable_cards[game.played_card].playable === 1 || game.phase === 0 && game.active === COM && cards[game.played_card].side === "D" && game.playable_cards[game.played_card].playable === 1 ) {
+ game.vm_event_to_do = true
+ }*/
+
+ 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()
+ },
+ card_tst_8(card) { /*Play card for ops and event */
+ select_card(card)
+ game.vm_event_to_do = true
+ game.vm_infl_to_do = true
+ game.tst_8 = true
+ game.state = 'vm_tst_8'
+ },
done () {
game.stasi_card = 0
if (game.democrat_hand.includes(21)) {
@@ -2282,6 +2604,7 @@ function remove_infl(space) {
}
function do_sc(space) {
+ clear_undo()
log_gap(`Support check: ${space}`)
let clicked_space = find_space_index(space)
@@ -2291,10 +2614,12 @@ function do_sc(space) {
log('+1 VP from C26')
game.vp ++
if (check_vp()) {
+ game.state = 'game.over'
+ console.log('after check_vp, game.state', game.state)
return
}
}
-
+ console.log('continue support check, game.state', game.state)
// Continue with Support Check Logic
let roll = Math.floor(Math.random() * 6) + 1
@@ -2462,7 +2787,7 @@ function do_sc(space) {
}
}
game.selected_space = 0
- clear_undo()
+
}
@@ -3126,6 +3451,7 @@ function permanently_remove(card) {
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!`)
@@ -3147,6 +3473,7 @@ function goto_game_over(result, victory) {
game.victory = victory
log_h1("Game Over")
log(game.victory)
+ console.log('game over, game.state', game.state)
return
}
@@ -3223,14 +3550,14 @@ 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')}
+ if (game.active === DEM) {gen_action('card_event', card)}
+ if (game.active === COM) {gen_action('card_opp_event', card)}
}
else if (cards[card].side === 'C') {
- if (game.active === COM) {gen_action('event')}
- if (game.active === DEM) {gen_action('opp_event')}
+ if (game.active === COM) {gen_action('card_event', card)}
+ if (game.active === DEM) {gen_action('card_opp_event', card)}
} else {
- gen_action('event')
+ gen_action('card_event', card)
}
}
@@ -3451,13 +3778,14 @@ function end_round() {
}
// Resolve end action round
-
+ //Stasi check
if(game.round_player === COM && game.persistent_events.includes(13)) {
game.round_player = DEM
if (game.active !== DEM) {
next_player()
- } else {
+ } else {
log_h3('Democratic Action Round')
+ log_h3('C13')
}
if (game.democrat_hand.includes(game.stasi_card)) {
game.state = 'stasi_play_card'
@@ -3466,11 +3794,15 @@ function end_round() {
game.state = 'choose_card'
}
return
- } else if (game.round_player === COM && game.round === 8) {
+ }
+ //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
- } else if (game.round_player===COM) {
+ }
+ //Normal round end
+ else if (game.round_player===COM) {
game.round_player = DEM
if (game.active !== DEM) {
next_player()