summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans Bongers <fransbongers@franss-mbp.home>2025-03-11 20:51:35 +0100
committerFrans Bongers <fransbongers@franss-mbp.home>2025-03-11 20:51:35 +0100
commit434fe6173d01601b6823de5bfcb0ebdc232e6938 (patch)
treea4478728cb9ee15ffe8e4e38e6b93f349af53c95
parentd167c9891968b02627fc240b0b75ae9fd9b770af (diff)
downloadland-and-freedom-434fe6173d01601b6823de5bfcb0ebdc232e6938.tar.gz
auto resolve fascist test hero_points & draw card and allow morale bonus skip if no valid options
-rw-r--r--rules.js57
-rw-r--r--rules.ts57
2 files changed, 101 insertions, 13 deletions
diff --git a/rules.js b/rules.js
index da68d1e..3d2e446 100644
--- a/rules.js
+++ b/rules.js
@@ -566,6 +566,7 @@ states.activate_icon = {
view.prompt = 'Morale Bonus: ';
view.prompt += join_oxford_comma(c.icons.map(get_icon_name), "or");
view.prompt += '.';
+ let can_activate_icon = false;
for (const i of c.icons) {
const count = get_icon_count_in_tableau(i);
let direction = 0;
@@ -575,30 +576,43 @@ states.activate_icon = {
for (let f of possible_fronts) {
gen_action_front(f);
}
+ if (possible_fronts.length > 0) {
+ can_activate_icon = true;
+ }
break;
case 'collectivization':
case 'foreign_aid':
case 'liberty':
case 'soviet_support':
- gen_move_track(track_icon_to_track_id_map[i], game.tracks[track_icon_to_track_id_map[i]] + count);
+ const can_move_ss = gen_move_track(track_icon_to_track_id_map[i], game.tracks[track_icon_to_track_id_map[i]] + count);
+ can_activate_icon = can_activate_icon || can_move_ss;
break;
case 'government':
direction = game.active === data_1.COMMUNIST ? -1 : 1;
- gen_move_track(track_icon_to_track_id_map[i], game.tracks[track_icon_to_track_id_map[i]] + direction * count);
+ const can_move_g = gen_move_track(track_icon_to_track_id_map[i], game.tracks[track_icon_to_track_id_map[i]] + direction * count);
+ can_activate_icon = can_activate_icon || can_move_g;
break;
case 'd_collectivization':
case 'd_foreign_aid':
case 'd_government':
case 'd_liberty':
case 'd_soviet_support':
- gen_move_track(track_icon_to_track_id_map[i], game.tracks[track_icon_to_track_id_map[i]] - count);
+ const can_move_t = gen_move_track(track_icon_to_track_id_map[i], game.tracks[track_icon_to_track_id_map[i]] - count);
+ can_activate_icon = can_activate_icon || can_move_t;
break;
case 'government_to_center':
direction = game.tracks[data_1.GOVERNMENT] >= 6 ? -1 : 1;
- gen_move_track(track_icon_to_track_id_map[i], game.tracks[track_icon_to_track_id_map[i]] + direction * count);
+ const can_move_gtoc = gen_move_track(track_icon_to_track_id_map[i], game.tracks[track_icon_to_track_id_map[i]] + direction * count);
+ can_activate_icon = can_activate_icon || can_move_gtoc;
break;
case 'teamwork_on':
- gen_action_bonus(data_1.TEAMWORK_BONUS);
+ if (game.bonuses[data_1.TEAMWORK_BONUS] === data_1.OFF) {
+ gen_action_bonus(data_1.TEAMWORK_BONUS);
+ can_activate_icon = true;
+ }
+ else {
+ can_activate_icon = false;
+ }
break;
default:
gen_action(i);
@@ -606,6 +620,9 @@ states.activate_icon = {
if (!player_can_resolve_icon(i)) {
view.actions[i] = 0;
}
+ if (!can_activate_icon) {
+ gen_action('skip');
+ }
}
},
spend_hp() {
@@ -668,6 +685,9 @@ states.activate_icon = {
update_bonus(b, data_1.ON);
resolve_active_and_proceed();
},
+ skip() {
+ resolve_active_and_proceed();
+ },
};
states.add_card_to_tableau = {
inactive: 'add a card to their tableau',
@@ -1105,6 +1125,14 @@ states.confirm_fascist_turn = {
};
states.draw_card = {
inactive: 'draw a card',
+ auto_resolve() {
+ const { src, v } = get_active_node_args();
+ if (src !== 'fascist_test') {
+ return false;
+ }
+ draw_hand_cards(get_active_faction(), v);
+ return true;
+ },
prompt() {
gen_spend_hero_points();
const { v } = get_active_node_args();
@@ -1194,6 +1222,19 @@ states.end_of_year_discard = {
};
states.hero_points = {
inactive: 'gain Hero Points',
+ auto_resolve() {
+ const { src, v } = get_active_node_args();
+ if (src !== 'fascist_test') {
+ return false;
+ }
+ if (v < 0) {
+ lose_hero_points(get_active_faction(), v);
+ }
+ else {
+ gain_hero_points(get_active_faction(), v);
+ }
+ return true;
+ },
prompt() {
gen_spend_hero_points();
const value = get_active_node_args().v;
@@ -2257,7 +2298,7 @@ function resolve_fascist_test() {
hero_points_gain += 2;
}
if (hero_points_gain > 0) {
- const node = resolve_effect((0, data_1.create_effect)('hero_points', faction, hero_points_gain));
+ const node = resolve_effect((0, data_1.create_effect)('hero_points', faction, hero_points_gain), 'fascist_test');
hero_point_actions.push(node);
}
}
@@ -2362,7 +2403,11 @@ const track_action_name = ['tr0', 'tr1', 'tr2', 'tr3', 'tr4'];
function gen_move_track(track_id, new_value) {
new_value = Math.max(new_value, get_min_value_for_track(track_id));
new_value = Math.min(new_value, get_max_value_for_track(track_id));
+ if (new_value === game.tracks[track_id]) {
+ return false;
+ }
gen_action(track_action_name[track_id], new_value);
+ return true;
}
function gen_move_track_change(track_id, change) {
const current_value = game.tracks[track_id];
diff --git a/rules.ts b/rules.ts
index 7cf04d5..c84bbf7 100644
--- a/rules.ts
+++ b/rules.ts
@@ -777,7 +777,7 @@ states.activate_icon = {
view.prompt = 'Morale Bonus: ';
view.prompt += join_oxford_comma(c.icons.map(get_icon_name), "or");
view.prompt += '.';
-
+ let can_activate_icon = false;
for (const i of c.icons) {
const count = get_icon_count_in_tableau(i);
let direction = 0;
@@ -787,42 +787,54 @@ states.activate_icon = {
for (let f of possible_fronts) {
gen_action_front(f);
}
+ if (possible_fronts.length > 0) {
+ can_activate_icon = true;
+ }
break;
case 'collectivization':
case 'foreign_aid':
case 'liberty':
case 'soviet_support':
- gen_move_track(
+ const can_move_ss = gen_move_track(
track_icon_to_track_id_map[i],
game.tracks[track_icon_to_track_id_map[i]] + count
);
+ can_activate_icon = can_activate_icon || can_move_ss;
break;
case 'government':
direction = game.active === COMMUNIST ? -1 : 1;
- gen_move_track(
+ const can_move_g = gen_move_track(
track_icon_to_track_id_map[i],
game.tracks[track_icon_to_track_id_map[i]] + direction * count
);
+ can_activate_icon = can_activate_icon || can_move_g;
break;
case 'd_collectivization':
case 'd_foreign_aid':
case 'd_government':
case 'd_liberty':
case 'd_soviet_support':
- gen_move_track(
+ const can_move_t = gen_move_track(
track_icon_to_track_id_map[i],
game.tracks[track_icon_to_track_id_map[i]] - count
);
+ can_activate_icon = can_activate_icon || can_move_t;
break;
case 'government_to_center':
direction = game.tracks[GOVERNMENT] >= 6 ? -1 : 1;
- gen_move_track(
+ const can_move_gtoc = gen_move_track(
track_icon_to_track_id_map[i],
game.tracks[track_icon_to_track_id_map[i]] + direction * count
);
+ can_activate_icon = can_activate_icon || can_move_gtoc;
break;
case 'teamwork_on':
- gen_action_bonus(TEAMWORK_BONUS);
+ if (game.bonuses[TEAMWORK_BONUS] === OFF) {
+ gen_action_bonus(TEAMWORK_BONUS);
+ can_activate_icon = true;
+ } else {
+ can_activate_icon = false;
+ }
break;
default:
gen_action(i);
@@ -831,6 +843,9 @@ states.activate_icon = {
if (!player_can_resolve_icon(i)) {
view.actions[i] = 0;
}
+ if (!can_activate_icon) {
+ gen_action('skip');
+ }
}
},
spend_hp() {
@@ -895,6 +910,9 @@ states.activate_icon = {
update_bonus(b, ON);
resolve_active_and_proceed();
},
+ skip() {
+ resolve_active_and_proceed();
+ },
};
states.add_card_to_tableau = {
@@ -1397,6 +1415,14 @@ states.confirm_fascist_turn = {
states.draw_card = {
inactive: 'draw a card',
+ auto_resolve() {
+ const { src, v } = get_active_node_args();
+ if (src !== 'fascist_test') {
+ return false;
+ }
+ draw_hand_cards(get_active_faction(), v);
+ return true;
+ },
prompt() {
gen_spend_hero_points();
const { v } = get_active_node_args();
@@ -1502,6 +1528,18 @@ states.end_of_year_discard = {
states.hero_points = {
inactive: 'gain Hero Points',
+ auto_resolve() {
+ const { src, v } = get_active_node_args();
+ if (src !== 'fascist_test') {
+ return false;
+ }
+ if (v < 0) {
+ lose_hero_points(get_active_faction(), v);
+ } else {
+ gain_hero_points(get_active_faction(), v);
+ }
+ return true;
+ },
prompt() {
gen_spend_hero_points();
const value = get_active_node_args().v;
@@ -2833,7 +2871,8 @@ function resolve_fascist_test() {
}
if (hero_points_gain > 0) {
const node = resolve_effect(
- create_effect('hero_points', faction, hero_points_gain)
+ create_effect('hero_points', faction, hero_points_gain),
+ 'fascist_test'
);
hero_point_actions.push(node);
}
@@ -2954,7 +2993,11 @@ const track_action_name = ['tr0', 'tr1', 'tr2', 'tr3', 'tr4'];
function gen_move_track(track_id: number, new_value: number) {
new_value = Math.max(new_value, get_min_value_for_track(track_id));
new_value = Math.min(new_value, get_max_value_for_track(track_id));
+ if (new_value === game.tracks[track_id]) {
+ return false;
+ }
gen_action(track_action_name[track_id], new_value);
+ return true;
}
function gen_move_track_change(track_id: number, change: number) {