docs: item sales value + PlayFab/master-server backend map

- 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
This commit is contained in:
DownloadPizza
2026-06-12 01:17:07 +02:00
parent ed951764d5
commit 5946e0910b
3 changed files with 277 additions and 0 deletions

56
docs/SALES_VALUE.md Normal file
View File

@@ -0,0 +1,56 @@
# 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](WEAPON_DAMAGE.md). 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](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`,
`PriceDataComponent` by signature.
- Get the actual numbers: query the PlayFab catalog — see
[BACKEND_PLAYFAB.md](BACKEND_PLAYFAB.md). The catalog's `PriceOptions` are the source of these
`PriceDto`s.
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).