문서 추가: 레거시 이벤트 시스템 및 전투 해상도에 대한 상세 설명 추가

This commit is contained in:
2025-12-26 20:03:38 +00:00
parent 21e7c8ddff
commit c11527cce9
3 changed files with 125 additions and 8 deletions
+92 -2
View File
@@ -74,6 +74,96 @@ After `processWar_NG()`:
- Update `diplomacy.dead` for both sides
- If city conquered: call `ConquerCity()`
## Conflict Tracking (`city.conflict`)
City conflict tracks which nations contributed to siege damage, used to
resolve post-war ownership when multiple attackers participate.
Source: `WarUnitCity::addConflict()` in `legacy/hwe/sammo/WarUnitCity.php`.
- `city.conflict` is a JSON map `{ nationID: deadContribution }`.
- Contribution amount is based on city `dead` (minimum 1).
- First/last hit bonus: if no conflict exists yet or city HP is 0, `dead` is
multiplied by 1.05 ("선타, 막타 보너스").
- Contributions are sorted descending via `arsort()` after updates.
- `addConflict()` returns `true` when a new nation enters the conflict, which
triggers the global "분쟁" log in `processWar()`.
- `getConquerNation()` returns the first key of the sorted map to select the
final owner.
- `DeleteConflict($nation)` removes a nation from all city conflicts, used on
nation deletion and on the `che_방랑` flow.
## City Conquest Resolution (`ConquerCity`)
`ConquerCity()` finalizes city ownership, handles nation collapse, and applies
post-siege side effects. It is deterministic with the conquest RNG seed noted
below.
### Common Flow
- Logs conquest to attacker (general/nation/global) and defender nation history.
- Runs `EventTarget::OCCUPY_CITY` handlers via `TurnExecutionHelper::runEventHandler()`.
- Calls `onArbitraryAction(..., 'ConquerCity')` for each defender general in
the city, then persists them.
### Nation Collapse Path
Triggered when the defender nation owns exactly one city (the captured city):
- Calls `deleteNation()` using the defender lord (officer level 12).
- All defender generals lose 2050% of gold and rice, -10% experience, and
-50% dedication, with action logs. Loss amounts are aggregated.
- Optionally issues scout messages to fleeing generals (when `join_mode` allows).
- NPC defenders (NPC type 28 except 5) can auto-queue `che_임관` to the
attacker nation with a random delay (012 turns), gated by
`GameConst::$joinRuinedNPCProp`.
- Attacker reward:
- Half of defender nation gold/rice above base (`GameConst::$basegold`,
`GameConst::$baserice`) plus half of the aggregated general losses.
- Credited to attacker nation and logged to all chiefs (officer level >= 5).
- Runs `EventTarget::DESTROY_NATION` handlers.
### Nation Survives Path
If the defender nation still has other cities:
- Demotes city officers (태수/군사/종사) to general:
- `officer_level = 1`, `officer_city = 0`.
- If the city was the capital:
- Picks a new capital via `findNextCapital()` (closest distance, highest pop).
- Logs an emergency relocation message to global and all nation generals.
- Sets `nation.capital` to new city and halves nation gold/rice.
- Marks new capital as supply city; moves chiefs to it.
- Applies 20% morale loss to all generals (`atmos *= 0.8`).
- Refreshes cached nation static info.
### Final Ownership + City Reset
`getConquerNation()` inspects `city.conflict` to decide final owner. If the
attacker loses arbitration, the city is transferred to the conflict winner
and logs are emitted for both nations.
City stats are reset after ownership is settled:
- `supply = 1`, `term = 0`, `conflict = {}`, `nation = conquerNation`,
`officer_set = 0`.
- `agri/comm/secu` multiplied by 0.7.
- `def/wall` reset:
- If `level > 3`: both set to `GameConst::$defaultCityWall`.
- Else: set to `def_max/2`, `wall_max/2`.
- Frontline status recalculated for all nearby nations (`SetNationFront()`).
### Deterministic RNG
Conquest RNG seed:
`hiddenSeed + 'ConquerCity' + year + month + attackerNationID + attackerID + cityID`.
Used for:
- Defender general loss ratios (2050%).
- Scout message chance and NPC auto-join chance.
- Randomized join turn delay (012).
## `WarUnitGeneral` Highlights
- Train/atmos bonuses depend on city level and attacker/defender role.
@@ -105,5 +195,5 @@ After `processWar_NG()`:
## Open Questions / Follow-ups
- Detailed conquest outcomes (nation collapse, officer handling) extend beyond
the summary here; see `ConquerCity()` in `legacy/hwe/process_war.php`.
- No automatic decay for `city.conflict` is visible; confirm if any scheduled
cleanup exists outside explicit reset paths.