| 6. Konwersacje i questy |
| ToolSet - Tutoriale |
| niedziela, 27 grudnia 2009 01:41 |
|
Dialogi to chyba najważniejsza część każdej przygody. W Dragon Age dialogi składają się z linii dialogowych ułożonych w strukturze drzewa. Struktura taka może być prosta lub złożona, a do każdej linii można doczepić odpowiednie warunki, oraz efekty jakie będą one powodowały w trakcie gry.
Jako, że jest to dość złożony i obszerny tutorial, poruszający wiele aspektów, mogły pojawić się w nim błędy. Proszę zgłaszać wszelkie niezgodności w komentarzach lub na forum, postaram się poprawić wszystko najszybciej jak tylko się da. W poprzednim tutorialu stworzyliśmy naszego zleceniodawcę imieniem Lechu, oraz wypełniliśmy chatkę potworami. Teraz nadszedł czas, by połączyć to w miarę sensowną całość, za pomocą questa. W skrócie - Lechu da nam zadanie, polegające na wyczyszczeniu chatki. Pierwszą rzeczą, jaką musimy zrobić, to oczywiście stworzenie nowej konwersacji. Jak? Myślę, że (po przerobieniu poprzednich tutoriali) każdy z was już wie - klikamy File->New->Conversation, lub korzystając z alternatywy w Palette Window: ![]() Standardowo pojawi się nasze ulubione okienko Create New Resource, gdzie wpisujemy nazwę nowego dialogu. Polecam wpisać nazwę nawiązującą do quest giver-a oraz samego zadania - np.: lechu_q1_clear_hut: ![]() Po kliknięciu OK objawi nam się okienko z edytorem konwersacji: ![]() Mamy tam kilka ustawień, które możemy zmieniać, jednak pozostawimy je jako domyślne. Po prostu nie musimy się tym zajmować. Najważniejsze z pól, to: Default NPC Speaker - tutaj ustalamy, kto ma używać owego dialogu i odpowiadać graczowi Default NPC Listener - tutaj ustalany, kto danego dialogu wysłuchuje (w sumie ustawia tylko postać na którą NPC patrzy w trakcie mówienia) Default PC Listener - tutaj ustalamy, do kogo mówi postać gracza (podobnie jak powyżej - na kogo patrzy nasza postać) Można tymi ustawieniami dowolnie manipulować, jeśli tylko scena tego wymaga, jednak na rzecz tutoriala pozostaniemy przy wartościach domyślnych. OWNER w tej kwestii oznacza NPC-a, do którego "podczepimy" dialog, zaś PLAYER to po prostu gracz. Następnym krokiem jest podczepienie dialogu do naszego NPC-a. Aby to zrobić, musimy edytować Lecha, a następnie w polu Conversation wybrać lechu_q1_clear_hut: ![]() W następnym punkcie wrócimy do okna edycji dialogu i dodamy tam conieco. Mamy już utworzony nasz dialog, teraz pora dodać doń kilka kwestii do wyboru i temu podobnych bajerów. Aby to zrobić, przechodzimy do okna edycji dialogu i wciskamy CTRL+A, lub klikamy przycisk oznaczony numerkiem 23: ![]() W polu Dialogue wpisujemy tekst na powitanie, np.: "Witaj wędrowcze, jestem Lechu. Pomógłbyś mi z moim małym problemem?". Następnie pykamy jeszcze CTR:+A 3 razy i dodajemy kolejne trzy linie (mając KONIECZNIE zaznaczony nasz pierwszy dodany wers). W dodane miejsca wpisujemy, na przykład: 1. A ja jestem poszukiwaczem przygód. 2. W czym tkwi twój problem? 3. Znaczniki "act" sprawiają, że w grze dany tekst będzie napisany kursywą - stosowane jest to, kiedy gracz ma mieć opcję wyboru, bez wypowiadania się. Ostatecznie wygląda to tak: ![]() Konwersację można oczywiście w dowolny sposób rozbudowywać, dodając kolejne linie dialogowe do początkowej, lub też rozwijając już stworzone. My dodamy co nieco do "A ja jestem...", w tym linki pozwalające, między innymi, zapętlić dialogi. Aby to uczynić, klikamy na "A ja jestem poszukiwaczem przygód" i wciskamy CTRL+A. Pole domyślnie zostanie przypisane jako [OWNER], czyli dla naszego NPC-a. Wpiszmy w Dialogue np.: "Doskonale, właśnie kogoś takiego mi trzeba!". Następnie klikamy na "W czym tkwi twój problem?" i wciskamy CTRL+C. Kolejnym krokiem jest kliknięcie na "Doskonale, właśnie kogoś takiego mi trzeba!" i wciśnięcie CTRL+SHIFT+V. Spowoduje to wklejenie linku do owej kwestii. Dzięki temu, mimo wyboru innej opcji na początku, wciąż mamy możliwość zapytania o zadanie, jakie Lechu dla nas ma. Po zakończeniu pracy, prezentuje się to następująco: ![]() Dialogowe zaplecze mamy już gotowe, teraz pora zająć się fabułą. Mamy już ładny dialog, teraz pora zająć się questem jako takim. W tym celu użyjemy zasobu typu Plot - to właśnie tam będziemy tworzyć wszystkie nasze questy (no, może poza skryptami). Klikamy zatem File->New->Plot: ![]() Jako Resource Name wpiszmy "lechu_q1_clear_hut" - aby wiedzieć, że jest to pierwszy quest zlecany przez Lecha, polegający na wyczyszczeniu chatki: ![]() W Object Inspector (pod Palette Window) wpisujemy w Name nazwę, pod jaką gracz będzie widział nasz quest w swoim dzienniku, np.: "Pomoc dla Lecha". Kolejnym krokiem jest dodanie do naszego Plot-a tak zwanych flag. Robimy to klikając Insert Main Flag. Jako, że potrzebujemy w tym wypadku 3 flag - oznaczających przyjęcie questa, zabicie potworów i zakończenie questa, klikamy przycisk Insert Main Flag trzy razy. Następnie zmieniamy nazwy flag na coś bardziej sensownego - QUEST_ACCEPTED, MONSTERS_SLAIN i REWARD_RECEIVED. Po zrobieniu wszystkiego jak należy, wygląda to tak: ![]() Do każdej flagi dodamy teraz odpowiedni wpis, który pojawi się w dzienniku. Robimy to, klikając daną flagę, a następnie dodając tekst w polu Jornual Text poniżej. Wpiszmy zatem: QUEST_ACCEPTED: Zgodziłeś się pomóc Lechowi w wyplenieniu bandy Jozinów z pobliskiej Chatki. MONSTERS_SLAIN: Wybiłeś wszystkich Jozinów w chatce, powiedz o tym Lechowi. REWARD_RECEIVED: Lechu ucieszył się, że pomogłeś mu z jego problemem, sowicie Cię wynagradzając. Teraz przyszła pora, by nasz quest podczepić do dialogu. Otwieramy zatem nasz dialog, po czym klikamy na linijkę "Witaj wędrowcze...", po czym na dole wybieramy zakładkę Plots and Scripting: ![]() W Condition klikamy na ikonkę z trzema kropkami, po czym w nowo otwartym okienku wybieramy nasz Plot: ![]() Z rozwijanej listy na prawo od ikonki z kropkami ustawiamy "is false", zaś Flag ustawiamy na QUEST_ACCEPTED (oznacza to, że dany dialog pojawi się tylko wtedy, jeśli nie mamy owego questa w naszym dzienniku): ![]() Teraz nadeszła pora, by dodać kolejną linię dialogową, w której Lechu będzie się nas pytał, czy zabiliśmy już potwory. Klikamy zatem na ROOT, po czym wciskamy CTRL+A. W Dialogue wpisujemy "Zabiłeś już Jozinów?", zaś w Plot and Scripting w miejscu Condition ustawiamy nasz Plot (lechu_q1_clear_hut), Flag na REWARD_RECEIVED oraz wartość na "is false". Dzięki temu zabiegowi, jeśli mamy już quest w dzienniku, Lechu będzie się nas pytał, czy quest został już wykonany, czy nie, zaś po wykonaniu zadania uniemożliwi to kilkukrotne wyzyskanie nagrody. Następnym krokiem jest dodanie odpowiedzi na owe pytanie. Klikamy więc na "Zabiłeś juz Jozinów?", po czym dodajemy dwie linie dialogowe (CTRL+A). W jednym Dialogue wpisujemy "Tak", zaś w Plots and Scripting, w Condition ustawiamy znowu nasz Plot, Flag na MONSTERS_SLAIN oraz "is true". W drugim Dialogue wpisujemy "Jeszcze nie", zaś w Plots and Scripting, w Condition ustawiamy znowu nasz Plot, Flag na MONSTERS_SLAIN oraz "is false". Do dwóch dodanych odpowiedzi należy jeszcze dodać reakcję samego Lecha. Do "Tak" dodajmy linię, w której wpiszemy "Doskonale, oto Twoja nadgora!", zaś w Plots and Scripting ustawimy, TYM RAZEM W ACTION, nasz Plot, Flag na REWARD_RECEIVED i wartość na "set". Mamy już prawie wszystko, poza możliwością przyjęcia zadania. Klikamy zatem na "W czym tkwi twój problem", po czym dodajemy tam nową linię (CTRL+A). W Dialogue owej linii wpisujemy, na przykład "Widzisz tamtą chatkę? Wprowadziły się tam obleśne potwory, chcę żebyś je dla mnie zabił.". Następnie do dodanej dopiero linii dodajemy dwie kolejne. W jednej wpisujemy " W "Dobrze, zajmę się tym" wchodzimy do zakładki Plots and Scripting, gdzie ustawiamy W ACTION: Plot na naszą niedawną kreację, Flag na QUEST_ACCEPTED oraz wartość na "set". Dzięki temu zaakceptujemy quest od Lecha, zaś ten pojawi się w naszym dzienniku. Oto i screen gotowej konwersacji: ![]() Uffff, to na szczęście już wszystko co musimy zrobić z dialogami. Może się to wydawać nieco zagmatwane, jednak z czasem nabierzecie wprawy i będzie w stanie szybko stworzyć złożone konwersacje. Naszym następnym krokiem jest oskryptowanie questa, co (wbrew pozorom) nie będzie takie trudne. Mimo ogromu pracy, jaki wykonaliśmy, nasz quest wciąż jeszcze nie działa. Musimy jeszcze napisać dla niego odpowiedni skrypt, oraz poinformować sam skrypt o jaki quest chodzi oraz jak nazywają się poszczególne składowe z którymi będziemy mieli do czynienia. Aby móc używać nazw Flag stworzonych w lechu_q1_clear_hut.plo, musimy dołączyć nasz Plot jako nagłówek dla skryptu, poprzedzając go KONIECZNIE prefiksem plo_. Klikamy zatem File->New->Script: ![]() Jako Resource Name podajmy coś powiązanego z questem, czyli na przykład "lechu_q1_joziny": ![]() W okienku edytora skryptów wpisujemy taki oto kod: #include "events_h" Opis skryptu linijka po linijce: #include "events_h" // plik obsługujący eventy #include "plt_lechu_q1_clear_hut" // odniesienie do naszego Plot-a #include "wrappers_h" // void main() // główna funkcja skryptu, wywoływana ZAWSZE jako pierwsza {  // nawias klamrowy rozpoczynający blok kodu event ev = GetCurrentEvent(); // zmienna typu "event" pobierająca aktualne zdarzenie (EVENT) int nEventType = GetEventType(ev); // zmienna typu int, pobierająca stałą wartość liczbową aktualnego eventu switch(nEventType) // "przełącznik", wywołujący odpowiedni kod, w zależności od wartości zmiennej nEventType { // nawias klamrowy otwierający switch-a case EVENT_TYPE_TEAM_DESTROYED: // w przypadku zdarzenia EVENT_TYPE_TEAM_DESTROYED (zniszczenie drużyny) { if(GetEventInteger(ev,0) == 1) // jeśli zniszczona drużyna to "Team 1" { WR_SetPlotFlag(PLT_LECHU_Q1_CLEAR_HUT, MONSTERS_SLAIN, TRUE); // ustawienie wartości flagi MONSTERS_SLAIN w lechu_q1_clear_clear_hut na TRUE } break; // wyjście ze switch-a } } HandleEvent(ev, RESOURCE_SCRIPT_AREA_CORE); // obsłużenie eventu } // nawias klamrowy zamykający blok kodu funkcji main() Mając już gotowy skrypt, teraz musimy podpiąć go do naszej lokacji (ze względu na to, że EVENT_TYPE_TEAM_DESTROYED jest wywoływane dla danej lokacji, nie zaś poszczególnych obiektów). Otwieramy zatem nasz hut_interior, zaś w Object Inspector jako Script ustawiamy "lechu_q1_joziny": ![]() Zapisujemy wszystko iii... koniec. Wierzcie, lub nie, ale to wszystko. Mamy (wreszcie!) mini-moduł z 2 lokacjami, NPC-em zlecającym quest, samym questem (w pełni oskryptowanym), kilku przeciwników, oraz własny przedmiot. Jeśli daliście radę i przerobiliście w pełni wszystkie tutoriale, przy odrobinie wytrwałości, twórczego podejścia i zastanowienia możecie tworzyć już całkiem ciekawe i rozbudowane moduły. To by było na tyle z absolutnych podstaw Dragon Age ToolSet. Czujcie się dumni, bowiem umiecie już o wiele więcej niż większość graczy Dragon Age: Początek! Powiem więcej - to Wy dostarczycie im dodatkową rozrywkę, jeśli tylko podstawowa kampania im się znudzi. Zatem droga na podium chwały i sławy sceny Dragon Age: Początek stoi przed Wami otworem. Życzę wielkiego zapału, chęci i oczywiście powodzenia w tworzeniu nowych modułów. W następnych tutorialach zajmiemy się już nieco trudniejszymi zagadnieniami, jak gestykulacje postaci, odpowiednie ustawienie kamery w trakcie rozmowy, złożone skrypty i tym podobne. Żródło: http://social.bioware.com/wiki/datoolset/index.php/Conversation_tutorial Redakcja: Krossfire Tags:
Komentarze (0)
Tylko zarejestrowani użytkownicy mogą pisać komentarze!
Powered by !JoomlaComment 4.0 beta2
|























