# Port plan per function: `step  regex  # note`. First match wins; matched against `Class::Method`
# (nested classes included), a free function's name, or `Owner::FUN_xxxxxxxx [(callback)|(static-init)]`
# for unnamed functions (owner traced by tools/funtrace.py). `python3 tools/inventory.py --unplanned`
# lists every unported function no rule places; `--steps` counts them per step.
#
# Steps: 4b.4 .. 4h, 5, 6, 7 = milestone steps (STATUS.md). 4b.5 = holes in finished work found by the
# coverage pass (closed after 4b.4, before 4c). online = ported later as a dormant stub (project
# decision). removed = real money (freemium removal). dead = nothing reaches it in 5.11.
# platform = reached only by a mobile platform event a desktop never sends (Android's lost GL context,
# its texture-memory limit); the port's call site carries a note.
# implicit = constructors, destructors, static initialisers, callback-object factories, allocators:
# the port's own class definitions and globals carry them (field defaults are read with the class).
# util = string/hash/parse helpers the port replaces with the C++ library or ports with a caller.

# ---- 7e (2026-10-27): the profiles (online, ported dormant: game/PlayerProfileManager) ----------------
online  ^PlayerProfileManager::(Init|Start|Stop|ChangeStateTo|ConnectedOffline|ConnectedFB|ConnectToOffline|ConnectToFB|OnAFB|GetFBInfoAndConnect|GetFBInfo|GetOfflineInfo|GetLocalInfo|CheckOfflineSave|CheckFBSave|HasOfflineReg|OnChangedID|OnRegistered|OnReassignedID|OnCriticalError|OnError|OnServerSaveInfo|OnCheckSocial|OnFBInfo|OnInfoReceived|ServerActionFailed|ServerActionFinished|ServerRequestCallback|Synchronize|ResetGame|ShowNoConnectionWarning|NeedToShowConnectFBWin)$   # the start-up state machine: NeighboursServer::Init, SocNets' login, CMyServer's requests (main_Loop_Init / main_Loop_Func's profile paths, the server's callbacks, FacebookSyncWindow); Init only resets the profiles' info (the server's) and reads "last_played_save"
online  ^SwitchProfilesWindow::   # only SettingsWindow::OnProfiles opens it (with a GUID), whose button shows only when the server's "profilebutton_enabled" is set; the Facebook / offline profile switch
online  ^GameState::GetGameStateInfo$   # only PlayerProfileManager::GetLocalInfo (the profiles' info cards)

# ---- 7c (2026-10-26): the restart -------------------------------------------------------------------
dead  ^SettingsWindow::(OnRestart|OnRestartConfirm)$   # SettingsWindow::Init gives the restart holder (icon_settings_restart, +0x24) no click; no call, GOT slot or literal of OnRestart anywhere; OnRestartConfirm only from OnRestart's popup
online  ^(HUDWindow::GameReset|ReloadSavedGame|GameState::RemoveWorkersFromOrders|FileManager::RemoveSaveFiles)$   # GameReset: PlayerProfileManager::ResetGame (the Facebook profile switch) and the dead OnRestartConfirm; ReloadSavedGame: the server's save callbacks, PlayerProfileManager::ResetGame and the dead console; RemoveWorkersFromOrders: those two, CleanBeforeLoading / GoHomeFromFriend (online), the dead GameReload / CmdLoadSaveLocal; RemoveSaveFiles: PlayerProfileManager::ConnectToOffline

# ---- 7b (2026-10-26): render / Retina ----------------------------------------------------------------
dead  ^Render::(didEnterBackground|willEnterForeground)$   # no caller
platform  ^(Render::(Suspend|Restart)|GUI::ReloadTextures|BuildingHovers::RestoreTextures|HUDWindow::RestoreTextures)$   # main_Loop_Func's render suspend / restore (Java's surface events, renderSuspendEvent 0x6123fc): Android loses its GL context in the background; a desktop's is kept (main.cpp's pause note). Restart's other "callers" are literals in three static initialisers
platform  ^Render::(FreeMemory|GetStatistics|UpdateTexTypeStats)$   # the textures unloaded past 40 / 50 MB (main_Loop_Func) and on Map::Free / ShowFarm / RemoveFarm: the port keeps the textures it loads (main.cpp's Tick note, Map.cpp, Background.cpp)

# ---- 7a (2026-10-26): the platform layer's leftovers (callers checked in 5.11: bl, GOT, literal) ----------
dead  ^(Animation::(DumpToResources|PreLoadTextures)|FileManager::Apply|Timer::GetFPS|Render::(getWindow|PrintLayerStats|CalculateFillrate|UpdateLogo|IsInitialized))$   # no caller (PreLoadTextures: only Entity::PreLoadAnimations, dead; UpdateLogo: only Game::showKoreanLogo, dead; IsInitialized: only EditorConsole::Print, dead)
dead  ^GUI::(GetHoverHighDPIScaleFactor|GetHudHighDPIScaleFactor|IsXHighDPI_Retina|SetXHighDPI_Retina|getXHighDPI_Retina_Scale|setXHighDPI_Retina_Scale)$   # no caller (IsXHighDPI_Retina: only getXHighDPI_Retina_Scale)
dead  ^SystemFuncs::(SaveSettings|getPlatform|IsTabletVersion|ShowOldDeviceError|GetTime|getDocumentsPathSpace|getBundleDisplayName|getBundleName)$   # no caller
online  ^SystemFuncs::(getScreenBuff\w+|getTimeIntervalSince1970|GetSettings_AllAsString|getTimeZoneOffset|getXDPI|getYDPI|getCurrentLanguageTxtLocale\w*|getEvenMoreLocaleInfo|getCurrentSelectedLanguage|getPlatformString\w*|getPlatformCPU|getPlatformVersion|getBundleVersion\w*|GetTemporarySettingString|SetTemporarySettingString|SetLogLevel|RemoveSetting|isDocumentExternalStorageExist|getDocumentsPathFileByMask|FUN_003d890c|getDocumentsPath)$   # callers only CMyServer / ServerFlags / NeighboursServer / OG / CheckExpansion (online) and CMyPayment's logs (removed)
online  ^FileManager::(GetThreadContext|ReleaseThreadContext|GetStoragePathSpace)$   # AsyncImageLoader / AsyncRequestRunner, Expansions::DownloadAll
util  ^FileManager::GetFileOffset$   # Resources::GetUIImage's cache key (the file's archive offset); the port's caches are keyed by the lower-cased name
implicit  ^(FileManager::IsLowPerformanceDevice|Render::Context::IsLowPerformanceDevice|Render::Convert32To16Bits)$   # Java's low-end device check (Sounds::IsLowQualityMode, Render::IsLowPerformanceDevice: false on a desktop, see Render.h) and CreateTexture's 16-bit textures (low-end only)

# ---- 5x-1 (2026-10-20): leftovers checked in the 5.11 binary (callers: bl, GOT, vtable, literal) ----------
dead  ^GameState::(GetSettingCount|EnumSetting)$   # only ContextSetting (the admin console's settings completion, dead: 5w)
dead  ^Map::(DebugAdvanceTime|ShowLevelStats)$   # no caller, no address taken (debug)
dead  ^(Render::CreateLine|Resources::GetSolidColor)$   # only Editor::AddWorldLine (the admin editor, dead: 5w)
dead  ^Map::Building::ChangeState$   # only Building::OnCoolDown / DoAttack / ProjectileLanded: the tower shots, dead
dead  ^(Shared::FarmButtonPlant::LoadFrom|BuildingPlacement::BuildingFromPresents|CastleTopWindow::OnArena|HUDWindow::(OnArenaEvent|SetCurrentCity))$   # no caller, no address taken
online  ^GameState::SetCurrentCity$   # only GameState::VisitFriendCity / GoHomeFromFriend (friends' cities)
online  ^MetaExpression::GetSummaryEffectsValue$   # only GameState::GetBIS's sort (BISSortFunc); GetBIS is online (PvP::GetBISItems)
lib  ^(dollar\w+|bestDollarDifference)$   # SDL2's $1 gesture recognizer (SDL_gesture.c, from SDL_GestureProcessEvent); no SDL_RecordGesture / template load in 5.11, so it never matches; SDL3 has no gestures (DECIDED 2026-10-20)

# ---- 5x-4 (2026-10-20): the screenshot mode (DECIDED: OK saves the framed picture as a local PNG) ----------
5x  ^(Render::(SaveImage|GetScreenData|GetSurfaceFromPath)|ViralFeatures::(PostScreenshot|BlitBiliniar|ColorCorrection)|FileManager::SaveImage)$   # BottomScreenshotWindow::OnConfirm -> Render::SaveImage -> PostScreenshot -> FileManager::SaveImage (PORT: a PNG)
5x  @1fc088   # Render::GetImageData(char const*, ...): PostScreenshot's cover (Resources::GetImageData)

# ---- 6a (2026-10-20): the audio engine (Sounds, SoundsManager) ------------------------------------------
dead  ^SoundsManager::UnpauseMusic$   # no caller, no address taken
dead  ^Sounds::(isInterrupted|willResignActive|interruptStart|interruptEnd)$   # Android's audio focus: no call, GOT slot or literal in 5.11 (isInterrupted only from the other two) (7d, 2026-10-26)
online  ^SystemFuncs::SetNotificationsEnabled$   # only ServerFlags' static table (_INIT_141): the server's switch (7d, 2026-10-26)
util  ^SoundsManager::DuplicateString$   # the event names' string pool (std::string in the port)
implicit  ^(Sounds::FUN_(00220cb0|002210a4|002213e8)|SoundsManager::FUN_0022424c)$   # the name -> sound / music / event std::map inserts

