aboutsummaryrefslogtreecommitdiff
path: root/server/data/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/data/src')
-rw-r--r--server/data/src/entities.rs15
-rw-r--r--server/data/src/lib.rs28
2 files changed, 31 insertions, 12 deletions
diff --git a/server/data/src/entities.rs b/server/data/src/entities.rs
index 5c874441..135e4b78 100644
--- a/server/data/src/entities.rs
+++ b/server/data/src/entities.rs
@@ -16,6 +16,7 @@
*/
+use clap::ValueEnum;
use hurrycurry_protocol::{
ItemIndex, TileIndex,
glam::{IVec2, Vec2},
@@ -72,8 +73,9 @@ pub enum EntityDecl {
spacing: f32,
smoothing: f32,
},
- Book {
+ Button {
pos: IVec2,
+ action: ButtonAction,
},
Pedestrians {
spawn_delay: f32,
@@ -98,8 +100,17 @@ pub enum EntityDecl {
},
}
+#[derive(Debug, Clone, Copy, Deserialize, Serialize, ValueEnum)]
+#[serde(rename_all = "snake_case")]
+pub enum ButtonAction {
+ Book,
+ VoteYes,
+ VoteNo,
+ MapSelector,
+}
+
#[derive(Debug, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "kebab-case")]
+#[serde(rename_all = "snake_case")]
pub enum GateCondition {
All(Vec<GateCondition>),
Any(Vec<GateCondition>),
diff --git a/server/data/src/lib.rs b/server/data/src/lib.rs
index d09c3ca3..06233d1e 100644
--- a/server/data/src/lib.rs
+++ b/server/data/src/lib.rs
@@ -24,7 +24,7 @@ pub mod registry;
use crate::{
book::book,
- entities::EntityDecl,
+ entities::{ButtonAction, EntityDecl},
recipes::{RecipeDecl, load_recipes},
registry::{ItemTileRegistry, filter_unused_tiles_and_items},
};
@@ -71,8 +71,8 @@ fn default_recipes() -> String {
#[derive(Parser)]
struct TileArgs {
tiles: Vec<String>,
- #[clap(long)]
- book: bool,
+ #[clap(short, long)]
+ button: Option<ButtonAction>,
#[clap(long)]
chef_spawn: bool,
#[clap(long)]
@@ -146,6 +146,7 @@ pub fn build_gamedata(
let mut chef_spawn = None;
let mut customer_spawn = None;
let mut initial_map = HashMap::new();
+ let mut interactable_empty_extra = HashSet::new();
for (y, line) in map_in.map.iter().enumerate() {
for (x, char) in line.chars().enumerate() {
@@ -163,7 +164,10 @@ pub fn build_gamedata(
.iter()
.cloned()
.map(|t| reg.register_tile(t))
- .collect();
+ .collect::<Vec<_>>();
+ let Some(top) = tiles.last().copied() else {
+ continue;
+ };
let item = ts.item.clone().map(|i| reg.register_item(i));
initial_map.insert(pos, (tiles, item));
@@ -173,8 +177,9 @@ pub fn build_gamedata(
if ts.customer_spawn {
customer_spawn = Some(pos.as_vec2() + Vec2::splat(0.5));
}
- if ts.book {
- entities.push(EntityDecl::Book { pos });
+ if let Some(action) = ts.button {
+ interactable_empty_extra.insert(top);
+ entities.push(EntityDecl::Button { pos, action });
}
if ts.demand_sink {
entities.push(EntityDecl::DemandSink { pos });
@@ -194,7 +199,6 @@ pub fn build_gamedata(
}
let chef_spawn = chef_spawn.ok_or(anyhow!("map has no chef spawn"))?;
-
for mut e in map_in.entities.clone() {
match &mut e {
EntityDecl::Customers { unknown_order, .. } => {
@@ -249,6 +253,9 @@ pub fn build_gamedata(
),
tile_placeable_any: tiles_flagged(&tile_flags, &tiles, 'a'),
tile_interactable_empty: tiles_flagged(&tile_flags, &tiles, 'e')
+ .union(&interactable_empty_extra)
+ .copied()
+ .collect::<HashSet<_>>()
.union(&tile_interactable_empty_bc_recipe(&recipes))
.copied()
.collect(),
@@ -357,9 +364,10 @@ fn tiles_flagged(
for (i, tile) in tiles.iter().enumerate() {
let (kind, _params) = tile.split_once(":").unwrap_or((tile, ""));
if let Some(flags) = tile_flags.get(kind)
- && flags.contains(flag) {
- out.insert(TileIndex(i));
- }
+ && flags.contains(flag)
+ {
+ out.insert(TileIndex(i));
+ }
}
out
}