aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/bot/src/algos/customer.rs59
-rw-r--r--server/bot/src/algos/frank.rs1
-rw-r--r--server/protocol/src/lib.rs2
-rw-r--r--server/src/commands.rs7
-rw-r--r--server/src/interaction.rs3
-rw-r--r--server/src/server.rs4
-rw-r--r--server/src/state.rs1
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),