Files
sacred_k/tools/names.txt
T
khallaandClaude Opus 5.5 84c50d8c33 WASD: direction movement steers the walk path directly
The keys rewrite the hero's path every cCreature::Update: one segment
along the held direction, the facing set to it, sliding along blocked
cells. Starting from idle runs the game's own Think steps at once
(StartPendingWalk, WalkAction) instead of waiting up to 110 ms, so
weapon switches no longer stop the walk. Stops wait 50 ms after the
keys are released, and a stop in progress is taken back when keys are
held again. Names for movement, stats and text-key functions.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 03:18:51 +02:00

295 lines
19 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