Właśnie wymyśliłem coś genialnego! Mianowicie Ikarus ładowany przed startem rozgrywki.
Metoda jest bardzo prosta - tworzymy mały świat (Najlepiej aby miał 1 wielokąt w meshu), ustalamy w pliku .ini parametr -nomenu, a następnie ustalamy jako świat, nasz świat z jednym wielokątem. Odpalamy grę, i widzimy, że mamy nasz świat, ale jak klikniemy ESC, to wyłączy nam się gra. Tutaj przychodzi znajomość skryptów, i wiedza, że przy inicjacji świata zawsze wywoła się funkcja Init_NazwaSwiata. Tworzymy więc funkcję:
void Init_Ikarus(); //Mój świat miał nazwę Ikarus
We wnętrzu funkcji Inicjujemy Ikarusa, i przywracamy menu in-game.
MEM_InitAll();
const int nomenuPtr = 8980632; //0x890898
MemoryProtectionOverride(nomenuPtr, 6);
var int AAAA; AAAA = (65 << 24) | (65 << 16) | (65 << 8) | (65 << 0);
MEM_WriteInt(nomenuPtr, AAAA);
MEM_WriteInt(nomenuPtr + 2, AAAA); /* now the param "AAAAAA" instead of "nomenu" is asked for */
Funkcja stworzona przez Sektenspinner'a bardzo jest tutaj pomocna

Teraz gdy naciśniemy ESC, to otworzy nam się stare menu.
Jednak gothic przy próbie odpalenia nowej gry odpali nam nasz świat Ikarus.zen Metoda jest prosta - Hook na zCWorld::LoadWorld(zSTRING);
Jest to banalne:
const string OriginalWorld_Name = "NewWorld\NEWWORLD.ZEN";
func void RestoreWorld()
{
var string msg; msg = MEM_ReadString(MEM_ReadInt(ESP + 4));
if(Hlp_StrCmp(msg, "Ikarus.zen"))
{
var int p; p = _@s(OriginalWorld_Name);
MEM_WriteInt(ESP + 4, p);
};
};
OriginalWorld_Name, to ścieżka z nazwą świata. Więc jeżeli zen który ma się załadować nosi nazwę Ikarus.zen, to skrypt zmieni jego nazwę na naszą upragnioną nazwę

Wywołujemy Hooka dodając wpis do Init_Ikarus:
HookEngineF(6451408, 7, RestoreWorld);
Na końcu, wywołajmy oryginalne menu:
func void Debug_Init() //Strasznie to słabe - muszę znaleźć coś lepszego :<
{
ExitSession();
};
I w Init_Ikarus, pod Hookiem:
FF_ApplyExt(Debug_Init, 2500, 1);
Cały kod powinien wyglądać tak (Wersja dla leniwych)
const string OriginalWorld_Name = "NewWorld\NEWWORLD.ZEN";
func void RestoreWorld()
{
var string msg; msg = MEM_ReadString(MEM_ReadInt(ESP + 4));
if(Hlp_StrCmp(msg, "Ikarus.zen"))
{
var int p; p = _@s(OriginalWorld_Name);
MEM_WriteInt(ESP + 4, p);
};
};
func void Debug_Init()
{
ExitSession();
};
func void Init_Ikarus()
{
MEM_InitAll();
const int nomenuPtr = 8980632; //0x890898
MemoryProtectionOverride(nomenuPtr, 6);
var int AAAA; AAAA = (65 << 24) | (65 << 16) | (65 << 8) | (65 << 0);
MEM_WriteInt(nomenuPtr, AAAA);
MEM_WriteInt(nomenuPtr + 2, AAAA); /* now the param "AAAAAA" instead of "nomenu" is asked for */
HookEngineF(6451408, 7, RestoreWorld);
FF_ApplyExt(Debug_Init, 2500, 1);
};
FrameFunctions wymaga zastąpienia, ale póki co działa!
Adresy i offsety, są tylko do Gothic 2!!! Testowałem krótki czas, ale powinno działać w 99%.
Dowód działania - standard - LoadBar jak w Gothic 1:

Cóż... Żywe Menu nie będzie już problemem! Pozdro, oraz zachęcam do testowania.
P.S Ale świat to sami sobie zróbcie xD