0003 — Personal Reputation Tier System¶
Status¶
Accepted
Context¶
Personal reputation is the player-alignment dimension orthogonal to military rank and faction standing. It runs on a −1000 to +1000 integer scale stored on Player.personal_reputation, with a cached reputation_tier string and name_color hex value updated on every adjustment.
Two competing tier vocabularies exist:
Legacy spec (9 tiers, relationship-flavored):
| Score range | Tier | Name color (text) |
|---|---|---|
| +750 to +1000 | Hero | Bright Blue |
| +500 to +749 | Honorable | Blue |
| +250 to +499 | Good | Light Blue |
| +1 to +249 | Friendly | Cyan |
| 0 | Neutral | White |
| −1 to −249 | Questionable | Yellow |
| −250 to −499 | Untrustworthy | Orange |
| −500 to −749 | Hostile | Red |
| −750 to −1000 | Villain | Dark Red |
The legacy names describe how the world feels about the player (Hostile, Friendly, Questionable). The 9-tier split allocates equal-ish 250-point bands across the entire scale.
Code / new repo (8 tiers, moral-alignment-flavored):
| Score range | Tier | Name color |
|---|---|---|
| −1000 to −750 | Villain | #FF0000 |
| −749 to −500 | Criminal | #FF4400 |
| −499 to −250 | Outlaw | #FF8800 |
| −249 to −1 | Suspicious | #FFCC00 |
| 0 | Neutral | #FFFFFF |
| +1 to +249 | Lawful | #88FF88 |
| +250 to +499 | Heroic | #00FF00 |
| +500 to +1000 | Legendary | #00FFFF |
The code names describe what kind of person the player is becoming (Villain → Criminal → Outlaw → Suspicious → Neutral → Lawful → Heroic → Legendary). The 8-tier split widens the top band (+500 to +1000 is one tier instead of two) and uses concrete hex colors that map directly to in-game name display.
Decision¶
The 8-tier moral-alignment system in the code (services/gameserver/src/services/personal_reputation_service.py:REPUTATION_TIERS) is the authoritative design. The legacy 9-tier relationship-flavored system is superseded.
Rationale:
- Moral alignment reads better as game flavor. Villain → Legendary is a progression arc that maps onto player identity (criminal record vs heroic reputation). Hero / Honorable / Good / Friendly is descriptive but flatter — three tiers all mean roughly "people like you."
- "Legendary" at +500 to +1000 is a meaningful gameplay milestone. Splitting the top range into Hero (+750) and Honorable (+500–749) dilutes the achievement; collapsing to Legendary makes it a single aspirational target.
- Hex colors render directly. The legacy text-color names ("Bright Blue") require a separate mapping layer to actual hex values for the name-display pipeline. The code already uses hex strings in
Player.name_color. - Symmetric structure. 4 negative tiers / Neutral / 3 positive tiers is asymmetric in a useful way: the four negative tiers exist because the bounty system has thresholds at
−500(Criminal/Outlaw boundary) and−750(Villain) that need named tiers to display. - Code is already on this system.
REPUTATION_TIERSandREPUTATION_TRIGGERSinpersonal_reputation_service.pyuse the 8-tier model;Player.reputation_tierstores one of these eight strings; the player-client UI reads from these values. Reverting to 9 tiers would be a code rewrite without a gameplay benefit.
Consequences¶
Positive:
- The new repo stays in lockstep with shipped code — FEATURES/gameplay/ranking.md and personal_reputation_service.py are now the single sources of truth.
- Bounty thresholds map cleanly onto tier boundaries (−500 = Criminal/Outlaw, −750 = Villain).
- "Legendary" provides a concrete top-end goal that legacy's "Hero" tier diluted.
- Color rendering needs no translation layer — Player.name_color is the hex value directly.
Neutral:
- Old player saves stored under legacy text-color names need a one-time migration. The LEGACY_RANK_MAP pattern (used for military rank renaming) applies here too: a LEGACY_REPUTATION_TIER_MAP translates Hero → Legendary, Honorable/Good → Heroic, Friendly → Lawful, Questionable → Suspicious, Untrustworthy/Hostile → Outlaw or Criminal (judgment call), Villain → Villain. Document this map in ranking_service.py if it doesn't already exist.
Negative:
- Legacy REPUTATION_SYSTEM.md is now stale on the tier vocabulary. Future cross-references to that doc should be redirected to FEATURES/gameplay/ranking.md.
- The narrative depth of "Hostile" / "Untrustworthy" / "Questionable" (which carried distinct social-perception flavor) is lost. We accept this in exchange for a cleaner moral-alignment arc.
Related docs¶
FEATURES/gameplay/ranking.md— the live tier table.SYSTEMS/bounty-and-reputation.md— the bounty thresholds that key off these tiers.services/gameserver/src/services/personal_reputation_service.py—REPUTATION_TIERS,REPUTATION_TRIGGERS,apply_weekly_decay.services/gameserver/src/models/player.py—Player.personal_reputation,reputation_tier,name_colorcolumns.