feat(ui): implement cartoon PvP duel and authoritative result - #66
feat(ui): implement cartoon PvP duel and authoritative result#66orbyteon wants to merge 9 commits into
Conversation
There was a problem hiding this comment.
💡 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; |
There was a problem hiding this comment.
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 👍 / 👎.
| HideLegacyChildren(panel, root, | ||
| pvp.resultPresentation.transform, | ||
| pvp.terminalPresentation != null | ||
| ? pvp.terminalPresentation.transform | ||
| : null); |
There was a problem hiding this comment.
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 👍 / 👎.
| TMP_Text caption = BodyText( | ||
| row.transform, name + "Caption", label, 25f, | ||
| new Vector2(-180f, 0f), new Vector2(390f, 46f), NearWhite); |
There was a problem hiding this comment.
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 👍 / 👎.
| opponentName.text = pvp.opponentNameText != null | ||
| ? pvp.opponentNameText.text | ||
| : string.Empty; |
There was a problem hiding this comment.
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 👍 / 👎.
|
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. |
|
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 |
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
GuessHistoryRailsource/target inside the history cardResult composition
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
PvpDuelCartoonVisualsowner for match/result presentationPvpGameControllerPvpGameController,PvpBackend,GuessHistoryRail, Lock/last-licks, terminal or rematch logicRegression 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.