Ostatnie wiadomości

jeszcze mi zejdzie trochę bo się tego tykam jak pies jeża. dużo testowania.
Jakiś czas temu przy przy okazji chęci dodania trialogu musiałem zainstalować sobie także Ikarusa i LeGo. Na stronie internetowej https://gothic-modding-community.github.io/gmc/pl/zengin/scripts/extenders/ikarus/ jest opis instalacji ale niestety w kontekście Gothica I nie uwzględnia pewnej rzeczy, więc wrzucam tu na wypadek gdyby ktoś potrzebowała albo gdybym ja w przyszłości musiał ponownie to instalować do swojego Gothica.

EDIT: Tutaj jest pewna kontrowersja odnośnie punktu nr 8 tego mojego mini poradnika. Być może nie trzeba przenosić zawartości z "INTERN.SRC" do "GOTHIC.SRC". Jak chcesz to możesz spróbować instalacji Ikarusa bez tego przenoszenia zawartości z "INTERN.SRC" do "GOTHIC.SRC" a jak coś nie zadziała to wtedy spróbuj tym sposobem z punktu nr 8. Zrobisz jak uważasz.

Instalacja IKARUSA i LeGo do Gothica I - poradnik łopatologiczny

1. Wchodzisz na GitHuba https://github.com/Lehona/Ikarus i ściągasz całą zawartość.

Jak? Widzisz ten zielony przycisk "<CODE>"? Kliknij go i wybierz "Download.zip".

2. Teraz w Gothic\_work\Data\Scripts\Content stwórz folder do którego wypakujesz Ikarusa. Ja ten folder nazwałem po prostu "Ikarus".

3. Wypadkuj zawartość "Download.zip" do folderu Gothic\_work\DATA\scripts\Content\Ikarus.

4. Teraz w folderze Gothic\_work\DATA\scripts\Content\Ikarus powinien się pojawić nowy folder - to jest ten z rozpakowania. Po rozpakowaniu będzie nosił nazwę "Ikarus-master" or "Ikarus-X.X.X". Dla ułatwienia zmień tę nazwę po prostu na "Ikarus" - będziesz miał folder "Ikarus" w folderze "Ikarus"

Gothic\_work\DATA\scripts\Content\Ikarus\Ikarus

5. Jako, że instalujemy IKARUSA do Gothica I to potrzebujemy folder "EngineClasses_G1" i nie potrzebujemy folderu "EngineClasses_G2". Usuń folder "EngineClasses_G2", zostaw "EngineClasses_G1".


6. Teraz przechodzimy właśnie do tej części, której brakuje w poradniku z https://gothic-modding-community.github.io/gmc/pl/zengin/scripts/extenders/ikarus/setup/


7. By się nie rozpisywać. Musisz zmienić pewne rzeczy w pliku Gothic.src i INTERN.SRC

Oryginalne pliki wyglądają tak (UWAGA: przedstawiam tu tylko interesujące nas fragmenty tych dwóch plików .src więc nie kopiuj tego na pałę).

Oryginalne i niezmodyfikowane pliki:

oryginalny "Gothic.src"

_INTERN\INTERN.SRC
_INTERN\MAGIC_INTERN.D

oryginalny "Intern.src"
constants.d
classes.d

8. [WSPOMNIANA KONTROWERSJA] Teraz przenosimy rzeczy z pliku Intern.src do Gothic.src by móc pod nimi wkleić fragment dotyczący Ikarusa oraz LeGo.

Po wszystkim powinno to wyglądać tak:

"Gothic.src"


_INTERN\constants.d
_INTERN\classes.d
Ikarus\Ikarus\Ikarus_G1.src
LeGo\LeGo\Header_G1.src
_INTERN\MAGIC_INTERN.D

"Intern.src"
////////constants.d
////////classes.d

9. Instalacja LeGo przebiega analogicznie do instalacji IKARUSA więc już jej nie opisuję. Ściągasz pliki, tworzysz folder LeGo, rozpakowujesz do tego folderu zawartość ściągniętej z GitHuba paczki, usuwasz rzeczy z G2 (zobaczysz, że w https://github.com/Lehona/LeGo masz przy w nazwach niektórych plików G1 a w innych G2 - to te z G2 usuwasz).

W "Gothic.src" i "Intern.src" już nic nie "modzisz" bo stosowne rzeczy wprowadziłeś już przy okazji instalacji Ikarusa (w punkcie 9 tego poradnika)


10. Zagadnienie inicjalizacji masz opisane tutaj:

(Jako pierwsze zrób inicjalizację pod Ikarusa)
https://gothic-modding-community.github.io/gmc/pl/zengin/scripts/extenders/ikarus/setup/

(Potem uzupełnij tę inicjalizację o rzeczy dotyczące LeGo)
https://gothic-modding-community.github.io/gmc/pl/zengin/scripts/extenders/lego/setup/

Nie jest tego dużo. Po prostu zwiń to na sam dół i masz tam to opisane jak wół.



11. Jeżeli jednak będziesz mieć problem z dodaniem tej inicjalizacji do Startup.d to podrzucam tutaj kilka rzeczy, które pomogą ci przez to przebrnąć. 

Spoiler
W pliku Startup.d (plik znajduje się w folderze Gothic\_work\DATA\scripts\Content\Story) na samej górze tego pliku Startup.d wklej po prostu coś takiego

FUNC VOID INIT_GLOBAL()
{
    // Init Ikarus
    MEM_InitAll ();
    // Init LeGo
    LeGo_Init(LeGo_All)
};

W przypadku Gothica I musisz jeszcze do każdej funkcji "func VOID INIT_" wstawić "Init_Global();"

UWAGA: Tego "Init_Global();" wstawiasz do fukcji "func VOID INIT_" a NIE do funkcji "VOID STARTUP_"

Dla ułatwienia wrzucam fragment jak powinno to wyglądać:

Spoiler
func VOID STARTUP_DEMONTOWER ()
{
   STARTUP_SUB_DEMONTOWER ();
};

func VOID INIT_DEMONTOWER ()
{
    Init_Global();
   INIT_SUB_DEMONTOWER ();
};



func VOID STARTUP_FREEMINCAMP ()
{
   STARTUP_SUB_FREEMINECAMP ();
};

func VOID INIT_FREEMINCAMP ()
{
    Init_Global();
   INIT_SUB_FREEMINECAMP ();
};




func VOID STARTUP_PSICAMP ()
{
    STARTUP_SUB_PSICAMP ();
};

func VOID INIT_PSICAMP ()
{
    Init_Global();
   INIT_SUB_PSICAMP ();
};



func VOID STARTUP_NEWCAMP ()
{
    STARTUP_SUB_NEWCAMP ();
};

func VOID INIT_NEWCAMP ()
{
    Init_Global();
    INIT_SUB_NEWCAMP ();
};



func VOID STARTUP_OLDCAMP ()
{
    STARTUP_SUB_OLDCAMP ();
};

func VOID INIT_OLDCAMP ()
{
    Init_Global();
    INIT_SUB_OLDCAMP ();
};



func VOID STARTUP_SURFACE ()
{
    STARTUP_SUB_SURFACE ();
};

func VOID INIT_SURFACE ()
{
    Init_Global();
    INIT_SUB_SURFACE ();
};



Tych rzeczy nie musisz z kolei wstawiać do "sublokacji". Czyli tam gdzie masz funckje zaczynające się na "func VOID INIT_SUB_" tam nie musisz wstawiać. Przykład "func VOID INIT_SUB_PSICAMP ()"

Spoiler
func VOID INIT_SUB_PSICAMP ()
{
/**************************************************************
**                STARTUP_LIGHTS IN PSICAMP                  **
**************************************************************/
Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_01",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_01",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_01",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_02",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_02",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_02",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_03",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_03",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_03",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_04",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_04",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_04",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_05",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_05",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_05",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_06",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_06",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_06",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_07",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_07",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_07",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_08",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_08",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_08",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_09",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_09",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_09",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_10",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_10",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_10",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_11",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_11",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_11",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_12",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_12",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_12",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_13",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_13",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_13",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_14",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_14",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_14",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_15",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_15",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_15",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_16",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_16",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_16",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_17",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_17",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_17",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_18",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_18",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_18",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_19",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_19",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_19",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_20",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_20",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_20",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_21",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_21",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_21",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_22",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_22",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_22",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_23",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_23",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_23",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_24",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_24",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_24",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_25",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_25",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_25",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_26",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_26",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_26",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_27",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_27",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_27",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_28",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_28",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_28",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_29",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_29",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_29",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_30",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_30",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_30",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_31",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_31",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_31",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_32",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_32",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_32",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_33",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_33",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_33",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_34",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_34",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_34",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_35",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_35",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_35",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_36",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_36",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_36",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_37",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_37",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_37",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_38",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_38",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_38",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_39",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_39",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_39",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_40",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_40",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_40",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_41",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_41",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_41",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_42",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_42",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_42",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_43",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_43",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_43",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_44",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_44",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_44",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_45",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_45",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_45",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_46",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_46",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_46",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_47",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_47",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_47",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_48",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_48",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_48",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_49",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_49",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_49",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_50",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_50",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_50",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_51",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_51",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_51",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_52",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_52",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_52",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_53",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_53",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_53",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_54",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_54",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_54",0);

Wld_SetObjectRoutine (00,00,"PC_CRYSTALLIGHT_55",1);
Wld_SetObjectRoutine (20,00,"PC_CRYSTALLIGHT_55",1);
Wld_SetObjectRoutine (05,00,"PC_CRYSTALLIGHT_55",0);

/**************************************************************
**        PORTALRAUMZUWEISUNG IM PSICAMP          **
**************************************************************/
Wld_AssignRoomToGuild("PSIH01",GIL_NOV); //OK nlhu01 - nlhu32               
Wld_AssignRoomToGuild("PSIH02",GIL_NOV); //defekt       
Wld_AssignRoomToGuild("PSIH03",GIL_NOV); //defekt
Wld_AssignRoomToGuild("PSIH04",GIL_NOV);
Wld_AssignRoomToGuild("PSIH05",GIL_NOV);
Wld_AssignRoomToGuild("PSIH06",GIL_NOV); //defekt
Wld_AssignRoomToGuild("PSIH07",GIL_NOV); //defekt
Wld_AssignRoomToGuild("PSIH08",GIL_NOV); //defekt
Wld_AssignRoomToGuild("PSIH09",GIL_NOV); //defekt
Wld_AssignRoomToGuild("PSIH10",GIL_NOV);//defekt
Wld_AssignRoomToGuild("PSIH11",GIL_NOV);//defekt
Wld_AssignRoomToGuild("PSIH12",GIL_NOV);//defekt
Wld_AssignRoomToGuild("PSIH13",GIL_NOV);//defekt
Wld_AssignRoomToGuild("PSIH14",GIL_NOV);//defekt
Wld_AssignRoomToGuild("PSIH15",GIL_NOV);//defekt
Wld_AssignRoomToGuild("PSIH16",GIL_NOV);//defekt
Wld_AssignRoomToGuild("PSIH17",GIL_NOV);//defekt
Wld_AssignRoomToGuild("PSIH18",GIL_NOV);
Wld_AssignRoomToGuild("PSIH19",GIL_NOV);
Wld_AssignRoomToGuild("PSIH20",GIL_NOV);
Wld_AssignRoomToGuild("PSIH21",GIL_NOV);
Wld_AssignRoomToGuild("PSIH22",GIL_NOV);
//Wld_AssignRoomToGuild("PSIH23",GIL_NOV); //Harloks Hütte, Hut 31
Wld_AssignRoomToGuild("PSIH24",GIL_NOV);
//Wld_AssignRoomToGuild("PSIH25",GIL_NOV); Alchemielabor soll frei zugänglich sein!
Wld_AssignRoomToGuild("PSIH26",GIL_NOV);
Wld_AssignRoomToGuild("PSIH27",GIL_NOV);
Wld_AssignRoomToGuild("PSIH28",GIL_NOV);
Wld_AssignRoomToGuild("PSIH29",GIL_NOV);
Wld_AssignRoomToGuild("PSIH30",GIL_NOV);
Wld_AssignRoomToGuild("PSIH31",GIL_NOV);
Wld_AssignRoomToGuild("PSIH32",GIL_NOV);
Wld_AssignRoomToGuild("PSIH33",GIL_NOV);
Wld_AssignRoomToGuild("PSIH34",GIL_NOV);
Wld_AssignRoomToGuild("PSIH35",GIL_NOV);
Wld_AssignRoomToGuild("PSIH36",GIL_NOV);
};

Widzisz, w tym przytoczonym "func VOID INIT_SUB_PSICAMP ()" brak jest wstawionego "Init_Global();" - bo w funkjcach "func VOID INIT_SUB_" tego nie wstawiamy.

Oprócz tego "Init_Global();" musisz wstawiać praktycznie do każdego zena - czyli Starej Kopalni, Orkowego Cmentarzyska, Wolnej Kopalni i Świątyni Śniącego. To samo jeżeli chcesz wstawić do swojej modyfikacji jakiś nowy świat to musisz dla tego dodanego świata napisać w Startup.d dwie funkcje "func void startup_NazwaTwojegoZena()" oraz "func void init_NazwaTwojegoZena()"

Przykładowo:

Spoiler

func void startup_NazwaTwojegoZena()
{
Wld_InsertNpc (NONE_911_TypowyNPC,"ENTRANCE");
Wld_InsertNpc (wolf,"PATH_2000");
};

func void init_NazwaTwojegoZena()
{
Init_Global();

Wld_SetObjectRoutine(0,0,"OC_FIREPLACE_NazwaTwojegoZena1",1);
Wld_SetObjectRoutine(23,59,"OC_FIREPLACE_NazwaTwojegoZena1",1);

Wld_SetObjectRoutine(0,0,"OC_FIREPLACE_NazwaTwojegoZena2",1);
Wld_SetObjectRoutine(23,59,"OC_FIREPLACE_NazwaTwojegoZena2",1);

B_InitMonsterAttitudes();
B_InitGuildAttitudes();
};

PS: Sam się trochę pieprzyłem z tymi plikami Gothic.src i INTERN.src bo w instrukcji na stronie https://gothic-modding-community.github.io/gmc/pl/zengin/scripts/extenders/ikarus/setup/ chyba założono, że domyślny i niezmodyfikowany plik Gothic.src z Gothic1 wygląda tak samo jak jego odpowiednik z Gothica2. Opisałem na podstawie tego co sam robiłem. Z tego co widzę, to chyba wszystko mi działa. Jeżeli popełniłem jakiś błąd to oczywiście proszę napisać.
73
Skrypty / Trialog
Kirgo2 - 2025-06-29, 12:53 
Dla nowicjuszy
(uzupełnienie do poradnika stworzonego przez @EdekSumo a właściwie to już gotowiec)

W tym szablonie od @EdekSumo wszystko ładnie śmiga.


INSTANCE DIA_NONE_20243_urstonak_witaj   (C_INFO)
{
npc         = NONE_20243_urstonak;//npc główny
nr          = 1;
condition   = DIA_NONE_20243_urstonak_witaj_Condition;
information = DIA_NONE_20243_urstonak_witaj_Info;
important = true;
permanent = FALSE;
};
FUNC INT DIA_NONE_20243_urstonak_witaj_Condition()
{
return TRUE;
};
FUNC VOID DIA_NONE_20243_urstonak_witaj_Info()
{
var C_NPC UrsTonak; UrsTonak = Hlp_GetNpc (NONE_20243_urstonak);//Deklarujemy zmienne npców którzy wezmą udział w rozmowie wraz z npc głównym
var C_NPC Dionis; Dionis = Hlp_GetNpc (none_20246_dionis);//
TRIA_Invite(Dionis);//ta funkcja "zaprasza" npce do dialogu musimy zaprosić wszystkich który mają rozmawiać prócz npca głównego
    TRIA_Start();//ta funkcja rozpoczyna dialog wszystkich npców musimy zaprosić przed tą funkcją bo inaczej chujnia
    TRIA_Next(UrsTonak);// w tej funkcji wybieramy jaki npc ma mówić
AI_Output (self, other, "DIA_NONE_20243_urstonak_witaj_15_00");//Stój morra gdzie zmierzasz?
AI_DrawWeapon(hero);
AI_Output (other, self, "DIA_NONE_20243_urstonak_witaj_15_01");//Nie twoja sprawa zawszony orku.
TRIA_Next (Dionis);// za każdym razem jak chcemy zmienić npc trzeba użyć tej funkcji.
AI_GotoNpc(self, other);
    AI_TurnToNpc(other, self);
AI_Output (self, other, "DIA_NONE_20243_urstonak_witaj_15_02");//Spokojnie wędrowcze ten ork nic Ci nie zrobi.
AI_Output (self, other, "DIA_NONE_20243_urstonak_witaj_15_03");//W Ignis Order nie musisz się obawiać orków.
AI_RemoveWeapon (hero);
TRIA_Next (UrsTonak);
AI_Output (self, other, "DIA_NONE_20243_urstonak_witaj_15_04");//Tak morra nie wszyscy orkowie pragną Cie zabić.
Log_CreateTopic (TOPIC_IgnisOrder, LOG_MISSION);
Log_SetTopicStatus (TOPIC_IgnisOrder, LOG_RUNNING);
B_LogEntry(TOPIC_IgnisOrder, "Spotkałem przyjaznego orka i niejakiego Dionisa mówił coś o jakimś Ignis Order.");
MIS_IgnisOrder = LOG_RUNNING;
        TRIA_Finish();// ta funkcja kończy cały dialog

};

Dla nowicjuszy, którzy mogą się obawiać tykać jakiekolwiek rzeczy, gdzie pada nazwa IKARUS - ten skrypt od @EdekSumo to liczyć gotowiec. Musicie zrobić właściwie tylko trzy-cztery rzeczy:
1. Ściągnąć tego IKARUSA i chyba LEGO też. Wbrew pozorom to nie jest takie trudne.
2. Teraz możecie użyć śmiało tego skryptu od @EdekSumo
3. Wklejacie go Gothic\_work\DATA\scripts\Content\Story\MISSIONS tak jakbyście wklejali normalny dialog. Co najfajniejsze, możecie gówno znać się na Ikarusie - trialog po prostu jest obsługiwany przez tego Ikarusa zupełnie tak samo jak zwykły dialog jest obsługiwany przez grę
4. Oczywiście musicie teraz ten trialog od @EdekSumo odpowiednio przerobić. Bo przecież w waszym modzie zamiast rozmowy orka UrStonaka, Dionisa i głównego bohatera będzie sobie "trialogował" ktoś inny. Przerabiasz tak jakbyś przerabiał normalny dialog.

Bardzo fajna i prosta rzecz. DZIAŁA DLA GOTHICA I [słownie: Gothica Jedynki :) ]

Jak ktoś się jeszcze cyka to wrzucam swój dialog zrobiony na podstawie szablonu od EdkaSumo z rzeczami zaznaczonymi kolorkami dla czytelności. Oczywiście wszystko robiłem to guzik znając się na IKARUSIE - tylko przeklejając tę rzecz od Edka i dostosowując na swoje potrzeby.

Spoiler

INSTANCE DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess   (C_INFO)
{
   npc         = Tpl_4025_Templer;//npc główny
   nr          = 2;
   condition   = DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_Condition;
   information = DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_Info;
   important   = true;                                    ////////ustawiłem tak sobie ale wy nie musicie
   permanent    = FALSE;                         ////////ustawiłem tak sobie ale wy nie musicie
};
FUNC INT DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_Condition()
{
    if (Npc_KnowsInfo (other, DIA_GorNaSan_HELO1))
    {
    return TRUE;
    };
};

FUNC VOID DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_Info()
{
   var C_NPC GorAkunosh; GorAkunosh = Hlp_GetNpc (Tpl_4025_Templer);//Deklarujemy zmienne npców którzy wezmą udział w rozmowie wraz z npc głównym
   var C_NPC GorNaSan; GorNaSan = Hlp_GetNpc (Tpl_4029_Templer);//
   TRIA_Invite(GorNaSan);//ta funkcja "zaprasza" npce do dialogu musimy zaprosić wszystkich który mają rozmawiać prócz npca głównego
    TRIA_Start();//ta funkcja rozpoczyna dialog wszystkich npców musimy zaprosić przed tą funkcją bo inaczej chujnia
    TRIA_Next(GorAkunosh);// w tej funkcji wybieramy jaki npc ma mówić
   AI_Output (self, other, "DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_15_00");//GorAkunosh coś tam sobie mówi. 

   TRIA_Next (GorNaSan);// za każdym razem jak chcemy zmienić npc trzeba użyć tej funkcji.
   AI_Output (self, other, "DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_15_01");//GorNaSan coś sobie mówi.

   TRIA_Next (GorAkunosh);// za każdym razem jak chcemy zmienić npc trzeba użyć tej funkcji.
   AI_Output (self, other, "DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_15_02");//GorAkunosh coś tam sobie mówi. 

   TRIA_Next (GorNaSan);// za każdym razem jak chcemy zmienić npc trzeba użyć tej funkcji.
   AI_Output (self, other, "DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_15_03");//GorNaSan coś sobie mówi.
   AI_Output (self, other, "DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_15_04");//GorNaSan coś sobie mówi.

   TRIA_Next (GorAkunosh);// za każdym razem jak chcemy zmienić npc trzeba użyć tej funkcji.
   AI_Output (self, other, "DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_15_05");//GorAkunosh coś tam sobie mówi. 
   B_UseFakeScroll();
   AI_Output (self, other, "DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_15_06");//GorAkunosh coś tam sobie mówi. 
   B_UseFakeScroll();
   AI_Output (self, other, "DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_15_07");//GorAkunosh coś tam sobie mówi. 
   AI_Output (self, other, "DIA_Tpl_4025_GorAkunosh_TrialogMissionSuccess_15_08");//GorAkunosh coś tam sobie mówi. 
        TRIA_Finish();// ta funkcja kończy cały dialog
};


Nie muszę chyba dodawać, że ten dialog wrzuciłem do pliku DIA_Tpl_4025_Templer.d w folderze Gothic\_work\DATA\scripts\Content\Story\MISSIONS bo taką instancję posiada "npc główny" (nie mylić z głównym bohaterem!). W tym moim trialogu "npc głównym" był akurat GorAkunosh (Tpl_4025_Templer).

Jakby co to to niniejsze uzupełnienie do poradnika EdkaSumo pisane było pod Gothica I. Jeżeli chodzi o modowanie Gothica II to się nie wypowiem, bo się nie znam. Myślę jednak, że już nie nikt nie powinien mieć problemu ze wstawieniem trialogu do Gothica I.

Pozdro
Jak tam idą prace?
Czekać czy ogrywać na tej wersji co jest 😀
Jako, że jestem świeżo po ograniu modyfikacji muszę powiedzieć, że Ciemności Gordotha zrobiły na mnie duże wrażenie. Tym czym modyfikacja się zdecydowanie wyróżnia to widoczne położenie ogromnego nacisku autora na efekty dźwiękowe – to było bardzo filmowe gdy po danej kwestii dialogowej pojawiał się jakiś ustawiony dźwięk. Modyfikacja jest dopracowana, co także widać.

Miałbym jednak kilka uwag do ewentualnego przemyślenia. Jeżeli ktoś nie przeszedł modyfikacji to radziłbym nie otwierać spoilerów.

1. Niekiedy trudno było ze względu na te ciemności trafić do miejsc, do których wysyłała nas gra. Chodzi o miejsca poza obozem, bo o ile w Starym Obozie robiła ona naprawdę dobrą robotę o tyle ze względu na brak widoczności nawet z jednocześnie odpalonymi pochodnią i runą światła trudno było trafić do
Spoiler
nawiedzonej chatki, Kanionu Trolli czy z Kanionu Trolli do Starego Obozu.
Dobrym rozwiązaniem mogłoby być dodanie do gry mapy.


2. Miejscami dało się odczuć odrobinę przesadzony poziom trudności.
Spoiler
Mam tu na myśli cieniostwory z finałowej lokacji.


3. Uwagi co do wyglądu pewnej postaci.
Spoiler
Chodzi o tytułowego Gordotha. W wersji, którą ogrywałem miał on wygląd Śniącego co po prostu było słabe i psuło immersję. W wersji, którą ogrywał youtuber WAGON demon miał wygląd królowej pełzaczy. Myślę więc, że tytułowy demon dopiero czeka na swój właściwy, godny tej modyfikacji model ciała bo modyfikacja naprawdę jest przednia :)

Element zręcznościówki pod koniec też był ciekawy.

Polecam Ciemności Gordotha także tym graczom, którzy niekoniecznie celują w horrory. Jakość modyfikacji jest bardzo wysoka.
Ja bym zrobił to chyba tak:
1. Dialog z jakąś postacią. W tym dialogu wstawić

JakaśRzecz = Wld_GetDay();
2. Drugi dialog z tą postacią lub inną. Dialog ten ustawić na IMPORTANT żeby postać sama do nas zagadywała i w tym dialogu dać to co chcemy wywołać (np. zmianę rutyny u jakiejś innej postaci).

Ewentualnie próbowałbym poeksperymentować z podczepieniem tych rzeczy pod coś co każdy gracz będzie musiał prędzej czy później kliknąć - np. pod PC_Sleep w Sleepabit.d albo wypicie mikstury zdrowia.
A masz jakiś pomysł jak wywołać jakieś zdarzenie w świecie po upływie tych 2 dni? Np, że npc zmieni rutynę itp. Próbowałem podpiąć ten warunek Wld_GetDay pod wyzwalacz poklatkowy, ale nie zadziałało w ogóle.
Krótki poradnik na temat tego jak ustawić by dana postać odezwała się do nas dopiero za kilka dni. Sam pierdzieliłem się z ustawianiem tego zdecydowanie zbyt długo, więc może jakiemuś podobnemu świeżakowi oszczędzę podrzucając gotowca.


1. Najłatwiej opisywaną rzecz zrobić biorąc za wzór dialog ze Świstakiem.

Whistler_BuyMySword_Day = Wld_GetDay();
2. To coś wyżej rozpoczyna odliczanie. Dzieli się na "Whistler_BuyMySword_Day" i "Wld_GetDay". To pierwsze zmieniamy na to na co chcemy zmienić, a to drugie zostawiamy. Zróbmy więc sobie przykładowo:

JozekJeKielbaseIpowieNamCzyBylaDobra = Wld_GetDay();
3. Teraz to nasze "JozekJeKielbaseIpowieNamCzyBylaDobra" trzeba wpisać do pliku Story_Globals.d w folderze Gothic\_work\DATA\scripts\Content\Story

var int JozekJeKielbaseIpowieNamCzyBylaDobra;


5. A teraz najważniejsze: jak zrobić by warunek zadziałał tak jak chcemy

if (JozekJeKielbaseIpowieNamCzyBylaDobra <= (Wld_GetDay() - 2))To jest warunek, że coś się stanie PO UPŁYWIE dwóch (?) dni



(JozekJeKielbaseIpowieNamCzyBylaDobra > (Wld_GetDay() - 2))To jest warunek, że coś się stanie ZANIM UPŁYNĄ dwa (?) dni



I tyle. Jak jesteś nowicjuszem to lepiej ze znakami ">" i "<" nie kombinować, bo te znaki na gruncie skryptów Gothica rządzą się chyba jakąś własną ezoteryczną logiką, więc można dostać nerwicy i zmarnować od groma czasu na zabawę z tym szajsem. Po prostu weź z działającego gotowca i miej to z głowy :)
III tura właśnie wystartowała. Ilość poprawek była większa niż się spodziewałem więc trochę to trwało.

https://www.youtube.com/watch?v=9lIZufgE2Vk

[PL] Mroczne Tajemnice 2.5 Unofficial Rebalance - przedpremierowy Q&A-live!
26 cze 2025, 17:00
80
func void EndlessNight ()
{
var int ptr; ptr = MEM_InstToPtr (MEM_SkyController);
var int skystateslist; skystateslist = MEM_ReadInt (ptr+316);
ptr = MEM_ReadIntArray (skystateslist, 4);

var int R_poly; R_poly = MEM_ReadInt (ptr+4);
var int G_poly; G_poly = MEM_ReadInt (ptr+8);
var int B_poly; B_poly = MEM_ReadInt (ptr+12);

var int R_fog; R_fog = MEM_ReadInt (ptr+16);
var int G_fog; G_fog = MEM_ReadInt (ptr+20);
var int B_fog; B_fog = MEM_ReadInt (ptr+24);

var int i; i = 0;

repeat (i, 7);
ptr = MEM_ReadIntArray (skystateslist, i);
MEM_WriteInt (ptr+4, R_poly);
MEM_WriteInt (ptr+8, G_poly);
MEM_WriteInt (ptr+12, B_poly);
MEM_WriteInt (ptr+16, R_fog);
MEM_WriteInt (ptr+20, G_fog);
MEM_WriteInt (ptr+24, B_fog);
end;
};

Przetestowałem w Gothic 1. Funkcja działa bardzo fajnie. Jest tylko problem z godzinami od szóstej (rano) do dziesiątej (rano). O szóstej (rano) jest bardzo widno, podobnie o siódmej (rano). Dopiero o dziewiątej (rano) zaczyna się robić trochę bardziej wieczorowo ale o nocy też trudno tu mówić. Szczególnie ta ósma (rano) i dziewiąta (rano) odstają. Oprócz tego wszystko ładnie śmiga :)
Do góry