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.


Pokaż wątki - Kirgo2

Strony: [1] 2
1
(do usunięcia - skrypt generował bugi)

2
Podrzucam gotowiec skryptu, bo widziałem, że niektórzy pytali jak zrobić efekt taki jak w Gothic 2 Noc Kruka, że NPC atakują gracza gdy ma na sobie pancerz bandyty. Jako, że nigdzie nie znalazłem by było to wytłumaczone w sposób przystępny dla moddera-nowicjusza wrzucam to na forum do korzystania dla wszystkich.

Ja akurat potrzebowałem tego efektu w stosunku do szaty nekromanty więc wstawiam tutaj skrypt, który sprawia, że postacie niezależne atakują gracza gdy ma na sobie strój nekromanty. Skrypt opiera się na dodaniu dwóch nowych "tabelek" z nastawieniem gildii do pliku "Guilds.d", w których wszystkie gildie nienawidzą nekromantów - "tabelki" te są uruchamiane po założeniu stroju nekromanty a po zdjęciu stroju nekromanty przeskakuje z powrotem do "podstawowych tabelek".

PS: Zapewne dałoby się to zrobić subtelniej modyfikując funkcje typu ZS_Attack, ZS_AssessEnemy czy ZS_AssessMurder ale to dla mnie wyższa szkoła jazdy. Jeżeli jednak ktoś czuje się na siłach i ma ochotę to może tu podrzucić swoje rozwiązanie.

Jak wkleić tego gotowca
W pliku "armor.d" znajdującym się w folderze "_work\DATA\scripts\Content\Items" musimy dodać

on_equip = Equip_DMB_ARMOR_M;
on_unequip = UnEquip_DMB_ARMOR_M;

oraz

FUNC VOID Equip_DMB_ARMOR_M()
{
self.guild =  GIL_DMB;
Npc_SetTrueGuild(self,GIL_DMB);
B_InitGuildAttitudes();
};

FUNC VOID UnEquip_DMB_ARMOR_M()
{
self.guild =  GIL_DMB;
Npc_SetTrueGuild(self,GIL_DMB);
B_InitGuildAttitudes();
};

Skrypt zbroi w "armors.d" powinien wyglądać tak:
Spoiler
// Dämonenbeschwörer

INSTANCE DMB_ARMOR_M(C_Item)
{
name = "Szata Mrocznych Sztuk";

mainflag = ITEM_KAT_ARMOR;
flags = 0;

protection [PROT_EDGE] = 90;
protection [PROT_BLUNT] = 90;
protection [PROT_POINT] = 20;
protection [PROT_FIRE] = 60;
protection [PROT_MAGIC] = 30;

wear = WEAR_TORSO;

  value = protection [PROT_EDGE] * ARMOR_VALUE_MULTIPLIER;

ownerGuild = GIL_DMB;

visual = "dmbm.3ds";
visual_change = "Hum_DMBM_ARMOR.asc";
visual_skin = 0;
material = MAT_LEATHER;
on_equip = Equip_DMB_ARMOR_M;
on_unequip = UnEquip_DMB_ARMOR_M;

description = name;
TEXT[0] = "Lepiej nie nosić tego publicznie.";
TEXT[1] = NAME_Prot_Edge; COUNT[1] = protection [PROT_EDGE];
TEXT[2] = NAME_Prot_Point; COUNT[2] = protection [PROT_POINT];
TEXT[3] = NAME_Prot_Fire; COUNT[3] = protection [PROT_FIRE];
TEXT[4] = NAME_Prot_Magic; COUNT[4] = protection [PROT_MAGIC];
TEXT[5] = NAME_Value; COUNT[5] = value;
};


FUNC VOID Equip_DMB_ARMOR_M() ///deleted
{
self.guild =  GIL_DMB;
Npc_SetTrueGuild(self,GIL_DMB);
B_PeopleHatesYouNecromancer = TRUE;
B_InitGuildAttitudes();
};

FUNC VOID UnEquip_DMB_ARMOR_M()
{
self.guild =  GIL_DMB;
Npc_SetTrueGuild(self,GIL_DMB);
B_PeopleHatesYouNecromancer = FALSE;
B_InitGuildAttitudes();
};


W pliku "Story_Globals.d" znajdującym się w folderze "_work\DATA\scripts\Content\Story" dodajemy
var int B_PeopleHatesYouNecromancer;
W pliku "GUILDS.d" znajdującym się w folderze "_work\DATA\scripts\Content\Story" dodajemy dwie nowe "tabelki" o nazwach: "CONST INT GIL_ATTITUDES_NecromancerArmor" oraz GIL_ATTITUDES_FMTAKEN_NecromancerArmor. To są odpowiedniki "tabelek" nastawienia gildyjnego z początku gry oraz nastawienia gildyjnego od IV rozdziału z dodatkową parą tych "tabelek" różniących się tylko tym, że wszystkie inne gildie nienawidzą gildii Nekromanty.

Po prostu wklejamy je do tego dokumentu na samym dole:

CONST INT GIL_ATTITUDES_NecromancerArmor [TAB_ANZAHL] = // AL und  NL verärgert (Magier zueinander freundlich) ST neutral zu AL und NL (Magier verärgert zu ST)
{
// None EBr Grd Stt KdF Vlk KdW Sld Org Bau SfB Gur Nov Tpl Däm Bab
/*Non*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Non*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Non*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Non*/ ATT_HOSTILE, ATT_NEUTRAL,

/*Ebr*/ ATT_NEUTRAL, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Ebr*/ ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Ebr*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Ebr*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Grd*/ ATT_NEUTRAL, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Grd*/ ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Grd*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Grd*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Stt*/ ATT_NEUTRAL, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Stt*/ ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Stt*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Stt*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Kdf*/ ATT_NEUTRAL, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Kdf*/ ATT_FRIENDLY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Kdf*/ ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Kdf*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Vlk*/ ATT_NEUTRAL, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Vlk*/ ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Vlk*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Vlk*/ ATT_HOSTILE, ATT_NEUTRAL,

/*Kdw*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_FRIENDLY, ATT_NEUTRAL, /*Kdw*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Kdw*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Kdw*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Sld*/ ATT_NEUTRAL, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Sld*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_NEUTRAL, ATT_FRIENDLY, ATT_FRIENDLY, /*Sld*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Sld*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Org*/ ATT_NEUTRAL, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Org*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Org*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Org*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Bau*/ ATT_NEUTRAL, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Bau*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Bau*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Bau*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Sfb*/ ATT_NEUTRAL, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, ATT_ANGRY, /*Sfb*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Sfb*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Sfb*/ ATT_HOSTILE, ATT_NEUTRAL,

/*Gur*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_ANGRY, ATT_NEUTRAL, /*Gur*/ ATT_ANGRY, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Gur*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Gur*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Nov*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_ANGRY, ATT_NEUTRAL, /*Nov*/ ATT_ANGRY, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Nov*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Nov*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Tpl*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_ANGRY, ATT_NEUTRAL, /*Tpl*/ ATT_ANGRY, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Tpl*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Tpl*/ ATT_HOSTILE, ATT_NEUTRAL,

/*Dmb*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Dmb*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, /*Dmb*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Dmb*/ ATT_FRIENDLY, ATT_HOSTILE,
/*Bab*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Mst*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Mst*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Mst*/ ATT_HOSTILE, ATT_FRIENDLY

};

