Added rtsim merchants to site2

This commit is contained in:
Joshua Barretto
2021-09-19 00:09:25 +01:00
parent bacb2aa504
commit e3ab8fc8ce
7 changed files with 80 additions and 26 deletions

View File

@ -137,7 +137,7 @@ impl assets::Asset for EntityConfig {
impl EntityConfig { impl EntityConfig {
pub fn from_asset_expect(asset_specifier: &str) -> Self { pub fn from_asset_expect(asset_specifier: &str) -> Self {
Self::load_owned(asset_specifier) Self::load_owned(asset_specifier)
.unwrap_or_else(|e| panic!("Failed to load {}. Error: {}", asset_specifier, e)) .unwrap_or_else(|e| panic!("Failed to load {}. Error: {:?}", asset_specifier, e))
} }
pub fn with_body(mut self, body: BodyBuilder) -> Self { pub fn with_body(mut self, body: BodyBuilder) -> Self {

View File

@ -31,6 +31,7 @@ pub enum RtSimEntityKind {
Random, Random,
Cultist, Cultist,
Villager, Villager,
Merchant,
} }
const BIRD_LARGE_ROSTER: &[comp::bird_large::Species] = &[ const BIRD_LARGE_ROSTER: &[comp::bird_large::Species] = &[
@ -79,13 +80,7 @@ impl Entity {
}, },
} }
}, },
RtSimEntityKind::Cultist => { RtSimEntityKind::Cultist | RtSimEntityKind::Villager | RtSimEntityKind::Merchant => {
let species = *(&comp::humanoid::ALL_SPECIES)
.choose(&mut self.rng(PERM_SPECIES))
.unwrap();
comp::humanoid::Body::random_with(&mut self.rng(PERM_BODY), &species).into()
},
RtSimEntityKind::Villager => {
let species = *(&comp::humanoid::ALL_SPECIES) let species = *(&comp::humanoid::ALL_SPECIES)
.choose(&mut self.rng(PERM_SPECIES)) .choose(&mut self.rng(PERM_SPECIES))
.unwrap(); .unwrap();
@ -109,14 +104,21 @@ impl Entity {
// is not used for RtSim as of now. // is not used for RtSim as of now.
pub fn get_adhoc_loadout( pub fn get_adhoc_loadout(
&self, &self,
world: &World,
index: &world::IndexOwned,
) -> fn(LoadoutBuilder, Option<&trade::SiteInformation>) -> LoadoutBuilder { ) -> fn(LoadoutBuilder, Option<&trade::SiteInformation>) -> LoadoutBuilder {
let body = self.get_body(); let body = self.get_body();
let kind = &self.kind; let kind = self.kind;
// give potions to traveler humanoids or return loadout as is otherwise // give potions to traveler humanoids or return loadout as is otherwise
if let (comp::Body::Humanoid(_), RtSimEntityKind::Random) = (body, kind) { match (body, kind) {
(comp::Body::Humanoid(_), RtSimEntityKind::Random) => {
|l, _| l.bag(ArmorSlot::Bag1, Some(make_potion_bag(100))) |l, _| l.bag(ArmorSlot::Bag1, Some(make_potion_bag(100)))
} else { },
|l, _| l (_, RtSimEntityKind::Merchant) => {
|l, trade| l.with_creator(world::site::settlement::merchant_loadout, trade)
},
_ => |l, _| l,
} }
} }
@ -666,7 +668,7 @@ impl Brain {
pub fn villager(home_id: Id<Site>) -> Self { pub fn villager(home_id: Id<Site>) -> Self {
Self { Self {
begin: None, begin: Some(home_id),
tgt: None, tgt: None,
route: Travel::Idle, route: Travel::Idle,
last_visited: None, last_visited: None,
@ -674,6 +676,18 @@ impl Brain {
} }
} }
pub fn merchant(home_id: Id<Site>) -> Self {
Self {
begin: Some(home_id),
tgt: None,
route: Travel::Idle,
last_visited: None,
memories: Vec::new(),
}
}
pub fn begin_site(&self) -> Option<Id<Site>> { self.begin }
pub fn add_memory(&mut self, memory: Memory) { self.memories.push(memory); } pub fn add_memory(&mut self, memory: Memory) { self.memories.push(memory); }
pub fn forget_enemy(&mut self, to_forget: &str) { pub fn forget_enemy(&mut self, to_forget: &str) {
@ -733,6 +747,7 @@ fn humanoid_config(kind: RtSimEntityKind) -> &'static str {
RtSimEntityKind::Cultist => "common.entity.dungeon.tier-5.cultist", RtSimEntityKind::Cultist => "common.entity.dungeon.tier-5.cultist",
RtSimEntityKind::Random => "common.entity.world.traveler", RtSimEntityKind::Random => "common.entity.world.traveler",
RtSimEntityKind::Villager => "common.loadout.village.villager", RtSimEntityKind::Villager => "common.loadout.village.villager",
RtSimEntityKind::Merchant => "common.loadout.village.merchant",
} }
} }

View File

@ -217,6 +217,29 @@ pub fn init(
brain: Brain::villager(site_id), brain: Brain::villager(site_id),
}); });
} }
for _ in 0..site2.plazas().len() * 3 {
rtsim.entities.insert(Entity {
is_loaded: false,
pos: site2
.plazas()
.choose(&mut thread_rng())
.map_or(site.get_origin(), |p| {
site2.tile_center_wpos(site2.plot(p).root_tile())
+ Vec2::new(
thread_rng().gen_range(-8..9),
thread_rng().gen_range(-8..9),
)
})
.with_z(0)
.map(|e| e as f32),
seed: thread_rng().gen(),
controller: RtSimController::default(),
last_time_ticked: 0.0,
kind: RtSimEntityKind::Merchant,
brain: Brain::merchant(site_id),
});
}
}, },
_ => {}, _ => {},
} }

