Skip to content

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:

  1. 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."
  2. "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.
  3. 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.
  4. 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.
  5. Code is already on this system. REPUTATION_TIERS and REPUTATION_TRIGGERS in personal_reputation_service.py use the 8-tier model; Player.reputation_tier stores 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 HeroLegendary, Honorable/GoodHeroic, FriendlyLawful, QuestionableSuspicious, Untrustworthy/HostileOutlaw or Criminal (judgment call), VillainVillain. 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.

  • 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.pyREPUTATION_TIERS, REPUTATION_TRIGGERS, apply_weekly_decay.
  • services/gameserver/src/models/player.pyPlayer.personal_reputation, reputation_tier, name_color columns.