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

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

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

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

5
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

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

7
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"?

8
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)
{
if(Npc.guild == GIL_NONE)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_EBR)
{
CreateInvItems(Npc,itmw_1h_sword_03,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_GRD)
{
CreateInvItems(Npc,itmw_1h_sword_03,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_STT)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_KDF)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_VLK)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_KDW)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_SLD)
{
CreateInvItems(Npc,itmw_1h_sword_03,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_ORG)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_BAU)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_SFB)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_GUR)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_NOV)
{
CreateInvItems(Npc,Itmw_1h_club_01,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_TPL)
{
CreateInvItems(Npc,itmw_1h_sword_03,1);
AI_EquipBestMeleeWeapon(Npc);
};
if(Npc.guild == GIL_BAB)
{
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.

Kopiowanie dozwolone.

9
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);
};
};
};
};


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

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

12
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);
};


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


14
Zmiana wymaganej ilości punktów nauki

Możesz zmienić ilość wymaganych punktów nauki w pliku "Story_Globals.d", który znajduje się w "Gothic\_work\DATA\scripts\Content\Story". Na zasadzie, że określisz ile Punktów Nauki będzie wymagała nauka 1 punktu siły/zręczności/many. W tym celu wyszukaj w tym pliku słowa "Lernkosten" i będziesz miał coś takiego:

const int LPCOST_ATTRIBUTE_STRENGTH = 1;
const int LPCOST_ATTRIBUTE_DEXTERITY = 1;
const int LPCOST_ATTRIBUTE_MANA = 1;

const int LPCOST_TALENT_MAGE_1 = 10;
const int LPCOST_TALENT_MAGE_2 = 15;
const int LPCOST_TALENT_MAGE_3 = 20;
const int LPCOST_TALENT_MAGE_4 = 25;
const int LPCOST_TALENT_MAGE_5 = 30;
const int LPCOST_TALENT_MAGE_6 = 40;

const int LPCOST_TALENT_1H_1 = 10;
const int LPCOST_TALENT_1H_2 = 20;
const int LPCOST_TALENT_2H_1 = 30;
const int LPCOST_TALENT_2H_2 = 40;

const int LPCOST_TALENT_BOW_1 = 10;
const int LPCOST_TALENT_BOW_2 = 20;
const int LPCOST_TALENT_CROSSBOW_1 = 10;
const int LPCOST_TALENT_CROSSBOW_2 = 20;

const int LPCOST_TALENT_ACROBAT = 10;
const int LPCOST_TALENT_SNEAK = 10;
const int LPCOST_TALENT_PICKLOCK_1 = 10;
const int LPCOST_TALENT_PICKLOCK_2 = 20;
const int LPCOST_TALENT_PICKPOCKET_1 = 10;
const int LPCOST_TALENT_PICKPOCKET_2 = 20;

Jest jednak mały haczyk - o ile bez problemu można zmienić przykładowo koszt nauki walki bronią czy umiejętności złodziejskich to... z siłą, zręcznością i maną jest pewien problem bo nie wystarczy tylko zmienić

const int LPCOST_ATTRIBUTE_STRENGTH = 1;
na przykładowo

const int LPCOST_ATTRIBUTE_STRENGTH = 2;
Jeżeli ograniczysz się wyłącznie do zmiany cyferki to jakkolwiek w dialogu u Diego będzie Ci się wyświetlać "+1 Punkt siły, koszt 2 Punkty Nauki" oraz "+5 Punktów Siły, koszt 10 Punktów Nauki" to w praktyce Diego da Ci odpowiednio 2 Punkty Siły i 5 Punktów Siły czyli wg przelicznika 1 za 1, zamiast przelicznika wpisanego w "Story_Globals.d"
Dodatkowo to samo będzie się tyczyć wszystkich innych nauczycieli (w przypadku siły w Gothic 1 będzie to oprócz Diega Cor Angar, Gor Na Toth, Lares, Lee, Thorus). Tak samo będzie z nauką u nauczycieli Zręczności i Many. Ale UWAGA: według przelicznika z "Story_Globals.d" będzie Cię uczył Character Helper ("insert ch") a mówiąc ściślej - wyłącznie Character Helper.

