From 99a2fa31c4acbdb933a37ec2a043cb7dd0d46a6c Mon Sep 17 00:00:00 2001 From: emilis Date: Thu, 13 Nov 2025 23:22:41 +0000 Subject: [PATCH] traitor prompt appears for non-wakers also the traitor, elder reveal, role change prompts can no longer get drunk (lol) --- werewolves-proto/src/bag.rs | 6 +----- werewolves-proto/src/character.rs | 17 ++++++++++------- werewolves-proto/src/game/night.rs | 3 +++ werewolves-proto/src/game/night/process.rs | 16 ++++++++++++++++ werewolves-proto/src/game/village/apply.rs | 2 +- werewolves/src/pages/traitor.rs | 7 ++++++- 6 files changed, 37 insertions(+), 14 deletions(-) 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 {

{"YOU ARE A TRAITOR"}

{"YOU RETAIN YOUR ROLE AND WIN IF EVIL WINS"}

+
+ +

{"HOWEVER"}

-

+

{"YOU CONTRIBUTE TO VILLAGE PARITY"}