diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/bot/src/algos/customer.rs | 59 | ||||
-rw-r--r-- | server/bot/src/algos/frank.rs | 1 | ||||
-rw-r--r-- | server/protocol/src/lib.rs | 2 | ||||
-rw-r--r-- | server/src/commands.rs | 7 | ||||
-rw-r--r-- | server/src/interaction.rs | 3 | ||||
-rw-r--r-- | server/src/server.rs | 4 | ||||
-rw-r--r-- | server/src/state.rs | 1 |
7 files changed, 60 insertions, 17 deletions
diff --git a/server/bot/src/algos/customer.rs b/server/bot/src/algos/customer.rs index ec8f2283..e602addc 100644 --- a/server/bot/src/algos/customer.rs +++ b/server/bot/src/algos/customer.rs @@ -39,6 +39,8 @@ pub enum Customer { chair: IVec2, timeout: f32, origin: IVec2, + check: u8, + pinned: bool, }, Eating { demand: DemandIndex, @@ -104,12 +106,15 @@ impl BotAlgo for Customer { timeout, demand, origin: *origin, + check: 0, + pinned: false, }; BotInput { extra: vec![PacketS::Communicate { message: Some(Message::Item(game.data.demands[demand.0].input)), timeout: Some(timeout), player: me, + pin: Some(false), }], ..Default::default() } @@ -144,19 +149,23 @@ impl BotAlgo for Customer { demand, timeout, origin, + check, + pinned, } => { *timeout -= dt; + *check += 1; if *timeout <= 0. { let path = find_path(&game.walkable, pos.as_ivec2(), *origin) .expect("no path to exit"); info!("{me:?} -> exiting"); *self = Customer::Exiting { path }; - BotInput { + return BotInput { extra: vec![ PacketS::Communicate { message: None, timeout: Some(0.), player: me, + pin: Some(false), }, PacketS::ApplyScore(Score { points: -1, @@ -169,9 +178,32 @@ impl BotAlgo for Customer { }, ], ..Default::default() - } - } else { + }; + } else if *check > 10 { let demand_data = &game.data.demands[demand.0]; + *check = 0; + + if !*pinned { + let mut pin = false; + game.players_spatial_index.query(pos, 3., |pid, _| { + if game.players.get(&pid).map_or(false, |p| p.character >= 0) { + pin = true + } + }); + if pin { + *pinned = true; + return BotInput { + extra: vec![PacketS::Communicate { + player: me, + message: Some(Message::Item(demand_data.input)), + timeout: Some(*timeout), + pin: Some(true), + }], + ..Default::default() + }; + } + } + let demand_pos = [IVec2::NEG_X, IVec2::NEG_Y, IVec2::X, IVec2::Y] .into_iter() .find_map(|off| { @@ -201,12 +233,19 @@ impl BotAlgo for Customer { chair: *chair, origin: *origin, }; - BotInput { + return BotInput { extra: vec![ PacketS::Communicate { message: None, timeout: Some(0.), player: me, + pin: Some(false), + }, + PacketS::Communicate { + message: None, + timeout: Some(0.), + player: me, + pin: Some(true), }, PacketS::Effect { name: "satisfied".to_string(), @@ -222,15 +261,15 @@ impl BotAlgo for Customer { }, ], ..Default::default() - } - } else { - BotInput { - direction: (chair.as_vec2() + 0.5) - pos, - ..Default::default() - } + }; } } + BotInput { + direction: (chair.as_vec2() + 0.5) - pos, + ..Default::default() + } } + Customer::Eating { demand, target, diff --git a/server/bot/src/algos/frank.rs b/server/bot/src/algos/frank.rs index 95718d4c..854c73bb 100644 --- a/server/bot/src/algos/frank.rs +++ b/server/bot/src/algos/frank.rs @@ -84,6 +84,7 @@ impl BotAlgo for Frank { player: me, message: Some(Message::Text(message)), timeout: Some(3.), + pin: Some(false), }], ..Default::default() }; diff --git a/server/protocol/src/lib.rs b/server/protocol/src/lib.rs index b826edae..0203107d 100644 --- a/server/protocol/src/lib.rs +++ b/server/protocol/src/lib.rs @@ -118,6 +118,7 @@ pub enum PacketS { player: PlayerID, message: Option<Message>, timeout: Option<f32>, + pin: Option<bool>, }, /// For use in replay sessions only @@ -266,6 +267,7 @@ pub enum Menu { pub struct MessageTimeout { pub remaining: f32, pub initial: f32, + pub pinned: bool, } #[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode, Default)] diff --git a/server/src/commands.rs b/server/src/commands.rs index c03c8bcd..6fd95eac 100644 --- a/server/src/commands.rs +++ b/server/src/commands.rs @@ -23,7 +23,7 @@ use crate::{ use anyhow::{anyhow, bail, Result}; use clap::{Parser, ValueEnum}; use hurrycurry_bot::algos::ALGO_CONSTRUCTORS; -use hurrycurry_protocol::{Menu, Message, MessageTimeout, PacketC, PlayerID}; +use hurrycurry_protocol::{Menu, Message, PacketC, PlayerID}; use std::{fmt::Write, time::Duration}; #[derive(Parser)] @@ -294,10 +294,7 @@ impl Server { id: message_id, params: arguments.into_iter().map(|c| Message::Text(c)).collect(), }), - timeout: Some(MessageTimeout { - initial: 5., - remaining: 5., - }), + timeout: None, }); } } diff --git a/server/src/interaction.rs b/server/src/interaction.rs index 7a8c2e9d..74d31cd8 100644 --- a/server/src/interaction.rs +++ b/server/src/interaction.rs @@ -15,13 +15,12 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ +use crate::data::index::GamedataIndex; use hurrycurry_client_lib::{Involvement, Item}; use hurrycurry_protocol::{Gamedata, ItemLocation, PacketC, PlayerID, Recipe, Score, TileIndex}; use log::info; use std::collections::VecDeque; -use crate::data::index::GamedataIndex; - #[allow(clippy::too_many_arguments)] pub fn interact( data: &Gamedata, diff --git a/server/src/server.rs b/server/src/server.rs index 06b6e5fd..0c3df634 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -528,8 +528,10 @@ impl Server { message, timeout, player, + pin, } => { info!("{player:?} message {message:?}"); + let pin = pin.unwrap_or(false); if let Some(timeout) = timeout { if let Some(player) = self.game.players.get_mut(&player) { player.communicate_persist = message.clone().map(|m| { @@ -538,6 +540,7 @@ impl Server { MessageTimeout { initial: timeout, remaining: timeout, + pinned: pin, }, ) }); @@ -549,6 +552,7 @@ impl Server { timeout: timeout.map(|t| MessageTimeout { initial: t, remaining: t, + pinned: pin, }), }) } diff --git a/server/src/state.rs b/server/src/state.rs index 9009d4a1..65e6dfd2 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -53,6 +53,7 @@ impl Server { message: Some(Message::Text(text)), timeout: None, player, + .. } if let Some(command) = text.strip_prefix("/") => { match self.handle_command_parse(*player, command).await { Ok(packets) => return Ok(packets), |