2025-06-23 09:48:28 +01:00
|
|
|
use core::{fmt::Debug, num::NonZeroU8};
|
|
|
|
|
|
|
|
|
|
use serde::{Deserialize, Serialize};
|
2025-09-28 02:13:34 +01:00
|
|
|
use werewolves_macros::Extract;
|
2025-06-23 09:48:28 +01:00
|
|
|
|
|
|
|
|
use crate::{game::DateTime, player::CharacterId};
|
|
|
|
|
|
2025-09-28 02:13:34 +01:00
|
|
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Extract)]
|
2025-06-23 09:48:28 +01:00
|
|
|
pub enum DiedTo {
|
|
|
|
|
Execution {
|
|
|
|
|
day: NonZeroU8,
|
|
|
|
|
},
|
2025-09-28 02:13:34 +01:00
|
|
|
#[extract(source as killer)]
|
2025-06-23 09:48:28 +01:00
|
|
|
MapleWolf {
|
|
|
|
|
source: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
starves_if_fails: bool,
|
|
|
|
|
},
|
|
|
|
|
MapleWolfStarved {
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
2025-09-28 02:13:34 +01:00
|
|
|
#[extract(killer as killer)]
|
2025-06-23 09:48:28 +01:00
|
|
|
Militia {
|
|
|
|
|
killer: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
2025-09-28 02:13:34 +01:00
|
|
|
#[extract(killing_wolf as killer)]
|
2025-06-23 09:48:28 +01:00
|
|
|
Wolfpack {
|
2025-09-28 02:13:34 +01:00
|
|
|
killing_wolf: CharacterId,
|
2025-06-23 09:48:28 +01:00
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
2025-09-28 02:13:34 +01:00
|
|
|
#[extract(killer as killer)]
|
2025-06-23 09:48:28 +01:00
|
|
|
AlphaWolf {
|
|
|
|
|
killer: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
|
|
|
|
Shapeshift {
|
|
|
|
|
into: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
2025-09-28 02:13:34 +01:00
|
|
|
#[extract(killer as killer)]
|
2025-06-23 09:48:28 +01:00
|
|
|
Hunter {
|
|
|
|
|
killer: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
2025-09-28 02:13:34 +01:00
|
|
|
#[extract(source as killer)]
|
|
|
|
|
GuardianProtecting {
|
|
|
|
|
source: CharacterId,
|
|
|
|
|
protecting: CharacterId,
|
|
|
|
|
protecting_from: CharacterId,
|
|
|
|
|
protecting_from_cause: Box<DiedTo>,
|
2025-06-23 09:48:28 +01:00
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl DiedTo {
|
|
|
|
|
pub const fn date_time(&self) -> DateTime {
|
|
|
|
|
match self {
|
|
|
|
|
DiedTo::Execution { day } => DateTime::Day { number: *day },
|
|
|
|
|
|
2025-09-28 02:13:34 +01:00
|
|
|
DiedTo::GuardianProtecting {
|
|
|
|
|
source: _,
|
|
|
|
|
protecting: _,
|
|
|
|
|
protecting_from: _,
|
|
|
|
|
protecting_from_cause: _,
|
|
|
|
|
night,
|
|
|
|
|
}
|
2025-06-23 09:48:28 +01:00
|
|
|
| DiedTo::MapleWolf {
|
|
|
|
|
source: _,
|
|
|
|
|
night,
|
|
|
|
|
starves_if_fails: _,
|
|
|
|
|
}
|
|
|
|
|
| DiedTo::MapleWolfStarved { night }
|
|
|
|
|
| DiedTo::Militia { killer: _, night }
|
2025-09-28 02:13:34 +01:00
|
|
|
| DiedTo::Wolfpack {
|
|
|
|
|
night,
|
|
|
|
|
killing_wolf: _,
|
|
|
|
|
}
|
2025-06-23 09:48:28 +01:00
|
|
|
| DiedTo::AlphaWolf { killer: _, night }
|
|
|
|
|
| DiedTo::Shapeshift { into: _, night }
|
|
|
|
|
| DiedTo::Hunter { killer: _, night } => DateTime::Night {
|
|
|
|
|
number: night.get(),
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|