From b2efc73602df5050f7717ab149d5abe073db6120 Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Wed, 1 Apr 2026 09:40:00 +0300 Subject: [PATCH] feat!: Half-implemented sprite container - Updated all assets - Refactored door again - Half of the sprites are visually broken for now --- assets/sprites/interactive/container.png | Bin 0 -> 269 bytes assets/sprites/interactive/crate_closed.png | Bin 205 -> 0 bytes assets/sprites/interactive/crate_opened.png | Bin 263 -> 0 bytes assets/sprites/interactive/door_closed.png | Bin 129 -> 139 bytes assets/sprites/interactive/door_opened.png | Bin 130 -> 177 bytes assets/sprites/interactive/padlock.png | Bin 110 -> 126 bytes assets/sprites/interactive/stairs.png | Bin 744 -> 896 bytes assets/sprites/interactive/wardrobe.png | Bin 156 -> 0 bytes assets/sprites/level/ceiling.png | Bin 113 -> 0 bytes assets/sprites/level/floor.png | Bin 126 -> 0 bytes .../sprites/{interactive => level}/lamp.png | Bin assets/sprites/level/wall.png | Bin 138 -> 0 bytes assets/sprites/level/wall_connector.png | Bin 171 -> 0 bytes assets/sprites/level/window.png | Bin 111 -> 0 bytes src/layout/asset/mod.rs | 5 +- src/layout/container.rs | 24 ++++-- src/layout/door.rs | 75 +++++++++++++----- src/layout/light.rs | 2 +- src/layout/mod.rs | 37 +++++++++ src/layout/systems.rs | 47 +++++++++++ src/lib.rs | 2 + src/tests/level.rs | 4 +- 22 files changed, 165 insertions(+), 31 deletions(-) create mode 100644 assets/sprites/interactive/container.png delete mode 100644 assets/sprites/interactive/crate_closed.png delete mode 100644 assets/sprites/interactive/crate_opened.png delete mode 100644 assets/sprites/interactive/wardrobe.png delete mode 100644 assets/sprites/level/ceiling.png delete mode 100644 assets/sprites/level/floor.png rename assets/sprites/{interactive => level}/lamp.png (100%) delete mode 100644 assets/sprites/level/wall.png delete mode 100644 assets/sprites/level/wall_connector.png delete mode 100644 assets/sprites/level/window.png diff --git a/assets/sprites/interactive/container.png b/assets/sprites/interactive/container.png new file mode 100644 index 0000000000000000000000000000000000000000..651e42c8ca9af0e6508bfa5f5505487d5577e79e GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQjEnx?oJHr&dIz4a*lhtIEF;D zCYNk1|8w4;A>n&tEpw(VGdD9cbMro-{|ym!AMd%d0YTfOB?lNc?oYp0<-st4DWUHe zYliHME8FHjVR#_?Of8fpXB>5BXHNXzv7S|8=~EN-E!KaYJlxv2Wga8L#n#3R5leQt Q1HHuH>FVdQ&MBb@00qfv8~^|S literal 0 HcmV?d00001 diff --git a/assets/sprites/interactive/crate_closed.png b/assets/sprites/interactive/crate_closed.png deleted file mode 100644 index ca3e7d03427e27d767d65b73c83f4d65ebbdc762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYe6k~CayA#8@b22Z1oOVwa#}JRs z^Lm2~shQKJlVu#hq45z;y{vCV$b{Wt~44$rjF6*2UngHtI BPeK3y diff --git a/assets/sprites/interactive/crate_opened.png b/assets/sprites/interactive/crate_opened.png deleted file mode 100644 index 50d72f1ae51f156ab5b699f75828fe446ea949be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Eu!3HE}2mdz#QjEnx?oJHr&dIz4at?aBIEHw1 zCZ{L}?zmz7@3{K@=MU=Kg3d0P#mr&JC!L_;E^Nxk&CJZ)yie$VLqy%jd+uy%63_n~ zw`X=T-UZb0T=-d9z?1YwZX*MO3$67)`4(n2rkbkXqJpfVu(-fj~oGlwYxf^iqb0ilQ881;z7$o?-BG^>bP0 Hl+XkKhR9#M diff --git a/assets/sprites/interactive/door_closed.png b/assets/sprites/interactive/door_closed.png index 40c36936132b393095e80ca0382855c23844b1c8..49c336bcf2d42ce90aeaee6e0df19f7c6319e032 100644 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^96+qV!3HGtKUiJ>QjEnx?oJHr&dIz4a$G%K978O6 z-(K3tc|bv+?V|e$g-2{nz1%zhGd&D)*|5d8aQ&`FkJs~^xtP=^HZ9^o(S(EbO}nSb n**w_2J*rAZ{6zhUglfi#zB0$7StTz54P@|i^>bP0l+XkKjao5? literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQjEnx?oJHr&dIz4a;!aF978lF zCMN)a$7Yj1^V2ea%x?sOPDWlHZAMkr$^Q-dCN-U`_YwUrHz%>B@SUy2VT+78b_Prg Y#ZKIJWtT5|2Q-Gk)78&qol`;+0I7c{3jhEB diff --git a/assets/sprites/interactive/door_opened.png b/assets/sprites/interactive/door_opened.png index 694e25ecd0290323ef4ef621d311e81ba7288756..35a688816dea43d12218564d74f035467aba546a 100644 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}*`6+rArY;~ zKATPcoOfWHQTawj^_FCW#wA|Xmtk%xFJ}V@8YI_Ura literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a%?FVdQ&MBb@0KQ=-AOHXW diff --git a/assets/sprites/interactive/padlock.png b/assets/sprites/interactive/padlock.png index 3f5d639b3093d3ad153a7f7f6805cbc7d0fbc312..b1d92f05a4881d655605a5ba88145d45fe183921 100644 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=7>k44ofy`glX(f`Sa`ZPhH%XE zJ+YCq!GM9~fU@xoPc{=_4zWp21?Ll<^UXhW>=R$kTGmNR{xGs$TiWz`&;E*gjD7oN YZxsW_p)78&qol`;+04I1SPyhe` literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-S!3HFkynkm2q!^2X+?^QKos)S9t4psbmX2{IY%+6l7FLuH+pdJQKS3j3^P6Px&I!Q!9RCt{2nXzu$Fc5}Mm0lu?5%diN6a}=q2#~cvr=UXyuX%w^eFLu)Z3D!<85650Cj-;wkckT9#J?tJg@csLgLy6d_Q z0H7#};acVU1`?o{$HTE$HFc*xOSRAc>#LXw zUS~^Cs%aq=l$sQM6$2_koU0Hu!33q2ma$YJ&NGm(6n+1rU$4OP;qWY!YFQOUQJ9Vz zoAm;M9yL%*ilwGYLODRuq*W;?r3xhh=hqz^soJ+CyuE%msgLg4=Rd1r5SEQ1b*k<^ zf1LckU%vjf{+|6TW=d7eh#gi{QMOb~EuT{i%Od z0%+x@H&Sk*5M)cpa<_%kZabumn7 zV=SgrQ4vHC_fo7T$frMz5gbGi$1*I|gM7|1&@aRHVL#I|IQxx>>gM*n*A0ID_!aEK zAW~^D5!Es;ofZ>81pV6yn{oB17{wsof?Or~S_#HfMmE?>Oiv5PUd9I&L8^p(`}aT! zeOWHAI6lF2NClmb2UuPKlyx&)yQyFPP0R!rq&~1J#)fZ`rzDsl6f;(eimlO8?6WSR z3Kj7wV#Z=i7eX_a)wfx+T zl#(a}<;kiCv!ATGn(WxKRGzF}Kys5+?xi?SRt<2tmWnT2%Mh4|nwcEksVv6Gv$gCr-boFp?@mEsR0 WLhMAA3qN@P0000P)Px%qDe$SRCt{2n=wwqKoCVI*q2Cygg8MWQ6#lF0TLxeisVc*6qJ@Yfm2g*2sb&# z(qzNNan{B&e`go=Nk|bAj_2>+*|EQv8Dl6_cIzeo=8ZAQ{cKkYvt2EW{mi*eDY6s+ za98{F^J^w`-KYgX73~tG0Jd;c(Js*l5Ms6aP!&L{XqOv}FWs$|X187%TeMd36w(1P ztacwz0b(uM1tLJmF3v?vfD~4{k5XiwPONB`l9)GdyLn2scM;nHw(!)pf_M{ji%!86 z&|@%!EB1$i?(ZHZ_OT+&AcS_s=H+Sf-v)mc=yQc8Y7axM5I$E-xA!=rcpSccd?xa2 z501r$h(dt3_mAVJg6Lv<6wvRELIB?iS4~ZAQ=eQSO%ww7u!XlxeepX9-~tRav1&f< zI&RTc3<)8EIKXFdcV)-Y=ZdL_2!KASy0{MD^oO>oWduMTQx;ec;LXxRL<(Tn^M~_Yu`Gh+geJLFW9q=!Lks*+SP~HOCH^6@-$3tBJ3iML-8tTD_HtNBMHn|B(TqJgz`$#4k aLh%i0`8mwCrul>b00006`a978-h zlS{5{_<7#J`M{wA2M#RI_%T)E==b}@#uHY}>lC^!$n2&ou{GgJ)4?RhH602nZrfO= zGzca!ZhJKIhEjFG51>pSx0~()o(%>Q0=^t#(0s+Xahu>YU&VNJpbZS3u6{1-oD!M< DpCLG8 diff --git a/assets/sprites/level/ceiling.png b/assets/sprites/level/ceiling.png deleted file mode 100644 index bdc1d976392689588167777b7cdbb085f207f5f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3HEhl+{lMQjEnx?oJHr&dIz4al~xQiKReo44$rj JF6*2UngD8=BDeqm diff --git a/assets/sprites/level/floor.png b/assets/sprites/level/floor.png deleted file mode 100644 index c1e25b688f4ec6488ed5c697e1476d59fc7dfce7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3HEhl+{lMQjEnx?oJHr&dIz4ax6Su978lF zCYM~@@bkO_V?ts=LPCJZpRVA8f4|?Ucslcgr;yQ{Mj%K%Uz~R6-4W&)8kcNsco-PY X@^N0T+@+iVG=ss@)z4*}Q$iB}2PrCu diff --git a/assets/sprites/interactive/lamp.png b/assets/sprites/level/lamp.png similarity index 100% rename from assets/sprites/interactive/lamp.png rename to assets/sprites/level/lamp.png diff --git a/assets/sprites/level/wall.png b/assets/sprites/level/wall.png deleted file mode 100644 index a103fb58365231c2e8a6656bef701018f712f2d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Ts&PILo9le zQxXyqGFE2)x6i*A#TMic6l37*8?36VY&mNpZ=#a7x==#XOqag5JV4-M>N~aP$t^o6 gw#A7D3~CNBFz8*N~aP$t^o6 zw!>;X5|RrlAHM3ntRlH!ZDJQk^YVPT$#0n0fFM&a^3>r5)-<7=3=IDn4Q_i#>o5T= OWbkzLb6Mw<&;$Uo$TML8 diff --git a/assets/sprites/level/window.png b/assets/sprites/level/window.png deleted file mode 100644 index 4e81bd169fe414981c9c0c88dc4cc8da37dc2517..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|G(BA$Lo9le zLxK!`o^N0c`DV8G!|m?ujhe{`hqSzyBuo>oGz2oUbu%)2`^qx4cCxEEP!ofvtDnm{ Hr-UW|5$7O= diff --git a/src/layout/asset/mod.rs b/src/layout/asset/mod.rs index 4a355a2..09fb80a 100644 --- a/src/layout/asset/mod.rs +++ b/src/layout/asset/mod.rs @@ -24,6 +24,7 @@ pub fn load_level ( level_handle: Res, mut commands: Commands, asset_server: Res, + textures: Res, level_assets: Res>, ) { let Some(level) = level_assets.get(&level_handle.0) else { @@ -61,7 +62,7 @@ pub fn load_level ( for DoorData { pos, facing_left, lock } in level.interactive.doors.iter() { let door_pos = vec2(meters(pos.x + 0.5), meters(pos.y)); - let mut door = parent.spawn(door_bundle(&asset_server, door_pos, *facing_left)); + let mut door = parent.spawn(door_bundle(&textures, door_pos, *facing_left)); if let Some(lock_facing_left) = lock { door.with_child(padlock_bundle(&asset_server, *lock_facing_left)); } @@ -87,7 +88,7 @@ pub fn load_level ( for ContainerData { pos, size, items } in level.interactive.containers.iter() { let pos = vec2(meters(pos.x), meters(pos.y)); - let mut container = parent.spawn(container_bundle(&asset_server, pos, *size)); + let mut container = parent.spawn(container_bundle(&textures, pos, *size)); for item in items { // TODO: replace with proper item-by-id system diff --git a/src/layout/container.rs b/src/layout/container.rs index 62f5f0c..e334a02 100644 --- a/src/layout/container.rs +++ b/src/layout/container.rs @@ -12,8 +12,6 @@ use crate::{ use super::*; -const CRATE_CLOSED_ASSET: &'static str = "sprites/interactive/crate_closed.png"; - #[derive(Component, Clone, Copy, Default, Reflect, Debug, PartialEq, Eq)] #[reflect(Component, Clone, Default, Debug, PartialEq)] #[require(Sprite, InteractiveObject, Inventory)] @@ -38,15 +36,26 @@ pub fn on_container_interact( } pub fn container_bundle( - asset_server: &Res, + textures: &Res, position: Vec2, inventory_size: UVec2, ) -> impl Bundle { - let image = asset_server.load(CRATE_CLOSED_ASSET); + let texture_atlas = TextureAtlas { + layout: textures.container.atlas.clone(), + index: textures.container.indices["main"], + }; + let hl_texture_atlas = texture_atlas.clone().with_index(textures.container.indices["highlighted"]); + let sprite = Sprite { + image: textures.container.image.clone(), + texture_atlas: Some(texture_atlas), + ..default() + }; + let mut highlight_sprite = sprite.clone(); + highlight_sprite.texture_atlas = Some(hl_texture_atlas); ( Container, Transform::from_xyz(position.x, position.y - meters(0.5), 0.), - Sprite::from_image(image), + sprite, Inventory::new(inventory_size), Children::spawn(( Spawn(( @@ -54,6 +63,11 @@ pub fn container_bundle( Sensor, Transform::from_xyz(0., meters(0.5), 0.), )), + Spawn(( + highlight_sprite, + Transform::from_xyz(0., 0., 1.), + Visibility::Hidden, + )), )), Name::new(format!("Container {}x{}", inventory_size.x, inventory_size.y)), ) diff --git a/src/layout/door.rs b/src/layout/door.rs index 376969a..ba10e0e 100644 --- a/src/layout/door.rs +++ b/src/layout/door.rs @@ -6,12 +6,9 @@ use crate::meters; use super::*; -const DOOR_OPENED_ASSET: &'static str = "sprites/interactive/door_opened.png"; -const DOOR_CLOSED_ASSET: &'static str = "sprites/interactive/door_closed.png"; - #[derive(Component, Clone, Copy, Reflect, PartialEq, Eq, Debug)] #[reflect(Component, Clone, Default, PartialEq, Debug)] -#[require(Sprite, InteractiveObject)] +#[require(InteractiveObject)] pub struct Door(pub i8); #[derive(Component, Clone, Copy, Reflect, Default, PartialEq, Eq, Debug)] @@ -19,20 +16,33 @@ pub struct Door(pub i8); #[require(Collider, LightOccluder2d)] pub struct DoorCollider; +#[derive(Component, Clone, Copy, Reflect, Default, PartialEq, Eq, Debug)] +#[reflect(Component, Clone, Default, PartialEq, Debug)] +#[require(Sprite)] +pub struct DoorHighlight; + impl Default for Door { fn default() -> Self { Self(1) } } +impl Door { + #[inline(always)] + pub fn is_facing_left(&self) -> bool { + self.0 < 0 + } +} + pub fn on_door_interact( event: On, mut commands: Commands, locked_query: Query<(), With>, door_query: Query<(&Door, &Children)>, door_collider_query: Query>, - mut sprite_query: Query<(&mut Sprite, &mut Transform)>, - asset_server: Res, + mut sprite_query: Query<&mut Transform, With>, + highlight_query: Query<(), With>, + textures: Res, ) { if locked_query.get(event.entity).is_ok() { return; @@ -43,13 +53,18 @@ pub fn on_door_interact( let maybe_door_collider = children.iter() .find_map(|id| if let Ok(id) = door_collider_query.get(id) { Some(id) } else { None } ); for child in children { - if let Ok((mut sprite, mut transform)) = sprite_query.get_mut(*child) { - let (image, translation) = if maybe_door_collider.is_none() { (DOOR_CLOSED_ASSET, 0.) } - else { (DOOR_OPENED_ASSET, door.0 as f32 * meters(0.5)) }; - sprite.image = asset_server.load(image); - transform.translation.x = translation; - break; + match sprite_query.get_mut(*child) { + Ok(mut transform) => { + let translation = if maybe_door_collider.is_none() { 0. } + else { door.0 as f32 * meters(0.5) }; + transform.translation.x = translation; + }, + Err(_) => continue, } + let texture = if maybe_door_collider.is_none() { &textures.door_closed } else { &textures.door_opened }; + let (sprite, highlight_sprite) = door_sprites(texture, door.is_facing_left()); + let needed_sprite = if highlight_query.get(*child).is_err() { sprite } else { highlight_sprite }; + commands.entity(*child).insert(needed_sprite); } if let Some(id) = maybe_door_collider { @@ -68,9 +83,26 @@ pub fn door_collider_bundle() -> impl Bundle { ) } -pub fn door_bundle(asset_server: &Res, position: Vec2, facing_left: bool) -> impl Bundle { +fn door_sprites(texture: &AtlasLayoutTexture, facing_left: bool) -> (Sprite, Sprite) { + let texture_atlas = TextureAtlas { + layout: texture.atlas.clone(), + index: texture.indices["main"], + }; + let hl_texture_atlas = texture_atlas.clone().with_index(texture.indices["highlighted"]); + let sprite = Sprite { + image: texture.image.clone(), + flip_x: facing_left, + texture_atlas: Some(texture_atlas), + ..default() + }; + let mut highlight_sprite = sprite.clone(); + highlight_sprite.texture_atlas = Some(hl_texture_atlas); + (sprite, highlight_sprite) +} + +pub fn door_bundle(textures: &Res, position: Vec2, facing_left: bool) -> impl Bundle { let direction = if facing_left { -1 } else { 1 }; - let image = asset_server.load(DOOR_CLOSED_ASSET); + let (sprite, highlight_sprite) = door_sprites(&textures.door_closed, facing_left); ( Door(direction), Transform::from_xyz(position.x, position.y, 0.), @@ -79,17 +111,18 @@ pub fn door_bundle(asset_server: &Res, position: Vec2, facing_left: door_collider_bundle(), ( Collider::cuboid(meters(0.5), meters(1.)), + Transform::default(), Sensor, - Transform::from_xyz(0., 0., 0.), ), ( - Sprite { - image, - flip_x: facing_left, - ..default() - }, - Transform::from_xyz(0., 0., 0.), + sprite, ), + ( + highlight_sprite, + Transform::from_xyz(0., 0., 1.), + DoorHighlight, + Visibility::Hidden, + ) ], ) } diff --git a/src/layout/light.rs b/src/layout/light.rs index 9516dbd..a2fa077 100644 --- a/src/layout/light.rs +++ b/src/layout/light.rs @@ -3,7 +3,7 @@ use bevy_light_2d::prelude::*; use crate::meters; -const LAMP_IMAGE_PATH: &'static str = "sprites/interactive/lamp.png"; +const LAMP_IMAGE_PATH: &'static str = "sprites/level/lamp.png"; #[derive(Component, Clone, Copy, Default, Reflect, Debug, PartialEq, Eq)] #[reflect(Component, Clone, Default, Debug, PartialEq)] diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 645e79b..f2cd0a5 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use bevy::prelude::*; pub mod asset; @@ -35,3 +37,38 @@ pub struct LevelAssetHandle(Handle); pub struct InteractionEvent { pub entity: Entity, } + +#[derive(Reflect, Clone, PartialEq, Eq, Debug, Deref, DerefMut, Default)] +#[reflect(Clone, PartialEq, Debug, Default)] +pub struct SingleLayoutTexture(Handle); + +#[derive(Reflect, Clone, PartialEq, Eq, Debug, Default)] +#[reflect(Clone, PartialEq, Debug, Default)] +pub struct AtlasLayoutTexture { + image: Handle, + atlas: Handle, + indices: HashMap, +} + +impl AtlasLayoutTexture { + #[inline(always)] + pub fn new( + image: Handle, + atlas: Handle, + indices: HashMap, + ) -> Self { + Self { image, atlas, indices } + } +} + +#[derive(Resource, Reflect, Clone, PartialEq, Eq, Debug, Default)] +#[reflect(Resource, Clone, PartialEq, Debug, Default)] +pub struct LayoutTextures { + pub container: AtlasLayoutTexture, + pub door_closed: AtlasLayoutTexture, + pub door_opened: AtlasLayoutTexture, + pub light: SingleLayoutTexture, + pub lock: AtlasLayoutTexture, + pub stairs: AtlasLayoutTexture, + pub tilemap: SingleLayoutTexture, +} diff --git a/src/layout/systems.rs b/src/layout/systems.rs index ae27b14..f61b6e8 100644 --- a/src/layout/systems.rs +++ b/src/layout/systems.rs @@ -91,3 +91,50 @@ pub fn setup_world( let level_handle = asset_server.load(startup_args.level.clone()); commands.insert_resource(LevelAssetHandle(level_handle)); } + +fn double_atlas( + atlases: &mut ResMut>, + indices: &mut HashMap, + single_size: UVec2 +) -> Handle { + let mut atlas = TextureAtlasLayout::new_empty(uvec2(single_size.x * 2, single_size.y)); + indices.insert( + "main".to_owned(), + atlas.add_texture(URect::from_corners( + uvec2(0, 0), + uvec2(single_size.x, single_size.y) + )), + ); + indices.insert( + "highlighted".to_owned(), + atlas.add_texture(URect::from_corners( + uvec2(single_size.x, 0), + uvec2(single_size.x * 2, single_size.y) + )), + ); + atlases.add(atlas) +} + +pub fn load_layout_textures( + asset_server: Res, + mut atlases: ResMut>, + mut textures: ResMut, +) { + // Container + let image = asset_server.load("sprites/interactive/container.png"); + let mut indices = HashMap::new(); + let atlas = double_atlas(&mut atlases, &mut indices, uvec2(32, 16)); + textures.container = AtlasLayoutTexture::new(image, atlas, indices); + + // Closed door + let image = asset_server.load("sprites/interactive/door_closed.png"); + let mut indices = HashMap::new(); + let atlas = double_atlas(&mut atlases, &mut indices, uvec2(4, 32)); + textures.door_closed = AtlasLayoutTexture::new(image, atlas, indices); + + // Opened door + let image = asset_server.load("sprites/interactive/door_opened.png"); + let mut indices = HashMap::new(); + let atlas = double_atlas(&mut atlases, &mut indices, uvec2(16, 32)); + textures.door_opened = AtlasLayoutTexture::new(image, atlas, indices); +} diff --git a/src/lib.rs b/src/lib.rs index b4be247..6a008ac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -110,9 +110,11 @@ impl Plugin for ExpeditionPlugin { .init_state::() .init_state::() .insert_resource(ui::WindowSize::default()) + .insert_resource(layout::LayoutTextures::default()) .add_systems(Startup, ( setup_global, layout::systems::setup_world, + layout::systems::load_layout_textures, )) .add_systems(Update, ( insert_entity_name, diff --git a/src/tests/level.rs b/src/tests/level.rs index f01b118..001678d 100644 --- a/src/tests/level.rs +++ b/src/tests/level.rs @@ -7,8 +7,8 @@ use crate::layout::asset::structs::LevelAsset; fn deserialize_from_str() { let level_str = include_str!("../../assets/levels/level.toml"); let level_alt_str = include_str!("../../assets/levels/level_alt.toml"); - let level = toml::de::from_str::(level_str).unwrap(); - let level_alt = toml::de::from_str::(level_alt_str).unwrap(); + let _ = toml::de::from_str::(level_str).unwrap(); + let _ = toml::de::from_str::(level_alt_str).unwrap(); } #[test]