Siema.Jako,że miałem problemy z tutorialem Ficusia,który również stworzył tutorial o handlu z npc(dużo błędów mi dziwnych wyskakiwało)postanowiłem się trochę pomęczyć i udało mi się znaleźć sposób rozwiązania problemu.Dlatego napiszę,jak ja to zrobiłem,a co się później stanie z tym tutorialem,to już zależy od adminów/moderatorów.
Zacznijmy od prostej rzeczy,jaką jest stworzenie skryptu postaci.Tego raczej nie muszę wyjaśniać,ponieważ wystarczy ściągnąć sobie program NSCriptGenerator i w nim stworzymy sobie postać(program ogólnie niemiecki,ale bardzo prosty w obsłudze).Swoją postać nazwałem Kupiec(jedyną funkcją jaką pełni jest sprzedaż przedmiotów,dlatego nie bawiłem się w wymyślenie dla niego jakieś lepszej nazwy/dialogów).Dla ułatwienia podam skrypty dialogu+postaci i odpowiednie wpisy.
1)Skrypt Kupca:
// -----------------------------------
// This script file was created with NSC Script Generator 2.2 by Mirage Game Development
// Mirage Game Development - copyright 2005
// File: NONE_305_Kupiec
// -----------------------------------
instance NONE_305_Kupiec (Npc_Default)
{
// ------ NSC ------
name = "Kupiec";
guild = GIL_NONE;
id = 305;
voice = 10;
npctype = NPCTYPE_MAIN;
// ------ AIVARs ------
aivar[AIV_IgnoresArmor] = TRUE;
// ------ Attributes ------
B_SetAttributesToChapter(self, 1);
// ------ NSC relevant talents ------
B_GiveNpcTalents (self);
// ------ Fight tactic ------
fight_tactic = FAI_HUMAN_NORMAL;
// ------ Equipted weapons ------
EquipItem (self, ItMw_1h_Vlk_Sword);
// ------ Inventory ------
B_CreateAmbientInv (self);
// ------ Visuals ------
B_SetNpcVisual (self, MALE, "Hum_Head_Thief", Face_N_YBerion, BodyTex_N, ITAR_Leather_L);
Mdl_SetModelFatness (self, 0);
Mdl_ApplyOverlayMds (self, "Humans_Relaxed.mds");
// ------ Fight skills ------
B_SetFightSkills (self, 0);
// ------ Announce DR ------
daily_routine = Rtn_START_30006;
};
FUNC VOID Rtn_START_30006()
{
TA_Stand_ArmsCrossed(08,00,16,00,"NW_XARDAS_START");
TA_Stand_Guarding(16,00,00,00,"NW_XARDAS_START");
TA_Practice_Sword(00,00,08,00,"NW_XARDAS_START");
};
2)Gdy mamy już gotowy skrypt postaci i ją zapisaliśmy przechodzimy do utworzenia dialogu(polecam program Bucika Easy Dialog Maker).Skrypt dialogu:
// *Script was make in Easy Dialog Maker (EDM)
//========================================
//-----------------> OPCJA *KONIEC*
//========================================
INSTANCE DIA_Kupiec_EXIT(C_INFO)
{
npc = NONE_305_Kupiec;
nr = 999;
condition = DIA_Kupiec_EXIT_Condition;
information = DIA_Kupiec_EXIT_Info;
permanent = TRUE;
description = "KONIEC";
};
FUNC INT DIA_Kupiec_EXIT_Condition()
{
return TRUE;
};
FUNC VOID DIA_Kupiec_EXIT_Info()
{
AI_StopProcessInfos (self);
};
//========================================
//-----------------> HELLO1
//========================================
INSTANCE DIA_Kupiec_HELLO1 (C_INFO)
{
npc = NONE_305_Kupiec;
nr = 1;
condition = DIA_Kupiec_HELLO1_Condition;
information = DIA_Kupiec_HELLO1_Info;
permanent = TRUE;
trade = TRUE;
description = "Pokaż mi co masz na sprzedaż.";
};
FUNC INT DIA_Kupiec_HELLO1_Condition()
{
return TRUE;
};
FUNC VOID DIA_Kupiec_HELLO1_Info()
{
B_GiveTradeInv (self);
AI_Output (other, self ,"DIA_Kupiec_HELLO1_15_01"); //Pokaż mi co masz na sprzedaż.
AI_Output (self, other ,"DIA_Kupiec_HELLO1_03_02"); //Wybierz coś.
};
W tym skrypcie najważniejsze są trzy linijki,a dokładnie
permanent = TRUE;
trade = TRUE;
B_GiveTradeInv (self);
pernament = TRUE oznacza,że opcję handlu będziemy mogli wybierać cały czas.
trade = TRUE oznacza,że postać ma możliwość handlu.
B_GiveTradeInv (self); natomiast oznacza,że po tym dialogu zacznie się handel.
3)No więc mamy już stworzoną postać i dialog kupca,jednocześnie możemy już z nią handlować.No właśnie,tylko czym ma ona handlować?Więc musimy stworzyć kilka nowych linijek w pliku B_GiveTradeInv, który znajduje się w moim wypadku w:
D:\Gothic II\_Work\data\Scripts\Content\Story\B_GiveTradeInv
Najlepiej skopiować jakąś linijkę od innego npc'a,który również ma handel(np.Zurisa)i zmienić na naszą nazwę(lub ewentualnie przerobić mój skrypt^^).No to zaczynamy od pliku B_GiveTradeInv.Pierwszy wpis powinien znaleźć się na samym dole zakładki:
//******************************************************************
// Hier muss jeder Händler eingetragen werden!!!!!!!
//******************************************************************
ale polecałbym,żeby dodać go pod ostatnią postacią,która jest w zakładce:
// GOTHIC2
Wpis powinien wyglądać tak:
var C_NPC Trd_Kupiec; Trd_Kupiec = Hlp_GetNpc (NONE_305_Kupiec);
Zamiast np.Trd_Kupiec wpisujemy swoją nazwę postaci,np.Alfred,a po Hlp_GetNpc w nawiasie wpisujemy instance naszej postaci.
Zjeżdzamy niżej i mamy następną zakładkę,przy której postępujemy tak samo jak w poprzedniej,tyle,że ma być inny wpis:
if Hlp_GetInstanceID (slf) == Hlp_GetInstanceID (Trd_Kupiec) {B_ClearJunkTradeInv (slf); B_GiveTradeInv_Kupiec (slf);};
Tutaj zmieniamy tylko (Trd_Kupiec)i B_GiveTradeInv_Kupiec na (Trd_Alfred)oraz B_GiveTradeInv_Alfred.Czas na ostatnią linijkę w skrypcie,czyli następna zakładka:
////////////////////////////////////////////////////////////////////////////////////////////////////
// Handelsware Clearen und Ambientstuff in die Tasche, wenn Trader Unconscious oder Dead
////////////////////////////////////////////////////////////////////////////////////////////////////
Jest odpowiedzialna za usunięcie przedmiotów do kupienia w wypadku śmierci sprzedawcy.
if Hlp_GetInstanceID (slf) == Hlp_GetInstanceID (Trd_Kupiec) {B_ClearDeadTrader (slf);};
Tutaj zmieniamy tylko (Trd_Kupiec)na (Trd_Alfred).Zapisujemy zmiany i jeszcze tylko jedna rzecz,którą musimy zrobić,by wszystko działało jak należy,czyli utworzenie skryptu handlu danego sprzedawcy(polecam skopiować mój skrypt,który podam i ewentualnie pozmieniać nazwy postaci+zmiennych i przedmioty do kupienia).A więc tworzymy skrypt o nazwie:
B_GiveTradeInv_Alfred
Musi być nazwa postaci sprzedawcy!!Po utworzeniu wklejamy poniższy skrypt do utworzonego właśnie pliku i zmieniamy to co nas interesuje:
FUNC VOID B_GiveTradeInv_Alfred (var C_NPC slf)
{
if ((Kapitel >= 1)
&& (Alfred_ItemsGiven_Chapter_1 == FALSE))
{
CreateInvItems (slf, ItMi_Gold, 100);
CreateInvItems (slf,ItPo_Mana_01 ,10);
CreateInvItems (slf,ItPo_Health_01 ,10);
CreateInvItems (slf,itfo_wodka ,10);
Alfred_ItemsGiven_Chapter_1 = TRUE;
};
if ((Kapitel >= 2)
&& (Alfred_ItemsGiven_Chapter_2 == FALSE)
{
CreateInvItems (slf, ItMi_Gold, 60);
CreateInvItems (slf,ItPo_Mana_01 ,15);
CreateInvItems (slf,ItPo_Mana_02 , 1);
CreateInvItems (slf,ItPo_Health_01 ,15);
CreateInvItems (slf,ItPo_Health_02 , 2);
Alfred_ItemsGiven_Chapter_2 = TRUE;
};
};
No i krótkie wyjaśnienie warunków.
if ((Kapitel >= 1)
Oznacza,jeśli rozdział jest większy,bądź równy
&& (Alfred_ItemsGiven_Chapter_1 == FALSE))
Natomiast to oznacza,że jeśli warunek if został spełniony I zmienna Alfred_ItemsGiven_Chapter_1 ma wartość FALSE to zostanie aktywowana funkcja handlu.Aha,wcześniej musimy tą zmienną zadeklarować w pliku story_globals.d czyli dopisujemy gdzieś na samym dole:
var int Alfred_ItemsGiven_Chapter_1;
Tak samo robimy do drugiego rozdziału,tylko zmieniamy
Alfred_ItemsGiven_Chapter_1 na Alfred_ItemsGiven_Chapter_2
No i to wszystko.Pisałem dość długo ten tutorial,więc jeśli ktoś czegoś nie będzie rozumiał,to niech napisze,a ja spróbuję mu wyjaśnić.Ewentualnie niech poczeka,aż uporam się z problemem dźwięku w CamStudio,to wtedy nakręce wideotutoriala.To tyle.
Pozdrawiam.