# Function names for sacred.exe (Sacred Gold 2.28), applied to the Ghidra
# project by tools/rename.ps1. One "0xADDRESS Name" per line; "Class::Method"
# names go into a class namespace. Keep in sync with src/game/addresses.h.

# --- startup / engine core ---------------------------------------------------
0x0066f1c0 Log
0x00813140 CmdLineHasFlag
0x0066e500 GetMouseClientPos
0x008122a0 MainWindowProc
0x00849701 __RTDynamicCast
0x0084aa86 ToUpper

# --- renderer ----------------------------------------------------------------
0x00645390 DxDriver7::SetDisplayMode
0x00645f70 DxDriver7::Flip
0x00646f50 DxDriver7::BeginScene
0x00646fd0 DxDriver7::EndScene
0x006469d0 DxDriver7::LoadingScreen

# --- kernel event queue ------------------------------------------------------
0x00808490 Kernel_Instance
0x00808930 cKernel::PostEvent       # (event, flags, delayMs); key events (category 4) are queued
0x008087b0 cKernel::DispatchQueued

# --- engine (cEngine, vtable 0x88ff34) ---------------------------------------
0x0060e3f0 cEngine::RenderThreadLoop
0x0060f1d0 cEngine::Tick            # per game tick (10 Hz): queued events, then hold-to-move orders
0x00618130 cEngine::ReceiveEvent    # vf00: offers events to the UI, then engine hotkeys (A, P, Q/W/E/R/B/Space, ^)
0x00617360 cEngine::HandleMouseButton  # click: pick object / walk to ground point
0x006170d0 cEngine::SendCreatureOrder  # (creature, cEvent_creature*): snaps ground targets, then creature->vf18
0x00611f10 cEngine::UpdateCursorPick   # per frame: object under the cursor
0x00610650 cEngine::ScrollInput        # arrow keys: walk object #2 or scroll the camera
0x00613040 cEngine::UseActionSlot      # hotkeys Q/W/E/R/B/Space
0x00613710 cEngine::CaptureScreen      # save-game thumbnail

# --- objects / creatures -----------------------------------------------------
0x005fe060 cObjectManager::GetObject   # (id); manager at *0xad3bc0
0x00603e90 cObjectManager::GetPlayerHero
0x00546ed0 cCreature::IsWalking        # state +0x150 == 1
0x0052e400 cCreature::ReceiveOrder     # vf18
0x004fb620 cCreature::TraceToCursor    # line trace from the creature to the cursor's world point (aiming)

# --- mouse cursor (single instance) ------------------------------------------
0x006550f0 MouseCursor_Instance
0x00654e10 cMouseCursor::cMouseCursor
0x00655670 cMouseCursor::SetPosition
0x006559e0 cMouseCursor::GetX
0x006559f0 cMouseCursor::GetY
0x006559a0 cMouseCursor::GetPreviousPosition
0x006555e0 cMouseCursor::DrawItem
0x00655ab0 cMouseCursor::IsButtonHeld

# --- world view (cWorldView0, vtable 0x8900f8) -------------------------------
0x00624ae0 cWorldView0::SetupView
0x00628210 cWorldView0::SetZoom
0x006322b0 cWorldView0::Render
0x0062a730 cWorldView0::UpdateCamera
0x0062b000 cWorldView0::RenderTileRow     # tiles + collects objects into the draw lists
0x0062e580 cWorldView0::DrawObjects
0x006300d0 cWorldView0::DrawObjects2
0x00623c40 cWorldView0::WorldToScreen
0x00623a20 cWorldView0::ScreenToView
0x00626d30 cWorldView0::PickObjectAt      # (screen x, y) -> object id
0x00627260 cWorldView0::DrawObjectLabels  # Alt
0x006426a0 BuildOrthoMatrix

# --- UI ----------------------------------------------------------------------
0x00756820 UiManager_Instance             # *0x17ecb3c
0x00756940 cUI_Manager::ThreadLoop
0x00757120 cUI_Manager::ReceiveEvent      # vf00: UI hotkeys (C F H I L M N O S T)
0x007587b0 cUI_Manager::Render
0x0075a860 cUI_Manager::GetFocus
0x0075a370 cUI_Manager::IsUiAtPoint
0x0075bbf0 cUI_Manager::DrawStatusLine
0x0075c200 cUI_Manager::DrawMessage
0x00731d40 cUI_Window2::HitTest
0x006dfb10 cUI_Taskbar2::HitTest
0x006e1970 cUI_Taskbar2::HandleEvent      # digit keys: 1-5 weapon sets, 6-0 combat-art slots
0x006e1440 cUI_Taskbar2::SelectWeaponSet  # digits 1-5
0x006e17d0 cUI_Taskbar2::SelectSkillSlot  # digits 6-0: right mouse button combat art
0x006e3ac0 cUI_Taskbar2::Render
0x006e7300 cUI_Tooltip::Render
# cInventoryEntry (32 x 0x1180 in one block, see docs/skill-slots.md)
0x005deb80 cInventoryManager::Instance        # allocates 32 inventories (0x23008 bytes)
0x005dec50 cInventoryManager::GetInventory    # index * 0x1180
0x005d7a10 cInventoryEntry::Construct
0x005d7bf0 cInventoryEntry::Destruct
0x005d7d30 cInventoryEntry::Clear              # zeroes grid, weapon sets, art slots
0x005d80e0 cInventoryEntry::ReplaceItemId      # grid + weapon sets
0x005d86c0 cInventoryEntry::GetWeaponSetItem   # (set, hand)
0x005d86f0 cInventoryEntry::SetWeaponSetItem   # (set, hand, id, notify) -> network 299
0x005d8930 cInventoryEntry::SetWeaponSet       # (set, left, right, notify) -> network 300
0x005d8be0 cInventoryEntry::TakeWeaponSetItem
0x005d8d00 cInventoryEntry::GetWeaponSetItemPos
0x005d9200 cInventoryEntry::SetArtVariant      # 0x1162 bit 2: second art slot set (mounted?)
0x005d93e0 cInventoryEntry::GetArtSlotType
0x005d9420 cInventoryEntry::GetArtSlotRef
0x005d9480 cInventoryEntry::SetArtSlot         # -> network 0x129
0x005d9680 cInventoryEntry::ClearArtSlot       # -> network 0x12a
0x005d9820 cInventoryEntry::SelectSlot         # (slot, kind 0 weapons / 1 arts) -> +0xd58
0x005d9b60 cInventoryEntry::GetSelectedSlot    # (kind)
0x005dd9f0 cInventoryEntry::Serialize          # (stream, write)
0x005de8a0 cInventoryEntry::FixInventory
0x005da880 cInventoryEntry::GetPotionRef
0x0043f630 ItemPotionKind                  # (ecx = item type table *0xaa9564, type): potion kind 1-5, 0 = none
0x006e39e0 cUI_Taskbar2::RenderPotionSlots  # 5 potion kinds, controls at +0x258 (stride 0xbc)
0x005d9ec0 cInventoryEntry::PlaceItem      # (cell, id, w, h, notify) -> network 0x13f; returns the item it replaced
0x005da290 cInventoryEntry::GetItemAt      # (cell, resolve covered cells)
0x005da360 cInventoryEntry::CountItems
0x005da390 cInventoryEntry::RemoveAt       # (cell, notify) -> network 0x13e
0x005da5f0 cInventoryEntry::RemoveItem     # (id, notify)
0x005dab60 cInventoryEntry::FindFreeSpace  # (w, h, out cell, mode)
0x005dac70 cInventoryEntry::FitsAt         # (cell, w, h)
0x005db670 cInventoryEntry::Sort           # (mode): the inventory window's sort button, trader stock
0x005dc3f0 cInventoryEntry::DrawItems      # (renderer, flag)
0x005dd530 cInventoryEntry::CellRect       # (out rect, cell): 32x32 from the origin at +0x1164 / +0x1166
0x0054a8f0 cCreature::UseItem              # (id): event 0x10 to the item; used up -> RemoveItem + DestroyObject
0x005fbe10 cObjectManager::DestroyObject   # (id, 1, 0, 0)
0x005ca9d0 cPotion3D::ReceiveEvent         # vf18: drink effect, sets +0x14 bit 0x8000000 (used up)
0x00613040 cEngine::UseActionSlot          # (potion kind, ...): potion keys
0x006c5f40 cUI_Inventory3::HandleEvent     # sort button (+0x158) -> cInventoryEntry::Sort
0x006c1210 cUI_InventoryTab::Render        # grid origin (0, 0x188), DrawItems
0x0057f750 SlotCountForLevel                   # table 0x95503c, max 5
0x008110d0 GameWindowProc                    # in-game window procedure: keys (dead keys, modifiers 0x182cdec)
0x005def60 cInventoryManager::Serialize      # (stream, write, x): all 32 inventories, save games
0x005d9450 cInventoryEntry::GetArtSlotData
0x005de4e0 cInventoryEntry::CollectItemIds     # grid items only
0x0055fac0 cCreature::AssignArtToSlot         # (art, slot), rejects slot > 4
0x006046f0 ItemDataMgr::saveHero
0x00605900 ItemDataMgr::loadHero
0x006dffa0 cUI_Taskbar2::SetSlotCount       # shows the first n slots of each row, n from SlotCountForLevel
0x006e4ba0 cUI_Taskbar2::Layout             # creates the slot controls and buttons
0x006dfce0 cUI_Taskbar2::SkillSlotAt        # (x, y, out slot)
0x006dfd40 cUI_Taskbar2::WeaponSetAt        # (x, y, out slot)
0x006df9a0 cUI_Taskbar2::UpdateSlotHighlight
0x006e2790 cUI_Taskbar2::RenderWeaponSets
0x006e31e0 cUI_Taskbar2::RenderArtSlots
0x006e4310 cUI_Taskbar2::UpdateTooltips
0x0081c020 Options::CombineSlots              # COMBINE_SLOTS: weapon set also selects the art slot
# combat arts
0x0052e400 cCreature::ReceiveOrder           # vf18; order 0x105 (use art) at 0x52fc58
0x006170d0 cEngine::SendCreatureOrder
0x005521e0 cCreature::ResolveArtId           # art variant for the creature class (+0x10)
0x00580cb0 cArtCooldowns::IsReady            # (art): cooldown <= 0.01
0x00548ef0 cCreature::IsAlive
0x004d1930 CombatMoveDef::Find              # (id) -> g_combatMoveDefs entry
0x004d2150 SpellDef::Find                   # (id) -> g_spellDefs entry
0x004d1a20 CombatMoveDef::UsableMounted     # flags +0x74
0x004d23e0 SpellDef::UsableMounted          # flags +0x90
0x0094ddb0 g_combatMoveDefs                 # 95 x 0x78: id +0, icon name +0xc, target type +0x4c
0x00950a38 g_spellDefs                      # 71 x 0x94: id +0, icon name +0xc, target type u16 +0x3c
0x0095503c g_slotCountByLevel               # (level, slots) u16 pairs
0x009ed058 g_taskbarSlotColors
0x00ad23c8 g_inventoryManager
0x00ad3bc0 g_objectManager
0x0051d680 cCreature::IsValidArtTarget     # (pick, launch type): can the art be used on the picked object
0x0051d670 NormalizeArtId
0x00548f20 cCreature::IsAlly               # (object id)
0x00548e70 cCreature::IsEnemy              # (object id)
0x00611f10 cEngine::UpdateCursorPick         # cursor target for the selected art
0x00548060 cCreature::ChooseAiArt          # monsters: art per creature class
0x00582c10 cCreatureArts::AddEffect          # (kind, value, factor, duration, art, notify, ...): active effects at +0x11a
0x00539ce0 cCreature::StartArtCooldown      # AddEffect(0x22, ...)
0x004feef0 cCreature::ArtCastEffect         # per-art effect of using an art (switch on art id)
0x005fbaa0 cObjectManager::CreateAt         # (type, position, ...): object placed in the world
0x005fb590 cObjectManager::Create          # (type, 0, 0, 0) -> id; loadHero creates items with it
0x005fb040 cObjectManager::Allocate
0x004514d0 ObjectFactory::Create            # (class, ...)
0x005fcd10 cObjectManager::Place            # (id, position); refuses dead objects (+0x14 & 0x10)
0x00602d70 cObjectManager::Load             # objects from a save stream
0x005a0980 cObjectFX::Construct
0x005a37b0 cObjectFX::ReceiveEvent         # vf18; cEventFX 0x42 attaches it to an owner
0x0041e0a0 cEventFX::Construct
0x009eaee0 g_uiAtlasEntries                 # 0x54 each: texture +0, uv +4..+0x10; indexed by icon id (art icons, 3 per art)
0x009ed030 g_uiTaskbarSlotBackground        # atlas entry: slot control background
0x009ed084 g_uiTaskbarSlotBackgroundSelected
0x009f7f14 g_uiTaskbarArtFrame              # atlas entry: frame over an art slot
0x009f4be4 g_uiTaskbarArtFrameSelected
0x009f5d9c g_uiTaskbarArtFrameDropTarget    # while dragging an art
0x00581c00 cArtCooldowns::Find               # (art) -> entry index (also an art's variants); count if none
0x005829c0 cCreatureArts::HasEffectOfArt     # (art): any active effect of the art (+0x1c)
0x00553840 cCreatureArts::FindEffectByKind   # (kind) -> entry or null
0x00582710 cCreatureArts::RegenFor           # (art) -> regeneration amount (float)
0x00562330 cCreatureArts::AddGroupRegen      # (amount, group, filter): adds to every cooldown entry of the group
0x00536f20 cCreature::DistanceTo           # (object id)
0x00ad1c60 g_nearbyCreatures              # {object id, ?} x g_nearbyCreatureCount, creatures near the player
0x00ad1b48 g_nearbyCreatureCount
0x0049a090 cDialogManager::Answer          # (owner, answer): cEvent_creature 0x10c to all heroes (ends the dialog lock); answers < 100000 -> quest script 0x46bd80
0x0046bd80 Script_RunLabel                   # cdecl (label index, ?, ?): script labels 0xaa9688 (0x54 bytes, quest +0x48); runs only once the label's quest is triggered
0x006e7120 cUI_Tooltip::HandleEvent        # dialog answers: click on an entry (+0x2188 list) -> hide, cDialogManager::Answer
0x0075a870 cUI_Manager::TooltipCreate      # a panel from the pool at +0x124
0x00756ba0 cUI_Manager::HandleEsc
0x00731ee0 cUI_Control2::ClearFlags        # (flags): bit 0 = visible (hide)
0x00aaaf00 g_dialogManager
0x006360e0 cRecordCache::Get              # map at +0xde5c, LRU (see docs/performance.md)
# Character panel, points (docs/respec.md)
0x006a5dd0 cUI_StatisticsChar::HandleEvent
0x006a9be0 cUI_StatisticsChar::Render
0x006ac120 cUI_StatisticsChar::Layout
0x00580d50 cCreatureArts::RaiseAttribute     # (row): + of the attribute panel
0x005a03a0 cCreatureArts::AddAttributePoints # (index, delta), index 7 = free points
0x00582280 cCreatureArts::SkillIdAt          # (row)
0x005822c0 cCreatureArts::SkillLevelAt       # (row, boughtOnly)
0x00582360 cCreatureArts::AddSkillLevels     # (row, delta, spendFreePoints)
0x00580f30 cCreatureArts::ChoosableSkills    # (out[8]) -> count
0x00580fe0 cCreatureArts::ChooseSkill        # (skill id)
0x00579560 cCreatureArts::Recalculate        # (0, 1) after point changes
0x0072af90 cUI_Button::Render
0x006ac8b0 cUI_Chest::Render                # vf14: DrawItems on window +0x158 (inventory 0x11)
0x006acc70 cUI_Chest::HandleEvent           # vf10: grid clicks via +0x158; Shift+click -> MoveItem(0x11, hero)
0x005dec80 cInventoryManager::MoveItem      # (from, to, id, ?): into free space of `to`
0x0060d5e0 cEngine::~cEngine
0x006ac7f0 cUI_Chest::cUI_Chest
0x00728ed0 cUI_TabSheet::cUI_TabSheet      # (name, rect, parent, 5), ret 0x18
0x007290d0 cUI_TabSheet::AddTab            # (text id, page), ret 8
0x007290b0 cUI_TabSheet::SetMode
0x007291d0 cUI_TabSheet::SetActive
0x007291f0 cUI_TabSheet::GetActive
0x00729210 cUI_TabSheet::Layout            # headers in a row above the sheet
0x00729000 cUI_TabSheet::HandleEvent
0x00729080 cUI_TabSheet::Render
0x007278f0 cUI_TabControl::cUI_TabControl
0x007286e0 cUI_TabControl::AddTab
0x00728af0 cUI_TabControl::SetActive       # hides the old page, shows the new (vf24)
0x00728090 cUI_TabControl::Render
0x006728c0 TextManager_Instance
0x00672f70 TextManager::GetText            # (id) -> {begin, end, cap} wide string
0x008485e2 operator_new
0x00727120 cUI_Window2::AddControl
0x0043f5f0 ItemIsConsumable                 # (type): class 9 (potion) or 0x1c (rune)
0x006d54e0 cUI_MasterLotto::HandleEvent      # rune master: 4 rune slots
0x00655710 cMouseCursor::SetItem           # (descriptor, 0,0,0, 1f,1f,-32,-32), ret 0x20
0x006e6560 cUI_Tooltip::~cUI_Tooltip
0x006d3d50 cUI_MasterLotto::UpdateChoice    # after slot changes: arrows, chosen rune (+0x7b4)
0x006d3fd0 cUI_MasterLotto::doLottoSelect   # (hero type, 0 prev / 1 next / 2 keep), ret 8
0x006d42a0 cUI_MasterLotto::Buy
0x006d4390 cUI_MasterLotto::Refresh         # (char), ret 4
0x006d3ce0 cUI_MasterLotto::TryPay          # (pay): gold >= price[runes]; pays if pay
0x006d3c90 cUI_MasterLotto::RuneCount
0x006d4180 cUI_MasterLotto::RandomRune      # (hero type or 0), ret 4
0x006d4720 cUI_MasterLotto::Render
0x0057fc40 cCreatureArts::AddGold           # (amount; negative pays)
0x006d5d90 cUI_Button::SetColours           # (colour set) -> +0x54..+0x60, ret 4
0x0044a420 cItemBase::GetName                # wide text of the type's name id (or +0x3c)
0x004ec3a0 cCreature::UpdateCollect         # mode 0xc; substate 0 searches rings of cells (cmp edi,-20 at 0x4ec8c6)
0x004ec170 cCreature::CanCollectItem       # (item object), ret 4; pickup filter, no distance check
0x00592ef0 WideString_Append                 # thiscall (first, last, 0), ret 0xc; {begin,end,cap}
0x00589270 cCreatureArts::ArtTooltip        # (art, text*, flag), ret 0xc
0x004ae330 cInterpretSQW::Teleporter        # script: adds the portal bit (hero +0x578), posts busy dialog mode 5/6
0x00720180 cUI_BusyDlg::SetMode             # (mode, a, b), ret 0xc; 5 = known portals
0x00720c10 cUI_BusyDlg::HandleEvent         # UI event 0x39 to DEFAULT_BUSYDLG, +8 == 2: SetMode(+0xc)
0x0054d840 cCreature::Teleport              # (x, y, 0, 1), ret 0x10
0x00553080 cEvent_UI::cEvent_UI             # (type, target, sender, a..f), ret 0x24
0x00428700 cItemTypeTable::NameText         # (type), ret 4: text id of the type's name (+0x20)
0x0054a8f0 cCreature::UseItem               # (id), ret 4: event 0x10 to the item, removes it if used up
0x00581290 cCreatureArts::SetCombo            # (index, arts[4], levels[4], id), ret 0x10: fills a combo, computes its total
0x005818e0 cCreatureArts::ComboChargeFraction # (index) -> charge / total, max 1
0x00581920 cCreatureArts::IsComboReady        # (index): total <= charge
0x005819a0 cCreatureArts::FindCombo           # (id) -> index, 4 if none
0x00581410 cCreatureArts::ComboTooltip        # (index, text, mode)
0x004d2970 FindComboDef                       # (0x200..0x204) -> 0x30-byte entry at 0x953348

# --- movement (WASD direction movement, 2026-10-18) ---------------------------
0x00594110 cCreature::Update                  # (u8), ret 4; ~40/s: walks the path (+0x2ed) into g_creatureNewPosition, Place
0x00593c50 cCreature::CanStepTo               # (x, y, position*), ret 0xc; refuses an unwalkable other cell; side effects
0x004f7b20 cCreature::IsCellWalkable          # (cell position*), ret 4; read-only
0x00593290 cCreature::BlendToAnimation        # (anim, duration, speed, scale): Granny cross-fade
0x0054e540 cCreature::ResetToIdle             # (notify, any level): idle animation, action 0 phase 1, pending 0 (weapon class change)
0x00622570 MapPosition_Init                   # {u16 area, x, y, u8 level}
0x00622590 MapPosition_Set                    # from (area, x, y, level)
0x006225c0 MapPosition_ToCell                 # world units -> cells (/ 53.66563)
0x00ad2368 g_creatureNewPosition              # MapPosition the walk step computes before Place
0x0065f010 cTextureCache::Get                 # (id): loads on demand, touches the LRU
# --- UI edit control ---------------------------------------------------------
0x00737ae0 cUI_EditControl::Render            # vf14, ret 4; returns at once while hidden
0x007372b0 cUI_EditControl::HandleEvent       # vf10
0x00546df0 cCreature::WeaponClass             # (0) -> motion set index
0x004dbaa0 cCreature::ContactDistance         # (other): mean of the body radii
0x00537430 cCreature::Think                   # vf04 (float elapsed), ret 4; ~every 110 ms: pending action (+0xfc), then the action's handler
0x004ede70 cCreature::StartPendingWalk        # (): pending walk (+0xfc 2) -> action 1, params +0x100 -> +0x154
0x004f45b0 cCreature::WalkAction              # (): walk action handler; phase 0 plans the path, facing, animation
# --- statistics / survival bonus (2026-10-18) ----------------------------------
0x00425160 cStatsManager::Instance            # cdecl (player id, ignored) -> record at 0xaa3518
0x00424930 cStatsManager::AddTime             # (float s, alive): play time (+0x56f8 h, +0x56fc min, +0x5700 ms), survival +0x570c ms
0x004245a0 cStatsManager::OnHeroDeath         # deaths +0x56f4 += 1, survival time = 0
0x004245c0 cStatsManager::Deaths
0x00424520 cStatsManager::SurvivalSeconds     # +0x570c / 1000
0x00424540 cStatsManager::SetSurvivalSeconds  # (s), ret 4
0x00424560 cStatsManager::CountSpawn          # +0x5710 u16 (random spawns near the hero, 0x45ff50)
0x00424ce0 cStatsManager::Serialize           # (stream, write): ends with magic 0xF00DF00D; survival time not included
0x00565c30 DiminishingCurve                   # (min, x, half, max): 0 below 1, else min + 2(max-min)(1 - 1/((x-1)/half + 1))
0x006046f0 ItemDataMgr::saveHero              # 0x22c header + 0x40 block (+0 deaths, +8 survival s, +0xc spawns)
0x00605900 ItemDataMgr::loadHero
0x00672fd0 TextManager::GetTextByKey          # (key string): id = hash 0x80e010
0x0080e010 TextKeyHash                        # h = (h*113 + toupper(c)) % 999999991, & 0x7fffffff
0x00565f30 cCreatureArts::ApplySkill          # (skill, level, describe out, ...), ret 0x18: skill effects, or their text
0x00565c80 cCreatureArts::ApplySkillToArts    # (arts[], start, level, half, limit, attack, out, nameText), ret 0x20
0x0054a110 cCreature::HoldsRangedWeapon       # Geschick instead of Stärke for physical damage
0x004d1c50 CombatMoveDef::LinkedSpell         # spell id whose values the combat move uses, 0 if none
0x0043ac50 TypeTable::CreatureRecord          # (type), ret 4: class record (+0x16: 16 skill ids)
0x006e6630 cUI_Tooltip::FormatText           # (char), ret 4: copies +0x115c to +0x2168, wraps at 45 chars with flag 0x80
0x006e6ae0 cUI_Tooltip::SetText              # (textId, text*, fixedWidth), ret 0xc
0x006e7730 cUI_Tooltip::Layout               # measures the text, width = longest line + 8 unless flag 0x100
0x0075ac70 cUI_Manager::ShowTooltip          # (x, y, text, ?, flags, show)

# Character selection / export screen (cUI_Character)
0x0070c760 cUI_Character::SetMode          # (mode), ret 4: +0x390 (4 selection, 5 export, 6 overwrite confirm)
0x0070c440 cUI_Character::SelectSlot       # (char slot, -1 none), ret 4
0x0070d0f0 cUI_Character::ExecuteAction    # (action, slot, extra), ret 0xc: 6 export into slot, 9 export (confirm if occupied)
0x0070e650 cUI_Character::OnConfirmButton  # the right-hand button (Exportieren, ...)
0x007f01a0 HeroSlots_DeleteHero           # (slot + 1), thiscall on 0x7d7c40(), ret 4: deletes Save\Hero%02d.pax
0x00731e70 cUI_Control2::SetFlags          # (flags), ret 4: bit 0 = visible (show)
0x00716570 cUI_Options::cUI_Options          # (name, rect, parent, flags) ret 0x18
0x007165f0 cUI_Options::~cUI_Options
0x007184e0 cUI_Options::CreateControls       # frames, labels, buttons, sliders (vector +0x90)
0x00717ea0 cUI_Options::LoadSettings         # settings -> controls, on show
0x00717460 cUI_Options::Apply                # controls -> settings (OK)
0x00739f90 cUI_Frame::cUI_Frame
0x0043fa90 PotionTooltipText                 # (kind 1..5), ret 4: bar tooltip text id by key ("<color>Heiltrank <colorw>[SPC]")
0x00724ed0 cUI_Window2::AddBackdrop          # (rect*, ARGB), ret 8: translucent cUI_Static into +0x90
0x0075a690 cUI_Manager::CanOpenWindow        # (1), ret 4: false while a blocking window is open
0x007320c0 cUI_Control2::SetTooltipText      # (text id) -> +0x20, ret 4
0x007320d0 cUI_Control2::TooltipText         # +0x20 once hovered long enough, else 0
0x0043ae20 cItemTypeTable::IsGold             # (type), ret 4: one of the four gold pile types (0x947920)
0x00433f00 cItemTypeTable::GetGroup           # (type), ret 4: group record (0x102 bytes), +0x23 set item
0x00428550 cItemTypeTable::IsAlwaysCollected  # (type), ret 4: CanCollectItem takes it whatever PICKUPAUTO
0x005c1330 cItemBase::GetColour               # (quality block or 0), ret 4: name colour by quality tier / set
0x00559a30 cCreature::DropLoot                # (forced type, ?, ?, killer), ret 0x10; "Drop from [%d] %s"
0x005c9b10 cChest3D::dropItems                # (?), ret 4: throws out the contents (ids at +0x1e4)
0x006116c0 cEngine::dropItem                  # the player's drop into the world
0x005fc910 cObjectManager::RemoveFromMap      # (id), ret 4
0x00819580 Options_PickupAuto                 # PICKUPAUTO from the config (0 all, 1 valuable, 2 gold)
0x0061d190 LoadHeroFile                       # cdecl (path, 1, 0): a hero file onto the player hero (whole object, position too)
0x0061cda0 cEngine::SaveHero                  # cdecl (path): the player hero as a hero file
0x0061b790 cEngine::Load                      # (path, quiet), ret 8: reads a GAME.PAK
0x00619c90 cEngine::Save                      # (path), ret 4; render thread, engine +0x54 & 0x40
0x0060dc00 cEngine::InitGame                  # (int), ret 4: new game, start hero
0x0071c4f0 cUI_Savegame::SetMode              # (mode), ret 4: 1 save, 2 load (+0x75c)
0x0071cfb0 cUI_Savegame::Show                 # vf24 (bool), ret 4: picks save mode in a game
0x0071c520 cUI_Savegame::Action               # (action), ret 4: 2 save, 4 load, 8 delete, 10 rescan, 0xb default
0x0071e330 cUI_Savegame::Scan                 # (dir, multiplayer), ret 8: "./SAVE/*.PAK"
0x0071be90 cUI_Savegame::SendSaveLoad         # (kind, row): engine event 0xf
0x00755ac0 cCommand_armaPlay::execute         # posts 0x8002 (mode, argument) to the main window
0x00755b30 cCommand_armaStop::execute         # vf04, plain ret: ends the game, posts 0x8001 to the main window (engine deleted, main menu)
0x007d7c40 Session_Instance
0x007d7cf0 Session::SetHeroClass              # (class) -> +0x44, ret 4
0x00417e50 GameSetup_Instance                 # 0x12e6c bytes; +0 set by both character-screen starts
0x006bb870 cUI_EscMenu::BuildLines            # line actions; "Spielstaende" text 0x41b at 0x6bc1f7
0x00810af0 BringWindowToFront                 # (hwnd, timeout), ret 8; loops forever with timeout -1
0x0072ad60 cUI_Button2::SetCaption            # (text id, font), ret 8 -> +0xa4 / +0xa0
0x00712f30 cUI_MainMenu::BuildEntries     # thiscall, plain ret: the menu entries (cUI_StaticText64FX); main page vector +0x158
0x00711fa0 cUI_MainMenu::HandleEvent      # vf10: sets g_campaign 0x182cdc8 by entry name (NEWGAME 0, NEWADDON 1)
0x00753d70 cUI_StaticText64FX::cUI_StaticText64FX  # (name, rect, parent, ?, text id, command, flags)
0x0070e2a0 cUI_Character::Show               # vf24 (shown), ret 4: single player + g_campaign 1 -> mode 7 (Underworld import, level 25+)

# cUI_NetGranny: 3D hero view (game/ui/granny.h)
0x006f06f0 cUI_NetGranny::cUI_NetGranny    # (rect by value), ret 0xc
0x006f17f0 cUI_NetGranny::Render           # vf44 (device, 0, label), ret 0xc
0x006f4b20 cUI_NetGranny::SetHero          # (hero info, x, y, z, turn), ret 0x14
0x006f4ae0 cUI_NetGranny::ClearHero
0x006f0f10 cUI_NetGranny::SetLights        # (on): +0x53f white set
0x006f4d70 cUI_NetGranny::InitCamera
0x0070beb0 cUI_Character::LoadExportedHeroes  # Hero00..07.pax -> slot grannies +0x1b4

# Textures by name (game/ui/texture.h)
0x00656c80 TextureManager_Instance        # cdecl (), kept at 0x13e57b4
0x00657620 TextureManager::IdOf           # (name), ret 4
0x0065f010 TextureCache::Get              # (id, 0), ret 8; cache at 0x13e57b8, D3D surface +0x14

# Main menu (mods/screen.cpp)
0x007122c0 cUI_MainMenu::Render            # vf14
0x0075df10 MenuScene_Instance              # 0x1a84 bytes, kept at 0x17ecb40
0x0075e620 MenuScene::Render               # (1 argument), ret 4: sky + water (UI_UW_MAIN_CENTER, UI_MAIN_REF)
0x0075e820 MenuScene::Update               # (seconds)
0x005905f0 VerifyHeroMirror                # anti-cheat: local hero vs protected mirror (0x182cddc); resets mismatches, returns 1 if all matched (mods/anticheat.cpp)

