Files
core2026/docs/architecture/legacy-inherit-points.md
T

5.9 KiB

Legacy Inheritance Points (유산 포인트)

This document describes the cross-season inheritance point system, how points are accumulated, merged, and spent, and which gameplay effects they unlock. References include legacy/hwe/sammo/InheritancePointManager.php, legacy/hwe/sammo/API/InheritAction/*, legacy/hwe/sammo/TriggerInheritBuff.php, legacy/hwe/sammo/API/General/Join.php, and legacy/hwe/sql/schema.sql.

Overview

  • Inheritance points are user-level, cross-game currency.
  • Points are stored in KV storage under inheritance_{userID} and are not cleared on season reset (legacy/hwe/sql/reset.sql does not drop storage).
  • The current spendable balance is stored in the previous key.

Storage and Persistence

  • KV storage: storage table with namespace = inheritance_{userID}.
  • Snapshot table: inheritance_result records per-season snapshots {server_id, owner, general_id, year, month, value}.
  • Logs: user_record with log_type = inheritPoint.

InheritancePointManager::applyInheritanceUser() merges all stored point entries into a single total and writes it back to previous.

Point Types and Sources

The key list is defined in InheritanceKey and configured in InheritancePointManager. Each key has a source and a coefficient.

Directly stored keys (storeType = true):

  • previous (기존 보유): current spendable balance.
  • lived_month: +1 per executed turn (TurnExecutionHelper::executeGeneralCommandUntil).
  • max_domestic_critical: updated via updateMaxDomesticCritical() in legacy/hwe/func_gamerule.php.
  • active_action: incremented by many commands (e.g. che_출병, che_거병, che_건국, various nation commands). Coefficient = 3.
  • unifier: points from unification events (e.g. che_건국 +250, check_united() awards +2000 for high officers).
  • tournament: awarded in tournament routines (legacy/hwe/func_tournament.php).

Computed keys (storeType = false or derived):

  • combat: from rank_data.warnum (war engagements) * 5.
  • sabotage: from rank_data.firenum (strategy success) * 20.
  • dex: sum of arm-type dex, with overflow reduction, * 0.001.
  • betting: betwin * 10 * (betwingold / betgold)^2.
  • max_belong: max of general.belong and aux max_belong, * 10.

Notes:

  • NPCs (npc >= 2) do not earn points.
  • If game_env.isunited != 0, only previous remains available; other keys are suppressed for calculation/spending.

Merge and Apply Lifecycle

The system uses a two-step merge:

  1. Merge (mergeTotalInheritancePoint)
    • Computes derived keys and stores them into inheritance_{userID}.
    • Records a snapshot into inheritance_result.
  2. Apply (applyInheritanceUser)
    • Sums all keys into a total, logs to user_record, resets storage to only previous (plus any rebirth-kept keys).

This merge/apply is triggered in these places:

  • End of season: check_united() calls merge/apply for all player generals when the game is unified.
  • Death: General::kill() merges and applies for the owner and refunds pending inherit actions (random unique, reserved special war).
  • Rebirth: General::rebirth() merges and applies with reduced retention (rebirthStoreCoeff).

Spending and Effects

Join-time bonuses (API/General/Join.php)

Players can spend points during character creation:

  • Choose a war special (inheritSpecial)
  • Select a starting city (inheritCity)
  • Set a turn-time zone (inheritTurntimeZone)
  • Add bonus stats (inheritBonusStat)

Costs are defined in GameConst:

  • inheritBornSpecialPoint
  • inheritBornCityPoint
  • inheritBornTurntimePoint
  • inheritBornStatPoint

InheritAction APIs (API/InheritAction/*)

  • BuyHiddenBuff: buys a hidden buff level (1..5) stored in aux inheritBuff (cost curve inheritBuffPoints).
  • SetNextSpecialWar: reserves the next war special (inheritSpecificSpecialWar).
  • ResetSpecialWar: clears current war special (cost grows by inheritResetAttrPointBase, Fibonacci-extended).
  • ResetTurnTime: randomizes turn time offset for future turns (nextTurnTimeBase).
  • ResetStat: reassigns base stats; optional bonus stats cost inheritBornStatPoint.
  • BuyRandomUnique: flags inheritRandomUnique to guarantee a unique drop once unique items become available (see below).
  • CheckOwner: reveals another general's owner name (cost inheritCheckOwnerPoint).

All of these are disabled once game_env.isunited is set.

Unique items and auctions

  • Random unique: inheritRandomUnique is consumed in tryUniqueItemLottery() when unique items are available. If no items are available, points are refunded.
  • Unique auctions: AuctionUniqueItem uses inheritPoint as the bid currency. Opening an auction requires inheritItemUniqueMinPoint.

Betting rewards

When betting is configured with reqInheritancePoint, rewards are paid directly into previous (Betting::giveReward()), and logged to user_record.

Hidden Buff System (inheritBuff)

The inheritBuff aux value is injected into General as a TriggerInheritBuff action. It modifies:

  • Combat chances: avoid/critical/strategy trial ratios
  • Domestic success/fail probabilities
  • Opponent combat chances (negative modifiers)

Buff levels are 0..5 and multiply coefficients by 0.01 per level.

Rank Tracking

MergeInheritPointRank event aggregates all keys (except previous) into rank_data.inherit_earned_dyn, and then updates:

  • inherit_earned (sum of earned)
  • inherit_spent (from inherit_spent_dyn)

This is used for leaderboard-style tracking.

Key cost and limits (from GameConstBase / scenario overrides):

  • inheritBuffPoints (level costs)
  • inheritSpecificSpecialPoint
  • inheritResetAttrPointBase
  • inheritCheckOwnerPoint
  • inheritItemRandomPoint
  • inheritItemUniqueMinPoint
  • minMonthToAllowInheritItem

Scenario files can override these via const in scenario_*.json.