Files
YachtDice/Assets/Scripts/Shop/ShopController.cs
T
horooko fcceb0ce45 Rework shop to support multiple item types and add unified PlayerModel
Generalize the shop from selling only ModifierDefinition to any IShopItem
(modifiers + dice). Add purchase condition checks, hover tooltips, and
fixed prices. Introduce PlayerModel as a facade over CurrencyBank,
InventoryModel, and DiceCollection for centralized state and save/load.

New files:
- IShopItem interface for purchasable items
- ShopCatalog SO (unified catalog for all item types)
- ShopTooltipView (description on hover)
- PlayerModel (aggregates player state)
- DiceCollection (owned dice tracking)
- DiceCatalog SO (dice definition registry)
- DiceCollectionTests

Modified:
- ModifierDefinition/DieDefinitionSO implement IShopItem
- ShopModel/ShopView/ShopItemView/ShopController use IShopItem
- SaveData v3 with OwnedDiceIds
- GameController uses PlayerModel for save/load
- GameLifetimeScope registers new services

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 21:04:34 +07:00

74 lines
1.9 KiB
C#

using UnityEngine;
using VContainer;
using YachtDice.Economy;
namespace YachtDice.Shop
{
public class ShopController : MonoBehaviour
{
[SerializeField] private ShopView shopView;
private ShopCatalog catalog;
private CurrencyBank currencyBank;
private ShopModel model;
public ShopCatalog Catalog => catalog;
[Inject]
public void Construct(ShopCatalog catalog, CurrencyBank currencyBank, ShopModel model)
{
this.catalog = catalog;
this.currencyBank = currencyBank;
this.model = model;
}
private void Start()
{
shopView.OnBuyClicked += HandleBuyClicked;
currencyBank.OnBalanceChanged += HandleCurrencyChanged;
model.OnItemPurchased += HandleItemPurchased;
shopView.Populate(catalog.All, model);
shopView.UpdateCurrencyDisplay(currencyBank.Balance);
}
private void OnDestroy()
{
if (shopView != null)
shopView.OnBuyClicked -= HandleBuyClicked;
if (currencyBank != null)
currencyBank.OnBalanceChanged -= HandleCurrencyChanged;
if (model != null)
model.OnItemPurchased -= HandleItemPurchased;
}
public void ToggleVisibility()
{
if (shopView == null) return;
if (shopView.IsVisible)
shopView.Hide();
else
shopView.Show();
}
private void HandleBuyClicked(IShopItem item)
{
model.TryPurchase(item);
}
private void HandleCurrencyChanged(int newBalance)
{
shopView.UpdateCurrencyDisplay(newBalance);
shopView.RefreshStates(catalog.All, model);
}
private void HandleItemPurchased(IShopItem item)
{
shopView.RefreshStates(catalog.All, model);
}
}
}