From 1fd515436c2073e8df44d834ef4d497584a8d823 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 10 Aug 2026 09:38:27 +0200 Subject: [PATCH] =?UTF-8?q?feat(chat):=20Campaign=20CH=20slice=20CH6a=20?= =?UTF-8?q?=E2=80=94=20retail=20chat-window=20layout=20+=208-grip=20resize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Swap ChatWindowController's imported main-chat LayoutDesc from the wrong 0x21000006 (an unrelated layout whose root and 800px resize bar appear nowhere in the EoR gameplay UI) to retail's ACTUAL main chat window, 0x2100006F (window root 0x10000600, authored 410x100 — confirmed by a direct DAT dump, found in dats.Local not dats.Portal). Every downstream compensation that existed only to paper over the wrong import is deleted: the hand-cropped 490px content width, the dropped 800px resize bar, the 9px transcript patch, the orphan-sibling pruning, the max/min-vs-scrollbar overlap shift, and the scrollbar top-reclaim. The window now mounts with RetailWindowChrome.Imported (0x2100006F's own 8 border/corner elements are its complete chrome) instead of the universal nine-slice wrapper. LayoutImporter/DatWidgetFactory gain a Type-9 (UIElement_Resizebar) case: UiResizeGrip decodes retail's exact four-bool BorderLocation algorithm (0x2A=bottom/0x2B=left/0x2C=right/0x2D=top, UIElement_Resizebar::StartMouseResizing @0x0046B7E0) into a ResizeEdges bitmask. A direct DAT dump established the true shape: only 7 of the 8 grip-position ids are Type 9 — the straight top-EDGE strip (0x1000069C) is a Type-2 Dragbar (move handle), not a Resizebar, because the main window has no title bar. UiRoot now gives a directly-hit grip's own edges priority over its generic proximity heuristic, and a directly-hit move handle the same priority over ambient proximity — so the plain top strip moves the window while its two corner grips resize it including the Y axis, and all 4 edges + 4 corners work everywhere else. This also fixes the reported "no diagonal cursor at corners" (CursorFeedbackController's existing RetailCursorCatalog cursor ids already matched the DAT exactly; they just never received a genuine diagonal edge combination) and "cannot grow in Y from the bottom-right corner" (the old NineSlice+crop mount's indirection is gone; the Imported mount uses the DAT's real minH=100/maxH=2000/minW=300/maxW=2000 directly). The 8 cosmetic "_Locked" border-art twins default hidden (register row AP-185 — retail's UiLocked-driven art swap between the two skins is not ported; UiRoot.UiLocked continues to gate the underlying interaction correctly either way). The 4 chat-window-1..4 indicator buttons import generically (visible, inert) for CH6b to wire. The two hand-drawn translucent-black tints on the transcript/input are removed now that their parent panels draw their own authored background sprites. Filed #366 (chat window's new-unseen-text indicator 0x1000048C is swallowed by UiText.ConsumesDatChildren, pre-existing and out of scope). Corrected the research doc's "all eight grips" claim against the direct DAT dump. Full Release suite: 12,317 passed / 4 skipped / 0 failed. Co-Authored-By: Claude Opus 5 --- docs/ISSUES.md | 26 + .../retail-divergence-register.md | 5 +- docs/plans/2026-08-09-chat-parity-campaign.md | 53 +- .../2026-08-09-chat-retail-window-shell.md | 29 + .../UI/Layout/ChatWindowController.cs | 113 +- src/AcDream.App/UI/Layout/DatWidgetFactory.cs | 26 +- src/AcDream.App/UI/RetailUiRuntime.cs | 38 +- src/AcDream.App/UI/UiResizeGrip.cs | 85 + src/AcDream.App/UI/UiRoot.cs | 57 +- src/AcDream.App/UI/UiScrollbar.cs | 5 +- .../UI/CursorFeedbackControllerTests.cs | 57 + .../UI/Layout/ChatLayoutConformanceTests.cs | 241 +- .../UI/Layout/ChatLayoutFixtureGenerator.cs | 17 +- .../UI/Layout/ChatWindowControllerTests.cs | 6 +- .../UI/Layout/DatWidgetFactoryTests.cs | 85 + .../UI/Layout/FixtureLoader.cs | 15 +- .../UI/Layout/RetailLayoutFixtureGenerator.cs | 2 +- ...{chat_21000006.json => chat_2100006f.json} | 11378 ++++++++-------- .../AcDream.App.Tests/UI/UiRootInputTests.cs | 190 + 19 files changed, 6734 insertions(+), 5694 deletions(-) create mode 100644 src/AcDream.App/UI/UiResizeGrip.cs rename tests/AcDream.App.Tests/UI/Layout/fixtures/{chat_21000006.json => chat_2100006f.json} (54%) diff --git a/docs/ISSUES.md b/docs/ISSUES.md index 49d2212d..d5f2d57b 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -166,6 +166,32 @@ headless when the graphical host hydrates fine) BEFORE touching `CanAdvancePlayer` — the #357 closeout warns that dormant-activation classification changes have a strict test matrix. +## #366 — Chat window's new-unseen-text indicator (0x1000048C) imports but is never independently wired + +**Status:** OPEN — filed 2026-08-10, Campaign CH slice CH6a. The retail main +chat window authors a 16×16 "new unseen text" indicator button +(`0x1000048C`, base `0x10000527`/`0x21000040`) as a CHILD of the transcript +text element `0x10000011` (position `(0,57)` relative to the transcript, +i.e. bottom-left of the transcript pane), confirmed in the `0x2100006F` +LayoutDesc dump. `UiText.ConsumesDatChildren` is `true` (Type-12 behavioral +widgets reproduce their dat sub-elements procedurally per +`DatWidgetFactory`'s own doc comment), so `LayoutImporter.BuildWidget` +never builds `0x1000048C` as a separate widget — it is silently swallowed, +same as under the wrong `0x21000006` layout before it (not a CH6a +regression). No controller anywhere binds or drives its visible state. +**Not in CH6a's scope** (transcript/input/scrollbar/1-4-buttons only) and +not obviously CH6b/CH6c's either — files here as a standalone gap. Fix +shape: either give `UiText` an opt-in mechanism to keep specific named +non-Type-3 children (mirroring `UiMeter`'s existing text-overlay carve-out +in `DatWidgetFactory.BuildWidget`), or handle `0x1000048C` as a special +case the same way. Needs research first: what triggers retail's "new text" +indicator (unread-since-scroll-position?) and what it visually does on +click — not decoded by CH6a. + +**Where:** `src/AcDream.App/UI/Layout/ChatWindowController.cs`; +`src/AcDream.App/UI/Layout/LayoutImporter.cs` +(`BuildWidget`/`ConsumesDatChildren` handling); `src/AcDream.App/UI/UiText.cs`. + ## #364 — Three `/help` group topics still partial: HelpStupidChannelHack unresolved **Status:** OPEN — filed 2026-08-09, Campaign CH user-gate round 2, item 3. diff --git a/docs/architecture/retail-divergence-register.md b/docs/architecture/retail-divergence-register.md index 5ac99aea..e4ca40d2 100644 --- a/docs/architecture/retail-divergence-register.md +++ b/docs/architecture/retail-divergence-register.md @@ -53,7 +53,7 @@ accepted-divergence entries (#96, #49, #50). | IA-12 | UI toolkit mirrors retail behavior from research docs, not a byte-port — keystone.dll is outside decomp coverage; observed constants embedded (drag 3 px, tooltip 1000 ms). Synthetic wrapper borders/whole-window drag regions use the exact DAT Type-2/Type-9 control cursors. `gmPanelUI` children are independently imported retained frames rather than one physical parent, but `RetailPanelUiController` owns their one canonical geometry and exclusive child lifecycle | `src/AcDream.App/UI/README.md:3`; `src/AcDream.App/UI/CursorFeedbackController.cs`; `src/AcDream.App/UI/Layout/RetailPanelUiController.cs` | keystone.dll has no PDB/decomp; semantics are reconstructed from retail UI deep-dives, named client methods, and production LayoutDesc media. Separate child wrappers preserve each LayoutDesc's content tree while typed move/resize synchronization gives all registered toolbar/detail children the same persistent parent rectangle | Edge-case low-level input semantics can differ silently even though outer geometry, visibility, and restore-previous ownership match | `UIElementManager::CheckCursor` 0x0045ABF0; `UIElement_Resizebar::StartMouseResizing` 0x0046B7E0; `UIElement_Dragbar::StartMouseMoving` 0x0046C760; `gmPanelUI::SetupChildren` 0x004BC9E0; docs/research/retail-ui/04-input-events.md | | IA-13 | GameEventType registry deliberately omits event types retail ignores; unknown events fall through unhandled | `src/AcDream.Core.Net/Messages/GameEventType.cs:11` | Retail also ignores them — dropping matches retail by construction | If the "retail ignores X" judgment is wrong for any opcode (or a server mod uses one), the event is silently dropped with no diagnostic pointing at the omission | retail GameEvent dispatch (ignored-event set) | | IA-14 | Rendering + dat-handling base is WorldBuilder's tested port, not a fresh retail-decomp port (Phase N.4/O design stance) | `docs/architecture/worldbuilder-inventory.md` (code at `src/AcDream.{Core,App}/Rendering/Wb/`) | WB visually verified on the AC world, MIT, same stack; known WB↔retail deltas resolved case-by-case — terrain split kept retail `FSplitNESW` (**#51**, pinned by `SplitFormulaDivergenceTest`), scenery drift accepted (AP-31) | A WB-upstream divergence not yet caught ships silently as "our" behavior; guard = the inventory doc's 🟢/🔴 split + per-formula divergence tests | retail decomp per algorithm; `tests/.../SplitFormulaDivergenceTest.cs` | -| IA-15 | D.2b gameplay UI is our own `UiHost`/`UiRoot` retained tree, not a byte-port of Keystone. `RetailUiRuntime` owns the production import/mount graph; `RetailWindowManager`/typed handles centralize registry, raise, focus/capture cleanup, lifecycle events, reverse-order grouped controller teardown, removable Silk input subscriptions, schema-v2 per-character/per-resolution automatic layouts with per-window authored-geometry revisions, and portable named `saveui/loadui` profiles; `RetailWindowFrame` is the single production/Studio mount contract for imported-chrome and shared-wrapper windows. Production LayoutDesc imports include vitals `0x2100006C`, chat `0x21000006`, toolbar `0x21000016`, character `0x2100002E`, inventory `0x21000023` plus mounted `0x21000024/22/21`, dialog catalog `0x2100003C`, radar `0x21000074`, and external container `0x21000008` (shared bevel plus a user-directed compact 700-pixel initial content width instead of its authored 800-pixel root). The dialog context/queue/callback lifecycle is now a named-client port; only its retained rendering remains under this Keystone adaptation. | `src/AcDream.App/UI/RetailUiRuntime.cs`; `src/AcDream.App/UI/RetailWindowManager.cs`; `src/AcDream.App/UI/RetainedPanelControllerGroup.cs`; `src/AcDream.App/UI/UiHost.cs`; `src/AcDream.App/UI/RetailWindowLayoutPersistence.cs`; `src/AcDream.App/UI/Layout/RetailWindowFrame.cs`; `src/AcDream.App/UI/Layout/RetailDialogFactory.cs`; `src/AcDream.App/UI/Layout/RetailConfirmationDialogView.cs`; `src/AcDream.App/UI/Layout/ExternalContainerController.cs`; `src/AcDream.App/UI/Layout/LayoutImporter.cs`; binding supply in `GameWindow.cs` | Keystone has no matching PDB/decomp, so we preserve its observable ElementDesc/state/input behavior from DAT, named client call sites, and live evidence while using modern retained ownership. Real RenderSurfaces and imported element geometry remain the visual oracle; the external strip's initial width follows the connected visual direction and remains horizontally resizable to its authored extent or the viewport edge. | Persistence and low-level widget rendering are behaviorally reconstructed from retail semantics rather than a Keystone byte-port; lifecycle edge cases remain constrained by conformance tests. The external strip opens 100 pixels narrower than the raw LayoutDesc before user/persistence resizing. | Production LayoutDesc objects; `DialogFactory @ 0x004773C0..0x00478470`; `gmExternalContainerUI @ 0x004CBAD0..0x004CBFE0`; `docs/research/2026-07-13-retail-dialog-factory-pseudocode.md`; Keystone behavior notes in `docs/research/retail-ui/` | +| IA-15 | D.2b gameplay UI is our own `UiHost`/`UiRoot` retained tree, not a byte-port of Keystone. `RetailUiRuntime` owns the production import/mount graph; `RetailWindowManager`/typed handles centralize registry, raise, focus/capture cleanup, lifecycle events, reverse-order grouped controller teardown, removable Silk input subscriptions, schema-v2 per-character/per-resolution automatic layouts with per-window authored-geometry revisions, and portable named `saveui/loadui` profiles; `RetailWindowFrame` is the single production/Studio mount contract for imported-chrome and shared-wrapper windows. Production LayoutDesc imports include vitals `0x2100006C`, chat `0x2100006F` (Campaign CH slice CH6a corrected this from the previously-imported, unrelated `0x21000006`), toolbar `0x21000016`, character `0x2100002E`, inventory `0x21000023` plus mounted `0x21000024/22/21`, dialog catalog `0x2100003C`, radar `0x21000074`, and external container `0x21000008` (shared bevel plus a user-directed compact 700-pixel initial content width instead of its authored 800-pixel root). The dialog context/queue/callback lifecycle is now a named-client port; only its retained rendering remains under this Keystone adaptation. | `src/AcDream.App/UI/RetailUiRuntime.cs`; `src/AcDream.App/UI/RetailWindowManager.cs`; `src/AcDream.App/UI/RetainedPanelControllerGroup.cs`; `src/AcDream.App/UI/UiHost.cs`; `src/AcDream.App/UI/RetailWindowLayoutPersistence.cs`; `src/AcDream.App/UI/Layout/RetailWindowFrame.cs`; `src/AcDream.App/UI/Layout/RetailDialogFactory.cs`; `src/AcDream.App/UI/Layout/RetailConfirmationDialogView.cs`; `src/AcDream.App/UI/Layout/ExternalContainerController.cs`; `src/AcDream.App/UI/Layout/LayoutImporter.cs`; binding supply in `GameWindow.cs` | Keystone has no matching PDB/decomp, so we preserve its observable ElementDesc/state/input behavior from DAT, named client call sites, and live evidence while using modern retained ownership. Real RenderSurfaces and imported element geometry remain the visual oracle; the external strip's initial width follows the connected visual direction and remains horizontally resizable to its authored extent or the viewport edge. | Persistence and low-level widget rendering are behaviorally reconstructed from retail semantics rather than a Keystone byte-port; lifecycle edge cases remain constrained by conformance tests. The external strip opens 100 pixels narrower than the raw LayoutDesc before user/persistence resizing. | Production LayoutDesc objects; `DialogFactory @ 0x004773C0..0x00478470`; `gmExternalContainerUI @ 0x004CBAD0..0x004CBFE0`; `docs/research/2026-07-13-retail-dialog-factory-pseudocode.md`; Keystone behavior notes in `docs/research/retail-ui/` | | IA-17 | Toolbar chrome is toolkit-supplied through the central `RetailWindowFrame` mount (`UiCollapsibleFrame` 8-piece bevel) because LayoutDesc `0x21000016` carries no baked frame. It also supports a toolkit-defined collapse-to-one-row (bottom-edge resize snapping between a row-1-only and a two-row height, row-2 visibility tied to the stop) — retail's real collapse is keystone.dll (no decomp) and the DAT stacks both rows always. | `src/AcDream.App/UI/Layout/RetailWindowFrame.cs`; `src/AcDream.App/UI/UiCollapsibleFrame.cs`; toolbar policy in `GameWindow.cs`; spec: `docs/superpowers/specs/2026-06-20-d2b-toolbar-collapse-design.md` | The central mount now owns wrapper geometry/registration uniformly; border-over-content prevents the row-2 right cap from poking through | The collapse stops remain a toolkit reconstruction rather than a byte-port of Keystone behavior | gmToolbarUI WM chrome (keystone.dll, no PDB); no bevel ids in LayoutDesc 0x21000016 (toolbar dump) | | IA-18 | Effect overlay tile (enum 0x10000005) is a `ReplaceColor` SURFACE SOURCE — pure-white pixels in the composited drag icon are replaced PER-PIXEL with the same (x,y) pixel of the effect tile (the SURFACE overload `SurfaceWindow::ReplaceColor` 0x004415b0), preserving the tile's texture/gradient; the tile itself is NOT blitted as an additional layer. This IS faithful retail behavior. **Anti-regression: do NOT re-implement this as a blit layer NOR as a flat-color replace (it is a per-pixel surface copy).** | `src/AcDream.App/UI/IconComposer.cs` (`ReplaceWhiteFromSurface`) | Faithful port of `IconData::RenderIcons` @407614 → the SURFACE overload `ReplaceColor` 0x004415b0 (`dst[x,y]=src[x,y]` where `dst==white`); confirmed via clean Ghidra decompile + named decomp + visual (the Energy Crystal's blue is a gradient, 2026-06-17). | A blit-layer or flat-color re-implementation would show the wrong effect look (no gradient) — the visual-verification regression that retired the mean-color approximation | `IconData::RenderIcons` acclient_2013_pseudo_c.txt:407524; `ReplaceColor` SURFACE overload 0x004415b0:71656; `docs/research/2026-06-17-stateful-icon-RESOLVED.md` | | IA-19 | Automatic combat acquisition is narrowed to attackable non-player monsters. Retail `AutoTarget` falls back to `SelectNext(SELECTION_TYPE_COMPASS_ITEM)`, whose combat filter can also admit attackable enemy players in compatible PK states. | `src/AcDream.Core/Combat/CombatTargetPolicy.cs`; consumers `src/AcDream.App/Interaction/WorldSelectionQuery.cs` (`IsHostileMonster`/`FindClosestHostileMonster`) and `SelectionInteractionController.cs` (`SelectClosestCombatTarget`). This row is auto-acquisition-only: as of #298, explicit-target admission and the combat camera route through the separate, retail-exact `WorldSelectionQuery.IsAttackableTarget` (`ObjectIsAttackable`-backed) instead, so a compatible-PK player is a valid manual attack/camera target — do not assume one predicate still serves both concerns. | Explicit product direction: Auto Target must never select NPCs, players, pets, or other objects; manual player-selection commands remain available | In PK play, Auto Target will not acquire an otherwise valid hostile player as retail would; the player must be selected manually | `ClientCombatSystem::AutoTarget @ 0x0056BC80`; `CPlayerSystem::SelectNext @ 0x0055F9A0`; `ClientCombatSystem::ObjectIsAttackable @ 0x0056A600` | @@ -170,7 +170,7 @@ readiness/requeue adaptation. See --- -## 3. Documented approximation (AP) — 130 active rows (AP-184 filed 2026-08-09 at Campaign CH user-gate round 2, item 3 — three of the seven retail `/help` group-topic listings (channels/chatting/commands) remain PARTIAL, not fully verbatim: their detail text is built in full or in part by `ClientCommunicationSystem::HelpStupidChannelHack @0x0056f290`, which constructs its output from three BN-mislabeled data fragments (`&ClientCommunicationSystem::\`vftable'.RecvNotice_StartBarberNotice` etc. are NOT real vtable dispatch) concatenated around a live `ChannelSystem::GetChannelName` lookup, not decodable with confidence from a static string sweep; each partial group keeps its own verbatim summary line and an explicit UNVERIFIED note instead of the fully-fabricated meta-message the user caught on `/help death` (that group, plus status/text/allegiances, are now COMPLETE verbatim listings); tracked as ISSUES.md #364. Round 2 item 2 also deletes `PortalWaitNoticeController` (the dedicated centered-overlay presentation the user reported was the wrong retail surface) and reroutes the portal-space wait-cue notice through the same `AddText`/SpewBox chokepoint every other on-screen interface-text site uses — AP-178's open SpewBox position/extent/font/colour questions now cover this notice too, since its separate controller and consts are gone; no new row was needed for the surface mismatch itself, since it was never separately registered (`PortalWaitNoticeController`'s own doc comment asserted "not a chat message" as an accepted design, not a flagged divergence). AP-150 RETIRED 2026-08-09 at Campaign CH user-gate round 1, item D (#329) — `PortalTunnelPresentation.TickRotation` now emits `"In Portal Space - Please Wait..."` unconditionally on every rotation-segment expiry, exactly matching `gmSmartBoxUI::UseTime`'s `else`-arm at 0x004D6FCD, instead of gating on `_waitCueVisible`, which only ever went true after the invented 5-second `RuntimeWorldTransitState.RetailWaitCueDelay` hold; `RetailWaitCueDelay`/`ObserveWait`/`SetWaitCue` remain as `LocalPlayerTeleportController`'s own hold-delay telemetry (`RuntimePortalSnapshot.WaitCueShown`) but no longer gate the on-screen cue, so they are not a residual of this row — closes issue #329; AP-183 filed 2026-08-09 at the CH4 REJECT-review, item 9 — roughly 10 chat refusal/usage call sites this campaign added route through `ChatVM.ShowSystemMessage`'s single `ClientLocal 0x00` sink where retail types several of them `0x1A`: `DoStupidChannelHack`, `DoChannelList`/`On`/`Off`, `DoAllegiance`, `DoHouseAvailableList`, `DoReply`; three sites (`DoSpeaker`/`DoEndurance`/`DoTitle`) are already correct at `0x00`, matching retail. Retail's own bad-args fallback (`DoCommand @0x0057E46D`) also answers with `HandleFailureEvent(0x26)`, not a local "Usage:" line, which acdream's `ChatCommandRouter.Submit` synthesizes instead. Deliberately NOT re-plumbed this session — filed as issue #363, marked for CH5-or-later; AP-182 filed 2026-08-09 at Campaign CH slice CH4, corrected at the CH4 REJECT-review (nit 11) — `@title` is wired to a pure no-op (the value is neither stored nor consumed anywhere) and also omits `DoTitle`'s three local failure messages; recount at the CH3 Opus review corrected a pre-existing off-by-one; AP-181 filed 2026-08-09, Campaign CH slice CH3 — the local chat spam throttle (`IsMessageSpam`) has no acdream port. AP-178 NARROWED 2026-08-09 at the CH2 REJECT-review rework NIT 3, wording corrected at the CH2 re-review nits pass (`docs/plans/2026-08-09-chat-parity-campaign.md`, nits 1/2/6) — the original `dats.Portal` pass used an id source that was not Portal's own (`dats.Portal.GetAllIdsOfType()` is empty for this type), so it established nothing about Portal either way; extending a correctly-paired sweep to `dats.Local` FOUND the SpewBox element there; extent (`450×72`) and `MaxConcurrentItems` (`4`, not the code-default `1`) are now AUTHORED, leaving absolute screen position, colour, AND vertical content flow (now TOP-aligned, acdream's own invention pending measurement) open. AP-180 filed 2026-08-09 at the CH2 REJECT-review rework — `RuntimeCommunicationState.AddText`'s `windowId` parameter is accepted but not consumed, so retail's dual-destination echo (a `0x1A` message with a non-zero `windowId` lands in both the SpewBox and its originating chat window) is unimplemented; latent today since every production caller passes `windowId = 0`. AP-177/AP-178/AP-179 filed 2026-08-09, Campaign CH slice CH2 (interface text / SpewBox) — AP-177 records the invented 5-second SpewBox line lifetime (retail's real timeout is keystone-owned and unmeasured); AP-178's original filing recorded the invented SpewBox screen position/extent/font/colour/MaxConcurrentItems after `SpewBoxLayoutDumpDiagnostic`'s Portal-only sweep found zero elements of class 0x10000016 — see the NARROWED note above for the corrected finding; AP-179 is the OnCombatLine half of the RETIRED AP-176 split out to its own row. AP-176 RETIRED the same day — the WeenieErrorMessages full 344-row `HandleFailureEvent` port (`WeenieErrorMessages.Resolve`) replaces the single-stand-in-`LogTextType` approximation that row recorded for `ChatLog.OnWeenieError`. AP-175 filed 2026-08-09, Campaign CH slice CH1 — PopUpString renders as a chat-log line instead of retail's modal dialog; AP-39 updated the same day — chat coloring is now retail's exact 34-value `LogTextType` table, not a synthetic per-`ChatKind` approximation of it. AP-173 and AP-174 filed 2026-08-08, Campaign A slice A2 — AP-173 expresses retail's ±15 dB DirectSound pan as an OpenAL azimuth by inverting the constant-power pan law, since AL exposes no per-channel gain for a mono source; AP-174 records acdream's extra master volume knob on top of retail's three, folded into retail's single master multiply so the −50 dB cutoff and dB quantisation move with it. AP-172 and AP-171 filed 2026-08-08, #354 spell-bar drag-reorder fix — the favorite-bar reorder gesture defers its own list rebuild for the drag's duration so `UiRoot`'s drag-cancel safety net cannot destroy the in-flight cell, compensating the drop-time target index for the resulting stale sibling numbering; final positions and the wire pair are retail-exact, only the mid-drag visual reflow timing differs. AP-170 filed 2026-08-08, grand-gate finding G3 — an out-of-range vendor Use now arms on arrival instead of sending immediately, because the user's local ACE server polls for the player to actually reach use range before opening the shop panel and a too-early Use is silently lost; AP-169 filed 2026-08-08, grand-gate finding G2 — the vendor toolbar split-slider resolver falls back to the packed shop-supply-count field when the item's own `PublicWeenieDesc._stackSize` is absent, because the user's local ACE server never populates the latter for a browse-list item; AP-167/AP-168 filed 2026-08-09 at the Opus review of `92ea3977` (findings F1/F6) — Buy All's container-vs-item slot classification approximates retail's bitfield/capacity test with `ItemType.Container` [AP-168], and SellSingleItem's non-empty-container refusal branch is not ported [AP-167]; AP-164 RETIRED the same review (finding F4) — BF_RETAINED is now checked end to end; AP-162 NARROWED the same review (finding F1) — Buy All's four client-side pre-send guards are now ported, leaving only the single-item TryBuy path without one; AP-161 gains a REVIEW CORRECTIONS paragraph the same review (findings F1-F13) summarizing the rest as bug fixes to already-claimed behavior, not new divergences. AP-164/AP-165/AP-166 filed 2026-08-09 at Slice 6b/6c (staging+sell arc) — InqAcceptability's non-sellable bitfield is unmodeled [AP-164], the Buy-side stackable-removal-amount test substitutes DescStackSize for retail's _maxStackSize [AP-165], and the Buying/Selling tabs' own purse/count text plus the cross-panel pending-sell inventory highlight are unwired [AP-166]; AP-161 NARROWED the same day — the row's last vendor-specific residual (Buying/Selling tabs render but carry no data binding) CLOSES now that both tabs are fully wired (staging, drag-to-sell, InqAcceptability gating, Sell 0x0060, the X-close confirmation), leaving only the two long-standing PRE-EXISTING residuals (dropdown arrow-cap glyph, alt-currency m_last_sale simplification) plus the three new AP-164/165/166 residuals just filed; AP-162 EXTENDED the same day — the same no-client-pre-check omission now also covers the batched "Buy All" path (TryBuyAll), not just the single-item TryBuy. AP-162/AP-163 filed 2026-08-09 at Slice 6.3 (buy arc) — no client-side Buy affordability/capacity pre-check [AP-162] and the shop-item guid-collision skip-not-clobber policy [AP-163]; AP-161 NARROWED the same day — the private-selection and unwired-examine residuals CLOSE at Slice 6.1/6.2, leaving only the dropdown arrow-cap glyph and the alt-currency `m_last_sale` simplification, plus a confirmed-absent-from-retail note on double-click-to-buy. AP-161 REWRITTEN 2026-08-09 at the Slice 5.4 review (findings F1-F8) — the popup-never-rendered, wrong-quantity-price, no-auto-select, dropped-icon-layer, stale-category-on-vendor-switch, and unguarded-Apply-fanout bugs the review found are fixed (`VendorUiController.cs`, `VendorState.cs`, `GameEventWiring.cs`, `RetailUiRuntime.cs`); the row now records only the four consciously-deferred residuals it still owns (private per-panel selection vs. retail's global `ACCWeenieObject::selectedID`, the unwired shop-item examine route, the dropdown button-face arrow-cap glyph, and the alt-currency held-amount's `m_last_sale`-free simplification). AP-110's "retail-correct per-unit prices" phrasing is corrected the same day to "quantity-correct pricing" — the OLD phrase mischaracterized what retail even shows (a `GetObjectSplitSize`-quantity price, not literally one unit) independent of whether the code was buggy. AP-161 filed 2026-08-09 at Slice 5.4 (vendor browse panel) — the authored "Buying"/"Selling" tabs render and switch pages but carry no data binding, per contract decision 8's required successor to AP-110's narrowing; AP-110 NARROWED the same day — "vendor" is retired from its absent-panels list now that the "Items" browse tab is user-reachable. AP-160 filed 2026-08-07 at Slice 5.3 — the client-local vendor-panel distance watcher closes on plain 3D center distance instead of retail/ACE's cylinder-gap distance, because Runtime has no per-entity collision radius/height source outside the App-layer's Setup-cylinder resolver. AP-158 RETIRED 2026-08-06 by the #333 fix, closing #337 — the `maxReach` distance pre-filter is DELETED rather than re-centred, because retail has none: `CObjCell::find_obj_collisions` @0x0052b750 walks the cell's shadow list and calls `CPhysicsObj::FindObjCollisions` unconditionally. The row's predicted symptom was observed live at Neftet before it was fixed — a tall prop AP-156 had just placed correctly still not blocking, plus jumps sinking into the mesh and corpses falling through. Perf measured, not assumed: at the live-maximum 38 in-cell candidates 10.61 µs → 16.68 µs per resolve. AP-159 filed 2026-08-06 at the #334 fix — the INDOOR half of AP-156’s traversal residual is all that remains of it; the outdoor half is CLOSED by the `find_bbox_cell_list` port, and AP-156’s RISK COLUMN IS CORRECTED at the same commit: it recorded the residual as “extra broadphase candidates, never a missed one”, which generalised the indoor direction to the whole row and is exactly why #334 — a MISSED one, and a user-observed loss of collision on landblock-spanning formations — sat inside it unnoticed. AP-158 filed 2026-08-06 at the AP-156 fix review — the shadow broadphase's `maxReach` distance pre-filter is acdream's own invention with NO retail counterpart, and it measures from the part origin, so it can discard a genuine contact for exactly the off-centre parts AP-156 just placed correctly; issue #333. AP-156 CORRECTED at the same review: its population was understated — 172 is AP-152's DISPATCH population, not AP-156's CONTAINMENT population. AP-155 NARROWED and AP-156/AP-157 filed 2026-08-06 at the AP-152 retail-conformance review. AP-155 bundled two divergences with different code paths, populations and gates under one id; its flood half is now AP-156, **with its direction corrected**. AP-155(b) recorded the BSP flood approximation as OVER-inclusive and used that direction as the reason the residual was safe to defer; measured over the installed DAT it was UNDER-inclusive for 428 of the 530 BSP-bearing Setups (the AP-156 fix review corrected the originally-recorded '170 of 172'), because `BuildFloodSpheres` carried each physics-BSP part's root bounding-sphere RADIUS while discarding that sphere's own ORIGIN and centring it on the part origin. That is the #98/#168 class, and for 43 Setups the post-AP-152 flood was strictly smaller than the pre-AP-152 one. AP-156 records the correction and the fix — `ShadowShape.BoundsCenter`, filled from the same resolver that supplies the radius, plus the retirement of the 10-sphere clamp on a branch where retail has none — and keeps open only the sphere-vs-portal TRAVERSAL approximation. AP-157 is the previously unregistered third-branch substitution: retail floods from one `CPartArray::GetSortingSphere` where acdream floods from every Sphere shape, and acdream's cylinder flood ignores `CylHeight`. AP-152 RETIRED 2026-08-06, one day after it was filed: `ShadowShapeBuilder.FromSetup` now dispatches BSP-first instead of unioning, and `ShadowObjectRegistry.BuildFloodSpheres` now applies `calc_cross_cells`' own BSP → cylsphere → sorting-sphere order. Four statements in the row were false and are corrected in its retirement text — most importantly its predicted symptom, "catching on a doorway sill", which could not have been occurring: `Transition.BspOnlyDispatch` had already made the extra primitive inert at collision-query time since 2026-05-25. The live half was CELL MEMBERSHIP, the #98/#168 symptom class, which had no such guard. AP-153/AP-154/AP-155 filed at that retirement — retail's dispatch flag is cached once at part-array construction where acdream's gate is live [AP-153]; acdream's query-time guard takes a CLIENT-DERIVED flag off the WIRE and never derives it, an undeclared dependency on ACE reading the same DAT bit [AP-154]; and the static publication paths emit a Setup Sphere as a height-capped Cylinder while `BuildFloodSpheres` approximates retail's bounding BOX with bounding SPHERES [AP-155, whose flood-priority half is closed by the same commit]. AP-152 filed 2026-08-06 at the AP-22 retirement — the LIVE collision path emits Setup primitives and per-part physics-BSP shapes additively where retail's `CPhysicsObj::FindObjCollisions` dispatches exclusively; 172 of 5,935 installed Setups are affected, including BSP doors, so it needs its own visual gate and was deliberately not folded into the AP-22 commit; the count is unchanged because AP-22 retired in the same commit. AP-22 RETIRED 2026-08-06 — retail synthesizes no shape for a shapeless object (`CPhysicsObj::FindObjCollisions` 0x0050f050 exits at `0x0050f22f je 0x50f31b` returning the seeded OK_TS, and `CPartArray::GetRadius`/`GetHeight` are absent from its whole call set), so the invented `setup.Radius` cylinder was deleted rather than re-derived; the row's site list named one file that never contained the fallback and omitted the two that did, one of them the headless-only copy, and its "rare decorative props" risk described an unreachable branch — 0 of 5,935 installed Setups can satisfy the guard. AP-150/AP-151 filed 2026-08-06 at the #280 dual review — the wait cue's five-second arming is acdream's own and not retail's trigger [AP-150], and the reveal gate is materially stricter than retail's DAT-residency prefetch predicate on the mesh-build/GPU-upload axis [AP-151], the opposite asymmetry from AP-149; AP-149 filed 2026-08-05 at the #280 portal-prefetch fix — the reveal gate's outer ring accepts terrain-only publication where retail requires LandBlockInfo and every building EnvCell; the fix closes the reveal-window/visible-window ratio, not this residual; AP-148 filed 2026-08-05 at the C5b closeout — acdream's local-player Gate A requires the wire TELEPORT_TS to be EQUAL where retail requires only that it not be OLDER, verified by disassembly against the PDB-paired binary after two review rounds read the Binary Ninja tautology and missed it; AP-147 filed 2026-08-05 at the C5b architecture review, finding D3 — the accepted-Position delta stream's cardinality change and its torn intermediate; AP-138 amended at the same review — C5b staled its route-2 first-submit `CurrentCellId` measurement; AP-131 RETIRED 2026-08-05, C5b, closing #275 — the steady-state merge's `installPlacementFrame: true, clearParent: true` literals no longer exist; `InboundPhysicsStateController.TryApplyPosition` now computes both flags PRE-MERGE from `(disposition, hasAnimations(old))`, which is exactly `RuntimeAuthoritativePositionRouteClassifier.ClassifyAcceptedPosition`'s own `ApplyPlacementFrameBeforeRouting`/`UnparentBeforeRouting` rows (false/false on the Gate A force row, `!HasAnimations`/true on every accepted non-force route). Retail decides both writes BEFORE `MoveOrTeleport` is consulted — Gate A @0x0045400C returns @0x0045409D ahead of `unset_parent` @0x00454129 and the `HasAnims` `SetPlacementFrame` gate @0x00454137 — so the flags need no route, no player distance and no signature change. The row's predicted symptoms are gone: an animated entity's ordinary Position no longer installs a placement frame retail skips, and a ForcePosition no longer unparents. Evidence: `InboundPhysicsStateControllerTests` — `ApplyOnAnimatedEntity_NeverInstallsTheWirePlacementFrame`, `ApplyOnNonAnimatedEntity_InstallsTheWirePlacementFrame`, `ForcePositionOnParentedLocalPlayer_RetainsTheParentAttachment`, and the 12-row `MergedPrePlacementFieldsMatchTheClassifiedRouteFlags` matrix which uses the production classifier as its oracle rather than re-encoding the table; all four sabotage-verified in both directions. The row's "the legacy caller is deleted at the production cutover" framing was overtaken: the caller was CORRECTED, not deleted, and remains the only production Position wire caller; AP-145 RETIRED 2026-08-05, C5a commit 1, closing #318 — `TryPublishPlace` now publishes the local player's Place through `LocalPlayerShadowSynchronizer.SyncPose`, the same publisher ordinary per-tick movement uses, instead of a direct `LocalPlayerShadowState.Set` that never touched `PhysicsEngine.ShadowObjects`; AP-1 RETIRED 2026-08-05, C5a deletion sweep — `PhysicsEngine.Resolve`/`ResolvePlacement`/`HasCellSurface` deleted outright, zero production callers, so "production zero-delta routes remain on the legacy resolver" is now structurally false; AP-146 filed 2026-08-05, #319 fix — the local player's canonical cell is written only at login/inbound-Position/teleport, not per ordinary-movement tick as retail's SetPositionInternal does; #319's fix makes a player-parented child inherit exactly this coarseness, stale-but-equal to the parent, not a new staleness class; follow-up filed as issue #320; AP-144 filed 2026-08-05, C4 route 3 round 3 (R7) — the portal-arrival movement-event send reuses `UsePositionFromServer` (`autonomy_level != 2`) where retail's actual gate, `SendMovementEvent`, is `autonomy_level != 0`; the two agree everywhere except level 1, which no production caller can reach today; AP-142/AP-143 filed 2026-08-04, C4 route 7 — the parented-child single-field cell model (id/pointer collapse, zero-not-stale removal propagation, same-cell tick-loop subsumption) and the headless parent-realize drive's skipped holding-location validation; AP-141 filed 2026-08-04, C4 route 5, NARROWED 2026-08-04 at the round-2 delta review — the far-branch StopInterpolating clause was wrong for the adopted-body case (it is now ported there) and the row's language now distinguishes "never armed" from "never re-anchored"; CORRECTED 2026-08-04 at the round-3 delta review — the risk column's "would drag the body toward a stale anchor" claim was itself wrong (the leash anchor is write-only; `ConstraintManager::adjust_offset` only brakes, never pulls) and is retracted; every half remains test-gated only, since ACE never sends a missile UpdatePosition; AP-140 filed AND RETIRED 2026-08-04 — filed at the Bug B Opus review because the two accepted-Position routing gates read the client `Airborne` flag, i.e. walkability, where retail's free-flight predicate is CONTACT, and Bug B had just turned "in contact, not on walkable ground" from unreachable into ordinary; retired the same day by pointing both gates at `PhysicsBody.InContact`, retail's literal `transient_state & 1` test at `InterpolationManager::adjust_offset` @0x00555D52 (bit 0 = `CONTACT_TS`, acclient.h:3690), while leaving `Airborne` and all five of its `!Body.OnWalkable` writers untouched — the narrow shape the row itself pinned. A remote sliding on a steep face now interpolates as retail does instead of snapping at UpdatePosition cadence; AP-139 filed 2026-08-04, Bug B remote steep-contact slide — the interpolation-queue clear on the landing edge, carried over from the deleted hand-rolled remote landing block; AP-81 narrowed the same day by that fix, which retired its whole GRAVITY half; AP-87 annotated the same day — its predicted symptom was observed live and then fixed at the source, with the row's own thresholds and conditions deliberately unchanged; AP-138 filed 2026-08-04, C4 route 4b-2 dual Opus review, parts (1) and (2) rewritten the same day at the DELTA review — the far snap's refusable-placement residual: store_position only on the outcomes that never reached the engine, the two quiescence parks made restorable at the source, with the rollback gated on the cell it actually restores into, rather than refused by a pre-flight that structurally cannot see them, and the leash not armed through a superseded incarnation; AP-137 filed 2026-08-04, C4 route 4b-2 and rewritten the same day at that review, `teleport_hook`'s call list completed at the delta review — the acdream-only null/rejected/cell-less leftover arm, what the deleted duplicated 96 m/4 m constant pairs actually computed, and the vacuous headless satisfaction; AP-136 filed 2026-08-04, C4 route 4b-1 review, NARROWED 2026-08-04 at the C4 route 4b-2 delta review and AMENDED 2026-08-04 by the cancelled-park presentation rollback (the row's "restored visible" claim covered only the CANONICAL half; the presentation half was never rolled back, which left a parked-then-cancelled remote that stops moving invisible in the world AND absent from the radar for the rest of the session — a defect, now fixed by the `WithdrawalRestored` receipt, with the selection residual filed as AD-63) — a cancelled lost-cell park re-shows the entity where retail keeps it hidden until cell load, and the rollback's scope now covers the two placement-side quiescence parks whenever the cell it restores into is not itself quiescing — round 4 (2026-08-04) applies that same test a second time at RESTORE time, because a retained park's rollback lands a packet later; AP-135 filed 2026-08-03, C4 route 4a — the airborne no-op's retained acdream bookkeeping; the stated total was 2 rows stale before that filing and is now a literal count of this section; AP-130/AP-131/AP-132 filed 2026-08-02, continuation-executor slice; AP-5 retired 2026-07-31 at Campaign P Slice 2A — every successful `step_down` now performs retail's final `PLACEMENT_INSERT`; AP-3/AP-4 retired 2026-07-31 at Campaign P Slice 1B — `transitional_insert` and `edge_slide` now preserve retail's valid-contact early return and Branch-1-first order; AP-127 retired 2026-07-31 by #268 — the complete augmentation chain is shared by character UI and Runtime movement; AP-30 retired 2026-07-30 by the movement parity audit — retail Frame::is_equal genuinely uses the 0.0002 epsilon [byte-confirmed], so the row recorded a NON-divergence; acdream already matches; AP-129 narrowed 2026-07-30 at the P4 Opus review fix — `CanMoveInto`/`RestrictionDB::IsAllowedIn` are now ported and fed end-to-end (CreateObject HouseOwner/HouseRestrictions/Monarch tail fields + live `House_UpdateRestrictions 0x0248`, resolved through `PhysicsEngine.Objects`), retiring the original "CanMoveInto entirely unmodeled, unconditional fail-closed" gap the row described — the review was triggered by `RestrictionObjPrevalenceInspectionTests` showing 103,766 of 729,888 installed EnvCells (the whole housing estate) carry a baked `RestrictionObj`, so the unconditional fail-closed default would have locked every house for every player including its own owner; AP-10 retired 2026-07-30 at Campaign P Slice P4 — restored retail's 0.1 m dry-corner water sink-in, full suite green proving the sticky-bit no-regression argument; AP-71 retired same slice — `check_entry_restrictions` ported at the head of the indoor `FindEnvCollisions` branch, `CellPhysics.RestrictionObj` wired from the DAT-baked `EnvCell` field in both the dev and production caching paths; AP-128 filed 2026-07-30 at the P3 Opus review — PK-timer clock basis; AP-25 retired 2026-07-30 at Campaign P Slice P1 — the vitae/enchantment-aware run/jump skill chain; AP-7 retired 2026-07-30 at Campaign P Slice P2 — `calc_friction`'s threshold ported to retail's confirmed 0.25f; its still-open cos(10°)-vs-0.99999536f Sledding constant question moved to AD-55) +## 3. Documented approximation (AP) — 131 active rows (AP-185 filed 2026-08-10 at Campaign CH slice CH6a — the chat window's UiLocked border-art cosmetic swap is unported, see the row for detail; AP-184 filed 2026-08-09 at Campaign CH user-gate round 2, item 3 — three of the seven retail `/help` group-topic listings (channels/chatting/commands) remain PARTIAL, not fully verbatim: their detail text is built in full or in part by `ClientCommunicationSystem::HelpStupidChannelHack @0x0056f290`, which constructs its output from three BN-mislabeled data fragments (`&ClientCommunicationSystem::\`vftable'.RecvNotice_StartBarberNotice` etc. are NOT real vtable dispatch) concatenated around a live `ChannelSystem::GetChannelName` lookup, not decodable with confidence from a static string sweep; each partial group keeps its own verbatim summary line and an explicit UNVERIFIED note instead of the fully-fabricated meta-message the user caught on `/help death` (that group, plus status/text/allegiances, are now COMPLETE verbatim listings); tracked as ISSUES.md #364. Round 2 item 2 also deletes `PortalWaitNoticeController` (the dedicated centered-overlay presentation the user reported was the wrong retail surface) and reroutes the portal-space wait-cue notice through the same `AddText`/SpewBox chokepoint every other on-screen interface-text site uses — AP-178's open SpewBox position/extent/font/colour questions now cover this notice too, since its separate controller and consts are gone; no new row was needed for the surface mismatch itself, since it was never separately registered (`PortalWaitNoticeController`'s own doc comment asserted "not a chat message" as an accepted design, not a flagged divergence). AP-150 RETIRED 2026-08-09 at Campaign CH user-gate round 1, item D (#329) — `PortalTunnelPresentation.TickRotation` now emits `"In Portal Space - Please Wait..."` unconditionally on every rotation-segment expiry, exactly matching `gmSmartBoxUI::UseTime`'s `else`-arm at 0x004D6FCD, instead of gating on `_waitCueVisible`, which only ever went true after the invented 5-second `RuntimeWorldTransitState.RetailWaitCueDelay` hold; `RetailWaitCueDelay`/`ObserveWait`/`SetWaitCue` remain as `LocalPlayerTeleportController`'s own hold-delay telemetry (`RuntimePortalSnapshot.WaitCueShown`) but no longer gate the on-screen cue, so they are not a residual of this row — closes issue #329; AP-183 filed 2026-08-09 at the CH4 REJECT-review, item 9 — roughly 10 chat refusal/usage call sites this campaign added route through `ChatVM.ShowSystemMessage`'s single `ClientLocal 0x00` sink where retail types several of them `0x1A`: `DoStupidChannelHack`, `DoChannelList`/`On`/`Off`, `DoAllegiance`, `DoHouseAvailableList`, `DoReply`; three sites (`DoSpeaker`/`DoEndurance`/`DoTitle`) are already correct at `0x00`, matching retail. Retail's own bad-args fallback (`DoCommand @0x0057E46D`) also answers with `HandleFailureEvent(0x26)`, not a local "Usage:" line, which acdream's `ChatCommandRouter.Submit` synthesizes instead. Deliberately NOT re-plumbed this session — filed as issue #363, marked for CH5-or-later; AP-182 filed 2026-08-09 at Campaign CH slice CH4, corrected at the CH4 REJECT-review (nit 11) — `@title` is wired to a pure no-op (the value is neither stored nor consumed anywhere) and also omits `DoTitle`'s three local failure messages; recount at the CH3 Opus review corrected a pre-existing off-by-one; AP-181 filed 2026-08-09, Campaign CH slice CH3 — the local chat spam throttle (`IsMessageSpam`) has no acdream port. AP-178 NARROWED 2026-08-09 at the CH2 REJECT-review rework NIT 3, wording corrected at the CH2 re-review nits pass (`docs/plans/2026-08-09-chat-parity-campaign.md`, nits 1/2/6) — the original `dats.Portal` pass used an id source that was not Portal's own (`dats.Portal.GetAllIdsOfType()` is empty for this type), so it established nothing about Portal either way; extending a correctly-paired sweep to `dats.Local` FOUND the SpewBox element there; extent (`450×72`) and `MaxConcurrentItems` (`4`, not the code-default `1`) are now AUTHORED, leaving absolute screen position, colour, AND vertical content flow (now TOP-aligned, acdream's own invention pending measurement) open. AP-180 filed 2026-08-09 at the CH2 REJECT-review rework — `RuntimeCommunicationState.AddText`'s `windowId` parameter is accepted but not consumed, so retail's dual-destination echo (a `0x1A` message with a non-zero `windowId` lands in both the SpewBox and its originating chat window) is unimplemented; latent today since every production caller passes `windowId = 0`. AP-177/AP-178/AP-179 filed 2026-08-09, Campaign CH slice CH2 (interface text / SpewBox) — AP-177 records the invented 5-second SpewBox line lifetime (retail's real timeout is keystone-owned and unmeasured); AP-178's original filing recorded the invented SpewBox screen position/extent/font/colour/MaxConcurrentItems after `SpewBoxLayoutDumpDiagnostic`'s Portal-only sweep found zero elements of class 0x10000016 — see the NARROWED note above for the corrected finding; AP-179 is the OnCombatLine half of the RETIRED AP-176 split out to its own row. AP-176 RETIRED the same day — the WeenieErrorMessages full 344-row `HandleFailureEvent` port (`WeenieErrorMessages.Resolve`) replaces the single-stand-in-`LogTextType` approximation that row recorded for `ChatLog.OnWeenieError`. AP-175 filed 2026-08-09, Campaign CH slice CH1 — PopUpString renders as a chat-log line instead of retail's modal dialog; AP-39 updated the same day — chat coloring is now retail's exact 34-value `LogTextType` table, not a synthetic per-`ChatKind` approximation of it. AP-173 and AP-174 filed 2026-08-08, Campaign A slice A2 — AP-173 expresses retail's ±15 dB DirectSound pan as an OpenAL azimuth by inverting the constant-power pan law, since AL exposes no per-channel gain for a mono source; AP-174 records acdream's extra master volume knob on top of retail's three, folded into retail's single master multiply so the −50 dB cutoff and dB quantisation move with it. AP-172 and AP-171 filed 2026-08-08, #354 spell-bar drag-reorder fix — the favorite-bar reorder gesture defers its own list rebuild for the drag's duration so `UiRoot`'s drag-cancel safety net cannot destroy the in-flight cell, compensating the drop-time target index for the resulting stale sibling numbering; final positions and the wire pair are retail-exact, only the mid-drag visual reflow timing differs. AP-170 filed 2026-08-08, grand-gate finding G3 — an out-of-range vendor Use now arms on arrival instead of sending immediately, because the user's local ACE server polls for the player to actually reach use range before opening the shop panel and a too-early Use is silently lost; AP-169 filed 2026-08-08, grand-gate finding G2 — the vendor toolbar split-slider resolver falls back to the packed shop-supply-count field when the item's own `PublicWeenieDesc._stackSize` is absent, because the user's local ACE server never populates the latter for a browse-list item; AP-167/AP-168 filed 2026-08-09 at the Opus review of `92ea3977` (findings F1/F6) — Buy All's container-vs-item slot classification approximates retail's bitfield/capacity test with `ItemType.Container` [AP-168], and SellSingleItem's non-empty-container refusal branch is not ported [AP-167]; AP-164 RETIRED the same review (finding F4) — BF_RETAINED is now checked end to end; AP-162 NARROWED the same review (finding F1) — Buy All's four client-side pre-send guards are now ported, leaving only the single-item TryBuy path without one; AP-161 gains a REVIEW CORRECTIONS paragraph the same review (findings F1-F13) summarizing the rest as bug fixes to already-claimed behavior, not new divergences. AP-164/AP-165/AP-166 filed 2026-08-09 at Slice 6b/6c (staging+sell arc) — InqAcceptability's non-sellable bitfield is unmodeled [AP-164], the Buy-side stackable-removal-amount test substitutes DescStackSize for retail's _maxStackSize [AP-165], and the Buying/Selling tabs' own purse/count text plus the cross-panel pending-sell inventory highlight are unwired [AP-166]; AP-161 NARROWED the same day — the row's last vendor-specific residual (Buying/Selling tabs render but carry no data binding) CLOSES now that both tabs are fully wired (staging, drag-to-sell, InqAcceptability gating, Sell 0x0060, the X-close confirmation), leaving only the two long-standing PRE-EXISTING residuals (dropdown arrow-cap glyph, alt-currency m_last_sale simplification) plus the three new AP-164/165/166 residuals just filed; AP-162 EXTENDED the same day — the same no-client-pre-check omission now also covers the batched "Buy All" path (TryBuyAll), not just the single-item TryBuy. AP-162/AP-163 filed 2026-08-09 at Slice 6.3 (buy arc) — no client-side Buy affordability/capacity pre-check [AP-162] and the shop-item guid-collision skip-not-clobber policy [AP-163]; AP-161 NARROWED the same day — the private-selection and unwired-examine residuals CLOSE at Slice 6.1/6.2, leaving only the dropdown arrow-cap glyph and the alt-currency `m_last_sale` simplification, plus a confirmed-absent-from-retail note on double-click-to-buy. AP-161 REWRITTEN 2026-08-09 at the Slice 5.4 review (findings F1-F8) — the popup-never-rendered, wrong-quantity-price, no-auto-select, dropped-icon-layer, stale-category-on-vendor-switch, and unguarded-Apply-fanout bugs the review found are fixed (`VendorUiController.cs`, `VendorState.cs`, `GameEventWiring.cs`, `RetailUiRuntime.cs`); the row now records only the four consciously-deferred residuals it still owns (private per-panel selection vs. retail's global `ACCWeenieObject::selectedID`, the unwired shop-item examine route, the dropdown button-face arrow-cap glyph, and the alt-currency held-amount's `m_last_sale`-free simplification). AP-110's "retail-correct per-unit prices" phrasing is corrected the same day to "quantity-correct pricing" — the OLD phrase mischaracterized what retail even shows (a `GetObjectSplitSize`-quantity price, not literally one unit) independent of whether the code was buggy. AP-161 filed 2026-08-09 at Slice 5.4 (vendor browse panel) — the authored "Buying"/"Selling" tabs render and switch pages but carry no data binding, per contract decision 8's required successor to AP-110's narrowing; AP-110 NARROWED the same day — "vendor" is retired from its absent-panels list now that the "Items" browse tab is user-reachable. AP-160 filed 2026-08-07 at Slice 5.3 — the client-local vendor-panel distance watcher closes on plain 3D center distance instead of retail/ACE's cylinder-gap distance, because Runtime has no per-entity collision radius/height source outside the App-layer's Setup-cylinder resolver. AP-158 RETIRED 2026-08-06 by the #333 fix, closing #337 — the `maxReach` distance pre-filter is DELETED rather than re-centred, because retail has none: `CObjCell::find_obj_collisions` @0x0052b750 walks the cell's shadow list and calls `CPhysicsObj::FindObjCollisions` unconditionally. The row's predicted symptom was observed live at Neftet before it was fixed — a tall prop AP-156 had just placed correctly still not blocking, plus jumps sinking into the mesh and corpses falling through. Perf measured, not assumed: at the live-maximum 38 in-cell candidates 10.61 µs → 16.68 µs per resolve. AP-159 filed 2026-08-06 at the #334 fix — the INDOOR half of AP-156’s traversal residual is all that remains of it; the outdoor half is CLOSED by the `find_bbox_cell_list` port, and AP-156’s RISK COLUMN IS CORRECTED at the same commit: it recorded the residual as “extra broadphase candidates, never a missed one”, which generalised the indoor direction to the whole row and is exactly why #334 — a MISSED one, and a user-observed loss of collision on landblock-spanning formations — sat inside it unnoticed. AP-158 filed 2026-08-06 at the AP-156 fix review — the shadow broadphase's `maxReach` distance pre-filter is acdream's own invention with NO retail counterpart, and it measures from the part origin, so it can discard a genuine contact for exactly the off-centre parts AP-156 just placed correctly; issue #333. AP-156 CORRECTED at the same review: its population was understated — 172 is AP-152's DISPATCH population, not AP-156's CONTAINMENT population. AP-155 NARROWED and AP-156/AP-157 filed 2026-08-06 at the AP-152 retail-conformance review. AP-155 bundled two divergences with different code paths, populations and gates under one id; its flood half is now AP-156, **with its direction corrected**. AP-155(b) recorded the BSP flood approximation as OVER-inclusive and used that direction as the reason the residual was safe to defer; measured over the installed DAT it was UNDER-inclusive for 428 of the 530 BSP-bearing Setups (the AP-156 fix review corrected the originally-recorded '170 of 172'), because `BuildFloodSpheres` carried each physics-BSP part's root bounding-sphere RADIUS while discarding that sphere's own ORIGIN and centring it on the part origin. That is the #98/#168 class, and for 43 Setups the post-AP-152 flood was strictly smaller than the pre-AP-152 one. AP-156 records the correction and the fix — `ShadowShape.BoundsCenter`, filled from the same resolver that supplies the radius, plus the retirement of the 10-sphere clamp on a branch where retail has none — and keeps open only the sphere-vs-portal TRAVERSAL approximation. AP-157 is the previously unregistered third-branch substitution: retail floods from one `CPartArray::GetSortingSphere` where acdream floods from every Sphere shape, and acdream's cylinder flood ignores `CylHeight`. AP-152 RETIRED 2026-08-06, one day after it was filed: `ShadowShapeBuilder.FromSetup` now dispatches BSP-first instead of unioning, and `ShadowObjectRegistry.BuildFloodSpheres` now applies `calc_cross_cells`' own BSP → cylsphere → sorting-sphere order. Four statements in the row were false and are corrected in its retirement text — most importantly its predicted symptom, "catching on a doorway sill", which could not have been occurring: `Transition.BspOnlyDispatch` had already made the extra primitive inert at collision-query time since 2026-05-25. The live half was CELL MEMBERSHIP, the #98/#168 symptom class, which had no such guard. AP-153/AP-154/AP-155 filed at that retirement — retail's dispatch flag is cached once at part-array construction where acdream's gate is live [AP-153]; acdream's query-time guard takes a CLIENT-DERIVED flag off the WIRE and never derives it, an undeclared dependency on ACE reading the same DAT bit [AP-154]; and the static publication paths emit a Setup Sphere as a height-capped Cylinder while `BuildFloodSpheres` approximates retail's bounding BOX with bounding SPHERES [AP-155, whose flood-priority half is closed by the same commit]. AP-152 filed 2026-08-06 at the AP-22 retirement — the LIVE collision path emits Setup primitives and per-part physics-BSP shapes additively where retail's `CPhysicsObj::FindObjCollisions` dispatches exclusively; 172 of 5,935 installed Setups are affected, including BSP doors, so it needs its own visual gate and was deliberately not folded into the AP-22 commit; the count is unchanged because AP-22 retired in the same commit. AP-22 RETIRED 2026-08-06 — retail synthesizes no shape for a shapeless object (`CPhysicsObj::FindObjCollisions` 0x0050f050 exits at `0x0050f22f je 0x50f31b` returning the seeded OK_TS, and `CPartArray::GetRadius`/`GetHeight` are absent from its whole call set), so the invented `setup.Radius` cylinder was deleted rather than re-derived; the row's site list named one file that never contained the fallback and omitted the two that did, one of them the headless-only copy, and its "rare decorative props" risk described an unreachable branch — 0 of 5,935 installed Setups can satisfy the guard. AP-150/AP-151 filed 2026-08-06 at the #280 dual review — the wait cue's five-second arming is acdream's own and not retail's trigger [AP-150], and the reveal gate is materially stricter than retail's DAT-residency prefetch predicate on the mesh-build/GPU-upload axis [AP-151], the opposite asymmetry from AP-149; AP-149 filed 2026-08-05 at the #280 portal-prefetch fix — the reveal gate's outer ring accepts terrain-only publication where retail requires LandBlockInfo and every building EnvCell; the fix closes the reveal-window/visible-window ratio, not this residual; AP-148 filed 2026-08-05 at the C5b closeout — acdream's local-player Gate A requires the wire TELEPORT_TS to be EQUAL where retail requires only that it not be OLDER, verified by disassembly against the PDB-paired binary after two review rounds read the Binary Ninja tautology and missed it; AP-147 filed 2026-08-05 at the C5b architecture review, finding D3 — the accepted-Position delta stream's cardinality change and its torn intermediate; AP-138 amended at the same review — C5b staled its route-2 first-submit `CurrentCellId` measurement; AP-131 RETIRED 2026-08-05, C5b, closing #275 — the steady-state merge's `installPlacementFrame: true, clearParent: true` literals no longer exist; `InboundPhysicsStateController.TryApplyPosition` now computes both flags PRE-MERGE from `(disposition, hasAnimations(old))`, which is exactly `RuntimeAuthoritativePositionRouteClassifier.ClassifyAcceptedPosition`'s own `ApplyPlacementFrameBeforeRouting`/`UnparentBeforeRouting` rows (false/false on the Gate A force row, `!HasAnimations`/true on every accepted non-force route). Retail decides both writes BEFORE `MoveOrTeleport` is consulted — Gate A @0x0045400C returns @0x0045409D ahead of `unset_parent` @0x00454129 and the `HasAnims` `SetPlacementFrame` gate @0x00454137 — so the flags need no route, no player distance and no signature change. The row's predicted symptoms are gone: an animated entity's ordinary Position no longer installs a placement frame retail skips, and a ForcePosition no longer unparents. Evidence: `InboundPhysicsStateControllerTests` — `ApplyOnAnimatedEntity_NeverInstallsTheWirePlacementFrame`, `ApplyOnNonAnimatedEntity_InstallsTheWirePlacementFrame`, `ForcePositionOnParentedLocalPlayer_RetainsTheParentAttachment`, and the 12-row `MergedPrePlacementFieldsMatchTheClassifiedRouteFlags` matrix which uses the production classifier as its oracle rather than re-encoding the table; all four sabotage-verified in both directions. The row's "the legacy caller is deleted at the production cutover" framing was overtaken: the caller was CORRECTED, not deleted, and remains the only production Position wire caller; AP-145 RETIRED 2026-08-05, C5a commit 1, closing #318 — `TryPublishPlace` now publishes the local player's Place through `LocalPlayerShadowSynchronizer.SyncPose`, the same publisher ordinary per-tick movement uses, instead of a direct `LocalPlayerShadowState.Set` that never touched `PhysicsEngine.ShadowObjects`; AP-1 RETIRED 2026-08-05, C5a deletion sweep — `PhysicsEngine.Resolve`/`ResolvePlacement`/`HasCellSurface` deleted outright, zero production callers, so "production zero-delta routes remain on the legacy resolver" is now structurally false; AP-146 filed 2026-08-05, #319 fix — the local player's canonical cell is written only at login/inbound-Position/teleport, not per ordinary-movement tick as retail's SetPositionInternal does; #319's fix makes a player-parented child inherit exactly this coarseness, stale-but-equal to the parent, not a new staleness class; follow-up filed as issue #320; AP-144 filed 2026-08-05, C4 route 3 round 3 (R7) — the portal-arrival movement-event send reuses `UsePositionFromServer` (`autonomy_level != 2`) where retail's actual gate, `SendMovementEvent`, is `autonomy_level != 0`; the two agree everywhere except level 1, which no production caller can reach today; AP-142/AP-143 filed 2026-08-04, C4 route 7 — the parented-child single-field cell model (id/pointer collapse, zero-not-stale removal propagation, same-cell tick-loop subsumption) and the headless parent-realize drive's skipped holding-location validation; AP-141 filed 2026-08-04, C4 route 5, NARROWED 2026-08-04 at the round-2 delta review — the far-branch StopInterpolating clause was wrong for the adopted-body case (it is now ported there) and the row's language now distinguishes "never armed" from "never re-anchored"; CORRECTED 2026-08-04 at the round-3 delta review — the risk column's "would drag the body toward a stale anchor" claim was itself wrong (the leash anchor is write-only; `ConstraintManager::adjust_offset` only brakes, never pulls) and is retracted; every half remains test-gated only, since ACE never sends a missile UpdatePosition; AP-140 filed AND RETIRED 2026-08-04 — filed at the Bug B Opus review because the two accepted-Position routing gates read the client `Airborne` flag, i.e. walkability, where retail's free-flight predicate is CONTACT, and Bug B had just turned "in contact, not on walkable ground" from unreachable into ordinary; retired the same day by pointing both gates at `PhysicsBody.InContact`, retail's literal `transient_state & 1` test at `InterpolationManager::adjust_offset` @0x00555D52 (bit 0 = `CONTACT_TS`, acclient.h:3690), while leaving `Airborne` and all five of its `!Body.OnWalkable` writers untouched — the narrow shape the row itself pinned. A remote sliding on a steep face now interpolates as retail does instead of snapping at UpdatePosition cadence; AP-139 filed 2026-08-04, Bug B remote steep-contact slide — the interpolation-queue clear on the landing edge, carried over from the deleted hand-rolled remote landing block; AP-81 narrowed the same day by that fix, which retired its whole GRAVITY half; AP-87 annotated the same day — its predicted symptom was observed live and then fixed at the source, with the row's own thresholds and conditions deliberately unchanged; AP-138 filed 2026-08-04, C4 route 4b-2 dual Opus review, parts (1) and (2) rewritten the same day at the DELTA review — the far snap's refusable-placement residual: store_position only on the outcomes that never reached the engine, the two quiescence parks made restorable at the source, with the rollback gated on the cell it actually restores into, rather than refused by a pre-flight that structurally cannot see them, and the leash not armed through a superseded incarnation; AP-137 filed 2026-08-04, C4 route 4b-2 and rewritten the same day at that review, `teleport_hook`'s call list completed at the delta review — the acdream-only null/rejected/cell-less leftover arm, what the deleted duplicated 96 m/4 m constant pairs actually computed, and the vacuous headless satisfaction; AP-136 filed 2026-08-04, C4 route 4b-1 review, NARROWED 2026-08-04 at the C4 route 4b-2 delta review and AMENDED 2026-08-04 by the cancelled-park presentation rollback (the row's "restored visible" claim covered only the CANONICAL half; the presentation half was never rolled back, which left a parked-then-cancelled remote that stops moving invisible in the world AND absent from the radar for the rest of the session — a defect, now fixed by the `WithdrawalRestored` receipt, with the selection residual filed as AD-63) — a cancelled lost-cell park re-shows the entity where retail keeps it hidden until cell load, and the rollback's scope now covers the two placement-side quiescence parks whenever the cell it restores into is not itself quiescing — round 4 (2026-08-04) applies that same test a second time at RESTORE time, because a retained park's rollback lands a packet later; AP-135 filed 2026-08-03, C4 route 4a — the airborne no-op's retained acdream bookkeeping; the stated total was 2 rows stale before that filing and is now a literal count of this section; AP-130/AP-131/AP-132 filed 2026-08-02, continuation-executor slice; AP-5 retired 2026-07-31 at Campaign P Slice 2A — every successful `step_down` now performs retail's final `PLACEMENT_INSERT`; AP-3/AP-4 retired 2026-07-31 at Campaign P Slice 1B — `transitional_insert` and `edge_slide` now preserve retail's valid-contact early return and Branch-1-first order; AP-127 retired 2026-07-31 by #268 — the complete augmentation chain is shared by character UI and Runtime movement; AP-30 retired 2026-07-30 by the movement parity audit — retail Frame::is_equal genuinely uses the 0.0002 epsilon [byte-confirmed], so the row recorded a NON-divergence; acdream already matches; AP-129 narrowed 2026-07-30 at the P4 Opus review fix — `CanMoveInto`/`RestrictionDB::IsAllowedIn` are now ported and fed end-to-end (CreateObject HouseOwner/HouseRestrictions/Monarch tail fields + live `House_UpdateRestrictions 0x0248`, resolved through `PhysicsEngine.Objects`), retiring the original "CanMoveInto entirely unmodeled, unconditional fail-closed" gap the row described — the review was triggered by `RestrictionObjPrevalenceInspectionTests` showing 103,766 of 729,888 installed EnvCells (the whole housing estate) carry a baked `RestrictionObj`, so the unconditional fail-closed default would have locked every house for every player including its own owner; AP-10 retired 2026-07-30 at Campaign P Slice P4 — restored retail's 0.1 m dry-corner water sink-in, full suite green proving the sticky-bit no-regression argument; AP-71 retired same slice — `check_entry_restrictions` ported at the head of the indoor `FindEnvCollisions` branch, `CellPhysics.RestrictionObj` wired from the DAT-baked `EnvCell` field in both the dev and production caching paths; AP-128 filed 2026-07-30 at the P3 Opus review — PK-timer clock basis; AP-25 retired 2026-07-30 at Campaign P Slice P1 — the vitae/enchantment-aware run/jump skill chain; AP-7 retired 2026-07-30 at Campaign P Slice P2 — `calc_friction`'s threshold ported to retail's confirmed 0.25f; its still-open cos(10°)-vs-0.99999536f Sledding constant question moved to AD-55) Wave-0 UI ledger repair (2026-07-10) retired stale AP-38, resolved the AP-84 collision, restored overwritten paperdoll rows as AP-92/AP-93, and registered @@ -338,6 +338,7 @@ AP-94..AP-112 for the confirmed retail-UI completion gaps. | AP-181 | **Filed 2026-08-09 (Campaign CH slice CH3, side-channel gate); corrected 2026-08-09 at the CH3 Opus review (S6) — the original text named only the spam throttle and wrongly credited `RouteLegacyChannel` with porting gates it has no code for.** Retail's `SendTurbineChat @0x0057db10` runs TWO local pre-send refusals acdream has no port for, in this order: `IsMessageSafe(text)` first (a silent drop — no wire send, no local text at all), then, only if that passes, the per-account spam throttle `IsMessageSpam()` (→ "You must wait %ds before communicating again!"). acdream's `TurbineChatMembershipGate`/`RouteTurbineChat` port the Turbine-unavailable and Hear-option gates that run BEFORE both checks in retail's own function (§4.2) and stop there — neither `IsMessageSafe` nor `IsMessageSpam` exists anywhere in acdream. `RouteLegacyChannel` is the unrelated legacy 0x0147 `ChatChannel` pipeline and has no equivalent of either check in retail OR acdream — it was never the site these two gates belonged to. | `src/AcDream.Runtime/Gameplay/TurbineChatMembershipGate.cs`; `src/AcDream.App/Net/LiveSessionCommandRouter.cs` (`RouteTurbineChat`) | The user's target server (local ACE) leaves `chat_requires_account_15days`/`chat_requires_player_level` etc. at their disabled defaults (research doc §3.6) and has no observed rate-limit or unsafe-content complaint; porting a client-side throttle/safety check with no server-side counterpart to validate against risks inventing a threshold retail didn't use. | A future connected gate against a server that DOES rate-limit chat, or a deliberately unsafe test string, would see every send attempted rather than refused after the first — cosmetic only, since ACE's own server-side handling (if any) still governs what actually reaches other players. | `ClientCommunicationSystem::SendTurbineChat @0x0057db10` (`IsMessageSafe`/`IsMessageSpam` branches); research doc `docs/research/2026-08-09-chat-side-channels-vs-ace.md` §4.2 | | AP-183 | **Filed 2026-08-09 at the CH4 REJECT-review, item 9.** Roughly 10 chat refusal/usage call sites Campaign CH slice CH4 added route through `ChatVM.ShowSystemMessage`'s single `LogTextType 0x00` (ClientLocal-informational) sink; retail types several of them `0x1A` (bright red / genuine refusal) instead: `DoStupidChannelHack` (the "You must specify the text you wish to say!" family, registered channel verbs), `DoChannelList`/`DoChannelOn`/`DoChannelOff` ("Please specify the channel name."), `DoAllegiance` (the "Please see @help Allegiance..." refusal this session's Blocker 1 added), `DoHouseAvailableList`, and `DoReply` ("Someone must @tell you first!"). Three CH4 sites are already correct at `0x00` because retail itself types them informational: `DoSpeaker`, `DoEndurance`, `DoTitle`. Separately, retail's own bad-args fallback (`ClientCommunicationSystem::DoCommand @0x0057E46D`) answers a registered handler that returns 0 with `HandleFailureEvent(0x26)`, not a local "Usage: " line — `ChatCommandRouter.Submit` synthesizes a `"Usage: {clientCommand.Usage}"` string instead whenever a catalog command's `InvalidArgumentsText` is null. Filed as issue #363; deliberately NOT re-plumbed this session (re-typing every call site is larger than a REJECT-review fix batch). `src/AcDream.UI.Abstractions/Panels/Chat/ChatVM.cs` (`ShowSystemMessage`); `src/AcDream.UI.Abstractions/Panels/Chat/ChatCommandRouter.cs` (`Submit`'s `Usage:` fallback) | Every one of these sites shows correctly-worded text in the correctly-shaped chat log entry, just at the wrong color/destination classification — a real but low-severity divergence from retail's exact on-screen presentation | A user comparing acdream's chat window side-by-side with retail for one of these specific refusals sees the wrong color (informational white/default instead of bright red) or, for the generic "Usage:" fallback, different WORDING than retail's `HandleFailureEvent(0x26)` text entirely | `ClientCommunicationSystem::DoStupidChannelHack @ 0x0057B144`; `DoChannelList @ 0x0057A9B0`; `DoChannelOn @ 0x0057AA80`; `DoChannelOff @ 0x0057AB50`; `DoAllegiance @ 0x0057D5A0`; `DoHouseAvailableList @ 0x00570510`; `DoReply @ 0x00577910`; `DoCommand @ 0x0057E46D` (`HandleFailureEvent(0x26)`) | | AP-182 | **Filed 2026-08-09 (Campaign CH slice CH4); corrected 2026-08-09 at the CH4 REJECT-review (nit 11).** `@title ` is wired to a pure no-op — `LiveSessionRuntimeFactory`'s `SetChatTitle` binding is `_ => { }`; the requested title is neither stored nor consumed anywhere (the original filing's "stores the value locally" claim was false). This matches retail's own silent success (no confirmation text was recovered at the `DoTitle` success site, so a no-visible-effect accept is exactly as faithful as a stored-but-unread value would be). Also omitted: `DoTitle`'s three local failure messages — no title given, "You must provide a new title for the window."; length over 99 characters, "Window title length cannot exceed 100 characters."; and wrong source window (`m_idCurrentCommandSource` 1 or 8), "This command must be issued from a popup chat window." — acdream's catalog validator (`ClientCommandId.SetChatTitle`, `AnyArguments`) accepts any argument shape and never raises any of the three. `src/AcDream.App/Net/LiveSessionRuntimeFactory.cs` (`SetChatTitle`) | Retail's chat window presumably re-renders its title bar text; acdream's chat window has no title bar at all under the current retained-UI import, so there is nothing to visually diverge from yet | Once a titled chat-window chrome is built, `@title` needs to be re-wired to it — today it is a pure no-op, and the three failure messages above are silently absent | `ClientCommunicationSystem::DoTitle @ 0x0057A640` | +| AP-185 | **Filed 2026-08-10 (Campaign CH slice CH6a — retail chat-window layout + 8-grip resize).** The main chat window's 8 cosmetic `_Locked` border-art twins (`0x10000693`-`0x1000069A`) are retail's `PlayerModule::LockUI`-driven alternate skin — `gmFloatyMainChatUI::UpdateLockedStatus @0x004D23D0` swaps them in for the 8 live Resizebar/Dragbar grips (`0x1000069B`-`0x100006A2`) when the UI is locked, and swaps them back out when unlocked. `ChatWindowController.Bind` always hides the twins and always shows the live set — i.e. it renders only retail's UNLOCKED skin, regardless of `UiRoot.UiLocked`. `src/AcDream.App/UI/Layout/ChatWindowController.cs` (`LockedTwinIds`) | `UiRoot.UiLocked` already gates the underlying move/resize INTERACTION generically and correctly in both states (locked ⇒ no move, no resize, regardless of which border art is drawn); the two art sets occupy identical rects, so always showing the interactive-grip skin is a cosmetic simplification, not a functional one, and the default matches `UiLocked`'s own `false` default | A user who locks the UI (`PlayerModule::LockUI`) sees the interactive-grip chat-window border art unchanged instead of retail's inert locked variant — cosmetic only; the window still correctly refuses to move or resize while locked | `gmFloatyMainChatUI::UpdateLockedStatus @0x004D23D0`; `PlayerModule::LockUI`; `docs/research/2026-08-09-chat-retail-window-shell.md` §1.6 | ## 4. Temporary stopgap (TS) — 39 active rows (TS-70 RETIRED 2026-08-09 at Campaign CH user-gate round 1, item E (#362) — `ClientCommandResponses.cs` now parses and renders all four named inbound GameEvents (`ChannelIndex 0x0149`, `ChannelList 0x0148`, `AvailableHouses 0x0271`, `AllegianceInfoResponse 0x027C`), each wired into `GameEventWiring.cs` and rendering retail-shaped `LogTextType 0x00` lines ported from the named-retail decomp (`Handle_Communication__ChannelIndex`/`ChannelList` @0x0057d0c0/@0x0057d230, `Handle_House__Recv_AvailableHouses` + `DisplayListOfCoords` @0x00585d50/@0x00585c20, `Handle_Allegiance__AllegianceInfoResponseEvent` @0x0056a1d0); the row's `@on`/`@off` mention was never itself missing a handler (both already resolve through the pre-existing `WeenieErrorWithString` registration) so nothing there needed a fix; TS-68/TS-69 filed 2026-08-09, Campaign CH slice CH4 — the deferred allegiance/house subcommand dispatchers, the three unported pure-local commands (day/log/render); TS-66/TS-67 filed and TS-29 retired 2026-08-08, Campaign A slice A5 — the region ambient system landed, so TS-29's ambient half is ported and its music half turned out to have nothing to port; TS-66 is the omitted `seen_outside` interior case and TS-67 the in-plane contribution weight. TS-64/TS-65 filed 2026-08-08, Campaign A slice A2 — TS-64 the two unimplemented retail sound preferences (unfocused-app silence, pan disable) plus the three enable bools; TS-65 the volume-squared quirk, applied on the ambient path where two lanes byte-confirmed it and deliberately NOT on the hook path where the pre-multiplying overload is unpinned. TS-62/TS-63 filed 2026-08-02, continuation-executor slice; TS-4 and TS-8 retired 2026-07-31; Campaign P's goal-enumerated physics stopgaps are now zero. TS-4's graph/flat Path-6 branches match retail's foot SetCollide/Adjusted and head CollisionNormal/Collided split with no BSP-layer sliding-normal write; TS-8's live 0x02C2 carries its complete StatMod through the canonical enchantment record and updates effective stats immediately. Campaign P P7 2026-07-30: TS-25 retired — outbound stance has shipped via RawState.CurrentStyle since #219; TS-24 re-argued to AD-57; TS-40 re-argued to AD-58; TS-35 retired at P5; earlier same campaign: TS-1/TS-5/TS-23/TS-46 retired by ports; TS-23 retired 2026-07-30 at Campaign P Slice P3 — every mover-flags call site (local player world-entry ×2, remote DR sweep ×2, remote teleport, ordinary movers) now ORs in the mover's real PK/PKLite/Impenetrable `ObjectInfoState` bits via the new `ClientObjectTable`-backed `EntityCollisionFlagsExt.ResolveMoverPvpState` — **narrative corrected 2026-08-03 (#297): "real" only became true at #297. Until then the bits existed but the source `PublicWeenieBitfield` was frozen at CreateObject, so every one of those sites read a stale value for the whole session. The site enumeration is also incomplete: `RuntimeSetPositionMoverPreparation.cs:183-188` is a SEVENTH mover-flags site that decodes `record.Snapshot.ObjectDescriptionFlags` directly rather than calling `ResolveMoverPvpState`, and it also derives `ObjectInfoState.IsPlayer` from the PWD bit, contradicting `EntityCollisionFlags.cs:119-123`'s claim that every site uses a GUID-prefix heuristic. See AP-134.** — and `PlayerWeenie.JumpStaminaCost`'s `pk` parameter reads the real `PlayerKillerStatus`/`LastPkAttackTimestamp` pair against a 20-second window instead of a hardcoded `false`; the non-PK invariant (every ACE default-created character) is bit-identical to the pre-P3 value since `ResolveMoverPvpState` and the PK-timer predicate both resolve to a no-op for `PublicWeenieBitfield` absent/0; TS-46 retired 2026-07-30 at Campaign P Slice P3 — the Setup's verbatim ≤2-sphere list (`CPhysicsObj::transition` 0x00512dc0 → `SPHEREPATH::init_sphere` 0x0050c670) now seeds the sweep for the local player, remote dead-reckoning, and ordinary movers alike, replacing the two-scalar (radius, height) capsule reconstruction; remote/ordinary step-up/step-down are now Setup-derived (`CPartArray::GetStepUpHeight`/`GetStepDownHeight`, 0x005180d0/0x005180f0, ×ObjScale) instead of a hardcoded 0.4 m, closing both residuals the row named; TS-5 retired 2026-07-30 at Campaign P Slice P1 — real burden-gated CanJump + real JumpStaminaCost, both decomp-verbatim; TS-1 retired 2026-07-30 at Campaign P Slice P2 — the row was stale; the EdgeSlide → PrecipiceSlide/CliffSlide chain is already a real, tested port; TS-57..TS-61 filed 2026-07-29 during Campaign N — no outbound RejectRetransmit; TS-27 narrowed same slice to the inbound direction) + TS-37 historical note (TS-20 retired 2026-07-16 — the later named-retail audit disproved the proposed DrawingBSP polygon filter; TS-37 is a retired-row historical note, not an active count; TS-39 retired R5-V3 — sticky seams bound to the ported PositionManager/StickyManager, radii threaded; TS-45 retired 2026-07-07 — hand-rolled `SphereCollision` replaced by the faithful CSphere family port, fixing the player-vs-monster crowd wedge; TS-3 retired 2026-07-07 — `frames_stationary_fall` accounting ported in the #182 verbatim UpdateObjectInternal rebuild, fixing the airborne falling-animation wedge; TS-41 retired 2026-07-07 — SERVERVEL synth-velocity remote body-drive replaced by the retail interp catch-up + unconditional MovementManager::UseTime, the remote-creature de-overlap #184; TS-42 retired 2026-07-19 — semantic animation completion now precedes the ordered Target/Movement/PartArray/Position tail; TS-44 narrowed again 2026-07-19 — complete orientation joined interpolation, only during-stick enqueue suppression remains) diff --git a/docs/plans/2026-08-09-chat-parity-campaign.md b/docs/plans/2026-08-09-chat-parity-campaign.md index 819b7e7d..b2444554 100644 --- a/docs/plans/2026-08-09-chat-parity-campaign.md +++ b/docs/plans/2026-08-09-chat-parity-campaign.md @@ -30,9 +30,13 @@ regression; item 6 is folded into CH6a's existing scope. Item 1 fixed — round 1's press-edge logic is provably correct by construction from source, a live headless repro was attempted and blocked (no character on the probe account), and two temporary graphical-only probes -are left behind for the next round. Status stays CODE-COMPLETE pending -the next user gate round (still needed for item 1, CH6, and a final -in-client visual pass on everything fixed so far). +are left behind for the next round. **CH6a (main-window layout + 8-grip +resize) landed CODE-COMPLETE the same day** — see its ledger row and the +updated round-1 items H/I and round-2 item 6 dispositions below; CH6b +(floating windows 1–4) and CH6c (opacity) remain not started. Status +stays CODE-COMPLETE pending the next user gate round (still needed for +item 1, CH6a's own visual confirmation, CH6b/CH6c, and a final in-client +visual pass on everything fixed so far). **Why now:** first track of the alpha-release program (chat is the most visible daily surface for the friend-alpha). User-directed 2026-08-09. @@ -135,6 +139,26 @@ implementer per slice against a pinned contract (per bottom-right corner (a corner-grip axis-composition bug, likely the same resize-mask gap already scoped for the Top edge above, now confirmed to also affect corner grips specifically). + **CODE-COMPLETE (this commit).** The wrong layout swap, the 8-grip + `LayoutImporter`/`UiResizeGrip` port, and both round-2 symptoms landed + together: the real DAT ground-truth (`0x2100006F` lives in + `dats.Local`, not `dats.Portal`) showed the top strip is authored as a + Type-2 Dragbar, not an 8th Resizebar grip as the research doc's + decomp-only reading assumed — `UiRoot` now gives a directly-hit grip's + own edges priority over its generic proximity heuristic, and a + directly-hit move handle the same priority over ambient proximity, so + the plain top strip moves the window while its two corners (which ARE + grips) resize it including the Y axis, matching retail exactly. The + diagonal-cursor gap needed no new cursor plumbing — + `CursorFeedbackController`/`RetailCursorCatalog` already had the exact + DAT-matching Type-9 cursor ids pinned; they just never received a + genuine diagonal edge combination before. The corner-grow gap + dissolved with the `RetailWindowChrome.Imported` mount (0x2100006F's + own border art IS the window chrome — no nine-slice wrapper, no + content crop, frame==content) using the DAT's real + minH=100/maxH=2000/minW=300/maxW=2000. Register row AP-185 files the + one accepted simplification (the `_Locked` cosmetic border-art swap on + `UiLocked` is not ported; the live grip skin shows unconditionally). - **CH6b — floating windows 1–4.** Mount `0x2100005B` ×4 as always-resident children per `gmGamePlayUI::SetupChildren @0x004E9EC0` (ids 0x10000505/0x1000050E/0x1000050F/0x10000510); @@ -174,7 +198,8 @@ implementer per slice against a pinned contract (per | CH4 commands | `090825e7` | 12,221 passed / 4 skipped / 0 failed | REJECT; fixed `724ef2d3`; re-review APPROVE-WITH-FIXES; closed `5d247d55` | pending | | CH5 closeout | (this commit) | — (docs/memory only, no build) | — | pending (connected gate — see test script) | | User gate round 1 | (this commit) | 12,221 passed / 4 skipped / 0 failed (baseline; items A–G fixed this commit) | — | items A–G user-gate round 1 fixed; ten findings total, see "User gate — round 1" below | -| CH6 chat-window shell parity | not started | — | — | filed 2026-08-09 at user gate round 1; research first | +| CH6a main-window layout + 8-grip resize | (this commit) | 12,317 passed / 4 skipped / 0 failed | pending (no subagent review pass this session — implementer-only) | pending — needs the next in-client round (items H/I round 1, item 6 round 2) | +| CH6b/CH6c floating windows + opacity | not started | — | — | not started | | User gate round 2 | (this commit) | 12,267 passed / 4 skipped / 0 failed | — | items 2/4/5 fixed this commit, item 3 confirmed-fixed, item 6 folded into CH6a's spec, item 1 NOT reproduced (see "User gate — round 2" below) | ### CH4 closeout (2026-08-09) @@ -514,9 +539,9 @@ round's scope and filed as slice CH6. | E | `/hslist villas` (and the other three CH4-added request commands) is accepted server-side but produces no visible response. | **FIXED this SHA, closes #362.** New `ClientCommandResponses.cs` parses and renders `ChannelIndex`/`ChannelList`/`AvailableHouses`/`AllegianceInfoResponse`, each ported line-for-line from the named-retail decomp's inbound handlers. Register row TS-70 retired. | | F | Multi-line server text (e.g. `/help`'s reply) doesn't split on embedded `\n` — "probably broken in many places." | **FIXED this SHA.** `ChatWindowController.WrapText` now splits on `\n`/`\r\n` first, then word-wraps each segment independently; the confirmed-correct single-line early-out is unchanged for text with no embedded newline. | | G | The chat input line overflows the window's right edge when the window is resized. | **FIXED this SHA.** The input field's right edge no longer holds a fixed absolute pixel position across a resize (retail edge-mode 0's "frozen at current" fallback, or the `AnchorEdges` default with no `Right` bit) — `ChatWindowController.Bind` now upgrades it to retail edge-mode 1 (`UiLayoutPolicy`) or the equivalent `AnchorEdges.Right` stretch, so the right edge tracks every resize instead of only the bind-time/channel-change recompute. | -| H | Extra/duplicate chat windows appear on number keys 1/2/3/4. | **NEW SLICE CH6** — see the slice list above. Retail has real multi-window chat with per-window type filters; this needs research before a fix, not a quick patch. | -| I | Resizing the chat window only works from one corner, not every corner. | **NEW SLICE CH6** — bundled with H and J as "all-corner resize." | -| J | The chat window has transparency issues / visual artifacts, and the user wants a transparency setting eventually. | **NEW SLICE CH6** — bundled as "opacity"; the future user-facing transparency setting is noted in the slice's own scope, not promised for CH6's first cut. | +| H | Extra/duplicate chat windows appear on number keys 1/2/3/4. | **STILL CH6b** (not this commit) — retail's real floating windows 1–4 (`0x2100005B` ×4) and their `ToggleFloatingChatWindow1..4` keybinds are a separate slice; CH6a only fixed the shell (import/resize) of the main window. | +| I | Resizing the chat window only works from one corner, not every corner. | **FIXED at CH6a (this commit).** Root cause: the main window imported the WRONG LayoutDesc (`0x21000006`, an unrelated layout whose root/resize-bar appear nowhere in the EoR gameplay UI) instead of retail's real `0x2100006F`; every symptom (crop hacks, the dropped resize bar, the one-corner-only resize) was downstream of that. The swap + a new `LayoutImporter` case for element type 9 (`UIElement_Resizebar`, `UiResizeGrip`) + `UiRoot` grip-priority hit-testing now resize from all 4 edges and all 4 corners, while the top strip (a Type-2 Dragbar, not a grip) correctly remains a move-only affordance. | +| J | The chat window has transparency issues / visual artifacts, and the user wants a transparency setting eventually. | **Artifacts FIXED at CH6a (this commit)** — the reported visual glitches were downstream of importing the wrong LayoutDesc (stray unparented siblings, the hand-cropped content width, the 9px patch); all retired with the correct import, and the two hard-coded translucent-black tints on the transcript/input are removed now that their parent panels draw their own authored background sprites. **Real opacity (the future transparency SETTING) remains CH6c** — `UiRenderContext.AlphaMod` still has no draw-path consumer. | Findings A–G's evidence: this commit's diff + the new/updated tests in `tests/AcDream.Runtime.Tests/Gameplay/PlayerMovementControllerTests.cs`, @@ -541,7 +566,7 @@ The user tested round 1's fixes live and reported six more findings. | 2 | Retail shows "In Portal Space…" at the TOP of the screen, SMALL font, tell-yellow (the SpewBox) — acdream renders a big centered white/yellow overlay instead. | **FIXED this SHA.** Verified in the decomp: `gmSmartBoxUI::UseTime`'s notice emits via `ECM_UI::SendNotice_DisplayStringInfo(0x1A, ...)`, which forwards to `AddTextToScroll(str, 0x1A, 1, 0)` — type `0x1A` is HARDCODED to the SpewBox (`docs/research/2026-08-09-chat-retail-interface-text.md` §1.1/§4.2), the same surface every other `ClientLocal` refusal (jump-in-air, etc.) already uses. `PortalWaitNoticeController` (the dedicated centered-overlay presentation) and its lease are DELETED outright; `PortalTunnelPresentation`'s round-1 per-rotation-segment emission cadence is unchanged, now writing straight into `RuntimeCommunicationState.AddText(text, RetailLogTextType.ClientLocal)` — the SpewBox's own dedupe-at-index-0 (`SpewBoxState.Tick`) collapses the per-segment repetition exactly as retail's `gmSpewBoxUI::Update` does. No conflict with the decomp — the fix and the user's report agree exactly. | | 3 | (Round 1 item B, `[System] ` prefix) | **CONFIRMED FIXED** — no regression, no further action. | | 4+5 | `/help` output differs from retail; `/help death` prints an acdream META-MESSAGE ("This is a retail help-topic group; acdream has not yet extracted its exact retail listing text…"); spacing/alignment is off. | **FIXED this SHA via verbatim extraction, not authorship.** `tools/pdb-extract/sweep_weenie_strings.py` generalized to decode narrow `PStringBase` literals (the Help* family's shape) alongside its original UTF-16LE support, then swept every `ClientCommunicationSystem::HelpXxxGroup` function's exact byte extent (read from the pseudo-C's own function-header addresses) against the PDB-paired `C:\Users\erikn\Downloads\acclient.exe` (verified MATCH). 4 of 7 groups (death/status/text/allegiances) are now COMPLETE verbatim listings — `/help death` now prints retail's real 8-line text, byte-exact including the retail-authentic trailing space on the `@day` line. The other 3 (channels/chatting/commands) delegate part or all of their detail text to `ClientCommunicationSystem::HelpStupidChannelHack @0x0056f290`, which builds its output from BN-mislabeled data fragments around a live channel-name lookup — genuinely not decodable with confidence; each keeps its own verbatim summary line plus an explicit UNVERIFIED note citing the address, never a fabricated meta-message. 7 of the ~35 channel one-liners are also now verbatim (a/guild/gu, general/cg, trade/ct, lfg/clfg, roleplay/crp, society/soc, olthoi/o), each including retail's own "Also: @alias" text — this is also the alignment/spacing fix, since the fabricated summaries never matched retail's exact wording. Register row AP-184 filed; ISSUES.md #364 tracks the remaining 3-group gap. `RetailCommandHelpTableTests.cs` (new) pins every complete listing and the partial/UNVERIFIED shape byte-exact. | -| 6 | Resize is still buggy: missing diagonal (corner) cursor feedback, and the window cannot grow in the Y axis when dragging from the bottom-right corner. | **FOLDED into CH6a's spec** (not fixed this SHA — CH6a itself has not started; see the slice list above, now carrying these two symptoms alongside the pre-existing resize-mask/LayoutDesc-import scope). | +| 6 | Resize is still buggy: missing diagonal (corner) cursor feedback, and the window cannot grow in the Y axis when dragging from the bottom-right corner. | **FIXED at CH6a (this commit).** The 4 corner grips (`0x1000069B`/`D`/`F`, `0x100006A1`) decode retail's exact per-grip `BorderLocation` bools (`0x2A`-`0x2D`) and `UiRoot` gives a directly-hit grip's own edges priority, so `CursorFeedbackController`'s existing (already retail-pinned) `KindForResize` now actually receives a diagonal edge combination when hovering a corner — no new cursor ids were invented; `RetailCursorCatalog`'s pinned Type-9 cursor ids already matched the DAT exactly. The corner-grow gap traced to the same wrong-LayoutDesc root cause as item I: mounting through the universal nine-slice wrapper + a 490px content crop against 0x21000006's own (irrelevant) constraints created an indirection prone to stale-baseline growth bugs; 0x2100006F's root IS the complete retail chrome, so CH6a mounts it with `RetailWindowChrome.Imported` (no wrapper, no crop, frame==content) using the DAT's real `minH=100/maxH=2000/minW=300/maxW=2000`, collapsing the whole class. `ChatLayoutConformanceTests.MountedChatWindow_BottomRightGrip_GrowsBothAxes_NotOnlyShrinks` exercises the exact reported gesture end-to-end. | Evidence for items 2, 4, and 5: this commit's diff + `tests/AcDream.UI.Abstractions.Tests/Panels/Chat/RetailCommandHelpTableTests.cs` (new) + the deletion of `tests/AcDream.App.Tests/UI/PortalWaitNoticeControllerTests.cs` (its subject @@ -553,3 +578,15 @@ diagnostics; the two temporary probes and the `jump-probe` headless bot policy are the round's deliverable for item 1, pending either a successful next-round repro or a character created on `probeaccount2`. Full Release suite green (see the commit message for the exact count). + +Item 6's evidence landed in a LATER commit, the CH6a slice itself (see the +ledger row above): `src/AcDream.App/UI/UiResizeGrip.cs` (new), +`src/AcDream.App/UI/Layout/DatWidgetFactory.cs` (Type-9 factory case), +`src/AcDream.App/UI/UiRoot.cs` (grip-priority hit-testing in `OnMouseDown` / +`HoverResizeEdges`), `src/AcDream.App/UI/Layout/ChatWindowController.cs` and +`src/AcDream.App/UI/RetailUiRuntime.cs` (the `0x2100006F` swap + `Imported` +chrome mount), plus new/updated tests in +`tests/AcDream.App.Tests/UI/Layout/DatWidgetFactoryTests.cs`, +`tests/AcDream.App.Tests/UI/UiRootInputTests.cs`, +`tests/AcDream.App.Tests/UI/CursorFeedbackControllerTests.cs`, and +`tests/AcDream.App.Tests/UI/Layout/ChatLayoutConformanceTests.cs`. diff --git a/docs/research/2026-08-09-chat-retail-window-shell.md b/docs/research/2026-08-09-chat-retail-window-shell.md index feb98df8..6d4ec26f 100644 --- a/docs/research/2026-08-09-chat-retail-window-shell.md +++ b/docs/research/2026-08-09-chat-retail-window-shell.md @@ -321,6 +321,26 @@ vtable+0x64 + `StopMouseResizing` → `UIElement::StopResizing @0x0045FD60`. edge and every corner, including the top and the top corners, on both the main and the floating chat windows. +**CORRECTED 2026-08-10 at Campaign CH slice CH6a implementation.** This claim +is wrong for the main window's plain TOP EDGE specifically, established by a +direct `ElementDesc.Type` dump of the installed DAT (ground truth, not a +decomp reading) of the 8 ids `0x1000069B`-`0x100006A2`: 7 of them are +Type 9 (`UIElement_Resizebar`) as claimed, but `0x1000069C` — the straight +top-edge strip between the two top corners — is Type **2** +(`UIElement_Dragbar`), not Type 9. So retail's main chat window is +resizable from every edge and corner EXCEPT the plain top strip, which is a +MOVE handle instead (there is no title bar, so the top strip does double +duty as the drag affordance). The two top CORNERS (`0x1000069B` UL, +`0x1000069D` UR) are still genuine Resizebar grips carrying the top bool, so +dragging from a corner still resizes the Y/top axis — only the straight +edge in between does not. This is fully consistent with, and explains, the +`UIElement_Resizebar::StartMouseResizing` cursor media dump: `0x1000069C` +carries cursor `0x06006119` (the four-arrow MOVE cursor, matching +`WindowMove`), not one of the two diagonal or the vertical resize cursor +ids the seven true grips carry. Not independently re-verified for the +floating-window layout `0x2100005B` (CH6b's scope); assume it needs the +same direct-dump check rather than trusting this row for that layout too. + ### 2.4 Min/max extents Retail reads them as ordinary integer attributes on the window element: @@ -539,6 +559,15 @@ blob. Consequences for acdream: ### 5.2 Gap list +**G1 and G2 are CLOSED as of Campaign CH slice CH6a (2026-08-10).** +`ChatWindowController.LayoutId`/`RootId` now import `0x2100006F`/`0x10000600`; +the crop/rebase/orphan-pruning compensations are deleted; `LayoutImporter` +gained a Type-9 case (`UiResizeGrip`); `UiRoot` gives a directly-hit grip's +own edges priority over its generic proximity heuristic; the main window +mounts with `RetailWindowChrome.Imported` (0x2100006F's own border art is +its chrome). The two subsections below are kept verbatim as the historical +diagnosis — do not re-run this investigation. + **G1 — Wrong LayoutDesc for the main window.** `ChatWindowController.cs:29` imports `0x21000006` with root `0x1000000E`. Retail's EoR main chat window is **LayoutDesc `0x2100006F`**, window element diff --git a/src/AcDream.App/UI/Layout/ChatWindowController.cs b/src/AcDream.App/UI/Layout/ChatWindowController.cs index 7e275348..cc60f264 100644 --- a/src/AcDream.App/UI/Layout/ChatWindowController.cs +++ b/src/AcDream.App/UI/Layout/ChatWindowController.cs @@ -10,8 +10,10 @@ using AcDream.UI.Abstractions.Panels.Chat; namespace AcDream.App.UI.Layout; /// -/// Binds the imported chat LayoutDesc (0x21000006) to live behavior — the acdream -/// analogue of retail ChatInterface + gmMainChatUI::PostInit @0x4ce130. +/// Binds the imported chat LayoutDesc (0x2100006F, retail's ACTUAL main chat +/// window — see docs/research/2026-08-09-chat-retail-window-shell.md §2.1/§5, +/// Campaign CH slice CH6a) to live behavior — the acdream analogue of retail +/// ChatInterface + gmMainChatUI::PostInit @0x4ce130. /// /// /// The transcript (0x10000011) is Type-12 and is built as a @@ -23,15 +25,31 @@ namespace AcDream.App.UI.Layout; /// place. The channel menu (0x10000014) is built as (Type 6) /// and bound in place. /// +/// +/// +/// CH6a retired the wrong 0x21000006 import (a different, unrelated chat +/// layout whose root 0x1000000E and 800px resize bar 0x1000000F +/// appear nowhere in the EoR gameplay UI) along with every downstream compensation +/// that existed only to paper over it: the hand-cropped 490px content width, the +/// dropped resize bar, the 9px transcript-panel patch, the orphan-sibling pruning, +/// the max/min-vs-scrollbar overlap shift, and the scrollbar top-reclaim. All of +/// those elements/gaps do not exist in 0x2100006F's authored 410×100 tree — +/// nothing was ever missing; the wrong layout was imported. The eight authored +/// resize grips (0x1000069B-0x100006A2, Type 9 +/// UIElement_Resizebar minus the top strip which is a Type-2 +/// UIElement_Dragbar move handle) import generically via +/// / and need no +/// controller-side binding; gives a directly-hit grip's own +/// edges priority over its generic proximity heuristic. +/// /// public sealed class ChatWindowController : IRetainedWindowStateController, IRetainedPanelController { - public const uint LayoutId = 0x21000006u; + public const uint LayoutId = 0x2100006Fu; private bool _disposed; - // Element ids from chat LayoutDesc 0x21000006 (confirmed in Task D/G1). - private const uint RootId = 0x1000000Eu; - private const uint ResizeBarId = 0x1000000Fu; // dat top resize bar (800px — dropped; nine-slice grips replace it) + // Element ids from chat LayoutDesc 0x2100006F (Campaign CH slice CH6a). + private const uint RootId = 0x10000600u; // gmFloatyMainChatUI window root, 410x100 private const uint TranscriptPanelId = 0x10000010u; private const uint TranscriptId = 0x10000011u; // Type-12 prototype — skipped by factory private const uint TrackId = 0x10000012u; @@ -41,6 +59,31 @@ public sealed class ChatWindowController : IRetainedWindowStateController, IReta private const uint SendId = 0x10000019u; private const uint MaxMinId = 0x1000046Fu; + // Chat-window 1-4 state-mirror indicator buttons + // (gmMainChatUI::RecvNotice_SetPanelVisibility @0x004CCD80): the button lights + // up iff the corresponding floating chat window is visible. The mechanism is + // one-directional (window visibility drives the button, not the reverse) and + // the floating windows themselves are CH6b's scope — these import generically + // (visible, inert) here and are left for CH6b to wire. + private const uint Indicator1Id = 0x10000522u; + private const uint Indicator2Id = 0x10000523u; + private const uint Indicator3Id = 0x10000524u; + private const uint Indicator4Id = 0x10000525u; + + // The 8 cosmetic "_Locked" border-art twins + // (gmFloatyMainChatUI::UpdateLockedStatus @0x004D23D0 swaps these in for the 8 + // live Resizebar/Dragbar grips above when PlayerModule::LockUI is true — see + // research doc §1.6). CH6a does not implement the lock-state art swap (register + // row AP-185 — UiRoot.UiLocked already gates INTERACTION generically, independent + // of which art is shown); default to the unlocked visual (hide these, show the + // live grips) to match UiRoot's own UiLocked=false default and avoid double + // rendering two overlapping border-art layers. + private static readonly uint[] LockedTwinIds = + { + 0x10000693u, 0x10000694u, 0x10000695u, 0x10000696u, + 0x10000697u, 0x10000698u, 0x10000699u, 0x1000069Au, + }; + // Channel menu sprite ids (confirmed in chat element dump). private const uint MenuNormal = 0x06004D65u; // button face private const uint MenuPressed = 0x06004D66u; // button pressed @@ -182,15 +225,10 @@ public sealed class ChatWindowController : IRetainedWindowStateController, IReta return null; } - // LayoutDesc 0x21000006 has SEVERAL top-level elements: the gmMainChatUI window - // (RootId 0x1000000E) PLUS stray auxiliary elements that are NOT part of the docked - // window — a separate Field+ListBox (0x1000001C/1D, the floaty scrollback), the - // talk-focus highlight strip (0x1000001E), and a scroll-button prototype (0x10000526). - // LayoutImporter.ImportInfos wraps all top-level elements in a synthetic Type-3 root, - // so using layout.Root would render the strays overlapping the real window (the - // red-striped garbage in the first live render). Use the gmMainChatUI window itself: - // GameWindow adds this to the host, which re-parents it out of the synthetic wrapper, - // orphaning the strays so they never draw. + // LayoutDesc 0x2100006F has exactly ONE top-level element — the + // gmFloatyMainChatUI window root itself (RootId 0x10000600, authored + // 410x100). No stray auxiliary siblings, no synthetic-wrapper orphaning + // needed: FindElement/layout.Root agree. var window = layout.FindElement(RootId) ?? layout.Root; var c = new ChatWindowController { @@ -198,17 +236,13 @@ public sealed class ChatWindowController : IRetainedWindowStateController, IReta DatWindowInfo = FindInfo(rootInfo, RootId) ?? rootInfo, }; - // Drop the dat top resize bar (0x1000000F): it is authored 800px wide and - // juts out of the content-width window. The host wraps this content in the - // universal nine-slice chrome, whose grips provide the resize affordance. - if (layout.FindElement(ResizeBarId) is { Parent: { } rbParent } resizeBar) - rbParent.RemoveChild(resizeBar); - - // Reclaim the 9px strip the dropped resize bar occupied (rows 0-8 of the root): - // grow the transcript panel up to the window top so its dark bg fills the strip. - // Otherwise the root element's brown bg shows through as a sliver along the top. - transcriptPanel.Top = 0f; - transcriptPanel.Height += 9f; // dat resize-bar height (0x1000000F H=9) + // The 8 cosmetic "_Locked" border-art twins default HIDDEN — CH6a does not + // implement retail's UiLocked-driven art swap (see the class doc + the + // LockedTwinIds field comment); the 8 live grip/dragbar elements (which + // occupy the SAME rects one ReadOrder layer above) are the ones shown. + foreach (uint id in LockedTwinIds) + if (layout.FindElement(id) is { } twin) + twin.Visible = false; // ── Transcript ─────────────────────────────────────────────────── // The factory now builds the Type-12 transcript element (0x10000011) as a UiText. @@ -225,7 +259,11 @@ public sealed class ChatWindowController : IRetainedWindowStateController, IReta c.Transcript.RightAligned = false; c.Transcript.OneLine = false; c.Transcript.Selectable = true; - c.Transcript.BackgroundColor = new Vector4(0f, 0f, 0f, 0.35f); // retail translucent transcript + // No hand-drawn tint (Campaign CH slice CH6a, item 5): the transcript's + // PARENT panel (0x10000010) carries its own authored background sprite + // (0x06004CC2) that draws automatically via the generic UiDatElement + // fallback — a flat overlay here only mismatched it under the wrong + // (0x21000006) layout, whose transcript panel lacked one. c.Transcript.LinesProvider = () => c.GetTranscriptLines(vm); // ── Input ──────────────────────────────────────────────────────── @@ -234,7 +272,9 @@ public sealed class ChatWindowController : IRetainedWindowStateController, IReta c.Input = input; c.Input.DatFont = datFont; c.Input.Font = debugFont; - c.Input.BackgroundColor = new Vector4(0f, 0f, 0f, 0.35f); + // No hand-drawn tint here either — the input ROW panel (0x10000013) carries + // its own authored background sprite (0x0600113A); same reasoning as the + // transcript above. c.Input.SpriteResolve = resolve; c.Input.OnSubmit = text => ChatCommandRouter.Submit(text, vm, busProvider(), c._activeChannel); @@ -272,14 +312,12 @@ public sealed class ChatWindowController : IRetainedWindowStateController, IReta // ── Scrollbar — bind the factory-built Type-11 track element ──────── // The factory now builds the Type-11 track element (0x10000012) as a UiScrollbar - // directly. Find it, bind it in place — no remove/add needed. + // directly. Find it, bind it in place — no remove/add needed. The dat authors it + // flush with the transcript panel's top (Top=0, Height=73 == the panel's own + // height) — no top-reclaim adjustment needed under the correct layout. var track = layout.FindElement(TrackId); if (track is UiScrollbar bar) { - float oldTop = bar.Top; - bar.Top = 0f; // pull up to the panel top (resize-bar reclaim) - bar.Height = bar.Height + oldTop; - bar.ResetAnchorCapture(); bar.Model = c.Transcript.Scroll; bar.SpriteResolve ??= resolve; c.Scrollbar = bar; @@ -343,14 +381,11 @@ public sealed class ChatWindowController : IRetainedWindowStateController, IReta } // ── Max/min toggle — gmMainChatUI::HandleMaximizeButton ── + // The dat already authors max/min (368,5,16,16) just left of the scrollbar + // column (389,5,16,73 abs) with a natural 5px gap — no overlap under the + // correct layout, so no positional shift is needed. if (layout.FindElement(MaxMinId) is UiButton maxMinEl) { - // The dat puts max/min and the scrollbar up-button at the SAME X (both - // right-anchored), so at content width they overlap. Retail shows max/min - // just LEFT of the scrollbar column — shift it one button-width left. - if (track is not null) - maxMinEl.Left = track.Left - maxMinEl.Width; - maxMinEl.ResetAnchorCapture(); c._maxMinButton = maxMinEl; maxMinEl.OnClick = c.ToggleMaximize; } diff --git a/src/AcDream.App/UI/Layout/DatWidgetFactory.cs b/src/AcDream.App/UI/Layout/DatWidgetFactory.cs index 6fd3c60c..34f069db 100644 --- a/src/AcDream.App/UI/Layout/DatWidgetFactory.cs +++ b/src/AcDream.App/UI/Layout/DatWidgetFactory.cs @@ -56,7 +56,7 @@ public static class DatWidgetFactory Func? stringResolve = null) { // Retail Type 3 = UIElement_Field (reg :126190), but in acdream's CURRENT layouts - // (vitals 0x2100006C / chat 0x21000006) Type-3 elements are sprite-bearing chrome + + // (vitals 0x2100006C / chat 0x2100006F) Type-3 elements are sprite-bearing chrome + // containers (the 8-piece bevel corners/edges, the transcript/input panels), NOT // editable fields — retail draws those as inert media-bearing Fields, which our // UiDatElement reproduces pixel-for-pixel (and without the spurious focus/edit @@ -95,6 +95,7 @@ public static class DatWidgetFactory // gmUIElement_*Indicator custom button classes 6 => new UiMenu(), // UIElement_Menu (reg :120163) 7 => BuildMeter(info, resolve, elementFont), // UIElement_Meter + 9 => BuildResizeGrip(info), // UIElement_Resizebar (reg 0x0046B920) 0xD => new UiViewport(), // UIElement_Viewport — 3-D mini-scene blit leaf 11 => BuildScrollbar(info, resolve), // UIElement_Scrollbar (reg :124137) 12 => BuildText(info, resolve, elementFont, stringResolve), // UIElement_Text @@ -255,6 +256,29 @@ public static class DatWidgetFactory return bar; } + /// + /// Builds a from a Type-9 UIElement_Resizebar + /// element: retail StartMouseResizing @0x0046B7E0 reads four BOOL + /// attributes — 0x2A=bottom, 0x2B=left, 0x2C=right, + /// 0x2D=top — and decodes them into a BorderLocation. A grip with + /// no true bool (the inert _Locked cosmetic twins are a DIFFERENT + /// element type entirely and never reach this factory case, but an + /// all-false Type-9 element is handled defensively the same way retail's own + /// BORDER_NONE fallback does) decodes to + /// — then treats it as contributing no resize edges. + /// + private static UiResizeGrip BuildResizeGrip(ElementInfo info) + { + bool bottom = info.TryGetEffectiveBool(0x2Au, out bool bottomValue) && bottomValue; + bool left = info.TryGetEffectiveBool(0x2Bu, out bool leftValue) && leftValue; + bool right = info.TryGetEffectiveBool(0x2Cu, out bool rightValue) && rightValue; + bool top = info.TryGetEffectiveBool(0x2Du, out bool topValue) && topValue; + return new UiResizeGrip + { + BorderLocation = UiResizeGrip.DecodeBorderLocation(bottom, left, right, top), + }; + } + private static UiLayoutPolicy? CreateLayoutPolicy(ElementInfo info) { if (!info.HasOriginalParentSize) return null; diff --git a/src/AcDream.App/UI/RetailUiRuntime.cs b/src/AcDream.App/UI/RetailUiRuntime.cs index d3248f54..0eec62fa 100644 --- a/src/AcDream.App/UI/RetailUiRuntime.cs +++ b/src/AcDream.App/UI/RetailUiRuntime.cs @@ -684,7 +684,7 @@ public sealed class RetailUiRuntime : IDisposable } if (info is null || layout is null) { - Console.WriteLine("[D.2b] chat: LayoutDesc 0x21000006 not found."); + Console.WriteLine("[D.2b] chat: LayoutDesc 0x2100006F not found."); return; } @@ -698,7 +698,7 @@ public sealed class RetailUiRuntime : IDisposable _bindings.Assets.ResolveSprite); if (controller is null) { - Console.WriteLine("[D.2b] chat: required role elements missing in 0x21000006."); + Console.WriteLine("[D.2b] chat: required role elements missing in 0x2100006F."); return; } @@ -712,27 +712,39 @@ public sealed class RetailUiRuntime : IDisposable new RetailWindowFrame.Options { WindowName = WindowNames.Chat, - Chrome = RetailWindowChrome.NineSlice, + // 0x2100006F's root already IS the complete retail window — its own + // 8 border/corner elements (the live Resizebar/Dragbar grips, or their + // _Locked cosmetic twins) are its chrome, at its authored 410x100 + // extent. No universal nine-slice wrapper or content crop needed + // (Campaign CH slice CH6a; the wrapper + 490px crop were compensations + // for importing the wrong 0x21000006 layout). + Chrome = RetailWindowChrome.Imported, Left = 10f, Top = 440f, - ContentWidth = 490f, - ContentHeight = root.Height, - RebaseContentLayout = true, DatConstraintSource = controller.DatWindowInfo, - MinWidth = 200f, + // Bumping this resets any locally-persisted width/height captured + // under the old, wrong-layout mount (490px-cropped content, patched + // 9px height) to the newly authored 410x100 default on next load. + AuthoredGeometryRevision = 1, ResizeX = true, ResizeY = true, - // The imported 9px top Resizebar is deliberately removed by - // ChatWindowController. Its replacement top chrome is the move - // affordance; only the other three wrapper edges resize. - ResizableEdges = ResizeEdges.Left | ResizeEdges.Right | ResizeEdges.Bottom, - Opacity = 0.75f, + // All 4 edges + 4 corners resize via the authored Resizebar grips + // (UiRoot gives a directly-hit grip's own edges priority over this + // blanket mask); the default already covers every edge, and the + // plain top-STRIP correctly remains a move-only affordance because + // its own element is a Type-2 Dragbar, not a grip (research doc §2.1, + // §2.3 — the top edge authors NO Resizebar of its own; only its two + // corners do). + // Opacity: retail's whole-window alpha (ChatInterface::SetOpacity + // @0x004F3120) is CH6c's scope — UiRenderContext.AlphaMod currently has + // no draw-path consumer, so any value here is presentation-inert; leave + // the frame at the default 1f rather than assert a value with no effect. Controller = controller, StateController = controller, }); controller.AttachWindow(handle); Host.Root.DefaultTextInput = controller.Input; - Console.WriteLine("[D.2b] retail chat window from LayoutDesc importer (0x21000006)."); + Console.WriteLine("[D.2b] retail chat window from LayoutDesc importer (0x2100006F)."); } private void MountToolbar() diff --git a/src/AcDream.App/UI/UiResizeGrip.cs b/src/AcDream.App/UI/UiResizeGrip.cs new file mode 100644 index 00000000..c4930ec0 --- /dev/null +++ b/src/AcDream.App/UI/UiResizeGrip.cs @@ -0,0 +1,85 @@ +namespace AcDream.App.UI; + +/// +/// Retail UIElement_Resizebar (element class 9, +/// UIElement_Resizebar::Register @0x0046B920 registers class 9 with the +/// LayoutDesc element factory). A leaf grip authored at exactly one edge or +/// corner of a window; retail authors 4 edge grips + 4 corner grips per +/// resizable window (main chat: 0x1000069B-0x100006A2, minus the +/// straight top strip which is a retail UIElement_Dragbar move handle +/// instead — see the class doc on +/// and docs/research/2026-08-09-chat-retail-window-shell.md §2.1/§2.3). +/// +/// +/// UIElement_Resizebar::StartMouseResizing @0x0046B7E0 reads four BOOL +/// attributes off the element — 0x2A=bottom, 0x2B=left, +/// 0x2C=right, 0x2D=top — and combines them into a +/// BorderLocation (acclient.h:4327). +/// is a verbatim port of that branch order. acdream's engine expresses resize +/// direction as an edge-flag bitmask () rather than +/// retail's nine-case enum; is the lossless projection — +/// every value maps to exactly one +/// combination and back. +/// +/// +/// +/// A grip is a small (5px) leaf with no children and no authored background +/// media beyond its own cursor-feedback sprite; it exists purely as a precise +/// hit region. gives a directly-hit grip's +/// own priority over the generic proximity-based +/// heuristic, so e.g. the chat +/// window's top-left/top-right CORNER grips resize (including the Y/top axis) +/// while the plain top EDGE strip in between remains a pure move handle. +/// +/// +public sealed class UiResizeGrip : UiElement +{ + /// Retail BorderLocation (acclient.h:4327): + /// BORDER_NONE=0, BORDER_UL=1, BORDER_TOP=2, BORDER_UR=3, BORDER_RIGHT=4, + /// BORDER_LR=5, BORDER_BOTTOM=6, BORDER_LL=7, BORDER_LEFT=8. + public enum Border + { + None = 0, + UpperLeft = 1, + Top = 2, + UpperRight = 3, + Right = 4, + LowerRight = 5, + Bottom = 6, + LowerLeft = 7, + Left = 8, + } + + /// Decoded retail BorderLocation for this grip. + public Border BorderLocation { get; set; } + + /// + /// Exact port of UIElement_Resizebar::StartMouseResizing @0x0046B7E0's + /// if/else-if chain (right beats left beats top beats bottom when more than + /// two bools are set, which retail's authored data never does — corners set + /// exactly two adjacent bools, edges set exactly one). + /// + public static Border DecodeBorderLocation(bool bottom, bool left, bool right, bool top) + { + if (right) return top ? Border.UpperRight : bottom ? Border.LowerRight : Border.Right; + if (left) return top ? Border.UpperLeft : bottom ? Border.LowerLeft : Border.Left; + if (top) return Border.Top; + if (bottom) return Border.Bottom; + return Border.None; + } + + /// The projection 's resize + /// drag state machine consumes — a lossless re-encoding of . + public ResizeEdges Edges => BorderLocation switch + { + Border.UpperLeft => ResizeEdges.Left | ResizeEdges.Top, + Border.Top => ResizeEdges.Top, + Border.UpperRight => ResizeEdges.Right | ResizeEdges.Top, + Border.Right => ResizeEdges.Right, + Border.LowerRight => ResizeEdges.Right | ResizeEdges.Bottom, + Border.Bottom => ResizeEdges.Bottom, + Border.LowerLeft => ResizeEdges.Left | ResizeEdges.Bottom, + Border.Left => ResizeEdges.Left, + _ => ResizeEdges.None, + }; +} diff --git a/src/AcDream.App/UI/UiRoot.cs b/src/AcDream.App/UI/UiRoot.cs index 79954ada..0e05a8c6 100644 --- a/src/AcDream.App/UI/UiRoot.cs +++ b/src/AcDream.App/UI/UiRoot.cs @@ -91,11 +91,47 @@ public sealed class UiRoot : UiElement { var target = Pick(MouseX, MouseY); var window = FindWindow(target); - return !UiLocked && window is { Resizable: true } - ? HitEdges(window, MouseX, MouseY, ResizeGrip) - : ResizeEdges.None; + if (UiLocked || window is not { Resizable: true }) + return ResizeEdges.None; + + // A directly-hovered authored Resizebar grip (retail element class 9) + // is precise geometry, not a proximity heuristic — it wins outright. + var gripEdges = EffectiveGripEdges(target, window); + if (gripEdges != ResizeEdges.None) + return gripEdges; + + // An authored move handle (retail UIElement_Dragbar, class 2) directly + // under the cursor takes precedence over ambient edge-proximity — e.g. + // the main chat window's top strip moves the window even though its + // own top-left/top-right CORNERS (separate Resizebar grips) resize it + // (docs/research/2026-08-09-chat-retail-window-shell.md §2.1/§2.3). + if (FindDragHandleWindow(target) is not null) + return ResizeEdges.None; + + return HitEdges(window, MouseX, MouseY, ResizeGrip); } } + + /// + /// Resolve the resize edges a literal, directly-hit + /// contributes, masked by the window's own / + /// axis gates and + /// mask (the same gates applies to its proximity heuristic). + /// Returns when is not + /// itself an authored grip. + /// + private static ResizeEdges EffectiveGripEdges(UiElement? target, UiElement? window) + { + if (window is null || target is not UiResizeGrip grip) + return ResizeEdges.None; + + ResizeEdges edges = grip.Edges; + if (!window.ResizeX) edges &= ~(ResizeEdges.Left | ResizeEdges.Right); + if (!window.ResizeY) edges &= ~(ResizeEdges.Top | ResizeEdges.Bottom); + edges &= window.ResizableEdges; + return edges; + } + public bool HoverWindowMove { get @@ -469,9 +505,18 @@ public sealed class UiRoot : UiElement if (raiseWindow is not null) BringToFront(raiseWindow); if (btn == UiMouseButton.Left && raiseWindow is not null && !UiLocked) { - var edges = window is { Resizable: true } - ? HitEdges(window, x, y, ResizeGrip) - : ResizeEdges.None; + // A directly-pressed authored Resizebar grip is precise geometry and + // wins outright, regardless of an overlapping move handle or the + // generic proximity heuristic. Failing that, a directly-pressed move + // handle (dragbar) wins over ambient edge-proximity — the chat + // window's top strip must move the window even though it sits + // within ResizeGrip px of the window's own top edge. + var gripEdges = EffectiveGripEdges(target, window); + var edges = gripEdges != ResizeEdges.None + ? gripEdges + : (handleWindow is null && window is { Resizable: true } + ? HitEdges(window, x, y, ResizeGrip) + : ResizeEdges.None); if (edges != ResizeEdges.None) { // Edge resize still wins, even over a CapturesPointerDrag child: diff --git a/src/AcDream.App/UI/UiScrollbar.cs b/src/AcDream.App/UI/UiScrollbar.cs index 25c04acc..5fd01949 100644 --- a/src/AcDream.App/UI/UiScrollbar.cs +++ b/src/AcDream.App/UI/UiScrollbar.cs @@ -9,8 +9,9 @@ namespace AcDream.App.UI; /// thumb size = trackLen * ThumbRatio (min 8px); step ±1 line. /// /// -/// Dat element ids (chat LayoutDesc 0x21000006): track 0x10000012 (X=474 Y=6 W=16 H=68), -/// thumb 0x1000048C. The track is instanced from base layout 0x2100003E which contains +/// Dat element ids (chat LayoutDesc 0x2100006F, Campaign CH slice CH6a — retired the +/// wrong 0x21000006 import): track 0x10000012 (X=384 Y=0 W=16 H=73 relative to the +/// transcript panel). The track is instanced from base layout 0x2100003E which contains /// the full scrollbar widget with distinct up/down button children: /// Up button element 0x10000071 — Y=0, 16×16, Normal sprite 0x06004C69. /// Down button element 0x10000072 — Y=32, 16×16, Normal sprite 0x06004C6C. diff --git a/tests/AcDream.App.Tests/UI/CursorFeedbackControllerTests.cs b/tests/AcDream.App.Tests/UI/CursorFeedbackControllerTests.cs index 6540bf4d..3a18783f 100644 --- a/tests/AcDream.App.Tests/UI/CursorFeedbackControllerTests.cs +++ b/tests/AcDream.App.Tests/UI/CursorFeedbackControllerTests.cs @@ -97,6 +97,63 @@ public sealed class CursorFeedbackControllerTests Assert.Equal(new UiCursorMedia(0x06006128u, 16, 16), active.Cursor); } + [Fact] + public void CornerGrip_ShowsTheDiagonalResizeCursor_NotTheStraightOne() + { + // Campaign CH slice CH6a, user-gate round 2 item 6: hovering a directly + // authored corner Resizebar grip (not just the generic proximity edge) + // must resolve to the retail diagonal cursor, matching the same pinned + // ids as ResizeEdges_chooseExpectedRetailCursor (0x06006126 for the + // NW-SE UL/LR diagonal). + var root = new UiRoot { Width = 400, Height = 300 }; + var window = new UiPanel + { + Left = 50, Top = 40, Width = 150, Height = 100, + Draggable = true, Resizable = true, + }; + var grip = new UiResizeGrip + { + BorderLocation = UiResizeGrip.Border.LowerRight, + Left = 145, Top = 95, Width = 5, Height = 5, + }; + window.AddChild(grip); + root.AddChild(window); + var controller = new CursorFeedbackController(); + + var gs = grip.ScreenPosition; + root.OnMouseMove((int)(gs.X + 2), (int)(gs.Y + 2)); + + CursorFeedback feedback = controller.Update(root); + Assert.Equal(CursorFeedbackKind.ResizeDiagonalNwse, feedback.Kind); + Assert.Equal(new UiCursorMedia(0x06006126u, 16, 16), feedback.Cursor); + } + + [Fact] + public void EdgeGrip_ShowsTheStraightResizeCursor() + { + var root = new UiRoot { Width = 400, Height = 300 }; + var window = new UiPanel + { + Left = 50, Top = 40, Width = 150, Height = 100, + Draggable = true, Resizable = true, + }; + var grip = new UiResizeGrip + { + BorderLocation = UiResizeGrip.Border.Bottom, + Left = 5, Top = 95, Width = 140, Height = 5, + }; + window.AddChild(grip); + root.AddChild(window); + var controller = new CursorFeedbackController(); + + var gs = grip.ScreenPosition; + root.OnMouseMove((int)(gs.X + 2), (int)(gs.Y + 2)); + + CursorFeedback feedback = controller.Update(root); + Assert.Equal(CursorFeedbackKind.ResizeVertical, feedback.Kind); + Assert.Equal(new UiCursorMedia(0x06005E66u, 16, 16), feedback.Cursor); + } + [Fact] public void AuthoredWidgetCursor_winsUntilSyntheticWindowMoveStarts() { diff --git a/tests/AcDream.App.Tests/UI/Layout/ChatLayoutConformanceTests.cs b/tests/AcDream.App.Tests/UI/Layout/ChatLayoutConformanceTests.cs index 628247f0..f40c87d9 100644 --- a/tests/AcDream.App.Tests/UI/Layout/ChatLayoutConformanceTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/ChatLayoutConformanceTests.cs @@ -7,9 +7,11 @@ using AcDream.UI.Abstractions.Panels.Chat; namespace AcDream.App.Tests.UI.Layout; /// -/// Dat-free conformance tests for the committed chat_21000006.json golden fixture. -/// Verifies that LayoutImporter.ImportInfos correctly resolves the BaseElement / -/// BaseLayoutId inheritance chain for the chat window (LayoutDesc 0x21000006). +/// Dat-free conformance tests for the committed chat_2100006f.json golden fixture — +/// retail's ACTUAL main chat window (LayoutDesc 0x2100006F, window root +/// 0x10000600, authored 410x100; Campaign CH slice CH6a). Verifies that +/// LayoutImporter.ImportInfos correctly resolves the BaseElement / BaseLayoutId +/// inheritance chain. /// public class ChatLayoutConformanceTests { @@ -50,6 +52,72 @@ public class ChatLayoutConformanceTests Assert.Equal(12u, Find(root, 0x10000016u)!.Type); // Text/style-prototype (input) } + [Theory] + [InlineData(0x10000522u)] + [InlineData(0x10000523u)] + [InlineData(0x10000524u)] + [InlineData(0x10000525u)] + public void ChatFixture_ChatWindowIndicatorButtons_ImportFromTheAuthoredTree(uint indicatorId) + { + // gmMainChatUI::RecvNotice_SetPanelVisibility @0x004CCD80 writes these + // four state-mirror buttons for floating chat windows 1-4. CH6a imports + // them generically (visible, inert) and leaves wiring their live/pressed + // state to CH6b's floating-window slice. + var root = FixtureLoader.LoadChatInfos(); + Assert.NotNull(Find(root, indicatorId)); + } + + [Theory] + [InlineData(0x10000522u)] + [InlineData(0x10000523u)] + [InlineData(0x10000524u)] + [InlineData(0x10000525u)] + public void MountedChatWindow_IndicatorButtons_ImportVisibleAndInert(uint indicatorId) + { + var infos = FixtureLoader.LoadChatInfos(); + var layout = LayoutImporter.Build(infos, NoTex, null); + var controller = ChatWindowController.Bind( + infos, layout, new ChatVM(new ChatLog()), () => NullCommandBus.Instance, null, null, NoTex); + Assert.NotNull(controller); + + UiElement? indicator = layout.FindElement(indicatorId); + Assert.NotNull(indicator); + Assert.True(indicator!.Visible); + // Inert: CH6a does not wire a click handler (CH6b's job — the + // one-directional visibility mirror has no button-press behavior of + // its own in retail either, per the research doc §1.4). UiButton + // structurally always reports HandlesClick=true (it can receive the + // event), but with no OnClick/OnClickAt bound, a click is a no-op. + var button = Assert.IsType(indicator); + Assert.Null(button.OnClick); + Assert.Null(button.OnClickAt); + } + + [Theory] + [InlineData(0x10000693u)] + [InlineData(0x10000694u)] + [InlineData(0x10000695u)] + [InlineData(0x10000696u)] + [InlineData(0x10000697u)] + [InlineData(0x10000698u)] + [InlineData(0x10000699u)] + [InlineData(0x1000069Au)] + public void MountedChatWindow_LockedTwinBorderArt_DefaultsHidden(uint lockedTwinId) + { + // Register row AP-185: CH6a shows only the live (unlocked) grip/dragbar + // border-art set by default, matching UiRoot.UiLocked's own false + // default and avoiding a double-rendered border. + var infos = FixtureLoader.LoadChatInfos(); + var layout = LayoutImporter.Build(infos, NoTex, null); + var controller = ChatWindowController.Bind( + infos, layout, new ChatVM(new ChatLog()), () => NullCommandBus.Instance, null, null, NoTex); + Assert.NotNull(controller); + + UiElement? twin = layout.FindElement(lockedTwinId); + Assert.NotNull(twin); + Assert.False(twin!.Visible); + } + [Fact] public void ChatFixture_BuildsSelectableTranscriptAndEditableInputInPlace() { @@ -82,16 +150,39 @@ public class ChatLayoutConformanceTests public void ChatFixture_WindowRootCarriesRetailHeightConstraints() { var root = FixtureLoader.LoadChatInfos(); - var window = Find(root, 0x1000000Eu)!; + var window = Find(root, 0x10000600u)!; Assert.True(window.TryGetEffectiveInteger(0x3Eu, out int minHeight)); Assert.True(window.TryGetEffectiveInteger(0x3Cu, out int maxHeight)); Assert.Equal(100, minHeight); - Assert.Equal(360, maxHeight); + Assert.Equal(2000, maxHeight); } [Fact] - public void ChatFixture_CroppedDockedRoot_ReflowsContentAcrossMountedWidth() + public void ChatFixture_WindowRootCarriesRetailWidthConstraints() + { + var root = FixtureLoader.LoadChatInfos(); + var window = Find(root, 0x10000600u)!; + + Assert.True(window.TryGetEffectiveInteger(0x3Fu, out int minWidth)); + Assert.True(window.TryGetEffectiveInteger(0x3Du, out int maxWidth)); + Assert.Equal(300, minWidth); + Assert.Equal(2000, maxWidth); + } + + [Fact] + public void ChatFixture_RootIsAuthored410x100_NoCropNeeded() + { + // Campaign CH slice CH6a: 0x2100006F's window root is already the exact + // mounted extent — the 490px content-width crop that the wrong + // 0x21000006 import needed no longer applies to anything. + var root = FixtureLoader.LoadChatInfos(); + Assert.Equal(410f, root.Width); + Assert.Equal(100f, root.Height); + } + + [Fact] + public void ChatFixture_DockedRoot_ReflowsContentAcrossMountedWidth() { var infos = FixtureLoader.LoadChatInfos(); var layout = LayoutImporter.Build(infos, NoTex, null); @@ -105,19 +196,24 @@ public class ChatLayoutConformanceTests NoTex); Assert.NotNull(controller); + // No crop-then-rebase dance needed: the root's OWN authored extent + // (410x100) already matches the design width children's imported + // LayoutPolicy captured, so growing it directly exercises the same + // raw-edge reflow the crop workaround needed a rebase step for. var root = controller!.Root; - root.Width = 490; - root.Height = 100; - root.RebaseChildLayoutBaselines(); + Assert.Equal(410f, root.Width); root.Width = 615; + // Both panels are authored with a 5px margin to BOTH the left and right + // window edges (X=5, right-edge width = 410-(5+400) = 5) — a stretch + // grows the panel by the delta MINUS both margins: 615 - 5 - 5 = 605. var transcriptPanel = layout.FindElement(0x10000010u)!; var inputBar = layout.FindElement(0x10000013u)!; transcriptPanel.ApplyAnchor(root.Width, root.Height); inputBar.ApplyAnchor(root.Width, root.Height); - Assert.Equal(615f, transcriptPanel.Width); - Assert.Equal(615f, inputBar.Width); + Assert.Equal(605f, transcriptPanel.Width); + Assert.Equal(605f, inputBar.Width); } [Fact] @@ -158,6 +254,11 @@ public class ChatLayoutConformanceTests null, NoTex)!; var root = new UiRoot { Width = 800, Height = 600 }; + // Campaign CH slice CH6a: 0x2100006F's own border art IS the window + // chrome — Chrome=Imported, no content-width crop, no MinWidth override + // (the DAT's own 0x3D/0x3F=2000/300 govern). Frame == content, so the + // maximize math below operates directly on the authored 410x100 extent + // with the DAT's real minH=100/maxH=2000 (not the wrong layout's 360). RetailWindowHandle handle = RetailWindowFrame.Mount( root, controller.Root, @@ -165,36 +266,126 @@ public class ChatLayoutConformanceTests new RetailWindowFrame.Options { WindowName = WindowNames.Chat, - Chrome = RetailWindowChrome.NineSlice, + Chrome = RetailWindowChrome.Imported, Left = 12f, Top = 390f, - ContentWidth = 490f, - ContentHeight = controller.Root.Height, - RebaseContentLayout = true, DatConstraintSource = controller.DatWindowInfo, - MinWidth = 200f, }); controller.AttachWindow(handle); var maxMin = Assert.IsType(layout.FindElement(0x1000046Fu)); + // frame.Height=100, parentHeight=600, expansion=300 → targetHeight = + // clamp(min(400,600),100,2000) = 400. growUp because Top(390)+400>600. + // targetTop = max(0, 390-(400-100)) = 90. Lower edge fixed at 490. maxMin.OnClick!(); Assert.True(controller.IsMaximized); - Assert.Equal(130f, handle.Top); - Assert.Equal(370f, handle.Height); // DAT max 360 + 2*5px shared chrome - Assert.Equal(500f, handle.Top + handle.Height); // lower edge stays fixed while growing upward + Assert.Equal(90f, handle.Top); + Assert.Equal(400f, handle.Height); + Assert.Equal(490f, handle.Top + handle.Height); // lower edge stays fixed while growing upward Assert.Equal(RetailUiStateIds.Maximized, maxMin.ActiveRetailStateId); - controller.Root.ApplyAnchor(handle.Width, handle.Height); - Assert.Equal(360f, controller.Root.Height); maxMin.OnClick!(); Assert.False(controller.IsMaximized); Assert.Equal(390f, handle.Top); - Assert.Equal(110f, handle.Height); + Assert.Equal(100f, handle.Height); Assert.Equal(RetailUiStateIds.Minimized, maxMin.ActiveRetailStateId); } + [Theory] + [InlineData(0x1000069Bu, UiResizeGrip.Border.UpperLeft)] + [InlineData(0x1000069Du, UiResizeGrip.Border.UpperRight)] + [InlineData(0x1000069Fu, UiResizeGrip.Border.LowerLeft)] + [InlineData(0x100006A1u, UiResizeGrip.Border.LowerRight)] + public void MountedChatWindow_CornerGrip_ImportsWithCorrectBorderLocation( + uint elementId, UiResizeGrip.Border expected) + { + // Campaign CH slice CH6a, user-gate round 2 item 6: pins that the 4 + // corner grips from 0x2100006F import with the RIGHT BorderLocation — + // the prerequisite for the reported "no diagonal cursor" / "can't grow + // in Y from the bottom-right corner" symptoms to be fixed at all. + var layout = FixtureLoader.LoadChat(); + var grip = Assert.IsType(layout.FindElement(elementId)); + Assert.Equal(expected, grip.BorderLocation); + } + + [Fact] + public void MountedChatWindow_TopStrip_IsAMoveHandleNotAGrip() + { + // 0x1000069C (the plain top edge, between the two top corners) is a + // Type-2 Dragbar in the real DAT, not a Resizebar — retail's main chat + // window has no title bar, so the top strip moves the window while its + // two corners (above) resize it. + var layout = FixtureLoader.LoadChat(); + var topStrip = layout.FindElement(0x1000069Cu); + Assert.NotNull(topStrip); + Assert.IsNotType(topStrip); + Assert.True(topStrip!.WindowMoveHandle); + } + + [Fact] + public void MountedChatWindow_BottomRightGrip_GrowsBothAxes_NotOnlyShrinks() + { + // The literal user-gate round 2 report: "the window cannot grow in the + // Y axis when dragging from the bottom-right corner." Exercises the + // FULL production path (ChatWindowController.Bind + RetailWindowFrame.Mount + // with the real Chrome=Imported options and the real DAT min/max + // constraints from 0x2100006F, minH=100/maxH=2000/minW=300/maxW=2000) + // rather than just the pure ResizeRect math. + var infos = FixtureLoader.LoadChatInfos(); + var layout = LayoutImporter.Build(infos, NoTex, null); + var controller = ChatWindowController.Bind( + infos, + layout, + new ChatVM(new ChatLog()), + () => NullCommandBus.Instance, + null, + null, + NoTex)!; + var root = new UiRoot { Width = 1600, Height = 1200 }; + RetailWindowHandle handle = RetailWindowFrame.Mount( + root, + controller.Root, + NoTex, + new RetailWindowFrame.Options + { + WindowName = WindowNames.Chat, + Chrome = RetailWindowChrome.Imported, + Left = 10f, + Top = 440f, + DatConstraintSource = controller.DatWindowInfo, + }); + controller.AttachWindow(handle); + + var brGrip = Assert.IsType(layout.FindElement(0x100006A1u)); + Assert.Equal(UiResizeGrip.Border.LowerRight, brGrip.BorderLocation); + + var gs = brGrip.ScreenPosition; + int pressX = (int)(gs.X + 2), pressY = (int)(gs.Y + 2); + + // Shrink first (this direction was never in question per the report). + // Height is already AT the DAT's authored minimum (minH=100 == the + // authored 100px height), so it clamps rather than shrinking further — + // width has headroom (minW=300 < 410) and does shrink. + root.OnMouseDown(UiMouseButton.Left, pressX, pressY); + root.OnMouseMove(pressX - 20, pressY - 20); + root.OnMouseUp(UiMouseButton.Left, pressX - 20, pressY - 20); + Assert.Equal(390f, handle.Width); + Assert.Equal(100f, handle.Height); + + // Now grow from the shrunken state — this is the reported-broken direction. + var brGripAfterShrink = Assert.IsType(layout.FindElement(0x100006A1u)); + var gs2 = brGripAfterShrink.ScreenPosition; + int pressX2 = (int)(gs2.X + 2), pressY2 = (int)(gs2.Y + 2); + root.OnMouseDown(UiMouseButton.Left, pressX2, pressY2); + root.OnMouseMove(pressX2 + 70, pressY2 + 70); + root.OnMouseUp(UiMouseButton.Left, pressX2 + 70, pressY2 + 70); + + Assert.Equal(460f, handle.Width); + Assert.Equal(170f, handle.Height); + } + [Fact] public void MountedChatScrollbar_ButtonsAndThumbDragDriveTranscriptModel() { @@ -216,14 +407,10 @@ public class ChatLayoutConformanceTests new RetailWindowFrame.Options { WindowName = WindowNames.Chat, - Chrome = RetailWindowChrome.NineSlice, + Chrome = RetailWindowChrome.Imported, Left = 10f, Top = 440f, - ContentWidth = 490f, - ContentHeight = controller.Root.Height, - RebaseContentLayout = true, DatConstraintSource = controller.DatWindowInfo, - MinWidth = 200f, }); controller.AttachWindow(handle); diff --git a/tests/AcDream.App.Tests/UI/Layout/ChatLayoutFixtureGenerator.cs b/tests/AcDream.App.Tests/UI/Layout/ChatLayoutFixtureGenerator.cs index cdc89c5f..e21fd06d 100644 --- a/tests/AcDream.App.Tests/UI/Layout/ChatLayoutFixtureGenerator.cs +++ b/tests/AcDream.App.Tests/UI/Layout/ChatLayoutFixtureGenerator.cs @@ -11,7 +11,18 @@ namespace AcDream.App.Tests.UI.Layout; /// /// One-off generator for the committed chat golden fixture. Skipped by default — /// run manually with the real dats present (set ACDREAM_DAT_DIR) to regenerate -/// chat_21000006.json, then commit it. Mirrors how vitals_2100006C.json was made. +/// chat_2100006f.json, then commit it. Mirrors how vitals_2100006C.json was made. +/// +/// +/// Campaign CH slice CH6a swapped the imported main-chat LayoutDesc from the +/// wrong 0x21000006 (a different, unrelated chat layout whose root +/// 0x1000000E and 800px resize bar 0x1000000F appear nowhere in +/// the EoR gameplay UI) to retail's actual main chat window, +/// 0x2100006F (window element 0x10000601, layout root +/// 0x10000600, authored 410x100 — see +/// docs/research/2026-08-09-chat-retail-window-shell.md §2.1 and §5). The old +/// chat_21000006.json fixture is retired with it. +/// /// public class ChatLayoutFixtureGenerator { @@ -22,7 +33,7 @@ public class ChatLayoutFixtureGenerator ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Documents", "Asheron's Call"); using var dats = new DatCollection(datDir, DatAccessType.Read); - var info = LayoutImporter.ImportInfos(dats, 0x21000006u); + var info = LayoutImporter.ImportInfos(dats, 0x2100006Fu); Assert.NotNull(info); var json = JsonSerializer.Serialize(info, new JsonSerializerOptions @@ -35,5 +46,5 @@ public class ChatLayoutFixtureGenerator // Resolve the SOURCE fixtures dir (not bin/) from this file's compile-time path. private static string FixturePath([CallerFilePath] string thisFile = "") - => Path.Combine(Path.GetDirectoryName(thisFile)!, "fixtures", "chat_21000006.json"); + => Path.Combine(Path.GetDirectoryName(thisFile)!, "fixtures", "chat_2100006f.json"); } diff --git a/tests/AcDream.App.Tests/UI/Layout/ChatWindowControllerTests.cs b/tests/AcDream.App.Tests/UI/Layout/ChatWindowControllerTests.cs index ac0d6ecd..54d38a73 100644 --- a/tests/AcDream.App.Tests/UI/Layout/ChatWindowControllerTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/ChatWindowControllerTests.cs @@ -35,7 +35,7 @@ public class ChatWindowControllerTests /// /// Build a minimal synthetic ElementInfo tree that mirrors the real chat - /// layout (0x21000006) with enough fidelity for Bind to succeed: + /// layout (0x2100006F) with enough fidelity for Bind to succeed: /// root (Type-3) /// transcriptPanel (Type-3) [0x10000010] /// transcript (Type-12, no media) [0x10000011] ← built as UiText by factory; Bind binds in place @@ -111,7 +111,7 @@ public class ChatWindowControllerTests var root = new ElementInfo { - Id = 0x1000000Eu, Type = 3, Width = 490, Height = 100, + Id = 0x10000600u, Type = 3, Width = 490, Height = 100, }; root.Children.Add(transcriptPanel); root.Children.Add(inputBar); @@ -299,7 +299,7 @@ public class ChatWindowControllerTests public void Bind_Returns_Null_WhenTranscriptPanelMissing() { // Build a layout that is missing the transcript panel entirely. - var root = new ElementInfo { Id = 0x1000000Eu, Type = 3, Width = 490, Height = 100 }; + var root = new ElementInfo { Id = 0x10000600u, Type = 3, Width = 490, Height = 100 }; // No children → TranscriptPanelId and InputBarId are absent from the widget tree. var layout = LayoutImporter.Build(root, NoTex, null); diff --git a/tests/AcDream.App.Tests/UI/Layout/DatWidgetFactoryTests.cs b/tests/AcDream.App.Tests/UI/Layout/DatWidgetFactoryTests.cs index 602352fd..f84d042a 100644 --- a/tests/AcDream.App.Tests/UI/Layout/DatWidgetFactoryTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/DatWidgetFactoryTests.cs @@ -50,6 +50,91 @@ public class DatWidgetFactoryTests Assert.False(e.ClickThrough); } + // ── Type 9 → UiResizeGrip (retail UIElement_Resizebar) ─────────────────── + // Campaign CH slice CH6a: LayoutDesc 0x2100006F's main chat window authors + // 7 live Type-9 grips (corners + 3 straight edges — the top edge is a + // separate Type-2 Dragbar move handle, not a grip) via property bools + // 0x2A=bottom/0x2B=left/0x2C=right/0x2D=top. Real element ids + their + // decoded bools, confirmed against the installed DAT: + // 0x1000069B (TL) bottom=F left=T right=F top=T -> UpperLeft + // 0x1000069D (TR) bottom=F left=F right=T top=T -> UpperRight + // 0x1000069E (L) bottom=F left=T right=F top=F -> Left + // 0x1000069F (BL) bottom=T left=T right=F top=F -> LowerLeft + // 0x100006A0 (B) bottom=T left=F right=F top=F -> Bottom + // 0x100006A1 (BR) bottom=T left=F right=T top=F -> LowerRight + // 0x100006A2 (R) bottom=F left=F right=T top=F -> Right + + [Fact] + public void Type9_Resizebar_NoBoolsSet_DecodesToNoneEdges() + { + var e = DatWidgetFactory.Create(GripInfo(), NoTex, null); + var grip = Assert.IsType(e); + Assert.Equal(UiResizeGrip.Border.None, grip.BorderLocation); + Assert.Equal(ResizeEdges.None, grip.Edges); + } + + [Theory] + // (bottom, left, right, top) -> (Border, Edges) — the 8 authored grip shapes + // (edges set exactly one bool; corners set exactly two adjacent bools). + [InlineData(false, false, false, true, UiResizeGrip.Border.Top, ResizeEdges.Top)] + [InlineData(true, false, false, false, UiResizeGrip.Border.Bottom, ResizeEdges.Bottom)] + [InlineData(false, true, false, false, UiResizeGrip.Border.Left, ResizeEdges.Left)] + [InlineData(false, false, true, false, UiResizeGrip.Border.Right, ResizeEdges.Right)] + [InlineData(false, true, false, true, UiResizeGrip.Border.UpperLeft, ResizeEdges.Left | ResizeEdges.Top)] + [InlineData(false, false, true, true, UiResizeGrip.Border.UpperRight, ResizeEdges.Right | ResizeEdges.Top)] + [InlineData(true, true, false, false, UiResizeGrip.Border.LowerLeft, ResizeEdges.Left | ResizeEdges.Bottom)] + [InlineData(true, false, true, false, UiResizeGrip.Border.LowerRight, ResizeEdges.Right | ResizeEdges.Bottom)] + public void Type9_Resizebar_DecodesEachOfTheEightAuthoredGrips( + bool bottom, bool left, bool right, bool top, + UiResizeGrip.Border expectedBorder, ResizeEdges expectedEdges) + { + var e = DatWidgetFactory.Create(GripInfo(bottom, left, right, top), NoTex, null); + var grip = Assert.IsType(e); + Assert.Equal(expectedBorder, grip.BorderLocation); + Assert.Equal(expectedEdges, grip.Edges); + } + + [Fact] + public void Type9_Resizebar_IsNotClickThrough_SoItCanCaptureTheResizeDrag() + { + // A grip is a precise hit region — it must NOT default to UiDatElement's + // decoration ClickThrough=true, or UiRoot's hit-test would skip straight + // past it to whatever's behind. + var e = DatWidgetFactory.Create(GripInfo(bottom: true), NoTex, null); + var grip = Assert.IsType(e); + Assert.False(grip.ClickThrough); + } + + [Fact] + public void DecodeBorderLocation_MatchesRetailBranchOrder_RightBeatsLeftBeatsTopBeatsBottom() + { + // UIElement_Resizebar::StartMouseResizing @0x0046B7E0's if/else-if chain — + // retail's authored data never sets more than 2 bools, but the branch + // ORDER is still part of the port: right wins over left, and within a + // branch top wins over bottom. + Assert.Equal( + UiResizeGrip.Border.UpperRight, + UiResizeGrip.DecodeBorderLocation(bottom: true, left: true, right: true, top: true)); + Assert.Equal( + UiResizeGrip.Border.UpperLeft, + UiResizeGrip.DecodeBorderLocation(bottom: true, left: true, right: false, top: true)); + Assert.Equal( + UiResizeGrip.Border.Top, + UiResizeGrip.DecodeBorderLocation(bottom: true, left: false, right: false, top: true)); + } + + private static ElementInfo GripInfo(bool bottom = false, bool left = false, bool right = false, bool top = false) + { + var info = new ElementInfo { Id = 0x1000069Bu, Type = 9, Width = 5, Height = 5 }; + var state = new UiStateInfo { Id = UiStateInfo.DirectStateId }; + if (bottom) state.Properties.Values[0x2Au] = Bool(true); + if (left) state.Properties.Values[0x2Bu] = Bool(true); + if (right) state.Properties.Values[0x2Cu] = Bool(true); + if (top) state.Properties.Values[0x2Du] = Bool(true); + info.States[UiStateInfo.DirectStateId] = state; + return info; + } + // ── Test 3: Type 12 → UiText (behavioral text widget) ──────────────────── [Fact] diff --git a/tests/AcDream.App.Tests/UI/Layout/FixtureLoader.cs b/tests/AcDream.App.Tests/UI/Layout/FixtureLoader.cs index ca4f941a..c5433491 100644 --- a/tests/AcDream.App.Tests/UI/Layout/FixtureLoader.cs +++ b/tests/AcDream.App.Tests/UI/Layout/FixtureLoader.cs @@ -40,22 +40,25 @@ public static class FixtureLoader => LoadInfos("vitals_2100006C.json"); /// - /// Deserializes the committed chat_21000006.json fixture into a raw - /// tree and builds the - /// using a null-returning sprite resolver and no dat font — sufficient for - /// conformance checks on tree structure and resolved types. + /// Deserializes the committed chat_2100006f.json fixture (retail's + /// ACTUAL main chat window, LayoutDesc 0x2100006F — Campaign CH slice + /// CH6a; the old chat_21000006.json fixture imported the WRONG, + /// unrelated layout) into a raw tree and builds the + /// using a null-returning sprite resolver and no + /// dat font — sufficient for conformance checks on tree structure and + /// resolved types. /// public static ImportedLayout LoadChat() => LayoutImporter.Build(LoadChatInfos(), _ => (0u, 0, 0), null); /// - /// Deserializes the committed chat_21000006.json fixture into a raw + /// Deserializes the committed chat_2100006f.json fixture into a raw /// tree WITHOUT calling . /// Use this when the test needs to inspect the resolved /// tree directly (e.g. resolved Type values per element id). /// public static AcDream.App.UI.Layout.ElementInfo LoadChatInfos() - => LoadInfos("chat_21000006.json"); + => LoadInfos("chat_2100006f.json"); /// Builds the committed retail radar LayoutDesc 0x21000074 fixture. public static ImportedLayout LoadRadar() diff --git a/tests/AcDream.App.Tests/UI/Layout/RetailLayoutFixtureGenerator.cs b/tests/AcDream.App.Tests/UI/Layout/RetailLayoutFixtureGenerator.cs index 28eb74de..14a4b02e 100644 --- a/tests/AcDream.App.Tests/UI/Layout/RetailLayoutFixtureGenerator.cs +++ b/tests/AcDream.App.Tests/UI/Layout/RetailLayoutFixtureGenerator.cs @@ -16,7 +16,7 @@ public sealed class RetailLayoutFixtureGenerator { private static readonly (uint Id, string FileName)[] Layouts = { - (0x21000006u, "chat_21000006.json"), + (ChatWindowController.LayoutId, "chat_2100006f.json"), (0x21000016u, "toolbar_21000016.json"), (0x2100001Du, "link_status_2100001D.json"), (0x21000020u, "vitae_21000020.json"), diff --git a/tests/AcDream.App.Tests/UI/Layout/fixtures/chat_21000006.json b/tests/AcDream.App.Tests/UI/Layout/fixtures/chat_2100006f.json similarity index 54% rename from tests/AcDream.App.Tests/UI/Layout/fixtures/chat_21000006.json rename to tests/AcDream.App.Tests/UI/Layout/fixtures/chat_2100006f.json index 260fe152..d0b4076b 100644 --- a/tests/AcDream.App.Tests/UI/Layout/fixtures/chat_21000006.json +++ b/tests/AcDream.App.Tests/UI/Layout/fixtures/chat_2100006f.json @@ -1,20 +1,200 @@ { - "Id": 0, - "Type": 3, + "Id": 268436992, + "Type": 268435536, "X": 0, "Y": 0, - "Width": 800, - "Height": 600, + "Width": 410, + "Height": 100, "OriginalParentWidth": 0, "OriginalParentHeight": 0, "HasOriginalParentSize": false, - "Left": 0, - "Top": 0, - "Right": 0, - "Bottom": 0, + "Left": 1, + "Top": 1, + "Right": 1, + "Bottom": 1, "ReadOrder": 0, - "ZLevel": 0, - "States": {}, + "ZLevel": 600, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": true, + "IncorporationFlags": 63, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "60": { + "Kind": 4, + "MasterPropertyId": 60, + "UnsignedValue": 0, + "IntegerValue": 2000, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "61": { + "Kind": 4, + "MasterPropertyId": 61, + "UnsignedValue": 0, + "IntegerValue": 2000, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "62": { + "Kind": 4, + "MasterPropertyId": 62, + "UnsignedValue": 0, + "IntegerValue": 100, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "63": { + "Kind": 4, + "MasterPropertyId": 63, + "UnsignedValue": 0, + "IntegerValue": 300, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "65": { + "Kind": 1, + "MasterPropertyId": 65, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + }, + "268435462": { + "Id": 268435462, + "Name": "HideDetail", + "PassToChildren": true, + "IncorporationFlags": 1, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "268435463": { + "Id": 268435463, + "Name": "ShowDetail", + "PassToChildren": true, + "IncorporationFlags": 1, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, "DefaultStateId": 0, "FontDid": 0, "HJustify": 1, @@ -25,195 +205,20 @@ "DefaultStateName": "", "Children": [ { - "Id": 268435484, - "Type": 3, - "X": 0, - "Y": 0, - "Width": 382, - "Height": 104, - "OriginalParentWidth": 800, - "OriginalParentHeight": 600, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 2, - "Right": 2, - "Bottom": 1, - "ReadOrder": 1, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": { - "File": 100667980, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "": { - "Item1": 100667980, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [ - { - "Id": 268435485, - "Type": 5, - "X": 0, - "Y": 2, - "Width": 382, - "Height": 102, - "OriginalParentWidth": 382, - "OriginalParentHeight": 104, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 1, - "Bottom": 1, - "ReadOrder": 1, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "89": { - "Kind": 1, - "MasterPropertyId": 89, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "92": { - "Kind": 1, - "MasterPropertyId": 92, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "95": { - "Kind": 4, - "MasterPropertyId": 95, - "UnsignedValue": 0, - "IntegerValue": 2, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": {}, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [] - } - ] - }, - { - "Id": 268436774, + "Id": 268436772, "Type": 1, - "X": 2, - "Y": 0, + "X": 5, + "Y": 39, "Width": 16, "Height": 16, - "OriginalParentWidth": 800, - "OriginalParentHeight": 600, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, "HasOriginalParentSize": true, "Left": 1, "Top": 1, "Right": 2, "Bottom": 2, - "ReadOrder": 3, + "ReadOrder": 21, "ZLevel": 0, "States": { "4294967295": { @@ -487,6 +492,64 @@ }, "ArrayValue": [], "StructValue": {} + }, + "23": { + "Kind": 5, + "MasterPropertyId": 23, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 120143948, + "TableId": 587202561, + "Override": 0, + "English": 1, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "18": { + "Kind": 0, + "MasterPropertyId": 18, + "UnsignedValue": 268435734, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} } } } @@ -556,21 +619,98 @@ "Children": [] }, { - "Id": 268435486, - "Type": 12, - "X": 0, + "Id": 268437140, + "Type": 3, + "X": 5, "Y": 0, - "Width": 191, - "Height": 17, - "OriginalParentWidth": 800, - "OriginalParentHeight": 600, + "Width": 400, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, "HasOriginalParentSize": true, - "Left": 0, - "Top": 0, - "Right": 0, - "Bottom": 0, + "Left": 1, + "Top": 1, + "Right": 1, + "Bottom": 2, "ReadOrder": 2, "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100693183, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": { + "59": { + "Kind": 1, + "MasterPropertyId": 59, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100693183, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268436773, + "Type": 1, + "X": 5, + "Y": 56, + "Width": 16, + "Height": 16, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 2, + "Bottom": 2, + "ReadOrder": 22, + "ZLevel": 0, "States": { "4294967295": { "Id": 4294967295, @@ -585,7 +725,7 @@ "Kind": 4, "MasterPropertyId": 35, "UnsignedValue": 0, - "IntegerValue": 20, + "IntegerValue": 0, "FloatValue": 0, "BoolValue": false, "StringInfoValue": { @@ -640,7 +780,7 @@ { "Kind": 2, "MasterPropertyId": 24, - "UnsignedValue": 1073741825, + "UnsignedValue": 1073741861, "IntegerValue": 0, "FloatValue": 0, "BoolValue": false, @@ -760,7 +900,7 @@ "20": { "Kind": 0, "MasterPropertyId": 20, - "UnsignedValue": 2, + "UnsignedValue": 1, "IntegerValue": 0, "FloatValue": 0, "BoolValue": false, @@ -815,16 +955,45 @@ "ArrayValue": [], "StructValue": {} }, - "199": { + "11": { + "Kind": 1, + "MasterPropertyId": 11, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "23": { "Kind": 5, - "MasterPropertyId": 199, + "MasterPropertyId": 23, "UnsignedValue": 0, "IntegerValue": 0, "FloatValue": 0, "BoolValue": false, "StringInfoValue": { "Token": 0, - "StringId": 58579907, + "StringId": 133775436, "TableId": 587202561, "Override": 0, "English": 1, @@ -844,39 +1013,10 @@ "ArrayValue": [], "StructValue": {} }, - "36": { - "Kind": 4, - "MasterPropertyId": 36, - "UnsignedValue": 0, - "IntegerValue": 5, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "71": { + "18": { "Kind": 0, - "MasterPropertyId": 71, - "UnsignedValue": 268436373, + "MasterPropertyId": 18, + "UnsignedValue": 268435735, "IntegerValue": 0, "FloatValue": 0, "BoolValue": false, @@ -901,169 +1041,19 @@ }, "ArrayValue": [], "StructValue": {} - }, - "72": { - "Kind": 2, - "MasterPropertyId": 72, - "UnsignedValue": 553648193, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "32": { - "Kind": 1, - "MasterPropertyId": 32, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "208": { - "Kind": 1, - "MasterPropertyId": 208, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} } } } }, - "13": { - "Id": 13, - "Name": "Ghosted", + "3": { + "Id": 3, + "Name": "Normal_pressed", "PassToChildren": false, "IncorporationFlags": 0, - "Image": { - "File": 100667982, - "DrawMode": 1 - }, + "Image": null, "Cursor": null, "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 153, - "Green": 153, - "Red": 153, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } + "Values": {} } }, "1": { @@ -1072,7 +1062,7 @@ "PassToChildren": false, "IncorporationFlags": 0, "Image": { - "File": 100667982, + "File": 100688408, "DrawMode": 1 }, "Cursor": null, @@ -1080,13 +1070,13 @@ "Values": {} } }, - "268435457": { - "Id": 268435457, - "Name": "Talkfocus_highlight", + "6": { + "Id": 6, + "Name": "Highlight", "PassToChildren": false, "IncorporationFlags": 0, "Image": { - "File": 100667981, + "File": 100688409, "DrawMode": 1 }, "Cursor": null, @@ -1095,9 +1085,9 @@ } } }, - "DefaultStateId": 0, - "FontDid": 1073741825, - "HJustify": 0, + "DefaultStateId": 1, + "FontDid": 1073741861, + "HJustify": 1, "VJustify": 1, "FontColor": { "X": 1, @@ -1107,46 +1097,42 @@ }, "StateMedia": { "Normal": { - "Item1": 100667982, + "Item1": 100688408, "Item2": 1 }, - "Ghosted": { - "Item1": 100667982, - "Item2": 1 - }, - "Talkfocus_highlight": { - "Item1": 100667981, + "Highlight": { + "Item1": 100688409, "Item2": 1 } }, "StateCursors": {}, - "DefaultStateName": "", + "DefaultStateName": "Normal", "Children": [] }, { - "Id": 268435470, - "Type": 268435521, - "X": 0, + "Id": 268437141, + "Type": 3, + "X": 405, "Y": 0, - "Width": 800, - "Height": 100, - "OriginalParentWidth": 800, - "OriginalParentHeight": 600, + "Width": 5, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, "HasOriginalParentSize": true, - "Left": 1, - "Top": 2, + "Left": 2, + "Top": 1, "Right": 1, - "Bottom": 1, - "ReadOrder": 0, - "ZLevel": 900, + "Bottom": 2, + "ReadOrder": 3, + "ZLevel": 0, "States": { "4294967295": { "Id": 4294967295, "Name": "", "PassToChildren": false, - "IncorporationFlags": 62, + "IncorporationFlags": 30, "Image": { - "File": 100667725, + "File": 100693188, "DrawMode": 1 }, "Cursor": null, @@ -1180,180 +1166,6 @@ }, "ArrayValue": [], "StructValue": {} - }, - "82": { - "Kind": 0, - "MasterPropertyId": 82, - "UnsignedValue": 2, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "60": { - "Kind": 4, - "MasterPropertyId": 60, - "UnsignedValue": 0, - "IntegerValue": 360, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "84": { - "Kind": 4, - "MasterPropertyId": 84, - "UnsignedValue": 0, - "IntegerValue": -500, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "62": { - "Kind": 4, - "MasterPropertyId": 62, - "UnsignedValue": 0, - "IntegerValue": 100, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "85": { - "Kind": 4, - "MasterPropertyId": 85, - "UnsignedValue": 0, - "IntegerValue": 472, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "65": { - "Kind": 1, - "MasterPropertyId": 65, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} } } } @@ -1366,7 +1178,910 @@ "FontColor": null, "StateMedia": { "": { - "Item1": 100667725, + "Item1": 100693188, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437142, + "Type": 3, + "X": 0, + "Y": 5, + "Width": 5, + "Height": 90, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 2, + "Bottom": 1, + "ReadOrder": 4, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100693184, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": { + "59": { + "Kind": 1, + "MasterPropertyId": 59, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100693184, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268436591, + "Type": 1, + "X": 368, + "Y": 5, + "Width": 16, + "Height": 16, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 2, + "Top": 1, + "Right": 1, + "Bottom": 2, + "ReadOrder": 18, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "268435527": { + "Id": 268435527, + "Name": "Maximized", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100687460, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "268435528": { + "Id": 268435528, + "Name": "Minimized", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100687461, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 268435528, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "Maximized": { + "Item1": 100687460, + "Item2": 1 + }, + "Minimized": { + "Item1": 100687461, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "Minimized", + "Children": [] + }, + { + "Id": 268437143, + "Type": 3, + "X": 0, + "Y": 95, + "Width": 5, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 2, + "Right": 2, + "Bottom": 1, + "ReadOrder": 5, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100693189, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": { + "59": { + "Kind": 1, + "MasterPropertyId": 59, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100693189, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437144, + "Type": 3, + "X": 5, + "Y": 95, + "Width": 400, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 2, + "Right": 1, + "Bottom": 1, + "ReadOrder": 6, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100693185, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": { + "59": { + "Kind": 1, + "MasterPropertyId": 59, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100693185, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437145, + "Type": 3, + "X": 405, + "Y": 95, + "Width": 5, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 2, + "Top": 2, + "Right": 1, + "Bottom": 1, + "ReadOrder": 7, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100693190, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": { + "59": { + "Kind": 1, + "MasterPropertyId": 59, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100693190, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437146, + "Type": 3, + "X": 405, + "Y": 5, + "Width": 5, + "Height": 90, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 2, + "Top": 1, + "Right": 1, + "Bottom": 1, + "ReadOrder": 8, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100693186, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": { + "59": { + "Kind": 1, + "MasterPropertyId": 59, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100693186, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437147, + "Type": 9, + "X": 0, + "Y": 0, + "Width": 5, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 2, + "Bottom": 2, + "ReadOrder": 9, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100688169, + "DrawMode": 1 + }, + "Cursor": { + "File": 100688166, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + }, + "Properties": { + "Values": { + "45": { + "Kind": 1, + "MasterPropertyId": 45, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "43": { + "Kind": 1, + "MasterPropertyId": 43, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100688169, + "Item2": 1 + } + }, + "StateCursors": { + "": { + "File": 100688166, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + } + }, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437148, + "Type": 2, + "X": 5, + "Y": 0, + "Width": 400, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 1, + "Bottom": 2, + "ReadOrder": 10, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100688170, + "DrawMode": 1 + }, + "Cursor": { + "File": 100688153, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + }, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100688170, + "Item2": 1 + } + }, + "StateCursors": { + "": { + "File": 100688153, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + } + }, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437149, + "Type": 9, + "X": 405, + "Y": 0, + "Width": 5, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 2, + "Top": 1, + "Right": 1, + "Bottom": 2, + "ReadOrder": 11, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100688169, + "DrawMode": 1 + }, + "Cursor": { + "File": 100688167, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + }, + "Properties": { + "Values": { + "44": { + "Kind": 1, + "MasterPropertyId": 44, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "45": { + "Kind": 1, + "MasterPropertyId": 45, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100688169, + "Item2": 1 + } + }, + "StateCursors": { + "": { + "File": 100688167, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + } + }, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437150, + "Type": 9, + "X": 0, + "Y": 5, + "Width": 5, + "Height": 90, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 2, + "Bottom": 1, + "ReadOrder": 12, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100688171, + "DrawMode": 1 + }, + "Cursor": { + "File": 100688168, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + }, + "Properties": { + "Values": { + "43": { + "Kind": 1, + "MasterPropertyId": 43, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100688171, + "Item2": 1 + } + }, + "StateCursors": { + "": { + "File": 100688168, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + } + }, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268435472, + "Type": 3, + "X": 5, + "Y": 5, + "Width": 400, + "Height": 73, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 1, + "Bottom": 1, + "ReadOrder": 17, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100682946, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100682946, "Item2": 1 } }, @@ -1374,934 +2089,19 @@ "DefaultStateName": "", "Children": [ { - "Id": 268436772, - "Type": 1, - "X": 0, - "Y": 46, - "Width": 16, - "Height": 16, - "OriginalParentWidth": 800, - "OriginalParentHeight": 100, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 2, - "Bottom": 2, - "ReadOrder": 6, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "35": { - "Kind": 4, - "MasterPropertyId": 35, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "26": { - "Kind": 7, - "MasterPropertyId": 26, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 2, - "MasterPropertyId": 24, - "UnsignedValue": 1073741861, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "37": { - "Kind": 4, - "MasterPropertyId": 37, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "20": { - "Kind": 0, - "MasterPropertyId": 20, - "UnsignedValue": 1, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "21": { - "Kind": 0, - "MasterPropertyId": 21, - "UnsignedValue": 1, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "11": { - "Kind": 1, - "MasterPropertyId": 11, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "23": { - "Kind": 5, - "MasterPropertyId": 23, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 73861100, - "TableId": 587202561, - "Override": 0, - "English": 1, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "18": { - "Kind": 0, - "MasterPropertyId": 18, - "UnsignedValue": 268435734, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100688408, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "6": { - "Id": 6, - "Name": "Highlight", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100688409, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 1, - "FontDid": 1073741861, - "HJustify": 1, - "VJustify": 1, - "FontColor": { - "X": 1, - "Y": 1, - "Z": 1, - "W": 1 - }, - "StateMedia": { - "Normal": { - "Item1": 100688408, - "Item2": 1 - }, - "Highlight": { - "Item1": 100688409, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "Normal", - "Children": [] - }, - { - "Id": 268436773, - "Type": 1, - "X": 0, - "Y": 64, - "Width": 16, - "Height": 16, - "OriginalParentWidth": 800, - "OriginalParentHeight": 100, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 2, - "Bottom": 2, - "ReadOrder": 7, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "35": { - "Kind": 4, - "MasterPropertyId": 35, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "26": { - "Kind": 7, - "MasterPropertyId": 26, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 2, - "MasterPropertyId": 24, - "UnsignedValue": 1073741861, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "37": { - "Kind": 4, - "MasterPropertyId": 37, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "20": { - "Kind": 0, - "MasterPropertyId": 20, - "UnsignedValue": 1, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "21": { - "Kind": 0, - "MasterPropertyId": 21, - "UnsignedValue": 1, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "11": { - "Kind": 1, - "MasterPropertyId": 11, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "23": { - "Kind": 5, - "MasterPropertyId": 23, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 79103980, - "TableId": 587202561, - "Override": 0, - "English": 1, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "18": { - "Kind": 0, - "MasterPropertyId": 18, - "UnsignedValue": 268435735, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100688408, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "6": { - "Id": 6, - "Name": "Highlight", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100688409, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 1, - "FontDid": 1073741861, - "HJustify": 1, - "VJustify": 1, - "FontColor": { - "X": 1, - "Y": 1, - "Z": 1, - "W": 1 - }, - "StateMedia": { - "Normal": { - "Item1": 100688408, - "Item2": 1 - }, - "Highlight": { - "Item1": 100688409, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "Normal", - "Children": [] - }, - { - "Id": 268436591, - "Type": 1, - "X": 474, + "Id": 268435473, + "Type": 12, + "X": 16, "Y": 0, - "Width": 16, - "Height": 16, - "OriginalParentWidth": 800, - "OriginalParentHeight": 100, - "HasOriginalParentSize": true, - "Left": 2, - "Top": 1, - "Right": 1, - "Bottom": 2, - "ReadOrder": 3, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "268435527": { - "Id": 268435527, - "Name": "Maximized", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100687460, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "268435528": { - "Id": 268435528, - "Name": "Minimized", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100687461, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 268435528, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Maximized": { - "Item1": 100687460, - "Item2": 1 - }, - "Minimized": { - "Item1": 100687461, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "Minimized", - "Children": [] - }, - { - "Id": 268435471, - "Type": 9, - "X": 0, - "Y": 0, - "Width": 800, - "Height": 9, - "OriginalParentWidth": 800, - "OriginalParentHeight": 100, + "Width": 368, + "Height": 73, + "OriginalParentWidth": 400, + "OriginalParentHeight": 73, "HasOriginalParentSize": true, "Left": 1, "Top": 1, "Right": 1, - "Bottom": 2, + "Bottom": 1, "ReadOrder": 1, "ZLevel": 0, "States": { @@ -2310,21 +2110,394 @@ "Name": "", "PassToChildren": false, "IncorporationFlags": 30, - "Image": { - "File": 100667685, - "DrawMode": 1 - }, - "Cursor": { - "File": 100687462, - "HotspotX": 16, - "HotspotY": 16, - "IsValid": true - }, + "Image": null, + "Cursor": null, "Properties": { "Values": { - "45": { + "35": { + "Kind": 4, + "MasterPropertyId": 35, + "UnsignedValue": 0, + "IntegerValue": 2, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "26": { + "Kind": 7, + "MasterPropertyId": 26, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 2, + "MasterPropertyId": 24, + "UnsignedValue": 1073741824, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, + "37": { + "Kind": 4, + "MasterPropertyId": 37, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 204, + "Green": 204, + "Red": 204, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, + "28": { + "Kind": 7, + "MasterPropertyId": 28, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 2, + "MasterPropertyId": 24, + "UnsignedValue": 1073741824, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, + "29": { + "Kind": 7, + "MasterPropertyId": 29, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 178, + "Red": 0, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, + "20": { + "Kind": 0, + "MasterPropertyId": 20, + "UnsignedValue": 2, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "21": { + "Kind": 0, + "MasterPropertyId": 21, + "UnsignedValue": 4, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "36": { + "Kind": 4, + "MasterPropertyId": 36, + "UnsignedValue": 0, + "IntegerValue": 2, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "81": { "Kind": 1, - "MasterPropertyId": 45, + "MasterPropertyId": 81, "UnsignedValue": 0, "IntegerValue": 0, "FloatValue": 0, @@ -2350,2233 +2523,70 @@ }, "ArrayValue": [], "StructValue": {} - } - } - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "": { - "Item1": 100667685, - "Item2": 1 - } - }, - "StateCursors": { - "": { - "File": 100687462, - "HotspotX": 16, - "HotspotY": 16, - "IsValid": true - } - }, - "DefaultStateName": "", - "Children": [] - }, - { - "Id": 268435472, - "Type": 3, - "X": 0, - "Y": 9, - "Width": 490, - "Height": 74, - "OriginalParentWidth": 800, - "OriginalParentHeight": 100, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 1, - "Bottom": 1, - "ReadOrder": 2, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": { - "File": 100667669, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "": { - "Item1": 100667669, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [ - { - "Id": 268435473, - "Type": 12, - "X": 16, - "Y": 0, - "Width": 458, - "Height": 74, - "OriginalParentWidth": 490, - "OriginalParentHeight": 74, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 1, - "Bottom": 1, - "ReadOrder": 1, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "35": { - "Kind": 4, - "MasterPropertyId": 35, - "UnsignedValue": 0, - "IntegerValue": 2, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "26": { - "Kind": 7, - "MasterPropertyId": 26, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 2, - "MasterPropertyId": 24, - "UnsignedValue": 1073741824, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "37": { - "Kind": 4, - "MasterPropertyId": 37, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 204, - "Green": 204, - "Red": 204, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "28": { - "Kind": 7, - "MasterPropertyId": 28, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 2, - "MasterPropertyId": 24, - "UnsignedValue": 1073741824, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "29": { - "Kind": 7, - "MasterPropertyId": 29, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 178, - "Red": 0, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "20": { - "Kind": 0, - "MasterPropertyId": 20, - "UnsignedValue": 2, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "21": { - "Kind": 0, - "MasterPropertyId": 21, - "UnsignedValue": 4, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "36": { - "Kind": 4, - "MasterPropertyId": 36, - "UnsignedValue": 0, - "IntegerValue": 2, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "114": { - "Kind": 0, - "MasterPropertyId": 114, - "UnsignedValue": 268435474, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "39": { - "Kind": 1, - "MasterPropertyId": 39, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - }, - "2": { - "Id": 2, - "Name": "Normal_rollover", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 51, - "Green": 51, - "Red": 51, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - }, - "6": { - "Id": 6, - "Name": "Highlight", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - }, - "7": { - "Id": 7, - "Name": "Highlight_rollover", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - }, - "8": { - "Id": 8, - "Name": "Highlight_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 51, - "Green": 51, - "Red": 51, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - }, - "13": { - "Id": 13, - "Name": "Ghosted", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 51, - "Green": 51, - "Red": 51, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - } - }, - "DefaultStateId": 0, - "FontDid": 1073741824, - "HJustify": 0, - "VJustify": 2, - "FontColor": { - "X": 0.8, - "Y": 0.8, - "Z": 0.8, - "W": 1 - }, - "StateMedia": {}, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [ - { - "Id": 268436620, - "Type": 1, - "X": 0, - "Y": 58, - "Width": 16, - "Height": 16, - "OriginalParentWidth": 458, - "OriginalParentHeight": 74, - "HasOriginalParentSize": true, - "Left": 3, - "Top": 2, - "Right": 3, - "Bottom": 1, - "ReadOrder": 1, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100687630, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": { - "59": { - "Kind": 1, - "MasterPropertyId": 59, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100687630, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": { - "59": { - "Kind": 1, - "MasterPropertyId": 59, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - }, - "13": { - "Id": 13, - "Name": "Ghosted", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "59": { - "Kind": 1, - "MasterPropertyId": 59, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - } }, - "DefaultStateId": 13, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Normal": { - "Item1": 100687630, - "Item2": 1 + "114": { + "Kind": 0, + "MasterPropertyId": 114, + "UnsignedValue": 268435474, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 }, - "Normal_pressed": { - "Item1": 100687630, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "Ghosted", - "Children": [] - } - ] - }, - { - "Id": 268435474, - "Type": 11, - "X": 474, - "Y": 6, - "Width": 16, - "Height": 68, - "OriginalParentWidth": 490, - "OriginalParentHeight": 74, - "HasOriginalParentSize": true, - "Left": 2, - "Top": 1, - "Right": 1, - "Bottom": 1, - "ReadOrder": 2, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": { - "File": 100682847, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": { - "121": { - "Kind": 1, - "MasterPropertyId": 121, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "137": { - "Kind": 4, - "MasterPropertyId": 137, - "UnsignedValue": 0, - "IntegerValue": 16, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "130": { - "Kind": 1, - "MasterPropertyId": 130, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "119": { - "Kind": 0, - "MasterPropertyId": 119, - "UnsignedValue": 268435570, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "131": { - "Kind": 1, - "MasterPropertyId": 131, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "120": { - "Kind": 0, - "MasterPropertyId": 120, - "UnsignedValue": 268435569, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "": { - "Item1": 100682847, - "Item2": 3 - } - }, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [ - { - "Id": 1, - "Type": 1, - "X": 0, - "Y": 0, - "Width": 16, - "Height": 16, - "OriginalParentWidth": 16, - "OriginalParentHeight": 48, - "HasOriginalParentSize": true, - "Left": 0, - "Top": 0, - "Right": 0, - "Bottom": 0, - "ReadOrder": 1, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 56, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "19": { - "Kind": 1, - "MasterPropertyId": 19, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": true, - "IncorporationFlags": 1, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "2": { - "Id": 2, - "Name": "Normal_rollover", - "PassToChildren": true, - "IncorporationFlags": 1, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": true, - "IncorporationFlags": 1, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 1, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": {}, - "StateCursors": {}, - "DefaultStateName": "Normal", - "Children": [ - { - "Id": 268436324, - "Type": 3, + "VectorValue": { "X": 0, "Y": 0, - "Width": 16, - "Height": 3, - "OriginalParentWidth": 16, - "OriginalParentHeight": 16, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 1, - "Bottom": 2, - "ReadOrder": 1, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 62, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682848, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "2": { - "Id": 2, - "Name": "Normal_rollover", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682849, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682850, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Normal": { - "Item1": 100682848, - "Item2": 3 - }, - "Normal_rollover": { - "Item1": 100682849, - "Item2": 3 - }, - "Normal_pressed": { - "Item1": 100682850, - "Item2": 3 - } - }, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [] + "Z": 0 }, - { - "Id": 268436325, - "Type": 3, - "X": 0, - "Y": 3, - "Width": 16, - "Height": 10, - "OriginalParentWidth": 16, - "OriginalParentHeight": 16, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 1, - "Bottom": 1, - "ReadOrder": 2, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 62, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682851, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "2": { - "Id": 2, - "Name": "Normal_rollover", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682852, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682853, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Normal": { - "Item1": 100682851, - "Item2": 3 - }, - "Normal_rollover": { - "Item1": 100682852, - "Item2": 3 - }, - "Normal_pressed": { - "Item1": 100682853, - "Item2": 3 - } - }, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [] - }, - { - "Id": 268436326, - "Type": 3, - "X": 0, - "Y": 13, - "Width": 16, - "Height": 3, - "OriginalParentWidth": 16, - "OriginalParentHeight": 16, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 2, - "Right": 1, - "Bottom": 1, - "ReadOrder": 3, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 62, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682854, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "2": { - "Id": 2, - "Name": "Normal_rollover", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682855, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682856, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Normal": { - "Item1": 100682854, - "Item2": 3 - }, - "Normal_rollover": { - "Item1": 100682855, - "Item2": 3 - }, - "Normal_pressed": { - "Item1": 100682856, - "Item2": 3 - } - }, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [] - } - ] - }, - { - "Id": 268435569, - "Type": 1, - "X": 0, - "Y": 0, - "Width": 16, - "Height": 16, - "OriginalParentWidth": 16, - "OriginalParentHeight": 48, - "HasOriginalParentSize": true, - "Left": 2, - "Top": 1, - "Right": 1, - "Bottom": 2, - "ReadOrder": 2, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 62, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "15": { - "Kind": 1, - "MasterPropertyId": 15, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "16": { - "Kind": 3, - "MasterPropertyId": 16, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0.5, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "17": { - "Kind": 3, - "MasterPropertyId": 17, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0.1, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "19": { - "Kind": 1, - "MasterPropertyId": 19, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682859, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682857, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "2": { - "Id": 2, - "Name": "Normal_rollover", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682858, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } + "ArrayValue": [], + "StructValue": {} }, - "DefaultStateId": 1, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Normal": { - "Item1": 100682857, - "Item2": 1 - }, - "Normal_rollover": { - "Item1": 100682858, - "Item2": 1 - }, - "Normal_pressed": { - "Item1": 100682859, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "Normal", - "Children": [] - }, - { - "Id": 268435570, - "Type": 1, - "X": 0, - "Y": 32, - "Width": 16, - "Height": 16, - "OriginalParentWidth": 16, - "OriginalParentHeight": 48, - "HasOriginalParentSize": true, - "Left": 2, - "Top": 2, - "Right": 1, - "Bottom": 1, - "ReadOrder": 3, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 62, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "15": { - "Kind": 1, - "MasterPropertyId": 15, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "16": { - "Kind": 3, - "MasterPropertyId": 16, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0.5, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "17": { - "Kind": 3, - "MasterPropertyId": 17, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0.1, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "19": { - "Kind": 1, - "MasterPropertyId": 19, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682862, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682860, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "2": { - "Id": 2, - "Name": "Normal_rollover", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100682861, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 1, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Normal": { - "Item1": 100682860, - "Item2": 1 - }, - "Normal_rollover": { - "Item1": 100682861, - "Item2": 1 - }, - "Normal_pressed": { - "Item1": 100682862, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "Normal", - "Children": [] - } - ] - } - ] - }, - { - "Id": 268435475, - "Type": 3, - "X": 0, - "Y": 83, - "Width": 490, - "Height": 17, - "OriginalParentWidth": 800, - "OriginalParentHeight": 100, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 2, - "Right": 1, - "Bottom": 1, - "ReadOrder": 8, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": { - "File": 100667706, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": { - "84": { - "Kind": 4, - "MasterPropertyId": 84, + "39": { + "Kind": 1, + "MasterPropertyId": 39, "UnsignedValue": 0, - "IntegerValue": -46, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "205": { + "Kind": 0, + "MasterPropertyId": 205, + "UnsignedValue": 3, + "IntegerValue": 0, "FloatValue": 0, "BoolValue": false, "StringInfoValue": { @@ -4603,35 +2613,461 @@ } } } + }, + "2": { + "Id": 2, + "Name": "Normal_rollover", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 255, + "Green": 255, + "Red": 255, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 51, + "Green": 51, + "Red": 51, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } + }, + "6": { + "Id": 6, + "Name": "Highlight", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 255, + "Green": 255, + "Red": 255, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } + }, + "7": { + "Id": 7, + "Name": "Highlight_rollover", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 255, + "Green": 255, + "Red": 255, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } + }, + "8": { + "Id": 8, + "Name": "Highlight_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 51, + "Green": 51, + "Red": 51, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } + }, + "13": { + "Id": 13, + "Name": "Ghosted", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 51, + "Green": 51, + "Red": 51, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } } }, "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "": { - "Item1": 100667706, - "Item2": 1 - } + "FontDid": 1073741824, + "HJustify": 0, + "VJustify": 2, + "FontColor": { + "X": 0.8, + "Y": 0.8, + "Z": 0.8, + "W": 1 }, + "StateMedia": {}, "StateCursors": {}, "DefaultStateName": "", "Children": [ { - "Id": 268435476, - "Type": 6, + "Id": 268436620, + "Type": 1, "X": 0, - "Y": 0, - "Width": 46, - "Height": 17, - "OriginalParentWidth": 490, - "OriginalParentHeight": 17, + "Y": 57, + "Width": 16, + "Height": 16, + "OriginalParentWidth": 368, + "OriginalParentHeight": 73, "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 2, + "Left": 3, + "Top": 2, + "Right": 3, "Bottom": 1, "ReadOrder": 1, "ZLevel": 0, @@ -4643,40 +3079,25 @@ "IncorporationFlags": 30, "Image": null, "Cursor": null, + "Properties": { + "Values": {} + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100687630, + "DrawMode": 1 + }, + "Cursor": null, "Properties": { "Values": { - "2": { - "Kind": 0, - "MasterPropertyId": 2, - "UnsignedValue": 268435485, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "3": { + "59": { "Kind": 1, - "MasterPropertyId": 3, + "MasterPropertyId": 59, "UnsignedValue": 0, "IntegerValue": 0, "FloatValue": 0, @@ -4702,151 +3123,6 @@ }, "ArrayValue": [], "StructValue": {} - }, - "5": { - "Kind": 1, - "MasterPropertyId": 5, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "6": { - "Kind": 0, - "MasterPropertyId": 6, - "UnsignedValue": 268435484, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "7": { - "Kind": 2, - "MasterPropertyId": 7, - "UnsignedValue": 553648134, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "9": { - "Kind": 0, - "MasterPropertyId": 9, - "UnsignedValue": 268435486, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "10": { - "Kind": 2, - "MasterPropertyId": 10, - "UnsignedValue": 553648134, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} } } } @@ -4857,841 +3133,18 @@ "PassToChildren": false, "IncorporationFlags": 0, "Image": { - "File": 100683109, - "DrawMode": 3 + "File": 100687630, + "DrawMode": 1 }, "Cursor": null, - "Properties": { - "Values": {} - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100683110, - "DrawMode": 3 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 1, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Normal": { - "Item1": 100683109, - "Item2": 3 - }, - "Normal_pressed": { - "Item1": 100683110, - "Item2": 3 - } - }, - "StateCursors": {}, - "DefaultStateName": "Normal", - "Children": [ - { - "Id": 268435477, - "Type": 12, - "X": 0, - "Y": 0, - "Width": 46, - "Height": 17, - "OriginalParentWidth": 46, - "OriginalParentHeight": 17, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 1, - "Bottom": 1, - "ReadOrder": 1, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "35": { - "Kind": 4, - "MasterPropertyId": 35, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "26": { - "Kind": 7, - "MasterPropertyId": 26, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 2, - "MasterPropertyId": 24, - "UnsignedValue": 1073741826, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "37": { - "Kind": 4, - "MasterPropertyId": 37, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "20": { - "Kind": 0, - "MasterPropertyId": 20, - "UnsignedValue": 1, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "21": { - "Kind": 0, - "MasterPropertyId": 21, - "UnsignedValue": 1, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "23": { - "Kind": 5, - "MasterPropertyId": 23, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 179227509, - "TableId": 587202561, - "Override": 0, - "English": 1, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - }, - "13": { - "Id": 13, - "Name": "Ghosted", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 76, - "Green": 76, - "Red": 76, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - } - }, - "DefaultStateId": 0, - "FontDid": 1073741826, - "HJustify": 1, - "VJustify": 1, - "FontColor": { - "X": 1, - "Y": 1, - "Z": 1, - "W": 1 - }, - "StateMedia": {}, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [] - } - ] - }, - { - "Id": 268435478, - "Type": 12, - "X": 46, - "Y": 0, - "Width": 398, - "Height": 17, - "OriginalParentWidth": 490, - "OriginalParentHeight": 17, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 1, - "Bottom": 1, - "ReadOrder": 2, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": true, - "IncorporationFlags": 31, - "Image": null, - "Cursor": null, "Properties": { "Values": { - "35": { - "Kind": 4, - "MasterPropertyId": 35, - "UnsignedValue": 0, - "IntegerValue": 2, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "26": { - "Kind": 7, - "MasterPropertyId": 26, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 2, - "MasterPropertyId": 24, - "UnsignedValue": 1073741824, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "37": { - "Kind": 4, - "MasterPropertyId": 37, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "28": { - "Kind": 7, - "MasterPropertyId": 28, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 2, - "MasterPropertyId": 24, - "UnsignedValue": 1073741824, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "29": { - "Kind": 7, - "MasterPropertyId": 29, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 178, - "Red": 0, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - }, - "20": { - "Kind": 0, - "MasterPropertyId": 20, - "UnsignedValue": 2, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "21": { - "Kind": 0, - "MasterPropertyId": 21, - "UnsignedValue": 1, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "22": { + "59": { "Kind": 1, - "MasterPropertyId": 22, + "MasterPropertyId": 59, "UnsignedValue": 0, "IntegerValue": 0, "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "36": { - "Kind": 4, - "MasterPropertyId": 36, - "UnsignedValue": 0, - "IntegerValue": 2, - "FloatValue": 0, "BoolValue": false, "StringInfoValue": { "Token": 0, @@ -5714,448 +3167,6 @@ }, "ArrayValue": [], "StructValue": {} - }, - "39": { - "Kind": 1, - "MasterPropertyId": 39, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "30": { - "Kind": 4, - "MasterPropertyId": 30, - "UnsignedValue": 0, - "IntegerValue": 255, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, - "32": { - "Kind": 1, - "MasterPropertyId": 32, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - } - } - }, - "2": { - "Id": 2, - "Name": "Normal_rollover", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 51, - "Green": 51, - "Red": 51, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - }, - "6": { - "Id": 6, - "Name": "Highlight", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - }, - "7": { - "Id": 7, - "Name": "Highlight_rollover", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 255, - "Green": 255, - "Red": 255, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} - } - } - } - }, - "8": { - "Id": 8, - "Name": "Highlight_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": null, - "Cursor": null, - "Properties": { - "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 51, - "Green": 51, - "Red": 51, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], - "StructValue": {} } } } @@ -6169,12 +3180,727 @@ "Cursor": null, "Properties": { "Values": { - "27": { - "Kind": 7, - "MasterPropertyId": 27, + "59": { + "Kind": 1, + "MasterPropertyId": 59, "UnsignedValue": 0, "IntegerValue": 0, "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 13, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "Normal": { + "Item1": 100687630, + "Item2": 1 + }, + "Normal_pressed": { + "Item1": 100687630, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "Ghosted", + "Children": [] + } + ] + }, + { + "Id": 268435474, + "Type": 11, + "X": 384, + "Y": 0, + "Width": 16, + "Height": 73, + "OriginalParentWidth": 400, + "OriginalParentHeight": 73, + "HasOriginalParentSize": true, + "Left": 2, + "Top": 1, + "Right": 1, + "Bottom": 1, + "ReadOrder": 2, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100682847, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": { + "121": { + "Kind": 1, + "MasterPropertyId": 121, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "137": { + "Kind": 4, + "MasterPropertyId": 137, + "UnsignedValue": 0, + "IntegerValue": 16, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "130": { + "Kind": 1, + "MasterPropertyId": 130, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "119": { + "Kind": 0, + "MasterPropertyId": 119, + "UnsignedValue": 268435570, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "131": { + "Kind": 1, + "MasterPropertyId": 131, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "120": { + "Kind": 0, + "MasterPropertyId": 120, + "UnsignedValue": 268435569, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100682847, + "Item2": 3 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [ + { + "Id": 1, + "Type": 1, + "X": 0, + "Y": 0, + "Width": 16, + "Height": 16, + "OriginalParentWidth": 16, + "OriginalParentHeight": 48, + "HasOriginalParentSize": true, + "Left": 0, + "Top": 0, + "Right": 0, + "Bottom": 0, + "ReadOrder": 1, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 56, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "19": { + "Kind": 1, + "MasterPropertyId": 19, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + }, + "1": { + "Id": 1, + "Name": "Normal", + "PassToChildren": true, + "IncorporationFlags": 1, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "2": { + "Id": 2, + "Name": "Normal_rollover", + "PassToChildren": true, + "IncorporationFlags": 1, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": true, + "IncorporationFlags": 1, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 1, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": {}, + "StateCursors": {}, + "DefaultStateName": "Normal", + "Children": [ + { + "Id": 268436324, + "Type": 3, + "X": 0, + "Y": 0, + "Width": 16, + "Height": 3, + "OriginalParentWidth": 16, + "OriginalParentHeight": 16, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 1, + "Bottom": 2, + "ReadOrder": 1, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 62, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "1": { + "Id": 1, + "Name": "Normal", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682848, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "2": { + "Id": 2, + "Name": "Normal_rollover", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682849, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682850, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "Normal": { + "Item1": 100682848, + "Item2": 3 + }, + "Normal_rollover": { + "Item1": 100682849, + "Item2": 3 + }, + "Normal_pressed": { + "Item1": 100682850, + "Item2": 3 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268436325, + "Type": 3, + "X": 0, + "Y": 3, + "Width": 16, + "Height": 10, + "OriginalParentWidth": 16, + "OriginalParentHeight": 16, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 1, + "Bottom": 1, + "ReadOrder": 2, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 62, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "1": { + "Id": 1, + "Name": "Normal", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682851, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "2": { + "Id": 2, + "Name": "Normal_rollover", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682852, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682853, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "Normal": { + "Item1": 100682851, + "Item2": 3 + }, + "Normal_rollover": { + "Item1": 100682852, + "Item2": 3 + }, + "Normal_pressed": { + "Item1": 100682853, + "Item2": 3 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268436326, + "Type": 3, + "X": 0, + "Y": 13, + "Width": 16, + "Height": 3, + "OriginalParentWidth": 16, + "OriginalParentHeight": 16, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 2, + "Right": 1, + "Bottom": 1, + "ReadOrder": 3, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 62, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "1": { + "Id": 1, + "Name": "Normal", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682854, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "2": { + "Id": 2, + "Name": "Normal_rollover", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682855, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682856, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "Normal": { + "Item1": 100682854, + "Item2": 3 + }, + "Normal_rollover": { + "Item1": 100682855, + "Item2": 3 + }, + "Normal_pressed": { + "Item1": 100682856, + "Item2": 3 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + } + ] + }, + { + "Id": 268435569, + "Type": 1, + "X": 0, + "Y": 0, + "Width": 16, + "Height": 16, + "OriginalParentWidth": 16, + "OriginalParentHeight": 48, + "HasOriginalParentSize": true, + "Left": 2, + "Top": 1, + "Right": 1, + "Bottom": 2, + "ReadOrder": 2, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 62, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "15": { + "Kind": 1, + "MasterPropertyId": 15, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "16": { + "Kind": 3, + "MasterPropertyId": 16, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0.5, "BoolValue": false, "StringInfoValue": { "Token": 0, @@ -6195,49 +3921,105 @@ "Y": 0, "Z": 0 }, - "ArrayValue": [ - { - "Kind": 6, - "MasterPropertyId": 25, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 51, - "Green": 51, - "Red": 51, - "Alpha": 255 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - } - ], + "ArrayValue": [], + "StructValue": {} + }, + "17": { + "Kind": 3, + "MasterPropertyId": 17, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0.1, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "19": { + "Kind": 1, + "MasterPropertyId": 19, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], "StructValue": {} } } } }, - "4": { - "Id": 4, - "Name": "Normal_focussed", - "PassToChildren": true, - "IncorporationFlags": 1, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, "Image": { - "File": 100667819, + "File": 100682859, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "1": { + "Id": 1, + "Name": "Normal", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682857, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "2": { + "Id": 2, + "Name": "Normal_rollover", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682858, "DrawMode": 1 }, "Cursor": null, @@ -6246,159 +4028,940 @@ } } }, - "DefaultStateId": 0, - "FontDid": 1073741824, - "HJustify": 0, + "DefaultStateId": 1, + "FontDid": 0, + "HJustify": 1, "VJustify": 1, - "FontColor": { - "X": 1, - "Y": 1, - "Z": 1, - "W": 1 - }, + "FontColor": null, "StateMedia": { - "Normal_focussed": { - "Item1": 100667819, + "Normal": { + "Item1": 100682857, + "Item2": 1 + }, + "Normal_rollover": { + "Item1": 100682858, + "Item2": 1 + }, + "Normal_pressed": { + "Item1": 100682859, "Item2": 1 } }, "StateCursors": {}, - "DefaultStateName": "", - "Children": [ - { - "Id": 268435479, - "Type": 3, - "X": 0, - "Y": 0, - "Width": 1, - "Height": 17, - "OriginalParentWidth": 398, - "OriginalParentHeight": 17, - "HasOriginalParentSize": true, - "Left": 1, - "Top": 1, - "Right": 2, - "Bottom": 1, - "ReadOrder": 1, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "4": { - "Id": 4, - "Name": "Normal_focussed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100683111, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Normal_focussed": { - "Item1": 100683111, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [] - }, - { - "Id": 268435480, - "Type": 3, - "X": 397, - "Y": 0, - "Width": 1, - "Height": 17, - "OriginalParentWidth": 398, - "OriginalParentHeight": 17, - "HasOriginalParentSize": true, - "Left": 2, - "Top": 1, - "Right": 1, - "Bottom": 1, - "ReadOrder": 2, - "ZLevel": 0, - "States": { - "4294967295": { - "Id": 4294967295, - "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, - "Image": null, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "4": { - "Id": 4, - "Name": "Normal_focussed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100683111, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - } - }, - "DefaultStateId": 0, - "FontDid": 0, - "HJustify": 1, - "VJustify": 1, - "FontColor": null, - "StateMedia": { - "Normal_focussed": { - "Item1": 100683111, - "Item2": 1 - } - }, - "StateCursors": {}, - "DefaultStateName": "", - "Children": [] - } - ] + "DefaultStateName": "Normal", + "Children": [] }, { - "Id": 268435481, + "Id": 268435570, "Type": 1, - "X": 444, - "Y": 0, - "Width": 46, - "Height": 17, - "OriginalParentWidth": 490, - "OriginalParentHeight": 17, + "X": 0, + "Y": 32, + "Width": 16, + "Height": 16, + "OriginalParentWidth": 16, + "OriginalParentHeight": 48, "HasOriginalParentSize": true, "Left": 2, - "Top": 1, + "Top": 2, "Right": 1, "Bottom": 1, "ReadOrder": 3, "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 62, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "15": { + "Kind": 1, + "MasterPropertyId": 15, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "16": { + "Kind": 3, + "MasterPropertyId": 16, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0.5, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "17": { + "Kind": 3, + "MasterPropertyId": 17, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0.1, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "19": { + "Kind": 1, + "MasterPropertyId": 19, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682862, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "1": { + "Id": 1, + "Name": "Normal", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682860, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "2": { + "Id": 2, + "Name": "Normal_rollover", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100682861, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 1, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "Normal": { + "Item1": 100682860, + "Item2": 1 + }, + "Normal_rollover": { + "Item1": 100682861, + "Item2": 1 + }, + "Normal_pressed": { + "Item1": 100682862, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "Normal", + "Children": [] + } + ] + } + ] + }, + { + "Id": 268437151, + "Type": 9, + "X": 0, + "Y": 95, + "Width": 5, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 2, + "Right": 2, + "Bottom": 1, + "ReadOrder": 13, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100688169, + "DrawMode": 1 + }, + "Cursor": { + "File": 100688167, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + }, + "Properties": { + "Values": { + "42": { + "Kind": 1, + "MasterPropertyId": 42, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "43": { + "Kind": 1, + "MasterPropertyId": 43, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100688169, + "Item2": 1 + } + }, + "StateCursors": { + "": { + "File": 100688167, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + } + }, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437152, + "Type": 9, + "X": 5, + "Y": 95, + "Width": 400, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 2, + "Right": 1, + "Bottom": 1, + "ReadOrder": 14, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100688172, + "DrawMode": 1 + }, + "Cursor": { + "File": 100687462, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + }, + "Properties": { + "Values": { + "42": { + "Kind": 1, + "MasterPropertyId": 42, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100688172, + "Item2": 1 + } + }, + "StateCursors": { + "": { + "File": 100687462, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + } + }, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268437153, + "Type": 9, + "X": 405, + "Y": 95, + "Width": 5, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 2, + "Top": 2, + "Right": 1, + "Bottom": 1, + "ReadOrder": 15, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100688169, + "DrawMode": 1 + }, + "Cursor": { + "File": 100688166, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + }, + "Properties": { + "Values": { + "44": { + "Kind": 1, + "MasterPropertyId": 44, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "42": { + "Kind": 1, + "MasterPropertyId": 42, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100688169, + "Item2": 1 + } + }, + "StateCursors": { + "": { + "File": 100688166, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + } + }, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268435475, + "Type": 3, + "X": 5, + "Y": 78, + "Width": 400, + "Height": 17, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 2, + "Right": 1, + "Bottom": 1, + "ReadOrder": 23, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100667706, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": { + "84": { + "Kind": 4, + "MasterPropertyId": 84, + "UnsignedValue": 0, + "IntegerValue": -46, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100667706, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [ + { + "Id": 268435476, + "Type": 6, + "X": 0, + "Y": 0, + "Width": 46, + "Height": 17, + "OriginalParentWidth": 400, + "OriginalParentHeight": 17, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 2, + "Bottom": 1, + "ReadOrder": 1, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "2": { + "Kind": 0, + "MasterPropertyId": 2, + "UnsignedValue": 268435485, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "3": { + "Kind": 1, + "MasterPropertyId": 3, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "5": { + "Kind": 1, + "MasterPropertyId": 5, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "6": { + "Kind": 0, + "MasterPropertyId": 6, + "UnsignedValue": 268435484, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "7": { + "Kind": 2, + "MasterPropertyId": 7, + "UnsignedValue": 553648134, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "9": { + "Kind": 0, + "MasterPropertyId": 9, + "UnsignedValue": 268435486, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "10": { + "Kind": 2, + "MasterPropertyId": 10, + "UnsignedValue": 553648134, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + }, + "1": { + "Id": 1, + "Name": "Normal", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100683109, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100683110, + "DrawMode": 3 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 1, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "Normal": { + "Item1": 100683109, + "Item2": 3 + }, + "Normal_pressed": { + "Item1": 100683110, + "Item2": 3 + } + }, + "StateCursors": {}, + "DefaultStateName": "Normal", + "Children": [ + { + "Id": 268435477, + "Type": 12, + "X": 0, + "Y": 0, + "Width": 46, + "Height": 17, + "OriginalParentWidth": 46, + "OriginalParentHeight": 17, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 1, + "Bottom": 1, + "ReadOrder": 1, + "ZLevel": 0, "States": { "4294967295": { "Id": 4294967295, @@ -6652,7 +5215,7 @@ "BoolValue": false, "StringInfoValue": { "Token": 0, - "StringId": 79829758, + "StringId": 15429045, "TableId": 587202561, "Override": 0, "English": 1, @@ -6675,50 +5238,79 @@ } } }, - "3": { - "Id": 3, - "Name": "Normal_pressed", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100669718, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100669717, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} - } - }, "13": { "Id": 13, "Name": "Ghosted", "PassToChildren": false, "IncorporationFlags": 0, - "Image": { - "File": 100669748, - "DrawMode": 1 - }, + "Image": null, "Cursor": null, "Properties": { - "Values": {} + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 76, + "Green": 76, + "Red": 76, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } } } }, - "DefaultStateId": 1, + "DefaultStateId": 0, "FontDid": 1073741826, "HJustify": 1, "VJustify": 1, @@ -6728,48 +5320,35 @@ "Z": 1, "W": 1 }, - "StateMedia": { - "Normal": { - "Item1": 100669717, - "Item2": 1 - }, - "Normal_pressed": { - "Item1": 100669718, - "Item2": 1 - }, - "Ghosted": { - "Item1": 100669748, - "Item2": 1 - } - }, + "StateMedia": {}, "StateCursors": {}, - "DefaultStateName": "Normal", + "DefaultStateName": "", "Children": [] } ] }, { - "Id": 268436770, - "Type": 1, - "X": 0, - "Y": 10, - "Width": 16, - "Height": 16, - "OriginalParentWidth": 800, - "OriginalParentHeight": 100, + "Id": 268435478, + "Type": 12, + "X": 46, + "Y": 0, + "Width": 306, + "Height": 17, + "OriginalParentWidth": 400, + "OriginalParentHeight": 17, "HasOriginalParentSize": true, "Left": 1, "Top": 1, - "Right": 2, - "Bottom": 2, - "ReadOrder": 4, + "Right": 1, + "Bottom": 1, + "ReadOrder": 2, "ZLevel": 0, "States": { "4294967295": { "Id": 4294967295, "Name": "", - "PassToChildren": false, - "IncorporationFlags": 30, + "PassToChildren": true, + "IncorporationFlags": 31, "Image": null, "Cursor": null, "Properties": { @@ -6778,7 +5357,7 @@ "Kind": 4, "MasterPropertyId": 35, "UnsignedValue": 0, - "IntegerValue": 0, + "IntegerValue": 2, "FloatValue": 0, "BoolValue": false, "StringInfoValue": { @@ -6833,7 +5412,7 @@ { "Kind": 2, "MasterPropertyId": 24, - "UnsignedValue": 1073741861, + "UnsignedValue": 1073741824, "IntegerValue": 0, "FloatValue": 0, "BoolValue": false, @@ -6950,10 +5529,128 @@ ], "StructValue": {} }, + "28": { + "Kind": 7, + "MasterPropertyId": 28, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 2, + "MasterPropertyId": 24, + "UnsignedValue": 1073741824, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, + "29": { + "Kind": 7, + "MasterPropertyId": 29, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 178, + "Red": 0, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, "20": { "Kind": 0, "MasterPropertyId": 20, - "UnsignedValue": 1, + "UnsignedValue": 2, "IntegerValue": 0, "FloatValue": 0, "BoolValue": false, @@ -7008,9 +5705,9 @@ "ArrayValue": [], "StructValue": {} }, - "11": { + "22": { "Kind": 1, - "MasterPropertyId": 11, + "MasterPropertyId": 22, "UnsignedValue": 0, "IntegerValue": 0, "FloatValue": 0, @@ -7037,19 +5734,19 @@ "ArrayValue": [], "StructValue": {} }, - "23": { - "Kind": 5, - "MasterPropertyId": 23, + "36": { + "Kind": 4, + "MasterPropertyId": 36, "UnsignedValue": 0, - "IntegerValue": 0, + "IntegerValue": 2, "FloatValue": 0, "BoolValue": false, "StringInfoValue": { "Token": 0, - "StringId": 75958252, - "TableId": 587202561, + "StringId": 0, + "TableId": 0, "Override": 0, - "English": 1, + "English": 0, "Comment": 0 }, "ColorValue": { @@ -7066,12 +5763,41 @@ "ArrayValue": [], "StructValue": {} }, - "18": { - "Kind": 0, - "MasterPropertyId": 18, - "UnsignedValue": 268435732, + "39": { + "Kind": 1, + "MasterPropertyId": 39, + "UnsignedValue": 0, "IntegerValue": 0, "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "30": { + "Kind": 4, + "MasterPropertyId": 30, + "UnsignedValue": 0, + "IntegerValue": 255, + "FloatValue": 0, "BoolValue": false, "StringInfoValue": { "Token": 0, @@ -7094,6 +5820,106 @@ }, "ArrayValue": [], "StructValue": {} + }, + "32": { + "Kind": 1, + "MasterPropertyId": 32, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + }, + "2": { + "Id": 2, + "Name": "Normal_rollover", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 255, + "Green": 255, + "Red": 255, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} } } } @@ -7106,21 +5932,67 @@ "Image": null, "Cursor": null, "Properties": { - "Values": {} - } - }, - "1": { - "Id": 1, - "Name": "Normal", - "PassToChildren": false, - "IncorporationFlags": 0, - "Image": { - "File": 100688408, - "DrawMode": 1 - }, - "Cursor": null, - "Properties": { - "Values": {} + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 51, + "Green": 51, + "Red": 51, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } } }, "6": { @@ -7128,8 +6000,292 @@ "Name": "Highlight", "PassToChildren": false, "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 255, + "Green": 255, + "Red": 255, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } + }, + "7": { + "Id": 7, + "Name": "Highlight_rollover", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 255, + "Green": 255, + "Red": 255, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } + }, + "8": { + "Id": 8, + "Name": "Highlight_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 51, + "Green": 51, + "Red": 51, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } + }, + "13": { + "Id": 13, + "Name": "Ghosted", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 51, + "Green": 51, + "Red": 51, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + } + } + } + }, + "4": { + "Id": 4, + "Name": "Normal_focussed", + "PassToChildren": true, + "IncorporationFlags": 1, "Image": { - "File": 100688409, + "File": 100667819, "DrawMode": 1 }, "Cursor": null, @@ -7138,9 +6294,9 @@ } } }, - "DefaultStateId": 1, - "FontDid": 1073741861, - "HJustify": 1, + "DefaultStateId": 0, + "FontDid": 1073741824, + "HJustify": 0, "VJustify": 1, "FontColor": { "X": 1, @@ -7149,34 +6305,147 @@ "W": 1 }, "StateMedia": { - "Normal": { - "Item1": 100688408, - "Item2": 1 - }, - "Highlight": { - "Item1": 100688409, + "Normal_focussed": { + "Item1": 100667819, "Item2": 1 } }, "StateCursors": {}, - "DefaultStateName": "Normal", - "Children": [] + "DefaultStateName": "", + "Children": [ + { + "Id": 268435479, + "Type": 3, + "X": 0, + "Y": 0, + "Width": 1, + "Height": 17, + "OriginalParentWidth": 306, + "OriginalParentHeight": 17, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 2, + "Bottom": 1, + "ReadOrder": 1, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "4": { + "Id": 4, + "Name": "Normal_focussed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100683111, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "Normal_focussed": { + "Item1": 100683111, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268435480, + "Type": 3, + "X": 397, + "Y": 0, + "Width": 1, + "Height": 17, + "OriginalParentWidth": 306, + "OriginalParentHeight": 17, + "HasOriginalParentSize": true, + "Left": 2, + "Top": 1, + "Right": 1, + "Bottom": 1, + "ReadOrder": 2, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "4": { + "Id": 4, + "Name": "Normal_focussed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100683111, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "Normal_focussed": { + "Item1": 100683111, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] + } + ] }, { - "Id": 268436771, + "Id": 268435481, "Type": 1, - "X": 0, - "Y": 28, - "Width": 16, - "Height": 16, - "OriginalParentWidth": 800, - "OriginalParentHeight": 100, + "X": 354, + "Y": 0, + "Width": 46, + "Height": 17, + "OriginalParentWidth": 400, + "OriginalParentHeight": 17, "HasOriginalParentSize": true, - "Left": 1, + "Left": 2, "Top": 1, - "Right": 2, - "Bottom": 2, - "ReadOrder": 5, + "Right": 1, + "Bottom": 1, + "ReadOrder": 3, "ZLevel": 0, "States": { "4294967295": { @@ -7247,7 +6516,7 @@ { "Kind": 2, "MasterPropertyId": 24, - "UnsignedValue": 1073741861, + "UnsignedValue": 1073741826, "IntegerValue": 0, "FloatValue": 0, "BoolValue": false, @@ -7422,35 +6691,6 @@ "ArrayValue": [], "StructValue": {} }, - "11": { - "Kind": 1, - "MasterPropertyId": 11, - "UnsignedValue": 0, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": true, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} - }, "23": { "Kind": 5, "MasterPropertyId": 23, @@ -7460,7 +6700,7 @@ "BoolValue": false, "StringInfoValue": { "Token": 0, - "StringId": 72812524, + "StringId": 56939710, "TableId": 587202561, "Override": 0, "English": 1, @@ -7479,35 +6719,6 @@ }, "ArrayValue": [], "StructValue": {} - }, - "18": { - "Kind": 0, - "MasterPropertyId": 18, - "UnsignedValue": 268435733, - "IntegerValue": 0, - "FloatValue": 0, - "BoolValue": false, - "StringInfoValue": { - "Token": 0, - "StringId": 0, - "TableId": 0, - "Override": 0, - "English": 0, - "Comment": 0 - }, - "ColorValue": { - "Blue": 0, - "Green": 0, - "Red": 0, - "Alpha": 0 - }, - "VectorValue": { - "X": 0, - "Y": 0, - "Z": 0 - }, - "ArrayValue": [], - "StructValue": {} } } } @@ -7517,7 +6728,10 @@ "Name": "Normal_pressed", "PassToChildren": false, "IncorporationFlags": 0, - "Image": null, + "Image": { + "File": 100669718, + "DrawMode": 1 + }, "Cursor": null, "Properties": { "Values": {} @@ -7529,7 +6743,7 @@ "PassToChildren": false, "IncorporationFlags": 0, "Image": { - "File": 100688408, + "File": 100669717, "DrawMode": 1 }, "Cursor": null, @@ -7537,13 +6751,13 @@ "Values": {} } }, - "6": { - "Id": 6, - "Name": "Highlight", + "13": { + "Id": 13, + "Name": "Ghosted", "PassToChildren": false, "IncorporationFlags": 0, "Image": { - "File": 100688409, + "File": 100669748, "DrawMode": 1 }, "Cursor": null, @@ -7553,7 +6767,7 @@ } }, "DefaultStateId": 1, - "FontDid": 1073741861, + "FontDid": 1073741826, "HJustify": 1, "VJustify": 1, "FontColor": { @@ -7564,11 +6778,15 @@ }, "StateMedia": { "Normal": { - "Item1": 100688408, + "Item1": 100669717, "Item2": 1 }, - "Highlight": { - "Item1": 100688409, + "Normal_pressed": { + "Item1": 100669718, + "Item2": 1 + }, + "Ghosted": { + "Item1": 100669748, "Item2": 1 } }, @@ -7577,6 +6795,1000 @@ "Children": [] } ] + }, + { + "Id": 268437154, + "Type": 9, + "X": 405, + "Y": 5, + "Width": 5, + "Height": 90, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 2, + "Top": 1, + "Right": 1, + "Bottom": 1, + "ReadOrder": 16, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100688173, + "DrawMode": 1 + }, + "Cursor": { + "File": 100688168, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + }, + "Properties": { + "Values": { + "44": { + "Kind": 1, + "MasterPropertyId": 44, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100688173, + "Item2": 1 + } + }, + "StateCursors": { + "": { + "File": 100688168, + "HotspotX": 16, + "HotspotY": 16, + "IsValid": true + } + }, + "DefaultStateName": "", + "Children": [] + }, + { + "Id": 268436770, + "Type": 1, + "X": 5, + "Y": 5, + "Width": 16, + "Height": 16, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 2, + "Bottom": 2, + "ReadOrder": 19, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "35": { + "Kind": 4, + "MasterPropertyId": 35, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "26": { + "Kind": 7, + "MasterPropertyId": 26, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 2, + "MasterPropertyId": 24, + "UnsignedValue": 1073741861, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, + "37": { + "Kind": 4, + "MasterPropertyId": 37, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 255, + "Green": 255, + "Red": 255, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, + "20": { + "Kind": 0, + "MasterPropertyId": 20, + "UnsignedValue": 1, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "21": { + "Kind": 0, + "MasterPropertyId": 21, + "UnsignedValue": 1, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "11": { + "Kind": 1, + "MasterPropertyId": 11, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "23": { + "Kind": 5, + "MasterPropertyId": 23, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 122241100, + "TableId": 587202561, + "Override": 0, + "English": 1, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "18": { + "Kind": 0, + "MasterPropertyId": 18, + "UnsignedValue": 268435732, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "1": { + "Id": 1, + "Name": "Normal", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100688408, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "6": { + "Id": 6, + "Name": "Highlight", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100688409, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 1, + "FontDid": 1073741861, + "HJustify": 1, + "VJustify": 1, + "FontColor": { + "X": 1, + "Y": 1, + "Z": 1, + "W": 1 + }, + "StateMedia": { + "Normal": { + "Item1": 100688408, + "Item2": 1 + }, + "Highlight": { + "Item1": 100688409, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "Normal", + "Children": [] + }, + { + "Id": 268436771, + "Type": 1, + "X": 5, + "Y": 22, + "Width": 16, + "Height": 16, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 2, + "Bottom": 2, + "ReadOrder": 20, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": null, + "Cursor": null, + "Properties": { + "Values": { + "35": { + "Kind": 4, + "MasterPropertyId": 35, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "26": { + "Kind": 7, + "MasterPropertyId": 26, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 2, + "MasterPropertyId": 24, + "UnsignedValue": 1073741861, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, + "37": { + "Kind": 4, + "MasterPropertyId": 37, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "27": { + "Kind": 7, + "MasterPropertyId": 27, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [ + { + "Kind": 6, + "MasterPropertyId": 25, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 255, + "Green": 255, + "Red": 255, + "Alpha": 255 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + ], + "StructValue": {} + }, + "20": { + "Kind": 0, + "MasterPropertyId": 20, + "UnsignedValue": 1, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "21": { + "Kind": 0, + "MasterPropertyId": 21, + "UnsignedValue": 1, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "11": { + "Kind": 1, + "MasterPropertyId": 11, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "23": { + "Kind": 5, + "MasterPropertyId": 23, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 119095372, + "TableId": 587202561, + "Override": 0, + "English": 1, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + }, + "18": { + "Kind": 0, + "MasterPropertyId": 18, + "UnsignedValue": 268435733, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": false, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + }, + "3": { + "Id": 3, + "Name": "Normal_pressed", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": null, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "1": { + "Id": 1, + "Name": "Normal", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100688408, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + }, + "6": { + "Id": 6, + "Name": "Highlight", + "PassToChildren": false, + "IncorporationFlags": 0, + "Image": { + "File": 100688409, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": {} + } + } + }, + "DefaultStateId": 1, + "FontDid": 1073741861, + "HJustify": 1, + "VJustify": 1, + "FontColor": { + "X": 1, + "Y": 1, + "Z": 1, + "W": 1 + }, + "StateMedia": { + "Normal": { + "Item1": 100688408, + "Item2": 1 + }, + "Highlight": { + "Item1": 100688409, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "Normal", + "Children": [] + }, + { + "Id": 268437139, + "Type": 3, + "X": 0, + "Y": 0, + "Width": 5, + "Height": 5, + "OriginalParentWidth": 410, + "OriginalParentHeight": 100, + "HasOriginalParentSize": true, + "Left": 1, + "Top": 1, + "Right": 2, + "Bottom": 2, + "ReadOrder": 1, + "ZLevel": 0, + "States": { + "4294967295": { + "Id": 4294967295, + "Name": "", + "PassToChildren": false, + "IncorporationFlags": 30, + "Image": { + "File": 100693187, + "DrawMode": 1 + }, + "Cursor": null, + "Properties": { + "Values": { + "59": { + "Kind": 1, + "MasterPropertyId": 59, + "UnsignedValue": 0, + "IntegerValue": 0, + "FloatValue": 0, + "BoolValue": true, + "StringInfoValue": { + "Token": 0, + "StringId": 0, + "TableId": 0, + "Override": 0, + "English": 0, + "Comment": 0 + }, + "ColorValue": { + "Blue": 0, + "Green": 0, + "Red": 0, + "Alpha": 0 + }, + "VectorValue": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "ArrayValue": [], + "StructValue": {} + } + } + } + } + }, + "DefaultStateId": 0, + "FontDid": 0, + "HJustify": 1, + "VJustify": 1, + "FontColor": null, + "StateMedia": { + "": { + "Item1": 100693187, + "Item2": 1 + } + }, + "StateCursors": {}, + "DefaultStateName": "", + "Children": [] } ] } \ No newline at end of file diff --git a/tests/AcDream.App.Tests/UI/UiRootInputTests.cs b/tests/AcDream.App.Tests/UI/UiRootInputTests.cs index 96450179..effd8015 100644 --- a/tests/AcDream.App.Tests/UI/UiRootInputTests.cs +++ b/tests/AcDream.App.Tests/UI/UiRootInputTests.cs @@ -1,3 +1,4 @@ +using System.Linq; using System.Numerics; using AcDream.App.UI; @@ -590,6 +591,195 @@ public class UiRootInputTests Assert.True((UiRoot.HitEdges(panel, 200, 200, 5) & ResizeEdges.Bottom) == 0); } + // ── Literal Resizebar grip priority (Campaign CH slice CH6a) ───────────── + // Retail authors 8 grip/dragbar elements at a window's edges/corners + // (docs/research/2026-08-09-chat-retail-window-shell.md §2.1/§2.3). A + // directly-hit grip's own edges must win over the generic proximity + // heuristic, and a directly-hit move handle (dragbar) must win over an + // overlapping proximity match — this is what lets the main chat window's + // top STRIP move the window while its top-left/top-right CORNERS resize it. + + private static UiPanel WindowWithCornerGrips( + float left = 100, float top = 100, float width = 200, float height = 100) + { + var window = new UiPanel + { + Left = left, Top = top, Width = width, Height = height, + Draggable = true, Resizable = true, + MinWidth = 40, MinHeight = 40, MaxWidth = 2000, MaxHeight = 2000, + }; + window.AddChild(new UiResizeGrip { BorderLocation = UiResizeGrip.Border.UpperLeft, Left = 0, Top = 0, Width = 5, Height = 5 }); + window.AddChild(new UiResizeGrip { BorderLocation = UiResizeGrip.Border.UpperRight, Left = width - 5, Top = 0, Width = 5, Height = 5 }); + window.AddChild(new UiResizeGrip { BorderLocation = UiResizeGrip.Border.LowerLeft, Left = 0, Top = height - 5, Width = 5, Height = 5 }); + window.AddChild(new UiResizeGrip { BorderLocation = UiResizeGrip.Border.LowerRight, Left = width - 5, Top = height - 5, Width = 5, Height = 5 }); + return window; + } + + [Theory] + [InlineData(UiResizeGrip.Border.UpperLeft)] + [InlineData(UiResizeGrip.Border.UpperRight)] + [InlineData(UiResizeGrip.Border.LowerLeft)] + [InlineData(UiResizeGrip.Border.LowerRight)] + public void CornerGrip_GrowsBothAxes_WhenDraggedOutward(UiResizeGrip.Border corner) + { + var root = new UiRoot { Width = 800, Height = 600 }; + var window = WindowWithCornerGrips(); + root.AddChild(window); + var grip = window.Children.OfType().Single(g => g.BorderLocation == corner); + + var gs = grip.ScreenPosition; + int pressX = (int)(gs.X + 2), pressY = (int)(gs.Y + 2); + bool growsLeft = corner is UiResizeGrip.Border.UpperLeft or UiResizeGrip.Border.LowerLeft; + bool growsUp = corner is UiResizeGrip.Border.UpperLeft or UiResizeGrip.Border.UpperRight; + int dx = growsLeft ? -30 : 30; + int dy = growsUp ? -30 : 30; + + root.OnMouseDown(UiMouseButton.Left, pressX, pressY); + Assert.True(root.ActiveResizeEdges != ResizeEdges.None); + root.OnMouseMove(pressX + dx, pressY + dy); + root.OnMouseUp(UiMouseButton.Left, pressX + dx, pressY + dy); + + Assert.Equal(230f, window.Width); + Assert.Equal(130f, window.Height); + Assert.Equal(growsLeft ? 70f : 100f, window.Left); + Assert.Equal(growsUp ? 70f : 100f, window.Top); + } + + [Theory] + [InlineData(UiResizeGrip.Border.UpperLeft)] + [InlineData(UiResizeGrip.Border.UpperRight)] + [InlineData(UiResizeGrip.Border.LowerLeft)] + [InlineData(UiResizeGrip.Border.LowerRight)] + public void CornerGrip_ShrinksBothAxes_WhenDraggedInward(UiResizeGrip.Border corner) + { + var root = new UiRoot { Width = 800, Height = 600 }; + var window = WindowWithCornerGrips(); + root.AddChild(window); + var grip = window.Children.OfType().Single(g => g.BorderLocation == corner); + + var gs = grip.ScreenPosition; + int pressX = (int)(gs.X + 2), pressY = (int)(gs.Y + 2); + bool growsLeft = corner is UiResizeGrip.Border.UpperLeft or UiResizeGrip.Border.LowerLeft; + bool growsUp = corner is UiResizeGrip.Border.UpperLeft or UiResizeGrip.Border.UpperRight; + // Shrink: drag the opposite direction from "grow". + int dx = growsLeft ? 30 : -30; + int dy = growsUp ? 30 : -30; + + root.OnMouseDown(UiMouseButton.Left, pressX, pressY); + root.OnMouseMove(pressX + dx, pressY + dy); + root.OnMouseUp(UiMouseButton.Left, pressX + dx, pressY + dy); + + Assert.Equal(170f, window.Width); + Assert.Equal(70f, window.Height); + Assert.Equal(growsLeft ? 130f : 100f, window.Left); + Assert.Equal(growsUp ? 130f : 100f, window.Top); + } + + [Fact] + public void CornerGrip_TakesPriorityOverBlanketResizableEdgesMask() + { + // A directly-hit grip's own edges win outright — even if the window's + // blanket ResizableEdges mask would otherwise exclude Top (the exact + // shape retail's main chat window needs: Top excluded from ambient + // proximity so the move-handle strip works, but the TL/TR corner grips + // still resize the Y/top axis). + var root = new UiRoot { Width = 800, Height = 600 }; + var window = WindowWithCornerGrips(); + window.ResizableEdges = ResizeEdges.Left | ResizeEdges.Right | ResizeEdges.Top | ResizeEdges.Bottom; + root.AddChild(window); + var grip = window.Children.OfType().Single(g => g.BorderLocation == UiResizeGrip.Border.UpperLeft); + + var gs = grip.ScreenPosition; + int pressX = (int)(gs.X + 2), pressY = (int)(gs.Y + 2); + root.OnMouseDown(UiMouseButton.Left, pressX, pressY); + + Assert.Equal(ResizeEdges.Left | ResizeEdges.Top, root.ActiveResizeEdges); + root.OnMouseUp(UiMouseButton.Left, pressX, pressY); + } + + [Fact] + public void GripEdges_AreMaskedByResizableEdges_WhenTheWindowExcludesAnAxis() + { + var root = new UiRoot { Width = 800, Height = 600 }; + var window = WindowWithCornerGrips(); + window.ResizableEdges = ResizeEdges.Left | ResizeEdges.Bottom; // no Right, no Top + root.AddChild(window); + var grip = window.Children.OfType().Single(g => g.BorderLocation == UiResizeGrip.Border.UpperRight); + + var gs = grip.ScreenPosition; + int pressX = (int)(gs.X + 2), pressY = (int)(gs.Y + 2); + root.OnMouseDown(UiMouseButton.Left, pressX, pressY); + + // Border.UpperRight decodes to Right|Top; masked by Left|Bottom leaves nothing. + Assert.Equal(ResizeEdges.None, root.ActiveResizeEdges); + root.OnMouseUp(UiMouseButton.Left, pressX, pressY); + } + + [Fact] + public void MoveHandle_TakesPriorityOverOverlappingAmbientResizeProximity() + { + // The main chat window's top strip (a Type-2 Dragbar) sits WITHIN + // ResizeGrip proximity of the window's own top edge — if the blanket + // mask includes Top, the generic proximity heuristic would otherwise + // also match there and steal the move. A directly-hit move handle must + // win over that ambient match. + var root = new UiRoot { Width = 800, Height = 600 }; + var window = new UiPanel + { + Left = 100, Top = 100, Width = 200, Height = 100, + Draggable = true, Resizable = true, + ResizableEdges = ResizeEdges.Left | ResizeEdges.Right | ResizeEdges.Top | ResizeEdges.Bottom, + }; + var handle = new UiPanel { Left = 5, Top = 0, Width = 190, Height = 5, WindowMoveHandle = true }; + window.AddChild(handle); + root.AddChild(window); + + // Press well inside the handle strip but still within ResizeGrip(5) of + // the window's own top edge (y=100..105). + root.OnMouseDown(UiMouseButton.Left, 150, 102); + + Assert.Equal(ResizeEdges.None, root.ActiveResizeEdges); + Assert.True(root.IsWindowMoveActive); + root.OnMouseMove(200, 152); + Assert.Equal(150f, window.Left); + Assert.Equal(150f, window.Top); + root.OnMouseUp(UiMouseButton.Left, 200, 152); + } + + [Fact] + public void HoverResizeEdges_OverAGrip_ReturnsTheGripsOwnEdges() + { + var root = new UiRoot { Width = 800, Height = 600 }; + var window = WindowWithCornerGrips(); + root.AddChild(window); + var grip = window.Children.OfType().Single(g => g.BorderLocation == UiResizeGrip.Border.LowerRight); + + var gs = grip.ScreenPosition; + root.OnMouseMove((int)(gs.X + 2), (int)(gs.Y + 2)); + + Assert.Equal(ResizeEdges.Right | ResizeEdges.Bottom, root.HoverResizeEdges); + } + + [Fact] + public void HoverResizeEdges_OverAMoveHandle_IsNoneEvenWithinProximityOfTheTopEdge() + { + var root = new UiRoot { Width = 800, Height = 600 }; + var window = new UiPanel + { + Left = 100, Top = 100, Width = 200, Height = 100, + Draggable = true, Resizable = true, + ResizableEdges = ResizeEdges.Left | ResizeEdges.Right | ResizeEdges.Top | ResizeEdges.Bottom, + }; + var handle = new UiPanel { Left = 5, Top = 0, Width = 190, Height = 5, WindowMoveHandle = true }; + window.AddChild(handle); + root.AddChild(window); + + root.OnMouseMove(150, 102); + + Assert.Equal(ResizeEdges.None, root.HoverResizeEdges); + Assert.True(root.HoverWindowMove); + } + [Fact] public void ComputeAnchoredRect_LeftRight_StretchesWidth() {