Исправил ещё один баг в Чеперси: неправильно угадывала как компилятор размещает поля - статические массивы из элементов в 1 и 2 байта.
Добавлено спустя 5 часов 36 минут 15 секунд:Забраковал ранее наработанное (кроме разрежённого массива).
Не будет ограничений на количество слоёв. Это будет древовидная структура произвольной формы. У родительского любое количество дочерних.
Дополнительное ограничение: дочерний слой должен тикать синхронно с родительским. Потом может тикать сам ещё любое число раз. Не может отставать или воздерживаться.
Экземпляры классов не будут хранить, к какому слою они принадлежат. Будут лишь иметь счётчик ссылок.
Фактически, то что я делаю - это костыли для придания классам свойства CopyOnWrite со счётчиком ссылок.
Состоялся губозакатывательный сеанс №2. Слои альтернативной реальности будут расползаться, как раковая опухоль. Расслаиваясь в любом месте, где у родителя или у потомка произошло изменение. Или лечить это механизмом сличения контрольных сумм и "схлопывания" идентичных объектов?
Неее, нуегона. Пусть все слои, кроме базового, будут короткоживущими.
По любому, если поставить перманентное заклинание "здесь не дверь, здесь стенка", то через раздавленных бабочек ИИ близбежавшего зайца это отличие передастся дальше, и через какое-то время будем иметь две полные копии игрового мира, работающие параллельно.
Вывод: иллюзии должны быть или короткими (полторы минуты максимум), или работать на другом принципе, альтернативной чисто визуальной составляющей.
Добавлено спустя 11 часов 19 минут 49 секунд:В связи с заявленной кончиной 
GetVersionEx , накатал/скопипастил целую простыню для опознания ОС на основе
VerifyVersionInfo(), коя заявлена современной и появилась ещё в Windows 2000. Пристегнул к экзешнику манифест, скопипащенный с 
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx .
И что бы вы думали?  Win32MajorVersion / WIN32MinorVersion показали 10.0.
Но паскаль-то их выставляет, вызывая GetVersionEx() !
Т.е. врут собаки, зря трудился  
 З.Ы. В десятке работает плавно, но с секундным подвисанием при переключении с 2 на 3 (ускоренную промотку). На индикаторе при этом мелькает, что основной поток ждёт синхронизации. Но после, когда всё становится плавным, основная его нагрузка - спит! А в семёрке - вся нагрузка всегда окрашена в ждёт синхронизации.
Отрадно, что починили взад, но теперь мне отлаживать синхронизацию потоков в трёх осях: XP, 7 и 10, и в каждой оно ведёт себя серьёзно по разному.
- Код: Выделить всё
  {$ifdef windows}
  function GetLocalAppDataDir: TFileNameString; forward;
 {
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724451%28v=vs.85%29.aspx
[GetVersionEx may be altered or unavailable for releases after Windows 8.1.
Instead, use the Version Helper APIs]
With the release of Windows 8.1, the behavior of the GetVersionEx API has
changed in the value it will return for the operating system version. The value
returned by the GetVersionEx function now depends on how the application
is manifested.
Applications not manifested for Windows 8.1 or Windows 10 will return the
Windows 8 OS version value (6.2). Once an application is manifested for a given
operating system version, GetVersionEx will always return the version that the
application is manifested for in future releases.
    }
  function DetectWindowsNTVersion(): TOSType;
  {$if defined(win32) and (FPC_FULLVERSION<20700)}
    type
      OSVersionInfoEX = record
          dwOSVersionInfoSize : DWORD;
          dwMajorVersion      : DWORD;
          dwMinorVersion      : DWORD;
          dwBuildNumber       : DWORD;
          dwPlatformId        : DWORD;
          szCSDVersion        : array[0..127] of AnsiChar;
          wServicePackMajor   : WORD;
          wServicePackMinor   : WORD;
          wSuiteMask          : WORD;
          wProductType        : BYTE;
          wReserved           : BYTE;
        end;
    var
      VerifyVersionInfo: function(
        var lpVersionInfo:  OSVersionInfoEX;
        dwTypeMask: dword;
        dwlConditionMask: qword
      ): boolean; stdcall;
      VerSetConditionMask: function(
        dwlConditionMask: qword;
        dwTypeBitMask: dword;
        dwConditionMask: byte
      ): qword; stdcall;
//    ULONGLONG WINAPI VerSetConditionMask(
//      _In_ ULONGLONG dwlConditionMask,
//      _In_ DWORD     dwTypeBitMask,
//      _In_ BYTE      dwConditionMask
//    );
      //BOOL WINAPI VerifyVersionInfo(
      //  _In_ LPOSVERSIONINFOEX lpVersionInfo,
      //  _In_ DWORD             dwTypeMask,
      //  _In_ DWORDLONG         dwlConditionMask
      //);
      dll: THandle;
      p: pointer;
    const
      VER_MAJORVERSION = $0000002;
      VER_MINORVERSION = $0000001;
      VER_GREATER_EQUAL = 3;
      function LoadProcAddress(hdll: THandle; ProcName: ansistring) : pointer;
      var
        baseaddr: pointer;
        exename: UnicodeString;
      begin
        Result:= GetProcAddress(hdll, PChar(ProcName));
        if Assigned(Result) then begin
          GetModuleByAddr(Result, baseaddr, exename);
          VerboseLog('      %0() at %1 in %2', [ProcName, Result, exename]);
        end
        else
          VerboseLog('      %0() not found!', [ProcName]);
      end;
  {$endif}
    function IsOrGreater(wMajorVersion, wMinorVersion: Word): Boolean;
    var
      osvi: OSVersionInfoEX;
      dwlConditionMask: qword;
    begin
      FillChar(osvi, sizeof(osvi), 0);
      osvi.dwOSVersionInfoSize := SizeOf(osvi);
      osvi.dwMajorVersion := wMajorVersion;
      osvi.dwMinorVersion := wMinorVersion;
      dwlConditionMask := VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL);
      dwlConditionMask := VerSetConditionMask(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
      Result := VerifyVersionInfo(osvi, VER_MAJORVERSION or VER_MINORVERSION, dwlConditionMask);
    end;
  begin
    Result:= ostWin2k;
    try
      VerboseLog(  'Detecting Windows NT version...');
      {$if defined(win32) and (FPC_FULLVERSION<20700)}
        VerboseLog('    loading kernel32.dll...');
        dll:= LoadLibrary('kernel32.dll');
        p:=  LoadProcAddress(dll, 'VerifyVersionInfoA');
        if not Assigned(p) then Exit;
        pointer(VerifyVersionInfo):= p;
        p:=  LoadProcAddress(dll, 'VerSetConditionMask');
        if not Assigned(p) then Exit;
        pointer(VerSetConditionMask):= p;
      {$endif}
      if IsOrGreater(5, 1) then Result:= ostWinXP;
      if IsOrGreater(6, 0) then Result:= ostVista;
      if IsOrGreater(6, 1) then Result:= ostWin7;
      if IsOrGreater(6, 2) then Result:= ostWin8;
      if IsOrGreater(6, 3) then Result:= ostWin81;
      if IsOrGreater(10, 0) then Result:= ostWin10;
    except
    end;
  end;
  {$endif}
  procedure DetectOSType;
  begin
    VerboseLog('Detecting operating system...');
   {$ifdef unix}
     {$ifdef darwin}
      Mother^.State.OS:= ostMacOSX;
     {$else}
      Mother^.State.OS:= ostLinux;
     {$endif}
   {$else}
     if RunningInWine then begin
       Mother^.State.OS:= ostWine;
       Mother^.State.DriveZIsRoot:= GetZIsRoot();
       if Mother^.State.DriveZIsRoot then begin
         //otherwise we're unable to tell Linux from MacOS X
         if FileExists('z:usrliblibc.dylib')
           then Mother^.State.OS:= ostDarwine;
       end;
     end
     else
       if _RunningInWindows98 then begin
         Mother^.State.OS:= ostWin98; //98 or Me
         VerboseLog('  It''s Windows 98 or Millennium, v%0.%1.', [Win32MajorVersion, WIN32MinorVersion]);
       end
       else begin
         VerboseLog('  It''s Windows NT %0.%1.', [Win32MajorVersion, WIN32MinorVersion]);
         case Win32MajorVersion of
           3,4: Mother^.State.OS:= ostWin2k;  //Windows NT 3.x and 4.x are treated as Windows 2000. Chentrah probably won't event start there
{           5: if WIN32MinorVersion = 0
                then Mother^.State.OS:= ostWin2k
                else Mother^.State.OS:= ostWinXP; //or server 2003, doesn't matter
           6: case WIN32MinorVersion of
                0: Mother^.State.OS:= ostVista;
                1: Mother^.State.OS:= ostWin7;
                2: Mother^.State.OS:= ostWin8;
              else
                Mother^.State.OS:= ostWin8;
              end;
}
         else
           Mother^.State.OS:= DetectWindowsNTVersion();
         end;
       end;
    Mother^.State.CSIDL_AppDataDir:= GetLocalAppDataDir;
    VerboseLog('  Local app data directory is %0', [GetLocalAppDataDir]);
    Mother^.State.Windows98.DoesNotSupportUnicode:= {$ifdef cpu64} false {$else} not CheckIfWindows98HasUnicodeSupportInstalled() {$endif} ;
   {$endif}
    Mother^.State.OstID:= GetEnumName(typeinfo(TOSType), ord(Mother^.State.OS));
    if Mother^.State.OS = ostWine
      then Mother^.State.OSName:= WineVersionString
      else begin
//        if (Win32MajorVersion < 5) or (Win32MajorVersion > 6)
//        or ((Win32MajorVersion = 6) and (WIN32MinorVersion > 1))
//          then Mother^.State.OSName:= 'Windows NT ' + IntToStr(Win32MajorVersion) + '.' + IntToStr(WIN32MinorVersion)
//          else
        Mother^.State.OSName:= OSDisplayedName[Mother^.State.OS];
      end;
   {$ifdef unix}
    {$ifndef darwin}
     DetectLinuxVersionString;
    {$endif}
   {$endif}
  end
Добавлено спустя 2 минуты 34 секунды:З.Ы. Пробовал я эти их сраные 
Version Helper functions. Нету их! По крайней мере, GetProcAddress() их не находит. Возможно, это вообще макросы в сишных хидерах.
- Код: Выделить всё
 Detecting operating system...
  Trying to detect Wine...
    ..system directory is C:\WINDOWS\system32
    ..trying to open C:\WINDOWS\system32\kernel32.dll for read...
    ..scanning for signature string "Wine placeholder DLL"...
    ..detected = false
  It's Windows NT 6.2.
Trying to detect if this is Windows 8.0 or greater...
    loading kernel32.dll...
      IsWindows8Point1OrGreater() not found!
Добавлено спустя 3 минуты 8 секунд:З.З.Ы. При отсутствии правильного манифеста, десятка, как и заявлено, тщательно прикидывается восьмёркой.