Skip to content

GDD: User Profile

Overview

The User Profile is the canonical identity surface in Overlord. It is split into two views that are always reachable from each other:

  • Profile Card — a popup glorifying the player. Identity, social status, social actions.
  • Hero Screen — a full-screen view glorifying the character. Class, build, stats. Supports Compare and Copy Build for other players.

Both views work for self and for other players, and are reachable from every place in the game that shows an avatar (top-left main HUD, friends list, chat, party, arena, leaderboards, vassal links, gift senders, mail senders). See concept.md for the why; this document specifies what is built.

Mechanics

Reachability

Every avatar in the game is a button. Tapping any avatar opens the Profile Card popup for the corresponding player.

  • Tapping the player's own avatar in the top-left of the main screen opens their own Profile Card.
  • Tapping any other player's avatar (friend list, chat author, leaderboard row, arena opponent, party member, vassal/suzerain plaque, gift sender, mail sender) opens that player's Profile Card.

From the card, "Open Hero Screen" navigates forward and closes the popup.

Profile Card content

For both self and others:

  • Avatar (with selected frame and card background)
  • Nickname (display name)
  • Gender
  • Player ID with one-tap copy-to-clipboard
  • Status line (player-authored, capped length — designer-tunable)
  • Arena: current season rank + league badge
  • Class icon + character Power
  • Suzerain link, if any; or "N vassals" badge, if any
  • Server + timezone
  • Online indicator (bucketed: Online / Today / This week / Inactive)
  • Clan / Guild link, if/when clans ship (placeholder slot)

For other players, the card has these action buttons:

  • Message — opens (or creates) a private chat channel with them.
  • Add / Remove Friend — sends a friend request, or removes with a confirmation popup. Hidden when blocked.
  • Open Hero Screen — navigates to their Hero Screen.
  • Send Gift — visible when relationship allows (friend, vassal, or generic-gift target) and gift state allows sending today. Reuses the existing gift send flow.
  • Block — opens confirmation with optional report-comment textbox; three buttons: Cancel / Block / Report & Block. Blocking applies uniformly: chat, friend requests, party invites, and gift sending.

For self, the action buttons are:

  • Account Settings — username, gender, linked auth providers, notification toggles, region/language.
  • Friends — opens the existing Friends screen.
  • Customize — cosmetic editor (see "Customize" below).
  • Edit Status — opens a text input with length validation, moderation, and a change-cooldown.

Hero Screen content

  • Large character model with current model skin
  • Animated or static background (from the equipped background cosmetic)
  • Class banner — icon + name
  • Power (large)
  • Suzerain summary + vassal slots list (read-only)
  • Equipped skills grid
  • Equipped items / pets
  • Stats button → detailed stats subscreen (HP, damage, crit, etc.)

For other players, Hero Screen exposes:

  • Compare — opens a side-by-side panel: their stats vs. mine, their skills vs. mine, their equipment vs. mine. Differences are visually highlighted.
  • Copy Build — sets the viewing player's equipped skills + items to match the inspected player's loadout, using only items the copier already owns. Pre-confirm checks:
    • If the inspected player is a different class, show a warning popup first; player can cancel.
    • Skills the copier does not own are listed in a post-copy summary; the corresponding skill slots are left empty.
    • Items the copier does not own are left in the inspected slot ("no change") and listed too.
  • Copy Build does not grant any items or skills; it is purely a re-equip operation on what the copier already owns.

For self, Hero Screen exposes:

  • Customize — opens model skin / background picker.
  • Skills — opens the existing skills manager.
  • Change Class — opens the existing class-change flow with its current constraints.

Customize

A flat editor with category tabs. V1 categories:

  • Avatar image (chosen from the existing avatar pool + any unlocked paid avatars)
  • Avatar frame (visible around the avatar everywhere it renders, not just in the profile — friends list, chat, leaderboard, arena banner)
  • Profile card background (visible on the card popup)
  • Hero Screen background (visible on the full-screen view)
  • Model skin (read-only link into the existing skins system)

Each category is an inventory of unlocked cosmetics. Tapping one previews it; "Apply" commits it. "Apply" never costs currency — purchase happens upstream in Shop / Offers / Progress Pass.

Status

Player-authored short text. Constraints:

  • Length cap (designer-tunable; current intent ≤ 150 chars).
  • Same moderation pipeline used by SetUsername.
  • Change cooldown (suggested 1 hour) to discourage spam-flipping abuse.
  • Status defaults to empty for new accounts; empty status renders as a faint placeholder, not a blank line.

Compare

Compare is a stats-and-loadout diff, not a fight simulation. The compared fields:

  • Power (delta).
  • Each tracked combat stat (HP, damage, crit, etc.) — delta and percentage delta vs. self.
  • Equipped skills — visual side-by-side; identical skills greyed, unique skills highlighted.
  • Equipped items — visual side-by-side; rarity & level shown.
  • Pets — leader + supports.

Compare never reveals private inventory; it only inspects what the target has equipped.

Copy Build

