manabrew_engine/ability/effects/
restart_game_effect.rs1use forge_foundation::ZoneType;
6
7use super::EffectContext;
8use crate::ids::CardId;
9use crate::spellability::SpellAbility;
10
11pub fn get_stack_description(sa: &SpellAbility) -> String {
13 sa.ir
14 .spell_description_text
15 .clone()
16 .unwrap_or_else(|| "Restart the game.".to_string())
17}
18
19#[manabrew_engine_macros::spell_effect(RestartGameEffect)]
23fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
24 let activator = sa.activating_player;
25
26 let player_ids: Vec<_> = ctx.game.players.iter().map(|p| p.id).collect();
28
29 let restart_zones = [
31 ZoneType::Battlefield,
32 ZoneType::Hand,
33 ZoneType::Graveyard,
34 ZoneType::Exile,
35 ];
36
37 let leave_zone = sa.ir.restrict_from_zone;
39
40 for &player_id in &player_ids {
41 ctx.game.player_reset_for_restart(player_id);
43
44 let cards_to_move: Vec<CardId> = ctx
46 .game
47 .cards
48 .iter()
49 .filter(|c| {
50 c.owner == player_id
51 && restart_zones.contains(&c.zone)
52 && (leave_zone != Some(c.zone))
53 })
54 .map(|c| c.id)
55 .collect();
56
57 for card_id in cards_to_move {
59 ctx.game.card_mut(card_id).set_tapped(false);
61 ctx.game.card_mut(card_id).set_face_down(false);
62 ctx.game.card_mut(card_id).clear_counters();
63 ctx.game.card_mut(card_id).set_power_modifier(0);
64 ctx.game.card_mut(card_id).set_toughness_modifier(0);
65 ctx.game.card_mut(card_id).set_controller(player_id);
66 ctx.game.card_mut(card_id).clear_intrinsic_keywords();
67 ctx.move_card(card_id, ZoneType::Library, player_id);
68 }
69
70 ctx.game
72 .shuffle_zone_cards(ZoneType::Library, player_id, ctx.rng);
73 }
74
75 ctx.game.is_night = false;
77 ctx.game.day_night_started = false;
78
79 let _ = activator;
81}