# ---- 4b.4: the item windows ------------------------------------------------------------------
4b.4  ^ItemHoverWindow::
4b.4  ^UseItemHoverWindow::
4c    @2bcffc   # FoundItemsWindow::SetParameters(Tasks::TaskInfo*, ...): with Tasks
5x    @2bd21c   # FoundItemsWindow::SetParameters(Locations::LocationInfo*, ...): only CampaignComplete / CampaignPerfected / RaidComplete (the global map's windows) call it
4b.4  ^FoundItemsWindow::
4b.4  ^NeedItemWindow::
4b.4  ^Items::GetItemOffsetInHolder
4b.4  ^GetProbabilityString$   # ItemHoverWindow's drop chances
4b.4  ^GetChanceString$
4b.4  ^Shared::(ItemHolder|ItemIconHolder)::

# ---- placed by the 4b.5 review: an overload or a stub of a later step, not a hole ----------
5x     @127294   # Map::Building::LaunchContract(Entity*): barracks training (HireTroopsWindow::OnTrain)
dead  ^(Map::Building::IsTrainingCompleted|Map::TrainingcontractRunning)$   # no caller in 5.11 (checked 2026-10-18)
5x     ^Map::Building::TrainingCompleted$   # barracks training
5x     @1d14d0   # MetaExpression::OnApplyItemEffect(int*, bool): crafting, player info, sets, character window
5x     ^HUDWindow::OnFarmTimer$   # opens RaidInfoWindow (the port's stub does nothing)
4d    ^(HUDWindow::OnFindTask|TaskHolderWindow::QuickTaskWindow::(Init|Update))$
4g    ^BattleBarWindow::Update$   # the port's stub; the army slots
4f    @168138   # EntityManager::SpawnEntityAt(SpawnPoint*, ...)
4f    ^WindowManager::WindowQueue::IsWindowHigherThan$   # WorldHintHoverWindow::Update
4f    ^(Entity::(SetGUID|GetGUID)|EntityManager::GetEntityWithGUID)$   # spawn points, PvP players' hover (type 0x11), tasks
util  @16debc   # FileManager: std::map operator[] of the blob entries
util  ^(StringHash|StringTable::FUN_00228ba4)$   # the GUI name hash (the port's maps), StringTable's string pool
util  ^GUI::FUN_(0017c258|0017c284|0017c2b8|0017c2ec|0017ebd4|0017ee7c|0017f0d0|001803d8)   # RegisterBinaryUI's vector sizes / inserts and its std::map<string> lookup
util  ^(EntityFactory::FUN_(0015fb4c|00160374|0016134c)|SoldierSlots::FUN_(0021e738|0021ea08)|HiddenObjects::FUN_003a4b80|CastleTopWindow::FUN_002784cc)   # wcsdup/strdup, vector inserts, std::map inserts, push_back
implicit  ^CastleTopWindow::FUN_00277144   # a callback object factory (Update's three callbacks)
implicit  ^ArenaDifficultyWindow::FUN_(00242ee0|00245fd4)$   # a GUI::Callback factory; ArenaEventWindow's static FunctionalWindow (ArenaEventWindow::Queue)
4b.5  ^Map::Building::AddSmoke$   # a hole the review found behind an `@0x` reference (workshop smoke)
4h    ^(OnTutorialFarmerWomanAction|EntityManager::GetEntityByClass)$   # tutorial paths (BottomCityWindow::Update, Building::WorkEnded)
5x     ^BuildingHovers::CheckForSpecialDrops$   # the Ruby / Diamond Pyramid finds (tasks 0x4d7 / 0x4d9): a real-money sale promotion in 5.11 (30% more gold and crystals for 24 h); ask the user how it works offline, with the exchange
6     ^FileManager::(OnMusicMute|OnSoundMute)$
online  ^(LandExpandedWindow|LevelUpWindow|TaskCompleteWindow)::OnTwitterToggle$
dead  ^(BottomFarmWindow::OnFarmWater|PatchProgressHoverWindow::SetPartialSpeedUpMode|BuildingMovement::(ToggleRoadType|ToggleWarehouse))$   # no caller in 5.11
util  ^Map::FUN_(0011f0a8|00127328|00131528|00135240|0013a144|0013a870)   # Load*List's strdup / vector helpers, Building's vector insert
util  ^GameState::FUN_(00194908|00195fb8|00196924|00199a5c|0019aa78|0019bc8c|0019c5c4|0019f1c4)   # the settings / resources / tavern std::map and vector helpers
util  ^(Items::FUN_(001ae954|001afd88)|BuildingHovers::FUN_(00264440|00265a5c|00265c38|00266288)|BuildingMovement::FUN_(0039cc1c|0039cc50))   # vector sizes / inserts
implicit  ^(Game::FUN_00184f80|BottomFarmWindow::FUN_0025fdec|BuildingHovers::FUN_00263618|ShopWindow::FUN_00347200)   # callback object factories, a static array's destructor
implicit  ^BottomFarmWindow::FUN_00261f5c   # GetWindowTyped<Window>(.., "icon") instance (falls back to GUI::Init's windows)
online  ^(Entity::SetCustomEntityData|EntityData::PartialClone)$   # friends' cities (GameState::LoadEntities)
4c    ^Entity::OnSetup$   # Map::Load: the player's setup metas (UNVERIFIED there)
dead  ^(Map::BuildingData::(Clean|GetRoofDecoration|GetBaseDecoration)|Map::Building::(AddResource|RemoveResource|RemoveLiver|HasEntity)|Map::(HasEntity|ContainsDecoration|GetBuildingCountPerShopCategory|CheckUniqueIDs|GenerateNew|AddRandomDecorations|Occupied)|Map::FUN_(00124a64|0013b8a0)|Contracts::FUN_0012eddc)$   # no caller in 5.11 (nor a vtable or GOT entry)
dead  ^(Entity::(GetIdleWidth|GetAnimOffsets|UpdateAnimation|ContainsPrecise|PreLoadAnimations)|EntityFactory::(GetEntityByClass|FUN_0015f990)|EntityManager::(GetEntityCountByType|EntityExists|GetSquadOwner|GetEntityCountWithoutPathAtXY|GetEntityAtWorldXYPrecise|PreLoadAnimations))$   # no caller in 5.11
dead  ^(Game::(showBackground|hideBackground|showKoreanLogo)|OnRestartGame|OnSystemErrorOK|OnSystemErrorCancel|TextStyleManager::CreateGradient|PopupSelectionWindow::(CallbackOk|CallbackCancel)|FactoryHoverWindow::ContractIsActive|BuildingMovement::UpdateImages)$   # no caller in 5.11
dead  ^GameState::(GetGoldSpent|SetGoldEarned|SetCrystalsEarned|GetTutorialStepName|RemoveAllEntitiesByID|RemoveEntity|GetGamePauseState|GetGoblinCountInTown|RemoveOrder|GetBuildingLimitExtend|ExtendBuildingLimit|RemoveBuilding|AddBulding)$   # no caller in 5.11 (the building counts are read by GetBuildingCount only)
online  ^GameState::(GetCrystalsSpent|GetCrystalsEarned|CleanBeforeLoading)$   # SendPlayerData; friends' city visits
4h    ^(GameState::SetTutorialType|BottomFarmWindow::GetPlantButton)$   # TutorialWindow
dead  ^HUDWindow::GameReload$   # no caller in 5.11 (no call, pointer or relocation; checked 2026-10-18)
4e    ^(Map::Building::RemoveHoldOfEntities|Map::FUN_(00130b58|00130b70)|Entity::SetEndWorkTS)$   # Map::RemoveHoldOfEntities, Decor::GetActionPoint, Decor::WorkStarted
4c    ^Entity::PrepareForSetup$   # EntityManager::ExecuteStaticMeta
5x     ^(Map::Building::ChangeState|Entity::SetCustomUnderlay)$   # towers shooting (DoAttack, OnCoolDown); the PvP spawn meta
util  ^Map::FUN_001c2558   # the birds vector's insert (FUN_001c273c's helper)
dead  ^Map::GetEndQuestTileLocation$   # no caller, no address taken
5x     ^Entity::ExecutePvPSpawnMeta$   # the PvP shadows (PVP_SPAWN); called from Entity::OnSetup / OnTaskCompleted / OnSubTaskCompleted
5x     ^MetaExpression::(OnApplyItemSquadEffect|GetSummaryEffectsValue)$   # CraftingWindow / SetInfoWindow::UpdateContents; GameState::GetBIS's sort
implicit  ^MetaExpression::FUN_001c7ef0$   # static initialiser of MetaExpression's three globals
dead  ^Tasks::TaskSubtask::GetDescription$   # no caller, no address taken; its texts (TASK_BUILDHOUSE ...) are not in the 5.11 string tables
util  ^Tasks::FUN_0023054c$   # the pool of the tasks' icon and character names (std::string in the port)
dead  ^(Map::GetUniqueIDCount|ShopWindow::FillPatches)$   # only CheckUniqueIDs (dead); FillPatches needs a shop tab of type 5, none in 5.11
5r     ^(GameState::UpdateNotifications|Map::UpdateNotifications)$   # the phone's local notifications (Notifications)
4f    ^EntityManager::RemoveEntitiesByID$   # Map::Update's queued map switch
dead  ^WindowManager::WindowQueue::HideWindows$   # no caller
4f    ^BuildingHovers::(Show|Hide)WorldDialog$   # WorldHintHoverWindow (4f), the talking-NPC dialog; only the tutorial, campaign, combat and PvP show it
dead  ^GameState::GetBuildingCount$   # only BuildingMovement::Click's warehouse mode (4, never switched on in 5.11); the counts are never written (AddBulding dead)

dead  ^Locations::ReportLocationTaskState$   # a debug print with no caller
online  ^GameState::GiveAllChaptersTillCompleted$   # tells Android which downloadable chapter packs to fetch (FileManager::SetChapterNow, JNI)