CONST INT GIL_ATTITUDES_FMTAKEN_NecromancerArmor [TAB_ANZAHL] = // AL und NL feindlich
{
// None EBr Grd Stt KdF Vlk KdW Sld Org Bau SfB Gur Nov Tpl Däm Bab
/*Non*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Non*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Non*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Non*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Ebr*/ ATT_HOSTILE, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_HOSTILE, ATT_FRIENDLY, /*Ebr*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Ebr*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Ebr*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Grd*/ ATT_HOSTILE, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_HOSTILE, ATT_FRIENDLY, /*Grd*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Grd*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Grd*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Stt*/ ATT_HOSTILE, ATT_FRIENDLY, ATT_NEUTRAL, ATT_FRIENDLY, ATT_HOSTILE, ATT_NEUTRAL, /*Stt*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Stt*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Stt*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Kdf*/ ATT_FRIENDLY, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, ATT_NEUTRAL, /*Kdf*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Kdf*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Kdf*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Vlk*/ ATT_HOSTILE, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Vlk*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Vlk*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Vlk*/ ATT_HOSTILE, ATT_NEUTRAL,

/*Kdw*/ ATT_FRIENDLY, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, ATT_HOSTILE, /*Kdw*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Kdw*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Kdw*/ ATT_HOSTILE, ATT_FRIENDLY,
/*Sld*/ ATT_FRIENDLY, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, ATT_HOSTILE, /*Sld*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_NEUTRAL, ATT_FRIENDLY, ATT_FRIENDLY, /*Sld*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Sld*/ ATT_HOSTILE, ATT_FRIENDLY,
/*Org*/ ATT_FRIENDLY, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, ATT_HOSTILE, /*Org*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Org*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Org*/ ATT_HOSTILE, ATT_FRIENDLY,
/*Bau*/ ATT_FRIENDLY, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, ATT_HOSTILE, /*Bau*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Bau*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Bau*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Sfb*/ ATT_FRIENDLY, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, ATT_HOSTILE, /*Sfb*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Sfb*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Sfb*/ ATT_HOSTILE, ATT_NEUTRAL,

/*Gur*/ ATT_FRIENDLY, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, ATT_NEUTRAL, /*Gur*/ ATT_ANGRY, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Gur*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Gur*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Nov*/ ATT_FRIENDLY, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, ATT_NEUTRAL, /*Nov*/ ATT_ANGRY, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Nov*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Nov*/ ATT_HOSTILE, ATT_NEUTRAL,
/*Tpl*/ ATT_FRIENDLY, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, ATT_NEUTRAL, /*Tpl*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Tpl*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /*Tpl*/ ATT_HOSTILE, ATT_NEUTRAL,

/*Dmb*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Dmb*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, ATT_FRIENDLY, /*Dmb*/ ATT_HOSTILE, ATT_HOSTILE, ATT_HOSTILE, /*Dmb*/ ATT_FRIENDLY, ATT_HOSTILE,
/*Bab*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Mst*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Mst*/ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /*Mst*/ ATT_HOSTILE, ATT_FRIENDLY

};

Kluczowe jest by nastawienie "Däm" (tak w tej tabeli oznaczono gildię nekromanty)  przestawić na "ATT_HOSTILE". Jak chcemy by inne postacie z tą gildią nas nie atakowały to na "przecięciu" dwóch "Däm" wstawiamy "ATT_FRIENDLY"

Na koniec w pliku B_Functions.d w folderze _work\DATA\Scripts\Content\AI\AI_Intern znajdujesz funkcję B_InitGuildAttitudes, która wygląda tak:


Spoiler
//////////////////////////////////////////////////////////////////////////
// B_InitGuildAttitudes
// ====================
// Setzt bzw. resettet die Attitüde unter den Menschengilden
// und berücksichtigt dabei den Storyverlauf
//////////////////////////////////////////////////////////////////////////
func void B_InitGuildAttitudes ()
{
PrintDebugNpc (PD_ZS_FRAME, "B_InitGuildAttitudes");

if (Kapitel <= 3)
{
Wld_ExchangeGuildAttitudes ("GIL_ATTITUDES");
}
else
{
Wld_ExchangeGuildAttitudes ("GIL_ATTITUDES_FMTAKEN");
};
};

I podmieniamy jej zawartość. Ostatecznie powinna wyglądać tak

//////////////////////////////////////////////////////////////////////////
// B_InitGuildAttitudes
// ====================
// Setzt bzw. resettet die Attitüde unter den Menschengilden
// und berücksichtigt dabei den Storyverlauf
//////////////////////////////////////////////////////////////////////////
func void B_InitGuildAttitudes ()
{
PrintDebugNpc (PD_ZS_FRAME, "B_InitGuildAttitudes");

if (Kapitel <= 3)
{
if B_PeopleHatesYouNecromancer == FALSE { Wld_ExchangeGuildAttitudes("GIL_ATTITUDES"); };
if B_PeopleHatesYouNecromancer == TRUE  { Wld_ExchangeGuildAttitudes("GIL_ATTITUDES_NecromancerArmor"); };
}
else
{
if B_PeopleHatesYouNecromancer == FALSE { Wld_ExchangeGuildAttitudes("GIL_ATTITUDES_FMTAKEN"); };
if B_PeopleHatesYouNecromancer == TRUE { Wld_ExchangeGuildAttitudes("GIL_ATTITUDES_FMTAKEN_NecromancerArmor"); }; ///// You wear Necromancer's Armor
};
};

Uwagi:
1. Postacie "Npctype = NPCTYPE_FRIEND;" nie powinny nas atakować.

Jak przerobić tego gotowca, żeby dotyczył np. zbroi bandytów

Na podstawie tego skryptu można uzyskać efekt zbliżony do efektu nałożonej zbroi bandyty z Gothic 2 Noc Kruka. Trzeba wówczas go trochę przerobić. Przykładowo można użyć gildii magnata ("Ebr"). Należy wtedy też zmienić gildię NPC-om z tą gildią na inną, by postacie nie rzucały się na magnatów tylko na gracza noszącego konkretną zbroję.

W moim skrypcie po założeniu zbroi zmienia nam się gildia na GIL_DMB. Żeby nam się zmieniała na tą co mieliśmy przed założeniem zbroi musielibyśmy pokombinować z warunkami przy "FUNC VOID UnEquip_DMB_ARMOR_M" ale to już nie wymaga wiedzy tylko odrobinę "benedyktyńskiej pracy".
Gdybym miał radzić to do każdej opcji dialogowej gdzie jesteśmy przyjmowani do gildii  (typu Gomez przyjmuje nas do Cieni, Lee do najemników itd.) można byłoby dodać coś takiego:
Spoiler
ReturnToSTT = TRUE;
ReturnToGRD = FALSE;
ReturnToKDF = FALSE;
ReturnToORG = FALSE;
ReturnToSLD = FALSE;
ReturnToKDW = FALSE;
ReturnToNOV = FALSE;
ReturnToTPL = FALSE;
ReturnToNone = FALSE;
(analogicznie do przyjęcia do innych gildii)

A w "FUNC VOID UnEquip_DMB_ARMOR_M"

Pobawić się z warunkami
if (ReturnToSTT) == TRUE
{
self.guild =  GIL_STT;
Npc_SetTrueGuild(self,GIL_STT);
B_PeopleHatesYouNecromancer = FALSE;
B_InitGuildAttitudes();
}
i oczywiście "ReturnToSTT" i resztę "returnów" trzeba by było dodać do pliku "Story_Globals.d".

Całość powinna ładnie śmigać :)


Kopiowanie i udostępnianie dozwolone. Nie potrzeba uwzględniać w creditsach.

3
Czołem!
Zaimplementowałem do Gothica I system nauki wzorowany na Nocy Kruka wzięty stąd: http://themodders.org/index.php?topic=25808.msg1385525#msg1385525

Mam jednak problem bo próbuję zrobić by bonusy z mikstur stałych, pierścieni i takie bonusy jak ten od Horacego nie wliczały się do progów nauki.

Bardzo prosiłbym o pomoc.

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

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

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

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

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

10
Hejka, sposób użytkownika @Caesum z https://themodders.org/index.php?topic=49.msg40990#msg40990 bardzo fajnie działa. Jest tylko problem, że trzeba ustawić też inne parametry wody takie jak jej przezroczystość, prędkość nurtu, kierunek nurtu czy poprawne ustawienie pluskających elementów.

