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
RkBlog main page Search RSS Contact