# ---- the unfinished siege ("Easy") combat: dead in 5.11 (found at the start of 4g, 2026-10-13) ----
# Nothing constructs CombatManager, SiegeCombat, AISiegeAttacker or AIWarrior_v2 (no call of their
# constructors in the disassembly; AIStateFactory has no case for them), so GameState::g_Combat is
# always null and everything only they reach is dead. Checked with the call graph of out/asm_all.txt.
dead  ^(CombatManager|EasyCombat|EasyAI|SiegeCombat|AISiegeAttacker|AIWarrior_v2|EventManager|Squad)::   # the siege system and its timed events; Squad (0x225de0..) is its squad, not PlayerSquad
dead  ^Entity::(UpdateRangedAttackXY|IsEntityInRange|IsBuildingInRange|OnAttackedBy|AddAttacker|RemoveAttacker|GetClosestWPTo|IsInMeleeRangeWith|IsRangedUnit|IsMeleeUnit|ReceiveDamage|CalcDamage|DoRangedAttack|DoMeleeAttack|Die|OnHitByEnemy|ShowHitParticles|OnHitLanded|LaunchProjectile|GetCenterWorldXY)$   # only EasyAI / SiegeCombat / the towers' attack call them
dead  ^Entity::(SetFuryBonus|SetAdditiveDamage|GetBAT)$   # no caller in 5.11
dead  ^Map::Building::(IsDestroyed|OnAttackedBy|IsEntityInRange|OnCoolDown|GetCenterWorldXY|OnEnemyMoved|OnEnemyDied|CheckAggroRange|RemoveParticles|DoAttack|GetCenterPoint|RemoveAttacker|AddAttacker|ProjectileLanded|CreateParticles|UpdateDamageParticles|ReceiveDamage|OnHitByEnemy|Destroy)$   # towers shoot only while g_Combat is set (Building::Update); damage only from EasyAI / SiegeCombat
dead  ^Map::Decor::(Destroy|OnHitByEnemy)$   # only EasyAI / SiegeCombat
dead  ^AI::(IsInMeleeRangeWithBuildZone|IsInMeleeAttackRange)$   # only Entity::IsInMeleeRangeWith (dead)
dead  @e414c   # AI::IsInMeleeRange(Entity, Building): only Entity::IsInMeleeRangeWith
dead  @e41f0   # AI::IsInMeleeRange(Entity, Decor): only Entity::IsInMeleeRangeWith
dead  @e2efc   # AI::GetNearestReachableWPZeroWeight (recursive form): only EasyAI
dead  @1ea1f8  # Projectile::SetOwner(Building*): only Building::DoAttack
dead  @1ea554  # Projectile::MoveTo(x, y): only Building::DoAttack and Entity::LaunchProjectile
dead  ^(GameState::GetAvailableSoldierCountByID|EntityManager::(EnumEntitiesByID|GetEnemySoldier)|HUDWindow::SetActiveButton)$   # no caller in 5.11
dead  ^TargetedAI::(GetClosestReachableWPTo|GetClosestReachableWPToBuilding|GetClosestReachableWPToDecor)$   # vtable +0x40..+0x48: only EasyAI::DoRangedAttackIfReady calls them
5x  @e309c   # AI::GetNearestReachableWPZeroWeight: the arena and async combats' UpdateAttackPosition
5x  ^AI::EnemyInMeleeRange$   # only ArenaCombat::WaitingForContinue
dead  ^(CmdIgnoreDamage|CmdDebugCombat|CmdGodMode|CmdAddSoldier)$   # EditorConsole commands: the admin mode is dead (5w, below)
5x  ^GameState::AddSoldiersToSquad$   # only HireTroopsWindow
online  ^GameState::GetBIS$   # only PvP::GetBISItems

# ---- moved out of 4g while porting it (2026-10-13) ----
5x  ^AIWarrior::(StartedMagicAttackArea|FindEpicenterPos|StartedMagicAttack|MagicDeath|MagicBlock|MagicHit|MagicAttackAreaFinished|MagicAttack|MagicAttackArea)$   # the fighters' side of spells (with Spells / AISpell)
5x  ^AIPlayer::PlayBuffAnimation$   # a buff's particles and cast animation (spells, potions' effects)
5s  ^BaseCombat::SwitchToArenaFight$   # hand the fight to ArenaCombat (the arena events); SwitchToBossFight: 5i-1, SwitchToPvPArenaFight: 4h
5x  ^TaskInfoWindow::(SkipBossTask|OnFight)$   # the boss form of the quest window
implicit ^PlayerBattleInOutWindow::(WinnerHolder::~WinnerHolder|FlagWindow::~FlagWindow|_INIT_105)$   # empty destructors and the static FunctionalWindow (Queue())
implicit ^BottomBattleWindow::(ButtonFuryLarge::~ButtonFuryLarge|FUN_00257344)$   # empty destructor; FUN_00257344 wraps a function in a GUI::Callback
util  ^ProjectileData::FUN_   # the Splitter's allocator and string copy for "anims"
dead  ^AI::GetangleBetweenWPs$   # no caller in 5.11
dead  ^HealthbarHoverWindow::   # hover type 0xd: BuildingHovers::Update never asks for it (only HoverInfo::SetHoverType's factory names it)
removed  ^PlayerWeakWindow::   # "you are too weak" advice after repeated deaths: removed by the user 2026-10-18 (it pointed to the shop and paid chests)
5x  ^Shared::WarriorSlotInfo::   # PlayerWeakWindow, HireTroopsWindow, ChestsWindow
5x  ^Shared::(EndscreenProgressBar|ProgressBarLarge)::   # the boss / PvP end screens; CraftItemWindow, LevelInfoWindow
implicit ^Shared::PlayerHolder::~PlayerHolder$   # the plain struct's destructor
4h  ^Shared::PlayerHolder::   # the hero's figure with its equipment: SelectHQWindow (4h) is its first user that matters; HealSquadWindow shows the plain figure until then
5o  ^BeltBarWindow::(OnCraftPanelMove|OnMovingCraftPanel|OnCrafting|ShowProfessionPoint)$   # the belt's Crafting button and bar (crafting, professions)
5x  ^BeltBarWindow::(OnInventory|OnShowInventory|ShowInventory|OnEmptySlot)$   # the belt's inventory button (CharacterInfoWindow)
5x  ^BeltBarWindow::(RunRageAnimation|GetAdjustedBuffZoneLocation|RaiseWindow|OnAddMoreSlot)$   # the fury flash (spells), the buff row's place, the raised belt for the character window, the shop link
5x  ^Shared::(BuffHolder|BuffHolderManager)::   # the row of running buffs (timed potions): BeltBarWindow, HealSquadWindow, CharacterInfoWindow
5x  ^BottomBattleWindow::   # the rage bar (Rage_bar.xml): the spell slots and their fury buttons, auto-cast, the mana bar, the arena's stances and the taming net. It is the spells' HUD; the fight itself does not need it
dead  ^PlaceMagicHoverWindow::   # nothing constructs it (no caller of its constructors 0x390e34 / 0x390e8c): the large buttons confirm and cancel the aimed spell instead
dead  ^TapHoverWindow::   # BeltBarWindow::Init creates it and Deinit deletes it; nothing shows it (no caller of Show / SetAction / Hide, direct or through its vtable slots)
dead  ^HealSquadWindow::SortItemsByMetaSort$   # no caller, no address taken (UpdateContents keeps the setting's order)
6  ^Render::CreateCustomTexture$   # a texture made from pixels: Particles::ImageParticleSystem, Render::Layer::Draw's effect, the buff row
5x  ^(HealHoverWindow::|BattleBarWindow::ShowHealSoldier$)   # healing a wounded soldier (the roadmap's "hiring / healing the army"): BattleBarWindow and HireTroopsWindow create it, ItemHoverWindow::OnHeal shows it
5x  ^BeltBarWindow::(Move|MoveIntoBelt|HasMovedIntoBelt|ArrowAtSlot)$   # an item put on the belt from the character window, the belt moved aside for the big windows, the rage bar's mana potion hint
util  ^App::   # the App singleton's accessors: the port's managers are namespaces
util  ^AIWarrior::FUN_000f3b4c$   # std::string::find

4g  ^AIEnemy::CheckAggro$   # starts the AggroCombat (GameState::SetCombat, Entity::OnAggro, the boss task window)
4g  ^EventManager::   # timed combat events (Entity::DoMeleeAttack / DoRangedAttack, Building::ProjectileLanded)
util  ^Locations::FUN_001b2494$   # the location vector's reallocation helper (std::vector in the port)
dead  ^Map::(Person::|PersonData::|LoadPersonList|GetPersonData|GetRandomPersonData|PersonsDeinit)   # the map's own person list (persons.xml read a second time): Map::Person is never constructed in 5.11, nothing reads the list
online  ^GameState::LoadEntitiesFromCopy$   # only VisitFriendCity
dead  ^CmdOpenMap$   # an EditorConsole command, through GlobalMapWindow::SwitchMap: the admin mode is dead (5w, below)
4g  ^Entity::GetClosestWPTo$   # only EasyAI::DoMeleeAttackIfReady (needs AI::GetNearestReachableWPZeroWeight)
dead  ^ResourceHelper::   # a Windows dev tool (Init reads "c:/kingdom/" + name; AddRes / ClearMapResources keep per-map resource lists, SaveRes / DumpResourcesForCurrentMap are empty): nothing calls any of it in 5.11 (no bl, GOT or vtable entry; checked 2026-10-19)
dead  ^PersonHoverWindow::   # BuildingHovers::Init creates it, nothing ever shows it (only UnregisterEntity and Deinit touch personWindow)
4g  ^PlayerHintHoverWindow::   # the hero panel's own dialog: created, placed and shown by PlayerTopWindow (SetParameters / HideDialog / ShowArrowAndLock, 4g)
4g  ^TapHoverWindow::   # the belt's tap hint, created by BeltBarWindow::Init (4g)
implicit ^(CampaignCompleteWindow::(FUN_00271ddc|_INIT_70)|CampaignPerfectedWindow::FUN_00275ae8)\b   # the static FunctionalWindows (Queue()); _INIT_70 is not a function: Ghidra cut Show (0x272460..0x272770) there
5x  ^(CampaignCompleteWindow|CampaignPerfectedWindow)::   # only the global map shows them (GlobalMapWindow::*::ShowCompletionWindow / OnTaskCompleted)
implicit ^LoadingScreenWindow::FUN_002f4098\b   # the static FunctionalWindow (Queue())
5x  ^LoadingScreenWindow::   # Map::Load shows it only when the switch starts from the open global map; the other users are online (friends' cities)
implicit ^CampaignInfoWindow::(FUN_00272cd4|FlagInfo::~FlagInfo|_INIT_71)$   # the static FunctionalWindow (Queue()) with its scrollers and vectors, the flag's destructor; _INIT_71 is not a function: Ghidra cut UpdateContents (0x2731a8..0x2742f4) there
implicit ^ChoosePathWindow::(FUN_00295378|_INIT_78)$   # the static FunctionalWindow (Queue()) with its scroller and vectors; _INIT_78 is not a function: Ghidra cut Update (0x298690..0x298df0) there
dead ^ChoosePathWindow::CenterOn$   # no call, pointer or relocation in 5.11
# ---- 4b.5 first: ported without their `// @0x` marker (inventory.py --unmarked), verify and mark ---
4b.5  ^(FileManager::LoadFile|Map::Free|SystemFuncs::((Set|Get)Setting_(Bool|String)|getSID)|WindowManager::(WindowQueue|FunctionalWindow)::Update|Render::(Init|InitFonts|Texture::SetWrapping|RemoveTexture)|Resources::GetDirectImage|SaveManager::SaveChunk::Save(Char|Short|Unsigned)|Map::(GetMapID|GetGridWidth|GetGridHeight|GetTileset)|Entity::(SetAnimationOnce|SetAnimationP)|EntityFactory::Init|GameState::Reset|GUI::Window::SetOnClick)$

