Na początek spis wszystkiego, czego potrzeba by wprowadzić twego NPCa do gry.
1. Stworzenie plików dialogowych (.dlg) dla twojego NPCa
2. Stworzenie pliku postaci (.cre) twojego obecnego NPCa, wraz z parametrami i ekwipunkiem.
3. (opcjonalne) Stworzenie skryptu (.bcs) dla twojej postaci.
4. Stworzenie kodu instalacji WeiDU (.tp2) by można było zainstalować twojego NPCa na innych komputerach.
1. Pliki .D i .DLG.
Pierwszą rzeczą do zrobienia jest stworzenie pliku .dlg dla twojej postaci. To sprawi, że będzie ona mogła porozmawiać z postacią gracza i przyłączyć się do drużyny. Na początek, stwórz czysty plik .d poprzez utworzenie zwykłego pliku tekstowego oraz przemianowanie go. Nazwę swój plik J#Vondo.d. Pierwszą linijką kodu jaką powinniśmy wpisać jest "Begin J#Vondo"*, co oznacza, że podczas kompilowania powstanie plik zwany "J#Vondo.dlg".
* Pamiętaj, że nie musisz używać prefiksu "J#", to tylko moje nazewnictwo. Wprowadzam to dla wszystkich moich plików by ustrzec je przed zapisaniem na plikach innych ludzi. Twój prefiks może brzmieć TJ, 01 albo y6 lub cokolwiek innego w tym stylu.
Tak więc kod powinien wyglądać tak:
Kod:
BEGIN J#Vondo
Podstawowy dialog powinien mieć dwa stany. Pierwszy to ten, w którym gracz i NPC spotykają się po raz pierwszy, drugi zaś to ten, kiedy gracz już raz odmówił wstępnej propozycji przyłączenia i powrócił. Tutaj podaję jak napisać pierwszy stan...
Kod:
IF ~NumTimesTalkedTo(0)~ FirstMeeting // Jest to znacznik pierwszego stanu. Jeżeli ~Vondo jeszcze nie rozmawiał~ to rozpoczyna się blok zwany "FirstMeeting". //
SAY ~Witaj przyjacielu! Na imię mi Vondo Sprawiedliwy.~ //To jest kwestia Vonda. Następny blok to możliwe odpowiedzi dla jego kwestii. //
IF ~GlobalLT("Chapter","GLOBAL",3)~ THEN REPLY ~Hej Vondo, nie widziałeś gdzieś tutaj czasem Irenicusa?~ GOTO InquireIrenicus
IF ~~ THEN REPLY ~Heja.~ GOTO Greet
+ ~Class(Player1,PALADIN)~ + ~Kiedy widzę paladyna, bez problemu go rozpoznaję!~ + BothPaladins
++ ~Odejdź.~ + GoAway //To są wszystkie możliwe opcje, jakie gracz może wybrać. Pierwsza jest dostępna tylko wtedy, gdy gracz jest w rozdziale 1 lub 2. Opcja 2 i 4 są zawsze dostępne (IF ~~) zaś opcja trzecia jest dostępna kiedy gracz jest Paladynem. //
END //To kończy konkretny blok dialogowy. //
Zauważ jak różnią się kolejne znaki. Pierwsze dwie kwestie używają starych form, zaś dwa kolejne korzystają z skrótowego formatu. Pierwszy + oznacza "IF". Drugi "+" oznacza "THEN REPLY". Trzeci "+" to "GOTO". Takie rozwiązanie oszczędza wiele czasu.
Tak więc nasz plik .d powinien obecnie wyglądać tak:
Kod:
BEGIN J#Vondo
IF ~NumTimesTalkedTo(0)~ FirstMeeting
SAY ~Witaj dobry ! Na imię mi Vondo Sprawiedliwy.~
IF ~GlobalLT("Chapter","GLOBAL",3)~ THEN REPLY ~Hej Vondo, nie widziałeś gdzieś tutaj czasem Irenicusa?~ GOTO InquireIrenicus
IF ~~ THEN REPLY ~Heja.~ GOTO Greet
+ ~Class(Player1,PALADIN)~ + ~Kiedy widzę paladyna, bez problemu go rozpoznaję!~ + BothPaladins
++ ~Odejdź.~ + GoAway
END
Tak więc obecnie musimy stworzyć nowe stany dla których stworzyliśmy wcześniej łącza.
Kod:
IF ~~ THEN BEGIN InquireIrenicus // To jest kwestia w której gracz wybrał spytanie się o Irenicusa. //
SAY ~Nie, jednak mogę ci pomóc w poszukiwaniu go. Jestem paladynem!~ // Odpowiedź Vonda //
++ ~Jasne. Dołącz do drużyny.~ DO ~SetGlobal("VondoJoined","LOCALS",1)
JoinParty()~ EXIT // To ustawi zmienną dla Vonda, która będzie informowała (przydatne jako warunek dla banterów itp.), iż jest on w drużynie. Zaś akcja JoinParty() po prostu sprawia, że przyłącza się do drużyny. EXIT kończy dialog. //
IF ~~ THEN REPLY ~Nie, odejdź.~ EXIT // To kończy dialog, lecz Vondo wciąż będzie w pobliżu. //
END
A teraz pozostałe bloki.
Kod:
IF ~~ THEN BEGIN Greet
SAY ~A więc potrzebujesz w drużynie paladyna?~
IF ~~ THEN REPLY ~Ze względu na nasz fach, owszem.~ DO ~SetGlobal("VondoPrzylaczony","LOCALS",1)
JoinParty()~ EXIT
IF ~~ THEN REPLY ~Nie, odejdź.~ GOTO Odejscie
END
Kod:
IF ~~ THEN BEGIN BothPaladins
SAY ~Inny paladyn! Witaj przyjacielu. Pozwól mi podróżować razem i niszczyć zło.~
IF ~~ THEN REPLY ~Brzmi nieźle.~ DO ~SetGlobal("VondoJoined","LOCALS",1)
JoinParty()~ EXIT
IF ~~ THEN REPLY ~Nie, odejdź.~ GOTO Odejscie
END
IF ~~ THEN BEGIN GoAway *
SAY ~Dobrze, poczekam do dnia kiedy powrócisz, i kiedy będziemy mogli uderzyć na zło!~
IF ~~ THEN EXIT
END
* Blok "GoAway" demonstruje sytuacje, w której gracz po prostu przyciska enter by kontynuować dialog. W tym przypadku następuje zakończenie rozmowy.
Tak więc mamy już wszystko czego nam potrzeba dla stanu, w którym gracz i Vondo spotkali się po raz pierwszy. Teraz musimy stworzyć dialog dla gracza powracającego do rozmowy z NPC'em.
Kod:
IF ~NumTimesTalkedToGT(0)~ THEN BEGIN ReturnDialogue
SAY ~Widzę, przyjacielu, że zdecydowałeś się powrócić.~
IF ~~ THEN REPLY ~Ano, przyłącz się do mojej drużyny.~ DO ~SetGlobal("VondoJoined","LOCALS",1)
JoinParty()~ EXIT
IF ~~ THEN REPLY ~Tak, jednak wciąż nie chcę cię w drużynie.~ GOTO RefusedAgain
END
IF ~~ THEN BEGIN RefusedAgain
SAY ~Ach, znów odmówiłeś. Nie ważne, zajmę się magicznym urządzeniem, jakie nabyłem od pewnego gnoma, który się zwał chyba... John? John Johnson? Czy jakoś tak...~
IF ~~ THEN EXIT
END
I mamy już wstępny dialog NPCa. Następnym, absolutnie koniecznym plikiem jest *P.dlg czyli plik dialogowy odpalany, kiedy chcesz wyrzucić swojego NPCa z drużyny.
O co mi chodzi: Vondo przyłącza się do drużyny (korzystając z J#Vondo.dlg), i automatycznie przydzielane mu są trzy dialogi poprzez różne pliki zasad .2da (Pdialog.2da i Interdia.2da). Kiedy wyrzucasz go z drużyny, uruchamia się *P.dlg i sprawdza pierwszy stan który jest prawdziwy.
Jakoże zaczynamy nowy plik .dlg, potrzebny jest nam wers...
Kod:
BEGIN J#VondoP
Teraz, J#VondoP zostanie dodane do pdialog.2da . Nawiązując do obecnej treści naszego pliku .dlg, kod będzie wyglądał tak:
Kod:
IF ~Global("VondoJoined","LOCALS",1)~ THEN BEGIN KickOut // Jest to zmienna jaka została ustalona kiedy Vondo przyłączał się do drużyny. Jeżeli ma ona wartość 1, oznacza to, że Vondo jest obecnie w drużynie, i dzięki temu zostaje wyrzucony kiedy *P.dlg zostaje uruchomione. //
SAY ~A więc mnie wyrzucasz.~
IF ~~ THEN REPLY ~Ups, chciałem wywalić tą łajzę Anomena, nie ciebie. Przepraszam.~ DO ~JoinParty()~ EXIT // P.dlg automatycznie wyrzuca NPCa przez co jeśli chcemy go rzeczywiście zostawić, musimy ponownie użyć komendy JoinParty().//
IF ~~ THEN REPLY ~Dokładnie, nie chcę cię w drużynie.~ DO ~SetGlobal("VondoJoined","LOCALS",0)~ EXIT // Zmienna "VondoJoined" zostaje ustalona na poziomie 0, co oznacza, że został wyrzucony. //
END
A więc cały blok wyglądać powinien tak.
Kod:
IF ~Global("VondoJoined","LOCALS",1)~ THEN BEGIN KickOut
SAY ~A więc mnie wyrzucasz.~
IF ~~ THEN REPLY ~Ups, chciałem wywalić tą łajzę Anomena, nie ciebie. Przepraszam.~ DO ~JoinParty()~ EXIT
IF ~~ THEN REPLY ~Dokładnie, nie chcę cię w drużynie.~ DO ~SetGlobal("VondoJoined","LOCALS",0)~ EXIT
END
I to wszystko czego potrzebujesz by go wykopać. I teraz, by móc go znów przyłączyć, należy napisać:
Kod:
IF ~Global("VondoJoined","LOCALS",0)~ THEN BEGIN Rejoin
SAY ~Chcesz, bym powrócił?~
IF ~~ THEN REPLY ~Tak Vondo, wracaj do szyku.~ DO ~SetGlobal("VondoJoined","LOCALS",1)
JoinParty()~ EXIT
IF ~~ THEN REPLY ~Nie, nadal cie nie chcę.~ EXIT
END
I to w sumie wszystkie dialogi potrzebne dla NPCa. Reszta to już tylko dodatki. Finałowa wersja twojego pliku .d powinna wyglądać tak...
Kod:
BEGIN J#Vondo
IF ~NumTimesTalkedTo(0)~ FirstMeeting
SAY ~Witaj dobry ! Na imię mi Vondo Sprawiedliwy.~
IF ~GlobalLT("Chapter","GLOBAL",3)~ THEN REPLY ~Hej Vondo, nie widziałeś gdzieś tutaj czasem Irenicusa?~ GOTO InquireIrenicus
IF ~~ THEN REPLY ~Heja.~ GOTO Greet
+ ~Class(Player1,PALADIN)~ + ~Kiedy widzę paladyna, bez problemu go rozpoznaję!~ + BothPaladins
++ ~Odejdź.~ + GoAway
END
IF ~~ THEN BEGIN Greet
SAY ~A więc potrzebujesz w drużynie paladyna?~
IF ~~ THEN REPLY ~Ze względu na nasz fach, owszem.~ DO ~SetGlobal("VondoPrzylaczony","LOCALS",1)
JoinParty()~ EXIT
IF ~~ THEN REPLY ~Nie, odejdź.~ GOTO Odejscie
END
IF ~~ THEN BEGIN BothPaladins
SAY ~Inny paladyn! Witaj przyjacielu. Pozwól mi podróżować razem i niszczyć zło.~
IF ~~ THEN REPLY ~Brzmi nieźle.~ DO ~SetGlobal("VondoJoined","LOCALS",1)
JoinParty()~ EXIT
IF ~~ THEN REPLY ~Nie, odejdź.~ GOTO Odejscie
END
IF ~~ THEN BEGIN GoAway
SAY ~Dobrze, poczekam do dnia kiedy powrócisz, i kiedy będziemy mogli uderzyć na zło!~
IF ~~ THEN EXIT
END
IF ~NumTimesTalkedToGT(0)~ THEN BEGIN ReturnDialogue
SAY ~Widzę, przyjacielu, że zdecydowałeś się powrócić.~
IF ~~ THEN REPLY ~Ano, przyłącz się do mojej drużyny.~ DO ~SetGlobal("VondoJoined","LOCALS",1)
JoinParty()~ EXIT
IF ~~ THEN REPLY ~Tak, jednak wciąż nie chcę cię w drużynie.~ GOTO RefusedAgain
END
IF ~~ THEN BEGIN RefusedAgain
SAY ~Ach, znów odmówiłeś. Nie ważne, zajmę się magicznym urządzeniem, jakie nabyłem od pewnego gnoma, który się zwał chyba... John? John Johnson? Czy jakoś tak...~
IF ~~ THEN EXIT
END
BEGIN J#VondoP
IF ~Global("VondoJoined","LOCALS",1)~ THEN BEGIN KickOut
SAY ~A więc mnie wyrzucasz.~
IF ~~ THEN REPLY ~Ups, chciałem wywalić tą łajzę Anomena, nie ciebie. Przepraszam.~ DO ~JoinParty()~ EXIT
IF ~~ THEN REPLY ~Dokładnie, nie chcę cię w drużynie.~ DO ~SetGlobal("VondoJoined","LOCALS",0)~ EXIT
END
IF ~Global("VondoJoined","LOCALS",0)~ THEN BEGIN Rejoin
SAY ~Chcesz, bym powrócił?~
IF ~~ THEN REPLY ~Tak Vondo, wracaj do szyku.~ DO ~SetGlobal("VondoJoined","LOCALS",1)
JoinParty()~ EXIT
IF ~~ THEN REPLY ~Nie, nadal cie nie chcę.~ EXIT
END
Na pierwszy rzut oka wygląda dosyć trudno, jednak łatwo się do tego można przyzwyczaić.
Gratulacje, właśnie skończyłeś czytać Część I! Reszta jest o wiele krótsza, więc nie ma co się martwić.
2. Tworzenie .CRE.
To dosyć łatwa i przyjemna część. Po prostu zacznij sesję multiplayer (nie musisz mieć dostępu do internetu, wystarczy, że stworzysz grę w sieci LAN z jednym graczem) i stwórz postać. Daj mu co chcesz, doświadczenie, ekwipunek, statystyki i go wyeksportuj.
Zrób ostatnie zmiany w jego pliku .CHR za pomocą Shadow Keepera, DLTCEP lub NearInfinity a później otwórz plik w tym ostatnim. Przewiń na dół do części "Characters", znajdź swoją nową postać i ją otwórz. W menu File wybierz "Convert CHR to CRE".
Kiedy plik już jest w formacie .CRE , możesz mu nadać jego Death Variable (Zmienna śmierci), pliki dialogowe, skrypty i oznaczenia.
Teraz, by zmienić Death Variable (teraz lepiej znaną jako Nazwa Skryptowa - wybaczcie, jestem staroświecki), powinieneś poszukać wartości 0x2e4. A po ludzki, oznacza to gdzieś 2/3 drogi w dół pliku, przynajmniej w NearInfinity. Tak więc będzie to oznaczenie twojego NPCa w grze. Dla przykładu są takie Death Variables jak "Minsc", "Jaheira" czy "Imoen2". Proponuję używać swojego unikalnego prefiksu w tym polu. Tak więc ustalimy DV Vonda jako "j#vondothejust".
Pole to może mieć taką samą nazwę jak twój plik CRE, jednak nie musi. By wykazać to na przykładzie, ustaliliśmy DV jako j#vondothejust, tak więc różnica pomiędzy nazwą pliku a nazwą skryptową jest widoczna.
Obecnie skrypty są nieważne, jednak już teraz lepiej by było, byś oznaczył pole override script jako "J#Vondo". To oznacza, iż kiedy stworzysz skrypt J#Vondo.bcs, zostanie on przyporządkowany do tego pliku .CRE. Powinieneś też wyczyścić resztki po twoim pliku .CHRE (gdzie pewnie znajdują się dplayer3.bcs), i zostawić w nich pustkę. Jednak jeśli chcesz by twój NPC zaczynał dialog kiedy zobaczy gracza, użyj shoudl2.bcs. Jeśli chcesz, by podszedł do gracza i zaczął rozmowę, użyj initdlg.bcs. Jako podstawowy skrypt walki możesz użyć WTASIGHT.bcs lub WTARSGT.bcs dla broni dystansowej. Tak więc powinieneś mieć J#Vondo przyporządkowane dla override, initdlg.bcs poniżej i wtasight lub wtarsght.bcs jeszcze niżej.
Przyporządkowanie dialogu to wartość 0x330, w tym samym miejscu co Nazwa Skryptowa/Death Variable tylko troszkę niżej. Użyj P-kliknięcia na polu, wybierz "Edit as string" i wpisz jako J#Vondo. To oznacza, że kiedy nasz skończony produkt będzie zainstalowany, zaś dialogi skompilowane, J#Vondo.cre będzie od razu używać J#Vondo.dlg.
Na koniec, mała zmiana o której większość zapomina, i może ona być przyczyną wieelu klątw i kurwów-waszów-maciów rzucanych do nieba. Przewiń na górę swojego pliku .cre i znajdź Flags field (Oznaczenia). W świeżo skonwertowanym pliku .cre, oznaczenie "Export allowed" (możliwy eksport) jest wciąż oznaczona. Odznacz. Mogła ona powodować różne niemiłe efekty w skryptach i dialogach, mogących być zastąpione przez te dla multi-playera. A nie chcielibyśmy chyba tego.
No i to wszystko jeśli chodzi o pliki .CRE.
3. Skrypty.
Ten krok jest już w sumie prawie cały wykonany poprzez dodanie do naszego pliku .cre initdlg.bcs.
Kod:
IF
See([PC])
NumTimesTalkedTo(0)
THEN
RESPONSE #100
Dialogue(Nearest([PC]))
END
Jednak możemy użyć skryptów do wprowadzenia twojego NPCa do świata gry, poprzez dodanie kilku linijek do istniejącego skryptu obszaru. Powiedzmy, że chcemy go dodać do Dzielnicy Rządowej. Musimy więc nadpisać trochę plik AR1000.bcs. Tak więc stwórzmy skrypt zwany AR1000.baf który będzie zawierał to co chcemy dodać.
Kod:
IF
Global("J#VondoExists","AR1000",0)
THEN
RESPONSE #100
SetGlobal("J#VondoExists","AR1000",1)
CreateCreature("J#Vondo",[1137.2046],3) // 1137.2046 to koordynaty x.y warunkujące gdzie się pojawi. 3 to kierunek w jaki jest odwrócony. Może on wynosić od 0 (południe) do 15 idąc z ruchem wskazówek zegara.
END
Ta część skryptu zostanie dodana przez nasz instalator, i będzie nadpisana do AR1000.bcs przez WeiDU kiedy będzie trzeba. Przeczytaj ostatnią część, by wiedzieć jak to zrobić.
4. Plik TP2 dla WeiDU.
Plik .tp2 jest kodem instalacyjnym, który zainstaluje twojego NPCa na innym komputerze poprzez kompilację dialogów, skryptów i dodając tekst do ich dialog.tlk oraz przyporządkowaniu nowego tekstu do odpowiednich rzeczy.
ZRÓB:
1) Otwórz główny folder BG2
2) Stwórz folder o nazwie VondoNPC
3) Otwórz ten folder i w środku stwórz folder zwany Backup
4) Skopiuj swoje pliki .CRE, .BAF i .D do folderu VondoNPC
5) Wróc do głównego folderu BG2
6) Skopiuj/wklej tam plik WeiDU.exe i nazwij go VondoNPC-setup.exe
7) W głównym folderze BG2 stwórz plik tekstowy zwany VondoNPC-setup.tp2
OTWÓRZ plik tp2 za pomocą swojego procesora/edytora tekstu i nadal czytaj tutorial by wiedzieć co powinno się tam znaleźć.
Kod:
BACKUP ~VondoNPC\backup~
AUTHOR ~ghreyfain@pocketplane.net~
BEGIN ~Vondo NPC dla BG2:TB~ // Tutaj masz kopiowanie pliku .CRE Vonda oraz nadawanie mu zestawu dźwiękowego. Sprawdź plik sndslot.ids by odsłuchać dźwięki jakie możesz dodać. //
COPY ~VondoNPC\J#Vondo.cre~ ~override\J#Vondo.cre~
SAY NAME1 ~Vondo~
SAY NAME2 ~Vondo~
SAY SELECT_COMMON4 ~Blablabla.~ [Vondo1] // [Vondo1] to nazwa pliku .wav z tym dźwiękiem //
SAY SELECT_COMMON5 ~Daj mi rozkaz.~ [Vondo2]
SAY SELECT_COMMON6 ~Prosto do celu.~ [Vondo3]
SAY SELECT_ACTION1 ~Jestem w pracy.~ [Vondo4]
SAY SELECT_ACTION2 ~Jak sobie życzysz.~ [Vondo5]
COMPILE ~VondoNPC\J#Vondo.d~
COMPILE ~VondoNPC\J#Vondo.baf~ // Ten zaś kompiluje skrypt i wrzuca go do override. Nie mamy jednak obecnie własnego skryptu, więc ta linijka nie jest potrzebna. //
EXTEND_TOP ~Ar1000.bcs~ ~VondoNPC\ar1000.baf~// Z kolei tutaj mamy nadpisanie skryptu AR1000.bcs tym co zapisaliśmy w pliku AR1000.baf //
Po tym, poprzez następujące komendy w .tp2, wprowadzamy dla Vonda kilka linijek do plików .2DA (plik zasad).
Powinienem trochę rozjaśnić co wogóle ten kod oznacza. A więc, plik pdialog.2da to tabela która dołącza do NPCa poszczególne skrypty i dialogi.
Pierwszy wyraz to nazwa skryptowa (Death Variable) naszej postaci, w tym przypadku j#vondothejust.
Następny to plik dialogowy w którym zawarte jest wyrzucenie postaci z drużyny.
"J" oznacza plik jako interakcje i dialogi odbywające się gdy postać znajduje się w drużynie, takie chociażby jak flirty czy rozmowy zainicjowane przez gracza.
J#VondoD to plik skryptów snu. Działa jak normaln skrypt, lecz bazowo dodaje do każdej akcji warunek "gracz właśnie wcisnął przycisk Odpoczynku" do każdego bloku warunkowego.
Kolejne cztery pola to po prostu odpowiedniki dialogów dla Tronu Bhaala. Zalecane jest dodanie ich nawet jeżeli postać nie posiada żadnych dialogów dla dodatku - nie zaszkodzi.
Komenda UNLESS dla WeiDU mówi programowi by nadpisywał tekst jeśli J#Vondothejust nie zostało już wcześniej wpisane do pliku.
Interdia.2da jest trochę łatwiejszy, jednak działa na takiej samej zasadzie co pdialog.2da. Dodaje postaci pliki banterów, które wykorzystywane są w rozmowach między postaciami i romansach.
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Nie możesz ściągać załączników na tym forum