View File

@ -129,7 +129,7 @@ impl<'a> System<'a> for Sys {
} else { } else {
let entity_config_path = entity.get_entity_config(); let entity_config_path = entity.get_entity_config();
let mut loadout_rng = entity.loadout_rng(); let mut loadout_rng = entity.loadout_rng();
let ad_hoc_loadout = entity.get_adhoc_loadout(); let ad_hoc_loadout = entity.get_adhoc_loadout(&world, &index);
// Body is rewritten so that body parameters // Body is rewritten so that body parameters
// are consistent between reifications // are consistent between reifications
let entity_config = EntityConfig::from_asset_expect(entity_config_path) let entity_config = EntityConfig::from_asset_expect(entity_config_path)

View File

@ -2,7 +2,7 @@ mod block_mask;
mod castle; mod castle;
pub mod economy; pub mod economy;
pub mod namegen; pub mod namegen;
mod settlement; pub mod settlement;
mod tree; mod tree;
// Reexports // Reexports
@ -120,6 +120,24 @@ impl Site {
} }
} }
pub fn trade_information(
&self,
site_id: common::trade::SiteId,
) -> Option<common::trade::SiteInformation> {
match &self.kind {
SiteKind::Settlement(s) => Some(common::trade::SiteInformation {
id: site_id,
unconsumed_stock: self
.economy
.unconsumed_stock
.iter()
.map(|(g, a)| (g.into(), *a))
.collect(),
}),
_ => None,
}
}
pub fn apply_to<'a>(&'a self, canvas: &mut Canvas, dynamic_rng: &mut impl Rng) { pub fn apply_to<'a>(&'a self, canvas: &mut Canvas, dynamic_rng: &mut impl Rng) {
let info = canvas.info(); let info = canvas.info();
let get_col = |wpos| info.col(wpos + info.wpos); let get_col = |wpos| info.col(wpos + info.wpos);
@ -143,15 +161,9 @@ impl Site {
) { ) {
match &self.kind { match &self.kind {
SiteKind::Settlement(s) => { SiteKind::Settlement(s) => {
let economy = common::trade::SiteInformation { let economy = self
id: site_id, .trade_information(site_id)
unconsumed_stock: self .expect("Settlement has no economy");
.economy
.unconsumed_stock
.iter()
.map(|(g, a)| (g.into(), *a))
.collect(),
};
s.apply_supplement(dynamic_rng, wpos2d, get_column, supplement, economy) s.apply_supplement(dynamic_rng, wpos2d, get_column, supplement, economy)
}, },
SiteKind::Dungeon(d) => d.apply_supplement(dynamic_rng, wpos2d, supplement), SiteKind::Dungeon(d) => d.apply_supplement(dynamic_rng, wpos2d, supplement),

View File

@ -1022,7 +1022,7 @@ fn humanoid(pos: Vec3<f32>, economy: &SiteInformation, dynamic_rng: &mut impl Rn
} }
} }
fn merchant_loadout( pub fn merchant_loadout(
loadout_builder: LoadoutBuilder, loadout_builder: LoadoutBuilder,
economy: Option<&trade::SiteInformation>, economy: Option<&trade::SiteInformation>,
) -> LoadoutBuilder { ) -> LoadoutBuilder {

View File

@ -79,6 +79,10 @@ impl Site {
pub fn plots(&self) -> impl ExactSizeIterator<Item = &Plot> + '_ { self.plots.values() } pub fn plots(&self) -> impl ExactSizeIterator<Item = &Plot> + '_ { self.plots.values() }
pub fn plazas(&self) -> impl ExactSizeIterator<Item = Id<Plot>> + '_ {
self.plazas.iter().copied()
}
pub fn create_plot(&mut self, plot: Plot) -> Id<Plot> { self.plots.insert(plot) } pub fn create_plot(&mut self, plot: Plot) -> Id<Plot> { self.plots.insert(plot) }
pub fn blit_aabr(&mut self, aabr: Aabr<i32>, tile: Tile) { pub fn blit_aabr(&mut self, aabr: Aabr<i32>, tile: Tile) {