The game drew 2x2 px red dots per visited-sector neighbour (0x6c8580), in 64-tile steps and unrelated to the explored mask. Replaced by lines traced from the explored cells (2x2 tiles), simplified to 0.75 px, rebuilt while the map is open when the masks change. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
440 lines
33 KiB
Plaintext
440 lines
33 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
|
|
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)
|