diff options
-rw-r--r-- | rules.js | 256 | ||||
-rw-r--r-- | rules.ts | 288 |
2 files changed, 300 insertions, 244 deletions
@@ -541,6 +541,18 @@ function player_can_resolve_icon(icon) { } return true; } +const track_icon_to_track_id_map = { + collectivization: data_1.COLLECTIVIZATION, + d_collectivization: data_1.COLLECTIVIZATION, + foreign_aid: data_1.FOREIGN_AID, + d_foreign_aid: data_1.FOREIGN_AID, + government: data_1.GOVERNMENT, + d_government: data_1.GOVERNMENT, + liberty: data_1.LIBERTY, + d_liberty: data_1.LIBERTY, + soviet_support: data_1.SOVIET_SUPPORT, + d_soviet_support: data_1.SOVIET_SUPPORT, +}; states.activate_icon = { inactive: 'activate an icon', prompt() { @@ -548,7 +560,42 @@ states.activate_icon = { view.prompt = 'Choose an icon to activate'; const c = cards[game.played_card]; for (const i of c.icons) { - gen_action(i); + const count = get_icon_count_in_tableau(i); + let direction = 0; + switch (i) { + case 'add_to_front': + const possible_fronts = get_fronts_to_add_to(data_1.ANY); + for (let f of possible_fronts) { + gen_action_front(f); + } + 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); + 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); + 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); + 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); + break; + case 'teamwork_on': + gen_action_bonus(data_1.TEAMWORK_BONUS); + break; + default: + gen_action(i); + } if (!player_can_resolve_icon(i)) { view.actions[i] = 0; } @@ -557,70 +604,52 @@ states.activate_icon = { spend_hp() { resolve_spend_hp(); }, - add_to_front() { - insert_after_active_node(create_state_node('add_to_front', get_active_faction(), { - t: data_1.ANY, - v: get_icon_count_in_tableau('add_to_front'), - })); - resolve_active_and_proceed(); - }, - collectivization() { - const count = get_icon_count_in_tableau('collectivization'); - if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.COLLECTIVIZATION, count); - } - else { - move_track(data_1.COLLECTIVIZATION, count); - } + front(f) { + update_front(f, get_icon_count_in_tableau('add_to_front'), get_active_faction()); resolve_active_and_proceed(); }, - d_collectivization() { - const count = -1 * get_icon_count_in_tableau('d_collectivization'); + tr0(x) { if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.COLLECTIVIZATION, count); + insert_use_organization_medallion_node(data_1.LIBERTY, x); } else { - move_track(data_1.COLLECTIVIZATION, count); + move_track_to(0, x); } resolve_active_and_proceed(); }, - d_foreign_aid() { - const count = -1 * get_icon_count_in_tableau('d_foreign_aid'); + tr1(x) { if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.FOREIGN_AID, count); + insert_use_organization_medallion_node(data_1.COLLECTIVIZATION, x); } else { - move_track(data_1.FOREIGN_AID, count); + move_track_to(1, x); } resolve_active_and_proceed(); }, - d_government() { - const count = -1 * get_icon_count_in_tableau('d_government'); + tr2(x) { if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.GOVERNMENT, count); + insert_use_organization_medallion_node(data_1.GOVERNMENT, x); } else { - move_track(data_1.GOVERNMENT, count); + move_track_to(2, x); } resolve_active_and_proceed(); }, - d_liberty() { - const count = -1 * get_icon_count_in_tableau('d_liberty'); + tr3(x) { if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.LIBERTY, count); + insert_use_organization_medallion_node(data_1.SOVIET_SUPPORT, x); } else { - move_track(data_1.LIBERTY, count); + move_track_to(3, x); } resolve_active_and_proceed(); }, - d_soviet_support() { - const count = -1 * get_icon_count_in_tableau('d_soviet_support'); + tr4(x) { if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.SOVIET_SUPPORT, count); + insert_use_organization_medallion_node(data_1.FOREIGN_AID, x); } else { - move_track(data_1.SOVIET_SUPPORT, count); + move_track_to(4, x); } resolve_active_and_proceed(); }, @@ -628,54 +657,8 @@ states.activate_icon = { draw_hand_cards(get_active_faction(), get_icon_count_in_tableau('draw_card')); resolve_active_and_proceed(); }, - foreign_aid() { - const count = get_icon_count_in_tableau('foreign_aid'); - if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.FOREIGN_AID, count); - } - else { - move_track(data_1.FOREIGN_AID, count); - } - resolve_active_and_proceed(); - }, - government() { - const direction = game.active === data_1.COMMUNIST ? -1 : 1; - const count = direction * get_icon_count_in_tableau('government'); - if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.GOVERNMENT, count); - } - else { - move_track(data_1.GOVERNMENT, count); - } - resolve_active_and_proceed(); - }, - government_to_center() { - const direction = game.tracks[data_1.GOVERNMENT] >= 6 ? -1 : 1; - move_track(data_1.GOVERNMENT, direction * get_icon_count_in_tableau('government_to_center')); - resolve_active_and_proceed(); - }, - liberty() { - const count = get_icon_count_in_tableau('liberty'); - if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.LIBERTY, count); - } - else { - move_track(data_1.LIBERTY, count); - } - resolve_active_and_proceed(); - }, - soviet_support() { - const count = get_icon_count_in_tableau('soviet_support'); - if (can_use_medallion(data_1.ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(data_1.SOVIET_SUPPORT, count); - } - else { - move_track(data_1.SOVIET_SUPPORT, count); - } - resolve_active_and_proceed(); - }, - teamwork_on() { - game.bonuses[data_1.TEAMWORK_BONUS] = data_1.ON; + bonus(b) { + update_bonus(b, data_1.ON); resolve_active_and_proceed(); }, }; @@ -857,8 +840,9 @@ states.choose_area_ap = { prompt() { gen_spend_hero_points(); view.prompt = 'Use Action Points.'; + const strength = get_active_node_args().strength; for (const track of tracks) { - gen_action_standee(track.id); + gen_move_track_change(track.id, strength); } const fronts = get_fronts_to_add_to(data_1.ANY); for (const front of fronts) { @@ -887,11 +871,24 @@ states.choose_area_ap = { update_front(f, s, get_active_faction()); resolve_active_and_proceed(); }, - standee(track_id) { - insert_after_active_node(create_state_node('move_track_up_or_down', get_active_faction(), { - track_id, - strength: get_active_node()?.a.strength, - })); + tr0(x) { + move_track_to(0, x); + resolve_active_and_proceed(); + }, + tr1(x) { + move_track_to(1, x); + resolve_active_and_proceed(); + }, + tr2(x) { + move_track_to(2, x); + resolve_active_and_proceed(); + }, + tr3(x) { + move_track_to(3, x); + resolve_active_and_proceed(); + }, + tr4(x) { + move_track_to(4, x); resolve_active_and_proceed(); }, }; @@ -1664,13 +1661,22 @@ states.return_card = { resolve_active_and_proceed(); }, }; +function gen_spend_hero_points_move_track(track_id, change) { + for (let i = 1; i <= change; ++i) { + gen_move_track_change(track_id, i); + } +} +function pay_hero_points_to_move_track(track_id, new_value) { + const cost_per_step = [3, 3, 4, 2, 2]; + const change = Math.abs(game.tracks[track_id] - new_value); + pay_hero_points(get_active_faction(), cost_per_step[track_id] * change); +} states.spend_hero_points = { inactive: 'spend Hero points', prompt() { const hero_points = game.hero_points[get_active_faction()]; view.prompt = `Spend up to ${hero_points} Hero Points.`; const faction = get_active_faction(); - gen_action('done'); if (hero_points === 0) { return; } @@ -1689,17 +1695,17 @@ states.spend_hero_points = { gen_action_bonus(bonus); } } - gen_action_standee(data_1.FOREIGN_AID); - gen_action_standee(data_1.SOVIET_SUPPORT); + gen_spend_hero_points_move_track(data_1.FOREIGN_AID, Math.floor(hero_points / 2)); + gen_spend_hero_points_move_track(data_1.SOVIET_SUPPORT, Math.floor(hero_points / 2)); if (hero_points < 3) { return; } - gen_action_standee(data_1.COLLECTIVIZATION); - gen_action_standee(data_1.LIBERTY); + gen_spend_hero_points_move_track(data_1.COLLECTIVIZATION, Math.floor(hero_points / 3)); + gen_spend_hero_points_move_track(data_1.LIBERTY, Math.floor(hero_points / 3)); if (hero_points < 4) { return; } - gen_action_standee(data_1.GOVERNMENT); + gen_spend_hero_points_move_track(data_1.GOVERNMENT, Math.floor(hero_points / 4)); }, add_to_front() { const faction = get_active_faction(); @@ -1710,9 +1716,6 @@ states.spend_hero_points = { })); resolve_active_and_proceed(); }, - done() { - resolve_active_and_proceed(); - }, bonus(b) { update_active_node_args({ turn_on_bonus: false, @@ -1738,23 +1741,29 @@ states.spend_hero_points = { insert_after_active_node(create_state_node('remove_blank_marker', faction)); resolve_active_and_proceed(); }, - standee(track_id) { - update_active_node_args({ - move_track: false, - }); - let amount = 2; - if (track_id === data_1.LIBERTY || track_id === data_1.COLLECTIVIZATION) { - amount = 3; - } - else if (track_id === data_1.GOVERNMENT) { - amount = 4; - } - const faction = get_active_faction(); - pay_hero_points(faction, amount); - insert_after_active_node(create_state_node('move_track_up_or_down', faction, { - track_id, - strength: 1, - })); + tr0(x) { + pay_hero_points_to_move_track(data_1.LIBERTY, x); + move_track_to(0, x); + resolve_active_and_proceed(); + }, + tr1(x) { + pay_hero_points_to_move_track(data_1.COLLECTIVIZATION, x); + move_track_to(1, x); + resolve_active_and_proceed(); + }, + tr2(x) { + pay_hero_points_to_move_track(data_1.GOVERNMENT, x); + move_track_to(2, x); + resolve_active_and_proceed(); + }, + tr3(x) { + pay_hero_points_to_move_track(data_1.SOVIET_SUPPORT, x); + move_track_to(3, x); + resolve_active_and_proceed(); + }, + tr4(x) { + pay_hero_points_to_move_track(data_1.FOREIGN_AID, x); + move_track_to(4, x); resolve_active_and_proceed(); }, }; @@ -1892,7 +1901,7 @@ states.use_organization_medallion = { pay_hero_points(faction, 1); game.used_medallions.push(data_1.ORGANIZATION_MEDALLION_ID); let { t, v } = get_active_node_args(); - if (v > 0) { + if (v > game.tracks[t]) { v++; } else { @@ -2343,13 +2352,20 @@ function get_government_track_direction(direction) { } } const track_action_name = ['tr0', 'tr1', 'tr2', 'tr3', 'tr4']; -function gen_move_track(track_id, change) { - const current_value = game.tracks[track_id]; - let new_value = current_value + change; +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)); gen_action(track_action_name[track_id], new_value); } +function gen_move_track_change(track_id, change) { + const current_value = game.tracks[track_id]; + if (can_move_track_up(track_id)) { + gen_move_track(track_id, current_value + change); + } + if (can_move_track_down(track_id)) { + gen_move_track(track_id, current_value - change); + } +} function move_track(track_id, change) { const current_value = game.tracks[track_id]; let new_value = current_value + change; @@ -753,6 +753,19 @@ function player_can_resolve_icon(icon: Icon): boolean { return true; } +const track_icon_to_track_id_map = { + collectivization: COLLECTIVIZATION, + d_collectivization: COLLECTIVIZATION, + foreign_aid: FOREIGN_AID, + d_foreign_aid: FOREIGN_AID, + government: GOVERNMENT, + d_government: GOVERNMENT, + liberty: LIBERTY, + d_liberty: LIBERTY, + soviet_support: SOVIET_SUPPORT, + d_soviet_support: SOVIET_SUPPORT, +}; + states.activate_icon = { inactive: 'activate an icon', prompt() { @@ -760,7 +773,55 @@ states.activate_icon = { view.prompt = 'Choose an icon to activate'; const c = cards[game.played_card] as PlayerCard; for (const i of c.icons) { - gen_action(i); + const count = get_icon_count_in_tableau(i); + let direction = 0; + switch (i) { + case 'add_to_front': + const possible_fronts = get_fronts_to_add_to(ANY); + for (let f of possible_fronts) { + gen_action_front(f); + } + 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 + ); + break; + case 'government': + direction = game.active === COMMUNIST ? -1 : 1; + gen_move_track( + track_icon_to_track_id_map[i], + game.tracks[track_icon_to_track_id_map[i]] + direction * count + ); + 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 + ); + break; + case 'government_to_center': + direction = game.tracks[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 + ); + break; + case 'teamwork_on': + gen_action_bonus(TEAMWORK_BONUS); + break; + default: + gen_action(i); + } + if (!player_can_resolve_icon(i)) { view.actions[i] = 0; } @@ -769,66 +830,51 @@ states.activate_icon = { spend_hp() { resolve_spend_hp(); }, - add_to_front() { - insert_after_active_node( - create_state_node('add_to_front', get_active_faction(), { - t: ANY, - v: get_icon_count_in_tableau('add_to_front'), - }) + front(f: FrontId) { + update_front( + f, + get_icon_count_in_tableau('add_to_front'), + get_active_faction() ); resolve_active_and_proceed(); }, - collectivization() { - const count = get_icon_count_in_tableau('collectivization'); - if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(COLLECTIVIZATION, count); - } else { - move_track(COLLECTIVIZATION, count); - } - resolve_active_and_proceed(); - }, - d_collectivization() { - const count = -1 * get_icon_count_in_tableau('d_collectivization'); + tr0(x: number) { if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(COLLECTIVIZATION, count); + insert_use_organization_medallion_node(LIBERTY, x); } else { - move_track(COLLECTIVIZATION, count); + move_track_to(0, x); } resolve_active_and_proceed(); }, - d_foreign_aid() { - const count = -1 * get_icon_count_in_tableau('d_foreign_aid'); + tr1(x: number) { if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(FOREIGN_AID, count); + insert_use_organization_medallion_node(COLLECTIVIZATION, x); } else { - move_track(FOREIGN_AID, count); + move_track_to(1, x); } resolve_active_and_proceed(); }, - d_government() { - const count = -1 * get_icon_count_in_tableau('d_government'); + tr2(x: number) { if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(GOVERNMENT, count); + insert_use_organization_medallion_node(GOVERNMENT, x); } else { - move_track(GOVERNMENT, count); + move_track_to(2, x); } resolve_active_and_proceed(); }, - d_liberty() { - const count = -1 * get_icon_count_in_tableau('d_liberty'); + tr3(x: number) { if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(LIBERTY, count); + insert_use_organization_medallion_node(SOVIET_SUPPORT, x); } else { - move_track(LIBERTY, count); + move_track_to(3, x); } resolve_active_and_proceed(); }, - d_soviet_support() { - const count = -1 * get_icon_count_in_tableau('d_soviet_support'); + tr4(x: number) { if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(SOVIET_SUPPORT, count); + insert_use_organization_medallion_node(FOREIGN_AID, x); } else { - move_track(SOVIET_SUPPORT, count); + move_track_to(4, x); } resolve_active_and_proceed(); }, @@ -839,53 +885,8 @@ states.activate_icon = { ); resolve_active_and_proceed(); }, - foreign_aid() { - const count = get_icon_count_in_tableau('foreign_aid'); - if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(FOREIGN_AID, count); - } else { - move_track(FOREIGN_AID, count); - } - resolve_active_and_proceed(); - }, - government() { - const direction = game.active === COMMUNIST ? -1 : 1; - const count = direction * get_icon_count_in_tableau('government'); - if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(GOVERNMENT, count); - } else { - move_track(GOVERNMENT, count); - } - resolve_active_and_proceed(); - }, - government_to_center() { - const direction = game.tracks[GOVERNMENT] >= 6 ? -1 : 1; - move_track( - GOVERNMENT, - direction * get_icon_count_in_tableau('government_to_center') - ); - resolve_active_and_proceed(); - }, - liberty() { - const count = get_icon_count_in_tableau('liberty'); - if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(LIBERTY, count); - } else { - move_track(LIBERTY, count); - } - resolve_active_and_proceed(); - }, - soviet_support() { - const count = get_icon_count_in_tableau('soviet_support'); - if (can_use_medallion(ORGANIZATION_MEDALLION_ID)) { - insert_use_organization_medallion_node(SOVIET_SUPPORT, count); - } else { - move_track(SOVIET_SUPPORT, count); - } - resolve_active_and_proceed(); - }, - teamwork_on() { - game.bonuses[TEAMWORK_BONUS] = ON; + bonus(b: number) { + update_bonus(b, ON); resolve_active_and_proceed(); }, }; @@ -1085,9 +1086,9 @@ states.choose_area_ap = { prompt() { gen_spend_hero_points(); view.prompt = 'Use Action Points.'; + const strength: number = get_active_node_args().strength; for (const track of tracks) { - // TODO: generate action for moving on the track directly - gen_action_standee(track.id); + gen_move_track_change(track.id, strength); } const fronts = get_fronts_to_add_to(ANY); for (const front of fronts) { @@ -1121,13 +1122,24 @@ states.choose_area_ap = { update_front(f, s, get_active_faction()); resolve_active_and_proceed(); }, - standee(track_id: number) { - insert_after_active_node( - create_state_node('move_track_up_or_down', get_active_faction(), { - track_id, - strength: get_active_node()?.a.strength, - }) - ); + tr0(x: number) { + move_track_to(0, x); + resolve_active_and_proceed(); + }, + tr1(x: number) { + move_track_to(1, x); + resolve_active_and_proceed(); + }, + tr2(x: number) { + move_track_to(2, x); + resolve_active_and_proceed(); + }, + tr3(x: number) { + move_track_to(3, x); + resolve_active_and_proceed(); + }, + tr4(x: number) { + move_track_to(4, x); resolve_active_and_proceed(); }, }; @@ -2051,6 +2063,18 @@ states.return_card = { }, }; +function gen_spend_hero_points_move_track(track_id: number, change: number) { + for (let i = 1; i <= change; ++i) { + gen_move_track_change(track_id, i); + } +} + +function pay_hero_points_to_move_track(track_id: number, new_value: number) { + const cost_per_step = [3, 3, 4, 2, 2]; + const change = Math.abs(game.tracks[track_id] - new_value); + pay_hero_points(get_active_faction(), cost_per_step[track_id] * change); +} + states.spend_hero_points = { inactive: 'spend Hero points', prompt() { @@ -2060,8 +2084,6 @@ states.spend_hero_points = { const faction = get_active_faction(); - gen_action('done'); - if (hero_points === 0) { return; } @@ -2084,21 +2106,27 @@ states.spend_hero_points = { } } - gen_action_standee(FOREIGN_AID); - gen_action_standee(SOVIET_SUPPORT); + gen_spend_hero_points_move_track(FOREIGN_AID, Math.floor(hero_points / 2)); + gen_spend_hero_points_move_track( + SOVIET_SUPPORT, + Math.floor(hero_points / 2) + ); if (hero_points < 3) { return; } - gen_action_standee(COLLECTIVIZATION); - gen_action_standee(LIBERTY); + gen_spend_hero_points_move_track( + COLLECTIVIZATION, + Math.floor(hero_points / 3) + ); + gen_spend_hero_points_move_track(LIBERTY, Math.floor(hero_points / 3)); if (hero_points < 4) { return; } - gen_action_standee(GOVERNMENT); + gen_spend_hero_points_move_track(GOVERNMENT, Math.floor(hero_points / 4)); }, add_to_front() { const faction = get_active_faction(); @@ -2111,9 +2139,6 @@ states.spend_hero_points = { ); resolve_active_and_proceed(); }, - done() { - resolve_active_and_proceed(); - }, bonus(b: number) { update_active_node_args({ turn_on_bonus: false, @@ -2138,24 +2163,29 @@ states.spend_hero_points = { insert_after_active_node(create_state_node('remove_blank_marker', faction)); resolve_active_and_proceed(); }, - standee(track_id: number) { - update_active_node_args({ - move_track: false, - }); - let amount = 2; - if (track_id === LIBERTY || track_id === COLLECTIVIZATION) { - amount = 3; - } else if (track_id === GOVERNMENT) { - amount = 4; - } - const faction = get_active_faction(); - pay_hero_points(faction, amount); - insert_after_active_node( - create_state_node('move_track_up_or_down', faction, { - track_id, - strength: 1, - }) - ); + tr0(x: number) { + pay_hero_points_to_move_track(LIBERTY, x); + move_track_to(0, x); + resolve_active_and_proceed(); + }, + tr1(x: number) { + pay_hero_points_to_move_track(COLLECTIVIZATION, x); + move_track_to(1, x); + resolve_active_and_proceed(); + }, + tr2(x: number) { + pay_hero_points_to_move_track(GOVERNMENT, x); + move_track_to(2, x); + resolve_active_and_proceed(); + }, + tr3(x: number) { + pay_hero_points_to_move_track(SOVIET_SUPPORT, x); + move_track_to(3, x); + resolve_active_and_proceed(); + }, + tr4(x: number) { + pay_hero_points_to_move_track(FOREIGN_AID, x); + move_track_to(4, x); resolve_active_and_proceed(); }, }; @@ -2327,7 +2357,7 @@ states.use_organization_medallion = { let { t, v } = get_active_node_args(); - if (v > 0) { + if (v > game.tracks[t]) { v++; } else { v--; @@ -2914,14 +2944,24 @@ function get_government_track_direction(direction: 10 | 11): -1 | 1 { const track_action_name = ['tr0', 'tr1', 'tr2', 'tr3', 'tr4']; -function gen_move_track(track_id: number, change: number) { - const current_value = game.tracks[track_id]; - let new_value = current_value + change; +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)); gen_action(track_action_name[track_id], new_value); } +function gen_move_track_change(track_id: number, change: number) { + const current_value = game.tracks[track_id]; + + if (can_move_track_up(track_id)) { + gen_move_track(track_id, current_value + change); + } + + if (can_move_track_down(track_id)) { + gen_move_track(track_id, current_value - change); + } +} + function move_track(track_id: number, change: number) { const current_value = game.tracks[track_id]; let new_value = current_value + change; |