79 lines
3.1 KiB
Markdown
79 lines
3.1 KiB
Markdown
# Legacy Auctions and Betting
|
|
|
|
This document covers the auction and betting systems: how auctions open/close,
|
|
what resources they trade, and how betting payouts are calculated. References
|
|
include `legacy/hwe/sammo/Auction*.php`, `legacy/hwe/func_auction.php`, and
|
|
`legacy/hwe/sammo/Betting.php`.
|
|
|
|
## Auction Types and Entry Points
|
|
|
|
- `Auction` (base class): shared bid logic and close-date extensions.
|
|
- `AuctionBuyRice`: sell rice for gold.
|
|
- `AuctionSellRice`: sell gold for rice.
|
|
- `AuctionUniqueItem`: bids use inheritance points for unique items.
|
|
- `processAuction()` in `legacy/hwe/func_auction.php` closes finished auctions.
|
|
- `registerAuction()` creates neutral (NPC-hosted) buy/sell auctions.
|
|
|
|
## Auction Data Model
|
|
|
|
Primary tables:
|
|
|
|
- `ng_auction`: auction metadata (type, target, host, close date, detail).
|
|
- `ng_auction_bid`: per-bid rows for each auction.
|
|
|
|
The `AuctionInfo` and `AuctionInfoDetail` DTOs are serialized into
|
|
`ng_auction` columns for structured access.
|
|
|
|
## Core Auction Flow
|
|
|
|
1. **Open**
|
|
- `AuctionBasicResource::openResourceAuction()` validates amounts and
|
|
host resources, then inserts `ng_auction`.
|
|
- `AuctionUniqueItem::openItemAuction()` checks availability, reserves
|
|
unique items, and posts a global history notice.
|
|
2. **Bid**
|
|
- Bids are inserted into `ng_auction_bid` and can extend the close date.
|
|
- Reverse auctions (when `detail->isReverse`) sort by lowest bid.
|
|
3. **Close** (`tryFinish()` from the concrete auction)
|
|
- If no bids: `rollbackAuction()` returns resources to host and logs.
|
|
- With bids: `finishAuction()` transfers resources, logs, and sends messages.
|
|
4. **Processing**
|
|
- `processAuction()` scans auctions past `close_date` and finishes them.
|
|
|
|
## Unique Item Auctions
|
|
|
|
- Currency: inheritance points (`ResourceType::inheritancePoint`).
|
|
- Host identity is obfuscated using `genObfuscatedName()` and a deterministic
|
|
shuffled name pool stored in `game_env.obfuscatedNamePool`.
|
|
- Limits and availability are enforced against `GameConst::$allItems` and
|
|
existing ownership in `general` rows.
|
|
|
|
## Betting System
|
|
|
|
Betting is an independent KV-backed system:
|
|
|
|
- `Betting::openBetting()` stores `BettingInfo` in KV storage (`betting`).
|
|
- `Betting::bet()` inserts or updates `ng_betting` rows and charges either
|
|
gold or inheritance points.
|
|
- `Betting::giveReward()` distributes payouts to winners (exclusive or shared).
|
|
|
|
Event actions controlling lifecycle:
|
|
|
|
- `OpenNationBetting`: opens a nation-strength bet and registers a
|
|
`DESTROY_NATION` event to close it.
|
|
- `FinishNationBetting`: evaluates winners when only N nations remain.
|
|
|
|
## RNG Notes
|
|
|
|
- `Auction::genObfuscatedName()` uses `hiddenSeed + 'obfuscatedNamePool'` to
|
|
shuffle the name pool once and reuse it from `game_env`.
|
|
- `registerAuction()` relies on an injected RNG to randomize neutral auctions.
|
|
|
|
## Open Questions / Follow-ups
|
|
|
|
- The exact schedule for `registerAuction()` is outside this file; it is
|
|
likely called from monthly or timed maintenance.
|
|
- Unique-item auction close-date extension limits depend on
|
|
`AuctionUniqueItem` constants and `turnterm`; verify scenarios that override
|
|
auction timing.
|