diff --git a/docs/architecture/legacy-engine-auction.md b/docs/architecture/legacy-engine-auction.md new file mode 100644 index 0000000..b7bc46d --- /dev/null +++ b/docs/architecture/legacy-engine-auction.md @@ -0,0 +1,78 @@ +# 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. diff --git a/docs/architecture/legacy-engine-city.md b/docs/architecture/legacy-engine-city.md new file mode 100644 index 0000000..5485d82 --- /dev/null +++ b/docs/architecture/legacy-engine-city.md @@ -0,0 +1,48 @@ +# Legacy City Data and Helpers + +This document describes how city data is defined and accessed in the legacy +engine. References include `legacy/hwe/sammo/CityConstBase.php`, +`legacy/hwe/sammo/CityInitialDetail.php`, and `legacy/hwe/sammo/CityHelper.php`. + +## City Constants (CityConst) + +`CityConstBase` defines default city data and lookup helpers: + +- `CityConstBase::$initCity` includes: + - id, name, level, population, agri/comm/secu/def/wall, + region, coordinates, and path connections. +- Region and level maps convert labels to numeric codes. +- `CityConstBase::byID()` and `byName()` return `CityInitialDetail` objects. + +During scenario build, the engine generates `d_setting/CityConst.php` from the +scenario map file, replacing or extending these defaults. + +## CityInitialDetail + +`CityInitialDetail` is a plain data object containing the initial +static attributes for each city: + +- `id`, `name`, `level`, `population` +- `agriculture`, `commerce`, `security`, `defence`, `wall` +- `region`, `posX`, `posY`, `path` (adjacent city ids) + +## CityHelper Cache + +`CityHelper` caches live DB city rows for fast lookup: + +- `getAllCities()` returns a map keyed by city id. +- `getAllNationCities($nationID)` returns all cities for a nation. +- `getCityByName()` resolves a name to a DB row (with a warning if missing). + +Cache invalidation is manual via `CityHelper::flushCache()`. + +## Path Connectivity + +City connectivity (used for supply and movement) is defined by the +`path` list in `CityConst` and referenced by systems like +`UpdateCitySupply` to traverse same-nation city graphs. + +## Open Questions / Follow-ups + +- Scenario-specific map files (`legacy/hwe/scenario/map/*.php`) override city + data; document per-map deltas when needed. diff --git a/docs/architecture/legacy-engine-constants.md b/docs/architecture/legacy-engine-constants.md new file mode 100644 index 0000000..5f3644d --- /dev/null +++ b/docs/architecture/legacy-engine-constants.md @@ -0,0 +1,58 @@ +# Legacy Game Constants and Unit Sets + +This document summarizes the static configuration layers that define game +rules and unit sets. References include `legacy/hwe/sammo/GameConstBase.php`, +`legacy/hwe/sammo/GameUnitConstBase.php`, `legacy/hwe/sammo/GameUnitDetail.php`, +and `legacy/hwe/sammo/GameUnitConstraint/*`. + +## GameConst (Rules) + +`GameConstBase` defines the default rule set: + +- Turn limits, stat caps, and progression thresholds. +- Resource floors (`basegold`, `baserice`) and maintenance coefficients. +- Command lists (`availableGeneralCommand`, `availableChiefCommand`). +- Availability lists for specials, items, and nation types. +- Scenario overrides apply via `Scenario::buildConf()`. + +During scenario build, the engine generates `d_setting/GameConst.php` from +`GameConstBase` and scenario overrides (see +`docs/architecture/legacy-scenarios.md`). + +## Unit Sets (GameUnitConst) + +`GameUnitConstBase` defines the base unit list and their combat properties: + +- Unit identifiers, arm types, and labels. +- Base attack/defence stats, speed, avoid, magic coefficients. +- Cost and rice consumption. +- Attack/defence coefficients vs. other arm types. +- Attached trigger lists (`initSkillTrigger`, `phaseSkillTrigger`). +- Requirements via `GameUnitConstraint` objects. + +Scenario build emits `d_setting/GameUnitConst.php` based on the selected +`unitSet` (`scenario/unit/*.php`). + +## GameUnitDetail + +`GameUnitDetail` is the runtime representation of a crew type: + +- Computes derived attack/defence using general stats and tech (`getTechAbil`). +- Calculates resource costs (`costWithTech`, `riceWithTech`). +- Applies attack/defence multipliers by opponent crew type. +- Can include an `iActionList` (crew-type-specific action modules). + +Crew types are also `iAction` providers, enabling triggers and stat modifiers +through `General::getActionList()`. + +## Unit Constraints + +Unit availability is controlled by `GameUnitConstraint` implementations: + +- `ReqTech`, `ReqCities`, `ReqRegions`, `ReqMinRelYear`, `Impossible`, etc. +- Each constraint exposes `test(...)` and `getInfo()` for UI display. + +## Open Questions / Follow-ups + +- Scenario-specific overrides may redefine available units or unit sets; + document those deltas per scenario when needed. diff --git a/docs/architecture/legacy-engine-constraints.md b/docs/architecture/legacy-engine-constraints.md new file mode 100644 index 0000000..1bfd409 --- /dev/null +++ b/docs/architecture/legacy-engine-constraints.md @@ -0,0 +1,53 @@ +# Legacy Constraint System + +This document describes the constraint framework used to validate command +preconditions. References include `legacy/hwe/sammo/Constraint/Constraint.php` +and `legacy/hwe/sammo/Constraint/ConstraintHelper.php`. + +## Core Concepts + +Constraints are reusable predicate classes that validate a command’s inputs and +state. They are built per-command and executed in order: + +- Each constraint extends `Constraint` and implements `test()`. +- `Constraint::testAll()` iterates a list of constraints and returns the first + failure `[constraintName, reason]` or `null` for success. +- `BaseCommand::hasFullConditionMet()` uses these to decide command validity. + +## Required Input Flags + +Constraints declare required inputs using bit flags: + +- `REQ_GENERAL`, `REQ_CITY`, `REQ_NATION` +- `REQ_DEST_GENERAL`, `REQ_DEST_CITY`, `REQ_DEST_NATION` +- `REQ_ARG` with typed sub-flags: + - `REQ_STRING_ARG`, `REQ_INT_ARG`, `REQ_NUMERIC_ARG`, `REQ_BOOLEAN_ARG`, + `REQ_ARRAY_ARG`, `REQ_BACKED_ENUM_ARG` + +`Constraint::checkInputValues()` enforces these expectations and throws if +inputs are missing or malformed. + +## Constraint Helper DSL + +`ConstraintHelper` provides factory-style helpers used in command definitions: + +- Examples: `AllowWar()`, `NearCity($distance)`, `ReqGeneralGold($amount)`, + `NotOccupiedDestCity()`, `AllowDiplomacyStatus(...)`, etc. +- These helpers return `[ConstraintName, arg]` tuples consumed by + `Constraint::testAll()`. + +## Common Constraint Classes + +Constraints are organized by domain: + +- **Diplomacy**: `AllowDiplomacyStatus`, `AllowDiplomacyBetweenStatus`. +- **Nation/City**: `OccupiedCity`, `NotCapital`, `RemainCityCapacity`. +- **General**: `ReqGeneralCrew`, `ReqGeneralGold`, `MustBeTroopLeader`. +- **Routing**: `HasRoute`, `HasRouteWithEnemy`. + +Each constraint sets a failure reason string used by UI and logs. + +## Open Questions / Follow-ups + +- Some constraints rely on `env` values (`turnterm`, `year`, etc.); document + each command’s exact `env` payload when porting. diff --git a/docs/architecture/legacy-engine-diplomacy.md b/docs/architecture/legacy-engine-diplomacy.md new file mode 100644 index 0000000..b78423c --- /dev/null +++ b/docs/architecture/legacy-engine-diplomacy.md @@ -0,0 +1,55 @@ +# Legacy Diplomacy and Messaging + +This document summarizes the legacy message system and how diplomatic messages +trigger nation command flows. References include +`legacy/hwe/sammo/Message.php`, `legacy/hwe/sammo/DiplomaticMessage.php`, +`legacy/hwe/sammo/MessageTarget.php`, and `legacy/hwe/sammo/Target.php`. + +## Message Types and Mailboxes + +`Message` supports multiple mailbox types: + +- **Public**: `MAILBOX_PUBLIC` (global announcements). +- **National**: `MAILBOX_NATIONAL + nationID` for diplomacy/nation mail. +- **Private**: mailbox id is the receiver general id. + +Message types (`MessageType`) include `public`, `national`, `private`, +and `diplomacy`. + +## Message Lifecycle + +- `Message::send()` (not shown here) writes to the `message` table. +- `Message::getMessagesFromMailBox()` reads by mailbox/type with validity + filtering (`valid_until > now`). +- `Message::buildFromArray()` instantiates: + - `DiplomaticMessage` when type is diplomacy. + - `ScoutMessage` or `RaiseInvaderMessage` when `option.action` matches. + +## DiplomaticMessage Flow + +`DiplomaticMessage` wraps diplomacy requests and accepts/rejects them: + +- Supported actions: + - `TYPE_NO_AGGRESSION` (불가침) + - `TYPE_CANCEL_NA` (불가침 파기) + - `TYPE_STOP_WAR` (종전) +- `agreeMessage()` validates: + - message is still valid + - receiver is a valid diplomacy officer +- On accept, builds and runs the matching nation command: + - `che_불가침수락`, `che_불가침파기수락`, `che_종전수락` + - Uses `NoRNG` to avoid randomness in acceptance. + +Each acceptance updates `diplomacyDetail` with command briefs and writes logs. + +## Message Targets + +`MessageTarget` and `Target` provide lightweight identifiers: + +- `MessageTarget` includes general/nation names, colors, and icons. +- Helper constructors (`buildQuick`, `buildFromGeneralObj`) resolve from DB. + +## Open Questions / Follow-ups + +- The full list of `MessageType` values and message table schema live outside + this file and can be documented alongside the UI mailbox APIs. diff --git a/docs/architecture/legacy-engine-economy.md b/docs/architecture/legacy-engine-economy.md new file mode 100644 index 0000000..b60091e --- /dev/null +++ b/docs/architecture/legacy-engine-economy.md @@ -0,0 +1,88 @@ +# Legacy Economy and Monthly Updates + +This document summarizes the legacy economic pipeline: monthly income, +maintenance, population growth, city supply recalculation, and nation level +updates. References include `legacy/hwe/func_time_event.php`, +`legacy/hwe/sammo/Event/Action/*`, and `legacy/hwe/sammo/TurnExecutionHelper.php`. + +## Entry Points + +- `TurnExecutionHelper::executeAllCommand()` + - Calls `runEventHandler(PRE_MONTH)` → `preUpdateMonthly()` → `turnDate()` → + `runEventHandler(MONTH)` → `postUpdateMonthly()`. +- Event actions under `legacy/hwe/sammo/Event/Action/` execute concrete + economic updates. + +## Monthly Income (ProcessIncome) + +`Event/Action/ProcessIncome` distributes **gold** and **rice** on schedule: + +- Collects all nations and cities, groups generals per nation. +- Computes income using: + - `getGoldIncome()` / `getRiceIncome()` from `func_time_event.php`. + - `getWallIncome()` for rice from walls (same file). +- Applies nation tax rate (`rate_tmp`) and salary ratio (`bill`). +- Pays generals by `dedication` via `getBill()`. +- Updates `nation_env.prev_income_{gold|rice}` and logs to history. + +Key dependencies: +- `GameConst::$basegold`, `GameConst::$baserice` for minimum reserves. +- `GameConst::$resourceActionAmountGuide` for action amounts. +- `iAction::onCalcNationalIncome()` for nation-type modifiers. + +## Semiannual Maintenance (ProcessSemiAnnual) + +`Event/Action/ProcessSemiAnnual` applies upkeep and growth: + +- City stats decay by 1% (agri/comm/secu/def/wall). +- Population growth via `popIncrease()`: + - Uses tax rate (`rate_tmp`) and security. + - Nation type can adjust via `onCalcNationalIncome('pop', ...)`. +- General and nation resources decay (1–5% bands based on thresholds). + +## War Income and Casualties (ProcessWarIncome) + +`Event/Action/ProcessWarIncome`: + +- Converts `city.dead` into national gold income (supply-based war income). +- Returns 20% of `dead` to population (`pop += dead * 0.2`), then clears `dead`. + +## City Supply and Isolation (UpdateCitySupply) + +`Event/Action/UpdateCitySupply`: + +- BFS from each nation capital through `CityConst` paths to mark `supply = 1`. +- Unsupplied cities (`supply = 0`) receive 10% stat/pop loss monthly. +- Generals in unsupplied cities lose 5% crew/train/atmos. +- Cities with `trust < 30` become neutral (nation = 0), and officers are reset. + +## Nation Level Updates (UpdateNationLevel) + +`Event/Action/UpdateNationLevel`: + +- Nation level increases based on number of level≥4 cities. +- On level-up: + - Grants gold/rice bonus. + - Logs global and national history. + - Initializes `nation_turn` rows for new chief levels. + - Runs a unique-item lottery (deterministic RNG tagged `nationLevelUp`). + +## City Trade Rates (RandomizeCityTradeRate) + +- Once per month, adjusts `city.trade` with deterministic RNG: + - Probability depends on city level. + - Trade rate ranges 95–105 when triggered. + +## RNG Notes + +Economic events using RNG seed with `UniqueConst::$hiddenSeed` and a +feature-specific tag: + +- `RandomizeCityTradeRate`: `hiddenSeed + 'randomizeCityTradeRate' + year + month` +- `UpdateNationLevel`: `hiddenSeed + 'nationLevelUp' + year + month + nationID` + +## Open Questions / Follow-ups + +- `preUpdateMonthly()`, `postUpdateMonthly()`, and `turnDate()` live in + `legacy/hwe/func_time_event.php` and `legacy/hwe/func.php`; their full + side effects should be expanded alongside this document. diff --git a/docs/architecture/legacy-engine-events.md b/docs/architecture/legacy-engine-events.md new file mode 100644 index 0000000..c5d4380 --- /dev/null +++ b/docs/architecture/legacy-engine-events.md @@ -0,0 +1,86 @@ +# Legacy Event System + +This document summarizes how the legacy event system executes scenario- and +turn-based events, and how static event hooks are wired into commands. Primary +references include `legacy/hwe/sammo/TurnExecutionHelper.php`, +`legacy/hwe/sammo/Event/*`, and `legacy/hwe/sammo/StaticEventHandler.php`. + +## Entry Points + +- `TurnExecutionHelper::runEventHandler(EventTarget $eventTarget)` + - Loads `event` table rows by target and priority, evaluates conditions, and + runs actions. +- `StaticEventHandler::handleEvent(...)` + - Invoked by many commands and API handlers to run per-action static hooks. + +## Event Table Dispatch + +`runEventHandler()` drives the dynamic event pipeline: + +1. Query `event` rows with `target = {PRE_MONTH|MONTH|OCCUPY_CITY|DESTROY_NATION|UNITED}` + (ordered by `priority DESC, id ASC`). +2. Decode `condition` and `action` JSON. +3. Build a `Event\EventHandler` with condition + action lists. +4. Execute `tryRunEvent($env)` where `$env` is `game_env` KV storage plus + `currentEventID`. + +Events are used inside the monthly pipeline and in special moments like +city occupation (`EventTarget::OCCUPY_CITY`, called by some commands). + +## Condition and Action DSL + +`Event\Condition::build()` and `Event\Action::build()` decode JSON arrays into +class instances: + +- **Condition** + - Supports logic combinators (`and`, `or`, `xor`, `not`) via + `Event\Condition\Logic`. + - Built-in condition types include: + - `Date`, `DateRelative`, `Interval` + - `RemainNation` + - `ConstBool` + - Conditions return `{ value, chain }` for tracing. + +- **Action** + - Actions are classes under `Event/Action/` with `run(array $env)`. + - The dispatcher instantiates them from `action` arrays like + `['ProcessIncome', 'gold']`. + +## Common Event Actions (Examples) + +These are the action modules observed in the legacy tree: + +- **Economy & upkeep**: `ProcessIncome`, `ProcessSemiAnnual`, `ProcessWarIncome` +- **World state**: `UpdateCitySupply`, `UpdateNationLevel`, `RandomizeCityTradeRate` +- **NPC/Invader flow**: `RaiseInvader`, `RaiseNPCNation`, `ProvideNPCTroopLeader` +- **Betting & unique items**: `OpenNationBetting`, `FinishNationBetting`, + `LostUniqueItem`, `MergeInheritPointRank` +- **Event lifecycle**: `DeleteEvent`, `NoticeToHistoryLog` + +All action execution uses the event environment (`year`, `month`, `startyear`, +`turnterm`, etc.) coming from `game_env`. + +## Static Events (Command Hooks) + +Static events are hooks triggered directly by commands/APIs: + +- `StaticEventHandler::handleEvent()` looks up handler names from + `GameConst::$staticEventHandlers[$eventType]`. +- Handlers live under `legacy/hwe/sammo/StaticEvent/` and implement + `BaseStaticEvent::run()`. +- These hooks are used to extend command behavior without modifying the + command code itself (e.g., troop join/exit side effects). + +## RNG Notes + +Dynamic event actions can use deterministic RNG by constructing +`LiteHashDRBG` with `UniqueConst::$hiddenSeed` and an event-specific tag. +Examples include `RandomizeCityTradeRate` and `UpdateNationLevel`. + +## Open Questions / Follow-ups + +- `Event\Engine` is a stub with a TODO; it is not currently used in the main + turn pipeline. +- The full mapping of `GameConst::$staticEventHandlers` to events should be + extracted from scenario configs and command usage when documenting specific + rule packs. diff --git a/docs/architecture/legacy-engine-items.md b/docs/architecture/legacy-engine-items.md new file mode 100644 index 0000000..7635fce --- /dev/null +++ b/docs/architecture/legacy-engine-items.md @@ -0,0 +1,78 @@ +# Legacy Items, Traits, and Action Modules + +This document summarizes the legacy action modules that supply modifiers and +triggers: items, specials, personalities, nation types, crew types, and +scenario effects. Primary references include `legacy/hwe/sammo/iAction.php`, +`legacy/hwe/sammo/BaseItem.php`, `legacy/hwe/sammo/BaseSpecial.php`, +and `legacy/hwe/sammo/Action*/` directories. + +## Core Concept: `iAction` + +All traits/items/effects implement `iAction` and are merged by +`General::getActionList()` (see `docs/architecture/legacy-engine-general.md`). +They can: + +- Modify stats and command calculations (`onCalcStat`, `onCalcDomestic`, etc.). +- Provide triggers (`getPreTurnExecuteTriggerList`, battle init/phase triggers). +- Apply ad-hoc effects (`onArbitraryAction`). + +`DefaultAction` provides no-op implementations for all hooks. + +## Item System + +- Base class: `BaseItem` implements `iAction` and exposes: + - `getCost()`, `isConsumable()`, `isBuyable()`, `getReqSecu()`. +- Stat items inherit `BaseStatItem` and apply a fixed stat bonus in + `onCalcStat()` based on class name tokens. +- Item instances live on the general (`General::getItem()`); items can also + insert battle triggers (see `ActionItem/`). + +Items are configured via `GameConst::$allItems` and scenario overrides. + +## Specials (Domestic / War) + +- Base class: `BaseSpecial` (implements `iAction`). +- `ActionSpecialDomestic/*` modifies domestic outcomes + (`onCalcDomestic`), e.g., cost/success/score adjustments. +- `ActionSpecialWar/*` injects battle triggers or stat modifiers. +- Weighting and eligibility are managed by `SpecialityHelper`: + - Uses `selectWeight` + stat/arm constraints to choose specials. + - Deterministic RNG affects special selection for NPCs or resets. + +## Personalities + +- Stored in `ActionPersonality/*` and also implement `iAction`. +- Typically adjust core stats or apply small domestic bonuses. + +## Nation Types + +- `ActionNationType/*` extends `BaseNation`. +- Provide global modifiers to income and domestic outcomes. +- Injected per-nation via `buildNationTypeClass()`. + +## Crew Types (Units as Actions) + +- `ActionCrewType/*` defines per-crew `iAction` additions. +- Crew types can alter battle order, apply triggers, or modify war stats. +- For example, `che_성벽선제` forces city battle order to a high value. + +## Scenario Effects + +- `ActionScenarioEffect/*` provides scenario-wide modifiers + (e.g., attacker advantage, trigger overrides). +- Bound to `GameConst::$scenarioEffect` during scenario build. + +## Interaction with Triggers + +Action modules often construct trigger callers: + +- Items and war specials can return `WarUnitTriggerCaller` with `BaseWarUnitTrigger`. +- Some item triggers use `raiseType` to allow coexistence with non-item versions. + +See `docs/architecture/legacy-engine-triggers.md` for trigger execution rules. + +## Open Questions / Follow-ups + +- The precise selection rules for personalities and specials depend on + `SpecialityHelper` RNG thresholds and scenario overrides; capture those + when documenting specific rule packs. diff --git a/docs/architecture/legacy-engine-logging.md b/docs/architecture/legacy-engine-logging.md new file mode 100644 index 0000000..8ea8223 --- /dev/null +++ b/docs/architecture/legacy-engine-logging.md @@ -0,0 +1,36 @@ +# Legacy Logging and Versioning + +This document summarizes logging utilities and version helpers. References +include `legacy/hwe/sammo/ActionLogger.php`, `legacy/hwe/sammo/UserLogger.php`, +and `legacy/hwe/sammo/VersionGitDynamic.php`. + +## ActionLogger + +`ActionLogger` aggregates logs for a general, nation, and global context: + +- Buffers multiple log channels: + - General history/action/battle logs + - National history logs + - Global history/action logs +- Supports formatted prefixes (`PLAIN`, `YEAR_MONTH`, `NOTICE`, etc.). +- `flush()` emits buffered logs via helper functions + (`pushGeneralHistoryLog`, `pushGlobalHistoryLog`, etc.). + +It is used throughout command execution, battle resolution, and event actions. + +## UserLogger + +`UserLogger` writes user-scoped logs to `user_record`: + +- Used for inheritance point spending/awards and other user-level events. +- `push($text, $type)` buffers entries; `flush()` inserts into DB with + `{user_id, server_id, year, month, date, text}`. + +## Version Helpers + +`VersionGitDynamic` exposes runtime Git metadata: + +- `getVersion()` calls `git describe --long --tags` and `git branch`. +- `getHash()` calls `git rev-parse HEAD`. + +These are used for diagnostic display and do not affect gameplay logic. diff --git a/docs/architecture/legacy-engine-pools.md b/docs/architecture/legacy-engine-pools.md new file mode 100644 index 0000000..991271c --- /dev/null +++ b/docs/architecture/legacy-engine-pools.md @@ -0,0 +1,43 @@ +# 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. diff --git a/docs/architecture/legacy-engine-server-env.md b/docs/architecture/legacy-engine-server-env.md new file mode 100644 index 0000000..429a22d --- /dev/null +++ b/docs/architecture/legacy-engine-server-env.md @@ -0,0 +1,25 @@ +# Legacy Server Environment + +This document captures the legacy server-level environment settings and +utilities. References include `legacy/hwe/sammo/ServerDefaultEnv.php`, +`legacy/hwe/sammo/ServerEnv.php`, and `legacy/hwe/sammo/ServerTool.php`. + +## Server Environment + +- `ServerDefaultEnv` holds server-wide constants (e.g., + `maxGeneralsPerMinute`). +- `ServerEnv` extends `ServerDefaultEnv` and is overridden by + `d_setting/ServerEnv.php` when present. + +## Turn Term Management + +`ServerTool::changeServerTerm($turnterm)` adjusts the global turn length: + +1. Validates that `turnterm` divides 120 minutes. +2. Acquires the game lock (`tryLock()`), unless `ignoreLock` is set. +3. Recomputes each general's `turntime` based on the new interval. +4. Updates `game_env.turnterm` and `game_env.starttime`. +5. Broadcasts a global history notice about the change. + +This is a direct mutation of runtime schedule and should be treated as an +administrative operation. diff --git a/docs/architecture/legacy-engine.md b/docs/architecture/legacy-engine.md index 400d964..09eaa12 100644 --- a/docs/architecture/legacy-engine.md +++ b/docs/architecture/legacy-engine.md @@ -45,3 +45,14 @@ organization rather than endpoint-first routing. - Command catalog: `docs/architecture/legacy-commands.md` - Scenario system and rule sets: `docs/architecture/legacy-scenarios.md` - Inheritance points (유산 포인트): `docs/architecture/legacy-inherit-points.md` +- Event system (dynamic/static): `docs/architecture/legacy-engine-events.md` +- Economy and monthly updates: `docs/architecture/legacy-engine-economy.md` +- Auctions and betting: `docs/architecture/legacy-engine-auction.md` +- Items, specials, and traits: `docs/architecture/legacy-engine-items.md` +- City data and helpers: `docs/architecture/legacy-engine-city.md` +- Diplomacy and messaging: `docs/architecture/legacy-engine-diplomacy.md` +- Constraint system: `docs/architecture/legacy-engine-constraints.md` +- Game constants and unit sets: `docs/architecture/legacy-engine-constants.md` +- Server environment tools: `docs/architecture/legacy-engine-server-env.md` +- Logging and versioning: `docs/architecture/legacy-engine-logging.md` +- General pools: `docs/architecture/legacy-engine-pools.md` diff --git a/docs/architecture/todo.md b/docs/architecture/todo.md index 32e1496..fdee661 100644 --- a/docs/architecture/todo.md +++ b/docs/architecture/todo.md @@ -35,3 +35,5 @@ Move items into the main docs once they are finalized. - [AI suggestion] Expand monthly pipeline details (`preUpdateMonthly`, `postUpdateMonthly`, `turnDate`, `checkStatistic`) with concrete side effects and tables touched. - [AI suggestion] Document `ConquerCity()` resolution paths (nation collapse, officer handling, reward/penalty rules). - [AI suggestion] Clarify command prefix semantics (`che_`, `cr_`, `event_`) and add per-command effect summaries. +- [AI suggestion] Document `event` table schema and the static event handler map (`GameConst::$staticEventHandlers`) with command hook examples. +- [AI suggestion] Document auction scheduling (`registerAuction` call sites) and lifecycle timing rules.