From ae9f6b6ac6ea8f03942acc5ff00722aa034b6c07 Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Tue, 26 Sep 2023 22:08:05 +0100 Subject: [PATCH] proper alt sprite and render order swaps --- raws/props.json | 4 ++-- src/components.rs | 14 +++++++++++++- src/gui/character_creation.rs | 3 +++ src/particle_system.rs | 2 ++ src/player.rs | 22 +++++++++++++++------- src/raws/item_structs.rs | 1 + src/raws/rawmaster.rs | 5 +++++ src/spawner.rs | 1 + 8 files changed, 42 insertions(+), 10 deletions(-) diff --git a/raws/props.json b/raws/props.json index 18a913d..719b09c 100644 --- a/raws/props.json +++ b/raws/props.json @@ -8,8 +8,8 @@ { "id": "trapdoor", "name": "trapdoor", - "renderable": { "glyph": "+", "sprite": { "id": "trapdoor_closed", "alt": "trapdoor_open2", "colour": false, "alt_y": 1.0 }, "fg": "#00FFFF", "bg": "#000000", "order": 1 }, - "door": { "open": false, "locked": false, "blocks_vis": false, "blocks_move": true } + "renderable": { "glyph": "+", "sprite": { "id": "trapdoor_closed", "alt": "trapdoor_open2", "colour": false, "alt_y": 1.0 }, "fg": "#00FFFF", "bg": "#000000", "order": 5, "alt_order": 1 }, + "door": { "open": false, "locked": false, "blocks_vis": false, "blocks_move": false } }, { "id": "prop_altar", diff --git a/src/components.rs b/src/components.rs index 6917fb7..b728388 100644 --- a/src/components.rs +++ b/src/components.rs @@ -66,7 +66,7 @@ impl SpriteInfo { alt_offset: (0.0, 0.0), } } - pub fn swap(&self) -> Self { + fn swap(&self) -> Self { if let Some(alt_sprite) = &self.alt { Self { id: alt_sprite.clone(), @@ -88,6 +88,7 @@ pub struct Renderable { pub fg: RGB, pub bg: RGB, pub render_order: i32, + pub alt_render_order: Option, // 0 = always on top: particle effects // 1 = things that should appear infront of the player: railings, etc. // 2 = the player @@ -96,6 +97,17 @@ pub struct Renderable { // 5 = other props: table, etc. } +impl Renderable { + pub fn swap(&mut self) { + if let Some(alt_render_order) = &mut self.alt_render_order { + std::mem::swap(&mut self.render_order, alt_render_order); + } + if let Some(sprite) = &mut self.sprite { + *sprite = sprite.swap(); + } + } +} + #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Bleeds { pub colour: RGB, diff --git a/src/gui/character_creation.rs b/src/gui/character_creation.rs index 55b0517..bf5fd05 100644 --- a/src/gui/character_creation.rs +++ b/src/gui/character_creation.rs @@ -278,6 +278,7 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) { fg: RGB::named(DWARF_COLOUR), bg: RGB::named(BLACK), render_order: 0, + alt_render_order: None, }) .expect("Unable to insert renderable component"); *player_skills.skills.entry(Skill::Defence).or_insert(0) += DWARF_DEFENCE_MOD; @@ -290,6 +291,7 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) { fg: RGB::named(ELF_COLOUR), bg: RGB::named(BLACK), render_order: 0, + alt_render_order: None, }) .expect("Unable to insert renderable component"); let mut telepaths = ecs.write_storage::(); @@ -316,6 +318,7 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) { fg: RGB::named(CATFOLK_COLOUR), bg: RGB::named(BLACK), render_order: 0, + alt_render_order: None, }) .expect("Unable to insert renderable component"); let mut speeds = ecs.write_storage::(); diff --git a/src/particle_system.rs b/src/particle_system.rs index 11e9ed7..b2a1639 100644 --- a/src/particle_system.rs +++ b/src/particle_system.rs @@ -87,6 +87,7 @@ fn create_delayed_particles(ecs: &mut World, ctx: &App) { bg: handled.bg, glyph: handled.glyph, render_order: 0, + alt_render_order: None, }) .expect("Could not insert renderables"); particles @@ -313,6 +314,7 @@ impl<'a> System<'a> for ParticleSpawnSystem { bg: new_particle.bg, glyph: new_particle.glyph, render_order: 0, + alt_render_order: None, }) .expect("Could not insert renderables"); particles diff --git a/src/player.rs b/src/player.rs index 1c56f89..c8af2cc 100644 --- a/src/player.rs +++ b/src/player.rs @@ -139,9 +139,7 @@ pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState { std::mem::drop(renderables); let mut renderables = ecs.write_storage::(); let render_data = renderables.get_mut(potential_target).unwrap(); - if let Some(sprite) = &mut render_data.sprite { - *sprite = sprite.swap(); - } + render_data.swap(); door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y)); } result = RunState::Ticking; @@ -238,9 +236,7 @@ pub fn open(i: i32, j: i32, ecs: &mut World) -> RunState { std::mem::drop(renderables); let mut renderables = ecs.write_storage::(); let render_data = renderables.get_mut(potential_target).unwrap(); - if let Some(sprite) = &mut render_data.sprite { - *sprite = sprite.swap(); - } + render_data.swap(); door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y)); } result = RunState::Ticking; @@ -502,7 +498,7 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) -> RunState } let door = doors.get_mut(potential_target); if let Some(door) = door { - if door.open == false { + if door.open == false && door.blocks_move { if let Some(name) = names.get(potential_target) { let colour = if let Some(_) = ecs.read_storage::().get(potential_target) @@ -774,6 +770,18 @@ fn try_change_level(ecs: &mut World, backtracking: bool) -> Destination { let map = ecs.fetch::(); let player_idx = map.xy_idx(player_pos.x, player_pos.y); let this_tile = map.tiles[player_idx]; + let mut blocked = false; + crate::spatial::for_each_tile_content(player_idx, |potential| { + if let Some(is_door) = ecs.read_storage::().get(potential) { + if is_door.open == false { + blocked = true; + gamelog::Logger::new().append("The way is blocked.").log(); + } + } + }); + if blocked { + return Destination::None; + } return get_dest(this_tile, backtracking); } diff --git a/src/raws/item_structs.rs b/src/raws/item_structs.rs index d77034e..2015bd7 100644 --- a/src/raws/item_structs.rs +++ b/src/raws/item_structs.rs @@ -45,6 +45,7 @@ pub struct Renderable { pub fg: String, pub bg: String, pub order: i32, + pub alt_order: Option, } #[derive(Deserialize, Debug)] diff --git a/src/raws/rawmaster.rs b/src/raws/rawmaster.rs index c39c761..f3a8c82 100644 --- a/src/raws/rawmaster.rs +++ b/src/raws/rawmaster.rs @@ -725,6 +725,11 @@ fn get_renderable_component( fg: RGB::from_hex(&renderable.fg).expect("Invalid RGB"), bg: RGB::from_hex(&renderable.bg).expect("Invalid RGB"), render_order: renderable.order, + alt_render_order: if let Some(alt_order) = renderable.alt_order { + Some(alt_order) + } else { + None + }, } } diff --git a/src/spawner.rs b/src/spawner.rs index cb14562..52d9867 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -62,6 +62,7 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity { fg: RGB::named(YELLOW), bg: RGB::named(BLACK), render_order: 2, + alt_render_order: None, }) .with(Bleeds { colour: RGB::named(BLOODSTAIN_COLOUR) }) .with(Player {})