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