From 0d382ea19f8f964c35761f6a3ff80bc9bfc25375 Mon Sep 17 00:00:00 2001 From: troido Date: Tue, 19 May 2020 10:40:22 +0200 Subject: add room build permissions to rooms --- src/resources/mod.rs | 3 +++ src/resources/roompermissions.rs | 8 ++++++++ src/room.rs | 6 ++++-- src/roomtemplate.rs | 18 ++++++++++++++---- src/systems/useitem.rs | 9 +++++---- 5 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 src/resources/roompermissions.rs (limited to 'src') diff --git a/src/resources/mod.rs b/src/resources/mod.rs index ae3f4e2..627a396 100644 --- a/src/resources/mod.rs +++ b/src/resources/mod.rs @@ -1,9 +1,11 @@ mod ground; mod newentities; +mod roompermissions; pub use ground::Ground; pub use newentities::NewEntities; +pub use roompermissions::RoomPermissions; use std::collections::{HashMap}; use specs::{Entity}; @@ -55,3 +57,4 @@ pub struct Emigration { pub struct Time { pub time: Timestamp } + diff --git a/src/resources/roompermissions.rs b/src/resources/roompermissions.rs new file mode 100644 index 0000000..e3646f3 --- /dev/null +++ b/src/resources/roompermissions.rs @@ -0,0 +1,8 @@ + +use serde::{Deserialize, Serialize}; + +#[derive(Default, Debug, Clone, Deserialize, Serialize)] +pub struct RoomPermissions { + #[serde(default)] + pub build: bool +} diff --git a/src/room.rs b/src/room.rs index d0f22df..0b8ee3b 100644 --- a/src/room.rs +++ b/src/room.rs @@ -22,7 +22,8 @@ use crate::{ Spawn as SpawnPosition, Players, Emigration, - Time + Time, + RoomPermissions }, components::{ Position, @@ -125,7 +126,7 @@ impl <'a, 'b>Room<'a, 'b> { register_insert!( world, (Position, Visible, Controller, Movable, New, Removed, Moved, Player, Inventory, Health, Serialise, RoomExit, Entered, TriggerBox, Trap, Fighter, Healing, ControlCooldown, Autofight, MonsterAI, Home, AttackInbox, Item, Spawner, Clan, Faction, Interactable, Loot, Timer, Equipment, TimeOffset, Flags, Ear, Build, Whitelist, Dedup, Minable, LootHolder, OnSpawn, Substitute), - (Ground, Input, Output, Size, Spawn, Players, Emigration, Time) + (Ground, Input, Output, Size, Spawn, Players, Emigration, Time, RoomPermissions) ); Room { @@ -143,6 +144,7 @@ impl <'a, 'b>Room<'a, 'b> { self.world.fetch_mut::().height = height; self.world.fetch_mut::().pos = template.spawn; + self.world.insert::(template.permissions.clone()); for (idx, templates) in template.field.iter().enumerate() { let x = (idx as i64) % width; diff --git a/src/roomtemplate.rs b/src/roomtemplate.rs index d853b20..2614441 100644 --- a/src/roomtemplate.rs +++ b/src/roomtemplate.rs @@ -1,11 +1,12 @@ use std::collections::HashMap; -use serde_json::{json, Value}; +use serde_json::{json, Value, value}; use crate::{ Pos, Template, PResult, - perr + perr, + resources::RoomPermissions }; #[derive(Debug, Clone)] @@ -13,7 +14,8 @@ pub struct RoomTemplate { pub size: (i64, i64), pub spawn: Pos, pub field: Vec>, - pub places: HashMap + pub places: HashMap, + pub permissions: RoomPermissions } impl RoomTemplate { @@ -54,11 +56,19 @@ impl RoomTemplate { places.insert(name.to_string(), Pos::from_json(jsonpos).ok_or(perr!("pos of places invalid"))?); } + let permissions: RoomPermissions = value::from_value::( + jsonroom + .get("permissions") + .unwrap_or(&json!({})) + .clone() + ).map_err(|e| perr!("can't deserialise permissions: {:?}", e))?; + Ok(RoomTemplate { size, spawn, field, - places + places, + permissions }) } } diff --git a/src/systems/useitem.rs b/src/systems/useitem.rs index 485b1da..a560c18 100644 --- a/src/systems/useitem.rs +++ b/src/systems/useitem.rs @@ -20,7 +20,7 @@ use crate::{ AttackType, Flags }, - resources::{NewEntities, Ground}, + resources::{NewEntities, Ground, RoomPermissions}, item::ItemAction::{None, Build, Eat, Equip}, controls::Control, }; @@ -36,10 +36,11 @@ impl <'a> System<'a> for Use { Write<'a, NewEntities>, WriteStorage<'a, AttackInbox>, Read<'a, Ground>, - ReadStorage<'a, Flags> + ReadStorage<'a, Flags>, + Read<'a, RoomPermissions> ); - fn run(&mut self, (entities, controllers, positions, mut inventories, mut new, mut attacked, ground, flags): Self::SystemData) { + fn run(&mut self, (entities, controllers, positions, mut inventories, mut new, mut attacked, ground, flags, roompermissions): Self::SystemData) { for (ent, controller, position, inventory) in (&entities, &controllers, &positions, &mut inventories).join(){ match &controller.control { Control::Use(rank) => { @@ -47,7 +48,7 @@ impl <'a> System<'a> for Use { match &entry.item.action { Build(template, required_flags, blocking_flags) => { let ground_flags = ground.flags_on(position.pos, &flags); - if required_flags.is_subset(&ground_flags) && blocking_flags.is_disjoint(&ground_flags){ + if roompermissions.build && required_flags.is_subset(&ground_flags) && blocking_flags.is_disjoint(&ground_flags){ new.create(position.pos, &template).unwrap(); inventory.items.remove(*rank); } -- cgit