@@ -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 ) ]
6160pub 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
112108fn 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) ]
169166fn 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
226233fn 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
247254fn 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
0 commit comments