# ---- online and removed first, so their constructors stay with them --------------------------
# PlayerCompetitionWindow: only the PvP tab (DECIDED 2026-10-20); the social tabs stay online (below).
dead  ^(WindowPvp|PvpPartEnemy|PvpValorBar|PlayerCompetitionWindow::ButtonRaidStart)::   # (checked 2026-10-20) WindowPvp::LoadFrom has no caller; the others are only loaded by it
online  @301e08   # PlayerCompetitionWindow::SetTabMode(TabTopPlayers&, ...): the top players' tab
5t  ^PlayerCompetitionWindow::(Init|Show|Hide|OnTab|Click|Move|Update|UpdateContents|RefreshCurrentView|SetZ|ZRange|OnBack|OnClose|OnTweenIn|OnTweenOut|IsVisible|OnLeft|OnRight|OnPerson|OnValor|OnValorShop|OnWarrior|OnInfo|OnFight|DataDownloadCallback|OnRefreshFree|OnRefresh|SetViewMode|SetCurrentView|GetCurrentView|CombatQueued|SetTabMode)$
5t  ^PlayerCompetitionWindow::(EnemyHolder|ValorBar|StatisticHolder|TabShop|GiNotificationHolder|IconGoldQuestNew)::(LoadFrom|SetProgress)$
online  ^(CMyServer|CConnection|CGZIP2AT|NeighboursServer|NeighboursServerNS|Neighbours|MyNeighbours|MyFacebook|SocNets|SocialConnectWindow|FacebookSyncWindow|VisitFriendWindow|FriendInfoHoverWindow|SelectFriendsWindow|Window_switch_profiles|WallPost|ViralFeatures|OG|OG2|ServerFlags|CouponEntryWindow|CouponGetWindow|CouponSetWindow|DownloadManager|AsyncImageLoader|LoadingInternetWindow|ToS|Save|PlayerCompetitionWindow)::
removed  ^(Billing|CMyPayment_CBMoneyLog|CMyPayment_PurchaseLog|CMyPayment_PurchaseLogRecord|CBMoneyLogRecord)::
removed  ^ExchangeWindow::(OnPayForDollarsYES|GetRealCost|GetProductDataForIndex|GetGemItemIDChange)   # the dollar packs
online  ^(Expansions|ExpansionDownloadWindow)::   # the port reads every pack from disk
online  ^(Cmd(Sync|GetServer|SetServer|GetMySave|SendMySave|SetConnectionDelay|SetInetrnetOnOff|OfflineAllow|ToggleSyncMode|VisitPlayer|ApplyDiff|MinifySave|DiffSaves|BatchCompareSaves|LoadSaveGid|ActionFromBlog)|ContextServerType)
online  ^(AsyncRequestRunner|FB_Socnet\w+|PutFacebookPictureInHolder|ServerEncode|ServerDecode|ServerMessageOk|UpdateFacebookQuestion|UpdateGetSave|UpdateSendSave|CheckExpansion|UpdateExpansionRequired|OnShowInstallUpgrade|OnInstallUpgrade|OnInstallUpgradeCancel|OnOpenUpgrade|OnShowFailedUpgrade|CanShowOffers|OnToS|CommonSetAction|CommonSetFlags|CommonFullPauseEvent|SortByValor|SortByTimeAgo|SortByName|SetMonetaryThousandsDelimeter)$
online  ^free:(SortBy|CommonSet)
online  ^GameState::(Send|GetServer|SetServer|IsServerSettingSet|GetOnlineExtra|GetFacebookConnection|SetFacebookConnection|GetTwitterConnection|SetTwitterConnection|IsNeighboursEnabled|SetNeighboursEnabled|GoHomeFromFriend|VisitFriendCity|SavePvPSave|GetPvPRefreshTime|SetPvPRefreshTime|UpdateServerFlags|GetMainExpansion|SetMainExpansion|GetPlayerExtraExpansion|GetPlayerMainExpansionVersion|GetPlayerPatchExpansionVersion|GetVFC|IsDailyChestRequestProcessing|SendDailyChestRequest|IsPurchaseActive|SetPurchaseActive|GetGameMapVersion|GetMapVersion|SetMapVersion)
online  ^Map::SaveOnline
online  ^SaveManager::(ApplyBlockDiff|ApplySaveDiff|DuplicateBlock|GetDifference|GetGameStateDataFromSave|GetMapDataFromLoadedSave|MinifyBlock|MinifySave|QueueSendSave|SaveOnlineSave|SavePvPSave|SetEnableSavePing|SetSaveDelay|SetSavePeriod|SetSendSavePeriod|SaveData::)
online  ^SystemFuncs::(FB|GetFBToken|IsConnectedTo|LikeGame|Log|LoginTo|LogoutFromFB|OpenFAQ|OpenMarketURL|OpenSupport|RateGame|SendPaymentDataToServer|SetProcessPayments|ShowConnectionError|ShowToSPP|callExternalBrowser|geUniqFBID|getDeviceToken|getEmails|getGCID|getGID|getPushID|getReferral|getSID|getSecret|getUniqueIDs|launchApp|showGPGS|signInGPGS|signOutGPGS|IsAppInstalled|SetGUID|getPlatformForServer|getPlatformJailbreak|getDeviceExtendedInfo)
online  ^FileManager::(Billing|Blog|Coupon|Facebook|FlowGameCurrency|GetChestContents|GetFriendMap|GetServerUpdate|LogAndroid|LogCBPurchase|MakeFBRequest|MoreGamesRequest|NotifyTutorialStep|OnAmazonAchievements|OnFacebookToggle|OnItemBought|OnKoreanMoreGames|OnLevelUpEvent|OnTwitterToggle|PayForItem|PostImage|Send|SetChapterNow|SetFlagStage|ShowOffers|ToggleStatEvent|UpdateFriend|CheckDailyBonusAvailability|JNI_|RegisterExpansionFile|RemoveExpansionFile|ValidateExpansionFile|DoesExpansionFileExist|EnumExpansionFileInfo|GetExpansionCount|GetExpansionFileInfo|SetGameState|SetLastLoadedCity|AddResetCount|GameLoaded|ResaveVersion|DebugUpdate|BlobFileDescriptor|RegisterBlob|DataHash|FileDataHash)
online  ^SettingsWindow::(GetFacebook|SetFacebook|ToggleFacebook|GetTwitter|SetTwitter|ToggleTwitter|OnGameCenter|OnGames|OnInvite)
online  ^(LevelUpWindow|LandExpandedWindow|TaskCompleteWindow)::OnFacebookToggle   # the share toggle is not offered (PORT)
online  ^Shared::ShareButtonsHolder::
online  ^CastleTopWindow::(OnFriends|UpdateGICounter)
online  ^HUDWindow::(ToggleInternet|UpdateInternet)
online  ^EntityManager::(GetFriendPlayer|MarkVisitigFriend)
online  ^(Items|Contracts|Tags|EntityFactory)::(Change\w*Attribute|ChangeItemsOf|SetTransactionTime|GetTransactionTime)   # server patches of the data (4b.1)
online  ^Items::FUN_001ad364   # the server attribute tables' static init

# ---- implicit ----------------------------------------------------------------------------------
implicit  \((callback|static-init)\)$
implicit  (^|::)(\w+)::~?\2$   # constructors and destructors
implicit  ::operator\.(new|delete)$
implicit  ::operator=$
4g  ^Map::Decor::Destroy$   # a destroyed decoration (combat), not the shutdown
implicit  ::(Deinit|Destroy|DeinitWindows|Free)$   # shutdown: the process exits; resources are released by the port's objects
implicit  ^GUI::GetWindowTyped

# ---- utility helpers ----------------------------------------------------------------------------
util  ^(StringCompare|StringInsensitiveCompare|StringInsensitiveHash|StringPrefixInsensitiveCompare|ToLower|ToStdString|ToString|WCSChr|WCSCmp|WCSCpy|WCSLen|SimpleDuplicateString|DuplicateString|lerp|randf|log_printf|SaveBytes|SaveChar|SaveShort|SaveUnsigned|IsArg|GetJPGSize|GetPNGSize|ComputeSpriteCoords)$
util  ^(Splitter|WSplitter|StringHelper|ClearPointerVector|BRand)::
util  ^(GUI|Resources)::DuplicateString$
util  ^SaveManager::SaveChunk::(SaveBytes|SaveChar|SaveShort|SaveUnsigned|LoadChar|LoadShort|LoadUnsigned|HasData|IsValid|Restart)$
util  ^SystemFuncs::(IntToStr|ReplaceString|TrimSpaces|utf8ToWChar|wcharToUtf8)$

