# Legacy General Pools This document summarizes the general pool system used for character selection and event-driven recruitment. References include `legacy/hwe/sammo/AbsGeneralPool.php`, `legacy/hwe/sammo/AbsFromUserPool.php`, and `legacy/hwe/sammo/GeneralPool/*`. ## Core Abstractions - `AbsGeneralPool` - Wraps a `Scenario\GeneralBuilder` and a raw `info` payload. - Provides `getGeneralBuilder()`, `getInfo()`, and `occupyGeneralName()`. - Abstract method: `pickGeneralFromPool(...)`. - `AbsFromUserPool` - Implements reservation logic backed by the `select_pool` table. - Reserves candidates for a user (`owner`) until `reserved_until`. - On selection, clears reservation and binds `general_id`. ## Pool Implementations - `GeneralPool/RandomNameGeneral` - Generates random names using `GameConst::$randGen*` lists. - Checks duplicate counts and appends suffixes if needed. - Inserts reservation rows into `select_pool` for user selection. - `GeneralPool/SPoolUnderU30` - Loads a curated pool from `GeneralPool/Pool/UnderS30.json`. - Inserts rows into `select_pool` with pre-defined stats and specials. ## Data Model `select_pool` table fields (observed usage): - `unique_name` (pool key) - `info` (JSON: stats, portrait, specials, dex, etc.) - `owner` (reservation user id) - `reserved_until` (reservation expiry) - `general_id` (assigned after creation) ## RNG Notes Pool selection uses injected `RandUtil` to choose candidates and generate random names; deterministic seeding depends on caller context.