Files
sacred_k/tools/names.txt
T
khallaandClaude Opus 5.5 c7d54a6cfd Megamap: the zoom button zooms on the hero and follows him
The zoom button never set the zoom point, so it zoomed on the last
magnifier point (or 0,0). While the button's zoom is on, the point is put on
the hero's map pixel every engine tick; the held mouse button still zooms on
the mouse. game::UiWindow / UiWindowShown shared from windows.h.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 11:54:59 +01:00

411 lines
29 KiB
Plaintext

# 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
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)
0x0049a180 cDialogManager::DialogType # thiscall (dialog, creature), ret 8: record +0x48 of 0x50-byte records at +0x755c; creature flags 0x1000.. -> 0x20..0x23