docs(vt): fold the citation-pass corrections into KB 08 (icon-id decode, menu wraps not scrolls, slider fixed 0-1, HudList press-point click, dc.xml, resolved clRings and loot-editor call site); repair KB 09 path

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-06 20:18:07 +02:00
parent 19a32cde2e
commit 69bb164845
2 changed files with 41 additions and 38 deletions

View file

@ -11,7 +11,10 @@ Primary sources:
the file; matches the brief's "156 controls").
- `refs/vtank/uTank2.ViewXML.AdvancedOptionsView.xml`,
`SelfBuffChoiceView.xml`, `FriendlyLootEditorView.xml` — secondary popup
views.
views (the last is a vestigial resource nothing loads, see §6).
- `refs/vtank/dc.xml` — a fourth secondary view the first draft missed:
268×300, icon 8241, "Virindi Tank Debug", an `lRefcounts` list view loaded
at `dc.cs:52` (citation pass 2026-09-06).
- `refs/vtank/uTank2.Resources.defaultsettings.usd` — VTank's serialized
default-settings catalog (setting name / type / default / description /
category-bitmask). This is the authoritative cross-reference for what
@ -27,7 +30,10 @@ Primary sources:
`ViewProperties.cs`, `ACImage.cs` — window chrome, icon-id resolution,
`StoredViewInfo` persistence.
- `refs/vvs/decompiled/VirindiViewService.Themes/Float_Theme.cs` — default
theme pixel constants (`TabHeight`, `SliderNubWidth`, etc.).
theme pixel constants (`TabHeight`, `SliderNubWidth`, etc.) — the default
because `HudViewDrawStyle.a()` registers it at index 1 and the registry
value `HKLM\SOFTWARE\Decal\Services\{DBAC9286-…}\Theme` defaults to 1
(`HudViewDrawStyle.cs:118-167`; `Theme2` is a string-name override).
- `refs/vtank/decompiled/uTank2/PluginCore.cs` — the class that loads
`mainView.xml`, casts every named control to a typed wrapper interface,
and wires `Click`/`Change`/`Change_Old` handlers. **Heavily obfuscated**
@ -157,14 +163,14 @@ by both the initializer and every change handler:
| slOtherStam | Slider | 96,128,144,16 | "Restam others at:" | `Recharge-Helper-Stam` | `:4573` |
| slOtherMana | Slider | 96,144,144,16 | "Infuse others at:" | `Recharge-Helper-Mana` | `:4574` |
Each slider has a matching `min="0" max="100"` (`mainView.xml:81-83` etc.)
Each slider has a matching `minimum="0" maximum="100"` (`mainView.xml:81-83` etc.)
percent readout label (`lblVitals_H_Self`, `_S_Self`, `_M_Self`, `_H_Idle`,
`_S_Idle`, `_M_Idle`, `_H_Help`, `_S_Help`, `_M_Help` — 9 `StaticText`
controls at 248,0 / 248,16 / … / 248,144, each `80×16`, default text `"0%"`)
updated from the slider's `.Position` on every `Change` (e.g.
`cx.Text = co.Position + "%";``PluginCore.cs:4560-4561`). Plus the 9
"Heal at:"/"Restam at:"/… `Label1`/`Label2`/`Label3`/`Label11`/`Label21`/
`Label31`/`Label111`/`Label211`/`Label311` captions (8×16 each).
`Label31`/`Label111`/`Label211`/`Label311` captions (all at left=8, 80×16).
### Tab: Monsters (26 controls: 25 leaf + 1 container, **23 list columns**)
@ -276,15 +282,15 @@ Data tables (confirmed by name): `ExtraBuffSpells` and
| cmdNewRecall | PushButton | 376,60,88,16 | "Add Recall" | |
| cmbRecallType | Choice | 470,60,120,16 | selected=0 | 27 options: Primary/Secondary/LS/LS Sending/Portal/Aphus/Sanctuary/Caul/GW/Aerlinthe/Mt. Lethe/Ulgrim's/Bur/PtOIA/Graveyard/Colosseum/Fac. Hub/Gear K. Camp/Neftet/Candeth/FacHub/Rynthid/VR Rocks/VR Tree/Soc. CH/Soc. RB/Soc. EW (note: "Fac. Hub" and "FacHub" both present — another authoring duplicate) |
| cmdNewWaypointPause | PushButton | 376,82,88,16 | "Add Pause" | |
| txtPauseWaypointTime | Edit | 470,82,68,16 | "5" | only Edit control in the whole file with a non-empty default `text` |
| txtPauseWaypointTime | Edit | 470,82,68,16 | "5" | one of only two Edit controls in the file with a non-empty default `text` (the other is `txtChatWaypoint`, `"/ls"`) |
| Label52 | StaticText | 543,82,50,16 | "seconds" | |
| cmdNewWaypointChat | PushButton | 376,104,88,16 | "Add Chat" | |
| txtChatWaypoint | Edit | 470,104,120,16 | "/ls" | |
The `100673789`/`100673788`/`100667895` background image ids assigned to
the three nav image-buttons decode (subtracting VVS's `0x6000000` DAT
block prefix) to portal.dat indices `0x0A47FD`, `0x0A47FC`,
`0x0A2BF7` — retail DAT icon glyphs, not synthesized art.
block prefix) to portal.dat indices `0x28FD`, `0x28FC`, `0x11F7` (full ids `0x060028FD`,
`0x060028FC`, `0x060011F7`; the first draft mis-decoded the decimals) — retail DAT icon glyphs, not synthesized art.
### Tab: Meta (5 controls, 6 list columns)
@ -346,9 +352,11 @@ Two-tab `Notebook1`:
**The "Rules" page is a stub in retail VTank itself** — its own XML
literally reads "This page not yet completed." (`FriendlyLootEditorView.xml:10`).
Only the "Names" (name-match) editor is functional. This is the one place
where our `mosstank.xml`'s loot editor (§5) is **more complete than VTank's
own shipped UI**, since it implements a full rule list with action/priority
editing that VTank never finished.
where our `mosstank.xml`'s loot editor (§5) is **more complete than this
resource** — but note (§6) that VTank never loads `FriendlyLootEditorView.xml`;
the editor a VTank user actually sees belongs to the external loot plugin
(VTClassic), outside `refs/vtank/`, so this is not a comparison against
what ships.
---
@ -356,13 +364,13 @@ editing that VTank never finished.
| VVS control | Key semantics | Source |
|---|---|---|
| `HudList` | Vertically scrolling grid; every row has the same ordered column set (`cColInfo`: `ControlType`/`Width`/`Name`), each cell is a live child control (`HudStaticText`/`HudCheckBox`/`HudPictureBox`/`HudButton`/`HudTextBox`/nested `HudList`/`HudFixedLayout`/`HudTabView`). **No built-in header row** — the header glyphs seen in `mainView.xml` (F/B/G/I/…) are ordinary `StaticText` controls placed manually above the list at `top=0`, with the list itself starting at `top=16`. Row height defaults to `ControlHeight=16px`; `Padding=1px` (vertical), `WPadding=7px` (horizontal gap between columns), `WPaddingOuter=3px` (left/right list margin). A `0`-width text/button/edit/list/fixedlayout/notebook column auto-sizes: all such columns in one list share the remaining width equally after fixed-width and icon (fixed at declared width) and check (fixed 13px) columns are subtracted. Selection is not built in as a highlighted-row concept — `Click` is a **per-cell** event `delClickedControl(sender, row, col)`, fired from `MouseUp` when the press and release land in the same cell; callers implement "selected row" state themselves. Scrolling is a `HudVScrollBar` child, width from the theme's `VScrollBarButtonSize` (16px in `Float_Theme`), driven by mouse-wheel or drag. | `HudList.cs:14-609` (whole file); `Float_Theme.cs:58` |
| `HudList` | Vertically scrolling grid; every row has the same ordered column set (`cColInfo`: `ControlType`/`Width`/`Name`), each cell is a live child control (`HudStaticText`/`HudCheckBox`/`HudPictureBox`/`HudButton`/`HudTextBox`/nested `HudList`/`HudFixedLayout`/`HudTabView`). **No built-in header row** — the header glyphs seen in `mainView.xml` (F/B/G/I/…) are ordinary `StaticText` controls placed manually above the list at `top=0`, with the list itself starting at `top=16`. Row height defaults to `ControlHeight=16px`; `Padding=1px` (vertical), `WPadding=7px` (horizontal gap between columns), `WPaddingOuter=3px` (left/right list margin). A `0`-width text/button/edit/list/fixedlayout/notebook column auto-sizes: all such columns in one list share the remaining width equally after fixed-width and icon (fixed at declared width) and check (fixed 13px) columns are subtracted. Selection is not built in as a highlighted-row concept — `Click` is a **per-cell** event `delClickedControl(sender, row, col)`, fired from `MouseUp` for the cell containing the **press** point (`HudList.cs:482` tests `orig` only — the release point is never checked against the cell, so press-in-A/release-in-B still reports cell A); callers implement "selected row" state themselves. Scrolling is a `HudVScrollBar` child, width from the theme's `VScrollBarButtonSize` (16px in `Float_Theme`), driven by mouse-wheel or drag. | `HudList.cs:14-609` (whole file); `Float_Theme.cs:58` |
| `HudList` column mapping (from progid) | `IconColumn``HudPictureBox` (default 16px), `TextColumn``HudStaticText`, `CheckColumn``HudCheckBox` (fixed 13px regardless of declared width), plus (less commonly used) `FixedLayout``HudFixedLayout`, `Notebook``HudTabView`, `PushButton``HudButton`, `Checkbox``HudCheckBox`, `Edit``HudTextBox`, `StaticText``HudStaticText`, `List``HudList` (nested) | `Decal3XMLParser.cs:257-424` |
| `HudCombo` (`Choice`) | A dropdown: closed state shows the selected item's control (usually a `HudStaticText`) in a `ComboBackground_Unselected` box with a themed up/down arrow (16px square, `arrowrect`). Opening spawns a **separate top-level popup surface** (`DxHud`, its own device/texture, `+1` z-priority above the owning view) sized to `min(item count, 10) * 16px` rows (`m_j=10` fixed max-visible, `dropdownamt`), with its own `HudVScrollBar` if the item count exceeds 10. Selecting an item raises `Change`; closing happens on any click outside the drop rect, or via `FireLostFocus`. `AddItem`/`InsertItem` accept either a raw string (wrapped in a `HudStaticText`) or an arbitrary `HudControl` + opaque tag object — so combo items are not restricted to plain text. | `HudCombo.cs:15-744` |
| `HudTabView` (`Notebook`) | Tab strip height is themed (`TabHeight=16px` in `Float_Theme`). Each tab's width auto-sizes to its caption's rendered text width (capped at 280px) plus themed left/right border sizes (`TabLeftBorder_Size`/`TabRightBorder_Size`, both `0` in `Float_Theme`) plus a themed horizontal padding (`TabTextHPadding=6px`). Selected vs. deselected tabs use **separate font options** (`TabTextFontName/Size/Weight/Color/Shadow*_Selected` vs `_Deselected`). Mouse wheel over the tab strip cycles tabs; over the body it's forwarded to the active child. Only one tab's content control is ever `CanDraw=true` at a time — switching tabs disposes no state, it just flips visibility/draw flags on the existing child controls (so per-tab state survives switching, which matters for MossTank/acdream parity: switching tabs must not reset in-progress edits). | `HudTabView.cs:12-455`; `Float_Theme.cs:91-93` |
| `HudHSlider` (`Slider`) | Backed by `LinearPositionControl` (`Min`/`Max`/`Position`, `Changed(min,max,pos)` event, `Percentage` helper = `100*Position/(Max-Min)`). Draws as a 3px-tall two-tone bar (`SliderBarOuter`/`SliderBarInner`) plus a themed nub (`SliderNubWidth=7px`, `SliderNubHeight=12px` in `Float_Theme`) whose X position is `GetPositionProportionalPixels`. Drag-to-set, click-to-jump-to-position, and mouse-wheel (±1 unit per notch, accumulator-smoothed via `v.a`) are all supported; `UserChangeable=false` disables all three without hiding the control. | `HudHSlider.cs:9-131`, `LinearPositionControl.cs:6-186`, `Float_Theme.cs:54-55` |
| `HudTextBox` (`Edit`) | Single-line text input with a blinking caret (500ms toggle via an internal timer `r`), left/right/Home/End/Backspace/Delete/Ctrl+V (paste from the Windows clipboard) key handling, and an optional numeric-only input mode (`eTextBoxInputType.Int_Numeric`/`Float_Numeric`) that rejects any edit that doesn't `TryParse`. Background is themed (`TextBoxBackground`/`_MouseOver`) with a 1px `ButtonHighlight`/`ButtonShadow` bevel. **The `imageportalsrc="4726"` attribute present on every `Edit` control in `mainView.xml` is never read by `Decal3XMLParser.cs`'s `"decalcontrols.edit"` case** — only `text` is consumed; the parser never sets `HudPictureBox.Image` for an Edit control, and a repo-wide grep of VTank's own source found no other code path assigning it either. This is a **dead/vestigial XML attribute**, likely copy-pasted from an older Decal 3.0 view-XML dialect; acdream's markup does not need to reproduce it. | `HudTextBox.cs:11-417` (esp. `RawKeyAction`/`KeyDown` `260-350`, `DrawNow` `371-416`); parser evidence `Decal3XMLParser.cs:205-212`; dead-attribute confirmed by grep across `refs/vtank/decompiled/` (only hits are the literal XML strings and one string-builder-generated XML fragment in `h8.cs:104`) |
| `HudButton` (`PushButton`) vs. `HudImageButton` (`Button`) | **These are two different progids mapping to two different classes.** `PushButton``HudButton`: text-only push button, themed `ButtonBackground`/`_MouseOver`/`_Down`/`_Down_MouseOver` fills with a 1px bevel, optional `ImagePressed`/`OverlayImage` override. `Button``HudImageButton`: an image-only button taking `iconlibrary` (a portal-dat "icon library" grouping id), `background`/`icon`/`pressedicon` (each resolved via `ACImage.FromIconLibrary` unless the numeric value already looks like a raw image id, per `global::b.d`), and `matte` (a background color override, with `Color.Cyan` specifically mapped to fully transparent). Neither VTank's `mainView.xml` uses `Button` directly (only the three Route-tab nav arrows use it, via VTank's own C# code assigning `.Background` post-construction rather than XML `icon=`/`background=` attributes — see the Route-tab table above) nor does `AdvancedOptionsView.xml`/`FriendlyLootEditorView.xml`. | `HudButton.cs:9-226`; parser `Decal3XMLParser.cs:157-195` (`PushButton`), `:165-195` (`Button`) |
| `HudButton` (`PushButton`) vs. `HudImageButton` (`Button`) | **These are two different progids mapping to two different classes.** `PushButton``HudButton`: text-only push button, themed `ButtonBackground`/`_MouseOver`/`_Down`/`_Down_MouseOver` fills with a 1px bevel, optional `ImagePressed`/`OverlayImage` override. `Button``HudImageButton`: an image-only button taking `iconlibrary` (a portal-dat "icon library" grouping id), `background`/`icon`/`pressedicon` (each resolved via `ACImage.FromIconLibrary` unless the numeric value already looks like a raw image id, per `global::b.d`), and `matte` (a background color override, with `Color.Cyan` specifically mapped to fully transparent). Neither VTank's `mainView.xml` uses `Button` directly (only the three Route-tab nav arrows use it, via VTank's own C# code assigning `.Background` post-construction rather than XML `icon=`/`background=` attributes — see the Route-tab table above) nor does `AdvancedOptionsView.xml`/`FriendlyLootEditorView.xml`. | `HudButton.cs:9-226`; parser `Decal3XMLParser.cs:157-164` (`PushButton`), `:165-193` (`Button`) |
| `HudCheckBox` (`Checkbox`) | Fixed **13×13px** glyph box regardless of the declared control width/height (only the optional trailing label text uses the extra width). Three visual states: unchecked/checked (each with a `_MouseOver` variant) plus a transient "partial" press-feedback state while the mouse is down inside the box. `UserChangeable=false` disables toggling without hiding it. Label text (when present) starts at a fixed `+17px` offset from the left edge. | `HudCheckBox.cs:10-267` |
| `HudControl` (base) | Only left-button `MouseDown`/`MouseUp`/`MouseMove`/`MouseWheel` are wired; there is no right-click or double-click concept anywhere in the base class or in any of the concrete controls surveyed. A `Hit` event fires once per press-then-release-inside-the-same-control. Focus is a single static `HudView.FocusControl` — only one control across the *entire* VVS runtime (all views, all plugins) can have keyboard focus at a time. | `HudControl.cs:13-712` |
@ -380,7 +388,7 @@ editing that VTank never finished.
| `StaticText` | `<label>` | acdream's `color` attribute already generalizes VVS's `textcolor`/`justify`/font options (acdream fixes font via the DAT bitmap font, so per-label font-face/size isn't a parity concern) |
| `Edit` | `<field>` | `text`/`onchange`/`onsubmit`; VVS's numeric-only input mode (`eTextBoxInputType`) has no acdream equivalent yet — not currently exercised by `mainView.xml` (every `Edit` there is `Any`-typed) so not urgent |
| `Notebook` (page tabs) | acdream's existing `<tab>` + one `<group visible=...>` per page (the pattern `mosstank.xml` already uses) | Functionally equivalent to `HudTabView`, but acdream implements it as N independent buttons + N groups rather than one owning control — fine for parity since VVS tab state (selected index) has no behavior beyond visibility toggling anyway |
| `Choice` (dropdown) | `<menu>` | `items`/`selected`/`onchange`; acdream's `rows`/`openupward` attributes already cover VVS's max-10-visible-plus-scrollbar and (implicitly) always-downward-opening behavior — acdream's `openupward` is actually a **superset** of VVS (VVS's `HudCombo` always opens downward from `DropRect`, computed as `base.n.Top` downward with no upward flip) |
| `Choice` (dropdown) | `<menu>` | `items`/`selected`/`onchange`; acdream's `openupward` (default false = VVS's always-downward) matches; `rows` does **not**`<menu>` never sets `UiMenu.Scrollable`, so items past `rows` wrap into extra **columns** (`UiMenu.cs:356-360`) instead of scrolling one column like `HudCombo`; parity means exposing `Scrollable` from markup (added to the gap table below) — acdream's `openupward` is actually a **superset** of VVS (VVS's `HudCombo` always opens downward from `DropRect`, computed as `base.n.Top` downward with no upward flip) |
### Needs a markup extension
@ -389,7 +397,7 @@ editing that VTank never finished.
| **Multi-column lists with typed columns** | `HudList`: N columns per row, each independently typed (`TextColumn`/`CheckColumn`/`IconColumn`/nested controls), per-cell `Click(row,col)` | Exactly one text column + one optional icon column (`docs/plugin-ui-markup.md`'s explicit LIMITATION note) | Add a `<column>` child element under `<list>`, e.g.:<br>`<list x= y= w= h= rowheight=17 selected="{Idx}" onchange="{Select}">`<br>` <column type="text" width="120" header="Name" items="{NameCol}"/>`<br>` <column type="check" width="16" header="F" values="{FesterCol}" onchange="{ToggleFesterCol}"/>`<br>` <column type="icon" width="16" iconkind="did" values="{MoveUpIcons}" onclick="{MoveUpCol}"/>`<br>`</list>`<br>Each `<column>` binds its own `IEnumerable<T>` parallel to the row count (mirroring VVS's per-column `cColInfo`), keeping the existing single-column `<list items=...>` form as sugar for a one-`text`-column list (backward compatible with every current markup file). `type="check"`/`type="icon"` columns need their own per-row `onchange`/`onclick` binding returning the row index (VVS's `Click(row,col)` folded into a per-column callback, since acdream's binding model is per-attribute rather than per-cell) |
| **Header row** | Not built into `HudList` at all (VTank places separate `<label>`s above the list, exactly as acdream would today with `<label>` + `<list>`) | N/A — acdream already matches VVS here for free | No extension needed; document the pattern (static `<label>` row above a `<list>`) as the recommended idiom, matching `mainView.xml`'s Monsters-tab header |
| **Dropdown-from-a-list-of-arbitrary-controls** | `HudCombo.AddItem(HudControl, tag)` — combo items aren't restricted to text | acdream's `<menu items="{Strings}">` is text-only | Not worth adding — no VTank tab actually uses a non-text combo item; flagged only for completeness |
| **Slider `Min`/`Max`** | `HudHSlider`/`LinearPositionControl` expose `Min`/`Max` independent of a fixed 0-100 (every VTank slider in `mainView.xml` happens to use `minimum="0" maximum="100"`, but the control supports arbitrary ranges) | acdream's `<slider value=...>` implies an assumed `0.0-1.0` or similar fixed range (needs verification against `MarkupDocument.cs`) | If acdream's slider isn't already range-flexible, add optional `min`/`max` literal attributes (defaulting to today's implicit range) so a 1:1 VTank slider port doesn't need a value-rescaling shim in the plugin's ViewModel layer |
| **Slider `Min`/`Max`** | `HudHSlider`/`LinearPositionControl` expose `Min`/`Max` independent of a fixed 0-100 (every VTank slider in `mainView.xml` happens to use `minimum="0" maximum="100"`, but the control supports arbitrary ranges) | **confirmed fixed 0.01.0**: `<slider>` reads only `value`/`onchange` (`MarkupDocument.cs:374-399`) and `UiScrollbar.SetScalarPosition` clamps to `[0,1]` (`UiScrollbar.cs:100-101`) | Add optional `min`/`max` literal attributes (defaulting to today's implicit range) so a 1:1 VTank slider port doesn't need a value-rescaling shim in the plugin's ViewModel layer |
| **Edit-box background image** (`imageportalsrc`) | Present in every VTank `Edit` control's XML, but confirmed dead in VVS itself (see §2) | acdream's `<field background=...>` already exists (a real, live attribute, unlike VVS's dead one) | No extension needed — acdream's `<field background>` is strictly more useful than what VVS actually does with this attribute |
None of the three secondary popup views (`AdvancedOptionsView`,
@ -414,7 +422,7 @@ the `mainView.xml` transcription above:
| Area | VTank (`mainView.xml`) | MossTank (`mosstank.xml`) | Assessment |
|---|---|---|---|
| Window size | 856×210 (9-tab strip fits in 210px tall because every tab's content scrolls/paginates within a fixed 116-134px list) | 800×244 (`mosstank.xml:7`) | Deliberately reshaped, not a bug — a few px narrower, ~34px taller; matches acdream's own control metrics (16px checkbox rows read slightly differently in acdream's DAT font vs. VVS's) rather than being a literal port |
| Window size | 856×210 (9-tab strip fits in 210px tall because every tab's content scrolls/paginates within a fixed 116-134px list) | 800×244 (`mosstank.xml:7`) | Deliberately reshaped, not a bug — 56px narrower, 34px taller; matches acdream's own control metrics (16px checkbox rows read slightly differently in acdream's DAT font vs. VVS's) rather than being a literal port |
| Tab strip | `HudTabView`, one owning control, auto-sized tab widths | 9 independent `<tab>` buttons with hand-picked `x`/`w` per tab (`mosstank.xml:10-27`) | Correct idiom given the gap noted in §3; hand-tuned widths look reasonable against each tab's caption length (spot check: "Consumables" gets `w="86"`, the widest, correctly) |
| Options tab | 4-column layout, single flat page, 37 controls | 4-visual-column layout preserved (`mosstank.xml:29-99`), but **folds VTank's separate `AdvancedOptionsView` popup into an in-panel group** (`AdvancedOptionsVisible`, `mosstank.xml:101-118`) reachable via the same "Advanced Options" button | Deliberate redesign (single-window UX vs. VVS's popup-window pattern), consistent with acdream's plugin panels not each spawning independent OS-level windows. Not a defect — a documented architectural choice |
| Missing controls | — | `cShowLootEditor`'s VTank behavior (open a *separate* `FriendlyLootEditorView` popup) is instead an in-panel `LootEditorVisible` group (`mosstank.xml:519-585`), same pattern as Advanced Options | Consistent design choice, not an omission — and per §1's Loot-Editor table, MossTank's rules editor is functionally **more complete** than VTank's own (VTank's Rules page is a literal stub) |
@ -452,28 +460,23 @@ without any other markup change.
Meta), the "binds to" column above is a naming-convention inference
against `defaultsettings.usd`/the XML's own control names, not a
traced `file:line` proof.
- **The `clRings`/`clRings` duplicate column's real data field.** The
Monsters-tab list declares two `CheckColumn`s both named `clRings`
(`mainView.xml:121-122`) under a header row that has 9 single-letter
captions (F/B/G/I/Y/V/A/R/S) for what should be 9 *distinct* boolean
columns. Since the 9th column has no unique `name`, I could not determine
from the XML alone whether it silently shadows column 8 (both write the
same `MyMonsters.Ring` field) or is genuinely wired to the 18th
`MyMonsters` field (`Streak`, matching the "S" header) through some
other lookup path VTank's C# code uses instead of the XML `name`. This
reads as a real (if harmless — `HudList.AddColumn` doesn't enforce unique
column names) authoring bug in VTank's own shipped `mainView.xml`.
- **The exact call site that loads `FriendlyLootEditorView.xml`.** Unlike
`AdvancedOptionsView.xml` (`db.cs:79`) and `SelfBuffChoiceView.xml`
(`e7.cs:108`, `hz.cs:108`), a repo-wide string grep for
`FriendlyLootEditorView` across `refs/vtank/decompiled/` returns only the
`.csproj`'s embedded-resource declaration — no `.cs` file references the
resource name as a literal string. It is loaded somewhere (the checkbox
behavior at `PluginCore.cs:6270-6289` proves a loot-editor view object
exists and opens/closes), just not through a call I could locate by
string search; likely a dynamically-built resource-name string or a
differently-obfuscated loader class not distinguishable from its
siblings.
- **`clRings` duplicate column — RESOLVED** (citation pass 2026-09-06): VTank's
C# never addresses a column by name (no `clRings` reference outside the
XML); cells are addressed by integer index (`MetaViewWrappers/dClickedList.cs`
is `void(object, int row, int col)`). `PluginCore.cs:7904-7948` switches on
the column index and writes fourteen distinct fields (case 7 → `a10.j`,
case 8 → `a10.s`), so column 9 ("S") is genuinely its own `Streak` field and
the duplicate `name` is inert metadata. Bonus: case 6 ("A"/Attack) writes
inverted (`a10.t = !…`); column 14 is the monster name (`clMonName`).
- **`FriendlyLootEditorView.xml` call site — RESOLVED: there is none.** Every
VTank view loads via `ad.f(host, name)`; the only five call sites are
`mainView.xml` (`PluginCore.cs:1608`), `AdvancedOptionsView.xml`
(`db.cs:79`), `SelfBuffChoiceView.xml` (`e7.cs:108`, `hz.cs:108`) and
`dc.xml` (`dc.cs:52`). `PluginCore.dz` is typed `s` (`PluginCore.cs:941`);
`s.ah` is a `cu` (`s.cs:75`), the `uTank2.LootPlugins` manager, whose `f()`/
`b()` (`cu.cs:115,136`) delegate to `OpenEditorForProfile()`/
`CloseEditorForProfile()` on the EXTERNAL loot plugin. The resource is
vestigial.
- **VTank's exact on-disk schema for per-character nav/loot/meta/settings
*profile* documents** (as opposed to the global `defaultsettings.usd`
default-value catalog, which I did read in full). `cmbSettingsSet`/

View file

@ -14,7 +14,7 @@ plugin, `MosswartMassacre/vTank.cs` + `VtankControl.cs`. acdream side:
`src/AcDream.Core/Plugins/PluginCommandRegistry.cs`. All decompiled facts
are cited `file:line` against `refs/vtank/decompiled/...` unless another
root is named. UtilityBelt's VTank integration lives in the full source at
`C:Userseriknsource eposutilitybelt.gitlab.io` (the older
`C:\Users\erikn\source\repos\utilitybelt.gitlab.io` (the older
`utilitybelt.service` clone has none) — see §6 for the Harmony-patch route.
## How `/vt` reaches the parser