2025-06-23 09:48:28 +01:00
|
|
|
use core::{fmt::Debug, num::NonZeroU8};
|
|
|
|
|
|
|
|
|
|
use serde::{Deserialize, Serialize};
|
2025-10-06 20:45:15 +01:00
|
|
|
use werewolves_macros::Titles;
|
2025-06-23 09:48:28 +01:00
|
|
|
|
2025-10-06 20:45:15 +01:00
|
|
|
use crate::{character::CharacterId, game::DateTime};
|
2025-06-23 09:48:28 +01:00
|
|
|
|
2025-10-06 20:45:15 +01:00
|
|
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Titles)]
|
2025-06-23 09:48:28 +01:00
|
|
|
pub enum DiedTo {
|
|
|
|
|
Execution {
|
|
|
|
|
day: NonZeroU8,
|
|
|
|
|
},
|
|
|
|
|
MapleWolf {
|
|
|
|
|
source: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
starves_if_fails: bool,
|
|
|
|
|
},
|
|
|
|
|
MapleWolfStarved {
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
|
|
|
|
Militia {
|
|
|
|
|
killer: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
|
|
|
|
Wolfpack {
|
2025-09-28 02:13:34 +01:00
|
|
|
killing_wolf: CharacterId,
|
2025-06-23 09:48:28 +01:00
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
|
|
|
|
AlphaWolf {
|
|
|
|
|
killer: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
|
|
|
|
Shapeshift {
|
|
|
|
|
into: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
|
|
|
|
Hunter {
|
|
|
|
|
killer: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
2025-09-28 02:13:34 +01:00
|
|
|
GuardianProtecting {
|
|
|
|
|
source: CharacterId,
|
|
|
|
|
protecting: CharacterId,
|
|
|
|
|
protecting_from: CharacterId,
|
|
|
|
|
protecting_from_cause: Box<DiedTo>,
|
2025-06-23 09:48:28 +01:00
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
2025-10-06 20:45:15 +01:00
|
|
|
PyreMaster {
|
|
|
|
|
killer: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
2025-10-06 22:30:01 +01:00
|
|
|
PyreMasterLynchMob {
|
|
|
|
|
source: CharacterId,
|
|
|
|
|
night: NonZeroU8,
|
|
|
|
|
},
|
2025-10-06 20:45:15 +01:00
|
|
|
MasonLeaderRecruitFail {
|
|
|
|
|
tried_recruiting: CharacterId,
|
|
|
|
|
night: u8,
|
|
|
|
|
},
|
2025-06-23 09:48:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl DiedTo {
|
2025-10-06 21:59:44 +01:00
|
|
|
pub fn next_night(&self) -> Option<DiedTo> {
|
|
|
|
|
let mut next = self.clone();
|
|
|
|
|
match &mut next {
|
|
|
|
|
DiedTo::Execution { .. } => return None,
|
|
|
|
|
DiedTo::MapleWolf { night, .. }
|
|
|
|
|
| DiedTo::MapleWolfStarved { night }
|
|
|
|
|
| DiedTo::Militia { night, .. }
|
|
|
|
|
| DiedTo::Wolfpack { night, .. }
|
|
|
|
|
| DiedTo::AlphaWolf { night, .. }
|
|
|
|
|
| DiedTo::Shapeshift { night, .. }
|
|
|
|
|
| DiedTo::Hunter { night, .. }
|
|
|
|
|
| DiedTo::GuardianProtecting { night, .. }
|
2025-10-06 22:30:01 +01:00
|
|
|
| DiedTo::PyreMasterLynchMob { night, .. }
|
2025-10-06 21:59:44 +01:00
|
|
|
| DiedTo::PyreMaster { night, .. } => *night = NonZeroU8::new(night.get() + 1)?,
|
|
|
|
|
DiedTo::MasonLeaderRecruitFail { night, .. } => *night = *night + 1,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Some(next)
|
|
|
|
|
}
|
2025-10-06 20:45:15 +01:00
|
|
|
pub const fn killer(&self) -> Option<CharacterId> {
|
|
|
|
|
match self {
|
|
|
|
|
DiedTo::Execution { .. }
|
|
|
|
|
| DiedTo::MapleWolfStarved { .. }
|
|
|
|
|
| DiedTo::Shapeshift { .. } => None,
|
|
|
|
|
DiedTo::MapleWolf { source: killer, .. }
|
|
|
|
|
| DiedTo::Militia { killer, .. }
|
|
|
|
|
| DiedTo::Wolfpack {
|
|
|
|
|
killing_wolf: killer,
|
|
|
|
|
..
|
|
|
|
|
}
|
|
|
|
|
| DiedTo::AlphaWolf { killer, .. }
|
|
|
|
|
| DiedTo::Hunter { killer, .. }
|
|
|
|
|
| DiedTo::GuardianProtecting {
|
|
|
|
|
protecting_from: killer,
|
|
|
|
|
..
|
|
|
|
|
}
|
|
|
|
|
| DiedTo::MasonLeaderRecruitFail {
|
|
|
|
|
tried_recruiting: killer,
|
|
|
|
|
..
|
|
|
|
|
}
|
2025-10-06 22:30:01 +01:00
|
|
|
| DiedTo::PyreMasterLynchMob { source: killer, .. }
|
2025-10-06 20:45:15 +01:00
|
|
|
| DiedTo::PyreMaster { killer, .. } => Some(*killer),
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-23 09:48:28 +01:00
|
|
|
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 }
|
2025-10-06 22:30:01 +01:00
|
|
|
| DiedTo::PyreMasterLynchMob { night, .. }
|
2025-10-06 20:45:15 +01:00
|
|
|
| DiedTo::PyreMaster { night, .. }
|
2025-06-23 09:48:28 +01:00
|
|
|
| DiedTo::Hunter { killer: _, night } => DateTime::Night {
|
|
|
|
|
number: night.get(),
|
|
|
|
|
},
|
2025-10-06 20:45:15 +01:00
|
|
|
DiedTo::MasonLeaderRecruitFail { night, .. } => DateTime::Night { number: *night },
|
2025-06-23 09:48:28 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|