aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-10-12 00:03:16 +0200
committermetamuffin <metamuffin@disroot.org>2025-10-12 00:03:16 +0200
commitbab30b167f8d81df92ee0f3dd6f1c1b3dfaeb9b0 (patch)
tree2d69741912aed51084df8b1b5f44d8fe1787639e
parent94fab766512de7b3be8123c4238a7902ce7b35c4 (diff)
downloadhurrycurry-bab30b167f8d81df92ee0f3dd6f1c1b3dfaeb9b0.tar
hurrycurry-bab30b167f8d81df92ee0f3dd6f1c1b3dfaeb9b0.tar.bz2
hurrycurry-bab30b167f8d81df92ee0f3dd6f1c1b3dfaeb9b0.tar.zst
Fix bug where unknown order item was optimized out
-rw-r--r--server/data/src/entities.rs23
-rw-r--r--server/data/src/lib.rs8
-rw-r--r--server/data/src/registry.rs9
-rw-r--r--server/src/entity/mod.rs16
-rw-r--r--server/src/server.rs2
5 files changed, 33 insertions, 25 deletions
diff --git a/server/data/src/entities.rs b/server/data/src/entities.rs
index 68dbe479..04d4e1c5 100644
--- a/server/data/src/entities.rs
+++ b/server/data/src/entities.rs
@@ -16,11 +16,12 @@
*/
-use hurrycurry_protocol::glam::{IVec2, Vec2};
+use hurrycurry_protocol::{
+ ItemIndex, TileIndex,
+ glam::{IVec2, Vec2},
+};
use serde::{Deserialize, Serialize};
-use crate::ItemTileRegistry;
-
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum EntityDecl {
@@ -39,6 +40,8 @@ pub enum EntityDecl {
},
Customers {
scaling_factor: Option<f32>,
+ #[serde(default = "default_item")]
+ unknown_order: ItemIndex,
},
Map {
name: String,
@@ -49,6 +52,7 @@ pub enum EntityDecl {
Gate {
condition: GateCondition,
pos: IVec2,
+ blocker_tile: TileIndex,
},
Tram {
length: usize,
@@ -68,16 +72,6 @@ pub enum EntityDecl {
},
}
-impl EntityDecl {
- pub(crate) fn run_register(&self, reg: &ItemTileRegistry) {
- match self {
- Self::Gate { .. } => drop(reg.register_tile("fence".into())),
- Self::Customers { .. } => drop(reg.register_item("unknown-order".into())),
- _ => (),
- }
- }
-}
-
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum GateCondition {
@@ -97,3 +91,6 @@ pub struct EnvironmentEffect {
fn default_onoff() -> f32 {
40.
}
+fn default_item() -> ItemIndex {
+ ItemIndex(usize::MAX)
+}
diff --git a/server/data/src/lib.rs b/server/data/src/lib.rs
index dd462e3b..ed1d03da 100644
--- a/server/data/src/lib.rs
+++ b/server/data/src/lib.rs
@@ -210,9 +210,11 @@ fn build_data(
}
}
- entities.extend(map_in.entities.clone());
- for e in &entities {
- e.run_register(&reg);
+ for mut e in map_in.entities.clone() {
+ if let EntityDecl::Customers { unknown_order, .. } = &mut e {
+ *unknown_order = reg.register_item("unknown-order".to_owned())
+ }
+ entities.push(e);
}
debug!("{} entites created", entities.len());
diff --git a/server/data/src/registry.rs b/server/data/src/registry.rs
index 952a2e29..e7dc7f77 100644
--- a/server/data/src/registry.rs
+++ b/server/data/src/registry.rs
@@ -23,7 +23,7 @@ use std::{
sync::RwLock,
};
-use crate::Serverdata;
+use crate::{Serverdata, entities::EntityDecl};
#[derive(Default)]
pub(crate) struct ItemTileRegistry {
@@ -78,6 +78,13 @@ pub(crate) fn filter_unused_tiles_and_items(data: &mut Gamedata, serverdata: &mu
used_tiles.insert(tile);
used_items.extend(item);
}
+ for e in &serverdata.entity_decls {
+ match e {
+ EntityDecl::Gate { blocker_tile: blocker, .. } => used_tiles.insert(*blocker),
+ EntityDecl::Customers { unknown_order, .. } => used_items.insert(*unknown_order),
+ _ => false,
+ };
+ }
let mut item_names = Vec::new();
let mut item_map = HashMap::new();
diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs
index ce7cb849..6418d0c7 100644
--- a/server/src/entity/mod.rs
+++ b/server/src/entity/mod.rs
@@ -37,7 +37,7 @@ use environment_effect::{EnvironmentController, EnvironmentEffectController};
use hurrycurry_client_lib::Game;
use hurrycurry_data::{Serverdata, entities::EntityDecl};
use hurrycurry_locale::TrError;
-use hurrycurry_protocol::{Character, Gamedata, PacketC, PacketS, PlayerID, glam::IVec2};
+use hurrycurry_protocol::{Character, PacketC, PacketS, PlayerID, glam::IVec2};
use item_portal::ItemPortal;
use player_portal::PlayerPortal;
use std::{
@@ -80,7 +80,7 @@ pub trait Entity: Any {
}
}
-pub fn construct_entity(decl: &EntityDecl, data: &Gamedata) -> DynEntity {
+pub fn construct_entity(decl: &EntityDecl) -> DynEntity {
match decl.to_owned() {
EntityDecl::Book { pos } => Box::new(Book(pos)),
EntityDecl::ItemPortal { from, to } => Box::new(ItemPortal { from, to }),
@@ -92,16 +92,18 @@ pub fn construct_entity(decl: &EntityDecl, data: &Gamedata) -> DynEntity {
cooldown: 0.,
}),
EntityDecl::Map { name, pos } => Box::new(Map { pos, name }),
- EntityDecl::Gate { condition, pos } => Box::new(Gate {
+ EntityDecl::Gate {
+ condition,
+ pos,
+ blocker_tile,
+ } => Box::new(Gate {
condition,
unlocked: false,
pos,
- blocker_tile: data
- .get_tile_by_name("fence")
- .expect("asserted earlier (tm)"),
+ blocker_tile,
active: true,
}),
- EntityDecl::Customers { scaling_factor } => {
+ EntityDecl::Customers { scaling_factor, .. } => {
Box::new(Customers::new(scaling_factor.unwrap_or(0.5)))
}
EntityDecl::EnvironmentEffect(config) => Box::new(EnvironmentEffectController::new(config)),
diff --git a/server/src/server.rs b/server/src/server.rs
index 99e7eaf8..c0b32a1c 100644
--- a/server/src/server.rs
+++ b/server/src/server.rs
@@ -388,7 +388,7 @@ impl Server {
self.gamedata_index.update(&self.game.data);
self.entities.clear();
for ed in &serverdata.entity_decls {
- self.entities.push(construct_entity(ed, &self.game.data));
+ self.entities.push(construct_entity(ed));
}
self.data = serverdata.into();
for e in &mut self.entities {