Complete Section 5.15

This commit is contained in:
Timothy Warren 2022-01-12 11:12:59 -05:00
parent f9e73479d0
commit d5c48247f3
4 changed files with 38 additions and 11 deletions

View File

@ -8,8 +8,8 @@ use crate::components::{
use crate::game_log::GameLog; use crate::game_log::GameLog;
use crate::gamesystem::{mana_at_level, player_hp_at_level}; use crate::gamesystem::{mana_at_level, player_hp_at_level};
use crate::particle_system::ParticleBuilder; use crate::particle_system::ParticleBuilder;
use crate::raws::{get_item_drop, spawn_named_item, SpawnType, RAWS}; use crate::raws::{self, SpawnType, RAWS};
use crate::{Map, RunState}; use crate::{spatial, Map, RunState};
pub struct DamageSystem {} pub struct DamageSystem {}
@ -44,15 +44,20 @@ impl<'a> System<'a> for DamageSystem {
let mut xp_gain = 0; let mut xp_gain = 0;
for (entity, mut stats, damage) in (&entities, &mut stats, &damage).join() { for (entity, mut stats, damage) in (&entities, &mut stats, &damage).join() {
let pos = positions.get(entity);
for dmg in damage.amount.iter() { for dmg in damage.amount.iter() {
stats.hit_points.current -= dmg.0; stats.hit_points.current -= dmg.0;
if let Some(pos) = positions.get(entity) { if let Some(pos) = pos {
let idx = map.xy_idx(pos.x, pos.y); let idx = map.xy_idx(pos.x, pos.y);
map.bloodstains.insert(idx); map.bloodstains.insert(idx);
} }
if stats.hit_points.current < 1 && dmg.1 { if stats.hit_points.current < 1 && dmg.1 {
xp_gain += stats.level * 100; xp_gain += stats.level * 100;
if let Some(pos) = pos {
let idx = map.xy_idx(pos.x, pos.y);
spatial::remove_entity(entity, idx);
}
} }
} }
} }
@ -161,7 +166,7 @@ pub fn delete_the_dead(ecs: &mut World) {
if let Some(table) = loot_tables.get(*victim) { if let Some(table) = loot_tables.get(*victim) {
let drop_finder = let drop_finder =
get_item_drop(&crate::raws::RAWS.lock().unwrap(), &mut rng, &table.table); raws::get_item_drop(&crate::raws::RAWS.lock().unwrap(), &mut rng, &table.table);
if let Some(tag) = drop_finder { if let Some(tag) = drop_finder {
if let Some(pos) = pos { if let Some(pos) = pos {
to_spawn.push((tag, *pos)); to_spawn.push((tag, *pos));
@ -181,7 +186,7 @@ pub fn delete_the_dead(ecs: &mut World) {
{ {
for drop in to_spawn.iter() { for drop in to_spawn.iter() {
spawn_named_item( raws::spawn_named_item(
&RAWS.lock().unwrap(), &RAWS.lock().unwrap(),
ecs, ecs,
&drop.0, &drop.0,

View File

@ -1,6 +1,7 @@
use ::specs::prelude::*; use ::specs::prelude::*;
use crate::{spatial, BlocksTile, Map, Position}; use crate::components::{BlocksTile, Pools, Position};
use crate::{spatial, Map};
pub struct MapIndexingSystem {} pub struct MapIndexingSystem {}
@ -9,18 +10,28 @@ impl<'a> System<'a> for MapIndexingSystem {
ReadExpect<'a, Map>, ReadExpect<'a, Map>,
ReadStorage<'a, Position>, ReadStorage<'a, Position>,
ReadStorage<'a, BlocksTile>, ReadStorage<'a, BlocksTile>,
ReadStorage<'a, Pools>,
Entities<'a>, Entities<'a>,
); );
fn run(&mut self, data: Self::SystemData) { fn run(&mut self, data: Self::SystemData) {
let (map, position, blockers, entities) = data; let (map, position, blockers, pools, entities) = data;
spatial::clear(); spatial::clear();
spatial::populate_blocked_from_map(&*map); spatial::populate_blocked_from_map(&*map);
for (entity, position) in (&entities, &position).join() { for (entity, position) in (&entities, &position).join() {
let idx = map.xy_idx(position.x, position.y); let mut alive = true;
spatial::index_entity(entity, idx, blockers.get(entity).is_some()); if let Some(pools) = pools.get(entity) {
if pools.hit_points.current < 1 {
alive = false;
}
}
if alive {
let idx = map.xy_idx(position.x, position.y);
spatial::index_entity(entity, idx, blockers.get(entity).is_some());
}
} }
} }
} }

View File

@ -124,8 +124,7 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) -> RunState
} }
for m in swap_entities.iter() { for m in swap_entities.iter() {
let their_pos = positions.get_mut(m.0); if let Some(their_pos) = positions.get_mut(m.0) {
if let Some(their_pos) = their_pos {
let old_idx = map.xy_idx(their_pos.x, their_pos.y); let old_idx = map.xy_idx(their_pos.x, their_pos.y);
their_pos.x = m.1; their_pos.x = m.1;
their_pos.y = m.2; their_pos.y = m.2;

View File

@ -119,3 +119,15 @@ pub fn move_entity(entity: Entity, moving_from: usize, moving_to: usize) {
lock.blocked[moving_from].1 = from_blocked; lock.blocked[moving_from].1 = from_blocked;
lock.blocked[moving_to].1 = to_blocked; lock.blocked[moving_to].1 = to_blocked;
} }
pub fn remove_entity(entity: Entity, idx: usize) {
let mut lock = SPATIAL_MAP.lock().unwrap();
lock.tile_content[idx].retain(|(e, _)| *e != entity);
let mut from_blocked = false;
lock.tile_content[idx].iter().for_each(|(_, blocks)| {
if *blocks {
from_blocked = true;
}
});
lock.blocked[idx].1 = from_blocked;
}