Poprzedni temat «» Następny temat
[TUTORIAL] Pisanie ścieżek romansowych/przyjacielskich w BG2
Autor Wiadomość
Lava Del'Vortel 
Avatar Sune
Łasiczy Szperacz


Wiek: 27
Posty: 2998
Podziękowania: 180/58
Wysłany: 2009-08-09, 23:37   [TUTORIAL] Pisanie ścieżek romansowych/przyjacielskich w BG2

Pisanie ścieżek romansowych i przyjacielskich w BG2 v.2 by Lava Del'Vortel

UWAGA: tutorial zawiera treści występujące w tutorialu L'fa. Obydwa te tutoriale dotyczą tworzenia dialogów i tych treści nie mogłem pominąć, wato jednak wspomnieć, że w poradniku L'fa są dokładniej wyjaśnione wszystkie szczegóły pisania dialogów. Mój tutorial zakłada, że podstawy te są znane, tak więc by nauczyć się tworzenia skryptów dialogowych od podszewki, zapraszam do lektury kolegi moddera. Link do jego tutorialu znajduje się w punktach II i VI tego tutorialu.

I. Wstęp

Romanse i ścieżki przyjaźni to spotykane nawet w samej oryginalnej grze łańcuchy rozmów, dzięki którym główna postać oraz konkretny NPC mają szansę poznać się bliżej. Technicznie wygląda to dokładnie tak samo. Są to bloki skryptów "match", timerów, zmiennych oraz skryptów wywołujących rozmowę w konkretnej sytuacji.

By w ogóle rozpocząć zajmowanie się tym tematem potrzebujemy samego NPC dla którego będziemy pisać takie dialogi. Na początku warto się skupić na szerszym koncepcie ścieżki romansu czy przyjaźni. Należy dokładnie przemyśleć charakter postaci, jej historię, temperament. Musimy pamiętać by nasz NPC nie stał się zbyt idealny. Trzeba stworzyć całościowy obraz zawierający zarówno zalety i wady. Dobrym pomysłem będzie ogólnikowe rozpisanie sobie w formie równoważników zdań tematy rozmów. Dopiero po tych wstępnych czynnościach należy przejść do samego pisania dialogów.

II. Dialogi

