feat: Layout changes

- Added padlock layout object
- Added lockpick item
- Added ItemImage component
- Tilemap colliders are now creating from the tiles themselves
- Removed items from container bundle
- Removed colliders from tilemap bundle
- Removed setup_player system
This commit is contained in:
Alexey 2026-03-25 13:32:12 +03:00
commit 42cfd14214
10 changed files with 175 additions and 57 deletions

66
src/layout/lock.rs Normal file
View file

@ -0,0 +1,66 @@
use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use crate::{inventory::{Inventory, item::lockpick::Lockpick}, meters, player::Player};
use super::*;
const PADLOCK_IMAGE_PATH: &'static str = "sprites/interactive/padlock.png";
#[derive(Component, Debug, PartialEq, Eq, Default, Clone, Copy, Reflect)]
#[reflect(Component, Debug, PartialEq, Default, Clone)]
#[require(InteractiveObject)]
pub struct Padlock;
pub fn on_padlock_interaction(
event: On<InteractionEvent>,
mut commands: Commands,
query: Query<(&ChildOf, Entity), With<Padlock>>,
inventory_query: Query<(&Children, &ChildOf), With<Inventory>>,
player_query: Query<(), With<Player>>,
lockpick_query: Query<(), With<Lockpick>>,
) {
let Ok((parent, lock_id)) = query.get(event.entity) else {
return;
};
// find lockpick in player inventory
let mut lockpick_id = None;
for (items, inventory_parent) in inventory_query {
if player_query.get(inventory_parent.0).is_err() {
continue;
}
for item_id in items {
if lockpick_query.get(*item_id).is_ok() {
lockpick_id = Some(*item_id);
break;
}
}
};
let Some(lockpick_id) = lockpick_id else {
return;
};
commands.entity(parent.0).remove::<Locked>();
commands.entity(lock_id).despawn();
commands.entity(lockpick_id).despawn();
}
pub fn padlock_bundle(asset_server: &Res<AssetServer>, facing_left: bool) -> impl Bundle {
let image = asset_server.load(PADLOCK_IMAGE_PATH);
let sign = if facing_left { -1. } else { 1. };
(
Padlock,
Sprite {
image,
flip_x: facing_left,
..default()
},
Transform::from_xyz(meters(sign * 0.125), meters(0.), 0.),
Children::spawn_one((
Transform::from_xyz(meters(sign * 0.1875), 0., 0.),
Collider::cuboid(meters(0.1875), meters(1.)),
Sensor,
)),
)
}