cleans up chatlog colours - renderables for non-item, beatitude for item

This commit is contained in:
Llywelwyn 2023-08-27 22:26:58 +01:00
parent 96e69d5c5e
commit 038e616500
8 changed files with 145 additions and 72 deletions

View file

@ -22,7 +22,12 @@ pub fn get_local_desc(id: i32) -> String {
pub fn get_local_col(id: i32) -> RGB {
let col = match id {
ID_TOWN => TO_TOWN_COLOUR,
ID_OVERMAP => TO_OVERMAP_COLOUR,
_ => (255, 255, 255),
};
return RGB::from_u8(col.0, col.1, col.2);
}
pub fn rgb_to_u8(col: RGB) -> (u8, u8, u8) {
return ((col.r * 255.0) as u8, (col.g * 255.0) as u8, (col.b * 255.0) as u8);
}

View file

@ -55,47 +55,4 @@ impl Logger {
pub fn log(self) {
return append_entry(self.fragments);
}
/// Appends text in YELLOW to the current message logger.
#[allow(unused)]
pub fn npc_name<T: ToString>(mut self, text: T) -> Self {
let mut text_with_space = text.to_string();
text_with_space.push_str(" ");
self.fragments.push(LogFragment { colour: RGB::named(rltk::YELLOW), text: text_with_space });
return self;
}
/// Appends text in YELLOW to the current message logger, with no space.
pub fn npc_name_n<T: ToString>(mut self, text: T) -> Self {
self.fragments.push(LogFragment { colour: RGB::named(rltk::YELLOW), text: text.to_string() });
return self;
}
/// Appends text in CYAN to the current message logger.
pub fn item_name<T: ToString>(mut self, text: T) -> Self {
let mut text_with_space = text.to_string();
text_with_space.push_str(" ");
self.fragments.push(LogFragment { colour: RGB::named(rltk::CYAN), text: text_with_space });
return self;
}
/// Appends text in CYAN to the current message logger, with no space.
pub fn item_name_n<T: ToString>(mut self, text: T) -> Self {
self.fragments.push(LogFragment { colour: RGB::named(rltk::CYAN), text: text.to_string() });
return self;
}
/// Appends text in RED to the current message logger.
#[allow(dead_code)]
pub fn damage(mut self, damage: i32) -> Self {
self.fragments.push(LogFragment { colour: RGB::named(rltk::RED), text: format!("{} ", damage).to_string() });
return self;
}
/// Appends text in RED to the current message logger, with no space.
#[allow(dead_code)]
pub fn damage_n(mut self, damage: i32) -> Self {
self.fragments.push(LogFragment { colour: RGB::named(rltk::RED), text: format!("{}", damage).to_string() });
return self;
}
}

View file

@ -599,6 +599,15 @@ pub fn renderable_colour(renderables: &ReadStorage<Renderable>, entity: Entity)
};
}
/// Gets renderable colour as tuple of u8
pub fn renderable_colour_ecs(ecs: &World, entity: Entity) -> (u8, u8, u8) {
return if let Some(renderable) = ecs.read_storage::<Renderable>().get(entity) {
((renderable.fg.r * 255.0) as u8, (renderable.fg.g * 255.0) as u8, (renderable.fg.b * 255.0) as u8)
} else {
WHITE
};
}
pub fn item_colour_ecs(ecs: &World, item: Entity) -> (u8, u8, u8) {
if let Some(beatitude) = ecs.read_storage::<Beatitude>().get(item) {
if beatitude.known {

View file

@ -1,6 +1,7 @@
use crate::{
gamelog,
gui::obfuscate_name,
gui::item_colour,
Beatitude,
Charges,
EquipmentChanged,
@ -11,6 +12,7 @@ use crate::{
ObfuscatedName,
Position,
WantsToPickupItem,
Renderable,
};
use specs::prelude::*;
use crate::data::messages;
@ -59,7 +61,8 @@ impl<'a> System<'a> for ItemCollectionSystem {
gamelog::Logger
::new()
.append(messages::YOU_PICKUP_ITEM)
.item_name_n(
.colour(item_colour(pickup.item, &beatitudes))
.append_n(
format!(
"{}",
obfuscate_name(
@ -73,6 +76,7 @@ impl<'a> System<'a> for ItemCollectionSystem {
).0
)
)
.colour(rltk::WHITE)
.period()
.log();
}

View file

@ -1,6 +1,7 @@
use crate::{
gamelog,
gui::obfuscate_name,
gui::item_colour,
Beatitude,
Charges,
EquipmentChanged,
@ -67,7 +68,8 @@ impl<'a> System<'a> for ItemDropSystem {
gamelog::Logger
::new()
.append(messages::YOU_DROP_ITEM)
.item_name_n(
.colour(item_colour(to_drop.item, &beatitudes))
.append_n(
format!(
"{}",
obfuscate_name(
@ -81,6 +83,7 @@ impl<'a> System<'a> for ItemDropSystem {
).0
)
)
.colour(rltk::WHITE)
.period()
.log();
}

View file

@ -1,6 +1,7 @@
use rltk::{ GameState, Point, RandomNumberGenerator, Rltk };
use specs::prelude::*;
use specs::saveload::{ SimpleMarker, SimpleMarkerAllocator };
use crate::data::ids::*;
extern crate serde;
pub mod camera;
@ -175,7 +176,14 @@ impl State {
map::dungeon::freeze_entities(&mut self.ecs);
self.generate_world_map(id, dest_tile);
let mapname = self.ecs.fetch::<Map>().name.clone();
gamelog::Logger::new().append("You head to").npc_name_n(&mapname).period().log();
gamelog::Logger
::new()
.append("You head to")
.colour(rgb_to_u8(get_local_col(id)))
.append_n(&mapname)
.colour(rltk::WHITE)
.period()
.log();
gamelog::record_event(EVENT::CHANGED_FLOOR(mapname));
}
@ -315,7 +323,7 @@ impl GameState for State {
let player = self.ecs.fetch::<Entity>();
let mut pools = self.ecs.write_storage::<Pools>();
let mut player_pools = pools.get_mut(*player).unwrap();
gamelog::Logger::new().item_name("TOGGLED GOD MODE!").log();
gamelog::Logger::new().append("TOGGLED GOD MODE!").log();
player_pools.god = !player_pools.god;
new_runstate = RunState::AwaitingInput;
}

View file

@ -2,7 +2,8 @@ use super::{
effects::{ add_effect, EffectType, Targets },
gamelog,
gui::obfuscate_name_ecs,
gui::renderable_colour,
gui::renderable_colour_ecs,
gui::item_colour_ecs,
raws::Reaction,
Attributes,
BlocksTile,
@ -50,7 +51,6 @@ pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState {
let mut doors = ecs.write_storage::<Door>();
let mut blocks_visibility = ecs.write_storage::<BlocksVisibility>();
let mut blocks_movement = ecs.write_storage::<BlocksTile>();
let mut renderables = ecs.write_storage::<Renderable>();
let names = ecs.read_storage::<Name>();
let mut rng = ecs.write_resource::<RandomNumberGenerator>();
@ -82,13 +82,28 @@ pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState {
let door = doors.get_mut(potential_target);
if let Some(door) = door {
if door.open == true {
let renderables = ecs.read_storage::<Renderable>();
if multiple_tile_content {
if let Some(name) = names.get(potential_target) {
gamelog::Logger::new().append("The").item_name(&name.name).append("is blocked.").log();
gamelog::Logger
::new()
.append("The")
.colour(renderable_colour_ecs(ecs, potential_target))
.append(&name.name)
.colour(WHITE)
.append("is blocked.")
.log();
}
} else if rng.roll_dice(1, 6) + attributes.strength.bonus < 2 {
if let Some(name) = names.get(potential_target) {
gamelog::Logger::new().append("The").item_name(&name.name).append("resists!").log();
gamelog::Logger
::new()
.append("The")
.colour(renderable_colour_ecs(ecs, potential_target))
.append(&name.name)
.colour(WHITE)
.append("resists!")
.log();
}
} else {
door.open = false;
@ -98,10 +113,20 @@ pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState {
blocks_movement
.insert(potential_target, BlocksTile {})
.expect("Unable to insert BlocksTile.");
let render_data = renderables.get_mut(potential_target).unwrap();
if let Some(name) = names.get(potential_target) {
gamelog::Logger::new().append("You close the").item_name_n(&name.name).period().log();
gamelog::Logger
::new()
.append("You close the")
.colour(renderable_colour_ecs(ecs, potential_target))
.append_n(&name.name)
.colour(WHITE)
.period()
.log();
}
//Re-get renderables as mutable
std::mem::drop(renderables);
let mut renderables = ecs.write_storage::<Renderable>();
let render_data = renderables.get_mut(potential_target).unwrap();
render_data.glyph = rltk::to_cp437('+'); // Nethack open door, maybe just use '/' instead.
door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y));
}
@ -138,7 +163,6 @@ pub fn open(i: i32, j: i32, ecs: &mut World) -> RunState {
let mut doors = ecs.write_storage::<Door>();
let mut blocks_visibility = ecs.write_storage::<BlocksVisibility>();
let mut blocks_movement = ecs.write_storage::<BlocksTile>();
let mut renderables = ecs.write_storage::<Renderable>();
let names = ecs.read_storage::<Name>();
let mut rng = ecs.write_resource::<RandomNumberGenerator>();
@ -166,18 +190,35 @@ pub fn open(i: i32, j: i32, ecs: &mut World) -> RunState {
let door = doors.get_mut(potential_target);
if let Some(door) = door {
if door.open == false {
let renderables = ecs.read_storage::<Renderable>();
if rng.roll_dice(1, 6) + attributes.strength.bonus < 2 {
if let Some(name) = names.get(potential_target) {
gamelog::Logger::new().append("The").item_name(&name.name).append("resists!").log();
gamelog::Logger
::new()
.append("The")
.colour(renderable_colour_ecs(ecs, potential_target))
.append(&name.name)
.colour(WHITE)
.append("resists!")
.log();
}
} else {
door.open = true;
blocks_visibility.remove(potential_target);
blocks_movement.remove(potential_target);
let render_data = renderables.get_mut(potential_target).unwrap();
if let Some(name) = names.get(potential_target) {
gamelog::Logger::new().append("You open the").item_name_n(&name.name).period().log();
gamelog::Logger
::new()
.append("You open the")
.colour(renderable_colour_ecs(ecs, potential_target))
.append_n(&name.name)
.colour(WHITE)
.period()
.log();
}
std::mem::drop(renderables);
let mut renderables = ecs.write_storage::<Renderable>();
let render_data = renderables.get_mut(potential_target).unwrap();
render_data.glyph = rltk::to_cp437('▓'); // Nethack open door, maybe just use '/' instead.
door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y));
}
@ -212,7 +253,6 @@ pub fn kick(i: i32, j: i32, ecs: &mut World) -> RunState {
let mut viewsheds = ecs.write_storage::<Viewshed>();
let attributes = ecs.read_storage::<Attributes>();
let map = ecs.fetch::<Map>();
let entities = ecs.entities();
let mut doors = ecs.write_storage::<Door>();
let names = ecs.read_storage::<Name>();
@ -245,10 +285,17 @@ pub fn kick(i: i32, j: i32, ecs: &mut World) -> RunState {
} else {
let mut last_non_door_target: Option<Entity> = None;
let mut target_name = "thing";
let mut colour = WHITE;
crate::spatial::for_each_tile_content_with_bool(destination_idx, |potential_target| {
if let Some(name) = names.get(potential_target) {
target_name = &name.name;
}
let items = ecs.read_storage::<Item>();
colour = if let Some(_) = items.get(potential_target) {
item_colour_ecs(ecs, potential_target)
} else {
renderable_colour_ecs(ecs, potential_target)
};
// If it's a door,
let door = doors.get_mut(potential_target);
@ -262,7 +309,9 @@ pub fn kick(i: i32, j: i32, ecs: &mut World) -> RunState {
gamelog::Logger
::new()
.append("As you kick the")
.item_name_n(target_name)
.colour(colour)
.append_n(obfuscate_name_ecs(ecs, potential_target).0)
.colour(WHITE)
.append(", it crashes open!")
.log();
something_was_destroyed = Some(potential_target);
@ -274,7 +323,9 @@ pub fn kick(i: i32, j: i32, ecs: &mut World) -> RunState {
gamelog::Logger
::new()
.append("You kick the")
.item_name_n(target_name)
.colour(colour)
.append_n(obfuscate_name_ecs(ecs, potential_target).0)
.colour(WHITE)
.period()
.log();
return false;
@ -290,8 +341,15 @@ pub fn kick(i: i32, j: i32, ecs: &mut World) -> RunState {
}
return true;
});
if let Some(_) = last_non_door_target {
gamelog::Logger::new().append("You kick the").item_name_n(target_name).period().log();
if let Some(e) = last_non_door_target {
gamelog::Logger
::new()
.append("You kick the")
.colour(colour)
.append_n(obfuscate_name_ecs(ecs, e).0)
.colour(WHITE)
.period()
.log();
let mut particle_builder = ecs.write_resource::<ParticleBuilder>();
particle_builder.kick(pos.x + delta_x, pos.y + delta_y);
// Do something here if it's anything other than a door.
@ -383,7 +441,19 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) -> RunState
if let Some(door) = door {
if door.open == false {
if let Some(name) = names.get(potential_target) {
gamelog::Logger::new().append("The").item_name(&name.name).append("is in your way.").log();
let colour = if let Some(_) = ecs.read_storage::<Item>().get(potential_target) {
item_colour_ecs(ecs, potential_target)
} else {
renderable_colour_ecs(ecs, potential_target)
};
gamelog::Logger
::new()
.append("The")
.colour(colour)
.append_n(&name.name)
.colour(WHITE)
.append("is in your way.")
.log();
}
return Some(RunState::AwaitingInput);
}
@ -402,12 +472,13 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) -> RunState
}
let hidden = ecs.read_storage::<Hidden>();
// Push every entity name in the pile to a vector of strings
let mut item_names: Vec<String> = Vec::new();
let mut seen_items: Vec<(String, (u8, u8, u8))> = Vec::new();
let mut some = false;
crate::spatial::for_each_tile_content(destination_idx, |entity| {
if !hidden.get(entity).is_some() && names.get(entity).is_some() {
let item_name = obfuscate_name_ecs(ecs, entity).0;
item_names.push(item_name);
let item_colour = item_colour_ecs(ecs, entity);
seen_items.push((item_name, item_colour));
some = true;
}
});
@ -417,11 +488,11 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) -> RunState
// that it shouldn't matter.
if some {
let mut logger = gamelog::Logger::new().append("You see a");
for i in 0..item_names.len() {
if i > 0 && i < item_names.len() {
for i in 0..seen_items.len() {
if i > 0 && i < seen_items.len() {
logger = logger.append(", a");
}
logger = logger.item_name_n(&item_names[i]);
logger = logger.colour(seen_items[i].1).append_n(&seen_items[i].0).colour(WHITE);
}
logger.period().log();
}
@ -448,11 +519,10 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) -> RunState
for m in swap_entities.iter() {
if let Some(name) = names.get(m.0) {
let renderables = ecs.read_storage::<Renderable>();
gamelog::Logger
::new()
.append("You swap places with the")
.colour(renderable_colour(&renderables, m.0))
.colour(renderable_colour_ecs(ecs, m.0))
.append_n(&name.name)
.colour(WHITE)
.period()

View file

@ -1,4 +1,17 @@
use super::{ gamelog, Blind, BlocksVisibility, Hidden, Map, Name, Player, Position, Telepath, Viewshed };
use super::{
gamelog,
Blind,
BlocksVisibility,
Hidden,
Map,
Name,
Player,
Position,
Telepath,
Viewshed,
Renderable,
gui::renderable_colour,
};
use rltk::{ FieldOfViewAlg::SymmetricShadowcasting, Point };
use specs::prelude::*;
@ -19,6 +32,7 @@ impl<'a> System<'a> for VisibilitySystem {
ReadStorage<'a, Name>,
ReadStorage<'a, Blind>,
ReadStorage<'a, BlocksVisibility>,
ReadStorage<'a, Renderable>,
);
fn run(&mut self, data: Self::SystemData) {
@ -34,6 +48,7 @@ impl<'a> System<'a> for VisibilitySystem {
names,
blind_entities,
blocks_visibility,
renderables,
) = data;
map.view_blocked.clear();
@ -82,7 +97,9 @@ impl<'a> System<'a> for VisibilitySystem {
gamelog::Logger
::new()
.append("You spot a")
.item_name_n(&name.name)
.colour(renderable_colour(&renderables, e))
.append_n(&name.name)
.colour(rltk::WHITE)
.period()
.log();
}