diff options
author | metamuffin <metamuffin@disroot.org> | 2025-06-03 20:24:20 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-06-03 20:24:20 +0200 |
commit | d279baccdbaf37ae4410af1875e98597fe0b5565 (patch) | |
tree | e42320d5c0433a6b0415305da0520dc035553cef /server | |
parent | db4587d3ec64b7e28691b43f9d9701939eed94d1 (diff) | |
download | hurrycurry-d279baccdbaf37ae4410af1875e98597fe0b5565.tar hurrycurry-d279baccdbaf37ae4410af1875e98597fe0b5565.tar.bz2 hurrycurry-d279baccdbaf37ae4410af1875e98597fe0b5565.tar.zst |
use multiple ints for characters; close #294
Diffstat (limited to 'server')
-rw-r--r-- | server/bot/src/main.rs | 18 | ||||
-rw-r--r-- | server/client-lib/src/lib.rs | 6 | ||||
-rw-r--r-- | server/editor/src/main.rs | 6 | ||||
-rw-r--r-- | server/protocol/src/lib.rs | 15 | ||||
-rw-r--r-- | server/src/commands.rs | 10 | ||||
-rw-r--r-- | server/src/entity/bot.rs | 8 | ||||
-rw-r--r-- | server/src/entity/customers.rs | 8 | ||||
-rw-r--r-- | server/src/entity/mod.rs | 12 | ||||
-rw-r--r-- | server/src/entity/pedestrians.rs | 11 | ||||
-rw-r--r-- | server/src/entity/tram.rs | 4 | ||||
-rw-r--r-- | server/src/main.rs | 4 | ||||
-rw-r--r-- | server/src/server.rs | 8 |
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>, |