summaryrefslogtreecommitdiff
path: root/rules.js
diff options
context:
space:
mode:
Diffstat (limited to 'rules.js')
-rw-r--r--rules.js164
1 files changed, 81 insertions, 83 deletions
diff --git a/rules.js b/rules.js
index bb5c6ac..c2b93f0 100644
--- a/rules.js
+++ b/rules.js
@@ -123,7 +123,6 @@ function checkpoint() {
resolve_active_and_proceed();
}
function setup_bag_of_glory() {
- log_h1('Bag of Glory');
game.engine = [
create_state_node('add_glory', game.initiative),
create_function_node('end_of_turn'),
@@ -138,7 +137,7 @@ function setup_choose_card() {
}
function setup_final_bid() {
game.fascist = 0;
- log_h1('Final Bid');
+ log_header('Final Bid', 't');
const player_order = get_player_order();
game.engine = player_order.map((faction_id) => create_state_node('choose_final_bid', faction_id));
game.engine.push(create_function_node('checkpoint'));
@@ -186,10 +185,9 @@ function end_of_player_turn() {
}
function start_of_player_turn() {
const args = get_active_node_args();
- const player = faction_player_map[args.f];
game.faction_turn = args.f;
game.played_card = game.selected_cards[args.f][0];
- log_h2(cards[game.played_card].title, player);
+ log_header("C" + game.played_card, args.f);
resolve_active_and_proceed();
}
const engine_functions = {
@@ -207,6 +205,7 @@ const engine_functions = {
start_year,
resolve_fascist_test,
resolve_final_bid,
+ log_trigger,
card1_event2,
card3_event2,
card10_event2,
@@ -482,6 +481,7 @@ function setup(seed, _scenario, options) {
fascist: 0,
card_played: 0,
};
+ log_header('Land and Freedom', 't');
if (options.hidden_bag)
game.hidden_bag = 1;
game.player_order.push(exports.roles[random(2)]);
@@ -490,7 +490,7 @@ function setup(seed, _scenario, options) {
start_year();
return game;
}
-function draw_hand_cards(faction_id, count) {
+function draw_hand_cards(faction_id, count, indent = true) {
const deck = list_deck(faction_id);
if (game.medallions[faction_id].includes(data_1.INTELLIGENCE_MEDALLION_ID)) {
count++;
@@ -509,26 +509,28 @@ function draw_hand_cards(faction_id, count) {
drawn_cards++;
}
}
- const log = drawn_cards === 1
- ? `${get_player(faction_id)} draws 1 card`
- : `${get_player(faction_id)} draws ${drawn_cards} cards`;
- logi(log);
+ if (indent)
+ logi(`${get_player(faction_id)} +${drawn_cards} cards`);
+ else
+ log(`${get_player(faction_id)} +${drawn_cards} cards.`);
}
function start_year() {
game.year++;
+ log_header(`Year ${game.year}`, 't');
game.turn = 1;
game.current_events = [];
role_ids.forEach((role) => {
- draw_hand_cards(role, 5);
+ draw_hand_cards(role, 5, false);
});
start_turn();
}
function start_turn() {
- log_h1(`Year ${game.year} - Turn ${game.turn}`);
+ log_header(`Turn ${game.turn}`, 't');
const cardId = draw_fascist_card();
game.current_events.push(cardId);
const card = cards[cardId];
- log_h2(card.title, 'fascist');
+ log_header("C" + cardId, 'f');
+ log("Fascist Event:");
game.fascist = 1;
game.engine = card.effects.map((effect) => resolve_effect(effect, 'fascist_event'));
game.engine.push(create_state_node('confirm_fascist_turn', game.initiative, { src: 'fascist_event' }));
@@ -707,10 +709,9 @@ states.add_card_to_tableau = {
},
card(c) {
const faction_id = get_active_faction();
- const card = cards[c];
array_remove(game.hands[faction_id], game.hands[faction_id].indexOf(c));
game.tableaus[faction_id].push(c);
- logi(`${faction_player_map[faction_id]} adds ${card.title} to their tableau`);
+ logp(`added C${c} to their tableau`);
resolve_active_and_proceed();
},
skip() {
@@ -1075,10 +1076,10 @@ function setup_momentum() {
}
}
states.choose_medallion = {
- inactive: 'choose a medallion',
+ inactive: 'earn a medallion',
prompt() {
gen_spend_hero_points();
- view.prompt = 'Choose a Medallion.';
+ view.prompt = 'Earn a Medallion.';
for (let m of game.medallions.pool) {
gen_action_medallion(m);
}
@@ -1092,12 +1093,12 @@ states.choose_medallion = {
medallion(m) {
const faction = get_active_faction();
const medallion = medallions[m];
- logi(`${faction_player_map[faction]} earns ${medallion.name}`);
+ logp(`earned ${medallion.name}`);
const index = game.medallions.pool.indexOf(m);
game.medallions.pool[index] = null;
switch (m) {
case 0:
- add_glory(faction, 1, true);
+ add_glory(faction, 1);
break;
case 1:
gain_hero_points(faction, 7);
@@ -1168,7 +1169,7 @@ states.draw_glory = {
inactive: 'draw from the Bag of Glory',
prompt() {
gen_spend_hero_points();
- view.prompt = 'Draw from the Bag of Glory';
+ view.prompt = 'Draw from the Bag of Glory.';
gen_action('draw_glory');
},
draw_glory() {
@@ -1184,7 +1185,7 @@ states.draw_glory = {
}
game.glory_current_year[faction] = true;
array_remove(game.bag_of_glory, index);
- log(`${get_player(get_active_faction())} draws <ft${faction}> from the Bag of Glory`);
+ logi(`Pulled T${faction} from the Bag`);
resolve_active_and_proceed(true);
},
};
@@ -1226,7 +1227,7 @@ states.end_of_year_discard = {
next();
}
else {
- log(`${faction_player_map[faction_id]} discards cards`);
+ log(`${game.active} discarded cards.`);
resolve_active_and_proceed();
}
},
@@ -1502,8 +1503,8 @@ states.peek_fascist_cards = {
},
};
function resolve_spend_hp() {
+ log("Hero Points:");
insert_before_active_node(create_state_node('spend_hero_points', get_active_faction()));
- log('Spends Hero Points');
next();
}
function set_player_turn_prompt({ can_play_card, use_ap, use_momentum, use_morale_bonus, }) {
@@ -1579,6 +1580,7 @@ states.player_turn = {
play_for_event() {
game.card_played = 1;
const faction = get_active_faction();
+ log('Played for Event:');
const { effects } = play_card_for_event(faction);
update_active_node_args({
resolving_event: true,
@@ -1590,6 +1592,7 @@ states.player_turn = {
next();
},
use_ap() {
+ log("Action Points:");
const faction = get_active_faction();
const { strength } = get_active_node_args();
update_active_node_args({
@@ -1601,6 +1604,7 @@ states.player_turn = {
next();
},
use_momentum() {
+ log("Momentum:");
const faction = get_active_faction();
game.card_played = 0;
game.selected_cards[faction] = [];
@@ -1614,6 +1618,7 @@ states.player_turn = {
next();
},
use_morale_bonus() {
+ log(`Morale Bonus:`);
update_active_node_args({
use_morale_bonus: false,
});
@@ -1638,7 +1643,7 @@ states.remove_blank_marker = {
pay_hero_points(faction, 1);
const track_id = Math.floor(b / 11);
const space_id = b % 11;
- logi(`${faction_player_map[faction]} removes a Blank marker from space ${space_id} of ${get_track_name(track_id)}`);
+ logp(`removed blank marker from ${get_track_name(track_id)} ${space_id}`);
game.triggered_track_effects = game.triggered_track_effects.filter((id) => id !== b);
game.used_medallions.push(data_1.ARCHIVES_MEDALLION_ID);
resolve_active_and_proceed();
@@ -1732,7 +1737,7 @@ states.return_card = {
const faction = get_active_faction();
array_remove(game.trash[faction], game.trash[faction].indexOf(c));
game.hands[faction].push(c);
- logi(`${faction_player_map[faction]} returns a card to their hand`);
+ logp(`returned a card to their hand`);
resolve_active_and_proceed();
},
skip() {
@@ -1943,8 +1948,7 @@ states.take_hero_points = {
resolve_active_and_proceed();
},
};
-function trash_card() {
- const faction = get_active_faction();
+function trash_card(faction) {
const index = game.selected_cards[faction].length - 1;
const card_id = game.selected_cards[faction][index];
array_remove(game.hands[faction], game.hands[faction].indexOf(card_id));
@@ -2098,19 +2102,13 @@ function card54_event1() {
function setup_return_card_from_trash() {
resolve_active_and_proceed();
}
-function add_glory(faction, amount, indent = false) {
- let tokens_log = '';
- for (let i = 0; i < amount; ++i) {
- game.bag_of_glory.push(get_active_faction());
- tokens_log += `<ft${faction}>`;
- }
- let text = `${faction_player_map[faction]} adds ${tokens_log} to the Bag of Glory`;
- if (indent) {
- logi(text);
- }
- else {
- log_h3(text);
- }
+function add_glory(faction, amount) {
+ for (let i = 0; i < amount; ++i)
+ game.bag_of_glory.push(faction);
+ if (amount > 1)
+ logi(`Added ${amount} T${faction} to the Bag`);
+ else
+ logi(`Added T${faction} to the Bag`);
}
function check_initiative() {
let initiative;
@@ -2127,7 +2125,7 @@ function check_initiative() {
return;
}
game.initiative = initiative;
- logi(`${faction_player_map[initiative]} claims the Initiative`);
+ logi(`${faction_player_map[initiative]} claimed Initiative`);
}
function war_is_won() {
let won_fronts = 0;
@@ -2185,21 +2183,18 @@ function end_of_turn() {
}
}
function end_of_year() {
+ log_header('End of Year', 't');
if (game.year === 3) {
- log_h1('End of the game');
const is_won = war_is_won();
if (is_won) {
log('The war is won!');
}
else {
- game_over('None', 'The war is lost. All Players lose the game!');
+ game_over('Fascist', 'The war is lost. All players lose the game!');
resolve_active_and_proceed();
return;
}
}
- else {
- log_h1('End of year');
- }
const glory_to_draw = [0, 1, 2, 5];
game.glory_current_year = {
a: false,
@@ -2263,7 +2258,7 @@ function gain_hero_points(faction_id, value, skip_abilities = false) {
const gain = Math.min(game.hero_points.pool, value);
game.hero_points.pool -= gain;
game.hero_points[faction_id] += gain;
- logi(`${get_player(faction_id)} +${gain} ${gain === 1 ? 'Hero Point' : 'Hero Points'}`);
+ logi(`${get_player(faction_id)} +${gain} HP`);
}
function game_over(result, victory) {
insert_after_active_node(create_state_node('game_over', 'None'));
@@ -2285,7 +2280,6 @@ function play_card_for_event(faction) {
const card_id = game.selected_cards[faction][index];
const card = cards[card_id];
game.played_card = card_id;
- log('Played for Event:');
return card;
}
function play_card_to_tableau(faction) {
@@ -2294,22 +2288,22 @@ function play_card_to_tableau(faction) {
const card = cards[card_id];
game.played_card = card_id;
array_remove(game.hands[faction], game.hands[faction].indexOf(card_id));
- log('Played to Tableau:');
game.tableaus[faction].push(card_id);
return card;
}
function resolve_fascist_test() {
game.fascist = 2;
- log_h2('Fascist Test', 'fascist');
const test = get_current_event().test;
- const status = game.fronts[test.front].status;
+ const front = test.front;
+ const status = game.fronts[front].status;
const test_passed = status === data_1.VICTORY ||
- (status !== data_1.DEFEAT && game.fronts[test.front].value >= test.value);
+ (status !== data_1.DEFEAT && game.fronts[front].value >= test.value);
const hero_point_actions = [];
+ log_header("C" + get_current_event_id(), 'f');
if (test_passed) {
- log('The Test is passed');
+ log(front_names[front] + ' passed:');
for (const faction of get_player_order()) {
- let hero_points_gain = game.fronts[test.front].contributions.includes(faction)
+ let hero_points_gain = game.fronts[front].contributions.includes(faction)
? 2
: 0;
if (can_use_medallion(data_1.PROPAGANDA_MEDALLION_ID, faction)) {
@@ -2325,7 +2319,7 @@ function resolve_fascist_test() {
}
}
else {
- log('The Test is failed');
+ log(front_names[front] + ' failed:');
}
const effect = test_passed ? test.pass : test.fail;
const node = resolve_effect(effect, 'fascist_test');
@@ -2464,6 +2458,7 @@ function move_track_to(track_id, new_value) {
const node = resolve_effect(trigger, tracks[track_id].action);
if (node !== null) {
insert_after_active_node(node);
+ insert_after_active_node(create_function_node('log_trigger', [track_id, space_id]));
}
}
});
@@ -2495,7 +2490,10 @@ function update_bonus(bonus_id, status) {
return;
}
game.bonuses[bonus_id] = status;
- logi(`${bonus_names[bonus_id]} ${status === data_1.ON ? 'on' : 'off'}`);
+ if (status === data_1.ON)
+ logi(`${bonus_names[bonus_id]} on`);
+ else
+ logi(`${bonus_names[bonus_id]} off`);
}
function update_front(front_id, change, faction_id = null) {
const player_token_on_front = faction_id !== null &&
@@ -2509,7 +2507,7 @@ function update_front(front_id, change, faction_id = null) {
}
const value_before = game.fronts[front_id].value;
game.fronts[front_id].value += change;
- logi(`${front_names[front_id]}: ${change > 0 ? '+' : ''}${change}`);
+ logi(`${front_names[front_id]} ${change > 0 ? '+' : ''}${change}`);
if (faction_id !== null &&
value_before <= 0 &&
game.fronts[front_id].value > 0) {
@@ -2536,9 +2534,11 @@ function update_front(front_id, change, faction_id = null) {
}
function defeat_on_a_front(front_id) {
game.fronts[front_id].status = data_1.DEFEAT;
- log('Defeat on ' + get_front_name(front_id));
+ log_br();
+ log('Defeat on ' + get_front_name(front_id) + '!');
+ log_br();
if (front_id === 'm' || get_defeated_front_count() == 2) {
- game_over('None', 'All players lose the game!');
+ game_over('Fascist', 'All players lose the game!');
return;
}
insert_after_active_node(create_effects_node([
@@ -2550,7 +2550,9 @@ function defeat_on_a_front(front_id) {
}
function victory_on_a_front(front_id) {
game.fronts[front_id].status = data_1.VICTORY;
- log('Victory on ' + get_front_name(front_id));
+ log_br();
+ log('Victory on ' + get_front_name(front_id) + '!');
+ log_br();
gain_hero_points_in_player_order(game.fronts[front_id].contributions, 3);
}
function create_effects_node(effects, source) {
@@ -2685,8 +2687,7 @@ function resolve_effect(effect, source) {
return strategy.resolve();
}
else {
- console.log('----UNRESOLVED EFFECT----', effect);
- throw new Error('Unresolved effect');
+ throw new Error('Unresolved effect: ' + effect);
}
}
function win_final_bid(faction_id) {
@@ -2716,15 +2717,8 @@ function lose_hero_points(faction, value) {
const points_lost = Math.min(game.hero_points[faction], Math.abs(value));
game.hero_points.pool += points_lost;
game.hero_points[faction] -= points_lost;
- if (points_lost === 0) {
- return;
- }
- if (points_lost === 1) {
- log(`${get_player(faction)}: -1 Hero Point`);
- }
- else {
- log(`${get_player(faction)}: -${points_lost} Hero Points`);
- }
+ if (points_lost !== 0)
+ logi(`${get_player(faction)} -${points_lost} HP`);
}
function get_fronts_closest_to(target) {
const values = Object.values(game.fronts).reduce((accrued, current) => {
@@ -2746,22 +2740,21 @@ function log_br() {
function log(msg) {
game.log.push(msg);
}
-function logi(msg) {
- log('>' + msg);
-}
-function log_h1(msg) {
+function log_header(msg, prefix) {
log_br();
- log('#t ' + msg);
+ log(`#${prefix} ${msg}`);
log_br();
}
-function log_h2(msg, player) {
- log_br();
- log(`#${player[0].toLowerCase()} ${msg}`);
- log_br();
+function log_trigger(args) {
+ let [track_id, space_id] = args;
+ log(`Trigger ${get_track_name(track_id)} #${space_id}:`);
+ resolve_active_and_proceed();
}
-function log_h3(msg) {
- log_br();
- log('.h3 ' + msg);
+function logi(msg) {
+ log(">" + msg);
+}
+function logp(msg) {
+ log(">" + game.active + " " + msg);
}
function get_active_faction() {
return player_faction_map[game.active];
@@ -2772,8 +2765,11 @@ function get_blank_marker_id(track_id, space_id) {
function get_front_name(id) {
return front_names[id];
}
+function get_current_event_id() {
+ return game.current_events[game.current_events.length - 1];
+}
function get_current_event() {
- return cards[game.current_events[game.current_events.length - 1]];
+ return cards[get_current_event_id()];
}
function get_defeated_front_count() {
let count = 0;
@@ -2941,11 +2937,13 @@ function list_deck(id) {
}
function draw_medallions() {
const medallion_ids = make_list(0, 8);
+ log("Medallions:");
for (let m = 0; m < 5; ++m) {
let i = random(medallion_ids.length);
let r = medallion_ids[i];
set_delete(medallion_ids, r);
game.medallions.pool.push(r);
+ logi("M" + r);
}
}
function clear_undo() {