UPDATE 12
==========================
New features — Localization & UI:
--------------
* Localization: HB-style i18n with 15 languages wired across the
entire UI (en, fr-FR, zh-Hans, zh-Hant, ru-RU, de-DE, es-ES, it-IT,
ko-KR, tr-TR, pt-PT, pl-PL, ja-JP, nl-NL, cs-CZ). Pattern follows
HB 6.2.3 strict: per-culture .resx files in Styx/Localization/,
MSBuild PostBuild target moves satellites into Languages/{culture}/
(HB folder pattern), ResxExtension markup extension
{loc:Resx Key=...} (HB Infralution pattern, simplified), App.config
with <probing privatePath="Languages"/> for runtime satellite
lookup. fr/zh/ru fully translated, others use EN fallback.
597 new resx keys, Globalization.Designer.cs generated,
gen_resx.py generator tool committed. Language picker GroupBox in
Settings (HB 6.2.3 CultureSelectWindow pattern),
Globalization.ApplyLanguage() hooked in App.xaml.cs OnStartup,
Language field in StyxSettings persisted to Settings.xml.
* Settings window: remove obsolete 'Meshes' GroupBox
(the bot reads its own DLL path via Navigation::GetMmapsPath() —
the setting was unused dead code).
New features — Navigation:
--------------
* nav: HB 6.2.3 4x4 sub-tile port. TileIdentifier.GetByPosition
inverted-convention bug fixed (worldX->tileX, worldY->tileY to
match Navigation::WorldToTile + MaNGOS file naming).
Navigator.EnsureTiles now actually calls EnsureTiles_C (was just
logging). Managed UnloadTile surface added (fail-soft if DLL
export missing). GetLoadedAdtCount for V5 4x4 ADT-level
diagnostic. MeshNavigator.OnPulse per-pulse tile streaming
(HB-faithful, no guard) with directional prefetch via
position-delta velocity. dtPathCorridor runtime exports/wrappers
removed (HB never uses it, 4 versions verified 2009-2017) —
PathFinder keeps internal usage only. BGBuddy.ChangeMap uses
MapId.ToString() instead of MapName. IMeshManager /
GarrisonMeshManager get UnloadTile interface method. 1x1 comments
updated to V5 4x4 references.
* Navigation: update movemap grid handling and API wiring
(Navigation::WorldToTile / MaNGOS file naming alignment).
Bug fixes — LevelBot:
--------------
* LevelBot: drop 1.5s blocking Sleep on OnMobKilled. StyxWoW.Sleep
on the main bot thread pauses EVERYTHING — targeting pulse, loot
pulse, move, combat. A 1.5s pause per kill is the entire reaction
window where LootTargeting could re-scan and pick up the corpse.
* LevelBot: spirit healer Sequence — fix ShouldUseSpiritHealer
never reset. The inner PrioritySelector in CreateSpiritHealerBehavior
had three children: (a) GossipFrame decorator -> select Healer
gossip, (b) Sequence(Lua.DoString('StaticPopup1Button1:Click()'))
-> always Success, (c) TreeSharp.Action -> AcceptXPLoss +
ShouldUseSpiritHealer = false. Child (b) always returned Success
before (c) could run, so the flag never reset.
* LevelBot: drop ConfirmLootSlot — Cataclysm+ API not present in
3.3.5a. ConfirmLootSlot() was introduced in Cataclysm for the
multi-loot window (multiple corpses in a single frame). WotLK
3.3.5a has only LootSlot() per single-corpse frame. The Lua call
was a silent no-op (or chat-error spam) and served no purpose
in our target client.
Bug fixes — DungeonBuddy:
--------------
* DungeonBuddy: ungate leader-movement behavior from SoloFarm mode.
CreateLeaderMovementBehavior now drives the dungeon via
Profile.BossEncounters.PathBreadCrumbs regardless of QueueType
(was SoloFarm-only in Update 11). Followers (DPS/healer) still
use CreateFollowBehavior.
Bug fixes — Combat / Styx:
--------------
* LocalPlayer.IsActuallyInCombat — drop FirstUnit guard, match HB
4.3.4. The FirstUnit guard was masking the actual combat flag
when the target list was momentarily empty during target swap.
* WeightSetEx: GetTalentTabInfo needs groupIndex + armor-class
guard. Talent lookup was returning the wrong tab for cross-armor
specs that share a class (e.g. Priest Holy/Disc/Shadow all map
to the same tab without the armor class filter).
* WoWGameObject: gather skill check — add skill.Bonus to effective
value. The gather check was comparing the base skill against
the required skill without including passive +skill bonuses
from gear / enchants / buffs, so nodes the character could
actually gather were flagged as "skill too low".
* SpellDb: add HasSpellByName — fallback for passive talent
detection (Vengeance, Meditation, etc.) by full name match against
the Spells.bin table for talents / passives the player hasn't
actively cast yet. Used by role identification in DungeonBuddy.
Minor:
--------------
* UI/SettingsWindow: update Discord invite link.
Version numbering:
--------------
This release: v1.5.0 (Update 12).
Previous: v1.4.2 (Update 11).
Minor-version bump because the release contains two major
user-facing additions (HB-style 15-language localization and the
4x4 sub-tile navigation port) plus a packaging restructure
(output/ runtime tree). Per HB / SemVer convention, additive
changes of this scope warrant a minor bump rather than a patch.