diff --git a/werewolves-proto/src/bag.rs b/werewolves-proto/src/bag.rs
index 4715455..87c9c5e 100644
--- a/werewolves-proto/src/bag.rs
+++ b/werewolves-proto/src/bag.rs
@@ -14,11 +14,7 @@
// along with this program. If not, see .
use rand::{SeedableRng, rngs::SmallRng, seq::SliceRandom};
-// #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
-// pub enum BagItem {
-// Left(T),
-// Right(V),
-// }
+
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Bag(Vec);
diff --git a/werewolves-proto/src/character.rs b/werewolves-proto/src/character.rs
index c67e8d7..0cce86d 100644
--- a/werewolves-proto/src/character.rs
+++ b/werewolves-proto/src/character.rs
@@ -248,9 +248,9 @@ impl Character {
)
}
- fn mason_prompts(&self, village: &Village) -> Result> {
+ fn mason_prompts(&self, village: &Village) -> Result> {
if !self.role.wakes(village) {
- return Ok(Box::new([]));
+ return Ok(Vec::new());
}
let (recruits, recruits_available) = match &self.role {
Role::MasonLeader {
@@ -313,22 +313,25 @@ impl Character {
}
pub fn night_action_prompts(&self, village: &Village) -> Result> {
+ let mut prompts = Vec::new();
if self.mason_leader().is_ok() {
- return self.mason_prompts(village);
- }
- if !self.alive() || !self.role.wakes(village) {
- return Ok(Box::new([]));
+ // add them here so masons wake up even with a dead leader
+ prompts.append(&mut self.mason_prompts(village)?);
}
let night = match village.time() {
GameTime::Day { number: _ } => return Err(GameError::NotNight),
GameTime::Night { number } => number,
};
- let mut prompts = Vec::new();
if night == 0 && self.auras.list().contains(&Aura::Traitor) {
+ log::info!("adding traitor prompt for {}", self.identity());
prompts.push(ActionPrompt::TraitorIntro {
character_id: self.identity(),
});
}
+ if !self.alive() || !self.role.wakes(village) {
+ return Ok(prompts.into_boxed_slice());
+ }
+
match &self.role {
Role::Empath { cursed: true }
| Role::Diseased
diff --git a/werewolves-proto/src/game/night.rs b/werewolves-proto/src/game/night.rs
index 68c61af..e94e396 100644
--- a/werewolves-proto/src/game/night.rs
+++ b/werewolves-proto/src/game/night.rs
@@ -1064,6 +1064,9 @@ impl Night {
Visits::new(
self.used_actions
.iter()
+ .filter(|(_, result, _)| {
+ !matches!(result, ActionResult::Drunk | ActionResult::RoleBlocked)
+ })
.filter_map(|(prompt, _, _)| match prompt {
ActionPrompt::Arcanist {
character_id,
diff --git a/werewolves-proto/src/game/night/process.rs b/werewolves-proto/src/game/night/process.rs
index a3b7e8d..07aec77 100644
--- a/werewolves-proto/src/game/night/process.rs
+++ b/werewolves-proto/src/game/night/process.rs
@@ -547,10 +547,26 @@ impl Night {
resp: ActionResponse,
) -> Result {
let outcome = self.process(resp)?;
+ if matches!(
+ self.current_prompt(),
+ Some((ActionPrompt::TraitorIntro { .. }, _))
+ | Some((ActionPrompt::RoleChange { .. }, _))
+ | Some((ActionPrompt::ElderReveal { .. }, _))
+ ) {
+ return Ok(outcome);
+ }
let mut act = match outcome {
ResponseOutcome::PromptUpdate(prompt) => {
return Ok(ResponseOutcome::PromptUpdate(prompt));
}
+ ResponseOutcome::ActionComplete(ActionComplete {
+ result: ActionResult::Drunk,
+ ..
+ })
+ | ResponseOutcome::ActionComplete(ActionComplete {
+ result: ActionResult::RoleBlocked,
+ ..
+ }) => return Ok(outcome),
ResponseOutcome::ActionComplete(act) => act,
};
let Some(char) = self.current_character() else {
diff --git a/werewolves-proto/src/game/village/apply.rs b/werewolves-proto/src/game/village/apply.rs
index 2f888a9..3bc4a57 100644
--- a/werewolves-proto/src/game/village/apply.rs
+++ b/werewolves-proto/src/game/village/apply.rs
@@ -15,7 +15,7 @@
use core::{num::NonZeroU8, ops::Not};
use crate::{
- aura::{Aura, AuraTitle},
+ aura::Aura,
diedto::DiedTo,
error::GameError,
game::{
diff --git a/werewolves/src/pages/traitor.rs b/werewolves/src/pages/traitor.rs
index e0224b5..942b68b 100644
--- a/werewolves/src/pages/traitor.rs
+++ b/werewolves/src/pages/traitor.rs
@@ -1,5 +1,7 @@
use yew::prelude::*;
+use crate::components::{Icon, IconSource};
+
#[function_component]
pub fn TraitorIntroPage() -> Html {
html! {
@@ -8,8 +10,11 @@ pub fn TraitorIntroPage() -> Html {