summaryrefslogtreecommitdiff
path: root/rules.js
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2025-04-01 23:32:52 +0200
committerTor Andersson <tor@ccxvii.net>2025-04-01 23:52:15 +0200
commit957687eee3e06581a32a42f0fe4435e9bf838b36 (patch)
treee0a70675beac7b00d0d47c128570f8d0bd8d391c /rules.js
parent6cabceb4930650751189f7e9a6559fa30799fdce (diff)
downloadmaria-957687eee3e06581a32a42f0fe4435e9bf838b36.tar.gz
Improve Austria+PA combat phase.
Compute all combats at start. Resolve Austrian attacks first. Fixes glitch where general retreats from Austrian general next to PA general and is attacked twice!
Diffstat (limited to 'rules.js')
-rw-r--r--rules.js38
1 files changed, 26 insertions, 12 deletions
diff --git a/rules.js b/rules.js
index feed732..dc03703 100644
--- a/rules.js
+++ b/rules.js
@@ -1479,8 +1479,8 @@ const advanced_sequence_of_play = [
{ power: P_PRAGMATIC, action: goto_movement },
{ power: P_PRAGMATIC, action: validate_end_movement },
+ // austria + pragmatic shared combat phase
{ power: P_AUSTRIA, action: goto_combat },
- { power: P_PRAGMATIC, action: goto_combat },
{ power: P_AUSTRIA, action: end_action_stage },
{ power: P_FRANCE, action: goto_end_turn },
@@ -3806,7 +3806,7 @@ function goto_combat() {
let from = []
let to = []
- for (let p of all_controlled_generals(game.power)) {
+ for (let p of all_coop_generals(game.power)) {
if (piece_power[p] === P_PRUSSIA && is_prussia_neutral())
continue
if (piece_power[p] === P_SAXONY && is_saxony_neutral())
@@ -3834,14 +3834,26 @@ function goto_combat() {
}
}
- if (game.combat.length > 0)
- game.state = "combat"
- else
- goto_retroactive_conquest()
+ next_combat()
}
-function next_combat() {
+function set_active_to_next_combat_power() {
set_active_to_current_sequence_of_play()
+ if (is_intro() || is_two_player())
+ return
+ // resolve all austria combat first
+ if (game.power === P_AUSTRIA) {
+ for (let i = 0; i < game.combat.length; i += 2) {
+ let p = get_supreme_commander(game.combat[i])
+ if (p >= 0 && piece_power[p] === P_AUSTRIA)
+ return
+ }
+ set_active_to_power(P_PRAGMATIC)
+ }
+}
+
+function next_combat() {
+ set_active_to_next_combat_power()
game.count = 0
delete game.attacker
delete game.defender
@@ -3855,8 +3867,11 @@ states.combat = {
inactive: "attack",
prompt() {
prompt("Resolve your attacks.")
- for (let i = 0; i < game.combat.length; i += 2)
- gen_action_supreme_commander(game.combat[i])
+ for (let i = 0; i < game.combat.length; i += 2) {
+ let p = get_supreme_commander(game.combat[i])
+ if (p >= 0 && is_controlled_power(game.power, piece_power[p]))
+ gen_action_piece(p)
+ }
},
piece(p) {
push_undo()
@@ -4502,9 +4517,8 @@ function goto_retroactive_conquest() {
apply_retroactive_conquest(conq, game.power)
}
} else {
- if (game.power === P_AUSTRIA) {
- // wait until pragmatic has also finished combat
- } else if (game.power === P_PRAGMATIC) {
+ if (game.power === P_AUSTRIA || game.power === P_PRAGMATIC) {
+ // shared combat phase
apply_retroactive_conquest(conq, P_AUSTRIA)
apply_retroactive_conquest(conq, P_PRAGMATIC)
} else {