various fixes: moved turnloss handling into energy system, anims
This commit is contained in:
parent
7b5cd0ec70
commit
1b12d70b23
11 changed files with 235 additions and 53 deletions
|
|
@ -1,5 +1,16 @@
|
|||
use crate::data::entity::*;
|
||||
use crate::{ Burden, BurdenLevel, Clock, Energy, Name, Position, RunState, Map, TakingTurn };
|
||||
use crate::{
|
||||
Burden,
|
||||
BurdenLevel,
|
||||
Clock,
|
||||
Energy,
|
||||
Name,
|
||||
Position,
|
||||
RunState,
|
||||
Map,
|
||||
TakingTurn,
|
||||
Confusion,
|
||||
};
|
||||
use rltk::prelude::*;
|
||||
use specs::prelude::*;
|
||||
use crate::config::CONFIG;
|
||||
|
|
@ -24,6 +35,7 @@ impl<'a> System<'a> for EnergySystem {
|
|||
ReadExpect<'a, Entity>,
|
||||
ReadStorage<'a, Name>,
|
||||
ReadExpect<'a, Point>,
|
||||
ReadStorage<'a, Confusion>,
|
||||
);
|
||||
|
||||
fn run(&mut self, data: Self::SystemData) {
|
||||
|
|
@ -40,6 +52,7 @@ impl<'a> System<'a> for EnergySystem {
|
|||
player,
|
||||
names,
|
||||
player_pos,
|
||||
confusion,
|
||||
) = data;
|
||||
// If not ticking, do nothing.
|
||||
if *runstate != RunState::Ticking {
|
||||
|
|
@ -51,17 +64,29 @@ impl<'a> System<'a> for EnergySystem {
|
|||
for (entity, _clock, energy) in (&entities, &clock, &mut energies).join() {
|
||||
energy.current += NORMAL_SPEED;
|
||||
if energy.current >= TURN_COST {
|
||||
turns.insert(entity, TakingTurn {}).expect("Unable to insert turn for turn counter.");
|
||||
turns
|
||||
.insert(entity, TakingTurn {})
|
||||
.expect("Unable to insert turn for turn counter.");
|
||||
energy.current -= TURN_COST;
|
||||
crate::gamelog::record_event(EVENT::TURN(1));
|
||||
// Handle spawning mobs each turn
|
||||
if CONFIG.logging.log_ticks {
|
||||
console::log(format!("===== TURN {} =====", crate::gamelog::get_event_count(EVENT::COUNT_TURN)));
|
||||
console::log(
|
||||
format!(
|
||||
"===== TURN {} =====",
|
||||
crate::gamelog::get_event_count(EVENT::COUNT_TURN)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
// EVERYTHING ELSE
|
||||
for (entity, energy, pos) in (&entities, &mut energies, &positions).join() {
|
||||
for (entity, energy, pos, _c) in (
|
||||
&entities,
|
||||
&mut energies,
|
||||
&positions,
|
||||
!&confusion,
|
||||
).join() {
|
||||
let burden_modifier = if let Some(burden) = burdens.get(entity) {
|
||||
match burden.level {
|
||||
BurdenLevel::Burdened => SPEED_MOD_BURDENED,
|
||||
|
|
@ -73,7 +98,9 @@ impl<'a> System<'a> for EnergySystem {
|
|||
};
|
||||
let overmap_mod = if map.overmap { SPEED_MOD_OVERMAP_TRAVEL } else { 1.0 };
|
||||
// Every entity has a POTENTIAL equal to their speed.
|
||||
let mut energy_potential: i32 = ((energy.speed as f32) * burden_modifier * overmap_mod) as i32;
|
||||
let mut energy_potential: i32 = ((energy.speed as f32) *
|
||||
burden_modifier *
|
||||
overmap_mod) as i32;
|
||||
// Increment current energy by NORMAL_SPEED for every
|
||||
// whole number of NORMAL_SPEEDS in their POTENTIAL.
|
||||
while energy_potential >= NORMAL_SPEED {
|
||||
|
|
@ -99,7 +126,10 @@ impl<'a> System<'a> for EnergySystem {
|
|||
if entity == *player {
|
||||
*runstate = RunState::AwaitingInput;
|
||||
} else {
|
||||
let distance = rltk::DistanceAlg::Pythagoras.distance2d(*player_pos, Point::new(pos.x, pos.y));
|
||||
let distance = rltk::DistanceAlg::Pythagoras.distance2d(
|
||||
*player_pos,
|
||||
Point::new(pos.x, pos.y)
|
||||
);
|
||||
if distance > 20.0 {
|
||||
my_turn = false;
|
||||
}
|
||||
|
|
@ -107,9 +137,17 @@ impl<'a> System<'a> for EnergySystem {
|
|||
if my_turn {
|
||||
turns.insert(entity, TakingTurn {}).expect("Unable to insert turn.");
|
||||
if CONFIG.logging.log_ticks {
|
||||
let name = if let Some(name) = names.get(entity) { &name.name } else { "Unknown entity" };
|
||||
let name = if let Some(name) = names.get(entity) {
|
||||
&name.name
|
||||
} else {
|
||||
"Unknown entity"
|
||||
};
|
||||
console::log(
|
||||
format!("ENERGY SYSTEM: {} granted a turn. [leftover energy: {}].", name, energy.current)
|
||||
format!(
|
||||
"ENERGY SYSTEM: {} granted a turn. [leftover energy: {}].",
|
||||
name,
|
||||
energy.current
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@ use crate::{
|
|||
Name,
|
||||
Renderable,
|
||||
TakingTurn,
|
||||
Item,
|
||||
Prop,
|
||||
};
|
||||
use rltk::prelude::*;
|
||||
use specs::prelude::*;
|
||||
|
|
@ -24,10 +26,22 @@ impl<'a> System<'a> for TurnStatusSystem {
|
|||
ReadStorage<'a, Name>,
|
||||
ReadExpect<'a, Entity>,
|
||||
ReadStorage<'a, Renderable>,
|
||||
ReadStorage<'a, Item>,
|
||||
ReadStorage<'a, Prop>,
|
||||
);
|
||||
|
||||
fn run(&mut self, data: Self::SystemData) {
|
||||
let (mut turns, clock, mut confusion, entities, names, player_entity, renderables) = data;
|
||||
let (
|
||||
mut turns,
|
||||
clock,
|
||||
mut confusion,
|
||||
entities,
|
||||
names,
|
||||
player_entity,
|
||||
renderables,
|
||||
items,
|
||||
props,
|
||||
) = data;
|
||||
let mut clock_tick = false;
|
||||
for (_e, _c, _t) in (&entities, &clock, &turns).join() {
|
||||
clock_tick = true;
|
||||
|
|
@ -39,7 +53,13 @@ impl<'a> System<'a> for TurnStatusSystem {
|
|||
let mut log = false;
|
||||
let mut not_my_turn: Vec<Entity> = Vec::new();
|
||||
let mut not_confused: Vec<Entity> = Vec::new();
|
||||
for (entity, _turn, confused, name) in (&entities, &mut turns, &mut confusion, &names).join() {
|
||||
for (entity, confused, name, _i, _p) in (
|
||||
&entities,
|
||||
&mut confusion,
|
||||
&names,
|
||||
!&items,
|
||||
!&props,
|
||||
).join() {
|
||||
confused.turns -= 1;
|
||||
if confused.turns < 1 {
|
||||
not_confused.push(entity);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue