Skip to content

Commit b2d1537

Browse files
authored
refactor: use item handle for conveyored items (#18)
1 parent 4617ce1 commit b2d1537

5 files changed

Lines changed: 36 additions & 146 deletions

File tree

src/simulation/item/assets.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,3 @@ impl FromWorld for ItemAssets {
4949
}
5050
}
5151
}
52-
53-
impl ItemAssets {
54-
fn ase_slice(&self, item_id: String) -> impl Bundle {
55-
AseSlice {
56-
aseprite: self.aseprite.clone(),
57-
name: item_id,
58-
}
59-
}
60-
61-
pub fn sprite(&self, item: String) -> impl Bundle {
62-
(Sprite::sized(Vec2::splat(16.0)), self.ase_slice(item))
63-
}
64-
}

src/simulation/item/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@ pub fn plugin(app: &mut App) {
1818
.add_systems(Startup, spawn_player_inventory);
1919
}
2020

21-
#[allow(dead_code)]
2221
#[derive(Component, Reflect)]
2322
#[reflect(Component)]
24-
pub struct Item(Handle<ItemDef>);
23+
pub struct Item(pub Handle<ItemDef>);
2524

2625
#[derive(Component, Reflect, Deref, DerefMut)]
2726
#[reflect(Component)]

src/simulation/logistics/conveyor_belt.rs

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
simulation::{
1212
FactorySystems,
1313
dismantle::QueueDismantle,
14-
item::{ItemAssets, ItemDef, Stack},
14+
item::{Item, ItemAssets, ItemDef, Stack},
1515
logistics::{
1616
ConveyorHoleOf, LogisticAssets,
1717
io::{InputInventory, OutputInventory},
@@ -30,9 +30,8 @@ pub fn plugin(app: &mut App) {
3030
app.register_type::<ConveyorSpeed>();
3131
app.register_type::<ConveyorLength>();
3232

33-
app.register_type::<ConveyoredItems>();
34-
app.register_type::<ConveyoredItem>();
35-
app.register_type::<ConveyoredItemOf>();
33+
app.register_type::<Transports>();
34+
app.register_type::<TransportedBy>();
3635

3736
app.add_event::<QueueConveyorSpawn>();
3837

@@ -57,7 +56,7 @@ pub struct QueueConveyorSpawn(pub Entity, pub Entity);
5756

5857
#[derive(Component, Reflect)]
5958
#[reflect(Component)]
60-
#[require(ConveyorLength, ConveyorSpeed, ConveyoredItems)]
59+
#[require(ConveyorLength, ConveyorSpeed, Transports)]
6160
pub struct ConveyorBelt(Entity, Entity);
6261

6362
#[derive(Component, Reflect, Default)]
@@ -93,21 +92,18 @@ fn insert_pickup_timer(mut world: DeferredWorld, HookContext { entity, .. }: Hoo
9392

9493
#[derive(Component, Reflect, Default)]
9594
#[reflect(Component)]
96-
#[relationship_target(relationship = ConveyoredItemOf, linked_spawn)]
97-
pub struct ConveyoredItems(Vec<Entity>);
95+
#[relationship_target(relationship = TransportedBy, linked_spawn)]
96+
pub struct Transports(Vec<Entity>);
9897

9998
#[derive(Component, Reflect)]
10099
#[reflect(Component)]
101-
pub struct ConveyoredItem(String);
100+
#[relationship(relationship_target = Transports)]
101+
#[require(TransportProgress)]
102+
pub struct TransportedBy(pub Entity);
102103

103-
#[derive(Component, Reflect)]
104-
#[reflect(Component)]
105-
#[relationship(relationship_target = ConveyoredItems)]
106-
pub struct ConveyoredItemOf(pub Entity);
107-
108-
#[derive(Component, Reflect)]
104+
#[derive(Component, Reflect, Default)]
109105
#[reflect(Component)]
110-
pub struct ConveyoredItemProgress(f32);
106+
pub struct TransportProgress(f32);
111107

112108
fn build_conveyor_belts(
113109
mut events: EventReader<QueueConveyorSpawn>,
@@ -166,22 +162,25 @@ fn garbage_clean_conveyor_belts(
166162
}
167163
}
168164

165+
#[allow(clippy::too_many_arguments)]
169166
fn place_items_on_belt(
170167
conveyor_belts: Query<(
171168
Entity,
172169
&Transform,
173170
&ConveyorBelt,
174171
&ConveyorLength,
175-
&ConveyoredItems,
172+
&Transports,
176173
&mut ConveyorPickupTimer,
177174
)>,
178175
conveyor_holes: Query<&ConveyorHoleOf>,
179176
mut outputs: Query<&mut OutputInventory>,
180177
mut commands: Commands,
181178
item_assets: Res<ItemAssets>,
179+
item_index: Res<IndexMap<ItemDef>>,
180+
mut items: ResMut<Assets<ItemDef>>,
182181
time: Res<Time>,
183182
) {
184-
for (entity, transform, belt, length, items, mut pickup_timer) in conveyor_belts {
183+
for (entity, transform, belt, length, conveyored_items, mut pickup_timer) in conveyor_belts {
185184
if !pickup_timer.0.tick(time.delta()).finished() {
186185
continue;
187186
}
@@ -197,23 +196,31 @@ fn place_items_on_belt(
197196
continue;
198197
};
199198

200-
if (length.0 / CONVEYOR_BELT_TRAY_SIZE).ceil() as u8 == items.len() as u8 {
199+
if (length.0 / CONVEYOR_BELT_TRAY_SIZE).ceil() as u8 == conveyored_items.len() as u8 {
201200
continue;
202201
}
203202

204203
if let Ok(item_id) = output.pop() {
204+
// TODO: update inventory so that this becomes a .clone()
205+
let item_handle = item_index
206+
.get(&item_id)
207+
.and_then(|asset_id| items.get_strong_handle(*asset_id))
208+
.expect("Inventory contains invalid item id");
209+
205210
commands
206211
.spawn((
207212
Name::new("Item"),
208213
Transform::default()
209214
.with_translation(Vec3::new(-length.0 / 2.0, 0.0, 0.0))
210215
.with_rotation(transform.rotation.inverse()),
211-
item_assets.sprite(item_id.clone()),
212-
ConveyoredItemProgress(0.0),
213-
ConveyoredItem(item_id.clone()),
214-
ConveyoredItemOf(entity),
216+
Sprite::sized(Vec2::splat(16.0)),
217+
AseSlice {
218+
aseprite: item_assets.aseprite.clone(),
219+
name: item_id,
220+
},
221+
Item(item_handle),
222+
TransportedBy(entity),
215223
ChildOf(entity),
216-
Pickable::default(),
217224
Interactable,
218225
))
219226
.observe(|trigger: Trigger<Interact>, mut commands: Commands| {
@@ -224,8 +231,8 @@ fn place_items_on_belt(
224231
}
225232

226233
fn transfer_belt_contents(
227-
belt_query: Query<(&ConveyorLength, &ConveyorSpeed, &ConveyoredItems)>,
228-
mut item_query: Query<(&mut Transform, &mut ConveyoredItemProgress)>,
234+
belt_query: Query<(&ConveyorLength, &ConveyorSpeed, &Transports)>,
235+
mut item_query: Query<(&mut Transform, &mut TransportProgress)>,
229236
time: Res<Time>,
230237
) {
231238
for (length, speed, conveyored_items) in belt_query {
@@ -246,17 +253,11 @@ fn transfer_belt_contents(
246253

247254
fn receive_items_from_belt(
248255
conveyor_belts: Query<&ConveyorBelt>,
249-
conveyored_items: Query<(
250-
Entity,
251-
&ConveyoredItem,
252-
&ConveyoredItemProgress,
253-
&ConveyoredItemOf,
254-
)>,
256+
conveyored_items: Query<(Entity, &Item, &TransportProgress, &TransportedBy)>,
255257
conveyor_holes: Query<&ConveyorHoleOf>,
256258
mut inputs: Query<&mut InputInventory>,
257259
mut commands: Commands,
258260
items: Res<Assets<ItemDef>>,
259-
item_index: Res<IndexMap<ItemDef>>,
260261
) {
261262
for (entity, item, progress, item_of) in conveyored_items {
262263
if progress.0 < 1.0 {
@@ -278,10 +279,7 @@ fn receive_items_from_belt(
278279
continue;
279280
};
280281

281-
let Some(item_def) = item_index
282-
.get(&item.0)
283-
.and_then(|asset_id| items.get(*asset_id))
284-
else {
282+
let Some(item_def) = items.get(&item.0) else {
285283
continue;
286284
};
287285

src/simulation/recipe/entities.rs

Lines changed: 0 additions & 95 deletions
This file was deleted.

src/ui/interactable.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ pub fn plugin(app: &mut App) {
2626

2727
#[derive(Component, Reflect, Default)]
2828
#[reflect(Component)]
29+
#[require(Pickable)]
2930
pub struct Interactable;
3031

3132
#[derive(Event, Reflect, Default)]

0 commit comments

Comments
 (0)