Skip to content

feat(ui): implement cartoon PvP duel and authoritative result - #66

Draft
orbyteon wants to merge 9 commits into
mainfrom
feature/cartoon-pvp-duel-result-20260824
Draft

feat(ui): implement cartoon PvP duel and authoritative result#66
orbyteon wants to merge 9 commits into
mainfrom
feature/cartoon-pvp-duel-result-20260824

Conversation

@orbyteon

Copy link
Copy Markdown
Owner

Goal

Implement the approved HOL cartoon live PvP duel and post-match result as modular Unity UI over the existing PlayFab/server-authoritative controller bindings.

Live PvP composition

  • neon background, stars, confetti and outer frame
  • real Leave/Back callback plus logo and dynamic player chip
  • cyan local-player and magenta opponent cards with approved characters
  • production VS burst
  • real round/turn/result texts inside the purple prompt ribbon
  • real guess input, 3×4 keypad, Lock and Guess controls inside the interaction card
  • real signal feed in the modular speech bubble
  • real GuessHistoryRail source/target inside the history card
  • real server-authoritative narrowing range inside the tip card
  • real six-signal vocabulary retained at the bottom

Result composition

  • dynamic localized result ribbon
  • player hero and trophy presentation
  • live opponent card
  • real player/opponent attempt counts
  • real revealed number and persisted streak
  • real rematch secret input, Rematch and Exit callbacks
  • real result Signals and status feed
  • mascots 6 and 7

The generated concept's sample points and trophy deltas are intentionally not shown because HOL's current PvP backend does not authoritatively award those values.

Architecture

  • one PvpDuelCartoonVisuals owner for match/result presentation
  • lifecycle-only installer waits for the runtime-created PvpGameController
  • no flat screenshot UI and no procedural Graphic lookalikes
  • no rewrite of PvpGameController, PvpBackend, GuessHistoryRail, Lock/last-licks, terminal or rematch logic

Regression coverage

PlayMode locks exact 1080×1920 hierarchy, controller-owned field ancestry, 12 real keypad controls, Match and Result sprite assignments, authoritative attempt/revealed values, real rematch/exit controls and absence of procedural Graphics.

No CloudScript, PlayFab, package, monetization or release-version changes.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 140a1f5bad

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

placeholder.color = Muted;
placeholder.alignment = TextAlignmentOptions.Center;
}
input.shouldHideSoftKeyboard = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep the rematch field's mobile keyboard enabled

When the authoritative result offers a rematch on Android, this styling also sets shouldHideSoftKeyboard on rematchSecretInput. Unlike the live guess field, the result screen has no numeric keypad, and ShowRematchOffer disables the match keypad, so touch-only players cannot enter the fresh secret required by OnRematchPressed. Apply this setting only to inputs with a replacement keypad.

AGENTS.md reference: AGENTS.md:L72-L73

Useful? React with 👍 / 👎.

Comment on lines +363 to +367
HideLegacyChildren(panel, root,
pvp.resultPresentation.transform,
pvp.terminalPresentation != null
? pvp.terminalPresentation.transform
: null);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Build the current screen without hiding a legacy hierarchy

At startup, PvpRuntimeUI.BuildPanels first constructs the complete themed match/result UI, after which this new presentation reparents selected controls and disables the remaining children. That creates the prohibited legacy-build-then-replace startup chain and leaves two presentation implementations that must remain structurally synchronized; construct the cartoon hierarchy directly while wiring the existing controller callbacks instead.

AGENTS.md reference: AGENTS.md:L128-L130

Useful? React with 👍 / 👎.

Comment on lines +538 to +540
TMP_Text caption = BodyText(
row.transform, name + "Caption", label, 25f,
new Vector2(-180f, 0f), new Vector2(390f, 46f), NearWhite);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bind result stat captions to live localization

When the player switches between EN and EL after this presentation is built, these captions retain the strings passed by the initial L10n.Get calls because BuildStatRow creates plain text without a LocalizedText binding or refresh path. Consequently the result screen mixes languages until the scene is reloaded; pass localization keys and attach RuntimeUI.Localize to each caption.

AGENTS.md reference: AGENTS.md:L159-L163

Useful? React with 👍 / 👎.

Comment on lines +432 to +434
opponentName.text = pvp.opponentNameText != null
? pvp.opponentNameText.text
: string.Empty;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Refresh the result opponent name from match state

BuildResult runs immediately after PvpRuntimeUI creates opponentNameText, while that source is still empty; the controller only fills it later in OnState. This one-time copy is never refreshed, so the newly added opponent-name field on every normal result remains blank even though the live match card has the opponent's name.

Useful? React with 👍 / 👎.

@orbyteon
orbyteon marked this pull request as draft August 26, 2026 00:33

Copy link
Copy Markdown
Owner Author

CTO stabilization hold: this PvP visual PR is temporarily returned to draft while PR #71 restores the PlayMode execution baseline and fail-closed approved-art contract. Keep the branch intact, but do not merge or extend its installer/runtime-owner architecture. Once stabilization lands, rebase and reassess it against the deterministic bootstrap/prefab migration path.

Copy link
Copy Markdown
Owner Author

CTO integration hold (2026-08-26): this visual branch is preserved but returned to draft until the production-safety baseline in #72 is green and merged. After that, refresh it from current main, resolve architecture/test conflicts, and rerun the exact merge-candidate gates before review. Do not merge this branch on its current diverged baseline.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant