RkBlog

Hardware, programming and astronomy tutorials and reviews.

Banter - Pogaduszki

Powiedzmy 偶e chcemy doda膰 tak膮 oto pogaduszk臋 (banter) mi臋dzy dwoma NPC:
BLUE: Ahg! Co ja tu robi臋?
JAN: We藕 rzep臋, na pewno ci pomo偶e. To samo spotka艂o mojego wuja od strony ciotki Petuni 2 lata temu
BLUE: CO?! Tylko nie m贸wcie 偶e mam z nim teraz gada膰.... dajcie mu zdanie z 4 wyraz贸w!
JAN: O czym ty teraz znowu m贸wisz?
BLUE: AGGGHHHHH! Chyba oszalej臋!
Zanim przejdziemy do implementacji tej pogaduchy przyj偶yjmy si臋 plikom dialog贸w danego NPC, a jest ich kilka. Zazwyczaj mam taki zestaw, bior膮c posta膰 "BLUE" jako przyk艂ad:
- BLUE.DLG - standardowy dialog (przy艂膮czanie, rozmawianie z CRE nie b臋d膮cym w dru偶ynie)
- BLUEP.DLG - dialogi od艂膮czania i ponownego przy艂膮czania (mniejwi臋cej)
- BLUEJ.DLG - dialogi interakcji
- BBLUE.DLG - dialogi rozm贸wek mi臋dzy NPC (tzw. Banter)
Standardowo przy prostnym NPC mamy pierwsze dwa pliki dlg. Teraz zajmiemy si臋 dodaniem pliku BXXX.dlg odpowiedzialnego za pogaduchy mi臋dzy NPC. W notatniku tworzymy plik o nazwie BBLUE.D (trzymamy si臋 przyk艂adu. Chodzi o B[nazwa naszego CRE].d), a w nim piszemy:
BEGIN ~BBLUE~
CHAIN
IF ~InParty("Jan")
See("Jan")
!StateCheck("Jan",STATE_SLEEPING)
Global("JanBlueTalk","LOCALS",0)~ THEN BBLUE ProblemBlue
~Ahg! Co ja tu robi臋?.~
DO ~SetGlobal("JanBlueTalk","LOCALS",1)~
== BJAN
~We藕 rzep臋, na pewno ci pomo偶e. To samo spotka艂o mojego wuja od strony ciotki Petuni 2 lata temu~
== BBLUE
~CO?! Tylko nie m贸wcie 偶e mam z nim teraz gada膰.... dajcie mu zdanie z 4 wyraz贸w!~
== BJAN
~O czym ty teraz znowu m贸wisz?~
== BBLUE
~AGGGHHHHH! Chyba oszalej臋!~
EXIT
A teraz z komentarzem:
BEGIN ~BBLUE~ // Zaczynamy plik banter-pogaduszek dla naszego NPC
CHAIN // Rozpoczynamy 艂a艅cuchowy dialog mi臋dzy NPC
IF ~InParty("Jan") // Sprawdzamy czy jan (wpisujemy warto艣膰 "death variable" danego CRE, co mo偶na zobaczy膰 np. w NI)
See("Jan") // czy widzi dan膮 posta膰
!StateCheck("Jan",STATE_SLEEPING) // czy ta posta膰 nie 艣pi
Global("JanBlueTalk","LOCALS",0)~ THEN BBLUE ProblemBlue // Je偶eli jeszcze tego nie gada艂 to ma powiedzie膰
~Ahg! Co ja tu robi臋?.~
DO ~SetGlobal("JanBlueTalk","LOCALS",1)~ // Oznaczenie warunku 偶e rozmowa mia艂a miejsce
== BJAN // Odwo艂anie si臋 do Bjan.dlg zawieraj膮cego pogaduszki jana
~We藕 rzep臋, na pewno ci pomo偶e. To samo spotka艂o mojego wuja od strony ciotki Petuni 2 lata temu~
== BBLUE
~CO?! Tylko nie m贸wcie 偶e mam z nim teraz gada膰.... dajcie mu zdanie z 4 wyraz贸w!~
== BJAN
~O czym ty teraz znowu m贸wisz?~
== BBLUE
~AGGGHHHHH! Chyba oszalej臋!~
EXIT
// koniec pogadanki
Czasami mamy ma艂e dialogi lub chcemy doda膰 kilka dialog贸w mi臋dzy r贸偶nymi NPC. Wtedy korzystamy z opcji APPEND. Przyk艂ad rozmowy:
HAER'DALIS: Blue, tw贸j ty艂eczek jest taki kusz膮cy, ale musz臋 szczerze powiedzie膰 偶e m贸j rz膮dzi!
BLUE: Jasne... oczywi艣cie... musz臋 si臋 st膮d jako艣 wydosta膰!
Naszym zadanie b臋dzie Dodanie, czyli APPEND tej pogadanki do istniej膮cego pliku BXXX.DLG. Pogadank臋 t膮 zaczyna Haerdalis wi臋c plik taki istnieje. Patrz膮c na jego plik CRE w NI zauwa偶ymy 偶e jego plik pogadanek nazywa si臋 BHAERDA.DLG a wi臋c:
APPEND BHAERDA
IF ~InParty("Blue")
See("Blue")
!StateCheck("Blue",STATE_SLEEPING)
Global("BlueButt","LOCALS",0)~ THEN BEGIN Otylku
SAY ~Blue, tw贸j ty艂eczek jest taki kusz膮cy, ale musz臋 szczerze powiedzie膰 偶e m贸j rz膮dzi!~
IF ~~ THEN DO ~SetGlobal("BlueButt","LOCALS",1)~ EXTERN Otylku
END
END

