- SALES_VALUE.md: price model (PriceDto/ItemDto.SellPrice/PriceDataComponent), server-authoritative - BACKEND_PLAYFAB.md: backend = PlayFab Economy + ws:// master server (per-region); observed no-playtest boot behavior, capture findings, OnRegionsLoadFailed dialog path - WEAPON_DAMAGE.md: cross-link to backend doc
3.5 KiB
Item sales / buy value — static map of the model (for tracking across updates)
Goal: locate an item's sell value / buy price in the static files.
Status: same situation as weapon damage. The price model is fully mapped statically (below). The actual numbers are not in any client asset — they live in the PlayFab Economy catalog (server-side) and reach the client as network DTOs. See BACKEND_PLAYFAB.md for how to acquire them at runtime without touching the game process (BattlEye-safe).
Price model (all static, in il2cpp/dump.cs)
A price is "N units of a currency item", not a bare number:
| Type | Fields | Role |
|---|---|---|
PriceDto |
string ItemDefinition, int Amount |
one price leg = Amount of currency-item ItemDefinition |
ItemDto |
List<PriceDto> SellPrice |
what the item sells for |
ShopItemDto |
string DefinitionName, int Amount, List<PriceDto> BuyPrice |
what a shop sells to you / its buy cost |
ShopItemSlotModel (UI) |
int price, int requiredCurrencyAmount, string priceCurrencyItemName, bool isForSale, bool hasPrice, bool isTradable |
tooltip values, read off the DTO |
PriceDataComponent : BaseLongValueComponent (TypeDefIndex 5822, IItemContextComponent) |
long value @+0x10 |
per-item price as an Entitas component — structurally identical to the DamageXxxDataComponent pattern |
TransactionCurrencyData |
Sprite sprite, int balance, Color color |
the wallet/currency shown in the store UI |
PawnShopDeliveryRewardDataComponent |
string rewardItem, int rewardCount |
pawn-shop turn-in reward |
The currency item is Crowns (item_coinCrown) — the in-game money (the test conveyor
1x item_wineBox → 1000x item_coinCrown mints it). (Currency identity inferred from the item
registry + that it's the only "coin" item; not yet confirmed against a live PriceDto.)
Store plumbing: StoreBuyContainer, StoreSellContainer, LobbyStoreModule, StoreData,
ShopInventoryContainer — all under Hologryph.Sand.Client.MainMenu.Ui.Store (the lobby
store, i.e. between-runs, not in-world).
The numbers are not in any asset (verified, same three ways as damage)
| Check | Result |
|---|---|
PriceDataComponent across all 1446 EntityBlueprints (bundle/component_census.py Price) |
0 — not authored on any item |
PawnShop* across all 1446 blueprints |
0 |
configuration_assets_all.bundle MonoBehaviour classes (15 total) |
no store/price/economy/shop config — only world/biome/loot/contract configs |
CheatItemDefinitionsData item defs |
{Name, Type, StorageStack} — no price field |
The giveaway is the naming: prices travel as ...Dto (data-transfer objects) through
LobbyStoreModule — they are delivered by the backend, not baked into the client. So sales value
is server-authoritative, exactly like weapon damage.
Re-deriving / tracking
- Diff the model across patches: re-locate
PriceDto,ItemDto.SellPrice,ShopItemDto.BuyPrice,PriceDataComponentby signature. - Get the actual numbers: query the PlayFab catalog — see
BACKEND_PLAYFAB.md. The catalog's
PriceOptionsare the source of thesePriceDtos.
One adjacent thing that is static: WorldContractsConfig (delivery-contract rewards) is
authored in configuration_assets_all.bundle, so those reward amounts are extractable from the
bundle directly (a different economy than the store sell price).