Przekopiowałem też rzeczy z wpisu @tunczyk cytowanego w poście https://themodders.org/index.php?topic=49.msg407#msg407
Porównując efekt z efektem z wersji steamowej Gothica zauważyłem, że w liście Tuńczyka woda w wodospadach jest ustawiona wolniej - więc nie wiem czy te parametry z listy były wzięte z gry czy autorskie, czy też może różnią się między wersjami gry. W liście Tuńczyka nie ma też kilku rodzajów wód (chyba brakuje OWODSEA2SWAMP) i przede wszystkim tych efektów pluskania przy wodospadach (OWODWFALL_STONE i OWODWFALL_HITSURFACE) a bardzo by się przydały. Dlatego prosiłbym o pomoc, bo nie udało mi się znaleźć tych pozostałych parametrów potrzebnych związanych z wodą. Próbowałem to podejrzeć w czystych plikach Gothica ale tam tych parametrów też nie było lub nie potrafiłem ich znaleźć.

Bardzo bym prosił jeżeli ktoś mógłby wkleić tu zawartość pliku .PML z Gothic\_work\Tools\Data zawierającego parametry wód. Chodzi o pierwszą część Gothica.

Potrzebuję parametrów następujących wód:

FLSWAMPLI

OWODSEA2SWAMP

OWODWATFAST

OWODWATSTAND

OWODWATSTOP

OWODWFALL

OWODWFALL2SEA

OWODWFALLFASTWATER


[efekty pluskania przy wodospadach]

OWODWFALL_HITSURFACE

OWODWFALL_STONE


Jak ktoś miałby analogiczny plik z Gothica 2 to też fajnie by było gdyby wrzucił jego zawartość, bo komuś kto chciałby modować drugą część gry też z pewnością by się przydały.

11
Chciałbym by po dialogu z NPC kończyła się gra i przenosiło nas do menu głównego. Chodzi mi o Gothic I.

Z tego co widziałem to na forum można znaleźć opis, który ma zastosowanie do Gothica II ale w Gothicu I nie działa.


PS: Byłbym też wdzięczny gdyby ktoś miał namiary na plik w skryptach Gothic I, który odpowiada za odpalenie oryginalnego zakończenia bo trochę się naszukałem i nie mogę znaleźć.

12
Wrzucam bo sam się tego mocno naszukałem, więc może komuś oszczędzę tych poszukiwań. Lista jakby co nie moja. Niektórych plików muzycznych brakuje. Rzeczy, których nie mogłem znaleźć w folderach Gothica i Gothica II zaznaczyłem na żółto.


Gothic
Spoiler
Gothic\_work\DATA\Music

01 Title Theme.mp3
Menu.sgt

02 Valley of Mines.mp3
OW_Day_Std.sgt

03 Old Camp.mp3
OC_Day_Std.sgt

04 Old Camp (Combat).mp3
OC_Day_Fgt.sgt

05 Ore Barons.mp3
BAN_Day_Std.sgt

06 Prison Colony.mp3
CAM_Day_Std.sgt

07 Prison Colony (Night).mp3
CAM_Ngt_Std.sgt

08 Prison Colony (Engagement).mp3
CAM_Day_Thr.sgt

09 Prison Colony (Combat).mp3
CAM_Day_Fgt.sgt

10 New Camp.mp3
NCI_Day_Std.sgt

11 New Camp (Combat).mp3
NCI_Day_Fgt.sgt

12 Sect Camp.mp3
PSI_Day_std.sgt

13 Sect Camp (Night).mp3
PSI_Ngt_Std.sgt

14 Sect Camp (Engagement).mp3
PSI_Day_Thr.sgt

15 Sect Camp (Combat).mp3
PSI_Day_Fgt.sgt

16 Old Mine.mp3
OLM_Day_Std.sgt

17 Old Mine (Engagement).mp3
OLM_Day_Thr.sgt

18 Old Mine (Combat).mp3
OLM_Day_Fgt.sgt

19 Undead.mp3
FOC_Day_Std.sgt

20 Orc Settlement.mp3
ORC_Day_Std.sgt

21 Temple of the Sleeper.mp3
OGY_Day_Std.sgt

22 Temple of the Sleeper (Combat).mp3
OGY_Day_Fgt.sgt

23 Gothic Theme (Install).mp3
(brak pliku)



Gothic II

Spoiler
Gothic II\_work\data\Music

01 Opening Theme.mp3.[/b]
wav played at game start
(brak pliku)

02 Title Theme.mp3
Gamestart.sgt

03 Chapter Theme.mp3
CHAPTER_01.WAV

04 Xardas' Tower.mp3
XT_DayStd.sgt

05 Khorinis.mp3
Default.sgt

06 Lobart's Farm.mp3
LOB_DayStd.sgt

07 City of Khorinis.mp3
KH_DayStd.sgt

08 Khorinis Barracks.mp3
KAS_DayStd.sgt

09 City of Khorinis (Combat).mp3
KH_DayFgt.sgt

10 The Lighthouse.mp3
LEU_DayStd.sgt

11 Khorinis (Alternate).mp3
NW_DayStd_A0.sgt

12 Bandit Caves.mp3
BAN_DayStd.sgt

13 Bandit Caves (Combat).mp3
BAN_DayFgt.sgt

14 The Woods.mp3
WOO_DayStd.sgt

15 The Woods (Engagement).mp3
WOO_DayThr.sgt

16 The Woods (Combat).mp3
WOO_DayFgt.sgt

17 The Monastery of Innos.mp3
MO_DayStd.sgt

18 Fire Mages.mp3
MI_DayStd.sgt

19 Cemetary.mp3
FRI_DayStd.sgt

20 Temple Ruins.mp3
MAY_DayStd.sgt

21 Temple Ruins (Combat).mp3
MAY_DayFgt.sgt

22 Pass to the Valley of Mines.mp3
OWP_DayStd.sgt

23 Pass to the Valley of Mines (Combat).mp3
OWP_DayFgt.sgt

24 Valley of Mines.mp3
OWD_DayStd.sgt

25 The Dragons.mp3
DLC_DayStd.sgt

26 The Dragons (Combat).mp3
DLC_DayFgt.sgt

27 Khorinis (Alternate II).mp3
NW_DayStd_A1.sgt

28 Khorinis (Engagement).mp3
NW_DayThr.sgt

29 Khorinis (Combat).mp3
NW_DayFgt.sgt

30 Khorinis (Alternate III).mp3
NW_DayStd.sgt

31 Khorinis Harbor.mp3
PIE_DayStd.sgt

32 The Halls of Irdorath.mp3
DI_DayStd.sgt

33 Gothic II Theme (Install).mp3
.wav played during install
(brak pliku)

34 Love Theme (Piano).mp3
_Love.sty (test1)



Gothic II: Night of the Raven
Spoiler
Gothic II\_work\data\Music

01 Opening Theme.mp3 .
wav played at game start
(brak pliku)

02 Opening The Portal.mp3
.wav played upon opening portal to Jharkendar
(brak pliku)

03 Jharkendar Caves.mp3
BIB_Day_Std.sgt

04 Water Mages.mp3
AWC_Day_Std.sgt

05 Jharkendar.mp3
ADW_Day_Std.sgt

06 Jharkendar (Combat).mp3
ADW_Day_Fgt.sgt

07 Pirate Camp.mp3
PIR_Day_Std.sgt

08 The Canyon.mp3
CAN_Day_Std.sgt

09 The Swamp.mp3
SWP_Day_Std.sgt

10 Jharkendar Ruins.mp3
STO_Day_Std.sgt

11 Bandit Camp.mp3
BDT_Day_Std.sgt

12 The Temple.mp3
ADT_Day_Std.sgt

13 Raven.mp3
SHO_Day_Std.sgt

14 Raven (Combat).mp3
SHO_Day_Fgt.sgt


Źródło: opracował użytkownik Speon z portalu World of Gothic w 2006 roku, https://forum.worldofplayers.de/forum/threads/150061-Music-Soundtrack-of-Gothic?p=2538417&viewfull=1#post2538417

13
Dużo filozofii tutaj nie ma. Skopiowałem funkcję b_clearruneinv z Gothica II, podmieniłem czary i zrobiłem by się aktywowała w momencie gdy postać jest nieprzytomna/zabita. Dzięki temu otrzymuje się taki efekt jak w Gothic II - np. jak przy zabiciu poszukiwacza, któremu nie da się zabrać zaklęć.

Przydatne jeżeli ktoś dodaje do swojej modyfikacji do Gothica I sporo przeciwników posługujących się runami i nie chce by potem gracz sprzedawał je handlarzom. W Gothic I runy są dość drogie, więc przy większej liczbie przeciwników postać dostałaby dość dużego zastrzyku magicznej rudy.

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_clearruneinv(var C_NPC slf)
{
var C_NPC her;
her = Hlp_GetNpc(pc_hero);
if(Hlp_GetInstanceID(self) != Hlp_GetInstanceID(her))
{
Npc_RemoveInvItems(slf,ItArRuneLight,Npc_HasItems(slf,ItArRuneLight));
Npc_RemoveInvItems(slf,ItArRuneFirebolt,Npc_HasItems(slf,ItArRuneFirebolt));
Npc_RemoveInvItems(slf,ItArRuneFireball,Npc_HasItems(slf,ItArRuneFireball));
Npc_RemoveInvItems(slf,ItArRuneFirestorm,Npc_HasItems(slf,ItArRuneFirestorm));
Npc_RemoveInvItems(slf,ItArRuneFireRain,Npc_HasItems(slf,ItArRuneFireRain));
Npc_RemoveInvItems(slf,ItArRuneHeal,Npc_HasItems(slf,ItArRuneHeal));
Npc_RemoveInvItems(slf,ItArRuneChainLightning,Npc_HasItems(slf,ItArRuneChainLightning));
Npc_RemoveInvItems(slf,ItArRuneThunderbolt,Npc_HasItems(slf,ItArRuneThunderbolt));
Npc_RemoveInvItems(slf,ItArRuneThunderball,Npc_HasItems(slf,ItArRuneThunderball));
Npc_RemoveInvItems(slf,ItArRuneIceCube,Npc_HasItems(slf,ItArRuneIceCube));
Npc_RemoveInvItems(slf,ItArRuneIceWave,Npc_HasItems(slf,ItArRuneIceWave));
Npc_RemoveInvItems(slf,ItArRuneDestroyUndead,Npc_HasItems(slf,ItArRuneDestroyUndead));
Npc_RemoveInvItems(slf,ItArRuneWindfist,Npc_HasItems(slf,ItArRuneWindfist));
Npc_RemoveInvItems(slf,ItArRuneStormfist,Npc_HasItems(slf,ItArRuneStormfist));
Npc_RemoveInvItems(slf,ItArRuneTelekinesis,Npc_HasItems(slf,ItArRuneTelekinesis));
Npc_RemoveInvItems(slf,ItArRuneCharm,Npc_HasItems(slf,ItArRuneCharm));
Npc_RemoveInvItems(slf,ItArRuneSleep,Npc_HasItems(slf,ItArRuneSleep));
Npc_RemoveInvItems(slf,ItArRunePyrokinesis,Npc_HasItems(slf,ItArRunePyrokinesis));
Npc_RemoveInvItems(slf,ItArRuneControl,Npc_HasItems(slf,ItArRuneControl));
Npc_RemoveInvItems(slf,ItArRuneBreathOfDeath,Npc_HasItems(slf,ItArRuneBreathOfDeath));
};
};

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

By funkcja się wywoływała wklejasz B_ClearRuneInv(self); w plikach "ZS_Dead.d" i "ZS_Unconscious.d". Oba pliki znajdują się w Gothic\_work\DATA\scripts\Content\AI\ZS_Human.

W pliku "ZS_Dead.d" możesz wkleić B_ClearRuneInv(self); pod B_GiveDeathInv();, zaś w ZS_Unconscious.d" tuż poniżej self.aivar[AIV_PLUNDERED] = FALSE;

Te wycinki powinny wyglądać wówczas tak:

W "ZS_Dead.d":

B_GiveDeathInv();
B_ClearRuneInv(self); //klaue alle runen!!

W "ZS_Unconscious.d"

self.aivar[AIV_PLUNDERED] = FALSE;
B_ClearRuneInv(self);//Hoshi, damit der Player keine Runen findet!

Gotowe!

14
Mam pewien problem. Próbuję dodać oCTriggerChangeLevel, który na początku gry byłby nieaktywny i aktywowałby się dopiero w późniejszym rozdziale gry.

Dodałem w Spacerze stosowny oCTriggerChangeLevel i ustawiłem (też w Spacerze) "StartEnable:False".

Pytanie:
Co muszę wpisać by ten "uśpiony" changelevel się "obudził"?
Mam na myśli: co musiałbym dopisać przykładowo w takim pliku "Gothic\_work\DATA\scripts\Content\Story\CHAPTERS\B_Story_UrizielLoaded.d" by do zadziałało na changelevel.


Korzystając też z okazji chciałbym też zadać drugie pytanie:
Czy da się z poziomu skryptów zmienić "showVisual:FALSE" na "showVisual:TRUE"?

15
Skrypt, który sprawi, że gdy Bezimienny śpi regeneruje się nie tylko on lecz i wszystkie ludzkie postacie w Górniczej Dolinie (z wyjątkiem postaci martwych) + jeżeli jakaś postać nie ma broni, to w tym momencie otrzyma także broń.

Na początek przerobiona została funkcja  "B_RefreshAtInsert.d" wzięta z "Gothic II\_work\data\Scripts\Content\AI\AI_Intern". Edytowano opcję "B_RefreshAtInsert" by działała na takiej samej zasadzie jak "B_KillNpc" i nazwano ją "B_RefreshNpc.

Funkcja "B_RefreshNpc"
//#############################################################################################
// REFRESHNPC - full health and a weapon
//
//#############################################################################################

func void B_RefreshNPC(var int npcInstance)
{
PrintDebugNpc (PD_ZS_DETAIL, "B_RefreshNPC");

var C_NPC npc;
npc = Hlp_GetNpc(npcInstance);

if(npc.attribute[ATR_HITPOINTS] > 0)
{
Npc_ChangeAttribute (npc, ATR_HITPOINTS, npc.attribute[ATR_HITPOINTS_MAX]);
};

if(Npc_HasEquippedWeapon(Npc) == FALSE) && (npc.attribute[ATR_HITPOINTS] > 0)
{
if(Npc.guild == GIL_NONE)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_EBR) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_GRD) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_STT) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_KDF) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_VLK) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_KDW) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_SLD) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_ORG) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_BAU) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_SFB) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_GUR) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_NOV) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_TPL) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_BAB) && (npc.attribute[ATR_HITPOINTS] > 0)
{

if (Npc_HasItems (npc,Itmw_1h_club_01) < 1)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
};

AI_EquipBestMeleeWeapon(Npc);
};
};
};

Pałka
Itmw_1h_club_01
obrażenia obuchowe:5
wartość kupna: 2 bryłki rudy
wartość sprzedaży: 1 bryłka rudy

Miecz strażnika
itmw_1h_sword_03
Obrażenia sieczne: 32
wartość kupna: 104 bryłki rudy
wartość sprzedaży: 52 bryłki rudy

Potem stworzono osobne funkcje korzystające z funkcji "B_RefreshNpc" dla różnych grup postaci (np. B_RefreshNpcOC, B_RefreshNpcNC, B_RefreshNpcOM, B_RefreshNpcFMC, itd.) gdzie wpakowano wszystkie postacie z danego osiedla.

Przykładowa funkcja "B_RefreshNpcQuentinBandits":

func void B_RefreshNpcQuentinBandits()
{
//------------Banditenlager-----------------------------------
B_RefreshNPC (ORG_858_Quentin);
B_RefreshNPC (ORG_863_Raeuber);
B_RefreshNPC (ORG_864_Raeuber);
B_RefreshNPC (ORG_865_Raeuber);
B_RefreshNPC (ORG_866_Raeuber);
B_RefreshNPC (ORG_867_Raeuber);
B_RefreshNPC (ORG_868_Raeuber);
B_RefreshNPC (ORG_869_Raeuber);
B_RefreshNPC (ORG_870_Raeuber);
B_RefreshNPC (ORG_871_Raeuber);
B_RefreshNPC (ORG_874_Raeuber);
};

Najprawdopodobniej można to było wpakować wszystko do jednej funkcji, w której znalazłyby się wszystkie postacie z całej Górniczej Doliny ale z ostrożności podzielono to na osobnych funkcji, żeby łatwiej było coś zmienić gdyby gra miała problem z przetworzeniem wszystkich NPC

Na koniec powiązano to z funkcją "PC_Sleep" w pliku Sleepabit.d (Gothic\_work\DATA\scripts\Content\Story\EVENTS).

//****************************
// PC_Sleep
//****************************

func void PC_Sleep (var int t)
{
AI_StopProcessInfos(self); // [SK] ->muss hier stehen um das update zu gewährleisten
self.aivar[AIV_INVINCIBLE]=FALSE;
if (Wld_IsTime(00,00,t,00))
{
Wld_SetTime (t,00);
}
else
{
t = t + 24;
Wld_SetTime (t,00);
};

PrintScreen ("Sen dobrze ci zrobił.", -1,-1,"font_old_20_white.tga",3);
hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS_MAX];
hero.attribute[ATR_MANA] = hero.attribute[ATR_MANA_MAX];
B_RefreshNpcNC();
B_RefreshNpcFMC();
B_RefreshNpcFM();
B_RefreshNpcOC();
B_RefreshNpcOM();
B_RefreshNpcPSICamp();
B_RefreshNpcQuentinBandits();

//-------- AssessEnterRoom-Wahrnehmung versenden --------
PrintGlobals (PD_ITEM_MOBSI);
Npc_SendPassivePerc (hero, PERC_ASSESSENTERROOM, NULL, hero); //...damit der Spieler dieses Feature nicht zum Hütteplündern ausnutzt!
};

Uwagi:
1. Funkcja nie działa między zenami. Jeżeli więc główny bohater prześpi się w WORLD.ZEN to postacie z OLDMINE.ZEN i FREEMINE.ZEN nie ulegną regeneracji.
2. Właściwie można wszystkie postacie z wszystkich obozów wpakować do jednej funkcji, lecz wolałem podzielić to obozami - na wypadek gdyby gra miała problem z regeneracją wszystkich postaci w Kolonii jednocześnie.
3. Broń, która się spawnuje przy regeneracji postaci może trochę zaburzyć balans gry. Przykładowo cena "miecza strażnika" spawnującego się dla magnatów, strażników, najemników i strażników świątynnych wynosi 52 bryłki rudy. Zawsze jednak można zrobić drugą wersję miecza z obniżoną ceną specjalnie na potrzeby "B_RefreshNPC".
4. Generalnie w podstawowej i niezmodyfikowanej wersji gry Gothic istnieje pewien sposób by zregenerować HP wszystkich postaci. Wystarczy przejść z jednego z jednego zena do drugiego, więc jeżeli chcesz by wszystkie pobite przez Ciebie postacie w Starym i Nowym Obozie przestały krwawić to po prostu wejdź do Starej Kopalni a po wyjściu z niej wszyscy znów będą zdrowi ale... pozbawieni broni (jeżeli im ją zabrałeś). Jeżeli chcesz by regenerowała się im też broń i by regeneracja odbywała się trochę częściej niż przy okazji powrotu z wizyt w Kopalniach to możesz sięgnąć po ten skrypt :)

EDIT z 24.05.2025 r.:
Drobna poprawka w skrypcie, która wyeliminowała bug sprawiający, że w poprzedniej wersji skryptu martwe postacie ożywały po jego odpaleniu.

EDIT z 7.08.2025 r.:
Poprawka, która ma zapobiegać zjawisku "cudownego rozmnażania się broni".

EDIT z 13.01.2026 r.:
Poprawka. Od teraz przy martwej i ograbionej z oręża postaci nie będzie się już spawnowała broń.

Kopiowanie dozwolone.

16
Cześć

Próbuję przenieść pewną rzecz z Gothic 2 do Gothic 1. Chodzi o to by pobite postacie się regenerowały i uzupełniały podręczną broń po tym jak znikną głównemu bohaterowi z widoku.

Jeżeli dobrze rozumiem, to kluczowy jest plik "B_RefreshAtInsert.d" wzięty z "Gothic II\_work\data\Scripts\Content\AI\AI_Intern".

Trochę edytowałem ten plik i próbowałem go umieścić w różnych miejscach. W pierwszej kolejności rzecz jasna w "Gothic\_work\data\Scripts\Content\AI\AI_Intern". Między innymi zauważyłem, że w "Gothic.src" Gothica Dwójki znajdowała się linijka "AI\AI_Intern\B_RefreshAtInsert.d", więc dodałem analogiczną linijkę w "Gothic.src" Gothica Jedynki.

Gdy to się nie udało próbowałem przekleić treść "B_RefreshAtInsert" do jednego z plików ".d" w folderze "Gothic\_work\DATA\scripts\Content\Story\B". Też kicha.

Próbowałem potem na różne sposoby. Wstawiłem plik "B_RefreshAtInsert.d" do folderu "Gothic\_work\DATA\scripts\Content\AI\B_Human".

Na zabawie metodą prób i błędów zeszło mi kilka godzin - próbując wstawić tą rzecz w różnych konfiguracjach. Niestety na próżno.

Próbowałem też z "ZS_HealSelf.d" (z folderu "D:\Steam\steamapps\common\Gothic\_work\DATA\scripts\Content\AI\ZS_Human") - jako swoistą wersję minimum, żeby chociaż ci z niepełnym HP uzupełniali sobie miksturami i nie stali wykrwawieni do końca gry ale NPC nie chciały tego robić nawet jak byli ranni czy pobici. Zależałoby mi też na tym by pozbawieni broni się jednak uzbrajali jak w Gothic 2.

Dodam, że wszystko ładnie się reparsuje w Spacerze i nie wyskakuje żaden błąd - poza tym, że skrypt nie działa.

Bardzo proszę o pomoc. Wstawiam tu projekt swojej wersji B_RefreshAtInsert i prosiłbym o:
1. Wskazówki co w nim jest ewentualnie źle.
2. Gdzie go wstawić by zadziałał.


func void b_refreshatinsert()
{
var C_NPC her;
if(self.attribute[ATR_HITPOINTS] <= 0)
{
return;
};
her = Hlp_GetNpc(pc_hero);
if((self.guild < GIL_SEPERATOR_HUM) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(her)))
{
self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS_MAX];
if(Npc_HasEquippedWeapon(self) == FALSE)
{
if(self.guild == GIL_NONE)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_EBR)
{
CreateInvItems(self,itmw_1h_sword_03,1);
};
if(self.guild == GIL_GRD)
{
CreateInvItems(self,itmw_1h_sword_03,1);
};
if(self.guild == GIL_STT)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_KDF)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_VLK)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_KDW)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_SLD)
{
CreateInvItems(self,itmw_1h_sword_03,1);
};
if(self.guild == GIL_ORG)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_BAU)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_SFB)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_GUR)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_NOV)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_TPL)
{
CreateInvItems(self,itmw_1h_sword_03,1);
};
if(self.guild == GIL_BAB)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
};
};
};


17
Ściągnąłem modele orków z banku modderskiego na WoG-u, a konkretnie stąd: https://www.worldofgothic.de/?go=moddb&action=view&fileID=810&cat=0&page=16&order=1&searchcat=0

W paczce są następujące pliki:
HOSH_BODY.MDM
ORC_BODYSCOUT.MDM
ORC_BODYSLAVE.MDM
ORC_BODYWARRIOR2.MDM
ORC_BODYWARRIOR3.MDM
ORC_BODYZOMBIE.MDM

ORC2.MDH

ORC2.MSB

Próbowałem je zdekompilować Gothic Sourcerem ale nie ma w nim opcji dekompilacji plików MDM. Bo z tego co rozumiem potrzebuję wyciągnąć z tego MDM-a pliki ASC. Prosiłbym więc o pomoc tym bardziej, że kiepsko czuję GothicSourcera.

