# benilla — generated deviations > **GENERATED** by `scripts/genmap.sh` from the code — do not edit by hand; rerun the script > when a deviation is added or reworded. No timestamp — identical code yields an identical file. benilla is the 1.12.1 client reimplemented: what the reference does is what benilla does. Where it differs on purpose, that is a deviation, the maintainer's call alone (`docs/METHOD.md`), and it is written down where it lives: a setting's `Deviates` row in the CVar table, or a `Deviation:` comment at the code, the Lua or the XML that differs. This file gathers them all, regenerated at every land, so the list is read from the code and cannot drift from it. Test code is left out, and so are the CVars that are benilla's own knobs with no 1.12.1 counterpart (`ours` rows). ## Settings that ship off the reference default A setting boots at the reference's default unless it is listed here (`docs/METHOD.md`). | CVar | 1.12.1 | benilla | Why | | --- | --- | --- | --- | | `frillDensity` | `16` | `32` | the reference's registered 16 is stop 0 and its post-`hwDetect` 24 is on no stop at all, so every stop diverges; Medium (32) is the nearest one no sparser than a fresh install, and erring sparse is the worse failure for ground cover | | `gxApi` | `direct3d` | `""` | descriptive, not a selector — benilla renders through wgpu, which has no D3D9 backend and no chooser; the value is the live adapter's own and is never persisted | | `gxColorBits` | `16` | `32` | these describe, they do not steer — the pair is our swapchain's own, and every format `MsaaFormats` publishes carries it | | `gxDepthBits` | `16` | `32` | as `gxColorBits` — the depth half of the same descriptive pair | | `gxResolution` | `640x480` | `1600x900` | the saved value is the WINDOWED size, as fullscreen is the borderless window over the monitor, whose size the row answers while it holds; and 640x480 is not a window anyone would ship a client at | | `realmList` | `us.logon.worldofwarcraft.com:3724` | `localhost` | that host has not resolved since 2019, so shipping it makes every first launch a DNS failure; benilla dials the machine it is running on | | `SoundReverb` | `1` | `0` | the reference's reverb is EAX-over-hardware, and that hardware has not existed since Vista, so "1" would ship audio the real client has never actually produced on any machine a player runs today | | `weatherDensity` | `2` | `3` | every precipitation rate in `benilla-world`'s own precipitation module was derived and graded against the reference install's own apitrace captures, and that install runs `SET weatherDensity "3"` (K = 1.0) — so 3 is the value a benilla-vs-reference side-by-side is correct at, and the registered 2 would thin every rate to 0.66 against the only client we compare with. The slider is how a player takes it back down | ## Deviations in the code Each entry is the first sentence of a `Deviation:` comment, linking to where it lives. - [benilla-app](#benilla-app): 255 - [benilla-assets](#benilla-assets): 5 - [benilla-blp](#benilla-blp): 1 - [benilla-formats](#benilla-formats): 24 - [benilla-lua](#benilla-lua): 11 - [benilla-protocol](#benilla-protocol): 29 - [benilla-srp](#benilla-srp): 2 - [benilla-ui](#benilla-ui): 135 - [benilla-world](#benilla-world): 47 ### benilla-app #### area - The indoor dedup keys `(WMOID, MOGP uniqueID)`, not the client's raw per-WMO group index, because the raw index can alias across adjacent buildings. ([`src/area.rs:30`](../crates/benilla-app/src/area.rs#L30)) #### assets/ui - `OpenBackpack` opens every equipped bag, not only the backpack, because that way the vendor and mailbox windows that call it (MerchantFrame.lua:35, MailFrame.lua:39) bring up every bag to sell or mail from. The was-open memory is keyed by bag id: `ContainerFrame1..12` are recycled across bags. The stock `CloseAllBags` (ContainerFrame.lua:702-707) runs unchanged: it calls this `CloseBackpack`, then closes bags 1 and up. ([`assets/ui/ContainerFrameAdapters.xml:9`](../crates/benilla-app/assets/ui/ContainerFrameAdapters.xml#L9)) - The stock FCF\_ChatTabFadeFinished (FloatingChatFrame.lua:989-992) nils oldAlpha even under a live hover, so leaving and re-entering within CHAT\_FRAME\_FADE\_TIME (a flick to the scroll buttons, outside the hover box, does it) stops the plate fading in (l.873) for the rest of the session; this keeps oldAlpha while hover is set because the stock one nils it even under a live hover. ([`assets/ui/FrameXMLFixes.xml:6`](../crates/benilla-app/assets/ui/FrameXMLFixes.xml#L6)) - Re-runs UIParent\_ManageFramePositions after DurabilityFrame's own OnEvent. The pass seats the frame 20 further in while a side glyph shows (UIParent.lua:1759-1768); a glyph appearing while the frame is shown leaves the shield's overhang off the screen edge because the stock frame runs it only from OnShow/OnHide. The stock handler runs first, unchanged, on the this/event/arg1 already set for the dispatch. ([`assets/ui/FrameXMLFixes.xml:20`](../crates/benilla-app/assets/ui/FrameXMLFixes.xml#L20)) - Friendly plates the player turned on come back at every world entry; the stock UpdateNameplates (UIOptionsFrame.lua:768-780) shows them and hides them again at once (l.775-776), and FRIENDNAMEPLATES\_ON is never saved because l.182 registers NAMEPLATES\_ON a second time. ([`assets/ui/FrameXMLFixes.xml:33`](../crates/benilla-app/assets/ui/FrameXMLFixes.xml#L33)) - A button whose key moved away keeps the old key's label while it holds an action with no range (a stance, a self buff) because the stock ActionButton\_UpdateHotkeys (ActionButton.lua:129-140) writes no text in that one unbound case; this clears it. The stock function runs first, unchanged. ([`assets/ui/FrameXMLFixes.xml:51`](../crates/benilla-app/assets/ui/FrameXMLFixes.xml#L51)) - The rungs are the 1.15 era client's ESC menu, because its settings screens replace 1.12's, which are much worse to use; the era's AddOns rung is dropped, since the character-select AddOns screen is the only addon UI. ([`assets/ui/GameMenuAdapters.xml:4`](../crates/benilla-app/assets/ui/GameMenuAdapters.xml#L4)) - The layout is the era Settings panel's Keybindings page (collapsible category sections), because 1.12's settings screens are much worse to use. Capture follows 1.12's Blizzard\_BindingUI: while a capsule is selected the window is keyboard-enabled, so the next key binds through its OnKeyDown, and a mouse 3/4/5 click or a wheel notch binds; left and right clicks only select, and ESC while armed binds Escape (its OnKeyDown has no ESCAPE filter). ([`assets/ui/KeyBindingsPage.xml:5`](../crates/benilla-app/assets/ui/KeyBindingsPage.xml#L5)) - Every bind, unbind and reset saves at once, as the era panel commits, where 1.12 had Okay and Cancel; only Reset To Default and leaving the character set confirm. ([`assets/ui/KeyBindingsPage.xml:11`](../crates/benilla-app/assets/ui/KeyBindingsPage.xml#L11)) - The spacer headers BLANK, BLANK2 and BLANK3 over multibars 2-4 (Bindings.xml:883/967/1051), which 1.12 draws blank (BINDING\_HEADER\_BLANK is " ", the other two are not defined), continue the section above, because this page's sections are named and collapsible. ([`assets/ui/KeyBindingsPage.xml:123`](../crates/benilla-app/assets/ui/KeyBindingsPage.xml#L123)) - The 1.15 era client's single settings window replaces the 1.12 four-panel family because that is much worse to use; the 1.12 frames still load, hidden, for addons. Every art byte is 1.12-native or a colour fill, so era names below cite geometry only. Hiding discards pending edits and Apply commits outright. A slider shows the 1.12 range; an out-of-range value displays clamped, not written back. ([`assets/ui/OptionsFrame.xml:3`](../crates/benilla-app/assets/ui/OptionsFrame.xml#L3)) - AUTO\_QUEST\_WATCH is the string "1" because 1.12 assigns the number 1 (l.122) but every consumer compares against "1" (QuestLogFrame.lua:64/68); 1 ~= "1" in Lua 5.0. ([`assets/ui/OptionsFrame.xml:32`](../crates/benilla-app/assets/ui/OptionsFrame.xml#L32)) - The bar toggles precede the lock, which 1.12's box leads with, because that way what is on screen reads first. ([`assets/ui/OptionsFrame.xml:499`](../crates/benilla-app/assets/ui/OptionsFrame.xml#L499)) - A named ladder reads out its stop because 1.12's slider labels only its ends, and a bare index would mean nothing to a player. ([`assets/ui/OptionsFrame.xml:632`](../crates/benilla-app/assets/ui/OptionsFrame.xml#L632)) - 1.12 returns early here; a mute row hides the last plate because otherwise a neighbour's text stands when its OnLeave was missed. ([`assets/ui/OptionsFrame.xml:747`](../crates/benilla-app/assets/ui/OptionsFrame.xml#L747)) - No partner write of cameraPitchSmoothSpeed because it has no reader: the follow here has one rate. ([`assets/ui/OptionsFrame.xml:1698`](../crates/benilla-app/assets/ui/OptionsFrame.xml#L1698)) - Modern Classic's two-entry Display Mode, because there is no exclusive fullscreen; gxWindow "0" is the borderless window. ([`assets/ui/OptionsFrame.xml:1984`](../crates/benilla-app/assets/ui/OptionsFrame.xml#L1984)) - Our own row (the reference draws to the backbuffer), and no Multisampling because it misses alpha-tested cutouts. Deferred: a write rebuilds the render target. ([`assets/ui/OptionsFrame.xml:2013`](../crates/benilla-app/assets/ui/OptionsFrame.xml#L2013)) - 1.12 has no `/reload` (later clients added it; 1.12 reloads through `/console reloadui`); kept because it lets a player reload the interface after toggling addons. ([`assets/ui/ScriptLogFrame.xml:381`](../crates/benilla-app/assets/ui/ScriptLogFrame.xml#L381)) - A three-slice where the reference overlaps two quads, since two quads reach only 362 units and a page here is 563 tall. The fill is ItemTextFrame's 0.8-alpha black; fill and art are in separate layers because the client orders overlapping quads within one layer by texture handle. ([`assets/ui/ScrollTemplates.xml:190`](../crates/benilla-app/assets/ui/ScrollTemplates.xml#L190)) - The pet page's autocast widgets take the pet bar button's proportions because that seats the shine and the corner brackets on the button's edge, sharing its centre. Stock SpellBookFrame.xml has the shine 36x36 at CENTER (1,1), scale 1.22, the brackets 60; 71.53 is 37 x 58/30 (the art fills 33/64 of UI-AutoCastableOverlay.blp). ([`assets/ui/SpellBookAdapters.xml:3`](../crates/benilla-app/assets/ui/SpellBookAdapters.xml#L3)) #### aura_visual - A non-zero rate is ignored, because the only one shipped (`8947848.0` on kit 1744, a packed grey in the rate column) is noise on the reference's integer-ms clock and has no faithful form on our f32-second one. ([`src/aura_visual.rs:212`](../crates/benilla-app/src/aura_visual.rs#L212)) #### bindings - A press with Super (Cmd) held runs no binding because that way a system chord such as Cmd+Tab or Cmd+Q never acts in game. The reference has no such modifier and runs the bare key's binding: the Mac enqueues the key with Command held and skips only its text (`mac:08a51e`), and Windows hands `VK_LWIN`/`VK_RWIN` to the layout arm (`0x42da39`) like any key. ([`src/bindings.rs:19`](../crates/benilla-app/src/bindings.rs#L19)) - A trackpad's `Pixel` deltas are carried until they make a line, and step at most once per event (`crate::ui_script::Record::Wheel`). The reference steps on every `WM_MOUSEWHEEL`, whatever its delta (`0x76c1a9`); the carry is kept because a carried trackpad does not zoom or scroll at its event rate. ([`src/bindings.rs:637`](../crates/benilla-app/src/bindings.rs#L637)) - Latches die with the VM that made them, because a latch names a command of that VM's table and releasing it against a new one would run another load's up-half. The reference keeps a held key running through `ReloadUI`; here it re-latches on its next press. The held bits die with it, as the key's Stop would have cleared them. ([`src/bindings.rs:682`](../crates/benilla-app/src/bindings.rs#L682)) - The Z key is named `Z` on a Mac too, because the Mac client uppercases only `a`-`y` (`mac:08a3df`) and so names it `z`, which no binding can press; that fault would leave a binding to `Z`, the stock `TOGGLESHEATH` key, unreachable there. ([`src/bindings/chord.rs:111`](../crates/benilla-app/src/bindings/chord.rs#L111)) - The Windows key table stops at `VK_F12` and drops later F-keys; they are named here because that way a stored `F13`-`F24` can be pressed. ([`src/bindings/chord.rs:171`](../crates/benilla-app/src/bindings/chord.rs#L171)) - On the Mac and Linux a key its platform reports no character for keeps its US name too, where the Mac reference drops it (`mac:08a4aa`), and a Linux dead key not yet pressed bare stays bindable. ([`src/bindings/layout.rs:116`](../crates/benilla-app/src/bindings/layout.rs#L116)) - A character above U+00FF names the key by itself because the reference's `MapVirtualKeyA` returns an ANSI code-page byte, which `0x42da4b` drops past `0xff` and the namer's UTF-8 encoder (`0x41abb0`) otherwise reads as Latin-1, so such a key is mislabelled or dropped; named by what it types, it stays bindable and readable. ([`src/bindings/layout.rs:216`](../crates/benilla-app/src/bindings/layout.rs#L216)) - A layout that is not ASCII-capable (Hebrew, Greek, Russian, Arabic, Thai) names its keys through the ASCII-capable layout macOS pairs with it, as macOS names its own shortcuts, because the reference reads a non-Roman `KCHR`'s byte as MacRoman (`mac:08a40f`), which names no real key. ([`src/bindings/layout.rs:290`](../crates/benilla-app/src/bindings/layout.rs#L290)) - A character above U+00FF (Czech `ě`, Polish `ł`, Turkish `ş`) names the key by itself because the reference reads `KeyTranslate`'s byte as MacRoman (`mac:08a40f`) and keeps it only if it converts to Latin-1 (`CFStringGetBytes`, `mac:08a46b`, stored at `mac:08a482`), else leaves the slot `-1`, which `mac:08a4aa` drops, so such a key is mislabelled or dropped; named by what it types, it stays bindable and readable. ([`src/bindings/layout.rs:295`](../crates/benilla-app/src/bindings/layout.rs#L295)) - The reference saves a full snapshot (`bindings-cache.wtf`); a diff is stored because a full snapshot would leave every command added later unbound for a saved file. ([`src/bindings/store.rs:13`](../crates/benilla-app/src/bindings/store.rs#L13)) #### blob_shadow - The shadow is gated on `InheritedVisibility`, though the reference draws one under an undrawn body (`0x48161d`), because benilla's exterior-scene election hides units the reference never loads, and their shadows would stay on the floor below. ([`src/blob_shadow.rs:32`](../crates/benilla-app/src/blob_shadow.rs#L32)) #### camera_shake - The shake spawns at the kit play's position because the reference passes `&node+0x48` to the shake (`0x620e0e`) before `0x62101d` fills it from the attachment, so a bone-attached first node (`0x61fdd0`, which never writes it) shakes at the world origin its constructor left (`0x61f4c1`) and is culled beyond 80 yards of it, silencing 26 of the 58 shipped shake kits; that is a read before the write, not a behaviour. ([`src/camera_shake.rs:290`](../crates/benilla-app/src/camera_shake.rs#L290)) #### chat_bubble - Sizes ride the plates' damped diagonal basis (`plate_basis`), not the unbounded reference law, because that way bubble text and plate text keep one em at every window size. ([`src/chat_bubble.rs:24`](../crates/benilla-app/src/chat_bubble.rs#L24)) #### cinematic - Bevy UI nodes computed per frame, not `CinematicFrame.xml`'s textures, because that way a window resized mid-cinematic stays letterboxed. `CinematicFrame` still shows and owns ESC. ([`src/cinematic.rs:204`](../crates/benilla-app/src/cinematic.rs#L204)) #### combat_text - The reference stretches a raster of at most 32 px; each whole-pixel size is rasterized here because that way the crit pop stays crisp. ([`src/combat_text/mod.rs:273`](../crates/benilla-app/src/combat_text/mod.rs#L273)) #### console - A line of eight names is not left with its trailing `, ` and a list of a multiple of eight names is not followed by `NONE`, because those are two slips of the reference's loop (`0x63ffed`, `0x64004d`). The commands list in registration order, then the CVars in the registry's list order, where the reference's one table interleaves them as start-up registers them. ([`src/console.rs:568`](../crates/benilla-app/src/console.rs#L568)) - A CVar lists under its registration's category with its registration's help, even when `config.toml` held it at boot, because in the reference such a record was made by the config line's `set` (`0x63d569`-`0x63d582`), which registered its command in category 5 with the help `""` (`0x63ddc9`), and the later registration finds the record and returns without registering again (`0x63dc1a`-`0x63dc87`), so what `help` says would hang on what the file held. ([`src/console.rs:574`](../crates/benilla-app/src/console.rs#L574)) #### creature_anim - A new puff inside the last one's clip is declined instead of replacing it (`0x6208e0`), because one-shot effects carry no reap key; either way two never overlap. ([`src/creature_anim/breath.rs:17`](../crates/benilla-app/src/creature_anim/breath.rs#L17)) - A mounted draw is refused at the setter, because our rider track never replays the reference's per-play force-stow (`0x5fdf80`); the result is the same. ([`src/creature_anim/driver.rs:792`](../crates/benilla-app/src/creature_anim/driver.rs#L792)) - The reference writes bone 0's rate blindly; we scope it to the swing's own node, because a moving attacker's gait would otherwise slow too. The id is re-checked, as `Mode::Swing` also holds non-swing one-shots. ([`src/creature_anim/driver.rs:1111`](../crates/benilla-app/src/creature_anim/driver.rs#L1111)) - A time-based rate, because the reference's per-frame step changes with the frame rate. ([`src/creature_anim/select.rs:137`](../crates/benilla-app/src/creature_anim/select.rs#L137)) - A spell's state kit and body procs are reaped only once no slot holds the spell because the reference's removal of one slot (`0x612320` → `0x5ff290`) stops every effect of that spell on the unit (`0x614150(spell, 1)` at `0x5ff2d2`, and its procs through `0x60d150` and `0x5ff320`), even while another slot holds the same spell, which drops a visual the server says still holds. ([`src/creature_anim/spell_visual.rs:1367`](../crates/benilla-app/src/creature_anim/spell_visual.rs#L1367)) #### cvars - The reference's list runs in creation order, the records `Config.wtf` created first in file order (`0x63d8eb`), then each registration as start-up reaches it (`containers`), an order benilla-re has not traced. benilla lists in the table's order, which is register-site address order, then the rows the table lacks (benilla's own, an addon's) as they registered. ([`src/cvars/listing.rs:5`](../crates/benilla-app/src/cvars/listing.rs#L5)) - For a row that is not latched the change callback runs, inside the call that restored it, where the reference runs no callback here (`0x63dff0`, `0x63e010`), because a knob moves only through its callback (`callbacks::CvarCallbacks`), which also stands in for the reference's direct reads of the record; without it knob and value would disagree until the next write. ([`src/cvars/mod.rs:439`](../crates/benilla-app/src/cvars/mod.rs#L439)) - The reference's `SaveConfig` (`0x63d980`) writes only at world entry (`0x46b6f6`), at the leave-world tail (`0x490c35`-`0x490c64`) and at shutdown (`0x63daf0`), so a crash or a kill loses every change since; here a player's settings survive one because the config saves a quiet second after a change. ([`src/cvars/mod.rs:1170`](../crates/benilla-app/src/cvars/mod.rs#L1170)) - The reference clips at full scale and has no headroom mechanism (its SFX-bus duck `0x457960` is a sidechain armed only by server-pushed voice lines); benilla limits because every SFX is mastered to full scale and overlapping kits clip. ([`src/cvars/table.rs:243`](../crates/benilla-app/src/cvars/table.rs#L243)) - Here the dial multiplies the camera's own rate, because benilla does not change the OS pointer speed, a system-wide setting. ([`src/cvars/table.rs:489`](../crates/benilla-app/src/cvars/table.rs#L489)) - "0" raises a borderless fullscreen window instead of mode-setting the display, because Wayland and macOS offer no mode-set and X11's leaves the desktop changed after a crash (`crate::video`). ([`src/cvars/table.rs:619`](../crates/benilla-app/src/cvars/table.rs#L619)) - Benilla, which has no exclusive mode, applies the same curve in the composite pass (`crate::ui_gamma::DisplayGamma`), because the skipped upload would make a slider that moves no pixel. `SetGamma 0x4891f0` writes `"%f"` ("1.000000"), which `SaveConfig` (`0x63da4a`) keeps as a diff against the default "1.0", as the reference does. ([`src/cvars/table.rs:744`](../crates/benilla-app/src/cvars/table.rs#L744)) #### death - `0x492130` compares the positions whatever map we stand on, so a ghost on another map at the corpse's coordinates reads in range for a reclaim the server refuses; here only the corpse's display map counts because the server refuses that reclaim. ([`src/death/mod.rs:308`](../crates/benilla-app/src/death/mod.rs#L308)) #### entities - A cap on one hop's sub-segment count, which the reference lacks, because that way a vertex run is never sized off table data alone; shipped rows peak at 12 (30 yd at `avgSegLen` 2.78). ([`src/entities/chain_beam.rs:54`](../crates/benilla-app/src/entities/chain_beam.rs#L54)) - Not the reference's generator (`((rand & 0x7fffff) | 0x3f800000)` re-centred through `2.0`), because the look rests on the amplitude and the advection, both exact, never on the draw sequence. ([`src/entities/chain_beam.rs:111`](../crates/benilla-app/src/entities/chain_beam.rs#L111)) - The reference updates every unit every frame; here only units showing a flagged visual are tracked, and a parked rig skips its ray and re-seeds at the slope on waking, because that bounds the cost at one ray per flagged unit on screen. Nothing shows: an unflagged unit's vector is never read, and a first-sight seed at the slope seats a mount-up at once, as the reference does. ([`src/entities/conform.rs:67`](../crates/benilla-app/src/entities/conform.rs#L67)) - While false the pane keeps re-taking and a late weapon is baked, because the reference copies a finished model and ours stream in. ([`src/entities/equipment/resolve.rs:181`](../crates/benilla-app/src/entities/equipment/resolve.rs#L181)) - It attaches at that clip's `$SHL`, where the reference attaches it at the draw's start, because it keys on the ranged slot's sheath so it arrives with the bow it feeds; the two are a few hundred ms apart in one clip and never seen apart. ([`src/entities/equipment/resolve.rs:561`](../crates/benilla-app/src/entities/equipment/resolve.rs#L561)) - `Hold` is one repeating play where the reference re-arms it each pass with variation -1, a weighted random pick, because at most one `Spells\` model authors several variations. ([`src/entities/spell_fx/lifecycle.rs:11`](../crates/benilla-app/src/entities/spell_fx/lifecycle.rs#L11)) #### game_tip - The reference rasterizes the tip's font at most 32 px (`0x5ca096`/`0x5ca09b` in `0x5ca030`, reached through `0x44d040`) and magnifies it to the string's height; this rasterizes at the true size, as the engine does all big text (`crate::ui_text`'s engine). ([`src/game_tip.rs:191`](../crates/benilla-app/src/game_tip.rs#L191)) #### go_templates - One per entry, where the reference keeps one per call, as the creature arm's waits are kept (`benilla_ui::script::quest_log`). ([`src/go_templates.rs:161`](../crates/benilla-app/src/go_templates.rs#L161)) #### lanes - The reference has no such cap. A signal raised inside a listener runs nested in its call, bounded by `luaD_call`'s C-stack count of 200 (`0x6f65ae`), whose error ends the innermost listener alone, or by the stack of the thread that runs the loop, which the image's stack reserve of 0x100000 bounds, whichever comes first: a chain through the chat line function `0x49a870` takes an 8 KB frame each (`0x49a873`, `0x1f0c` bytes). The cap exists only because verbs a listener calls still queue onto a lane instead of firing inside the call (#2202), and goes once none does. ([`src/lanes.rs:28`](../crates/benilla-app/src/lanes.rs#L28)) #### loading_screen - The live window's aspect stands in for `gxResolution`'s, as in `portrait`'s `GxAspect`, because the window here takes any shape a drag gives it, where the reference's keeps `gxResolution`'s (`0x5989d7`). In fullscreen the window is the screen in logical pixels and `gxResolution` the screen in device pixels, so their aspects agree and their sizes need not. ([`src/loading_screen.rs:66`](../crates/benilla-app/src/loading_screen.rs#L66)) - The wheel is swallowed, where the reference still zooms the hidden camera, because nothing should act through the screen. ([`src/loading_screen/input.rs:12`](../crates/benilla-app/src/loading_screen/input.rs#L12)) - The world pick is cleared, where the reference's freezes: the screen's layer blocks the frame pass (bit 0 clear, `0x406808` → `0x4083c0`), so `0x481790` does not run, except after a transport arrival (`0x5debb6`), when it picks at the frozen point. ([`src/loading_screen/input.rs:14`](../crates/benilla-app/src/loading_screen/input.rs#L14)) #### local_state - The reference writes `Screenshots\\` inside the install; benilla keeps the folder in its own state because it never writes to the install; the folder keeps the reference's name. ([`src/local_state.rs:433`](../crates/benilla-app/src/local_state.rs#L433)) #### minimap - Dots re-project every frame, where the reference draws coordinates about 1 s stale, because that staleness is a throttle quirk. ([`src/minimap/blips/mod.rs:28`](../crates/benilla-app/src/minimap/blips/mod.rs#L28)) #### nameplates - `AlphaMode::Blend` writes no depth where the reference does, because overlapping names resolving by sort order look the same. ([`src/nameplates.rs:4`](../crates/benilla-app/src/nameplates.rs#L4)) - A mounted plate keeps only this fraction of its seat's oscillation about a slow mean, because the raw seat, which the reference also rides, read more intense than the reference side by side. `1.0` is the raw seat; on-foot plates are untouched. ([`src/nameplates.rs:300`](../crates/benilla-app/src/nameplates.rs#L300)) - Larger than the reference's 32 px `UNIT_NAME_FONT` raster, which it magnifies (`0x6c749b`), because a larger source is crisper up close. ([`src/nameplates.rs:309`](../crates/benilla-app/src/nameplates.rs#L309)) - `ShouldShowName`'s first leg is `IsSelectable` (`0x60be60`), which passes our own unit; the avatar's fade stands in because what hides the own name in first person in 1.12.1 is untraced. ([`src/nameplates.rs:541`](../crates/benilla-app/src/nameplates.rs#L541)) #### names - For a guid it does not hold, the reference's combat-log namer (`0x6264e0`) asks the creature cache under guid bits 32-47 (`0x6265c4`-`0x6265e0`) for every guid whose top nibble is 0xf and whose bits 32-47 are nonzero, a game object's and a pet's included, and never the pet-name cache (only a held unit reaches it, `0x6092c7`). Here an unstreamed creature is keyed by its entry, a pet guid by its pet number in the pet-name cache and a game object's asks nothing, because on the servers in use (entry at bits 24-47) the reference's key names each after an unrelated creature. ([`src/names.rs:144`](../crates/benilla-app/src/names.rs#L144)) #### net - UTC days, where `mktime` reads the host's local time zone, because the app has no time zone source (`benilla_ui::civil` has the same). A zone east of UTC moves every date's number down one together, which no difference between two dates sees, and a daylight-saving change can give two dates one number, which the sync (`0x6436c0`) would see. ([`src/net/game_time.rs:354`](../crates/benilla-app/src/net/game_time.rs#L354)) - The reference loads the world first and logs in after: the entry's first frame starts the load at the record's map and position (`0x401570`, called at `0x46c236`), and a later one, once its file reader is idle (`0x46c247`), sends the login (`0x46c272`). Here the two overlap because that way entry is a round trip faster; a refusal ends the cycle as a logout does. ([`src/net/io.rs:10`](../crates/benilla-app/src/net/io.rs#L10)) - The reference re-dials only from `RequestRealmList`, and only when the link is down (`[CLoginMgr+5]` clear, `0x5ab857` → `0x5b2200`), with the reconnect challenge (`0x5b2134`, `[Logon+0xc]`); the connect's query sends only on a link in state 6 (`0x5bc14c`) and otherwise nothing, leaving the screen on its connecting dialog for good. Here both queries re-dial on any failure, with a full logon from the cycle's credentials, because benilla's logon has no reconnect exchange and a connect that can never complete is a dead end, not a behaviour; the new session key serves the next world dial as the reconnect's would. A PIN account's re-dial presses the PIN the logon proved on its new challenge's grid, as the reconnect asks for none. A PIN a re-dial's proof has refused (a TOTP code moves on, vmangos `AuthSocket.cpp:720`) is forgotten and the logon dials no more, so every query fails from then on: each refusal is a wrong password to the server (`:856`), and the list asks every 5 s. ([`src/net/io.rs:408`](../crates/benilla-app/src/net/io.rs#L408)) - The reference's guard at `0x537e85` sends 0 whenever the write index is 0, one ping in sixteen; we send 0 only before the first pong, because the rest is an artefact of its index arithmetic that only the server stores. ([`src/net/io.rs:1301`](../crates/benilla-app/src/net/io.rs#L1301)) - The reference places collision and culling by the raw facing, ours follow the display facing, because a capsule and a sphere barely change under rotation. ([`src/net/motion/facing.rs:10`](../crates/benilla-app/src/net/motion/facing.rs#L10)) - The reference paces a self move through the same replay chain as a remote's; benilla hands it over at arrival because pacing it would only delay a correction to our own pose. ([`src/net/motion/remote.rs:110`](../crates/benilla-app/src/net/motion/remote.rs#L110)) - Its rate-limited hover climb (`0x636fa1`, 7 yd/s) is not reproduced, because the cache gate needs a pure function; it converges to this answer. ([`src/net/motion/spline.rs:789`](../crates/benilla-app/src/net/motion/spline.rs#L789)) - A first-pass values block the clear header byte left unwritten re-fires, for a live object, its last write's edges against the watch copy (`0x465570`, `0x466686`); benilla compares against this packet's copies, which hold none for it, because that way a stale edge never fires twice. ([`src/net/objects/update.rs:1093`](../crates/benilla-app/src/net/objects/update.rs#L1093)) - The create notify uses its lookup's result untested (`0x465c97`, `0x465d79`). For a first-pass create the clear header byte left unwritten, an object not live crashes the reference, and a live one runs the all-fields watch (`0x465d8e`) against its stale watch copy, re-firing its last write's edges as the values block above does; benilla's `notify` fires nothing for either, because the faults the reference's passes have on malformed packets are recorded, not copied. ([`src/net/objects/update.rs:1105`](../crates/benilla-app/src/net/objects/update.rs#L1105)) - On benilla's unattended reconnect, which the reference lacks, the world's VM survives the loss; because of that the clear signals its `PLAYER_TARGET_CHANGED` and usable refresh as a release's teardown does (`0x493a69`, `0x493a73`), still sending nothing, and the surviving target frame lets the lost unit go. ([`src/net/session.rs:310`](../crates/benilla-app/src/net/session.rs#L310)) #### no_install - With no install found, the dialog names the folders searched and how to supply one where the reference names its first missing archive, because benilla does not ship inside an install and the player has to say where theirs is. ([`src/no_install.rs:7`](../crates/benilla-app/src/no_install.rs#L7)) #### player - The reference re-projects the point's height onto the first walkable facet a zero-size box gather finds at the enemy (`0x60fe25`-`0x60fe51`); here it keeps the enemy's height. The snap radius is the stop, so the two differ only while swimming or on a steep facet. ([`src/player/approach.rs:417`](../crates/benilla-app/src/player/approach.rs#L417)) - Here it rides the deck, because the reference stores the world point unconverted and reads it back as deck-local (`0x60fe6c`, `0x610e95`) and so, on a transport, walks astray. ([`src/player/approach.rs:420`](../crates/benilla-app/src/player/approach.rs#L420)) - Here the deck is fixed at the arm, because the reference converts back through the transport the player stands on each frame (`0x610e6b`), so stepping off mid-walk sends the point astray. ([`src/player/approach.rs:450`](../crates/benilla-app/src/player/approach.rs#L450)) - Here the melee walk does not turn, because the reference's melee arm names the player's own guid (`0x60fe5f`), so it turns to face itself, a fixed heading. ([`src/player/approach.rs:666`](../crates/benilla-app/src/player/approach.rs#L666)) - The shape is kept, its scale anchored to `LOOK_SENSITIVITY` on both axes at the default speeds, because the unit factor is a per-machine OS setting and this keeps the shipped feel: both axes turn alike, where the reference's yaw turns 1.5× faster than its pitch. ([`src/player/camera.rs:121`](../crates/benilla-app/src/player/camera.rs#L121)) - A delay holds the channel at `from`, because the reference's `0x512830` backs the start time up by the delay, so `s` runs negative and the even cosine jumps the value away and back, an unclamped divide rather than a behaviour. No default reaches it: every `cameraTerrainTilt*` row's `Delay` is 0, and the pitch and bias arms pass 0. ([`src/player/camera_channel.rs:13`](../crates/benilla-app/src/player/camera_channel.rs#L13)) - A code table, not the reference's ninety `cameraTerrainTilt