The Copy Build operation:

  1. Server receives the copy request with the inspected character ID.
  2. Server reads the inspected player's currently equipped skills, items, and pets (from public state).
  3. Server computes the maximum subset of that loadout the copier owns.
  4. Server applies the new equip configuration for the copier in a single atomic operation.
  5. Response includes the list of skills/items the copier was missing so the UI can show the "missing slots" summary.

A small daily cap on Copy Build operations (designer-tunable) prevents scraping / griefing.

Block

Blocking applies symmetrically and uniformly:

  • Both players are removed from each other's friend list if friends.
  • All incoming chat / private messages from the blocked player are hidden for the blocker.
  • Friend requests, party invites, gift sends, and vassal proposals from a blocked player are rejected server-side.
  • The blocker's profile/hero screen is still publicly visible (we are not hiding leaderboard entries); blocked players can still see the blocker, they just cannot interact.

Unblocking requires a confirmation step and is rate-limited (to discourage block-as-toggle abuse).

Progression / economy

Profile has no power progression of its own. It is the surface on which other systems' progression is displayed and on which cosmetic progression accumulates.

  • Power & Class are rendered, not driven.
  • Arena rank is rendered from the current arena season.
  • Cosmetic inventory grows over time via:
    • Tutorial / quest rewards (initial avatar + 1 starter frame).
    • Progress Pass tiers (frames, backgrounds at milestone tiers).
    • Shop purchases (paid frames, backgrounds, premium avatars).
    • Offers / event bundles (limited-time cosmetic sets).
    • Achievements (e.g., "Reach Arena Diamond" → unique frame).
  • Bond (between friend pairs) — already designed in gd/friends.md, rendered on the friend's Profile Card as a progress indicator.

Currencies involved are existing ones (soft / hard). Cosmetic items live in a new "Cosmetic Inventory" category but reuse the bundle / shop delivery pipeline.

The curve we want: a brand-new player sees an empty Customize tab with 1 starter avatar + 1 default frame; by the time they hit Chapter 2 they have at least one alternative frame from Progress Pass; by the time they hit Arena play they see paid cosmetics in Shop slots aimed at "I want my arena card to look distinct". Specific tier numbers belong to the Progress Pass and Shop GDDs.

UX

Screens & states

  1. Main HUD → tap own avatar → Profile Card (self) popup.
  2. Any list → tap any avatar → Profile Card (other) popup.
  3. Profile Card → Open Hero Screen → Hero Screen full-screen.
  4. Hero Screen → back → previous screen (not the card).
  5. Hero Screen (other) → Compare → modal panel side-by-side; back returns to the Hero Screen.
  6. Hero Screen (other) → Copy Build → confirm modal → result modal listing missing-skill / missing-item warnings.
  7. Profile Card (self) → Customize → cosmetic editor full-screen with category tabs and live preview.
  8. Profile Card (self) → Edit Status → text input modal with character counter, moderation feedback, cooldown lock state.
  9. Profile Card (self) → Account Settings / Friends → existing screens.
  10. Profile Card (other) → Block → confirm modal with optional report-comment field; Cancel / Block / Report & Block.

States

  • Loading — card and hero screen fetch state on open; show skeleton placeholders, never blank pop-up.
  • Stale — if data is older than a few seconds, refresh on focus.
  • Offline target — online indicator shows "last seen" bucket; Message and Send Gift still work (delivered async per existing chat / gift behavior).
  • Blocked target — Profile Card shows the player as blocked; all action buttons except "Unblock" and "Close" are disabled. We do not hide their card — the player asked to block them, they should be able to find them again to unblock.
  • Self-as-other — if a deeplink resolves to my own ID, route to the self-card variant, not the other-card variant.

Animation

  • Card open/close — short slide+fade, no jarring snap.
  • Hero Screen entry — camera-pull on the character model so the screen feels "cinematic" the first time (Hero Screen is meant to glorify the character; flatness wastes the slot).
  • Compare panel — slide-in from the side.
  • Copy Build confirm — explicit "Loadout updated" toast with the missing-items summary.

Localization & accessibility

  • All static strings localized.
  • Status text is user content — not localized.
  • Class names, league names, currency names use existing i18n keys.
  • Numeric values use locale-aware formatting.
  • Color-blind safe palette for the Compare diff highlights.

Visual identity

  • Profile Card — the player's canvas. Background slot is the primary expression surface; avatar frame is the secondary. Card shape and layout stay consistent so frames/backgrounds remain legible.
  • Hero Screen — the character's canvas. Background slot drives mood (e.g., a misty forest scene for chapter-1 nostalgia, a fiery throne for arena top-rankers). Camera composition leaves the character readable against any background.
  • Frames — render at multiple sizes, since the avatar appears in many places (top-left HUD ≈ small, chat row ≈ tiny, leaderboard ≈ small, profile card ≈ medium). All frame art must be authored at the largest size and downscale cleanly.
  • VFX — high-tier frames may have idle particles (subtle). Animated backgrounds are looping, low-cost, never seizure-prone.

Scope

