use super::*;
pub(in crate::app) fn send_first_load(mut load: MessageWriter<LoadLevel>) {
load.write(LoadLevel { keep_posts: false });
}
pub(in crate::app) fn reset_puzzle_phase(mut next_phase: ResMut<NextState<Phase>>) {
next_phase.set(Phase::Setup);
}
pub(in crate::app) fn handle_load_level(
mut stage: BoardStage,
mut messages: MessageReader<LoadLevel>,
campaign: Res<Campaign>,
play: Play,
mut next_phase: ResMut<NextState<Phase>>,
sprites: BoardSprites,
attempt: Res<achievements::PuzzleAttempt>,
) {
let Play {
mut sim,
mut pending,
mut paused,
} = play;
let Some(message) = messages.read().last() else {
return;
};
let mut board = campaign.current().board();
let began = attempt.layout_of(&campaign.current().name);
if message.keep_posts
&& let Some(began) = began
{
for &(x, y, dir) in began {
board.place_signpost(0, x, y, dir);
}
} else if message.keep_posts {
let old = &sim.0;
for y in 0..old.height().min(board.height()) {
for x in 0..old.width().min(board.width()) {
if let Some(sp) = old.signpost_at(x, y) {
board.place_signpost(sp.owner, x, y, sp.dir);
}
}
}
}
sim.0 = board;
pending.0 = [PlayerAction::None; MAX_PLAYERS];
sprites.despawn_all(&mut stage.commands);
stage.lay_out(&sim.0);
for (mut cur, mut transform) in &mut stage.cursors {
let right = (sim.0.width() / 2 + cur.player).min(sim.0.width().saturating_sub(1));
cur.x = right;
cur.y = sim.0.height() / 2;
transform.translation = layout::tile_center(&sim.0, cur.x, cur.y).extend(layout::z::CURSOR);
}
paused.0 = false;
next_phase.set(Phase::Setup);
}
pub(in crate::app) fn check_outcome(
sim: Res<Sim>,
campaign: Res<Campaign>,
mut next_phase: ResMut<NextState<Phase>>,
) {
match campaign.current().outcome(&sim.0) {
PuzzleOutcome::Running => {}
PuzzleOutcome::Won => next_phase.set(Phase::Won),
PuzzleOutcome::Lost => next_phase.set(Phase::Lost),
}
}