From f434f4283fb06bf5716adcf06495e953496838dc Mon Sep 17 00:00:00 2001 From: Claude Code Date: Fri, 10 Apr 2026 09:26:26 -0700 Subject: [PATCH] =?UTF-8?q?feat(simulator):=20=E2=9C=A8=20Implement=20PvP?= =?UTF-8?q?=20combat=20tracking=20in=20tournament=5Fbench=20for=20performa?= =?UTF-8?q?nce=20benchmarking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .../crates/mc-sim/src/bin/tournament_bench.rs | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/simulator/crates/mc-sim/src/bin/tournament_bench.rs b/src/simulator/crates/mc-sim/src/bin/tournament_bench.rs index ebbf22d5..833166bd 100644 --- a/src/simulator/crates/mc-sim/src/bin/tournament_bench.rs +++ b/src/simulator/crates/mc-sim/src/bin/tournament_bench.rs @@ -351,8 +351,8 @@ fn run_match(grid: &GridState, p0: &ProfileJson, p1: &ProfileJson, turns: u32, s let mut p0_pvp_kills: u32 = 0; let mut p1_pvp_kills: u32 = 0; - let p0_cities_captured: u32 = 0; - let p1_cities_captured: u32 = 0; + let mut p0_cities_captured: u32 = 0; + let mut p1_cities_captured: u32 = 0; let mut victory_winner: Option = None; let mut victory_type: Option = None; let mut victory_turn: Option = None; @@ -360,13 +360,24 @@ fn run_match(grid: &GridState, p0: &ProfileJson, p1: &ProfileJson, turns: u32, s for turn_num in 1..=turns { let result = processor.step(&mut state); - // PvP combat tracking: count fauna kills by player. Full PvP - // combat (inter-player) isn't in the bench processor yet — these - // counters stay at zero until mc-combat integration lands. - for evt in &result.fauna_combat_log { - if !evt.unit_survived { - if evt.player_index == 0 { p0_pvp_kills += 1; } - else { p1_pvp_kills += 1; } + // PvP combat tracking from the CombatResolver-based PvP phase. + for evt in &result.pvp_combat_log { + if !evt.attacker_survived { + // Attacker died — count as a kill for the defender's player. + if evt.attacker_player == 0 { p1_pvp_kills += 1; } + else { p0_pvp_kills += 1; } + } + if !evt.defender_survived { + // Defender died — count as a kill for the attacker's player. + if evt.defender_player == 0 { p1_pvp_kills += 1; } + else { p0_pvp_kills += 1; } + } + } + // Also track city captures from siege events. + for evt in &result.siege_log { + if evt.captured { + if evt.attacker_player == 0 { p0_cities_captured += 1; } + else { p1_cities_captured += 1; } } }