Execute real packed event player deactivation
This commit is contained in:
parent
e44e0d5ac5
commit
991725dba8
10 changed files with 670 additions and 47 deletions
|
|
@ -342,6 +342,25 @@ fn apply_runtime_effects(
|
|||
mutated_player_ids.insert(player_id);
|
||||
}
|
||||
}
|
||||
RuntimeEffect::DeactivatePlayer { target } => {
|
||||
let player_ids = resolve_player_target_ids(state, target, condition_context)?;
|
||||
for player_id in player_ids {
|
||||
let player = state
|
||||
.players
|
||||
.iter_mut()
|
||||
.find(|player| player.player_id == player_id)
|
||||
.ok_or_else(|| {
|
||||
format!(
|
||||
"missing player_id {player_id} while applying deactivate effect"
|
||||
)
|
||||
})?;
|
||||
player.active = false;
|
||||
mutated_player_ids.insert(player_id);
|
||||
if state.selected_player_id == Some(player_id) {
|
||||
state.selected_player_id = None;
|
||||
}
|
||||
}
|
||||
}
|
||||
RuntimeEffect::SetCompanyTerritoryAccess {
|
||||
target,
|
||||
territory,
|
||||
|
|
@ -1092,9 +1111,9 @@ mod tests {
|
|||
use super::*;
|
||||
use crate::{
|
||||
CalendarPoint, RuntimeCompany, RuntimeCompanyControllerKind, RuntimeCompanyTarget,
|
||||
RuntimeEffect, RuntimeEventRecord, RuntimeEventRecordTemplate, RuntimeSaveProfileState,
|
||||
RuntimeServiceState, RuntimeTerritory, RuntimeTerritoryTarget, RuntimeTrackPieceCounts,
|
||||
RuntimeTrain, RuntimeWorldRestoreState,
|
||||
RuntimeEffect, RuntimeEventRecord, RuntimeEventRecordTemplate, RuntimePlayer,
|
||||
RuntimeSaveProfileState, RuntimeServiceState, RuntimeTerritory, RuntimeTerritoryTarget,
|
||||
RuntimeTrackPieceCounts, RuntimeTrain, RuntimeWorldRestoreState,
|
||||
};
|
||||
|
||||
fn state() -> RuntimeState {
|
||||
|
|
@ -1631,6 +1650,43 @@ mod tests {
|
|||
assert_eq!(result.service_events[0].mutated_company_ids, vec![1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deactivating_selected_player_clears_selection() {
|
||||
let mut state = RuntimeState {
|
||||
players: vec![RuntimePlayer {
|
||||
player_id: 1,
|
||||
current_cash: 500,
|
||||
active: true,
|
||||
controller_kind: RuntimeCompanyControllerKind::Human,
|
||||
}],
|
||||
selected_player_id: Some(1),
|
||||
event_runtime_records: vec![RuntimeEventRecord {
|
||||
record_id: 19,
|
||||
trigger_kind: 7,
|
||||
active: true,
|
||||
service_count: 0,
|
||||
marks_collection_dirty: false,
|
||||
one_shot: false,
|
||||
has_fired: false,
|
||||
conditions: Vec::new(),
|
||||
effects: vec![RuntimeEffect::DeactivatePlayer {
|
||||
target: crate::RuntimePlayerTarget::SelectedPlayer,
|
||||
}],
|
||||
}],
|
||||
..state()
|
||||
};
|
||||
|
||||
let result = execute_step_command(
|
||||
&mut state,
|
||||
&StepCommand::ServiceTriggerKind { trigger_kind: 7 },
|
||||
)
|
||||
.expect("deactivate player effect should succeed");
|
||||
|
||||
assert!(!state.players[0].active);
|
||||
assert_eq!(state.selected_player_id, None);
|
||||
assert_eq!(result.service_events[0].mutated_player_ids, vec![1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sets_track_laying_capacity_for_resolved_targets() {
|
||||
let mut state = RuntimeState {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue