Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - Kirgo2

Strony: [1] 2 3
1
Skrypty / Długa bądź wieczna noc w G1
« dnia: 2025-07-03, 12:33 »
To akurat nie jest sposób mój tylko Splasha - ja to tylko przetestowałem w Gothicu 1 :)

W linku wrzucam cały cykl dobowy (screeny).

https://drive.google.com/drive/folders/1MWdjpVEC9IxiuklGrz9KcPhB16L5qK3N

Mała uwaga: Proszę się nie sugerować pochodniami, bo zmieniłem im trochę rutyny.

2
A ja to robiłem dwa tygodnie temu i u mnie akurat zadziałało dopiero jak zrobiłem to z tym przeniesieniem zawartości z Intern.src do Gothic.src chociaż oczywiście nie wykluczam, że zwyczajnie mogłem spaprać coś innego. Pliki .src różnią się trochę między Gothiciem 1 a Gothic 2 co nie było wyszczególnione na stronie, gdzie było opisywane krok po kroku więc musiałem jako tytułowy „nowicjusz i noob” robić to po omacku - metodą prób i błędów.

Możemy zrobić tak, że dam po prostu adnotację, że jeżeli ktoś będzie miał podobny kłopot jak ja to niech spróbuje z tym przeniesieniem. Chyba, że coś co tutaj opisuje w dalszej perspektywie wiąże się ze szkodami w plikach to wtedy te punkty się po prostu skasuje. 

PS: Podejrzewam ale to tylko moje podejrzenie, bo nie jestem programistą, że może tu chodzić coś o „_INTERN\MAGIC_INTERN.D” w pliku Gothic.src ale tego już nie rozstrzygnę.

3
Też myślałem, że na jedno wychodzi - tj. że te
Ikarus\Ikarus\Ikarus_G1.src
LeGo\LeGo\Header_G1.src
wstawię po prostu pod
_INTERN\INTERN.SRC
i że otrzymam wtedy takie coś
_INTERN\INTERN.SRC
_INTERN\MAGIC_INTERN.D
Ikarus\Ikarus\Ikarus_G1.src
LeGo\LeGo\Header_G1.src
albo takie coś
_INTERN\INTERN.SRC
Ikarus\Ikarus\Ikarus_G1.src
LeGo\LeGo\Header_G1.src
_INTERN\MAGIC_INTERN.D
i że wtedy będzie działać. No bo niby logiczne, że "constants.d" i "classes.d" zawierają się w "Intern.src".

Tymczasem zadziałało mi dopiero gdy w pliku "Intern.src" zakomentowałem i jego zawartość przeniosłem do Gothic.src a bawiłem się nad tym chyba z dwie godziny próbując na różne sposoby. To chyba było z dwa tygodnie temu.

Jeżeli ktoś ma Gothica I bez IKARUSA to mógłby to sprawdzić czy bez przenoszenia z pliku Intern.src to zadziała.

W każdym razie opisałem w jaki sposób zrobiłem, że mi to działa, więc może komuś się przyda.

4
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ć.

5
Skrypty / Trialog
« dnia: 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

6
Ukończone modyfikacje / [G1] Ciemności Gordotha v1.6.0
« dnia: 2025-06-24, 14:17 »
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.

7
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.

8
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 :)

9
Skrypty / Długa bądź wieczna noc w G1
« dnia: 2025-06-20, 15:00 »
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 :)

10
@frN i @Gother Dobra, rozgryzłem. frN mnie naprowadził, że parsowałem wyłącznie plik Gothic.src.

Rozwiązanie było głupio proste. Zamiast parsować przez Spacera po prostu trzeba było puścić GothicStarter_mod.exe znajdujący się w folderze Gothic\system. Jako początkujący modder z ostrożności wolałem parsować przez Spacera bo wiedziałem, że przed parsowaniem trzeba usunąć pliki OU.csl i OU.bin a w przypadku parsowania przez GothicStarter_mod.exe nie wiedziałem czy nie trzeba czego analogicznie usuwać by się nie duplikowało.

Temat do zamknięcia. Oczywiście dziękuję obu Panom i leci po propsie.

11
@frN W Spacerze biorę "Reparse Scriptfiles" i zaznaczam "Gothic.src".

12
Co do umieszczenia we właściwym folderze i tekstur w formacie TEX to powinno się zgadzać
Spoiler
MFX_MagicCloud.tga i LIGHTNING_BIG_A0.TGA są w Gothic\_work\DATA\TEXTURES\Effects\Magic

MFX_MAGICCLOUD-C.TEX i LIGHTNING_BIG_A0-C.TEX są w Gothic\_work\DATA\TEXTURES\_COMPILED

LIGHTNING_BIG_A0.TGA i LIGHTNING_BIG_A0-C.TEX to są rzeczy oryginalnie występujące w Gothic 1 i ich nie ruszałem.

Tekstury więc występują także w wersji skompilowanej i z tego co widzę to we właściwych lokacjach.

DX11, texturepacków czy innych dodatków, które mogłyby wpływać na tekstury czy efekt, który próbuję dodać nie używam. Dla jasności, plik Textures.vdf w folderze Gothic\Data mam zmieniony na Textures.vdf.disabled, więc to nie to.

Tak jak mi poradziłeś spróbowałem dokleić Wld_PlayEffect("spellFX_INCOVATION_RED",  self, self, 0, 0, 0, FALSE ); do sprawdzonych dialogów ale też się nie udało. Dla porównania dokleiłem do nich potem efekt z trzęsieniem ziemi Wld_PlayEffect("FX_EarthQuake",  self, self, 0, 0, 0, FALSE ); i efekt z trzęsieniem ziemi działał zaś ten z czerwoną falą nie działał.

Wydaje mi się, że problemem jest to, że pliki VISUALFX.DAT i PARTICLEFX.DAT w moim modzie czegoś tak jakby nie zasysały. Już tłumaczę co mam na myśli.

Porównałem pliki VISUALFX.DAT z Gothica II i mojego moda do Gothica 1. W tym z Gothica II jest taki wycinek odnoszący się do "INVOCATION" (Piranie w plikach przekręcają ten wyraz też na "INCOVATION")

    0AT                    INVOCATION_RED
˙˙˙˙   ˙10252
    0A                   EFIXED
˙˙˙˙   ˙10253
    0A   č  }            BIP01
˙˙˙˙   ˙10254
    0A           (w        REDAMBIENCE
˙˙˙˙   ˙10255
    0At                    SFX_Circle
˙˙˙˙   ˙10256
    0A                   mINVOCATION_GREEN
˙˙˙˙   ˙10257
    0A   č               FIXED
˙˙˙˙   ˙10258
    0A           xf        BIP01
˙˙˙˙   ˙10259
    0AA                    POISON
˙˙˙˙   ˙10260
    0A                    SFX_Circle
˙˙˙˙   ˙10261
    0A   č  PR            INVOCATION_BLUE
˙˙˙˙   ˙10262
    0A                    FIXED
˙˙˙˙   ˙10263
    0Ao                    BIP01
˙˙˙˙   ˙10264
    0A                   "REDAMBIENCE
˙˙˙˙   ˙10265
    0A   č  0             SFX_Circle
˙˙˙˙   ˙10266
    0A                    INVOCATION_VIOLET
˙˙˙˙   ˙10267
    0AR                    FIXED
˙˙˙˙   ˙10268
    0A                   {BIP01
˙˙˙˙   ˙10269
    0A   č  8             CATACLYSM
˙˙˙˙   ˙10270
    0A           `0        SFX_Circle
˙˙˙˙   ˙10271
    0Ae                    INVOCATION_WHITE
˙˙˙˙   ˙10272
    0A                   NFIXED

oraz

     pA  Ř”     [  q   Ž  R      SPELLFX_INCOVATION_RED
     pA    ž     \  ö   Ş  R      SPELLFX_INCOVATION_GREEN
     pA  řD¨     ]  ő   ň  R      SPELLFX_INCOVATION_BLUE
     pA    ˛      ^ ř   :  R      SPELLFX_INCOVATION_VIOLET
     pA  ŘĽ     _  ú   ‚  R      SPELLFX_INCOVATION_WHITE

Tego czegoś nie ma w VISUALFX.DAT mojej modyfikacji, więc tak jakby ten VISUALFX.DAT z mojej modyfikacji czegoś nie "zassał". To jest fragment zassany z Visualfxinst.d


To samo z w przypadku PARTICLEFX.DAT. Plik PARTICLEFX.DAT z Gothica II zawiera fragment, którego brak w pliku PARTICLEFX.DAT z mojego moda.

     pA    ű     ‹ö  w   R *     INVOCATION
     `@       %   ÷  !  -R       INVOCATION_RED
     pA    '      'ű  s   ¤S 1     INVOCATION_WHITE
     pA    -      śű  }   ŔS 1     INVOCATION_BLUE
     pA    3      ü  t   ÜS 1     INVOCATION_GREEN
     pA    9      ‘ü  y   řS 1     INVOCATION_VIOLET

Więc jak mówiłem tak jakby pliki VISUALFX.DAT i PARTICLEFX.DAT w moim modzie czegoś nie zasysały.


13
@Gother Nie do końca zrozumiałem.

Próbuję dodać tę czerwoną falę z rutyny a nie efekty zniekształcenia ekranu występujące podczas rozmowy z poszukiwaczem.

14
Gothic 2 posiadał w mojej ocenie ciekawszą animację dobijania postaci, więc próbowałem ją przenieść. Efekt ten udało mi się osiągnąć metodą prób i błędów. Poniżej zamieszczam małą instrukcję. Jest to prosty poradnik napisany z myślą o takich parweniuszach jak ja lub o niedzielnych graczach, którzy chcieliby po prostu sobie dodać tą rzecz do gry.


Być może nie wszystkie pliki są niezbędne ale tutaj już się nie wypowiem bo nie wiem.

Do dzieła!


1. Po pierwsze musisz mieć wypakowane animacje.
Spoiler
Jeżeli ich nie masz to możesz to zrobić przykładowo za pomocą programu Gothic VDFS tool. Link do niego masz choćby tutaj https://themodders.org/index.php?topic=31909.0

Trzeba rozpakować plik anims.VDF znajdujący się w folderze Gothic\Data.

Wypakuj te rzeczy i wklej do folderu głównego folderu Gothica. W twoim folderze Gothic\_work\DATA\ANIMS powinny się wówczas pojawić pliki z animacjami.

Po wypakowaniu pliku tych plików zmień nazwę pliku anims.VDF znajdującego się w folderze Gothic\Data na anims.VDF.disabled



2. Otwórz plik Humans.MDS znajdujący się w Gothic\_work\DATA\ANIMS


3. Interesuje nas ten fragment pliku Humans.MDS

// Todesstoß - Entfernung zwischen Bip01 Angreifer und Bip01 Opfer ca. 200 cm
ani ("t_1hSFinish" 1 "" 0.1 0.1 M. "Hum_1hSFinish_M03.asc" F 1 139 FPS:10)
{
*eventSFX (35 "FIG_SwordFinal" EMPTY_SLOT )

}

aniAlias ("t_2hSFinish" 1 "" 0.1 0.1 M. "t_1hSFinish" F)


// Dead Anis für t_1hSFinish
ani ("t_Wounded_2_Dead" 1 "s_Dead" 0.1 0.1 M. "Hum_Wound2Dead_M01.asc" F 1 139 FPS:10 CVS:0.1)
{
// *eventSFX (36 "FIG_DummyDie" EMPTY_SLOT )
}
ani ("t_WoundedB_2_DeadB" 1 "s_DeadB" 0.1 0.1 M. "Hum_WoundB2DeadB_M01.asc" F 1 139 FPS:10 CVS:0.1)
{
// *eventSFX (36 "FIG_DummyDie" EMPTY_SLOT )



4. Podmieniasz wskazany w punkcie 3 fragment na to:

// Todesstoß - Entfernung zwischen Bip01 Angreifer und Bip01 Opfer ca. 200 cm
ani ("t_1hSFinish" 1 "" 0.1 0.1 M. "Hum_1hSFinish_M03.asc" F 1 139 FPS:10)
{
*eventSFX (35 "FIG_SwordFinal" EMPTY_SLOT )

}

aniAlias ("t_2hSFinish" 1 "" 0.1 0.1 M. "t_1hSFinish" F)


// Dead Anis für t_1hSFinish

ani ("t_Wounded_2_Dead" 1 "s_Dead" 0.1 0.1 M. "Hum_Wound2Dead_A01.asc" F 1 89 CVS:0.1)

ani ("t_WoundedB_2_DeadB" 1 "s_DeadB" 0.1 0.1 M. "Hum_WoundB2DeadB_A01.asc" F 1 89 CVS:0.1)



5. Teraz musisz skopiować animacje z Gothica 2 . Chodzi o kilka plików znajdujących się w folderze Gothic II\_work\data\Anims\_compiled Są to następujące pliki:

HUMANS-S_WOUNDED.MAN
HUMANS-S_WOUNDEDB.MAN
HUMANS-T_STAND_2_WOUNDED.MAN
HUMANS-T_STAND_2_WOUNDEDB.MAN
HUMANS-T_WOUNDED_2_DEAD.MAN
HUMANS-T_WOUNDED_2_STAND.MAN
HUMANS-T_WOUNDEDB_2_DEADB.MAN
HUMANS-T_WOUNDEDB_2_STAND.MAN

Możesz po prostu je wyszukać w tym folderze po frazie "wounded". Kopiujesz te pliki i wklejasz je do Gothic\_work\DATA\ANIMS\_COMPILED podmieniając istniejące w tym folderze oryginalne pliki z jedynki.


5. Gotowe! W Gothicu I pojawiły się animacje dobijania z Gothica II.


UWAGA: Przed tą całą podmianką najlepiej zrób sobie kopię zapasową plików z Gothica I, które będziesz podmieniał. Możesz po prostu je wyszukać w tym folderze po frazie "wounded" i skopiować w bezpieczne miejsce.

15
Hejka. Próbuję przenieść pewien efekt wizualny z Gothic 2 do Gothic 1. Efekt ten ma być związany z rutyną danej postaci - przenoszę z Gothica 2 rutynę "zs_circle", czyli tę rutynę ktorą wykonują poszukiwacze nad okiem Innosa w kamiennym kręgu. Rutyna działa tylko mam problem, że nie działa ten efekt wizualny z czarem.

Poniżej opiszę co dokładnie zrobiłem.


1. Wkleiłem do Visualfxinst.d w Gothic\_work\DATA\scripts\system\VISUALFX to:


///    XXXXXXXXXXXXXXXXXXXXXXXXXXX
///    XX  I N V O C A T I O N  XX
///    XXXXXXXXXXXXXXXXXXXXXXXXXXX

INSTANCE spellFX_INCOVATION_RED (CFx_Base_Proto)
{
visname_S = "INVOCATION_RED";
emtrjmode_s = "FIXED";
emTrjOriginNode = "BIP01";
lightpresetname = "REDAMBIENCE";
    sfxid = "SFX_Circle";
      sfxisambient = 1;
};

INSTANCE spellFX_INCOVATION_GREEN (CFx_Base_Proto)
{
visname_S = "INVOCATION_GREEN";
emtrjmode_s = "FIXED";
emTrjOriginNode = "BIP01";
lightpresetname = "POISON";
    sfxid = "SFX_Circle";
      sfxisambient = 1;
};

INSTANCE spellFX_INCOVATION_BLUE (CFx_Base_Proto)
{
visname_S = "INVOCATION_BLUE";
emtrjmode_s = "FIXED";
emTrjOriginNode = "BIP01";
lightpresetname = "REDAMBIENCE";
    sfxid = "SFX_Circle";
      sfxisambient = 1;
};

INSTANCE spellFX_INCOVATION_VIOLET (CFx_Base_Proto)
{
visname_S = "INVOCATION_VIOLET";
emtrjmode_s = "FIXED";
emTrjOriginNode = "BIP01";
lightpresetname = "CATACLYSM";
    sfxid = "SFX_Circle";
      sfxisambient = 1;
};

INSTANCE spellFX_INCOVATION_WHITE (CFx_Base_Proto)
{
visname_S = "INVOCATION_WHITE";
emtrjmode_s = "FIXED";
emTrjOriginNode = "BIP01";
lightpresetname = "WHITEBLEND";
    sfxid = "SFX_Circle";
      sfxisambient = 1;
};


2. Wkleiłem w PFXMagic.d w Gothic\_work\DATA\scripts\system\PFX to:


PROTOTYPE INVOCATION (C_PARTICLEFX)
{
     ppsvalue = 30;
     ppsscalekeys_s = "1 1 2 2 2 3 3 4 4 5";
     ppsissmooth = 1;
     ppsfps = 3;
     shptype_s = "CIRCLE";
     shpfor_s = "WORLD";
     shpoffsetvec_s = "0 0 0";
     shpdistribtype_s = "RAND";
     shpdim_s = "120";
     shpscalekeys_s = "1 2 3 4 5 6 7 8 9 10";
     shpscaleissmooth = 1;
     shpscalefps = 3;
     dirmode_s = "RAND";
     dirfor_s = "object";
     diranglehead = 90;
     dirangleheadvar = 45;
     dirangleelev = 90;
     dirangleelevvar = 45;
     velavg = 0.100000001;
     lsppartavg = 1500;
     lsppartvar = 300;
     flygravity_s = "0 0.00008 0";
     visname_s = "MFX_MAGICCLOUD.TGA";
     visorientation_s = "VELO";
     vistexisquadpoly = 1;
     vistexanifps = 25;
     vistexaniislooping = 2;
     vistexcolorstart_s = "255 0 0";
     vistexcolorend_s = "255 0 0";
     vissizestart_s = "20 20";
     vissizeendscale = 20;
     visalphafunc_s = "ADD";
     visalphastart = 255;
     trltexture_s = "LIGHTNING_BIG_A0.TGA";
};

INSTANCE INVOCATION_RED  (INVOCATION)
{
vistexcolorstart_s = "255 0 0";
    vistexcolorend_s = "255 0 0";
};

INSTANCE INVOCATION_WHITE  (INVOCATION)
{
vistexcolorstart_s = "255 255 255";
    vistexcolorend_s = "255 255 255";
};

INSTANCE INVOCATION_BLUE  (INVOCATION)
{
vistexcolorstart_s = "0 0 255";
    vistexcolorend_s = "0 0 255";
};

INSTANCE INVOCATION_GREEN  (INVOCATION)
{
vistexcolorstart_s = "0 200 200";
    vistexcolorend_s = "0 200 200";
};

INSTANCE INVOCATION_VIOLET  (INVOCATION)
{
vistexcolorstart_s = "200 0 255";
    vistexcolorend_s = "255 0 200";
};

3. Pliki z teksturami MFX_MAGICCLOUD.TGA, LIGHTNING_BIG_A0.TGA, MFX_MAGICCLOUD-C.TEX i LIGHTNING_BIG_A0-C.TEX znajdują się na właściwym miejscu

4. Wstawiłem też rutynę. Rutyna ładnie działa z małym acz znaczącym zastrzeżeniem...

// ************************************
// ZS_Circle für Auge Innos Beschwörung
// ************************************


func void ZS_Circle ()
{
B_SetPerception(self);

// ------ PercTime überschreiben ------
Npc_SetPercTime (self, 0.3);


AI_StandUp (self);
AI_SetWalkmode (self,NPC_WALK); // Walkmode für den Zustand
AI_GotoWP (self, self.wp); // Gehe zum Tagesablaufstart
AI_AlignToWP (self);
};

func int ZS_Circle_Loop ()
{
var int randy;

if (self.guild == GIL_DEMON)
{
randy = Hlp_Random (1000);

if (Npc_GetStateTime(self) > randy)
{
Wld_PlayEffect("FX_EarthQuake",  self, self, 0, 0, 0, FALSE );
Npc_SetStateTime (self, 0);
Wld_PlayEffect("spellFX_INCOVATION_RED",  self, self, 0, 0, 0, FALSE );
AI_PlayAni (self,"T_PRACTICEMAGIC5");
};
};

return LOOP_CONTINUE;
};

func void ZS_Circle_End ()
{

};

5. I teraz przechodzimy do sedna: NPC, któremu przypisano rutynę wykonuje magiczny gest ciałem, efekt trzęsienia ziemi występuje też ładnie ale... no właśnie. Nie ma tego czerwonego efektu od czaru. i w tym właśnie tkwi problem.

Oczywiście zreparsowałem plik Gothic.src.

Bardzo prosiłbym o jakieś wskazówki jak rozwiązać ten problem.

16
@BeziJuve póki co spróbuję się oswoić z programem a za jakiś czas przyjdzie pora na wskoczenie na wyższy poziom :)

17
@BeziJuve, dzięki sprawdzę. Są jakieś szczególne funkcje tego VSC na które warto zwrócić uwagę?

18
Czołem! Podrzucam skrypt do Gothic 1, który umożliwia przydzielanie ambientowych statystyk postaciom. Skrypt jest oczywiście w przeważającej mierze zrzynką analogicznego skryptu występującego w Gothic 2.

Przydaje się jeżeli chcesz z jednego miejsca zmieniać statystyki wielu postaciom zamiast każdorazowego wchodzenia do załóżmy 30 plików w folderze Gothic\_work\DATA\scripts\Content\Story\NPC W mojej ocenie całkiem użyteczna zabawka przy balansowaniu poziomu trudności w modyfikacji.

Oczywiście żeby ten skrypt działał w odniesieniu do danego NPC najpierw musisz w pliku tego NPC w folderze Gothic\_work\DATA\scripts\Content\Story\NPC wstawić odpowiednią funkcję ale nie uprzedzajmy faktów.

Wstawianie skryptu

1. Po pierwsze musisz wkleić poniższy skrypt. Gdzie? Ja wkleiłem w pliku B_Functions.d znajdującym się w folderze Gothic\DATA\scripts\Content\AI\AI_Intern
func void b_setambientnpcstats(var C_Npc slf,var int ambnpcstats)
{
Npc_SetTalentSkill(self,NPC_TALENT_MAGE,6);
if(ambnpcstats == 1) ///////zestaw statystyk nr 1
{
slf.level = 5;
slf.attribute[ATR_STRENGTH] = 30;
slf.attribute[ATR_DEXTERITY] = 10;
slf.attribute[ATR_MANA_MAX] = 0;
slf.attribute[ATR_MANA] = 0;
slf.attribute[ATR_HITPOINTS_MAX] = 200;
slf.attribute[ATR_HITPOINTS] = 200;
Npc_SetTalentSkill(self,NPC_TALENT_1H,1);
};
if(ambnpcstats == 2) ///////zestaw statystyk nr 2
{
slf.level = 5;
slf.attribute[ATR_STRENGTH] = 30;
slf.attribute[ATR_DEXTERITY] = 10;
slf.attribute[ATR_MANA_MAX] = 0;
slf.attribute[ATR_MANA] = 0;
slf.attribute[ATR_HITPOINTS_MAX] = 200;
slf.attribute[ATR_HITPOINTS] = 200;
Npc_SetTalentSkill(self,NPC_TALENT_1H,1);
};
if(ambnpcstats == 3) ///////zestaw statystyk nr 3
{
slf.level = 8;
slf.attribute[ATR_STRENGTH] = 60;
slf.attribute[ATR_DEXTERITY] = 25;
slf.attribute[ATR_MANA_MAX] = 50;
slf.attribute[ATR_MANA] = 50;
slf.attribute[ATR_HITPOINTS_MAX] = 340;
slf.attribute[ATR_HITPOINTS] = 340;
Npc_SetTalentSkill(self,NPC_TALENT_1H,1);
Npc_SetTalentSkill(self,NPC_TALENT_2H,1);
};
if(ambnpcstats == 4) ///////zestaw statystyk nr 4
{
slf.level = 8;
slf.attribute[ATR_STRENGTH] = 60;
slf.attribute[ATR_DEXTERITY] = 34;
slf.attribute[ATR_MANA_MAX] = 20;
slf.attribute[ATR_MANA] = 20;
slf.attribute[ATR_HITPOINTS_MAX] = 380;
slf.attribute[ATR_HITPOINTS] = 380;
Npc_SetTalentSkill(self,NPC_TALENT_1H,1);
Npc_SetTalentSkill(self,NPC_TALENT_2H,1);
};
if(ambnpcstats == 5) ///////zestaw statystyk nr 5 (możesz sobie dorobić 6,7,8 i ile chcesz takich zestawów)
{
slf.level = 8;
slf.attribute[ATR_STRENGTH] = 50;
slf.attribute[ATR_DEXTERITY] = 34;
slf.attribute[ATR_MANA_MAX] = 15;
slf.attribute[ATR_MANA] = 15;
slf.attribute[ATR_HITPOINTS_MAX] = 350;
slf.attribute[ATR_HITPOINTS] = 350;
Npc_SetTalentSkill(self,NPC_TALENT_1H,1);
Npc_SetTalentSkill(self,NPC_TALENT_2H,1);
};
slf.exp = 500 * ((slf.level + 1) / 2) * (slf.level + 1);
slf.exp_next = 500 * ((slf.level + 2) / 2) * (slf.level + 1);
};

Taka mała uwaga: czemu zalecam by wkleić to akurat do w pliku B_Functions.d? Otóż gra odczytuje rzeczy w pewnej kolejności. Jak poprzednio wstawiałem to do mojego ulubionego pliku B_InExtremo.d w Gothic\_work\DATA\scripts\Content\Story\B to gra nie zasysała tego skryptu a po wklejeniu w pliku B_Functions wszystko ładnie śmiga.

2. Po drugie musisz edytować pliki postaci, które chcesz objąć systemem ambientowych zestawów. Przykładowo wynajdujesz sobie plik VLK_560_Buddler I usuwasz w nim wszystko to co określone jest w zestawie czyli w naszym przypadku wywalasz fragmenty skryptu dotyczące:
- poziomu
- siły, zręczności, many
- punktów życia i max punktów życia
- umiejętności walki bronią

W miejsce statystyk w tym pliku NPC-a wstawiasz „B_SetAmbientNPCStats(self, 1);   /////// zestaw statystyk nr 1”. Jeżeli to ma być zestaw drugi to zamiast jedynki wstawiasz tam 2 („B_SetAmbientNPCStats(self, 2)”), itd.

Przykładowy plik po opisywanej obróbce będzie wyglądał tak:
 instance VLK_560_Buddler (Npc_Default)
{
//-------- primary data --------

name = Name_Buddler;
npctype = npctype_ambient;
guild = GIL_VLK;     


voice = 2;
id = 560;


//-------- abilities --------
B_SetAmbientNPCStats(self, 1); /////// zestaw statystyk nr 1


//-------- visuals --------
// animations
Mdl_SetVisual (self,"HUMANS.MDS");
Mdl_ApplyOverlayMds (self,"Humans_Tired.mds");
// body mesh, head mesh, hairmesh, face-tex, hair-tex, skin
Mdl_SetVisualBody (self,"hum_body_Naked0",3,1,"Hum_Head_Psionic", 67,  2, -1);

B_Scale (self);
Mdl_SetModelFatness (self, 0);

fight_tactic = FAI_HUMAN_COWARD;

//-------- Talents --------                                   


//-------- inventory --------                                   

EquipItem (self, ItMw_1h_Club_01);
CreateInvItem (self, ItFoApple);


//-------------Daily Routine-------------
daily_routine = Rtn_start_560;
};

FUNC VOID Rtn_start_560 ()
{
TA_Sleep (23,00,06,30,"OCR_HUT_16");
TA_StandAround (06,30,11,00,"OCR_OUTSIDE_HUT_16");
TA_WashSelf (11,00,11,20,"OCR_TO_HUT_17");
TA_SitCampfire (11,20,23,00,"OCR_OUTSIDE_HUT_16");
};


4. I gotowe. Teraz zamiast wchodzić do każdego pliku z osobna i edytować statystyki każdej postaci możesz masowo zmieniać statystyki z poziomu jednego pliku tekstowego. Oczywiście to ułatwienie dotyczy tylko tych NPC-ów, których uprzednio przydzieliłeś do jednego z zestawów. 

19
Prosta implementacja funkcji z Gothica II, która pomaga zwiększyć przejrzystość przy przeglądaniu asortymentu handlarzy. Funkcja sprawia, że po zakończeniu rozmowy z handlarzem z ekwipunku handlarza usuwane są śmieciowe rzeczy, które mu uprzednio sprzedaliśmy. Jak kogoś to bardzo interesuje to mój wkład twórczy ograniczył się do podmiany przedmiotów na te z Gothica I.

Wklejam gotowca dla oszczędności sił i czasu, bo nie ma sensu by każdy kolejny modder do swojego projektu wykonywał ten skrypt od nowa.

func void b_clearjunktradeinv(var C_NPC self)
{
////////orcish weapon
Npc_RemoveInvItems(self,itmw2horcaxe01,Npc_HasItems(self,itmw2horcaxe01));
Npc_RemoveInvItems(self,itmw2horcaxe02,Npc_HasItems(self,itmw2horcaxe02));
Npc_RemoveInvItems(self,itmw2horcaxe03,Npc_HasItems(self,itmw2horcaxe03));
Npc_RemoveInvItems(self,itmw2horcaxe04,Npc_HasItems(self,itmw2horcaxe04));

Npc_RemoveInvItems(self,itmw2horcmace01,Npc_HasItems(self,itmw2horcmace01));
Npc_RemoveInvItems(self,itmw2horcsword01,Npc_HasItems(self,itmw2horcsword01));
Npc_RemoveInvItems(self,itrworcstaff,Npc_HasItems(self,itrworcstaff));
Npc_RemoveInvItems(self,itmw2horcaxe01,Npc_HasItems(self,itmw2horcaxe01));
Npc_RemoveInvItems(self,itmw2horcaxe01,Npc_HasItems(self,itmw2horcaxe01));

////////Animaltrophy (without golems' hearts)
Npc_RemoveInvItems(self,itat_bloodfly_01,Npc_HasItems(self,itat_bloodfly_01));
Npc_RemoveInvItems(self,itat_bloodfly_02,Npc_HasItems(self,itat_bloodfly_02));
Npc_RemoveInvItems(self,itat_claws_01,Npc_HasItems(self,itat_claws_01));
Npc_RemoveInvItems(self,itat_crawler_01,Npc_HasItems(self,itat_crawler_01));
Npc_RemoveInvItems(self,itat_crawler_02,Npc_HasItems(self,itat_crawler_02));
Npc_RemoveInvItems(self,itat_lurker_01,Npc_HasItems(self,itat_lurker_01));
Npc_RemoveInvItems(self,itat_lurker_02,Npc_HasItems(self,itat_lurker_02));
Npc_RemoveInvItems(self,itat_shadow_01,Npc_HasItems(self,itat_shadow_01));
Npc_RemoveInvItems(self,itat_shadow_02,Npc_HasItems(self,itat_shadow_02));
Npc_RemoveInvItems(self,itat_swampshark_01,Npc_HasItems(self,itat_swampshark_01));
Npc_RemoveInvItems(self,itat_swampshark_02,Npc_HasItems(self,itat_swampshark_02));
Npc_RemoveInvItems(self,itat_teeth_01,Npc_HasItems(self,itat_teeth_01));
Npc_RemoveInvItems(self,itat_troll_01,Npc_HasItems(self,itat_troll_01));
Npc_RemoveInvItems(self,itat_troll_02,Npc_HasItems(self,itat_troll_02));
Npc_RemoveInvItems(self,itat_waran_01,Npc_HasItems(self,itat_waran_01));
Npc_RemoveInvItems(self,itat_wolf_01,Npc_HasItems(self,itat_wolf_01));
Npc_RemoveInvItems(self,itat_wolf_02,Npc_HasItems(self,itat_wolf_02));

////////Items
Npc_RemoveInvItems(self,itlstorchfirespit,Npc_HasItems(self,itlstorchfirespit));
Npc_RemoveInvItems(self,itmi_stuff_amphore_01,Npc_HasItems(self,itmi_stuff_amphore_01));
Npc_RemoveInvItems(self,itmi_stuff_barbknife_01,Npc_HasItems(self,itmi_stuff_barbknife_01));
Npc_RemoveInvItems(self,itmi_stuff_candel_01,Npc_HasItems(self,itmi_stuff_candel_01));
Npc_RemoveInvItems(self,itmi_stuff_cup_01,Npc_HasItems(self,itmi_stuff_cup_01));
Npc_RemoveInvItems(self,itmi_stuff_cup_02,Npc_HasItems(self,itmi_stuff_cup_02));
Npc_RemoveInvItems(self,itmi_stuff_mug_01,Npc_HasItems(self,itmi_stuff_mug_01));
Npc_RemoveInvItems(self,itmi_stuff_oldcoin_01,Npc_HasItems(self,itmi_stuff_oldcoin_01));
Npc_RemoveInvItems(self,itmi_stuff_oldcoin_02,Npc_HasItems(self,itmi_stuff_oldcoin_02));
Npc_RemoveInvItems(self,itmi_stuff_pan_01,Npc_HasItems(self,itmi_stuff_pan_01));
Npc_RemoveInvItems(self,itmi_stuff_pipe_01,Npc_HasItems(self,itmi_stuff_pipe_01));
Npc_RemoveInvItems(self,itmi_stuff_plate_01,Npc_HasItems(self,itmi_stuff_plate_01)); ////////////some traders have it
Npc_RemoveInvItems(self,itmi_stuff_silverware_01,Npc_HasItems(self,itmi_stuff_silverware_01));
Npc_RemoveInvItems(self,itmialarmhorn,Npc_HasItems(self,itmialarmhorn));
Npc_RemoveInvItems(self,itmibrush,Npc_HasItems(self,itmibrush));
Npc_RemoveInvItems(self,itmihammer,Npc_HasItems(self,itmihammer));
Npc_RemoveInvItems(self,itmilute,Npc_HasItems(self,itmilute));
Npc_RemoveInvItems(self,itmiscoop,Npc_HasItems(self,itmiscoop));
Npc_RemoveInvItems(self,itmistomper,Npc_HasItems(self,itmistomper));
Npc_RemoveInvItems(self,itmiwedel,Npc_HasItems(self,itmiwedel));

////////Food
Npc_RemoveInvItems(self,itat_meatbug_01,Npc_HasItems(self,itat_meatbug_01));
Npc_RemoveInvItems(self,itfo_mutton_01,Npc_HasItems(self,itfo_mutton_01));
Npc_RemoveInvItems(self,itfo_plants_mushroom_01,Npc_HasItems(self,itfo_plants_mushroom_01));
Npc_RemoveInvItems(self,itfo_plants_mushroom_02,Npc_HasItems(self,itfo_plants_mushroom_02));
Npc_RemoveInvItems(self,itfo_wineberrys_01,Npc_HasItems(self,itfo_wineberrys_01));
Npc_RemoveInvItems(self,itfocheese,Npc_HasItems(self,itfocheese));
Npc_RemoveInvItems(self,itfocrawlersoup,Npc_HasItems(self,itfocrawlersoup));
Npc_RemoveInvItems(self,itfoloaf,Npc_HasItems(self,itfoloaf));
Npc_RemoveInvItems(self,itfomeatbugragout,Npc_HasItems(self,itfomeatbugragout));
Npc_RemoveInvItems(self,itfomuttonraw,Npc_HasItems(self,itfomuttonraw));
Npc_RemoveInvItems(self,itfomutton,Npc_HasItems(self,itfomutton));
Npc_RemoveInvItems(self,itforice,Npc_HasItems(self,itforice));
Npc_RemoveInvItems(self,itfosoup,Npc_HasItems(self,itfosoup));
Npc_RemoveInvItems(self,itfowine,Npc_HasItems(self,itfowine));

////////common shitty human weapon
Npc_RemoveInvItems(self,ItMwPickaxe,Npc_HasItems(self,ItMwPickaxe)); //////Kilof

Npc_RemoveInvItems(self,ItMwPickaxe,Npc_HasItems(self,ItMw_1H_Hatchet_01));
Npc_RemoveInvItems(self,ItMwPickaxe,Npc_HasItems(self,Itmw_1h_club_01));
Npc_RemoveInvItems(self,ItMwPickaxe,Npc_HasItems(self,Itmw_1H_Mace_Light_01));
Npc_RemoveInvItems(self,ItMwPickaxe,Npc_HasItems(self,ItMw_1h_Sword_01));
Npc_RemoveInvItems(self,ItMwPickaxe,Npc_HasItems(self,altesschwert));
Npc_RemoveInvItems(self,ItMwPickaxe,Npc_HasItems(self,ItMw_1H_Poker_01));
Npc_RemoveInvItems(self,ItMwPickaxe,Npc_HasItems(self,ItMw_1H_Poker_01));
Npc_RemoveInvItems(self,ItMwPickaxe,Npc_HasItems(self,ItMw_1H_Poker_01));
};

To co jest wyżej wkleiłem zwyczajowo do pliku "B_InExtremo.d" w Gothic\_work\DATA\scripts\Content\Story\B.

Potem każdemu z handlarzy w Gothic I w odpowiednim pliku dialogowym znajdującym się w Gothic\_work\DATA\Scripts\Content\Story\MISSIONS dokleiłem wywoływanie funkcji "b_clearjunktradeinv" po wybraniu opcji "KONIEC" (w sensie koniec rozmowy a koniec handlu). Na przykład w DIA_Stt_311_Fisk.d

Spoiler
instance  Stt_311_Fisk_Exit (C_INFO)
{
   npc         = Stt_311_Fisk;
   nr         = 999;
   condition   = Stt_311_Fisk_Exit_Condition;
   information   = Stt_311_Fisk_Exit_Info;
   permanent   = 1;
   description = DIALOG_ENDE;
};                       

FUNC int  Stt_311_Fisk_Exit_Condition()
{
   return 1;
};

FUNC VOID  Stt_311_Fisk_Exit_Info()
{
   AI_StopProcessInfos   (self);
   b_clearjunktradeinv   (self);
};

Tak trzeba zrobić dla wszystkich kupców. Listę wszystkich handlarzy mamy choćby na stronie Gothicpedii  https://gothic.fandom.com/pl/wiki/Handlarze_w_Gothic

Gotowe. Teraz po zakończeniu handlu a następnie po wyjściu z rozmowy z kupcem cały szrot jest usuwany a my możemy elegancko przeglądać asortyment kupca :)

20
Dziękuję bardzo za pomoc. Widocznie prośba o przekopiowanie stosownej części z jednego z plików .PML Gothic\_work\Tools\data żeby kolejni ludzie nie musieli się z osobna pierdzielić się z ustawianiem parametrów wody najwyraźniej była proszeniem o zbyt wiele dlatego jakby ktoś w przyszłości potrzebował się posiłkować gotowcem przy ustawianiu tych parametrów to wrzucam zawartość swojego pliku "WATER2.PML". Jeżeli ktoś chce to może w oparciu o to ustawić sobie parametry wody w Spacerze. Parametr "texAniMapDir" w tych teksturach został wzięty stąd https://themodders.org/index.php?topic=49.msg407#msg407 z pewnymi zmianami:
Spoiler
- uzupełniłem chyba dwie tekstury wody, których nie było na tamtej liście (na pewno OWODSEA2SWAMP);
- przyspieszyłem trochę wodę z wodospadu bo na oko w wersji steamowej Gothica była chyba szybsza;
- OWODWFALL_HITSURFACE ustaliłem metodą prób i błędów;
- OWODWFALL_STONE wyłączyłem (zastąpiłem niewidzialną teksturą) bo ustalanie tego metodą prób i tak zżarło mi zbyt dużo czasu.

Woda płynie i da się w niej pływać ale nie jest przezroczysta, bo nie umiałem tego ustawić więc z lądu nie zobaczysz tego co jest pod wodą. Jeżeli wiesz jak to naprawić to możesz się tym podzielić choćby w tym temacie by ktoś inny się z tym nie musiał pierdzielić.

UWAGA: Nie polecam bezpośredniej przeklejki bo te tekstury najpierw trzeba przenieść do innego filtra. Najłatwiej to zrobić w Spacerze. W tym poście masz to wszystko ładnie opisane: https://themodders.org/index.php?topic=49.msg40990#msg40990 Żeby woda płynęła i by można było w niej pływać musisz sobie poustawiać parametr "texAniMapDir" (z cyferkami) oraz parametr "texAniMapMode".

Jeżeli chodzi o texAniMapMode to w pliku .pml będziesz miał "texAniMapMode=enum:0" lub "texAniMapMode=enum:1", ale w Spacerze zamiast 0 i 1 będziesz miał "NONE" I "LINEAR". "NONE" ustawiasz w jeziorach i tam gdzie woda jest stojąca. "LINEAR" ustawiasz tam gdzie woda ma płynąć.

UWAGA 2: Poniższe parametry dotyczą Gothica 1.

Zawartość pliku WATER2.PML
Spoiler

ZenGin Archive
ver 1
zCArchiverGeneric
ASCII
saveGame 0
date 15.6.2025 16:28:37
user ///////
END
objects 10       
END

[% zCMaterial 17408 0]
name=string:OWODWATSTOP
matGroup=enum:5
color=color:72 93 101 255
smoothAngle=float:60
texture=string:OWODSEA_A0.TGA
texScale=string:256 256
texAniFPS=float:0
texAniMapMode=enum:0
texAniMapDir=string:0 0
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]
[% zCMaterial 17408 1]
name=string:OWODWFALL2SEA
matGroup=enum:5
color=color:160 179 185 255
smoothAngle=float:60
texture=string:OWODWFALL2SEA_A0.TGA
texScale=string:256 256
texAniFPS=float:0
texAniMapMode=enum:1
texAniMapDir=string:0 -0.00029999999
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]
[% zCMaterial 17408 2]
name=string:OWODWFALL
matGroup=enum:5
color=color:149 165 172 255
smoothAngle=float:60
texture=string:OWODWFALL_A0.TGA
texScale=string:512 512
texAniFPS=float:0
texAniMapMode=enum:1
texAniMapDir=string:0 -0.00089999998
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]
[% zCMaterial 17408 3]
name=string:OWODWATSTAND
matGroup=enum:5
color=color:72 93 101 255
smoothAngle=float:60
texture=string:OWODWAT_A0.TGA
texScale=string:256 256
texAniFPS=float:0
texAniMapMode=enum:1
texAniMapDir=string:0 -2.9999999e-005
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]
[% zCMaterial 17408 4]
name=string:OWODWFALL_HITSURFACE
matGroup=enum:5
color=color:48 50 52 255
smoothAngle=float:60
texture=string:OWODWFALL_HITSURFACE_A0.TGA
texScale=string:256 256
texAniFPS=float:0
texAniMapMode=enum:1
texAniMapDir=string:0.0099999998 0
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]
[% zCMaterial 17408 5]
name=string:FLSWAMPLI         
matGroup=enum:5
color=color:35 39 19 255
smoothAngle=float:60
texture=string:SWAMP_A0.TGA
texScale=string:256 256
texAniFPS=float:0
texAniMapMode=enum:0
texAniMapDir=string:0 0
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]
[% zCMaterial 17408 6]
name=string:OWODWFALL_STONE
matGroup=enum:5
color=color:249 250 250 255
smoothAngle=float:60
texture=string:MODIALPHA01.TGA
texScale=string:256 256
texAniFPS=float:0
texAniMapMode=enum:1
texAniMapDir=string:8 13.1
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]
[% zCMaterial 17408 7]
name=string:OWODWFALLFASTWATER
matGroup=enum:5
color=color:149 165 172 255
smoothAngle=float:60
texture=string:OWODWFALL_A0.TGA
texScale=string:512 512
texAniFPS=float:0
texAniMapMode=enum:1
texAniMapDir=string:0 -0.00050000002
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]
[% zCMaterial 17408 8]
name=string:OWODWATFAST
matGroup=enum:5
color=color:72 93 101 255
smoothAngle=float:60
texture=string:OWODWAT_A0.TGA
texScale=string:256 256
texAniFPS=float:0
texAniMapMode=enum:1
texAniMapDir=string:0 -0.00030000001
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]
[% zCMaterial 17408 9]
name=string:OWODSEA2SWAMP
matGroup=enum:5
color=color:54 67 60 255
smoothAngle=float:60
texture=string:OWODSEA2SWAMP_A0.TGA
texScale=string:256 256
texAniFPS=float:0
texAniMapMode=enum:0
texAniMapDir=string:9.9999997e-005 0
noCollDet=bool:0
noLightmap=bool:0
lodDontCollapse=bool:0
detailObject=string:
defaultMapping=rawFloat:2.34375 2.34375
[]


Wrzucam jeszcze opracowanie dotyczące tego gdzie jaka tekstura występuje jakby ktoś potrzebował.

Spoiler
OWODWATFAST
Użycie:
- Wodospad do morza (przy Klasztorze Zmiennokształtnych)
- Fragment rzeki od Cmentarza Orków do wodospadów wpadających do jeziorka przy Obozie Bractwa

Parametry:
name:OWODWATFAST
matGroup:WATER
texture:OWODWAT_A0.TGA

OWODWATSTOP
Użycie:
- Morze
- Niebagienna część jeziorka z wodospadami koło Obozu Bractwa
- Jeziorko starej wieży Xardasa
- Jeziorko przy jaskini goblinów, które ukradły almanach
- Rzeka pod mostem goblinów, które ukradły almanach
- Jezioro z  chatą rybaków nieopodal Nowego Obozu (nieopodal terytorium orków)
- Jeziorko gdzie zaczynamy grę

Parametry:
name:OWODWATSTOP
matGroup:WATER
texture:OWODSEA_A0.TGA

FLSWAMPLI
Użycie:
- Bagienna część jeziorka z wodospadami koło Obozu Bractwa
- Zabagnione jeziorko koło wieży Xardasa
- Wszystkie bagna wokół Obozu Bractwa

Parametry:
name:FLSWAMPLI   
matGroup:WATER
texture:SWAMP_A0.TGA

OWODWFALL
Użycie:
- Trzy wodospady koło starej wieży Xardasa
- Duży wodospad przy jaskini goblinów, które ukradły almanach
- Wodospady koło Obozu Bractwa

Parametry:
name:OWODWFALL
matGroup:WATER
texture:OWODWFALL_A0.TGA

OWODWFALLFASTWATER
Użycie:
- Spływ od starej wieży Xardasa do Cmentarza Orków
- Mały wodospad przy jaskini goblinów, które ukradły almanach

Parametry:
name:OWODWFALLFASTWATER
matGroup:WATER
texture:OWODWFALL_A0.TGA

OWODSEA2SWAMP
Użycie:
- Strefa pośrednia między rodzajami wód na jeziorze przy Obozie Bractwa

Parametry:
name:OWODSEA2SWAMP
matGroup:WATER
texture:OWODSEA2SWAMP_A0.TGA

OWODWFALL2SEA
Użycie:
Wodospad do morza (nieopodal Klasztoru Zmiennokształtnych)

Parametry:
name:OWODWFALL2SEA
matGroup:WATER
texture:OWODWFALL2SEA_A0.TGA

OWODWFALL_HITSURFACE
Użycie:
Praktycznie każdy wodospad (plusk wody z wodospadu zderzającej się z wodą w rzece na dole)

Parametry:
name:OWODWFALL_HITSURFACE
matGroup: WATER
texture:OWODWFALL_HITSURFACE_A0.TGA

OWODWFALL_STONE
Użycie:
Woda z wodospadu obijająca się o skały (np. wodospady przy zatopionej wieży Xardasa)
W parametrze texture zamieniłem z "OWODWFALL_STONE_A0.TGA" (chyba) na "MODIALPHA01.TGA" żeby nie była widoczna w grze.

Parametry:
name:OWODWFALL_STONE
matGroup: WATER
texture:MODIALPHA01.TGA

Strony: [1] 2 3
Do góry