Universal, reusable in-game economy framework built in C++ and Blueprints. Supports multiple currencies via Gameplay Tags, real-time UI updates, passive income orchestration, and persistent save/load — designed for clean modular integration across projects.
Multi-currency, passive income, and save/load — portable across projects
The Currency Component tracks balances with TMap<FGameplayTag, int32> and exposes AddCurrency() and ApplyTransaction() for atomic, multi-resource operations. UI widgets subscribe via multicast delegates for real-time feedback.
Costable actors define purchasable/bankable entities through IICostable and maintain CostBundles. Passive income sources implement IPassiveIncomeSource and are orchestrated by the Economy Manager to apply timed deposits or drains, either to the player or to a bank actor.
The system persists player balances, bank states, and passive configuration via UE SaveGame, with clean serialization managed by the Economy Manager.
Clean architecture, tag-driven data, and robust serialization
Currency types keyed via FGameplayTag. Flexible, project-agnostic currency definitions and bundles.
Multicast delegates broadcast balance changes to widgets for responsive, real-time UI feedback.
Currency, Economy Manager, and Passive Cost components provide clear separation of concerns.
UE SaveGame stores balances, bank states, and passive configuration. Simple SaveEconomy/LoadEconomy API.
IICostable & IPassiveIncomeSource ensure consistent contracts for purchases, banks, and income sources.
High cohesion, low coupling — designed for portability
Maintains TMap<FGameplayTag, int32> balances and applies atomic transactions with validation and delegate updates.
Implements IICostable with CostBundle, vanishable/emptiable states, and world-space cost widget.
UPassiveCostComponent + IPassiveIncomeSource managed by Economy Manager for timed income/drain per tag.
UE SaveGame class persists player, banks, and passive sources. Manager handles serialization lifecycle.
Representative snippets for core types
// Currency balances per tag TMapCurrencyBalances; // Transaction bundle TMap CostBundle; // positive = deposit, negative = withdraw
bool ApplyTransaction(const TMap& Bundle) { // 1) Validate affordability for all negative entries // 2) Apply all changes atomically // 3) Broadcast updates via delegates for UI return true; }
// IPassiveIncomeSource virtual void GetYieldPerTag(TMap& OutYield) const = 0; virtual float GetIntervalFor(const FGameplayTag& Tag) const = 0;
Focused, iterative systems development
Added AddCurrency() and SpendCurrency(). Implemented ICostable and overlap-based purchases.
Built WBP_HUD and WBP_CurrencyUI with delegate-driven, real-time updates.
Switched balances to TMap<FGameplayTag, int32> with multi-resource logic.
Introduced atomic multi-currency transaction bundles.
Built UPassiveCostComponent, Economy Manager, and IPassiveIncomeSource with timer logic and bug fixes.
Added bank deposits, multi-currency support, and save/load with stability improvements.
Review architecture and media, or return to the portfolio.