APPEND BBLUE
IF ~~ THEN BEGIN Otylku
SAY ~Jasne... oczywi艣cie... musz臋 si臋 st膮d jako艣 wydosta膰!~
IF ~~ THEN EXIT
END
END
W pierwszej partii sprawdzamy warunki oraz inicjujemy rozmowe. "Otylku" to etykieta rozmowy. Dla danej rozmowy nadajemy jedn膮 etykiet臋, kt贸ra umo偶liwi grze odszukanie odpowiedniego dialogi danego NPC dla danej rozmowy (w naszym przypadku b臋dzie szuka艂a w pliku BBlue.dlg dialogu z etykiet膮 "Otylku"). Nast臋pna wa偶na sprawa to zmienna "Global("BlueButt","LOCALS",0)" BlueButt to nazwa wymy艣lona przez nas i oznacza zmienn膮. Je偶eli nie jest w艂膮czona (warto艣膰 0) to dialog si臋 zacznie... gdy si臋 zaczyna ustawiamy jej warto艣膰 na 1 (SetGlobal("BlueButt","LOCALS",1)) co uniemo偶liwi powt贸rzenie si臋 dialogu, gdy偶 wyra偶enie "Global("BlueButt","LOCALS",0)~ THEN BEGIN Otylku" oznacza: "Je偶eli zmienna BlueButt ma warto艣膰 0 wtedy rozpocznij banter Otylku".

A teraz zr贸bmy ma艂e utrudnienie. Za艂u偶my 偶e chcemy do艂o偶y膰 dialog Viconii do tej pogadanki o ty艂kach :) APPEND BBLUE zmieniamy nast臋puj膮co:
APPEND BBLUE
IF ~~ THEN BEGIN Otylku
SAY ~Jasne... oczywi艣cie... musz臋 si臋 st膮d jako艣 wydosta膰!~
IF ~IsValidForPartyDialog("Viconia")~ THEN EXTERN BVICONI Vicdupa
IF ~!IsValidForPartyDialog("Viconia")~ THEN EXIT
END
END

APPEND BVICONI
IF ~~ THEN BEGIN Vicdupa
SAY ~Bezmy艣lni naziemcy... Drowy jako rasa nadrz臋dna maj膮 najlepsze zadki!.~
IF ~~ THEN EXIT
END
END
A teraz trening i 偶ywy przyk艂ad dla was.... Dodajmy troch臋 banter贸w do NPC z Biblioteki. Mamy: Clariss臋, Lothorien, Minualkira i Vaxora. Oto dialog jaki im zrobi臋:

C: Masz mo偶e troch臋 Kwasowych Be艂kotaczy ze sob膮 Vaxorze?
V: Sko艅czy艂y mi si臋 niedawno... musia艂em zakwasi膰 pewnego Skraga, je偶eli wiesz co mam na my艣li... potrzebujesz ich do strza艂?
C: Tak... chcia艂am zrobi膰 kilka podprzestrzennych kwasowych strza艂 dezintegracji...
M: Chyba b臋d臋 m贸g艂 ci pom贸c w pewnym sensie, wydaje mi si臋 偶e z臋by Wrzaskun贸w, kt贸re tutaj mam mog膮 zosta膰 wykorzystane w tym celu
C: Z臋by Wrzaskun贸w? Tak, pami臋tam tak膮 inkantacj臋 z kt贸rych mog臋 zrobi膰 strza艂y o podobnym dzia艂aniu. Czy mog臋 zobacz膰 te z臋by?
M: Ale偶 oczywi艣cie... tylko jest jeden problem... s膮 z lekka zamro偶one...
C: Jak mog膮 by膰 zamro偶one przy 293 stopniach Kelwina? Tylko nie m贸w 偶e bawi艂e艣 si臋 dzik膮 magi膮...
M: Chcia艂em tylko wywo艂a膰 komet臋, nic wielkiego... oto z臋by, ale ta bry艂ka lodu jest do艣膰 oporna.
C: Co to za cholerny l贸d.... l贸d +5 ?
L: Mo偶e m贸j miecz rozwi膮偶e ten problem?
C: Mo偶na spr贸bowa膰....

No to jedziemy. Jako 偶e dialog zaczyna Clarissa, tworzymy B0clar.d (normalny dialog to 0clar.d) i piszemy (deatch variable ka偶dego z NPC jest taka sama jak nazwa ich pliku CRE):
BEGIN ~B0clar~
CHAIN
IF ~InParty("0loth")
InParty("0minua")
InParty("0vaxor")
See("0loth")
See("0minua")
See("0vaxor")
!StateCheck("0loth",STATE_SLEEPING)
!StateCheck("0minua",STATE_SLEEPING)
!StateCheck("0vaxor",STATE_SLEEPING)
Global("rikigada","LOCALS",0)~ THEN B0clar strzaly
~Masz mo偶e troch臋 Kwasowych Be艂kotaczy ze sob膮 Vaxorze?.~
DO ~SetGlobal("rikigada","LOCALS",1)~
== B0vaxor
~Sko艅czy艂y mi si臋 niedawno... musia艂em zakwasi膰 pewnego Skraga, je偶eli wiesz co mam na my艣li... potrzebujesz ich do strza艂?~
== B0clar
~Tak... chcia艂am zrobi膰 kilka podprzestrzennych kwasowych strza艂 dezintegracji...~
== B0minua
~Chyba b臋d臋 m贸g艂 ci pom贸c w pewnym sensie, wydaje mi si臋 偶e z臋by Wrzaskun贸w, kt贸re tutaj mam mog膮 zosta膰 wykorzystane w tym celu.~
== B0clar
~Z臋by Wrzaskun贸w? Tak, pami臋tam tak膮 inkantacj臋 z kt贸rych mog臋 zrobi膰 strza艂y o podobnym dzia艂aniu. Czy mog臋 zobacz膰 te z臋by?~
== B0minua
~Ale偶 oczywi艣cie... tylko jest jeden problem... s膮 z lekka zamro偶one...~
== B0clar
~Jak mog膮 by膰 zamro偶one przy 293,57 stopniach Kelwina? Tylko nie m贸w 偶e bawi艂e艣 si臋 dzik膮 magi膮...~
== B0minua
~Chcia艂em tylko wywo艂a膰 komet臋, nic wielkiego... oto z臋by, ale ta bry艂ka lodu jest do艣膰 oporna~
== B0clar
~Co to za cholerny l贸d.... l贸d +5 ?~
== B0loth
~Mo偶e m贸j miecz rozwi膮偶e ten problem?~
== B0clar
~Mo偶na spr贸bowa膰....~
EXIT
Jak sprawdzi膰 czy to dzia艂a? 1. Je偶eli si臋 zainstaluje to powinno dzia艂a膰, 2. W grze tego "natychmiast" nie wywo艂amy.... trzeba troch臋 pogra膰 z nimi by co艣 si臋 pojawi艂o
RkBlog

Modowanie Silnika Infinity, 14 July 2008, Piotr Mali艅ski

Comment article