Skąd ta różnica między normalnymi nauczycielami a Character Helperem?
Dzieje się tak dlatego, że dialogi odpowiadające za naukę u "normalnych nauczycieli" siły, zręczności i many z Gothica korzystają z "B_BuyAttributePoints" a dialogi odpowiadające za naukę siły, zręczności i many u "Character Helpera" korzystają z "B_SetHeroAttributes".



Rozwiązanie:
czyli co zrobić, żeby nauczyciele uwzględniali przelicznik z pliku "Story_Globals.d".

1. Musisz wejść w plik dialogowy postaci nauczyciela i zamienić:

B_BuyAttributePoints (other, ATR_STRENGTH, LPCOST_ATTRIBUTE_STRENGTH);
na

B_SetHeroAttributes(ATR_STRENGTH, 1, LPCOST_ATTRIBUTE_STRENGTH)
oraz

Cytuj
B_BuyAttributePoints (other, ATR_STRENGTH, 5*LPCOST_ATTRIBUTE_STRENGTH);

na

B_SetHeroAttributes(ATR_STRENGTH, 5, 5*LPCOST_ATTRIBUTE_STRENGTH);
2. Niestety będziesz musiał to zrobić osobno dla każdego z nauczycieli siły - czyli osobno wejść do dialogu Diego, Cor Angara, Thorusa, Laresa, itd i zmienić te fragmenty.

3. Analogicznie to działa z podmianą B_BuyAttributePoints na B_SetHeroAttributes ze zręcznością i maną.

4. I rzecz prawie najważniejsza, bez której cała impreza nie ruszy - plik odpowiedzialny za dialog normalnego nauczyciela (np. "DIA_Pc_Thief.d" znajdujący się w "Gothic\_work\DATA\scripts\Content\Story\MISSIONS" a odpowiedzialny za Diega) nie "zassie" i nie rozpozna funkcji "B_SetHeroAttributes" jeżeli nie zrobimy tego o czym teraz będzie mowa.   

Funkcja "B_SetHeroAttributes" znajduje się w pliku "CharacterHelper.d" w folderze "Gothic\_work\DATA\scripts\Content\AI\Test_Skripts". Musisz wyciąć tę funkcję czyli:


func void B_SetHeroAttributes(VAR INT selection, var int increase, var int LP_cost)
{
    var string Attributes;
   
    if (hero.lp >= LP_cost)
{
hero.lp = hero.lp - LP_cost;

Npc_ChangeAttribute (hero, selection, increase);

Attributes = "Lernpunkte:";
        Attributes = ConcatStrings(Attributes, IntToString(hero.LP));
        Attributes = ConcatStrings(Attributes, "Str:");
        Attributes = ConcatStrings(Attributes, IntToString(hero.attribute[ATR_STRENGTH]));
        Attributes = ConcatStrings(Attributes, "Dex:");
        Attributes = ConcatStrings(Attributes, IntToString(hero.attribute[ATR_DEXTERITY]));
        Attributes = ConcatStrings(Attributes, "Mana:");
        Attributes = ConcatStrings(Attributes, IntToString(hero.attribute[ATR_MANA_MAX]));

PrintScreen (Attributes, -1,-1,"font_old_20_white.tga",3);
}
else
{
PrintScreen ("Zu wenig Lernpunkte!", -1,-1,"FONT_OLD_20_WHITE.TGA",2);
B_Say (self, other, "$NOLEARNNOPOINTS");
};
};

...i wkleić przykładowo do pliku "B_InExtremo.d" w "Gothic\_work\DATA\scripts\Content\Story\B". Przy czym gdy mówię "wyciąć" to znaczy "wyciąć" - ta funkcja ma zniknąć z pliku "CharacterHelper.d", gdyż jeżeli ją tylko skopiujesz i wkleisz to przy reparsowaniu plików wyskoczy Ci błąd.

Możesz też nieco zmodyfikować tę funkcję - bo przy nauce u nauczyciela będzie lepiej wyglądać:

func void B_SetHeroAttributes(VAR INT selection, var int increase, var int LP_cost)
{
    var string Attributes;
   
    if (hero.lp >= LP_cost)
{
hero.lp = hero.lp - LP_cost;

Npc_ChangeAttribute (hero, selection, increase);
        PrintScreen ("Twoja moc rośnie!", -1,-1,"FONT_OLD_20_WHITE.TGA",1);
}
else
{
PrintScreen ("Zbyt mało Punktów Nauki!", -1,-1,"FONT_OLD_20_WHITE.TGA",2);
B_Say (self, other, "$NOLEARNNOPOINTS");
};
};

5. Po wszystkim reparsujesz pliki

6. I gotowe! Jeżeli wyciąłeś i przeniosłeś tę funkcję oraz dokonałeś podmianek w dialogach nauczycieli to masz przelicznik punktów nauki za siłę, zręczność i manę powiązany z przelicznikiem określonym w pliku "Story_Globals.d". Możesz też normalnie korzystać z "Character Helpera" gdyż on także "zasysa" funkcje "B_SetHeroAttributes" umieszczoną w folderze "Gothic\_work\DATA\scripts\Content\Story\B" (w moim przypadku w pliku "B_InExtremo.d" w tym folderze).


Autor: Kirgo2 z forum TheModders. Kopiowanie i rozpowszechnianie dozwolone.

15
Spacer / [Gothic I] Problem z przesunięciem startpointa
« dnia: 2024-09-02, 18:20 »
Użyłem opcji szukaj i nie znalazłem rozwiązania, więc prosiłbym o wskazówki.

Chcę przesunąć startpointa w Wolnej Kopalni("FreeMine.zen"). Otwieram Spacera, przesuwam "zCVobstartpoint". Dla pewności przesuwam dodatkowo "ENTRANCE_OLDMINE_SURFACE" (chyba to jest freepoint).

Zapisuję worlda (File->Save Zen), podmieniam i odpalam grę, wchodzę do Wolnej Kopalni - w dalszym ciągu rozpoczynam z tego samego miejsca. Gothic zwyczajnie nie uwzględnił zmian dokonanych w Spacerze. Wchodzę do Spacera, otwieram worlda i zCVobstartpoint jest tam gdzie go przesunąłem.

Dla pewności spróbowałem użyć opcji "compile world" - nic nie dało. Usunąłem "zCVobstartpoint" i utworzyłem nowy "zCVobstartpoint" - też nic. To samo dla pewności zrobiłem z "ENTRANCE_OLDMINE_SURFACE" - kicha.

Dodam tylko, że uprzednio dodałem Spacerem w kopalni Waypointy oraz złoża rudy i wszystko ładnie się pokazuje w grze po zapisaniu worlda (File->Save Zen bez żadnych kompilacji świata, itd.). Uwzględniło nawet przesunięcie "wyjścia z zena". A startpointa jak nie uwzględniało tak nie uwzględnia - nawet po zreparsowaniu plików.

Prosiłbym o pomoc w rozwiązaniu problemu.

16
Garść rzeczy, których się nauczyłem na próbach i błędach. Pisane z perspektywy kogoś kto dopiero się uczy i kto nie miał nigdy do czynienia z techniczną stroną tworzenia moddów do Gothica dla takich samych laików jak sam autor.

Jestem totalnym laikiem, więc jeżeli pojawią się tu informację błędne, bardzo proszę bardziej doświadczonych modderów o sprostowanie.

1. WAYPOINTY zawsze wpisuj w skryptach wielką literą. ZAWSZE.
Waypointy jak wpisujesz ich nazwę w skryptach (np. W "_work\data\scripts\content\story\npc") to pisz zawsze z wielkiej litery. Inaczej postać nie pojawi ci się w świecie. Co najwyżej będziesz mógł ją wtedy przyzwać konsolą i pójdzie do prawidłowego waypointa ale wtedy nie pojawi się automatycznie.


2. Włączasz Gothica - wyłącz Spacera.
Jeżeli z jakiegoś dziwnego powodu Gothic się nie odpala to zobacz czy wyłączyłeś Spacera - z włączonym Spacerem Gothic się nie odpali. Przynajmniej tak jest u mnie.


3. Sterowanie w Spacerze wariuje? Kliknięcie strzałki wprzód wybija nas tysiące lat świetlnych do przodu?
Klikaj niebieski pasek okna ilekroć zacznie się tak dziać - ten pasek na którym jest nazwa spacera, minusik czyli  minimalizacja (-), okienko odpowiadające za zmniejszenie okna i krzyżyk za zamknięcie spacera.
W moim przypadku wygląda to tak, że za każdym razem jak zaczynam się poruszać klikam najpierw ten pasek i tak co jakiś czas. To samo z przedmiotami - zanim zacznę je przesuwać lub obracać, klikam pasek okna, by nie wystrzeliło przedmiotu na orbitę albo by nie zrobiło 30 obrotów za jednym kliknięciem klawisza.
Nie wiem czy u innych jest ten sam problem ze Spacerem ale jeżeli u Ciebie jest to spróbuj tego rozwiązania.


4. Dodawanie nowych twarzy
Jak dodajesz teksturę nowej twarzy do Gothica1 - w sensie, że chcesz dodać do gry całkowicie nową twarz a nie podmienić jakąś istniejącą - to przeglądnij ten post, bo inaczej nie ruszysz:
https://themodders.org/index.php?topic=5376.msg46118#msg46118
Generalnie chodzi o to, że twarze mają numery i musi być zachowana kolejność (jeżeli ostatnia twarz w Gothic1 ma np. numer 231 to jeżeli od razu stworzysz twarz o numerze 233 to nie zadziała). 
Dodatkowo każda twarz musi mieć dodaną swoją wersję 0. Jeżeli chcesz więc dodać wersję 1/2/3 to musisz koniecznie ZAWSZE dodać też wersję 0 - innych wersji nie musisz ale wersja 0 MUSI BYĆ ZAWSZE - nawet jak to będzie wersja fikcyjna, np. kropka zamiast tekstury twarzy 0.


4. Rozdziały a zeny
Rozdział zaczyna się w WORLD.zen a ty dodałeś by wraz z rozpoczęciem tego rozdziału pojawiały się NPC w zenie OLDMINE lub FREEMINE? Mam dla ciebie złą wiadomość - te NPC się nie pojawią.
To samo z rutynami.
Przykład: Chcesz by w III rozdziale w tunelu królowej pełzaczy w Starej Kopalni pojawili się kopacze. Mechanizm uruchamiający ich zespawnowanie musi zostać uruchomiony w Starej Kopalni - np. po rozmowie z Drakiem.


5. Po wczytanym zapisie brama, którą była zamknięta/otwarta sama się otwiera/zamyka choć nie powinna
To nie jest rada stricte modderska w tym sensie, że nie powiem Ci jak sprawić by tak się nie działo tylko co zrobić jeżeli podczas Twojej gry tak się stanie.
Jeżeli wczytałeś save i coś takiego się dzieje, zapisz grę i wczytaj ten jeszcze nowszy save. Brama wówczas powinna znowu podnieść/opuścić swe kraty.


6. Zmiana ceny sprzedaży towarów w Gothic 1. UWAGA: Nigdy w Gothicu 1 NIE USTAWIAĆ multipliera handlu poniżej 0.121
Domyślnie w Gothic 1 cena danego itemu gdy MY go sprzedajemy to połowa tego ile wynosiłaby cena tego itemu gdybyśmy to MY go kupowali. Np. "Miecz sędziego" możemy kupić za 104 bryłki rudy ale gdy będziemy chcieli go sprzedać to dostaniemy już tylko 52 bryłki rudy czyli połowę.
Tę proporcję możemy zmienić ale dla wszystkich itemów w grze będzie obowiązywała jednakowa proporcja. Można tę proporcję zmienić ale JEDYNIE dla WSZYSTKICH itemów - NIE DA SIĘ ustawić OSOBNYCH proporcji dla POSZCZEGÓLNYCH itemów.
Jak zmienić tę proporcję? Po pierwsze trzeba mieć zainstalowany SystemPack. Po drugie odszukać plik "SystemPack.ini" w folderze "Gothic\system". W pliku "SystemPack.ini" odnajdujemy linijkę "TRADE_VALUE_MULTIPLIER" i ustawiamy wartość.
I teraz bardzo ważna rzecz: Nigdy w Gothicu 1 NIE USTAWIAJ "TRADE_VALUE_MULTIPLIER" handlu poniżej "0.121". Dlaczego? Bo ten multiplier dotyczy też wartości handlowej... bryłek rudy czyli środka płatniczego. Jeżeli byś multiplier ustawił przykładowo na 0.1 (czyli na liczbę poniżej "1.21") to podczas handlu kupiec będzie oceniać wartość bryłek rudy GRACZA na 0 - mógłbyś mu wtedy zaproponować milion bryłek rudy a on będzie traktował łączną wartość tej niebotycznej sumy jako zero. Swoje bryłki rudy handlarze oczywiście będzie inaczej - jedna bryłka rudy handlarza będzie dla niego warta 1.
Najniższa wartość jaka mi działała to "0.121". Poniżej tej wartości bryłki rudy GRACZA są bezwartościowe.
Dodam jeszcze jedną uwagę na koniec: Handlarz stosuje przelicznik wyłącznie do danej sztuki danego towaru i nie mnoży go przez ilość towaru. Oznacza to, że jeżeli pojedynczą sztukę danego przedmiotu handlarz zaokrągli do zera, to choćbyśmy mu dali nawet 10 000 sztuk tego przedmiotu, to on przez te 10 000 (a więc przez ilość przedmiotu) nie pomnoży.


7. Chciałbyś ustawić w spacerze dla oCTriggerChangeLevel jakiś ładny "visual", np. "visual:RESURRECTION.PFX"? Nie da się
Silnik Gothica ma niestety swoje ograniczenia/dodatkowy chromosom (niepotrzebne skreślić). Jeżeli więc ustawisz w Spacerze "visual:RESURRECTION.PFX" dla CzejndżLevela, to choćbyś się dwoił i troił to ten oCTriggerChangeLevel z ustawionym wymyślnym visualem nie przeniesie się do Świątyni Orków, czy gdzie byś chciał się przenieść. Rubryka "visual:" tego oCTriggerChangeLevel w Spacerze jeżeli ma działać musi widocznie pozostać pusta.
Jeżeli jednak chcesz by przejście do innego ZEN-a z danego miejsca było "uśpione" i aktywowało się dopiero w późniejszym rozdziale, to możesz w Spacerze użyć tzw. "Mover". Tego movera wstawia się w Spacerze trochę jak zwykłego voba, tylko zamiast zCVob wybierasz:
zCTrigerBase(abstract)->zCTrigger->zCMover
i wtedy go wstawiasz wstawiasz.
Z tym moverem możesz następnie w Spacerze powiązać oCTriggerChangeLevel. W jaki sposób? Skopiuj dowolny istniejący oCTriggerChangeLevel (np. ten przenoszący do OLDMINE.zen) i mając zaznaczony dany mover wklej ten oCTriggerChangeLevel. Efekt? Jak będziesz poruszał "moverem" to jednocześnie będziesz poruszał przyczepionym do niego "oCTriggerChangeLevel"-em. Teraz tylko schowaj tego movera z doczepką pod ziemię i ustaw by wywołany się potem wynurzał.
Żeby było ładnie podczep pod tego movera dodatkowo cVoba z visualem "RESURRECTION.PFX", to będziesz miał także ten migoczący efekt przy miejscu teleportacji. Jak podczepić? Na takiej samej zasadzie jak podczepia się pod movera "oCTriggerChangeLevel".
Na końcu musisz jakoś wywołać tego swojego movera z doczepkami spod ziemi. Musisz wstawić w skryptach coś takiego

Wld_SendTrigger("nazwa_movera");
W zależności od tego w jakim momencie gry ma to zostać wywołane podczep to pod dialog jakiejś postaci (Gothic\_work\DATA\scripts\Content\Story\MISSIONS) lub pod rozdział (Gothic\_work\DATA\scripts\Content\Story\CHAPTERS) i gotowe. Pamiętaj, że silnik Gothica I ma swoje fanaberie, nie całkiem logiczne ograniczenia i dodatkowy chromosom, więc wstawienie nawet tak prostej zdawałoby się rzeczy wymaga cierpliwości i użerania się z czymś co poziomem swojej irracjonalności, złośliwości i nieprzewidywalności przekracza wszystko co jesteście w stanie sobie wyobrazić :) 

W kwestii wstawiania moverów polecam ten film:
https://www.youtube.com/watch?v=M9GEHhKA9xg


8. Jak otworzyć plik MRM?
Tutaj wielkiej filozofii naprawdę nie ma. Wystarczy pobrać Blendera. Ja pobrałem Blender-2.57b. Będziesz potrzebował do tego pluginu Kerrax - to taki niewielki dodatek do Blendera. Kerrax możesz go pobrać choćby stąd: http://gumen.webd.pl/files/KrxImpExp-blender2.57-Apr-18-2011.7z
Blender oraz Kerrax są darmowe i łatwe w obsłudze nawet dla niemal całkowitego nowicjusza takiego jak ja. Jeżeli dasz sobie radę z GoManem to dasz sobie radę także, z dekompilację MRM-ów w Blenderze :)


9. Pamiętaj, że pliki .ZEN możesz otwierać także w notatniku.
W notatniku możesz m.in. sprawdzić na jakim meshu bazuje dany zen - przydatne jeżeli z jakiegoś dziwnego powodu zen nie zasysa tego co zmieniłeś w meshu :)
To jest też bardzo przydatne gdy masowo musisz edytować jakąś grupę przedmiotów. Np. jak dodałeś górnictwo w Gothic 1 i chcesz by z wszystkich żył rudy w grze dało się wydobywać, to łatwiej i szybciej jest to zrobić przy użyciu notatnika niż w samym Spacerze.


10. PAR: Error DoStack. ( line 0 )
U mnie wyglądało to tak, że wszystko ładnie działało, pozmieniałem sobie jakieś rutynki dla NPC-ów i chciałem odpalić Spacera a tu się nie da bo po odpaleniu Spacer wyrzucał komunikat:
PAR: Error DoStack. ( line 0 ) W zSpy ten komunikat wyglądał tak:
PAR: Error DoStack. ( line 0 ) .... <zParser.cpp,#599>W ogóle się nie dało więc odpalić ani Spacera, ani Gothica. W moim przypadku pomogło dopiero usunięcie pliku Gothic.dat. Wtedy wreszcie dało się odpalić Spacera. Potem trzeba było tylko zrobić "Reparse Scriptfiles" w Spacerze i gotowe :)



11. Uciekający NPC w Gothic I. Jak zrobić by przegrywające w walce albo raz pokonane postacie w Gothic I nie uciekały?
Odszukaj folder ZS_Human w Gothic\_work\DATA\scripts\Content\AI. Tam masz kilka plików:
- ZS_AssessEnemy.d
- ZS_Attack.d
- ZS_GotoFight.d
W tych plikach musisz znaleźć elementy odpowiedzialne za ucieczkę i je odpowiednio edytować. Przeszukujesz te dokumenty tekstowe w poszukiwaniu "flee" (po angielsku "uciekać, zmykać").

W pliku "ZS_Attack.d" można ustawić kiedy postać zacznie uciekać odpowiednio dla:
- FAI_HUMAN_COWARD (ucieka już przy 50% HP)
- FAI_HUMAN_Strong (ucieka gdy ma mniej niż 20% MANY)
- FAI_HUMAN_MAGE (ucieka przy 20% HP)
- FAI_HUMAN_RANGED (ucieka przy 1/3 HP)

W pliku "ZS_AssessEnemy.d" znajduje się kod odpowiedzialny za to, że postać wyraźnie od nas słabsza lub postać uprzednio przez nas pokonana będzie przed nami uciekać. Jeżeli chcemy to wyłączyć to wystarczy tu zakomentować linijkę "AI_StartState(self,ZS_Flee,0,"");" znaczkami "///////////".

else if((Npc_IsPlayer(other) && self.aivar[AIV_WASDEFEATEDBYSC]) || (C_AmIWeaker(self,other) && self.npcType != npctype_main))
{
B_CallGuards();
AI_StartState(self,ZS_Flee,0,"");
return;
}


Strony: [1]
Do góry