Oczywiste jest, że dialogi to podstawa romansu/przyjaźni. To w nich znajduje się cała treść. Należy pamiętać, by dialogi te odwzorowywały charakter postaci. Mile widziane są także sytuacje jak przemiany wewnętrzne. Jest to zauważalne przy oryginalnych romansach w BG2 - Aerie stająca się silniejsza, Viconia i jej zmiana charakteru. To pokazuje, że postać gracza ma wpływ na inne zdarzenia gry i na zachowanie postaci "pół-sterowalnych".
Dialogi te wyglądają dokładnie tak samo jak te u postaci nieprzyłączalnych. Teraz zaprezentuje przykład małego dialogu romansowego. Tutaj *jeszcze* będzie to wersja bez akcji i warunków. (By dowiedzieć się więcej o teorii skryptu dialogowego zapraszam do tutorialu L'fa) Jak znacie już swoje zmienne to można pisać dialog od razu z warunkami i akcjami tak jak w punkcie IV tutorialu. Osobiście pierw piszę dialogi "in blanco", dopiero później dodaje warunki i akcje. Tak więc wygląda "suchy" dialog:

Kod:


IF~~THEN BEGIN Lava01x00
SAY ~Tęsknię czasami za swoim domem i zapachem ciastek robionych przez moją babcię - Aurelię. Pamiętam jak byłem dzieckiem i przy wchodzeniu do naszego domu witał mnie słodki zapach ciasta, orzechów i miodu. Wtedy babcia robiła Kakao, ja zapraszałem Ariennę - moją przyjaciółkę - i wspólnie jedliśmy ciastka, a babcia opowiadała nam historię jak poznała mojego dziadka.~
IF~~THEN REPLY ~Widać, że tęsknisz za spokojniejszymi czasami, Lavo. Mylę się?~ GOTO Lava01x01
IF~~THEN REPLY ~Tak, tak. Wtedy przyszły krasnale, zgwałciły wszystkich i urządziły zabawę w wiosce. Zamknij się i skup się na walce, Lavo.~ GOTO Lava01x02
IF~~THEN REPLY ~Nie podoba ci się wędrowanie ze mną?~ GOTO Lava01x03
END

IF~~THEN BEGIN Lava01x01
SAY ~Czasami. Nie zmieniłbym swojego obecnego życia, lubię wędrować, pomagać innym czy spędzać wieczory w tawernach. Tam zawsze jest z kim porozmawiać. Przeszłość nie wróci, jednak niekiedy wracają wspomnienia tamtych dni. Dni gdy nie trzeba było walczyć o życie, spierać się z wampirami czy handlować ze złodziejami.~
IF~~THEN GOTO Lava01x04
END

IF~~THEN BEGIN Lava01x03
SAY ~Ależ oczywiście, że nie! To nie chodzi o to. Po prostu tęsknię za czymś co dawno odeszło. Za dniami niewinnymi, zabawami drewnianymi mieczami, zajmowaniem się kotem i objadanie łakociami. Zmieniłem się, lubię wędrować, odpowiada mi twoje towarzystwo, lecz mimo wszystko... te wspomnienia czasami wracają...~
IF~~THEN GOTO Lava01x04
END

IF~~THEN BEGIN Lava01x04
SAY ~Gdy się spotkaliśmy po raz pierwszy padło imię Imoen. Czy to twoja przyjaciółka? Ukochana?~
=
~Jestem po prostu ciekaw czy jest to osoba która była obecna w twoim życiu od dawna. Czy gdy w twojej głowie pojawiają się obrazy przeszłości, dzieciństwa, czasów bez walki to czy Imoen pojawia się w twych myślach?~
IF~~THEN REPLY ~Nie znasz mnie, Lavo. Walczę od zawszę. Nie pamiętam czasów spokojnych.~ GOTO Lava01x05
IF~~THEN REPLY ~Tak. Imoen jest dla mnie jak siostra. To z nią się bawiłem. Jest dla mnie całą rodziną.~ GOTO Lava01x06
IF~~THEN REPLY ~To nie twoja sprawa!~ GOTO Lava01x02
END

IF~~THEN BEGIN Lava01x05
SAY ~W takim razie twoje życie musiało być niezwykle smutne. Bez zabaw, przyjaciół, nieustająca walka. Jednak mówisz, że nie pamiętasz czasów spokojnych... Że nie możesz ich sobie przypomnieć to nie oznacza, że ich w ogóle nie było... Mam nadzieję, że takie mimo wszystko istniały.~
=
~Teraz ruszajmy. Porozmawiamy później.~
IF~~THEN DO ~~ EXIT
END

IF~~THEN BEGIN Lava01x06
SAY ~Rozumiem i tym bardziej pragnę ci pomóc z uratowaniem Imoen. Widzę ją jako część twoich wspomnień, a więc i część ciebie. Irenicus nie ma prawa zabierać ci częścią twojego życia. Tak po prostu nie powinno być.~
=
~Teraz ruszajmy. Jeżeli chcemy uratować Imoen to musimy działać.~
IF~~THEN DO ~~ EXIT
END

IF~~THEN BEGIN Lava01x02
SAY ~Nie bądź bezczelny. Jak nie chcesz ze mną rozmawiać, to można to powiedzieć odrobinę inaczej.~
IF~~THEN DO ~~ EXIT
END



Tak wygląda czysty dialog bez warunków czy akcji. Tutaj druga mała rozmowa (będąca włąściwie opisem, a nie rozmową).

Kod:


IF~~THEN BEGIN Lava02x00
SAY ~(W trakcie wędrówki zauważasz Lavę zerkającego na twoją osobę. Jego mało dyskretne spojrzenia są łatwo zauważalne przez inne osoby. Zdaje się jakby chciał ci coś powiedzieć.)~
=
~(Przez pewien moment patrzy się na ciebie, zdaje się, że chce podejść, lecz jednak decyduje by po prostu kontynuować wędrówkę.)~
=
~(Nie pozostaje ci nic innego jak po prostu ruszać dalej.)~
IF~~THEN DO ~~ EXIT
END



W ten sposób wyglądają rozmowy romansowe/przyjacielskie. Następnym krokiem będzie zbudowanie skryptów które będą wywoływać dialogi.

III. Skrypty

By dialogi odpowiednio działały potrzebne będzie kilka bloków skryptów. Potrzebujemy ustalić co jaki czas dialogi mają się odpalać w grze, stworzyć odpowiednie zmienne. Przy romansach zawsze występuje coś takiego jak "Romance Match" czyli sprawdzenie czy postać gracza nadaje się do rozmów. Może to wystąpić także w ścieżkach przyjaźni jeżeli taka też ma mieć wymagania.
Oto przykładowy skrypt sprawdzający:

Kod:


IF
InParty(Myself)
Global("LavaMatch","GLOBAL",0)
Global("LavaRomanceActive","GLOBAL",0)
Global("LavaLoveTalk","LOCALS",0)
Gender(Player1,MALE)
OR(2)
Race(Player1,ELF)
Race(Player1,HUMAN)
THEN
RESPONSE #100
SetGlobal("LavaRomanceActive","GLOBAL",1)
SetGlobal("LavaMatch","GLOBAL",1)
SetGlobal("LavaLoveTalk","LOCALS",1)
END



Tak więc jeżeli Player1 (postać gracza) jest mężczyzną rasy ludzkiej lub elfów, match, aktywność romansu i LoveTalk zostaną przestawione z 0 na 1.
Teraz dalsze bloki uaktywniające rozmowy i ustawiające timery będą wyglądały tak:

Kod:


//Fire Talk

IF
!AreaType(Dungeon)
CombatCounter(0)
InParty(Myself)
See(Player1)
RealGlobalTimerExpired("LavaLoveTalkTime","GLOBAL")
OR(2)
Global("LavaRomanceActive","GLOBAL",1)
Global("LavaRomanceActive","GLOBAL",2)
OR(5)
Global("LavaLoveTalk","LOCALS",2)
Global("LavaLoveTalk","LOCALS",4)
Global("LavaLoveTalk","LOCALS",6)
Global("LavaLoveTalk","LOCALS",8)
Global("LavaLoveTalk","LOCALS",10)
THEN
RESPONSE #100
StartDialogue("LavaJ",Player1)
END

//Timer

IF
!AreaType(Dungeon)
CombatCounter(0)
InParty(Myself)
See(Player1)
RealGlobalTimerExpired("LavaLoveTalkTime","GLOBAL")
OR(2)
Global("LavaRomanceActive","GLOBAL",1)
Global("LavaRomanceActive","GLOBAL",2)
OR(5)
Global("LavaLoveTalk","LOCALS",1)
Global("LavaLoveTalk","LOCALS",3)
Global("LavaLoveTalk","LOCALS",5)
Global("LavaLoveTalk","LOCALS",7)
Global("LavaLoveTalk","LOCALS",9)
THEN
RESPONSE #100
RealSetGlobalTimer("LavaLoveTalkTime","GLOBAL",1200) //20 minut
IncrementGlobal("LavaLoveTalk","LOCALS",1)
END



Kodując w ten sposób, jeżeli wystąpi pierwsza rozmowa, możemy mieć pewność, iż kolejne też wystąpią. w tym wypadku zakładamy, że wystąpi 5 rozmów. Oczywiście, może być ich więcej. Po prostu chciałem zrobić krótki skrypt by był bardziej czytelny.
Należy podkreślić, że ta metoda jest bardzo dobra. W przypadku gdy tworzymy osobne skrypty dla każdej rozmowy, jest większe prawdopodobieństwo wystąpienia błędu.
Osobno się koduje rozmowy uwarunkowane nie timerowo. W tym przypadku tworzy się osobny skrypt dla tej rozmowy. Zakładając, że ma być to rozmowa, która odbędzie się po odpoczynku. Wtedy skrypt ten wyglądałby tak:

Kod:


IF
!AreaType(Dungeon)
CombatCounter(0)
InParty(Myself)
See(Player1)
PartyRested()
Global("LavaLoveTalk","LOCALS",11)
OR(2)
Global("LavaRomanceActive","GLOBAL",1)
Global("LavaRomanceActive","GLOBAL",2)
THEN
RESPONSE #100
StartDialogue("LavaJ",Player1)
END



To oczywiście przykładowy skrypt. Byłaby to szósta rozmowa, której nie uwzględniały skrypty rozmów timerowych.

IV. Oskryptowanie dialogów

Teraz należy oskryptować dialogi. Zrobimy to na dwóch przykładowych dialogach z punktu II tego tutorialu. Użyjemy tutaj zmiennych występujących w skryptach odpalających rozmowy romansowe.

Kod:


//1st Talk

IF~Global("LavaLoveTalk","LOCALS",2)~THEN BEGIN Lava01x00
SAY ~Tęsknię czasami za swoim domem i zapachem ciastek robionych przez moją babcię - Aurelię. Pamiętam jak byłem dzieckiem i przy wchodzeniu do naszego domu witał mnie słodki zapach ciasta, orzechów i miodu. Wtedy babcia robiła Kakao, ja zapraszałem Ariennę - moją przyjaciółkę - i wspólnie jedliśmy ciastka, a babcia opowiadała nam historię jak poznała mojego dziadka.~
IF~~THEN REPLY ~Widać, że tęsknisz za spokojniejszymi czasami, Lavo. Mylę się?~ GOTO Lava01x01
IF~~THEN REPLY ~Tak, tak. Wtedy przyszły krasnale, zgwałciły wszystkich i urządziły zabawę w wiosce. Zamknij się i skup się na walce, Lavo.~ GOTO Lava01x02
IF~~THEN REPLY ~Nie podoba ci się wędrowanie ze mną?~ GOTO Lava01x03
END

IF~~THEN BEGIN Lava01x01
SAY ~Czasami. Nie zmieniłbym swojego obecnego życia, lubię wędrować, pomagać innym czy spędzać wieczory w tawernach. Tam zawsze jest z kim porozmawiać. Przeszłość nie wróci, jednak niekiedy wracają wspomnienia tamtych dni. Dni gdy nie trzeba było walczyć o życie, spierać się z wampirami czy handlować ze złodziejami.~
IF~~THEN GOTO Lava01x04
END

IF~~THEN BEGIN Lava01x03
SAY ~Ależ oczywiście, że nie! To nie chodzi o to. Po prostu tęsknię za czymś co dawno odeszło. Za dniami niewinnymi, zabawami drewnianymi mieczami, zajmowaniem się kotem i objadanie łakociami. Zmieniłem się, lubię wędrować, odpowiada mi twoje towarzystwo, lecz mimo wszystko... te wspomnienia czasami wracają...~
IF~~THEN GOTO Lava01x04
END

IF~~THEN BEGIN Lava01x04
SAY ~Gdy się spotkaliśmy po raz pierwszy padło imię Imoen. Czy to twoja przyjaciółka? Ukochana?~
=
~Jestem po prostu ciekaw czy jest to osoba która była obecna w twoim życiu od dawna. Czy gdy w twojej głowie pojawiają się obrazy przeszłości, dzieciństwa, czasów bez walki to czy Imoen pojawia się w twych myślach?~
IF~~THEN REPLY ~Nie znasz mnie, Lavo. Walczę od zawszę. Nie pamiętam czasów spokojnych.~ GOTO Lava01x05
IF~~THEN REPLY ~Tak. Imoen jest dla mnie jak siostra. To z nią się bawiłem. Jest dla mnie całą rodziną.~ GOTO Lava01x06
IF~~THEN REPLY ~To nie twoja sprawa!~ GOTO Lava01x02
END

IF~~THEN BEGIN Lava01x05
SAY ~W takim razie twoje życie musiało być niezwykle smutne. Bez zabaw, przyjaciół, nieustająca walka. Jednak mówisz, że nie pamiętasz czasów spokojnych... Że nie możesz ich sobie przypomnieć to nie oznacza, że ich w ogóle nie było... Mam nadzieję, że takie mimo wszystko istniały.~
=
~Teraz ruszajmy. Porozmawiamy później.~
IF~~THEN DO ~SetGlobal("LavaLoveTalk","LOCALS",3)~ EXIT
END

IF~~THEN BEGIN Lava01x06
SAY ~Rozumiem i tym bardziej pragnę ci pomóc z uratowaniem Imoen. Widzę ją jako część twoich wspomnień, a więc i część ciebie. Irenicus nie ma prawa zabierać ci częścią twojego życia. Tak po prostu nie powinno być.~
=
~Teraz ruszajmy. Jeżeli chcemy uratować Imoen to musimy działać.~
IF~~THEN DO ~SetGlobal("LavaLoveTalk","LOCALS",3)~ EXIT
END

IF~~THEN BEGIN Lava01x02
SAY ~Nie bądź bezczelny. Jak nie chcesz ze mną rozmawiać, to można to powiedzieć odrobinę inaczej.~
IF~~THEN DO ~SetGlobal("LavaLoveTalk","LOCALS",3) SetGlobal("LavaRomanceActive","GLOBAL",3)~ EXIT
END

//2nd Talk

IF~Global("LavaLoveTalk","LOCALS",4)~THEN BEGIN Lava02x00
SAY ~(W trakcie wędrówki zauważasz Lavę zerkającego na twoją osobę. Jego mało dyskretne spojrzenia są łatwo zauważalne przez inne osoby. Zdaje się jakby chciał ci coś powiedzieć.)~
=
~(Przez pewien moment patrzy się na ciebie, zdaje się, że chce podejść, lecz jednak decyduje by po prostu kontynuować wędrówkę.)~
=
~(Nie pozostaje ci nic innego jak po prostu ruszać dalej.)~
IF~~THEN DO ~SetGlobal("LavaLoveTalk","LOCALS",5)~ EXIT
END




Tak wyglądają oskryptowane dialogi. Teraz muszą zostać umieszczone w pliku z interakcjami naszego NPC.
Uprzednio był zwyczaj umieszczania ich w plikach z banterami, jednak jest to metoda bardziej zawodna. Nie ma też obawy, że rozmowa będzie zainicjowana przez silnik gry. (Rozmowy w plikach banterów mogą być uruchamiane samoistnie przez silnik, nie potrzebny jest do tego żaden skrypt)

V. Dodatkowe porady

Wspaniałym dodatkiem do romansów jest dodanie plików audio czy muzyki. Jeżeli chcemy by nasza postać "wypowiadała" konkretne linijki, na końcu tej linijki, po znaku ~ umieszczamy nazwę pliku audio w kwadratowym nawiasie np. [LAVA001]. Jak widzimy nie podajemy rozszerzenia pliku.
By dodać muzykę do romansu, po prostu musimy dodać dwie dodatkowe akcje w skryptach uaktywniających rozmowy. W tym wypadku skrypt będzie wyglądał tak:

Kod:


//Fire Talk

IF
!AreaType(Dungeon)
CombatCounter(0)
InParty(Myself)
See(Player1)
RealGlobalTimerExpired("LavaLoveTalkTime","GLOBAL")
OR(2)
Global("LavaRomanceActive","GLOBAL",1)
Global("LavaRomanceActive","GLOBAL",2)
OR(5)
Global("LavaLoveTalk","LOCALS",2)
Global("LavaLoveTalk","LOCALS",4)
Global("LavaLoveTalk","LOCALS",6)
Global("LavaLoveTalk","LOCALS",8)
Global("LavaLoveTalk","LOCALS",10)
THEN
RESPONSE #100
PlaySong(0)
PlaySound("LavaLov")
WAIT(1)
StartDialogue("LavaJ",Player1)
END



Muzyka w rozmowach pomoże w zbudowaniu odpowiedniego klimatu rozmów oraz może nadać rozmowom charakteru, jednak nie jest to wymóg każdego romansu. Można to nazwać podnoszeniem standardu dodatku.
Nie zapominajmy także o miejscach w których powinny występować dialogi, jak przy pierwszej zamianie w zabójcę. Robi się to tak samo jak w przypadku rozmowy "po odpoczynku", lecz zamiast PartyRested() używamy zmiennej która jest ustawiana przez grę w sytuacji pierwszej zamiany. By sprawdzać zmienne, polecam używanie programu NearInfinity.

VI. Zakończenie

Jeszcze raz pragnę przypomnieć, by przed pisaniem dialogów, dobrze przemyśleć całą koncepcje ścieżki relacji NPC-PLAYER1. Dialog powinny być ciekawe, ukazujące charakter postaci, mieć wiele możliwości i dać jak graczowi jak największą swobodę.

Oto kilka tutoriali przydatnych przy pisaniu romansów i przyjaźni:

Tworzenie dialogów - tutorial L'f
Tworzenie CutScene - tutorial Marcina
Polskie Tokeny - tutorial Shaggie'go
Tworzenie NPC - tutorial Lavy
Implementacja Audio - tutorial Lavy

Życzę miłego pisania różnego rodzaju ścieżek relacyjnych!
Ostatnio zmieniony przez L`f 2014-04-27, 19:08, w całości zmieniany 3 razy  
Podziękuj autorowi tego posta
 
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
morgan, Saiya-jin, Torn, picollo, Trista, Zireael
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  
Powered by phpBB modified by Przemo © 2003 phpBB Group