oxygengine_overworld/systems/
bank.rs

1use crate::{
2    components::wallet::*,
3    resources::{bank::*, market::*},
4};
5use oxygengine_core::ecs::{life_cycle::EntityChanges, Comp, Entity, Universe, WorldRef};
6use std::collections::HashMap;
7
8#[derive(Debug, Default)]
9pub struct BankSystemCache {
10    wallets: HashMap<Entity, BankAccountId>,
11}
12
13pub type BankSystemResources<'a, T> = (
14    WorldRef,
15    &'a EntityChanges,
16    &'a mut Bank<T>,
17    &'a mut BankSystemCache,
18    Comp<&'a mut Wallet>,
19);
20
21pub fn bank_system<T>(universe: &mut Universe)
22where
23    T: Currency + std::fmt::Debug + Default + Send + Sync + 'static,
24{
25    let (world, changes, mut bank, mut cache, ..) =
26        universe.query_resources::<BankSystemResources<T>>();
27
28    for entity in changes.despawned() {
29        if let Some(id) = cache.wallets.remove(&entity) {
30            let _ = bank.remove_account(id);
31        }
32    }
33
34    for (entity, wallet) in world.query::<&mut Wallet>().iter() {
35        if wallet.account.is_none() {
36            let id = bank.create_account();
37            wallet.account = Some(id);
38            cache.wallets.insert(entity, id);
39        }
40    }
41}