Dodam tylko, że uprzednio ściągałem inne modele orków z WoG-a i udało mi się dodać je do gry. Bardzo prosiłbym o pomoc bo do dodania orków z tej paczki od joey1990 podchodzę już chyba czwarty czy piąty raz.

PS: Ewentualnie gdyby była taka możliwość prosiłbym o wrzucenie tych wyciągniętych plików ASC na ModderDatenBank bo autor tych modeli wspomina o tym, że je utracił. To by ułatwiło pobranie tych modeli mniej doświadczonym modderom.

18
Materiały / ORCCITY.ZEN - podziemne miasto orków [link]
« dnia: 2024-09-20, 20:45 »
Wrzucam bezpośredni odnośnik przede wszystkim z myślą o takich nowicjuszach jak ja i w nowym temacie, bo poprzedni temat na forum dotyczący podziemnego orkowego miasta odpłynął w kierunku omawiania wcześniejszych wersji Gothica i nie znalazłem w nim linka. Oczywiście nie jestem autorem zena.

Link do zena z podziemnym orkowym miastem:

https://rpgrussia.com/resources/gothic-podzemnyj-gorod-orkov-zen-fajl.575/

Żeby go pobrać trzeba się zarejestrować na https://rpgrussia.com.

Jak chcecie screenshoty z worlda to musicie kliknąć przycisk "Подробнее" pod napisem "Скриншоты:".

PS: Nie wiem na ile modder, który wrzucił tego zena do serwisu go edytował a na ile jest oryginalnym zenem od Piranhi.

Wejście do podziemnego miasta:
Spoiler
Trzeba znaleźć kamienny pokój nieopodal Kamiennego Kręgu i Krypty, w której razem z Miltenem walczymy z Nadzorcą i zdobywamy orkowy amulet podczas poszukiwania kamienia ogniskującego. Gdy jesteśmy w tej komnacie musimy uruchomić kody i za pomocą "k" przetransportować naszą postać w kierunku miasta orków - wtedy "załapie" nam Zen-a.
Spoiler
https://www.youtube.com/watch?v=nKmAR_hw4R0

W samym ORCCITY.ZEN nie ma żadnych postaci (żadnych orków). Są waypointy ale niepołączone; w lokacji zamieszczono też już freepointy. Orkowe miasto wyposażone jest w bębny, krzesła, łóżka i tym podobne elementy otoczenia. Gdy wejdziemy do tej lokacji lądujemy nie w jakimś naturalnym wejściu ale w samym środku zena - linkowany zen nie ma jeszcze ustawionego poprawnie startpointa. ORCCITY.ZEN jednak ustawione poprawnie wyjście z zena - na końcu pewnego tunelu, ale gdy wyjdziemy z zena tym wyjściem to wylądujemy na dziedzińcu zamkowym w Starym Obozie.

19
Materiały / Spolszczony Story Helper do Gothica 1
« dnia: 2024-09-20, 07:52 »
Zwykłe przetłumaczenie nazw rozdziałów u Story Helpera z niemieckiego na polski zrobione na własny użytek. Niby nic a jednak trochę pomaga.

INSTANCE SH(NPC_DEFAULT)
// PlayerInstanz
{
//-------- primary data --------
name = "StoryHelper";
Npctype = Npctype_Main;
guild = GIL_NONE;
level = 10;
voice = 15;
id = 0;


//-------- visuals --------
// animations
Mdl_SetVisual (self,"HUMANS.MDS");
// Body-Mesh Body-Tex Skin-Color Head-MMS    Head-Tex Teeth-Tex Armor-Tex
Mdl_SetVisualBody (self,"hum_body_Naked0", 4, 1, "Hum_Head_Pony", 9, 0, -1);

//-------- ai ----------
start_aistate = ZS_SH_Hangaround;
};

func void ZS_SH_Hangaround ()
{
PrintDebugNpc (PD_ZS_FRAME, "ZS_SH_Hangaround");

Npc_PercEnable  (self, PERC_ASSESSTALK, B_AssessTalk );
};

func void ZS_SH_Hangaround_Loop ()
{
PrintDebugNpc (PD_ZS_LOOP, "ZS_SH_Hangaround_Loop");
};

func void ZS_SH_Hangaround_End ()
{
PrintDebugNpc (PD_ZS_FRAME, "ZS_SH_Hangaround_End");
};

//***************************************************************************
// Rahmen-Infos
//***************************************************************************
instance  StoryHelper_Exit (C_INFO)
{
npc =  SH;
nr =  999;
condition =  StoryHelper_Exit_Condition;
information =  StoryHelper_Exit_Info;
important =  0;
permanent =  1;
description = "KONIEC";
};                       

FUNC int  StoryHelper_Exit_Condition()
{
return 1;
};

FUNC VOID  StoryHelper_Exit_Info()
{
AI_StopProcessInfos ( self );
};



//#####################################################################
//##
//##
//## KAPITEL 2
//##
//##
//#####################################################################
INSTANCE StoryHelper_INFO2 (C_INFO)
{
npc = SH;
condition = StoryHelper_INFO2_Condition;
information = StoryHelper_INFO2_Info;
important = 0;
permanent = 1;
description = "Rozdział 2";
};

FUNC INT StoryHelper_INFO2_Condition()
{
return TRUE;
};

func VOID StoryHelper_INFO2_Info()
{

Info_ClearChoices ( StoryHelper_INFO2 );

Info_AddChoice ( StoryHelper_INFO2, "POWRÓT"                 , StoryHelper_BACK2);
Info_AddChoice ( StoryHelper_INFO2, "5. Wszystko gotowe do wielkiego rytuału" , StoryHelper_PrepareRitual );
Info_AddChoice ( StoryHelper_INFO2, "4. Zdobywanie Almanachu" , StoryHelper_CorKalom_BringBook_RUNNING );
Info_AddChoice ( StoryHelper_INFO2, "3. Zdobywanie jaj pełzaczy" , StoryHelper_CorKalom_BringMCQBalls_RUNNING );
Info_AddChoice ( StoryHelper_INFO2, "2. Na wyprawie po kamień ogniskujący" , StoryHelper_YBerion_BringFocus_SUCCESS );
Info_AddChoice ( StoryHelper_INFO2, "1. Początek rozdziału drugiego" , StoryHelper_Chapter2Start );
};

//---------------------------------------------------------------------
// Kapitelanfang
//---------------------------------------------------------------------
func void StoryHelper_Chapter2Start()
{

//-------- was davor geschah --------

//-------- was neu geschieht --------
B_Kapitelwechsel (2);

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO2);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Bringe Fokus zu Cor Kalom
//---------------------------------------------------------------------
func void StoryHelper_YBerion_BringFocus_SUCCESS()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);

//-------- was neu geschieht --------
CreateInvItem (hero, Focus_1);
YBerion_BringFocus = LOG_SUCCESS;

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO2 );
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Hole die MCQ-Eier
//---------------------------------------------------------------------
func void StoryHelper_CorKalom_BringMCQBalls_RUNNING()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
YBerion_BringFocus = LOG_SUCCESS;

//-------- was neu geschieht --------
GUR_1201_CorKalom_WEG_ACCEPT(); // Log-Entry anlegen!
CorKalom_BringMCQBalls = LOG_RUNNING;

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO2);
AI_StopProcessInfos (self);
}; 

//---------------------------------------------------------------------
// Hole den Almanach
//---------------------------------------------------------------------
func void StoryHelper_CorKalom_BringBook_RUNNING()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
YBerion_BringFocus = LOG_SUCCESS;

//-------- was neu geschieht --------
CorKalom_BringMCQBalls = LOG_SUCCESS;
CorKalom_BringBook = LOG_RUNNING;

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO2 );
AI_StopProcessInfos (self);
}; 

//---------------------------------------------------------------------
// Vorbereitung auf die große Beschwörung
//---------------------------------------------------------------------
func void StoryHelper_PrepareRitual()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
YBerion_BringFocus = LOG_SUCCESS;
CorKalom_BringMCQBalls = LOG_SUCCESS;

