aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/bot/src/main.rs18
-rw-r--r--server/client-lib/src/lib.rs6
-rw-r--r--server/editor/src/main.rs6
-rw-r--r--server/protocol/src/lib.rs15
-rw-r--r--server/src/commands.rs10
-rw-r--r--server/src/entity/bot.rs8
-rw-r--r--server/src/entity/customers.rs8
-rw-r--r--server/src/entity/mod.rs12
-rw-r--r--server/src/entity/pedestrians.rs11
-rw-r--r--server/src/entity/tram.rs4
-rw-r--r--server/src/main.rs4
-rw-r--r--server/src/server.rs8
12 files changed, 72 insertions, 38 deletions
diff --git a/server/bot/src/main.rs b/server/bot/src/main.rs
index 56eedc13..6c51b1f0 100644
--- a/server/bot/src/main.rs
+++ b/server/bot/src/main.rs
@@ -19,7 +19,7 @@ use anyhow::Result;
use clap::Parser;
use hurrycurry_bot::{algos::ALGO_CONSTRUCTORS, BotAlgo, BotInput};
use hurrycurry_client_lib::{network::sync::Network, Game};
-use hurrycurry_protocol::{Hand, PacketC, PacketS, PlayerClass, PlayerID};
+use hurrycurry_protocol::{Character, Hand, PacketC, PacketS, PlayerClass, PlayerID};
use log::warn;
use std::{thread::sleep, time::Duration};
@@ -28,9 +28,15 @@ struct Args {
/// Bot player name, algo name by default
#[arg(short, long)]
username: Option<String>,
- /// Bot character id
+ /// Character color
#[arg(short, long, default_value_t = 0)]
- character: i32,
+ character_color: i32,
+ /// Character headwear
+ #[arg(short, long, default_value_t = 0)]
+ character_headwear: i32,
+ /// Character hairstyle
+ #[arg(short, long, default_value_t = 0)]
+ character_hairstyle: i32,
algo: String,
/// Websocket address of the server
address: String,
@@ -56,7 +62,11 @@ fn main() -> Result<()> {
network.queue_out.push_back(PacketS::Join {
name: format!("{}-bot", args.username.clone().unwrap_or(args.algo.clone())),
- character: args.character,
+ character: Character {
+ color: args.character_color,
+ hairstyle: args.character_hairstyle,
+ headwear: args.character_headwear,
+ },
class: PlayerClass::Bot,
id: None,
position: None,
diff --git a/server/client-lib/src/lib.rs b/server/client-lib/src/lib.rs
index f59b3dc3..57554aac 100644
--- a/server/client-lib/src/lib.rs
+++ b/server/client-lib/src/lib.rs
@@ -20,8 +20,8 @@ pub mod network;
pub mod spatial_index;
use hurrycurry_protocol::{
- glam::IVec2, movement::MovementBase, Gamedata, Hand, ItemIndex, ItemLocation, Message,
- MessageTimeout, PacketC, PlayerClass, PlayerID, RecipeIndex, Score, TileIndex,
+ glam::IVec2, movement::MovementBase, Character, Gamedata, Hand, ItemIndex, ItemLocation,
+ Message, MessageTimeout, PacketC, PlayerClass, PlayerID, RecipeIndex, Score, TileIndex,
};
use spatial_index::SpatialIndex;
use std::{
@@ -53,7 +53,7 @@ pub struct Tile {
pub struct Player {
pub name: String,
pub class: PlayerClass,
- pub character: i32,
+ pub character: Character,
pub interacting: Option<(IVec2, Hand)>,
pub items: Vec<Option<Item>>,
pub communicate_persist: Option<(Message, MessageTimeout)>,
diff --git a/server/editor/src/main.rs b/server/editor/src/main.rs
index c7cb7933..54d3b065 100644
--- a/server/editor/src/main.rs
+++ b/server/editor/src/main.rs
@@ -5,9 +5,7 @@ use clap::Parser;
use futures_util::{SinkExt, StreamExt};
use hurrycurry_client_lib::network::sync::Network;
use hurrycurry_protocol::{
- Gamedata, Hand, Message, PacketC, PacketS, PlayerClass, PlayerID, TileIndex, VERSION,
- glam::{IVec2, Vec2, ivec2},
- movement::MovementBase,
+ glam::{ivec2, IVec2, Vec2}, movement::MovementBase, Character, Gamedata, Hand, Message, PacketC, PacketS, PlayerClass, PlayerID, TileIndex, VERSION
};
use log::{debug, info, warn};
use save::{export_state, import_state};
@@ -408,7 +406,7 @@ fn start_map_bot(address: &str, own_addr: &str, mapname: &str) -> Result<()> {
network.queue_out.push_back(PacketS::Join {
name: "editor-bot".to_owned(),
- character: 0,
+ character: Character::default(),
class: PlayerClass::Bot,
id: None,
position: None,
diff --git a/server/protocol/src/lib.rs b/server/protocol/src/lib.rs
index db65ddd2..ef28dcca 100644
--- a/server/protocol/src/lib.rs
+++ b/server/protocol/src/lib.rs
@@ -110,8 +110,7 @@ pub struct Gamedata {
pub enum PacketS {
Join {
name: String,
- #[serde(deserialize_with = "deser_i32")]
- character: i32,
+ character: Character,
#[serde(default = "chef_class")]
class: PlayerClass,
#[serde(skip)] // TODO fix bincode can still set id
@@ -174,6 +173,16 @@ pub enum PacketS {
},
}
+#[derive(Debug, Default, Clone, Copy, Serialize, Deserialize, Encode, Decode)]
+pub struct Character {
+ #[serde(deserialize_with = "deser_i32", default)]
+ pub color: i32,
+ #[serde(deserialize_with = "deser_i32", default)]
+ pub hairstyle: i32,
+ #[serde(deserialize_with = "deser_i32", default)]
+ pub headwear: i32,
+}
+
fn chef_class() -> PlayerClass {
PlayerClass::Chef
}
@@ -219,7 +228,7 @@ pub enum PacketC {
#[bincode(with_serde)]
position: Vec2,
class: PlayerClass,
- character: i32,
+ character: Character,
name: String,
},
RemovePlayer {
diff --git a/server/src/commands.rs b/server/src/commands.rs
index b5645c8c..5be9e662 100644
--- a/server/src/commands.rs
+++ b/server/src/commands.rs
@@ -24,7 +24,9 @@ use crate::{
use anyhow::Result;
use clap::{Parser, ValueEnum};
use hurrycurry_bot::algos::ALGO_CONSTRUCTORS;
-use hurrycurry_protocol::{DocumentElement, Menu, Message, PacketC, PlayerClass, PlayerID};
+use hurrycurry_protocol::{
+ Character, DocumentElement, Menu, Message, PacketC, PlayerClass, PlayerID,
+};
use std::{fmt::Write, time::Duration};
#[derive(Parser)]
@@ -242,7 +244,11 @@ impl Server {
let algo = cons();
self.entities.push(Box::new(BotDriver::new(
format!("{}-bot", name.unwrap_or((*aname).to_owned())),
- 51,
+ Character {
+ color: 0,
+ hairstyle: 0,
+ headwear: 0,
+ },
PlayerClass::Bot,
algo,
)));
diff --git a/server/src/entity/bot.rs b/server/src/entity/bot.rs
index 922cc55e..8d3994cb 100644
--- a/server/src/entity/bot.rs
+++ b/server/src/entity/bot.rs
@@ -18,7 +18,7 @@
use super::{Entity, EntityContext};
use anyhow::Result;
use hurrycurry_bot::{BotAlgo, DynBotAlgo};
-use hurrycurry_protocol::{Hand, PacketS, PlayerClass, PlayerID};
+use hurrycurry_protocol::{Character, Hand, PacketS, PlayerClass, PlayerID};
use log::info;
use rand::random;
use std::any::Any;
@@ -27,14 +27,14 @@ pub type DynBotDriver = BotDriver<DynBotAlgo>;
pub struct BotDriver<T> {
algo: T,
- join_data: Option<(String, i32, PlayerClass)>,
+ join_data: Option<(String, Character, PlayerClass)>,
id: PlayerID,
interacting: bool,
left: bool,
}
impl<T: BotAlgo> BotDriver<T> {
- pub fn new(name: String, character: i32, class: PlayerClass, algo: T) -> Self {
+ pub fn new(name: String, character: Character, class: PlayerClass, algo: T) -> Self {
Self {
algo,
id: PlayerID(0),
@@ -51,7 +51,7 @@ impl<T: BotAlgo + Any> Entity for BotDriver<T> {
fn tick(&mut self, c: EntityContext<'_>) -> Result<()> {
if let Some((name, character, class)) = self.join_data.take() {
self.id = PlayerID(random()); // TODO bad code, can collide
- info!("spawn {:?} ({name:?}, {character})", self.id);
+ info!("spawn {:?} ({name:?})", self.id);
c.packet_in.push_back(PacketS::Join {
name,
character,
diff --git a/server/src/entity/customers.rs b/server/src/entity/customers.rs
index 02051901..05246a54 100644
--- a/server/src/entity/customers.rs
+++ b/server/src/entity/customers.rs
@@ -18,7 +18,7 @@
use super::{bot::BotDriver, Entity, EntityContext};
use anyhow::Result;
use hurrycurry_bot::algos::{Customer, CustomerConfig};
-use hurrycurry_protocol::PlayerClass;
+use hurrycurry_protocol::{Character, PlayerClass};
use rand::random;
pub struct Customers {
@@ -56,7 +56,11 @@ impl Entity for Customers {
self.spawn_cooldown = 10. + random::<f32>() * 10.;
let bot = BotDriver::new(
"".to_string(),
- -1 - random::<u16>() as i32,
+ Character {
+ color: random(),
+ hairstyle: random(),
+ headwear: 0,
+ },
PlayerClass::Customer,
Customer::new(CustomerConfig {
unknown_order: !c.serverdata.flags.disable_unknown_orders,
diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs
index 75ea0e9b..2eadc0ff 100644
--- a/server/src/entity/mod.rs
+++ b/server/src/entity/mod.rs
@@ -42,7 +42,7 @@ use environment_effect::{EnvironmentController, EnvironmentEffect, EnvironmentEf
use hurrycurry_client_lib::Game;
use hurrycurry_protocol::{
glam::{IVec2, Vec2},
- PacketC, PacketS, PlayerID,
+ Character, PacketC, PacketS, PlayerID,
};
use item_portal::ItemPortal;
use player_portal::PlayerPortal;
@@ -142,7 +142,7 @@ pub enum EntityDecl {
},
Tram {
length: usize,
- character: Option<i32>,
+ color: Option<i32>,
points: Vec<Vec2>,
spacing: f32,
smoothing: f32,
@@ -219,13 +219,17 @@ pub fn construct_entity(
EntityDecl::Environment(names) => Box::new(EnvironmentController(names)),
EntityDecl::Tram {
length,
- character,
+ color,
points,
smoothing,
spacing,
} => Box::new(Tram {
length,
- character: character.unwrap_or(51),
+ character: Character {
+ color: color.unwrap_or_default(),
+ hairstyle: 0,
+ headwear: 0,
+ },
ids: Vec::new(),
points,
progress: 0.,
diff --git a/server/src/entity/pedestrians.rs b/server/src/entity/pedestrians.rs
index 9b433ded..64adf57b 100644
--- a/server/src/entity/pedestrians.rs
+++ b/server/src/entity/pedestrians.rs
@@ -1,5 +1,3 @@
-use std::collections::HashMap;
-
/*
Hurry Curry! - a game about cooking
Copyright 2025 metamuffin
@@ -19,9 +17,10 @@ use std::collections::HashMap;
*/
use super::{Entity, EntityContext};
use anyhow::Result;
-use hurrycurry_protocol::{glam::Vec2, PacketS, PlayerClass, PlayerID};
+use hurrycurry_protocol::{glam::Vec2, Character, PacketS, PlayerClass, PlayerID};
use rand::{random, rng};
use rand_distr::Distribution;
+use std::collections::HashMap;
pub struct Pedestrians {
pub players: HashMap<PlayerID, usize>,
@@ -40,7 +39,11 @@ impl Entity for Pedestrians {
let id = PlayerID(random());
c.packet_in.push_back(PacketS::Join {
name: "Pedestrian".to_string(),
- character: 0,
+ character: Character {
+ color: random(),
+ hairstyle: random(),
+ headwear: 0,
+ },
class: PlayerClass::Customer,
id: Some(id),
position: self.points.get(0).copied(),
diff --git a/server/src/entity/tram.rs b/server/src/entity/tram.rs
index 26a191aa..76ce6dbd 100644
--- a/server/src/entity/tram.rs
+++ b/server/src/entity/tram.rs
@@ -17,12 +17,12 @@
*/
use super::{Entity, EntityContext};
use anyhow::Result;
-use hurrycurry_protocol::{glam::Vec2, PacketS, PlayerClass, PlayerID};
+use hurrycurry_protocol::{glam::Vec2, Character, PacketS, PlayerClass, PlayerID};
use rand::random;
pub struct Tram {
pub length: usize,
- pub character: i32,
+ pub character: Character,
pub ids: Vec<PlayerID>,
pub points: Vec<Vec2>,
pub progress: f32,
diff --git a/server/src/main.rs b/server/src/main.rs
index cc5bcb52..d476fc30 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -304,7 +304,7 @@ async fn run(args: Args) -> anyhow::Result<()> {
#[cfg(test)]
mod test {
- use hurrycurry_protocol::{PacketS, PlayerClass, PlayerID};
+ use hurrycurry_protocol::{Character, PacketS, PlayerClass, PlayerID};
use hurrycurry_server::{data::DATA_DIR, server::Server, ConnectionID};
use std::future::Future;
use tokio::sync::broadcast;
@@ -360,7 +360,7 @@ mod test {
ConnectionID(conn.try_into().unwrap()),
PacketS::Join {
name: format!("test {conn}"),
- character: 1,
+ character: Character::default(),
class: PlayerClass::Chef,
id: None,
position: None,
diff --git a/server/src/server.rs b/server/src/server.rs
index 3823c0ca..c30f54a4 100644
--- a/server/src/server.rs
+++ b/server/src/server.rs
@@ -28,8 +28,8 @@ use hurrycurry_client_lib::{Game, Involvement, Item, Player, Tile};
use hurrycurry_protocol::{
glam::{IVec2, Vec2},
movement::MovementBase,
- Gamedata, Hand, ItemLocation, Menu, MessageTimeout, PacketC, PacketS, PlayerClass, PlayerID,
- Score, TileIndex,
+ Character, Gamedata, Hand, ItemLocation, Menu, MessageTimeout, PacketC, PacketS, PlayerClass,
+ PlayerID, Score, TileIndex,
};
use log::{info, warn};
use rand::random;
@@ -73,7 +73,7 @@ pub trait GameServerExt {
&mut self,
id: PlayerID,
name: String,
- character: i32,
+ character: Character,
class: PlayerClass,
serverdata: &Serverdata,
custom_position: Option<Vec2>,
@@ -245,7 +245,7 @@ impl GameServerExt for Game {
&mut self,
id: PlayerID,
name: String,
- character: i32,
+ character: Character,
class: PlayerClass,
serverdata: &Serverdata,
custom_position: Option<Vec2>,