Я-ХУУУ!  

 ОНО СКОМПИЛИРОВАЛОСЯ!  

 И даже подёргивается!   
 
 Going to load module #0
[frame #2, 22:58:07.035, Чт, 12.12.2019]
Going to load module #0
[frame #4, 22:58:07.041, Чт, 12.12.2019]
Chentrah hub menu version 0.00.4758 for Win32-i386, 
  compiled at 22:57:44 on 2019/12/12 using Free Pascal 2.6.4.
Line info...
  found 42069 Stabs and 929 Kbytes of strings. Base 0A9E0000h, image base 10000000h.
[frame #5, 22:58:07.116, Чт, 12.12.2019]
AC power.
[frame #7, 22:58:07.150, Чт, 12.12.2019]
(thread #0) <----=* ERROR! ---- (look below for details) *=---->
  found 48142 Stabs and 830 Kbytes of strings. Base 00400000h, image base 00400000h.
================== Error message: ==================
Module logic thread #0:
Mother has passed an unhandled exception to the module in thread Module logic thread #0
Call stack:
  <not found>
SEH caught C0000005h, Access Violation,
    Attempt to read from the NULL address
  mo_cps_memman.inc:535 (TChepersyMemoryManager.CreateNewBlock)  in _hub.dll
====================================================
THE MODULE HAD BEEN UNLOADED.
PRESS "SPACE BAR" TO RESTART THE MODULE,
"F12" + "BACKSPACE" TO CHOOSE ANOTHER MODULE
OR "ESC" TO EXIT THE PROGRAM.
Учитывая, что bit — не константа, 
Воистину, у меня там типа
- Код: Выделить всё
- const
 ASSET_MASK_BIT = 19;
 ASSET_MASK = dword(1) shl ASSET_MASK_BIT;
и
- Код: Выделить всё
-  Self.SetFlag(ASSET_MASK_BIT);// в девичестве CpsMask:= Self.CpsMask or ASSET_MASK;
и специальные классы-обходчики (в девичестве - процедура обхода со специальными колбеками), позволяющие выковырять объекты из дерева по маске, как изюм из булки:
- Код: Выделить всё
- type
 TAssetFinder = class(TSimpleAbstractTraverser)
 public
 function OnNewlyEncountered(var o: TChepersyObject): boolean; override;
 end;
 
 function TAssetFinder.OnNewlyEncountered(var o: TChepersyObject): boolean;
 begin
 if Assigned(o) //TChepersyObject(p).Exists()
 and (o is TGenericAsset)
 and TGenericAsset(o).Actualized
 then begin
 TAssetManager.ToStore.Add(TGenericAsset(o));
 end;
 Result:= Yes; // continue working
 end;
 {
 procedure FindAssetsWalkProc(p:pointer);//o: TChepersyObject);
 begin
 if Assigned(p) //TChepersyObject(p).Exists()
 and ((TChepersyObject(p).CpsMask and ASSET_MASK) <> 0)
 and (TChepersyObject(p) is TGenericAsset)
 and (TChepersyObject(p) as TGenericAsset).Actualized
 then begin
 TAssetManager.ToStore.Add(TChepersyObject(p) as TGenericAsset);
 end;
 end;
 }
 procedure WalkSessionToListAssetsToStore;
 { Is used when not really saving the session (like in the case of a
 rollback). Otherwise the saving routine itself serves this role. }
 var
 t: TAssetFinder;
 begin
 if Mother^.Debug.Verbose then AddLog(
 '  Parsing the data tree to mark assets for storing...');
 //if not CpsWalkGraph(Module.Logic, @FindAssetsWalkProc)
 //then begin
 try
 t:= TAssetFinder.Create(Module.Logic, ASSET_MASK);
 t.Go;
 FreeAndNil(t);
 except
 Mother^.State.StateTrashedRestartRequired:= Yes;
 Die(GetChepersyErrorLog());
 end;
 if Mother^.Debug.Verbose then AddLog(
 '  Ok, found %0.', [Length(TAssetManager.ToStore.List)]);
 end;
Добавлено спустя 3 часа 30 минут 49 секунд:Вы таки не поверите: после исправления одного (одного!) ляпа, оно запустилось и пошло!
И... И я взвыл в тоске, вспомнив, что 
перед тем, как зарылся в рефакторинг СУБД, я полностью развинтил и перепахал механизм служебного гуя системы переключения модулей, намереваясь выпилить костыльные костыли и переделать эти меню с нуля на обычном гуе, оформив, как служебный игровой модуль. А перед этим развинтил и перепахал обычный гуй, намереваясь устроить его рефакторинг.
И теперь движок рисует серый квадрат Малевича, на внешние раздражители не реагируя. А Я ЗА ЭТИ ДВА ГОДА ЗАБЫЛ, КАК ОНО ТАМ УСТРОЕНО, И ЧТО ВООБЩЕ СОБИРАЛСЯ ДЕЛАТЬ!!!  
 
   
   
   
 Скриншот: отладочный вывод всех 28 фиксированных размеров диспетчера памяти

P.S. Цитирую свой пост от 9 октября 2018-го:
на следующие выходные добью перетрях системы гуя и займусь оконным менеджером для линукса. Надо, наконец, обеспечить полноэкранный режим и захват мыши.
 