//-------- was neu geschieht --------
CorKalom_BringBook = LOG_SUCCESS;
B_Story_PrepareRitual ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO2 );
AI_StopProcessInfos (self);
}; 

//-------- POWRÓT ---------
func void StoryHelper_BACK2()
{
Info_ClearChoices ( StoryHelper_INFO2 );
};



//#####################################################################
//##
//##
//## KAPITEL 3
//##
//##
//#####################################################################
INSTANCE StoryHelper_INFO3 (C_INFO)
{
npc = SH;
condition = StoryHelper_INFO3_Condition;
information = StoryHelper_INFO3_Info;
important = 0;
permanent = 1;
description = "Rozdział 3";
};

FUNC INT StoryHelper_INFO3_Condition()
{
return TRUE;
};

func void StoryHelper_INFO3_Info()
{
Info_ClearChoices ( StoryHelper_INFO3 );

Info_AddChoice ( StoryHelper_INFO3, DIALOG_BACK , StoryHelper_BACK3 );
Info_AddChoice ( StoryHelper_INFO3, "4. Zbieranie kamieni ogniskujących dla Saturasa" , StoryHelper_SaturasBringFoci_RUNNING);
Info_AddChoice ( StoryHelper_INFO3, "3. Śmierć YBeriona. CorAngar wysyła nas do Nowego Obozu" , StoryHelper_CorAngar_SendToNC);
Info_AddChoice ( StoryHelper_INFO3, "2. BaalLukor pokonany - powrót z Cmentarza Orków" , StoryHelper_BaalLukor_DEFEAT);
Info_AddChoice ( StoryHelper_INFO3, "1. Wyruszenie na Cmentarz Orków!" , StoryHelper_OrcGraveyard);
};

//---------------------------------------------------------------------
// Bereit für den Ork-Friedhof
//---------------------------------------------------------------------
func void StoryHelper_OrcGraveyard()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();

//-------- was neu geschieht --------
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO3);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// BaalLukor - besiegt
//---------------------------------------------------------------------
func void StoryHelper_BaalLukor_DEFEAT()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard();

//-------- was neu geschieht --------
BaalLukor_BringParchment = 4;

//-------- Menü --------
Info_ClearChoices ( StoryHelper_INFO3 );
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// CorAngar - zum NC gehen
//---------------------------------------------------------------------
func void StoryHelper_CorAngar_SendToNC()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard();

//-------- was neu geschieht --------
B_Story_BackFromOrcGraveyard();
CreateInvItem (hero, focus_1);
CreateInvItem (hero, ItWrFokusbuch);
B_Story_SentToNC ();

//-------- Menü --------
Info_ClearChoices ( StoryHelper_INFO3 );
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Saturas  - 4 Foki holen
//---------------------------------------------------------------------
func void StoryHelper_SaturasBringFoci_RUNNING()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard();
B_Story_SentToNC ();

//-------- was neu geschieht --------
B_Story_BringFoci ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO3);
AI_StopProcessInfos (self);
};

//-------- POWRÓT ---------
func void StoryHelper_BACK3()
{
Info_ClearChoices (StoryHelper_INFO3);
};




//#####################################################################
//##
//##
//## KAPITEL 4
//##
//##
//#####################################################################
INSTANCE StoryHelper_INFO4 (C_INFO)
{
npc = SH;
condition = StoryHelper_INFO4_Condition;
information = StoryHelper_INFO4_Info;
important = 0;
permanent = 1;
description = "Rozdział 4";
};

FUNC INT StoryHelper_INFO4_Condition()
{
return TRUE;
};

func void StoryHelper_INFO4_Info()
{
Info_ClearChoices ( StoryHelper_INFO4 );

Info_AddChoice ( StoryHelper_INFO4, "POWRÓT" , StoryHelper_BACK4 );
Info_AddChoice ( StoryHelper_INFO4, "7. Poszukiwanie materiałów do Ulu-Mulu" , StoryHelper_SearchForUluMulu);
Info_AddChoice ( StoryHelper_INFO4, "6. Gotowość do odbicia Wolnej Kopalni" , StoryHelper_AttackFreeMine);
Info_AddChoice ( StoryHelper_INFO4, "5. Szukanie wyganego orkowego szamana" , StoryHelper_XardasFindOrcShaman);
Info_AddChoice ( StoryHelper_INFO4, "4. Pierwsze spotkanie z Xardasem" , StoryHelper_XardasIntro);
Info_AddChoice ( StoryHelper_INFO4, "3. Saturas zleca odnalezienie Xardasa" , StoryHelper_SaturasFindXardas);
Info_AddChoice ( StoryHelper_INFO4, "2. Zajęcie Wolnej Kopalni przez Gomeza" , StoryHelper_FreeMineAmbush);
Info_AddChoice ( StoryHelper_INFO4, "1. Z prośbą do magów ognia o pomoc Saturasowi" , StoryHelper_SaturasBringFoci_SUCCESS);
};


//---------------------------------------------------------------------
// Saturas  - Feuermagier holen
//---------------------------------------------------------------------
func void StoryHelper_SaturasBringFoci_SUCCESS()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard();
B_Story_SentToNC ();
B_Story_BringFoci ();

//-------- was neu geschieht --------
B_Story_BroughtFoci ();
B_KapitelWechsel (4);

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO4);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Diego - Freie Mine überfallen
//---------------------------------------------------------------------
func void StoryHelper_FreeMineAmbush()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);

//-------- was neu geschieht --------
B_Story_FMTaken ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO4);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Saturas - Finde Xardas
//---------------------------------------------------------------------
func void StoryHelper_SaturasFindXardas()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();

//-------- was neu geschieht --------
B_Story_CordsPost ();
B_Story_FindXardas ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO4);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Xardas - Erste Begegnung
//---------------------------------------------------------------------
func void StoryHelper_XardasIntro()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();
B_Story_CordsPost ();
B_Story_FindXardas ();

//-------- was neu geschieht --------
B_Story_AccessToXardas ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO4);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Xardas - Finde den Ork Schamanen
//---------------------------------------------------------------------
func void StoryHelper_XardasFindOrcShaman()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();
B_Story_CordsPost ();
B_Story_FindXardas ();
B_Story_AccessToXardas ();

//-------- was neu geschieht --------
B_Story_FindOrcShaman ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO4);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Bereit für Angriff auf die Freie Mine
//---------------------------------------------------------------------
func void StoryHelper_AttackFreeMine()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();
B_Story_CordsPost ();
B_Story_FindXardas ();
B_Story_AccessToXardas ();
B_Story_FindOrcShaman ();

//-------- was neu geschieht --------
B_Story_FoundUrShak ();
B_Story_FriendOfUrShak ();
B_Story_ReturnedFromUrShak ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO4);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Suche Teile für Ulu-Mulu
//---------------------------------------------------------------------
func void StoryHelper_SearchForUluMulu()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();
B_Story_CordsPost ();
B_Story_FindXardas ();
B_Story_AccessToXardas ();
B_Story_FindOrcShaman ();
B_Story_FoundUrShak ();
B_Story_FriendOfUrShak ();
B_Story_ReturnedFromUrShak ();

//-------- was neu geschieht --------
B_Story_CancelFindXardas ();
B_Story_GornJoins ();
Knows_GetMCPlates = TRUE;
B_Story_JackalFight ();
B_Story_FoundOrcSlave ();
B_Story_CuredOrc ();
B_Story_LeftFM ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO4);
AI_StopProcessInfos (self);
};

//-------- POWRÓT ---------
func void StoryHelper_BACK4()
{
Info_ClearChoices (StoryHelper_INFO4);
};



//#####################################################################
//##
//##
//## KAPITEL 5
//##
//##
//#####################################################################
INSTANCE StoryHelper_INFO5 (C_INFO)
{
npc = SH;
condition = StoryHelper_INFO5_Condition;
information = StoryHelper_INFO5_Info;
important = 0;
permanent = 1;
description = "Rozdział 5";
};

FUNC INT StoryHelper_INFO5_Condition()
{
return TRUE;
};

