proper alt sprite and render order swaps

This commit is contained in:
Llywelwyn 2023-09-26 22:08:05 +01:00
parent 06d5674199
commit ae9f6b6ac6
8 changed files with 42 additions and 10 deletions

View file

@ -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",

View file

@ -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<i32>,
// 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,

View file

@ -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::<Telepath>();
@ -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::<Energy>();

View file

@ -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

View file

@ -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::<Renderable>();
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::<Renderable>();
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::<Item>().get(potential_target)
@ -774,6 +770,18 @@ fn try_change_level(ecs: &mut World, backtracking: bool) -> Destination {
let map = ecs.fetch::<Map>();
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::<Door>().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);
}

View file

@ -45,6 +45,7 @@ pub struct Renderable {
pub fg: String,
pub bg: String,
pub order: i32,
pub alt_order: Option<i32>,
}
#[derive(Deserialize, Debug)]

View file

@ -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
},
}
}

View file

@ -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 {})