# ---- 4c: quest engine ---------------------------------------------------------------------------
online  ^Bonus::   # gifts from the server / Java (ServerFlags, mcSetBonus) and the console; nothing gives one offline
online  ^GameState::(ShowGemBonusMessage|GetGemStepMessage|SetGemStepMessage)$   # ServerFlags' blocking message (ToS / exit) in Update
removed  ^Tasks::SendTasksFootprint$   # sent with a real-money purchase (ExchangeWindow::OnPayFor*)
4g  ^TaskInfoWindow::(OnFight|SkipBossTask)$   # the boss form of the quest window
5q   ^TaskInfoWindow::OnShop$   # the item shop's tab 3
5q   ^CastleTopWindow::(OnShop|OnBuyItem)$   # the HUD's Shop button (5q-5c)
5o   ^Tasks::ShowWarriorSlotUnlock$   # CraftSuccessWindow::SetParameters(0) and Show: with the craft windows
4d  ^Tasks::(TaskSubtask::OnHelp|HelpWithLocation|HelpWithMapSwitchTo|HelpWithMapSwitchToContinuation|RunLastSubTaskHelp|ShowWarriorSlotUnlock)$   # the task window's "Go" button (TaskInfoWindow::OnHelpActual) and what it navigates with; moved from 4c part 4
util  ^TaskHolderWindow::FUN_(00355298|00355bc4|00355c64|00355df8)$   # std::sort with TaskOrdering (insertion sort, heap, introsort)
util  ^HireTroopsWindow::FUN_(002d00d4|002d0174|002d0260)$   # std::sort with SortTavernInfoBySlot (insertion sort, heap adjust, heap select)
dead  ^HireTroopsWindow::OnMove$   # nothing calls it in 5.11 (only its symbol)
util  ^Tasks::FUN_(0022f610|0023590c|00235e44)$   # callback object factories of OnHelp's arrows (lambdas in the port)
util  ^Tasks::FUN_(0023583c|00235eac)$   # a name hash map's insert and clear
4c  ^(Tasks|Override)::
4c  ^MetaExpression::
4c  ^MetaData::
4c  ^GameState::(AddAutocompleteTask|AddAutoresetTask|AddSubTask|CompleteTask|ResetTask|StartTask|SubTaskCompleted|GetSubTaskDone|SetSubTaskDone|GetTaskEndTime|SetTaskEndTime|GetTaskShowTime|SetTaskShowTime|SetTaskBeginTime|GetCustomSubTaskRequrement|SetCustomSubTaskRequrement|TryToHelpWithTask|GetGemStepMessage|SetGemStepMessage|ShowGemBonusMessage)$
5x   ^GlobalMapWindow::OnTaskCompleted$   # with the world map window
4c  ::(OnTaskStarted|OnSubTaskCompleted|OnTaskCompleted|OnTagUpdate|OnInteract|ExecuteStaticMeta)$
4c  ^Map::Decor::(GetStartQuestID|GetEndQuestID|OnSetup)$
4c  ^Map::(PrepareDecorationsForSetup|GetEndQuestTileLocation)$
4c  ^Entity::(GetMetaExpression|SetForeignMetaExpression|ExecutePvPSpawnMeta)$

# ---- 4d: quest UI -------------------------------------------------------------------------------
dead  ^(TaskHolderWindow|TaskInfoWindow|LevelInfoWindow)::ExecuteFirstHelp$   # the QA game bot (see ::ExecuteFirstHelp below)
dead  ^TaskQuickCompleteWindow::   # an unused second quest-complete window ("claim reward"): SetParameters has no caller, GOT or vtable entry in 5.11 and nothing else opens it (checked 2026-10-11); not a pay-crystals feature
5n  ^LevelInfoWindow::   # the levels-and-professions window: UpdateContents / OnTab are built on Professions (5), Collections, PvP statistics, ItemShopWindow; moved from 4d on 2026-10-11
online  ^HelpWindow::   # the platform web view of the help pages (FileManager::BlogProcess); callers: OnHelp, CastleTopWindow::OnPvP, UpdateServerFlags
util  ^TaskListWindow::FUN_(0035ef14|0035f000|0035f194|0035f210|0035fef8|0035ffe4|00360138|00360224|00360854)   # std::sort / std::stable_sort instances and the slot list's growth
4f  ^TaskListWindow::(FindGoblin|BuyGoblin)$   # with the offline goblins
4d  ^(TaskHolderWindow|TaskInfoWindow|TaskCompleteWindow|TaskListWindow|TaskQuickCompleteWindow|LevelInfoWindow|HelpWindow)::
4d  ^Shared::TaskWindow::
5x   ^CastleTopWindow::(ActivateFeatureHolders|BlinkCompass|FeaturedQuestHolder::|GetFeaturedOffset|OnFeatured)   # the featured-quest button (DECIDED 2026-10-20: ported as is; offline only the starter chest 0x75b reaches it)
4d  ^GameState::(GetFeaturedTaskClickTime|SetFeaturedTaskClickTime|IsFeaturedTaskClicked)$
4d  ^HUDWindow::(OnFindTask|RemoveTaskArrows|SetTaskLocaterIcon|ShowTaskLocaterTo|UpdateTaskLocator|UpdateTasks|SetQuickLocatorForce|UpdatePlayerLocator|HideLocators)$
4d  ^BattleBarWindow::(HideAllTasks|OnAllTasks|ShowAllTasks)$
4f  ^BuildingHovers::(HideWorldDialogByTask)$   # needs WorldHintHoverWindow (Tasks::CompleteTask calls it)
dead  ::ExecuteFirstHelp$   # the QA game bot's "do the first help" per window (TutorialWindow::StartGameBot): only symbol-table entries in 5.11, no caller, GOT or vtable entry (checked 2026-10-11, file address = Ghidra - 0x10000)
4d  ^(BuildProgressHoverWindow::HelpWithSpeedUp|NotEnoughWindow::ExecuteFirstHelp)$

# ---- 4e: decoration jobs ------------------------------------------------------------------------
dead  ^(DecorAnimController|BuildingAnimController)::   # no caller in 5.11 (symbol table only; decorations use BaseAnimController<Map::Decor>)
dead  ^CallbackAssignWorker::   # never constructed in 5.11 (no call of its constructors)
4g  ^Map::Decor::OnHitByEnemy$   # with Decor::Destroy and the traps of Decor::Update
4f  ^Map::Decor::PortalAction$   # needs the portals (Decor +0x90)
6   ^Map::Decor::PlayTeleportSound$
4e  ^Map::Decor::
4g  ^AIPlayer::PlayBuffAnimation$   # a buff's particles (Particles::BuffParticleSystem) and the "cast" animation
4e  ^AIPlayer::(AssignToJob|ClickedDecoration|GetBestDecorationActionPoint|RemoveFromJob|SearchDecoration|SendGoblinToWork)$
4e  ^AIBaseState::(AssignToJob|AutoInteraction|CancelWork|ClickedDecoration|IsWorking|RemoveFromJob|SearchDecoration|StartTraining|TryToInterruptJob|ResetOrder)$
4g  ^Map::(RemoveBlockedTiles|RestoreBlockedTiles)$   # only TargetedAI::SetBlockedPathTarget uses them
4e  ^Map::(GetBlockingDecoration|GetDecorationThatIsReplacedWith|GetDecorationToClick|GetDecorationToInteract|GetDecorationWithAnyDrop|GetDecorationWithAnyInteraction|GetDecorationWithDrop|GetNearestFilteredDecoration|GetTriggeredDecoration|RemoveBlockedTiles|RestoreBlockedTiles|RemoveHoldOfEntities|StoreDecorationInfo|RestoreDecorationInfo)$
4g  ^TargetedAI::GetClosestReachableWPToDecor$   # with the GetClosestReachableWPTo family
4e  ^BuildingHovers::(FollowDecor|HideArrowOnDecor|OnFreeWorkerAssignDecoration|AllowDecorClickInBattleOnce)$
4e  ^Entity::IsDecorInRange$

# ---- 4f: campaign maps --------------------------------------------------------------------------
4f  ^(Locations|SpawnPoint|Portal|Fog|PersonHoverWindow|TalkHoverWindow|TapHoverWindow|HintHoverWindow|WorldHintHoverWindow|PlayerHintHoverWindow|AIEnemy|EventManager|ChoosePathWindow|CampaignInfoWindow|CampaignCompleteWindow|CampaignPerfectedWindow|ChapterWindow|LoadingScreenWindow)::
4f  ^ParseLocation\w+$
4f  ^Map::(Person::|PersonData::|AddFog|ClearFog|RemoveFog|ToggleFogRender|StoreFogInfo|RestoreFogInfo|LoadPortals|SavePortals|LinkPortals|GetPortalToMap|LoadSpawnPoints|SaveSpawnPoints|StoreSpawnpointInfo|RestoreSpawnpointInfo|GetSpawnByIndex|GetSpawnPointAt|LoadPersonList|PersonsDeinit|GetPersonData|GetRandomPersonData|PlayerDefaultSpawn|PlayerNextSpawn|StorePlayerPosition|RestorePlayerPosition|GetLastPlayerX|GetLastPlayerY|EnqueueLoadMap|IsMapLoadQueued|IsMapLoading|OnMapLoaded|UpdateBattleMap|AddCameraCinematic|AddCameraPoint|AddCameraShake|ClearCameraPoints)$
4f  ^GameState::(RefreshOfflineGoblins|ClearOfflineGoblins|GetOfflineGoblin|GetOfflineGoblinCount|RemoveOfflineGoblin|UpdateOfflineGoblins|LoadEntitiesFromCopy|AddMapCompletion|GetMapCompletionCount|GetMapStartTime|SetMapStartTime|HasMapStartTime|GetMapEndTime|SetMapEndTime|GetMapVisitTime|SetMapVisitTime|HasMapVisitTime|AddMapItemCollectionInfo|GetMapItemCollectionInfo|AddMapResourceCollectionInfo|GetMapResourceCollectionInfo|ResetMapCollectionInfo|GetCampaignCompletionStatus|SetCampaignCompletionStatus|GetLatestChapterCompleted|GiveAllChaptersTillCompleted|MonsterKilled|GetMonsterKilledCount|GetOfflineBuilding|GetOfflineBuildingCount|GetOfflineBuildingWithID|UpdateOfflineBuildings)$
4f  ^Entity::(AddPatrolPoint|RemovePatrol|IsOnPatrol|IsWalkingOnPatrol|PartolEndsOn|GetCurentWP|GetClosestWPTo|HasFixedLocation|HasRandomLocation|GetSpawnPointID|AssignSpecialTalk|AssignTalkTask|GetSpecialTalk|GetTalkTask|OnTalkTo|GetHint|GetDeadHint|IsPlayerShadow|IsWanderingPlayerShadow|IsEmperor)$
4f  ^EntityManager::(GetEntityBySpawnPoint|GetEntityWithTalkTask|GetEntityWithDrop)$
4f  ^AIPlayer::ClickedPortal$
4f  ^AIBaseState::(ClickedPortal|OnMapUnload)$
4f  ^CmdOpenMap$
4f  ^HUDWindow::(HideMapName|MapReset|SoftMapReset|HardMapReset|HideBlack|UpdateScreenDarkening)$
4f  ^BuildingHovers::FollowEntity$