func void StoryHelper_INFO5_Info()
{
Info_ClearChoices ( StoryHelper_INFO5 );

Info_AddChoice ( StoryHelper_INFO5, "POWRÓT" , StoryHelper_BACK5 );
Info_AddChoice ( StoryHelper_INFO5, "5. URIZIEL naładowany" , StoryHelper_UrizielLoaded);
Info_AddChoice ( StoryHelper_INFO5, "4. Gotowi do naładowania Uriziela" , StoryHelper_LoadUriziel);
Info_AddChoice ( StoryHelper_INFO5, "3. Zbadaj zatopioną wieżę Xardasa" , StoryHelper_ExploreSunkenTower);
Info_AddChoice ( StoryHelper_INFO5, "2. Uriziel odnaleziony" , StoryHelper_FoundUriziel);
Info_AddChoice ( StoryHelper_INFO5, "1. Gotowy do wejścia do Miasta Orków" , StoryHelper_ReadyForOrcCity);
};

//---------------------------------------------------------------------
// Bereit für die Ork-Stadt
//---------------------------------------------------------------------
func void StoryHelper_ReadyForOrcCity()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard ();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();
B_Story_CordsPost ();
B_Story_FindXardas ();
B_Story_AccessToXardas ();
B_Story_FindOrcShaman ();
B_Story_FoundUrShak ();
B_Story_FriendOfUrShak ();
B_Story_ReturnedFromUrShak ();
B_Story_CancelFindXardas ();
B_Story_GornJoins ();
Knows_GetMCPlates = TRUE;
B_Story_JackalFight ();
B_Story_FoundOrcSlave ();
B_Story_CuredOrc ();
B_Story_LeftFM ();

//-------- was neu geschieht --------
B_Story_GotUluMulu ();
B_Kapitelwechsel (5);
CreateInvItem (hero, CRW_ARMOR_H);

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO5);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Uriziel gefunden
//---------------------------------------------------------------------
func void StoryHelper_FoundUriziel()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard ();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();
B_Story_CordsPost ();
B_Story_FindXardas ();
B_Story_AccessToXardas ();
B_Story_FindOrcShaman ();
B_Story_FoundUrShak ();
B_Story_FriendOfUrShak ();
B_Story_ReturnedFromUrShak ();
B_Story_CancelFindXardas ();
B_Story_GornJoins ();
Knows_GetMCPlates = TRUE;
B_Story_JackalFight ();
B_Story_FoundOrcSlave ();
B_Story_CuredOrc ();
B_Story_LeftFM ();
B_Story_GotUluMulu ();
B_Kapitelwechsel (5);
CreateInvItem (hero, CRW_ARMOR_H);

//-------- was neu geschieht --------
EnteredTemple = TRUE;
B_Story_FoundUriziel ();
B_Story_EncounteredHighPriest ();
B_Story_ShowedUrizielToXardas ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO5);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Erforsche den versunkenen Turm
//---------------------------------------------------------------------
func void StoryHelper_ExploreSunkenTower()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard ();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();
B_Story_CordsPost ();
B_Story_FindXardas ();
B_Story_AccessToXardas ();
B_Story_FindOrcShaman ();
B_Story_FoundUrShak ();
B_Story_FriendOfUrShak ();
B_Story_ReturnedFromUrShak ();
B_Story_CancelFindXardas ();
B_Story_GornJoins ();
Knows_GetMCPlates = TRUE;
B_Story_JackalFight ();
B_Story_FoundOrcSlave ();
B_Story_CuredOrc ();
B_Story_LeftFM ();
B_Story_GotUluMulu ();
B_Kapitelwechsel (5);
CreateInvItem (hero, CRW_ARMOR_H);
EnteredTemple = TRUE;
B_Story_FoundUriziel ();
B_Story_EncounteredHighPriest ();
B_Story_ShowedUrizielToXardas ();

//-------- was neu geschieht --------
B_Story_ExploreSunkenTower ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO5);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// Bereit für das Laden von URIZIEL
//---------------------------------------------------------------------
func void StoryHelper_LoadUriziel()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard ();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();
B_Story_CordsPost ();
B_Story_FindXardas ();
B_Story_AccessToXardas ();
B_Story_FindOrcShaman ();
B_Story_FoundUrShak ();
B_Story_FriendOfUrShak ();
B_Story_ReturnedFromUrShak ();
B_Story_CancelFindXardas ();
B_Story_GornJoins ();
Knows_GetMCPlates = TRUE;
B_Story_JackalFight ();
B_Story_FoundOrcSlave ();
B_Story_CuredOrc ();
B_Story_LeftFM ();
B_Story_GotUluMulu ();
B_Kapitelwechsel (5);
CreateInvItem (hero, CRW_ARMOR_H);
EnteredTemple = TRUE;
B_Story_FoundUriziel ();
B_Story_EncounteredHighPriest ();
B_Story_ShowedUrizielToXardas ();
B_Story_ExploreSunkenTower ();

//-------- was neu geschieht --------
CreateInvItem (hero, ORE_ARMOR_M);
CreateInvItem (hero, ItArRuneTeleport1); // zu den Feuermagiern
B_Story_LoadSword ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO5);
AI_StopProcessInfos (self);
};

//---------------------------------------------------------------------
// URIZIEL ist aufgeladen
//---------------------------------------------------------------------
func void StoryHelper_UrizielLoaded()
{
//-------- was davor geschah --------
B_Kapitelwechsel (2);
B_Story_PrepareRitual ();
B_Kapitelwechsel (3);
B_Story_GotoOrcGraveyard ();
B_Story_BackFromOrcGraveyard ();
B_Story_SentToNC ();
B_Story_BringFoci ();
B_Story_BroughtFoci ();
B_KapitelWechsel (4);
B_Story_FMTaken ();
B_Story_CordsPost ();
B_Story_FindXardas ();
B_Story_AccessToXardas ();
B_Story_FindOrcShaman ();
B_Story_FoundUrShak ();
B_Story_FriendOfUrShak ();
B_Story_ReturnedFromUrShak ();
B_Story_CancelFindXardas ();
B_Story_GornJoins ();
Knows_GetMCPlates = TRUE;
B_Story_JackalFight ();
B_Story_FoundOrcSlave ();
B_Story_CuredOrc ();
B_Story_GotUluMulu ();
B_Kapitelwechsel (5);
CreateInvItem (hero, CRW_ARMOR_H);
EnteredTemple = TRUE;
B_Story_FoundUriziel ();
B_Story_EncounteredHighPriest ();
B_Story_ShowedUrizielToXardas ();
B_Story_ExploreSunkenTower ();
CreateInvItem (hero, ORE_ARMOR_M);
CreateInvItem (hero, ItArRuneTeleport1); // zu den Feuermagiern
B_Story_LoadSword ();

//-------- was neu geschieht --------
B_Kapitelwechsel (6);
B_Story_UrizielLoaded ();

//-------- Menü --------
Info_ClearChoices (StoryHelper_INFO5);
AI_StopProcessInfos (self);
};


//-------- POWRÓT ---------
func void StoryHelper_BACK5()
{
Info_ClearChoices (StoryHelper_INFO5);
};


20
W nawiązaniu do tego tematu https://themodders.org/index.php?topic=7465.20 gdzie ktoś się skarżył, że magiczna bariera wyświetla się tylko kilka chwil po rozpoczęciu nowej gry a potem znika.

Rozwiązanie:

Jeżeli macie zainstalowany System Pack do Gothica1 to w "Gothic\system" będzie się znajdował plik "SystemPack.ini". Tam wyszukajcie sobie BARRIER i tam możecie sobie ustawić stały widok bariery.


[BARRIER]

AlwaysON=1
; ... Displays the visual effect of the Barrier continuously - on (1) or off (0), default is 0.

AlwaysOFF=0
; ... Disables the visual effect of the Barrier - on (1) or off (0), default is 0.

DisableSound=0
; ... Disable sound of barrier, - on (1) or off (0), default is 0.

DisableDamage=0
; ... disable damage from barrier, - on (1) or off (0), default is 0.


Strony: [1] 2
Do góry