diff --git a/raws/props.json b/raws/props.json index 0c48291..d72c5fd 100644 --- a/raws/props.json +++ b/raws/props.json @@ -21,7 +21,7 @@ { "id": "prop_table", "name": "table", - "renderable": { "glyph": "-", "fg": "#AAAAAA", "bg": "#000000", "order": 2 }, + "renderable": { "glyph": "-", "sprite": 52, "fg": "#AAAAAA", "bg": "#000000", "order": 2 }, "flags": [] }, { @@ -33,25 +33,25 @@ { "id": "prop_statue", "name": "statue", - "renderable": { "glyph": "@", "fg": "#ffffff", "bg": "#000000", "order": 2 }, + "renderable": { "glyph": "@", "sprite": 29, "fg": "#ffffff", "bg": "#000000", "order": 2 }, "flags": [] }, { "id": "prop_bed", "name": "bed", - "renderable": { "glyph": "=", "fg": "#AAAAAA", "bg": "#000000", "order": 2 }, + "renderable": { "glyph": "=", "sprite": 50, "fg": "#AAAAAA", "bg": "#000000", "order": 2 }, "flags": [] }, { "id": "prop_chair", "name": "chair", - "renderable": { "glyph": "└", "fg": "#AAAAAA", "bg": "#000000", "order": 2 }, + "renderable": { "glyph": "└", "sprite": 51, "fg": "#AAAAAA", "bg": "#000000", "order": 2 }, "flags": [] }, { "id": "prop_candle", "name": "candle", - "renderable": { "glyph": "Ä", "fg": "#FFA500", "bg": "#000000", "order": 2 }, + "renderable": { "glyph": "Ä", "sprite": 3, "fg": "#FFA500", "bg": "#000000", "order": 2 }, "flags": [] }, { diff --git a/src/camera.rs b/src/camera.rs index dac8075..15d24b5 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -132,13 +132,29 @@ pub fn render_camera(ecs: &World, ctx: &mut BTerm) { } } if draw { - ctx.set( - entity_offset_x + x_offset, - entity_offset_y + y_offset, - fg, - bg, - render.glyph - ); + if let Some(sprite) = render.sprite { + ctx.set_active_console(0); + ctx.add_sprite( + Rect::with_size( + entity_offset_x * 16 + x_offset * 16, + entity_offset_y * 16 + y_offset * 16, + 16, + 16 + ), + render.render_order, + RGBA::named(WHITE), + sprite + ); + ctx.set_active_console(ENTITY_LAYER); + } else { + ctx.set( + entity_offset_x + x_offset, + entity_offset_y + y_offset, + fg, + bg, + render.glyph + ); + } if let Some(pool) = pools.get(*ent) { if pool.hit_points.current < pool.hit_points.max { ctx.set_active_console(HP_BAR_LAYER); diff --git a/src/components.rs b/src/components.rs index 8c56cce..b489abe 100644 --- a/src/components.rs +++ b/src/components.rs @@ -41,6 +41,7 @@ pub struct OtherLevelPosition { #[derive(Component, ConvertSaveload, Clone)] pub struct Renderable { pub glyph: FontCharType, + pub sprite: Option, pub fg: RGB, pub bg: RGB, pub render_order: i32, diff --git a/src/data/sprites.rs b/src/data/sprites.rs index 3fe4350..1b9d7bf 100644 --- a/src/data/sprites.rs +++ b/src/data/sprites.rs @@ -86,7 +86,7 @@ pub const LILYPAD8: usize = 79; // Row 6 (80-95) // Row 7 (96-111) // Row 8 (112-127) -pub const FLOOR_WOOD: usize = 123; +pub const FLOOR_WOOD: usize = 124; // Row 9 (128-143) // Row 10 (144-159) // Row 11 (160-175) diff --git a/src/effects/damage.rs b/src/effects/damage.rs index 80885e2..74d1178 100644 --- a/src/effects/damage.rs +++ b/src/effects/damage.rs @@ -184,7 +184,7 @@ fn get_death_message(ecs: &World, source: Entity) -> String { result.push_str(format!("{}", PLAYER_DIED_SUICIDE).as_str()); } else if let Some(name) = ecs.read_storage::().get(source) { result.push_str( - format!("{} {}", PLAYER_DIED_NAMED_ATTACKER, with_article(name.name.clone())).as_str() + format!("{} {}", PLAYER_DIED_NAMED_ATTACKER, with_article(&name.name)).as_str() ); } else { result.push_str(format!("{}", PLAYER_DIED_UNKNOWN).as_str()); diff --git a/src/gui/character_creation.rs b/src/gui/character_creation.rs index 2ad9e97..bc6e68e 100644 --- a/src/gui/character_creation.rs +++ b/src/gui/character_creation.rs @@ -273,6 +273,7 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) { renderables .insert(*player, Renderable { glyph: to_cp437(DWARF_GLYPH), + sprite: None, // TODO: Dwarf sprite fg: RGB::named(DWARF_COLOUR), bg: RGB::named(BLACK), render_order: 0, @@ -284,6 +285,7 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) { renderables .insert(*player, Renderable { glyph: to_cp437(ELF_GLYPH), + sprite: None, // TODO: Elf sprite fg: RGB::named(ELF_COLOUR), bg: RGB::named(BLACK), render_order: 0, @@ -309,6 +311,7 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) { renderables .insert(*player, Renderable { glyph: to_cp437(CATFOLK_GLYPH), + sprite: None, // TODO: Catfolk sprite fg: RGB::named(CATFOLK_COLOUR), bg: RGB::named(BLACK), render_order: 0, diff --git a/src/gui/mod.rs b/src/gui/mod.rs index 217a96e..35d427f 100644 --- a/src/gui/mod.rs +++ b/src/gui/mod.rs @@ -1553,7 +1553,7 @@ pub fn game_over(ctx: &mut BTerm) -> YesNoResult { } } -pub fn with_article(name: String) -> String { +pub fn with_article(name: &String) -> String { // If first letter is a capital if name.chars().nth(0).unwrap().is_uppercase() { return format!("{}", name); diff --git a/src/map/dungeon.rs b/src/map/dungeon.rs index 4407efa..ed0bf91 100644 --- a/src/map/dungeon.rs +++ b/src/map/dungeon.rs @@ -112,26 +112,7 @@ fn make_scroll_name(rng: &mut RandomNumberGenerator) -> String { return name; } -const POTION_COLOURS: &[&str] = &[ - "red", - "orange", - "yellow", - "green", - "blue", - "indigo", - "violet", - "black", - "white", - "silver", - "gold", - "rainbow", - "blood", - "purple", - "cyan", - "brown", - "grey", - "octarine", -]; +const POTION_COLOURS: &[&str] = &["blue", "red", "green", "yellow", "black"]; const POTION_ADJECTIVES: &[&str] = &[ "swirling", "viscous", diff --git a/src/particle_system.rs b/src/particle_system.rs index 69e12b7..b576984 100644 --- a/src/particle_system.rs +++ b/src/particle_system.rs @@ -81,6 +81,7 @@ fn create_delayed_particles(ecs: &mut World, ctx: &BTerm) { .expect("Could not insert position"); renderables .insert(p, Renderable { + sprite: None, // TODO: Particle sprite fg: handled.fg, bg: handled.bg, glyph: handled.glyph, @@ -306,6 +307,7 @@ impl<'a> System<'a> for ParticleSpawnSystem { .expect("Could not insert position"); renderables .insert(p, Renderable { + sprite: None, // TODO: Particle sprite fg: new_particle.fg, bg: new_particle.bg, glyph: new_particle.glyph, diff --git a/src/player.rs b/src/player.rs index dd8ecf3..22e09cd 100644 --- a/src/player.rs +++ b/src/player.rs @@ -39,6 +39,7 @@ use specs::prelude::*; use std::cmp::{ max, min }; use crate::data::events::*; use crate::data::ids::*; +use crate::gui::with_article; pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState { let mut positions = ecs.write_storage::(); @@ -560,11 +561,11 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) -> RunState let mut logger = gamelog::Logger::new().append("You see"); for i in 0..seen_items.len() { if i > 0 && i < seen_items.len() { - logger = logger.append(", a"); + logger = logger.append(", "); } logger = logger .colour(seen_items[i].1) - .append_n(&seen_items[i].0) + .append_n(with_article(&seen_items[i].0)) .colour(WHITE); } logger.period().log(); diff --git a/src/raws/item_structs.rs b/src/raws/item_structs.rs index 897d48d..1bd1a39 100644 --- a/src/raws/item_structs.rs +++ b/src/raws/item_structs.rs @@ -30,6 +30,7 @@ pub struct Equippable { #[derive(Deserialize, Debug)] pub struct Renderable { pub glyph: String, + pub sprite: Option, pub fg: String, pub bg: String, pub order: i32, diff --git a/src/raws/rawmaster.rs b/src/raws/rawmaster.rs index 813dbe2..d15b7c7 100644 --- a/src/raws/rawmaster.rs +++ b/src/raws/rawmaster.rs @@ -691,6 +691,11 @@ fn get_renderable_component( ) -> crate::components::Renderable { crate::components::Renderable { glyph: to_cp437(renderable.glyph.chars().next().unwrap()), + sprite: if let Some(sprite) = &renderable.sprite { + Some(sprite.clone()) + } else { + None + }, fg: RGB::from_hex(&renderable.fg).expect("Invalid RGB"), bg: RGB::from_hex(&renderable.bg).expect("Invalid RGB"), render_order: renderable.order, diff --git a/src/spawner.rs b/src/spawner.rs index 3fa673c..21a68b1 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -54,6 +54,7 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity { .with(BlocksTile {}) .with(Renderable { glyph: to_cp437('@'), + sprite: None, // TODO: Player sprite fg: RGB::named(YELLOW), bg: RGB::named(BLACK), render_order: 0,