# ---- 4g: campaign combat ------------------------------------------------------------------------
4g  ^(CombatManager|BaseCombat|EasyCombat|Squad|AggroCombat|RangeAggroCombat|EasyAI|Projectile|ProjectileData|BattleBarWindow|BeltBarWindow|BottomBattleWindow|PlayerBattleInOutWindow|HealthbarHoverWindow|HealthbarTinyHoverWindow|HealHoverWindow|HealSquadWindow|PlayerWeakWindow|AIWarrior_v2|AIStateFactory|App)::
4g  ^(AIWarrior|AIBaseState|AIPlayer)::(AddedToCombat|Attack|Block|Death|FindEpicenterPos|Hit|MagicAttack|MagicAttackArea|MagicAttackAreaFinished|MagicBlock|MagicDeath|MagicHit|ProjectileLanded|RemovedFromCombat|StartedAttack|StartedMagicAttack|StartedMagicAttackArea|CheckAggro|IsPlayerInAggroRange|UpdateAggroZone|Retreat|AnimEnded|PositionChanged|WalkCompleted|UnableToWalk|StopMovement|ClickedTile|RemoveActionMarker|Clean)$
4g  ^Entity::(AddAttacker|RemoveAttacker|CalcDamage|CheckAggro|CriticalHit|Die|DoMeleeAttack|DoRangedAttack|GetAdditiveFuryGain|GetBAT|GetCritChance|GetCurrentTarget|SetCurrentTarget|GetDamage|GetDefense|GetInitiative|SetInitiative|GetItem\w+|HasCorpseItem|HasMeleeDamage|Hit|IsBuildingInRange|IsDeathAnimationRunning|IsEnemy|IsEntityInRange|IsInMeleeRangeWith|IsMeleeUnit|IsRangedUnit|LaunchProjectile|MoveAwayAfterAnimation|OnAddedToCombat|OnRemovedFromCombat|OnAggro|SetAggro|OnAttack|OnAttackedBy|OnBlock|OnDeath|OnDefend|OnDying|OnHit|OnHitByEnemy|OnHitLanded|OnProjectileFired|OnRetreat|ProjectileLanded|ReceiveDamage|Set(Additive\w+|AttackMelee|AttackRanged|Crit|CritChance|DefenseMelee|DefenseRanged|FuryBonus|ItemDrop|WarriorCost)|UpdateRangedAttackXY|WillDie|ShowHitParticles|ShowGlowAnimation)$
4g  ^EntityManager::(GetEnemy|GetEnemyAtXY|GetEnemySoldier|GetEntityByEnemyClassID|GetNearestEnemy|GetNearestEnemyTo|GetNearestEnemyWithClassTo|IsPlayerInAggroRange|UpdateAggroZone)$
4g  ^GameState::(EndActiveCombat|SetCombat|GetTimeTillNextHP|UpdateHPRegen|GetVirtualHP|ResetVirtualHP|AddSoldiersToSquad|GetAvailableSoldierCountByID|GetBIS)$
4g  ^AI::(EnemyInMeleeRange|IsInMeleeAttackRange|IsInMeleeRange|IsInMeleeRangeWithBuildZone|GetRadianBetweenPoints|GetangleBetweenWPs)$
4g  ^TargetedAI::(GetClosestReachableWPTo|GetClosestReachableWPToBuilding|GetDistanceToTarget|SetBlockedPathTarget)$
4g  ^Map::Building::(AddAttacker|RemoveAttacker|CheckAggroRange|Destroy|DoAttack|IsDestroyed|IsEntityInRange|OnAttackedBy|OnCoolDown|OnEnemyDied|OnEnemyMoved|OnHitByEnemy|ProjectileLanded|ReceiveDamage|CreateParticles|RemoveParticles|UpdateDamageParticles)$
4g  ^Shared::(BuffHolder|BuffHolderManager|BottomSlotInfo|WarriorSlotInfo|EndscreenProgressBar|ProgressBarLarge|PlayerHolder)::
4g  ^PlayerTopWindow::(HideDialog|IsPlayerDialogVisible|OnCharacter|OnDamage|OnHealth|OnRestoreOut|OnToggleLegend|RaiseAndMoveIntoPlayer|RefreshHP|SetParameters|ShowArrowAndLock)$
4g  ^HUDWindow::(OnDamage|ShowMainUI|SetActiveButton)$
4g  ^(CmdDebugCombat|CmdGodMode|CmdIgnoreDamage|CmdAddSoldier)$
4g  ^Entity::IsBoss$

# ---- 4h: the new game ---------------------------------------------------------------------------
5n-1  ^Professions::   # the professions and reputations (professions.xml); 5n-1 2026-10-19
5n-1  ^GameState::(GetProfessionPoints|AddProfessionPoints)$
5n-2b  ^BossIntroWindow::SetReputation$   # the arena's reputation screens: one line on top of Professions::GetProfession (5n; moved from 5i-2 on 2026-10-18)
implicit  ^GlobalMapWindow::FUN_(002bdd9c|002bddd4|002bde08|002be1c4)   # the location arrays' and the arrow vector's static destructors
4h  ^(GlobalMapWindow|BossIntroWindow)::   # the world map and its ambush banner: the tutorial's way home (user, 2026-10-14); their milestone-5 satellites (campaign/raid info, ChoosePath, the sultan's window, PvP travel, reputation screens) are notes in the code
4h  ^(Shared::EndscreenProgressBar::|SetInfoWindow::GetPlayerItemOrBetter$|GameState::(ResetBossFightsOnMap|GetEventCompletionCount)$|Render::(CreateScreenTexture|IsLowPerformanceDevice)$|Timer::AddDeltaTimeCompensation$)   # what the world map and BossIntroWindow use
dead  ^TutorialWindow::(StartTutorialSkip|StartGameBot|BotShouldTame|GetResource|Show)$   # the QA game bot, the tutorial skip and an unused Show: no caller, GOT or vtable entry in 5.11 (checked 2026-10-14)
implicit ^TutorialWindow::(UpdateBot|EndTutorialSkip|EndGameBot)$   # UpdateBot is empty; the two Ends only undo the dead starters' flags (0x630925 / 0x630924), which are never set
online  ^Select_HQ::   # the layout loaders of FacebookSyncWindow::Init (online); SelectHQWindow fetches its windows itself
4h  ^(TutorialWindow|TutorialSender|SelectHQWindow|FirstCityEnterEffect)::
4h  ^CastleTopWindow::(OnFindPlayer|OnReturn)$   # the HUD's player locator; the compass to the world map
4h  ^(ArenaTurnWindow|PlayerBattleInOutWindow)::   # the tutorial's ambush (user, 2026-10-14): the turn banner and the versus intro / outro
4h  ^PvPArenaCombat::(PvPArenaCombat|~PvPArenaCombat|Update|SetupWave|SpawnEnemies|ArenaCompleted|OnValorReceived|PostCombat|EndCombat|WaveCleared|PlayerDied|SwitchState|GetCurrentWave|GetWaveCount)$   # the ambush's PvP fight