In V1:

  • Profile Card popup, self and other variants.
  • Hero Screen full-screen, self and other variants.
  • Reachability from every existing avatar surface (top-left HUD, friends list, chat, party, arena, leaderboard, vassals, gift sender, mail sender).
  • All listed actions: Message, Friend, Open Hero, Send Gift, Block, Account Settings, Friends, Customize, Edit Status, Compare, Copy Build, Skills, Change Class.
  • Status string with moderation and cooldown.
  • Cosmetic categories: avatar, avatar frame, profile card background, hero screen background. Starter inventory: existing avatar pool
  • 1 default frame + 1 default card background + 1 default hero background.
  • Block applies uniformly to chat, friend requests, party invites, and gift sends (fixes the current gd-generated/social.md gap where gifts ignore block).
  • Analytics events for every interaction (open / customize / status edit / friend / block / compare / copy build / class change).

Cuts / deferred:

  • Clans / guilds: render a placeholder "no clan" slot; full clan integration ships with the Clans feature.
  • Full skin wardrobe (deep cosmetic system over many slots): only the existing skins system is referenced. Profile-introduced cosmetics are limited to avatar / frame / card bg / hero bg.
  • Animated avatars / profile videos: deferred.
  • Profile-to-profile reactions (likes / endorsements): deferred.
  • Public showcase wall (most-recent achievements): deferred to a later "Showcase" feature.
  • Mock-fight in Compare ("would I beat them"): deferred — V1 is stats-and-loadout diff only.
  • Clan / leaderboard banner mounted on Hero Screen background: deferred to clans.

TЗ / tech spec

Not implementation — only what must exist for product+platform to build the feature.

Config shape

A new profile section in GameConfig containing only tunables:

  • status_max_length
  • status_change_cooldown_sec
  • copy_build_daily_cap
  • online_indicator_buckets — list of (seconds-since-last-online, display key) thresholds for the bucketed online indicator
  • default_cosmetic_ids — starter avatar, frame, card background, hero background granted on account creation

A new cosmetics config category containing per-cosmetic entries:

  • id, category (Avatar | AvatarFrame | CardBackground | HeroBackground), display i18n name, rarity tag (for UI sorting), preview asset ref
  • Optional source tag (Progress Pass tier, Achievement, Shop SKU, Default) for UI subtitles like "Earned from Arena Diamond"

Cosmetics are content, not balance — they are organized by category and live alongside skins. There are no per-level cost tables in this config; pricing lives in Shop / Offers / Progress Pass configs.

Backend (conceptual)

The profile feature is mostly a read-and-render surface; most of the underlying state already exists. New things that must exist:

  • A CharacterProfile projection — the canonical "fetch profile for any character" payload, assembled from existing character state (username, avatar, class, power, arena rank, suzerain, vassals, online bucket, equipped cosmetics, status). One server-side endpoint, takes a character id, returns the profile snapshot. Self and other variants gate the same payload's edit fields.
  • A CharacterHeroLoadout projection — equipped skills, items, pets, stats. Same shape used by Compare and Copy Build. Existing essences already model the parts; the projection is the new composition.
  • New events / sync events: set status, apply cosmetic, copy build, open private chat from profile, send friend request from profile, block / unblock, report-and-block. Each follows the existing client→server sync event pattern; payloads validated server-side.
  • Block must extend to gift sending. The existing SetCharacterBlocked event stays; the gift send handler must consult the block list before debiting the sender. (This closes the drift noted in gd-generated/social.md.)
  • Cosmetic ownership tracked per character (a cosmetics_owned map of cosmetic-id → bool), and an "equipped cosmetic per slot" pointer. Grants come from existing bundle / quest / progress-pass delivery pipelines.
  • Status: new persisted field on character (status_text, status_changed_at) with moderation invocation on write and the cooldown check.
  • Copy Build: server-side computation. Inputs: copier id, target id. Output: the new equipped set + the missing-items summary. Atomic; emits the same per-slot equip events the existing equip flow uses.
  • A daily counter for copy_build_uses reset on the standard daily reset.
  • Analytics events for all interactions (open self / open other / edit status / customize / friend / block / message / send gift / compare / copy build / change class).

UI / Unity / art

What must be built:

  • Profile Card popup prefab — self and other variants, with all listed fields and slots for cosmetic frame + background.
  • Hero Screen scene — character model viewport, animated background slot, class banner, power widget, skills grid, equipment widget, pets widget, stats subscreen, action buttons.
  • Compare modal — side-by-side stats + loadout diff, color-blind safe palette.
  • Copy Build confirm + result modals.
  • Customize editor — category tabs (avatar / frame / card bg / hero bg), inventory list, preview viewport, Apply button.
  • Edit Status input modal — character counter, moderation feedback, cooldown lock state.
  • Block confirm modal — Cancel / Block / Report & Block, optional report comment field.
  • Avatar widget — must support frames at small / medium / large sizes; every existing avatar surface in the game must adopt it so frames render correctly everywhere.
  • Art deliveries: starter avatar set (existing), 1 default frame, 1 default card background, 1 default hero background, plus enough paid cosmetics for the V1 Shop / Progress Pass slots (volume owned by those features' GDDs, not this one).
  • VFX: subtle particles for premium frames; looping ambient VFX for paid hero backgrounds.