Add vendor NPC type

This commit is contained in:
Timothy Warren 2022-01-03 09:39:52 -05:00
parent e93573f3a0
commit 45bedf11d2
6 changed files with 17 additions and 7 deletions

View File

@ -265,7 +265,7 @@
"power": 4
},
"vision_range": 4,
"ai": "bystander"
"ai": "vendor"
},
{
"name": "Shady Salesman",
@ -283,7 +283,7 @@
"power": 4
},
"vision_range": 4,
"ai": "bystander"
"ai": "vendor"
},
{
"name": "Patron",
@ -355,7 +355,7 @@
"power": 4
},
"vision_range": 4,
"ai": "bystander"
"ai": "vendor"
},
{
"name": "Clothier",
@ -373,7 +373,7 @@
"power": 4
},
"vision_range": 4,
"ai": "bystander"
"ai": "vendor"
},
{
"name": "Alchemist",
@ -391,7 +391,7 @@
"power": 4
},
"vision_range": 4,
"ai": "bystander"
"ai": "vendor"
},
{
"name": "Mom",

View File

@ -240,6 +240,9 @@ pub struct Door {
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
pub struct Bystander {}
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
pub struct Vendor {}
// Serialization helper code. We need to implement ConvertSaveLoad for each type that contains an
// Entity.

View File

@ -534,6 +534,7 @@ fn main() -> ::rltk::BError {
BlocksVisibility,
Door,
Bystander,
Vendor,
);
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());

View File

@ -5,7 +5,7 @@ use ::specs::prelude::*;
use crate::components::{
BlocksTile, BlocksVisibility, CombatStats, Door, EntityMoved, HungerClock, HungerState, Item,
Monster, Player, Position, Renderable, Viewshed, WantsToMelee, WantsToPickupItem,
Monster, Player, Position, Renderable, Vendor, Viewshed, WantsToMelee, WantsToPickupItem,
};
use crate::game_log::GameLog;
use crate::{Bystander, Map, RunState, State, TileType};
@ -24,6 +24,7 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) {
let mut blocks_movement = ecs.write_storage::<BlocksTile>();
let mut renderables = ecs.write_storage::<Renderable>();
let bystanders = ecs.read_storage::<Bystander>();
let vendors = ecs.read_storage::<Vendor>();
let mut swap_entities: Vec<(Entity, i32, i32)> = Vec::new();
@ -40,7 +41,9 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) {
let destination_idx = map.xy_idx(pos.x + delta_x, pos.y + delta_y);
for potential_target in map.tile_content[destination_idx].iter() {
if bystanders.get(*potential_target).is_some() {
let bystander = bystanders.get(*potential_target);
let vendor = vendors.get(*potential_target);
if bystander.is_some() || vendor.is_some() {
// Note that we want to move the bystander
swap_entities.push((*potential_target, pos.x, pos.y));

View File

@ -215,6 +215,7 @@ pub fn spawn_named_mob(
match mob_template.ai.as_ref() {
"melee" => eb = eb.with(Monster {}),
"bystander" => eb = eb.with(Bystander {}),
"vendor" => eb = eb.with(Vendor {}),
_ => {}
};

View File

@ -90,6 +90,7 @@ pub fn save_game(ecs: &mut World) {
BlocksVisibility,
Door,
Bystander,
Vendor,
);
}
@ -182,6 +183,7 @@ pub fn load_game(ecs: &mut World) {
BlocksVisibility,
Door,
Bystander,
Vendor,
);
}