# --- explored map (fog of war, 2026-10-25) -------------------------------------
0x00599730 RevealAroundHero                  # creature thiscall (tile x, y, sight 0..3), ret 0xc; stamps 0x88f5cc / 0x88f328 when the hero's tile changed
0x00638f00 World_SetExplored                 # thiscall (tile x, y, explored), ret 0xc; ecx *0xad14e0
0x00622bf0 Sector_SetExplored                # thiscall (tile x, y, explored), ret 0xc; bit in the 32x32 mask +0x180
0x00622c60 Sector_GetExploredMask            # (out 128 bytes), ret 4
0x00622c80 Sector_SetExploredMask            # (128 bytes), ret 4; from the save (0x606ae0)
0x00639030 Sector_BuildFogTexture            # FOGOFWAR01.TGA from a mask, for the zoomed map view

# --- quest book (2026-10-25) -----------------------------------------------------
0x0046c450 QuestManager_AddBookEntry          # thiscall (quest index, ?), ret 8; kind 3 for ids 1..99, chapter from the current main quest
0x00497830 QuestManager_BookEntryPosition     # thiscall (entry index, out), ret 8; from entry +0x18 / +0x1c
0x0049dd40 QuestManager_SelectedBookEntry     # thiscall; +0x3a0 + player * 8
0x0049dd70 QuestManager_MainBookEntry         # thiscall; +0x39c + player * 8 (= +0x3a4 for player 1)
0x004975d0 QuestManager_MarkerColour          # thiscall (entry, kind), ret 8; kind 0: side open blue ff006cff, main ffffff80, solved green, failed red
0x00497910 QuestManager_EntriesInSectors      # thiscall (sectors, out, open only), ret 0xc; book entries whose marker lies in the sectors
0x0049a7a0 QuestManager_CompassPos           # script QuestkompassPos: entry +0x10/+0x14 = cell, +0x20 radius ("rad:")
0x0049af70 QuestManager_CompassObject        # script QuestkompassOBJ: +0x10 = 0xffffffff + object id, or 0xeeeeeeee + script NPC id
0x004a6740 QuestManager_ResolveCompass       # thiscall (entry), ret 4; marker cell +0x18/+0x1c from the compass target
0x006b04c0 cUI_Book::BuildQuestList           # thiscall; rows per tab (chapter +0x16c), pages via PageFull
0x006b1670 cUI_Book::Rebuild                  # by book mode +0x166: 0 quests 0x6b04c0, 1 0x6b0ae0, 2 0x6b0190
0x006b1a70 cUI_Book::PageFull                 # thiscall (tab, page), ret 8
0x006b1cd0 cUI_Book::DrawDetail               # thiscall (renderer, record 0x40, sub-page), ret 0xc
0x006b27f0 cUI_Book::RenderPage               # thiscall (renderer, bookmarks only), ret 8
0x006b3620 cUI_Book::HandleEvent             # vf10, thiscall (event), ret 4
0x0043ad60 cItemTypeTable::IsQuestItem        # (type), ret 4: type +0x61 (script word QuestItem)
0x0043ad80 cItemTypeTable::GetQuestInfo       # (type, &questItem, &mainQuestItem, &quest, &quest+1), ret 0x14: type +0x1c/+0x61/+0x62
0x00622640 MapPosition_Set                    # thiscall (u16 sector, x, y, u8 layer), ret 0x10
0x00634970 World_SectorAt                     # thiscall (MapPosition*), ret 4: the sector object or null
0x00622e30 Sector_Region                      # thiscall: region number (sector +0x17c -> +0xd7)
0x00425370 Region_NameKey                     # cdecl (char region): name text key from the region name table 0xaa8ca8, or null
0x00425300 Region_GetInfo                     # cdecl (char region, out, out): table +0x38 / +0x30 of the region's record
0x006cb130 cUI_Megamap::WorldToMapPixel        # thiscall (out vec3, world vec3 x/y/level), ret 8: x * 0.007446 + 1018.75, y * 0.014914 - 186.95 (after 0x622700)
0x0054fa30 cCreature::IsQuestNpc               # thiscall, plain ret: +0x200 bit 0x100 / 0x200, or dialog +0x245 of a type < 50; white on the zoomed map view
0x00549790 cCreature::GetDialog                # thiscall: dialog +0x245, or a random NPC chatter text (returns 0xd431)
0x00544700 cCreature::IdleAction               # thiscall: Think action 0 handler; turns creatures with a dialog towards the local hero (0x546334)
0x0044df60 cCreature::SetDirection             # thiscall (x, y, z floats), ret 0xc: through 0x44ddc0
0x0044ddc0 cCreature::SetDirectionVector       # thiscall (vec3*, ?), ret 8: writes +0x70..+0x78
0x004265c0 TypeTable_IsKind4                   # thiscall (type table *0xaa9564, type), ret 4: the type's kind byte is 4
0x0049a180 cDialogManager::DialogType         # thiscall (dialog, creature), ret 8: record +0x48 of 0x50-byte records at +0x755c; creature flags 0x1000.. -> 0x20..0x23
0x0046de10 Quest_Trigger                      # cdecl (index, ?, ?): makes a quest available (flag 1, busy 8), runs its init label +0x114 once and its trigger label +0x10c
0x0046ced0 Quest_End                          # quest manager thiscall (index, ?, success), ret 0xc: book entry 100 / 101
0x00475970 Script_RunInstruction              # quest manager thiscall (code, &offset, quest, object, flag, 0), ret 0x18: one instruction; offset -1 reads from the FILE*
0x00498aa0 Script_Condition                   # thiscall: script conditions; case 0x40 "@npc": npc on the hero's follower list +0x39c (or +0x570)
0x0048f320 Script_StartQuest                  # opcode 0x14 #quest: needs quest flag 1; runs the trigger label, adds the book entry
0x0048f110 Script_EndQuest                    # opcode 0x0f: Quest_End of the current quest
0x00482800 Script_Spawn                       # opcode 1: spawns a creature ("Res:<script id>", type, position, 0x09 dialog, 0x05 death label, ...)
0x0048be30 Script_NpcMode                     # opcode 3: an NPC's mode (0x09 dialog, 0x0a follow + death label, ...)
0x00464ec0 QuestManager_ScriptObjectId        # thiscall (script id, &object id), ret 8: map +0x7668, then all objects
0x0044a390 cObject::ScriptId                  # thiscall, plain ret: +0x3c or the type's default
0x0044a380 cObject::SetScriptId               # thiscall (script id)
0x004b37b0 ScriptIdMap::operator[]            # thiscall (&key), ret 4: quest manager +0x7668
0x0054b070 cCreature::AddFollower             # thiscall ({u32 id, u32, u8}*), ret 4: hero +0x39c list, unless the id is in it
0x005145d0 cCreature::CombatMove              # combat arts' moves; case 0x43f Kanonenschuss, 0x43e Mörsergranate
0x005ab400 cObjectFX::GatherTargets           # effect objects collect their targets (0x5ff820 at 0x5ab63d, effect in ebx)
0x005ff820 cObjectManager::ObjectsInRange     # thiscall (out, position, type, only, radius = -1: type sizes), ret 0x14
0x00428bb0 TypeTable::ObjectSize              # thiscall (type), ret 4: +0x14, default 50
0x004fc810 Creature_StunChance                # (level, creature): level * 5 / creature level * 100
0x00633230 World_RebuildVisitedBorder        # thiscall: clears the 100x100 border bytes (+0xb73c) and runs 0x6332d0 for every sector with flag 0x20000 (visited); on load (0x471086, 0x60c621)
0x006332d0 World_UpdateVisitedBorderAround   # thiscall (sector cx, cy), ret 8: border byte of each unvisited 3x3 neighbour (0x6334f0)
0x006334f0 World_ComputeVisitedBorderCell    # thiscall (cx, cy), ret 8: 8 bits, one per neighbour sector with flag 0x20000
0x006336b0 World_VisitedBorderCell           # thiscall (cx, cy), ret 8: border byte, 0 outside 100x100
0x006c8580 cUI_Megamap::DrawVisitedBorder    # thiscall (device), ret 4: 2x2 px red (0xffff0000) dot per border bit, +-10/+-20 px from the sector origin
0x006c87c0 cUI_Megamap::DrawQuestMarkers     # thiscall (device), ret 4: quest book entries (0xaaaf00)
0x00622700 WorldToPlane                      # cdecl (out vec3, in vec3), plain ret: world units -> world pixels (iso matrix 0xad5710)
0x0062d530 cWorldView0::DrawGroundQuads      # thiscall (renderer), ret 4: the ground, before the objects
0x0041e0a0 cEventFX::Construct               # thiscall (code, owner, target, position 4 dwords, ...), ret 0x44
0x007b66b0 cParticleSystem_grenadeimpact::Render   # vf04 (device, matrix by value), ret 0x44; vtable 0x896cdc
0x007b64c0 cParticleSystem_grenadeimpact::Update   # vf08 (dt), ret 4; phase +0x20a9
0x007613e0 cParticleSystem::DrawParticles          # colour table row (+0x3d) * 256 + life (+0x2c)
0x00763ea0 cParticleSystem::UpdateParticles        # thiscall (dt, emitter rows, mode), particles 0x40 bytes at +0x68