# ---- 5: the rest of the game --------------------------------------------------------------------
5o  ^(CraftingWindow|CraftItemWindow|CraftSuccessWindow)::
5p  ^(Chests|ChestsWindow|ChestOpenedWindow)::
5q  ^(ItemShopWindow)::
5r  ^(Tavern|DailyBonusWindow|ResourceHelper|Notifications)::
dead  ^BottomArenaWindow::   # (checked 2026-10-20) Init loads it hidden and sets no show function; no code outside the class calls it (Show, IsVisible, SetSelectedButton...), its Update and Click do nothing while hidden: the arenas use BottomBattleWindow's large buttons
5s  ^(ArenaCombat|ArenaDifficultyWindow|ArenaEventWindow|ArenaTurnWindow)::
dead  ^(AsyncBaseCombat|AsyncCombat|AIPlayerBot)::   # (checked 2026-10-20) no call, pointer or vtable load outside their own constructors / destructors: nothing creates an AsyncCombat (PvP fights are PvPArenaCombat) and no entity gets AI state 11 (Entity::CreateAI never picks it)
online  ^PvP::(GetArmyInfo|GetBISItems)$   # only the server request (CMyServer::NET_PvPGetData, GameState::SendPlayerData / SendPlayerData2)
dead  ^PvP::(QueuePvPWindowOpen|GetMyRating|GetPlayerCount|GetPlayerInfo)$   # (checked 2026-10-20) no call, no address taken
5t  ^(AsyncBaseCombat|AsyncCombat|PvPArenaCombat|AIPlayerBot|PvP)::
dead  ^AsyncCombat_v2::   # (checked 2026-10-20) no call to its constructors (@0x104340 / @0x104390) and no vtable load outside them and its destructors
5u  ^(PlayerInfoWindow|PlayerNameHoverWindow)::
5v  ^(PresentsContainer)::
# 5w DECIDED 2026-10-20 (user): the admin mode is dead in 5.11 (checked 2026-10-20). No key, tap or setting
# opens the console: the SDL key events go to the volume / settings / back keys or TextInput, never to
# EditorConsole::On* or Editor::HandleModeKey (no bl, GOT or vtable entry); Show's only caller is Print, and
# Print's only callers are CMyServer::NET_Sync{Send,Receive}InitialSave_* (online, dormant). Editor's debug mode
# is entered only by HandleModeKey, so IsInDebugMode stays 0 (main's Editor::Update, Map::Load's ExitDebugMode
# never run); Editor::OnMouseOver is empty; DebugViewer and CombatTestBot have no caller. The commands are
# cheats (add item / resource / soldier, unlock all, god mode, tasks, open map, load save), not a free store.
dead  ^(EditorConsole|Editor|DebugViewer|CombatTestBot)::
5x  ^(HireTroopsWindow|RepairWindow|Spells|SpellMovement|AISpell|PlaceMagicHoverWindow|BossCombat|BossCombatWaves|BossIntroWindow|BossOutroWindow|BossTimeHoverWindow|BossIntroEffect|FastBossIntroEffect|SiegeCombat|AISiegeAttacker|StartRaidingWindow|RaidInfoWindow|RaidCompleteWindow|GlobalMapWindow|Professions|Collections|Sets|SetInfoWindow|SultanArrivingWindow|BottomScreenshotWindow)::
dead  ^(Cmd\w+|Context\w+|PrintSetting)$   # the original's cheat console: the admin mode is dead (5w, above)
5p  ^ParseItemDrop\w+$   # chest drop lists
5x  ^(dollar\w+|bestDollarDifference)$   # spell gestures
5s  ^GameState::(AddArena\w+|GetStartingArenaHP|SetStartingArenaHP|IsArenaCombatActive|AddEventCompletion|AddEventFail|GetEventCompletionCount|GetEventDifficulty|SetEventDifficulty|GetEventEndTime|SetEventEndTime|GetEventStartTime|SetEventStartTime)$
5t  ^GameState::(IsPvPCombatActive|SetPvPTutorial|ParsePvPData)$   # ParsePvPData: the offline PvP server answers in its format (user 2026-10-20)
5p  ^GameState::(AddItemPayment|UpdatePaymentItems|AddDailyChestItem|FinishDailyChestItems|GetDailyChestFailure|SetDailyChestFailure|GetProcessedChest|GetChest\w+|SetChest\w+)$
5r  ^GameState::(DailyBonusReceived|GetDailyBonusDays|GetDailyBonusTime|GetReceivedDailyBonusCount|IsDailyBonusAvailable|SetDailyBonusStatus|UpdateDailyBonusTime|HireSoldier|GetSoldierAcquireCount|GetSoldierAcquireTime|GetSoldierRecentTime|GetTavernWarriorHP|SetTavernWarriorHP|GetTavernWarriorTS|SetTavernWarriorTS|GetServerTime|SetServerTime|GetServerTimeOffset)$
5x  ^GameState::(AddProfessionPoints|GetProfessionPoints|GetBossFightStartTime|ResetBossFightsOnMap)$
5x  ^Map::DropBossReward$
5x  ^Entity::(GetBossAdditionalWavesInfo|GetBossMapID|GetBossTaskID|GetBossWaveInfo|OnAttackMagic|OnBlockMagic|OnDeathMagic|OnHitMagic|OnSpellCast|OrbsCanBeUsed|SetDefenseMagic|SetEffectOwner|WillDieMagic)$
5x  ^EntityFactory::(GetEntityForArena|GetTamedEntityForID)$
5x  ^EntityData::(GetSmallSpellIcon|GetWaves\w+)$
5x  ^CharacterInfoWindow::   # the window itself (its stat part was 4b.2)
5t  ^CastleTopWindow::(HelpWithPvP|OnPvP)$
5x  ^CastleTopWindow::(OnArena|HelpWithScreenshot)$
5x  ^BaseAI::|^AIPlayer::Retreat$
5x  ^BuildingPlacement::BuildingFromPresents$
5x  ^HUDWindow::(OnArenaEvent|SetCurrentCity)$
5x  ^SettingsWindow::(HelpWithScreenShot|OnScreenShot)$
5x  ^Shared::(ButtonCraftBuyNow|ButtonRaidStart|DiscountInfo|EffectDescriptionLine|FarmButtonPlant)::
5x  ^Map::GetCurrentCity|^GameState::(GetCurrentCity|SetCurrentCity)$

# ---- 6: sound and effects -----------------------------------------------------------------------
6  ^(Sounds|SoundsManager|Particles|ParticlePresets)::
6  ^PreloadImageByPath$
6  ::(PlayDeathSound|PlayHitSound|PlayTeleportSound|SetSwingInSound|SetSwingOutSound)$
6  ^Entity::(ParticleHasPlayCount|SetParticleEmitter|SetParticlePlayCount|UpdateParticles)$
6  ^EntityData::(GetSoundAttack|GetSoundDeath)$
6  ^GUI::TextCache::|^BuildingHovers::TextCache::
6  ^Render::(BlurTexture|FilterContext::|GlowFilter::|InitFilters|DeinitFilters|EnableTerrainShadowing)
6  ^SystemFuncs::SetNotificationsEnabled$|^FileManager::(SoundVolume|OnNotifications)$

# ---- 7: release ---------------------------------------------------------------------------------
7  ^(PlayerProfileManager|SwitchProfilesWindow|ErrorReporter|LoadSampling)::
7  ^Timer::TimeCompensationBlock::|^Timer::(AddDeltaTimeCompensation|AddSample|GetFPS)$
7  ^GUI::(IsXHighDPI_Retina|SetXHighDPI_Retina|getXHighDPI_Retina_Scale|setXHighDPI_Retina_Scale|SetHighDPIScaleFactor|SetHoverHighDPIScaleFactor|SetHudHighDPIScaleFactor|ReloadTextures)$
7  ^Render::(Resize|Restart|Suspend|didEnterBackground|willEnterForeground|getWindow|ForceBufferSwap|GetStatistics|CalculateFillrate|PrintLayerStats|UpdateTexTypeStats|GetDecoPlaceholderDebugTex|GetImageDebugTex|SaveImage|IsLowPerformanceDevice|Context::IsLowPerformanceDevice|Convert32To16Bits|FreeMemory|UpdateLogo|UpdateProgress|HideProgress|SetProgressScale)$
7  ^SystemFuncs::(GetSettings_AllAsString|GetTemporarySetting|GetTemporarySettingString|SetTemporarySetting|SetTemporarySettingString|RemoveSetting|SaveSettings|SetSetting_Bool|GetSetting_Bool|SetSetting_String|GetSetting_String|Init|SetLogLevel|getBundle\w+|getCurrentLanguage\w*|getCurrentSelectedLanguage|getEvenMoreLocaleInfo|getDocumentsPath\w*|isDocumentExternalStorageExist|getPlatform\w*|getScreenBuff\w+|getTimeIntervalSince1970|getTimeZoneOffset|getXDPI|getYDPI|IsTabletVersion|ShowOldDeviceError|FixRunloopEvents|GetTime)$
7  ^FileManager::(Init|GetStoragePathSpace|RemoveSaveFiles|RestartGame|SetPreferredLanguade|SaveImage|IsLowPerformanceDevice|GetThreadContext|ReleaseThreadContext|LoadStep|Apply|GetFileOffset|LoadFile)$
7  ^HUDWindow::(GetDebugState|ShowCheatWindow|ShowArenaCheats|ShowVisualCheats|ToggleCheatOverlay|SetDeltaTimeMultiplier)$   # debug overlay: with the admin mode (5) if wanted
7  ^Animation::(DumpToResources|PreLoadTextures)$

