feat(engine,core): add elapsed-time tick system and Zen GameMode
Phase 6 part 4 (partial): - GameState now tracks elapsed_seconds via tick_elapsed_time in GamePlugin (per-second increment while not won). Pure helper advance_elapsed makes the tick logic directly testable without mocking Bevy Time. - New GameMode enum (Classic / Zen) on GameState. Zen mode suppresses scoring in move_cards and undo. GameState::new_with_mode allows callers to construct non-Classic games; the existing GameState::new still defaults to Classic. mode is serde(default) for backwards-compatible persistence. - NewGameRequestEvent gains an optional mode field; handle_new_game honours it (falling back to the current game's mode when None). - InputPlugin: pressing Z starts a fresh Zen-mode game. Time Attack, Challenge mode, level-5 unlock gating, and unlock UI are still deferred. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -103,7 +103,8 @@ fn handle_new_game(
|
||||
for ev in new_game.read() {
|
||||
let seed = ev.seed.unwrap_or_else(seed_from_system_time);
|
||||
let draw_mode = game.0.draw_mode.clone();
|
||||
game.0 = GameState::new(seed, draw_mode);
|
||||
let mode = ev.mode.unwrap_or(game.0.mode);
|
||||
game.0 = GameState::new_with_mode(seed, draw_mode, mode);
|
||||
changed.send(StateChangedEvent);
|
||||
}
|
||||
}
|
||||
@@ -253,7 +254,7 @@ mod tests {
|
||||
.map(|c| c.id)
|
||||
.collect();
|
||||
|
||||
app.world_mut().send_event(NewGameRequestEvent { seed: Some(999) });
|
||||
app.world_mut().send_event(NewGameRequestEvent { seed: Some(999), mode: None });
|
||||
app.update();
|
||||
|
||||
let after: Vec<u32> = app
|
||||
@@ -292,11 +293,16 @@ mod tests {
|
||||
fn advance_elapsed_handles_subsecond_deltas_without_skipping() {
|
||||
let mut elapsed = 0;
|
||||
let mut acc = 0.0;
|
||||
// 16ms × 60 frames/sec ≈ 1 second; should produce 1 tick.
|
||||
for _ in 0..60 {
|
||||
advance_elapsed(&mut elapsed, &mut acc, 1.0 / 60.0, false);
|
||||
// 4 × 0.25 = 1.0 (exactly representable in f32) — must produce 1 tick.
|
||||
for _ in 0..4 {
|
||||
advance_elapsed(&mut elapsed, &mut acc, 0.25, false);
|
||||
}
|
||||
assert!(elapsed == 1, "expected 1 second, got {elapsed}");
|
||||
assert_eq!(elapsed, 1);
|
||||
// Repeat once more for a total of 2 seconds.
|
||||
for _ in 0..4 {
|
||||
advance_elapsed(&mut elapsed, &mut acc, 0.25, false);
|
||||
}
|
||||
assert_eq!(elapsed, 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user