Spawn all entities via raws, complete Section 5.2
This commit is contained in:
parent
b80c64febb
commit
aaf3fdcc42
@ -175,5 +175,36 @@
|
|||||||
},
|
},
|
||||||
"vision_range": 8
|
"vision_range": 8
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"props": [
|
||||||
|
{
|
||||||
|
"name": "Bear Trap",
|
||||||
|
"renderable": {
|
||||||
|
"glyph": "^",
|
||||||
|
"fg": "#FF0000",
|
||||||
|
"bg": "#000000",
|
||||||
|
"order": 2
|
||||||
|
},
|
||||||
|
"hidden": true,
|
||||||
|
"entry_trigger": {
|
||||||
|
"effects": {
|
||||||
|
"damage": "6",
|
||||||
|
"single_activation": "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Door",
|
||||||
|
"renderable": {
|
||||||
|
"glyph": "+",
|
||||||
|
"fg": "#805A46",
|
||||||
|
"bg": "#000000",
|
||||||
|
"order": 2
|
||||||
|
},
|
||||||
|
"hidden": false,
|
||||||
|
"blocks_tile": true,
|
||||||
|
"blocks_visibility": true,
|
||||||
|
"door_open": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -1,11 +1,13 @@
|
|||||||
mod item_structs;
|
mod item_structs;
|
||||||
mod mob_structs;
|
mod mob_structs;
|
||||||
|
mod prop_structs;
|
||||||
mod rawmaster;
|
mod rawmaster;
|
||||||
|
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
|
|
||||||
use item_structs::*;
|
use item_structs::*;
|
||||||
use mob_structs::*;
|
use mob_structs::*;
|
||||||
|
use prop_structs::*;
|
||||||
pub use rawmaster::*;
|
pub use rawmaster::*;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
|
||||||
@ -13,6 +15,7 @@ use serde::Deserialize;
|
|||||||
pub struct Raws {
|
pub struct Raws {
|
||||||
pub items: Vec<Item>,
|
pub items: Vec<Item>,
|
||||||
pub mobs: Vec<Mob>,
|
pub mobs: Vec<Mob>,
|
||||||
|
pub props: Vec<Prop>,
|
||||||
}
|
}
|
||||||
|
|
||||||
rltk::embedded_resource!(RAW_FILE, "../raws/spawns.json");
|
rltk::embedded_resource!(RAW_FILE, "../raws/spawns.json");
|
||||||
|
21
src/raws/prop_structs.rs
Normal file
21
src/raws/prop_structs.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
use super::Renderable;
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
pub struct Prop {
|
||||||
|
pub name: String,
|
||||||
|
pub renderable: Option<Renderable>,
|
||||||
|
pub hidden: Option<bool>,
|
||||||
|
pub blocks_tile: Option<bool>,
|
||||||
|
pub blocks_visibility: Option<bool>,
|
||||||
|
pub door_open: Option<bool>,
|
||||||
|
pub entry_trigger: Option<EntryTrigger>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
pub struct EntryTrigger {
|
||||||
|
pub effects: HashMap<String, String>,
|
||||||
|
}
|
@ -13,6 +13,7 @@ pub struct RawMaster {
|
|||||||
raws: Raws,
|
raws: Raws,
|
||||||
item_index: HashMap<String, usize>,
|
item_index: HashMap<String, usize>,
|
||||||
mob_index: HashMap<String, usize>,
|
mob_index: HashMap<String, usize>,
|
||||||
|
prop_index: HashMap<String, usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RawMaster {
|
impl RawMaster {
|
||||||
@ -21,9 +22,11 @@ impl RawMaster {
|
|||||||
raws: Raws {
|
raws: Raws {
|
||||||
items: Vec::new(),
|
items: Vec::new(),
|
||||||
mobs: Vec::new(),
|
mobs: Vec::new(),
|
||||||
|
props: Vec::new(),
|
||||||
},
|
},
|
||||||
item_index: HashMap::new(),
|
item_index: HashMap::new(),
|
||||||
mob_index: HashMap::new(),
|
mob_index: HashMap::new(),
|
||||||
|
prop_index: HashMap::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,6 +40,9 @@ impl RawMaster {
|
|||||||
for (i, mob) in self.raws.mobs.iter().enumerate() {
|
for (i, mob) in self.raws.mobs.iter().enumerate() {
|
||||||
self.mob_index.insert(mob.name.clone(), i);
|
self.mob_index.insert(mob.name.clone(), i);
|
||||||
}
|
}
|
||||||
|
for (i, prop) in self.raws.props.iter().enumerate() {
|
||||||
|
self.prop_index.insert(prop.name.clone(), i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,6 +204,66 @@ pub fn spawn_named_mob(
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn spawn_named_prop(
|
||||||
|
raws: &RawMaster,
|
||||||
|
new_entity: EntityBuilder,
|
||||||
|
key: &str,
|
||||||
|
pos: SpawnType,
|
||||||
|
) -> Option<Entity> {
|
||||||
|
if raws.prop_index.contains_key(key) {
|
||||||
|
let prop_template = &raws.raws.props[raws.prop_index[key]];
|
||||||
|
|
||||||
|
let mut eb = new_entity;
|
||||||
|
|
||||||
|
// Spawn in the specified location
|
||||||
|
eb = spawn_position(pos, eb);
|
||||||
|
|
||||||
|
// Renderable
|
||||||
|
if let Some(renderable) = &prop_template.renderable {
|
||||||
|
eb = eb.with(get_renderable_component(renderable));
|
||||||
|
}
|
||||||
|
|
||||||
|
eb = eb.with(Name::from(&prop_template.name));
|
||||||
|
|
||||||
|
if let Some(hidden) = prop_template.hidden {
|
||||||
|
if hidden {
|
||||||
|
eb = eb.with(Hidden {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(blocks_tile) = prop_template.blocks_tile {
|
||||||
|
if blocks_tile {
|
||||||
|
eb = eb.with(BlocksTile {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(blocks_visibility) = prop_template.blocks_visibility {
|
||||||
|
if blocks_visibility {
|
||||||
|
eb = eb.with(BlocksVisibility {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(door_open) = prop_template.door_open {
|
||||||
|
eb = eb.with(Door { open: door_open });
|
||||||
|
}
|
||||||
|
if let Some(entry_trigger) = &prop_template.entry_trigger {
|
||||||
|
eb = eb.with(EntryTrigger {});
|
||||||
|
for effect in entry_trigger.effects.iter() {
|
||||||
|
match effect.0.as_str() {
|
||||||
|
"damage" => {
|
||||||
|
eb = eb.with(InflictsDamage {
|
||||||
|
damage: effect.1.parse::<i32>().unwrap(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
"single_activation" => eb = eb.with(SingleActivation {}),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Some(eb.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
pub fn spawn_named_entity(
|
pub fn spawn_named_entity(
|
||||||
raws: &RawMaster,
|
raws: &RawMaster,
|
||||||
new_entity: EntityBuilder,
|
new_entity: EntityBuilder,
|
||||||
@ -208,6 +274,8 @@ pub fn spawn_named_entity(
|
|||||||
return spawn_named_item(raws, new_entity, key, pos);
|
return spawn_named_item(raws, new_entity, key, pos);
|
||||||
} else if raws.mob_index.contains_key(key) {
|
} else if raws.mob_index.contains_key(key) {
|
||||||
return spawn_named_mob(raws, new_entity, key, pos);
|
return spawn_named_mob(raws, new_entity, key, pos);
|
||||||
|
} else if raws.prop_index.contains_key(key) {
|
||||||
|
return spawn_named_prop(raws, new_entity, key, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
None
|
None
|
||||||
|
@ -143,44 +143,8 @@ pub fn spawn_entity(ecs: &mut World, spawn: &(&usize, &String)) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
match spawn.1.as_ref() {
|
rltk::console::log(format!(
|
||||||
"Bear Trap" => bear_trap(ecs, x, y),
|
"WARNING: We don't know how to spawn [{}]!",
|
||||||
"Door" => door(ecs, x, y),
|
spawn.1
|
||||||
_ => {}
|
));
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bear_trap(ecs: &mut World, x: i32, y: i32) {
|
|
||||||
ecs.create_entity()
|
|
||||||
.with(Position { x, y })
|
|
||||||
.with(Renderable {
|
|
||||||
glyph: rltk::to_cp437('^'),
|
|
||||||
fg: RGB::named(rltk::RED),
|
|
||||||
bg: RGB::named(rltk::BLACK),
|
|
||||||
render_order: 2,
|
|
||||||
})
|
|
||||||
.with(Name::from("Bear Trap"))
|
|
||||||
.with(Hidden {})
|
|
||||||
.with(EntryTrigger {})
|
|
||||||
.with(InflictsDamage { damage: 6 })
|
|
||||||
.with(SingleActivation {})
|
|
||||||
.marked::<SimpleMarker<SerializeMe>>()
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn door(ecs: &mut World, x: i32, y: i32) {
|
|
||||||
ecs.create_entity()
|
|
||||||
.with(Position { x, y })
|
|
||||||
.with(Renderable {
|
|
||||||
glyph: rltk::to_cp437('+'),
|
|
||||||
fg: RGB::named(rltk::CHOCOLATE),
|
|
||||||
bg: RGB::named(rltk::BLACK),
|
|
||||||
render_order: 2,
|
|
||||||
})
|
|
||||||
.with(Name::from("Door"))
|
|
||||||
.with(BlocksTile {})
|
|
||||||
.with(BlocksVisibility {})
|
|
||||||
.with(Door { open: false })
|
|
||||||
.marked::<SimpleMarker<SerializeMe>>()
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user