# ---- residue triage (2026-10-07): each checked against its callers --------------------------------
online  ^(GameState::(LoadShort|GetUpgraderState|SetUpgraderState|GetUpgradeProgress|SetUpgradeProgress|LockGame|IsGameLocked|ResetGameLock|GetActiveMaps)|Map::LoadShort)$   # friend visits, the server heartbeat lock, store upgrades, task footprints
7  ^GameState::GetGameStateInfo$   # PlayerProfileManager
5x  ^(Map::(GetTavern|GetBarracks|DebugAdvanceTime|ShowLevelStats)|Entity::SetXP|EntityData::GetDiscountSize|GameState::(GetSettingCount|EnumSetting))$   # hiring (HireSoldier), the debug console
4c  ^(Map::(GetBuildingDataWithContract|GetBuildingWithContract|GetNextAreaID|GetUpgradeableBuilding|GetFarmWithPatchToBuy)|EntityManager::GetEntityWithGUID|GameState::AddEntity)$   # Tasks::TaskSubtask::OnHelp, Bonus::Give
4e  ^(GameState::GetGoblin|Entity::GetCurrentAnimation)$   # SendGoblinToWork, PlayBuffAnimation
4g  ^(Entity::(SetUpdateSpeedScale|GetCenterWorldXY)|Map::Building::(GetCenterPoint|GetCenterWorldXY)|EntityManager::EnumEntitiesByID|GameState::IsVirtualTutorial)$
4h  ^(Map::EnqueueBuildingPlacement|Entity::SwitchEntityData)$   # the farmer-woman tutorial, SelectHQ
4b.4  ^(ItemPlaceContinuation|StringTable::StringNotEmpty|IconManager::GetLoadingCogsIcon)$
4b.4  ^BuildingHovers::(AllowWindowOverHoverOnce|ShowArrowAtSpeedup|ShowArrowAtUpgrade|ShowArrowAtFactoryContract)$   # NeedItemWindow::OnProduce / NotEnough Find (3e.4 stand-in)
4c  ^Map::(ChangeBuildingAttribute|ChangeObjectAttribute)$   # Override::Apply
4c  ^WindowManager::GetEnqueuedWindowCount$
4d  ^BuildingHovers::(HijackArrowCallback|ExecuteArrowCallback)$
4e  ^(BaseAnimController::Update|BuildingHovers::ShowIconHover|Render::CenteringInProgress)$   # Decor::Update / UpdateImage
4f  ^(Map::PersonData::LoadImage|GUI::(Register|Unregister)HighlightBlocker)$
4g  ^(AI::GetNearestReachableWPZeroWeight|BuildingHovers::(GetClickCallback|PreventArrowAutoHide)|AIWarrior::FUN_000f3b4c|Render::CreateCustomTexture|Render::CreateSolidFillTexture)$
5x  ^(Resources::GetSolidColor|Render::CreateLine|Render::CreateScreenTexture|StringTable::GetExtendedTimeString)$
6  ^(Entity::FUN_00155abc|Render::GetImageData)$
7  ^(GUI::GetHoverHighDPIScaleFactor|GUI::GetHudHighDPIScaleFactor|HUDWindow::RestoreTextures|BuildingHovers::RestoreTextures|SystemFuncs::FUN_003d890c|Render::IsInitialized)$
online  ^(FileManager::(CheckExpansion|FUN_0016d350)|Timer::GetServerGlobalTime|IconManager::GetLoadingIcon|ClearPointerVector|Render::GetSurfaceFromPath)
removed  ^ExchangeWindow::OnPayForCBYES$
dead  ^FarmGrowHoverWindow::   # created, never shown in 5.11 (3f.4)
dead  ^AI::(CreateWaypoint|CreateWaypointDebugOutput|GetShortPathFrom|GetRoadTo|RemoveWaypoint)$   # no caller, no address taken
dead  ^BuildingHovers::(CanInvestAll|CanCollectAll|InvestAllResult|ColelctAllResult|BuildingsInvest|BuildingsCollect|ShowTextInvest|SetWorldDialogOffset|ShowDroppedItem|RegisterEntity|ShowSprite)$   # no caller, no address taken
dead  ^ExchangeWindow::(GetNameByID|LineToindex|GetCrystalBonus|GetCrystalMain|GetGoldBonus|GetGoldMain|GetProductIndexForButton)$   # no caller (the port's exchange reads the packs directly)
dead  ^(IconManager::FitBuildingIntoUI|Shared::ButtonTripleInfo::ShowGold|WindowManager::DequeueWindow|AIPlayer::FUN_000eeb60|PlayerTopWindow::FUN_00327580|AnimationController::IsStopped|Resources::GetAnimatedImage|Render::(GetScreenData|CreateTextureReserved|Sprite::SetSize|Texture::SetMipFilter))$   # no caller, no address taken
implicit  ^(WindowManager::WindowQueue::(Init|SetZ|Move|Show|Hide|Update|Wheel|Back|RemoveWindow)|MapObject::(Contains|IsLower|OnSetup))$   # empty base-class virtuals (4-12 bytes)
lib  (^|::)(entry|RecursivelyCalculateShapeTree)$
4b.5  ^Background::Update$   # Map::Update calls it every frame: a hole
4b.5  ^BuildingHovers::(SetArrowAlpha|MoveWindowDown|HideWorldDialog)$   # PopupWindow / HUD return (KNOWN BUG) / the hero's taps
4b.5  ^BuildingHovers::ShowWorldDialog$   # Building::WorkEnded and Entity::OnDeath call it too (also 4h)
4b.5  ^(AI::SetWeight|StringTable::(SetEmptyNameReplacement|GetStringF|GetUndecoratedString|FUN_\w+)|Timer::(Init|GetRealGlobalTime)|StringHash|GetData|SaveManager::SaveBlock::BeginChunkLoading)$   # startup / save loading helpers: ported inline or unmarked, verify
4b.5  ^(AnimationController::(GetActiveAnim|GetCurrentFrame|SetMult|GetMult)|Resources::|EntityFactory::FUN_|SoldierSlots::FUN_|HiddenObjects::FUN_|CastleTopWindow::FUN_|PlayerTopWindow::FUN_|FileManager::FUN_|GUI::|WindowManager::)   # called by ported code: ported inline or without its marker, verify and mark
4b.5  ^Render::   # renderer internals: the port's SDL3/OpenGL renderer stands in; mark the ones it follows, record the rest as PORT

# ---- 4b.5: holes in finished work (milestones 1-3, 4a, 4b) found by the coverage pass ----------
4b.5  ^Game::(splashLoop|showBackground|hideBackground|showKoreanLogo)$   # splash screens
4b.5  ^Game::(LoadLanguageTable|LoadSystemConfiguration|LoadEntityFactoryData|main_Loop_BeforeInit|main_Loop_Init|main_Loop_Func|main_Exit_Func)$   # partly in src/main.cpp without @0x markers
4b.5  ^(ReloadSavedGame|OnResume|MainExitNoSave|OnRestartGame|OnShowRestartGame|OnSystemErrorOK|OnSystemErrorCancel|RepeatedMain|UpdateTagState|turnMusic|LanguageSelect|LanguageDecline)$
4b.5  ^Map::(PrepareImages|UpdateNotifications)$   # the city's ambient birds (images/bird/)
4b.5  ^Map::(GetTotalStorageLimit|UpdateStorages|UpdateResources|UpdateCityMap|AssignUniqueIDs|CheckUniqueIDs|GetUniqueIDCount|GetBuildingCountPerShopCategory|GetUpgradeableBuilding|GetFarmWithPatchToBuy|GetBuildingWithContract|GetBuildingDataWithContract|TrainingcontractRunning|GetBarracks|GetTavern|ContainsDecoration|Occupied|HasEntity|EnqueueBuildingPlacement|AllowBuildingVisibilityUpdate|AllowDecorationVisibilityUpdate|ProcessOfflineContracts|GetAreaByID|GetNextAreaID|GetMapID|GetGridWidth|GetGridHeight|GetTileset|LoadShort|GenerateNew|CreateRandomDecors|AddRandomDecorations|AddPatches|AddOnePatch|DebugAdvanceTime|ShowLevelStats|BuildingDeinit|DecorDeinit)$
4b.5  ^Map::Building::(GetData|GetSpriteList|GetUpgradeCount|LaunchContract|AddResource|RemoveResource|RemoveLiver|GetCenterPoint|GetCenterWorldXY|ChangeState|HasEntity|RemoveHoldOfEntities|IsTrainingCompleted|TrainingCompleted)$
4b.5  ^Map::DecorData::GetImage$
4b.5  ^Map::FUN_
4b.5  ^GameState::(Reset|Update|LoadShort|Clean|CleanBeforeLoading|AddEntity|RemoveEntity|AddBulding|RemoveBuilding|GetBuildingCount|GetFreeWorker|GetFirstBusyWorker|GetGoblin|GetGoblinCountInTown|RemoveOrder|RemoveWorkersFromOrders|ExtendBuildingLimit|GetBuildingLimitExtend|GetUpgradeProgress|SetUpgradeProgress|GetUpgraderState|SetUpgraderState|GetGoldEarned|SetGoldEarned|GetGoldSpent|GetCrystalsEarned|SetCrystalsEarned|GetCrystalsSpent|GetTimeModifier|SetTimeModifier|ResetTimeModifier|GetGamePauseState|ResetGamePauseState|LockGame|IsGameLocked|ResetGameLock|GetTutorialStepName|SetTutorialType|IsVirtualTutorial|EnumSetting|GetSettingCount|InitDefaultSettings|GetGameStateInfo|CopyEntityData|RemoveAllEntitiesByID|GetCurrentCity|SetCurrentCity|UpdateNotifications|GetActiveMaps)$
4b.5  ^Entity::(GetAlpha|GetAnimOffsets|GetAnimationFrameCount|GetCurrentAnimation|GetCustomZ|GetIdleWidth|ContainsPrecise|SetAnimationOnce|SetAnimationP|UpdateAnimation|PreLoadAnimations|SetCustomUnderlay|SetUpdateSpeedScale|SetEndWorkTS|GetGUID|SetGUID|SwitchEntityData|SetCustomEntityData|SetXP|GetCenterWorldXY|PrepareForSetup|OnSetup|OnMapUnload)$
4b.5  ^EntityManager::(Init|EntityExists|EnumEntitiesByID|GetEntityAtWorldXYPrecise|GetEntityByClass|GetEntityCountByType|GetEntityCountWithoutPathAtXY|GetEntityFactory|GetEntityWithGUID|GetNameByIdx|GetSurnameByIdx|PreLoadAnimations|RemoveEntitiesByID|SpawnEntityAt|GetSquadOwner|AssertNoReferencesToSquad)$
4b.5  ^EntityFactory::(Init|GetEntityByClass|GetEntitiesForBuilding)$
4b.5  ^EntityData::(PartialClone|GetCostGold|GetCostCrystals|GetDiscountSize)$
4b.5  ^CreateShadowGlowFilterSet$
4b.5  ^(BuildingHovers|HUDWindow|TopCityWindow|BottomCityWindow|BottomFarmWindow|ShopWindow|NotEnoughWindow|PopupSelectionWindow|BuildingMovement|BuildingPlacement|FactoryHoverWindow|BuildProgressHoverWindow|ExchangeWindow|SettingsWindow|Contracts|Tags|Items|AIGoblin|AIWorker|AIFarmerSmall|AIFarmerBig|AIPatch|PatchAnimationController|DecorationHoverWindow|StorageHoverWindow|CharacterInfoWindow)::(FUN_|Deinit$|FillPatches$|GetPlantButton$|UpdateImages$|CallbackOk$|CallbackCancel$|ContractIsActive$|InitSpecial$|OnRestart|SetPredefined)
