Я-ХУУУ!

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

И даже подёргивается!
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-го:
на следующие выходные добью перетрях системы гуя и займусь оконным менеджером для линукса. Надо, наконец, обеспечить полноэкранный режим и захват мыши.
