Witaj Wesnothańczyku
Nawigacja
-> Poradniki dla graczy
-> Poradniki dla twórców
-> Zrzuty ekranu
-> Komendy do BfW
-> Ladder of Wesnoth
-> JAK NIE DOSTAĆ BANA?
-> Kodeks strony
-> Kanały IRC
-> Darczyńcy
-> Galeria
-> Kontakt
-> Szukaj

-> Władcy Taktyk
-> Polski Ranking Graczy

-> Era Magii
-> Eastern Europe at War
-> Forgotten Legends
-> Nowy Porządek
-> Ku Nieznanym Krainom
 
Aktualnie online
-> Gości online: 1

-> Użytkowników online: 0

-> Łącznie użytkowników: 2,056
-> Najnowszy użytkownik: gadjodilo
 
Linki

















Polecane portale

Sygnaturki i buttony wesnoth.com.pl


 
5. Scenariusze - część 2.
Tworzenie scenariuszy - część 2.


Event:

W poprzednim module poruszyłem temat tzw. eventów. Teraz omówię je dokładnie, ponieważ to właśnie dzięki nim możemy kontrolować wszystko to, co dzieje się w trakcie scenariusza.

Event (ang. zdarzenie) jest czymś w rodzaju wyzwalacza. Jeśli jakaś czynność mu przypisana ma miejsce, to event aktywuje się a wraz z nim cała znajdująca się wewnątrz akcja. W poprzednim tutorialu mieliśmy taki oto event:

[event]
     name=moveto

     [filter]
        x,y=5,5
     [/filter]

     [endlevel]
       result=victory
     [/endlevel]

[/event]

Powodował on wygranie scenariusza jeśli jakakolwiek jednostka dotrze do heksa o współrzędnych 5,5. Przyjrzyjmy się temu eventowi od strony technicznej.

Ten event składa się z 3 części: parametru "name=", filtra jednostek [filter] i akcji WML, w tym przypadku [endlevel]. I tak w większości przypadków wyglądać będzie zwykły event (choć nie zawsze). Omówię teraz te części.

Parametr "name="
To on określa kiedy (w jakiej sytuacji) event jest odpalany w grze. W naszym przypadku name ma wartość "moveto". moveto to sytuacja, kiedy jednostka kończy ruch (zatrzymuje się na jakimś heksie). Jeśli ta sytuacja będzie miała miejsce, event aktywuje się i zrealizuje swoją akcję.

Filtr jednostek [filter]
Filtr pozwala nam określić dokładnie kiedy event ma się aktywować. Ponieważ chcemy, aby zdarzenie miało miejsce po wejściu na heks 5,5 (a nie dowolny) musimy to sprecyzować właśnie w tym flitrze.

Akcja WML
Tu umieszczamy czynności, które mają mieć miejsce po spełnieniu wcześniejszych warunków. Naszym warunkiem było przemieszczenie się jednostki (moveto) na heks 5,5 (x,y=5,5), zaś naszą akcją po jego spełnieniu jest wygranie gry: [endlevel]. Oczywiście może być więcej akcji w jednym evencie. Wtedy realizowane są w kolejności od góry do dołu.

Załóżmy, że chcemy aby jednostka, która pierwsza dotrze do 5,5 coś powiedziała, a dopiero po tym gra się zakończyła. Potrzebujemy więc tagu [message]:

[message]
speaker=unit
message= _ "Haha! Jestem pierwszy! Wygralem!"
[/message]


Speaker to nikt inny jak jednostka, która mówi. U nas ta jednostka to "unit", czyli tzw. bohater eventu (ten, którego event dotyczy - u nas to jednostka na heksie 5,5).
Message natomiast to treść do wygłoszenia (przypominam - bez polskich znaków!).

Dajmy ten message przed [endlevel]:

[event]
     name=moveto

     [filter]
        x,y=5,5
     [/filter]


[message]
speaker=unit
message= _ "Haha! Jestem pierwszy! Wygralem!"
[/message]
     [endlevel]
       result=victory
     [/endlevel]

[/event]

Teraz mamy dwie akcje w evencie. Pierwsza to komunikat jednostki, a druga to zakończenie scenariusza. I w tej kolejności akcje te zostaną zrealizowane.


Wróćmy do parametru "name=":
Jak na razie poznałeś sytuację moveto. Oczywiście jest tego więcej (a dokładniej całe mnóstwo). Wszystkich teraz nie wymienię, ale zwrócę uwagę na te ważniejsze:

prestart - event ma miejsce przed rozpoczęciem gry (kiedy nie widać jeszcze mapy). Przydatne do ustawienia z góry własności wiosek itp.
start - widzimy mapę ale nie dostaliśmy jeszcze kontroli nad jednostkami. Przydaje się na dialogi rozpoczynające scenariusz, w których bohaterowie np. opowiadają, gdzie się znajdują i co będą robić.
new turn - event aktywuje się kiedy ma miejsce nowa tura. Aby działo się to więcej niż raz musimy dodać linijkę first_time_only=no tuż pod name=.
turn X - gdzie X to numer tury. Akcja ma miejsce w turze X. Często spotykane w kampaniach do wprowadzenia jakiejś nowej sytuacji.
side X turn X - to samo co turn X tylko, że aktywuje się kiedy ruch zabiera gracz X.
time over - aktywuje się, gdy osiągnięto limit tur.
victory - event ma miejsce w momencie wygrania scenariusza. Używa się tego głównie do dialogów w których bohaterowie cieszą się ze zwycięstwa.
defeat - podobnie jak victory, tylko z tą różnicą, że przegraliśmy.

Powyższe eventy nie mają filtrów, bo ich nie potrzebują. Te niżej ich wymagają:

moveto - określona jednostka przemieściła się.
attack - jednostka zaatakowała drugą (ale nie zadała jeszcze ciosu). W kampaniach bohaterowie używają tego eventu aby powiedzieć przeciwnikowi, że zaraz zrobią z niego siekany kotlet.
attack end - jednostka kończy atak (na skutek wyczerpania się ataków, bądź śmierci swojej lub wroga).
last breath - jednostka wydaje ostatnie tchnienie (jeszcze nie znikła z mapy). Można tego użyć, aby przeklnąć wroga, który nas załatwił.
die - aktywuje się kiedy jednostka ginie i znika z mapy.
recruit - jednostka została zrekrutowana.
recall - jednostka została przywołana z poprzedniego scenariusza.
advance - jednostka awansuje.
post advance - jednostka awansowała.


Jeśli chcemy aby event aktywował się częściej niż jeden raz dodajemy linijkę "first_time_only=no" tuż pod "name=".



Poznałeś różne sytuacje aktywujące eventy. Część z nich jest jednak zbyt ogólna, dlatego wymagają zastosowania flitrów.


Filtr:

W naszym przykładzie mamy do czynienia z "filtrem jednostki pierwszej", czyli tagiem [filter]. Jednostka pierwsza to ta, której event dotyczy (u nas jednostka na heksie 5,5). Dlatego zapiszemy to tak:

[filter]
x,y=5,5
[/filter]
x,y= to nasze kryterium. Oczywiście jest ich więcej. Oto ważniejsze z nich:

id - jednostka ma nadane id takie samo jak wpisane tu (to nie id typu jednostki - nie mylić!).
type - jednostka jest określonego typu (to tu właśnie jest id typu jednostki z jej pliku .cfg np. "Drake Blademaster").
race - jednostka należy do określonej rasy (np. human dla człowieka.
ability - jednostka posiada zdolność o określonym id.
side - jednostka należy do gracza o numerze tu podanym.
canrecruit - jednostka jest przywódcą (wtedy canrecruit=yes) lub nie (canrecruit=no).
gender - jednostka jest określonej płci (kobieta - female; mężczyzna - male).
level - jednostka ma określony level (cyfra).
x,y - jednostka stoi na heksie o podanych współrzędnych.

Na razie to wystarczy. Wykorzystajmy tę wiedzę w praktyce. Załóżmy, że chcemy, aby scenariusz wygrała strona, której jednostka pierwsza wejdzie na 5,5 ale nie może być to być nasz przywódca.

Jak to zrobić? Musimy dołożyć nowe kryterium do naszego filtra. Będzie to canrecruit. Ponieważ chemy, aby jednostka nie była przywódcą to canrecruit musi równać się no (gdybyśmy zrobili na odwrót i dali yes to wtedy tylko przywódcy mogliby brać udział w wyścigu). Oto nasz nowy event:

[event]
     name=moveto

     [filter]
        x,y=5,5
canrecruit=no
     [/filter]


[message]
speaker=unit
message= _ "Haha! Jestem pierwszy! Wygralem!"
[/message]
     [endlevel]
       result=victory
     [/endlevel]

[/event]

Możesz teraz zagrać w swój scenariusz i sprawdzić jak działa nasz filtr. Jeśli wejdziesz bohaterem na 5,5 to nic się nie stanie. Ale jeśli jakakolwiek inna jednostka (nie będąca wrogim przywódcą) zrobi to za niego, scenariusz zostanie wygrany.

Dodajmy jeszcze jeden warunek: jednostka, która wejdzie na 5,5 nie może mieć poziomu 0 lub 1.

Aby zrealizować to kryterium musimy posłużyć się "operatorami logicznymi" - brzmi to strasznie, ale to tylko pozory. Operatory te to tagi:

[and] - i
[or] - lub
[not] - nie

W ich wnętrzu umieszczamy kryteria, które zostaną rozpatrzone poza kolelnością. Jak to działa? W naszym przypadku tak:

[filter]
x,y=5,5
canrecruit=no

[not]
level=0
[or]
level=1
[/or]
[/not]
[/filter]

Gra przeczyta to w ten sposób:
Jednostka jest na heksie 5,5 i jest nie-przywódcą i nie jest poziomu 0 lub 1.
Możemy zapisać to też w ten sposób - wyjdzie na to samo, ale zajmie więcej miejsca:

[filter]
x,y=5,5
[and]
canrecruit=no
[/and]
[and]
[not]
level=0
[or]
level=1
[/or]
[/not]
[/and]
[/filter]

Robi się ciekawie. Teraz zajmiemy się zaawansowanymi kryteriami. Wyglądają jak filtry i tak mniej więcej działają. Oto one:

[filter_wml] - tu zawrzemy kryteria, które odnosić się będą do parametrów jednostki i jej statusów (np. kiedy potrzebujemy jednostki o określonej ilości punktów życia, czy jednostki zatrutej itp.).
[filter_adjacent] - ten filitr służy do filtrowania jednostek przyległych (np. chcemy aby obok naszej pozycji 5,5 stała konkretna jednostka, aby event zadziałał).
[filter_location] - natomiast ten filtr pozwala na umieszczenie kryteriów co do typu terenu na jakim ma zatrzymać się jednostka.

Wykorzystajmy te filtry-kryteria. Załóżmy, że chcemy aby oprócz wcześniejszych warunków scenariusz zakończył się, gdy jednostka wejdzie na 5,5 ale obok niej stać będzie inna jednostka, która będzie człowiekiem (ale dziwny ten warunek...). Tak będzie to wyglądać:

[filter]
x,y=5,5
canrecruit=no

[not]
level=0
[or]
level=1
[/or]
[/not]

[filter_adjacent]
race=human
[/filter_adjacent]
[/filter]
Dodajmy jeszcze jedno kryterium. Nasza jednostka musi być... zatruta i mieć 1 hp. (to chyba najdziwniejszy warunek zwycięstwa jaki w życiu widziałem - nie róbcie takich w sowich dodatkach...).

[filter]
x,y=5,5
canrecruit=no

[not]
level=0
[or]
level=1
[/or]
[/not]

[filter_adjacent]
race=human
[/filter_adjacent]

[filter_wml]
hitpoints=1
[status]
poisoned=yes
[/status]
[/filter_wml]

[/filter]

Powiedzmy, że to na razie tyle, jeśli chodzi o filtr jednostki pierwszej ([filter]). Są jeszcze inne filtry do zastosowania bezpośrednio w evencie. Oto one:

[filter_second] - jest to filtr dla jednostki drugiej. Taka jednostka pojawia się, gdy mówimy o eventach które dotyczą dwóch jednostek jednocześnie (attack, last breath, die). Tak to wygląda w praktyce:

[event]
     name=attack

     [filter]
        race=human
     [/filter]
[filter_second]
        race=orc
     [/filter_second]


[message]
speaker=unit
message= _ "Zaraz zrobię z ciebie siekany kotlet, ty paskudny orku!"
[/message]
[message]
speaker=second_unit
message= _ "Pokaż co potrafisz, człowieczku!"
[/message]
[/event]

Ten event aktywuje się, kiedy człowiek zaatakuje orka. Wtedy człowiek powie kwestię a ork mu odpowie. Speaker second_unit (w drugim tagu [message]) dotyczy jednostki drugiej, czyli orka.

Kolejne filtry:
[filter_attack] - filtr dla ataku jednostki pierwszej. Jeśli jednostka pierwsza zaatakuje konkretną bronią to event zadziała. Filtr ten ma własne kryteria:
name - nazwa ataku (znajdziesz w pliku jednostki. Może to być np. sword, bow itp.)
range - zasięg broni (melee - wręcz, ranged - na odległość)
special - cecha specjalna broni (np. magical - magiczny, slow - spowalnia itp. Więcej nazw znajdziesz w pliku abilities.cfg w folderze gry/data/core/macros)
[filter_second_attack] - to samo co wyżej, tylko filtruje broń drugiej jednostki.

Oto przykład eventu z zastosowaniem filtrów tego typu:

[event]
     name=attack

[filter_second_attack]
        special=magical
     [/filter_second_attack]

[message]
speaker=unit
message= _ "Twoja magia ci nie pomoże!"
[/message]
[message]
speaker=second_unit
message= _ "Nie doceniasz mojej czarodziejskiej mocy!"
[/message]
[/event]

Mamy tu sytuację, kiedy jakaś jednostka (unit) atakuje inną, której atak jest magiczny (second_unit).

To chyba tyle, jeśli chodzi o filtry. Przynajmniej na tym etapie. Pozostał nam trzeci, ostatni element eventu - akcja WML. Opiszę go jednak w następnym poradniku ze względu na bardzo dużą ilość materiału do przekazania.

Na sam koniec wspomnę jeszcze o czymś takim jak zagnieżdżone eventy (nested events).

Nested events:

To nic innego jak event w evencie, czyli jajko z niespodzianką. Przykład:

[event]
name=turn 10

[event]
name=moveto

[filter]
x,y=5,8
[/filter]

[endlevel]
result=victory
[/endlevel]

[/event]
[/event]

Zewnętrzny event jest aktywny tylko podczas tury 10. Oznacza to, że drugi event w środku też będzie aktywny podczas tury 10. W tym przykładzie jeśli jednostka wkroczy na heks 5,8 i zrobi to w turze 10 to scenariusz się zakończy.

Można robić wielokrotne zagnieżdżenia eventów.


W następnym odcinku omówione zostaną rodzaje akcji jakie mogą wywoływać eventy. Oj będzie tego dużo ;)
Komentarze
#1 | Kuki1537 dnia grudzień 13 2010 17:27:59
MapPack niedługo będzie gotowy Wink
#2 | Badek dnia czerwiec 05 2013 13:02:13
A jak zrobić kampanie(chodzi mi o wieloosobową). Na twoim miejscu dał bym też o tym filmy na yt lub na tej stronie jeśli to możliwe.
Dodaj komentarz
Zaloguj się, aby móc dodać komentarz.
Oceny
Tylko zarejestrowani użytkownicy mogą oceniać zawartość strony

Zaloguj się lub zarejestruj, żeby móc zagłosować.

Świetne! Świetne! 100% [7 głosów]
Bardzo dobre Bardzo dobre 0% [Brak oceny]
Dobre Dobre 0% [Brak oceny]
Średnie Średnie 0% [Brak oceny]
Słabe Słabe 0% [Brak oceny]
Logowanie
Nazwa użytkownika

Hasło



Nie masz jeszcze konta?
Zarejestruj się

Nie możesz się zalogować?
Poproś o nowe hasło
 
Shoutbox
Musisz zalogować się, aby móc dodać wiadomość.

29/04/2017 20:23
Moi drodzy, niewykluczone, że za tydzień ukaże się długo wyczekiwany remake TLU Wink

29/04/2017 09:48
Eee Druid, modrzew to "za dobre drzewko" do tamtej komisji, bo tam najlepiej czułaby się lipa... Grin Ps: po majówce chyba zobaczymy się na serwie (nie obiecuję) Pozdrawiam.

29/04/2017 08:29
Cześć Modrzew. Mówisz „lepszy w te klocki”, no to na 100 % miejsce eksperta w pewnej komisji już czeka. Grin

28/04/2017 16:21
To jestem lepszy w te klocki niż niejeden tupolew Grin

28/04/2017 12:32
Ominęły cię dwie wierzby i trzy sosny. hy hy Grin

28/04/2017 06:43
Cześć wszystkim! Co mnie ominęło? Pfft

24/04/2017 20:44
"Punkty chwały" zostały naliczone do Polskiego Rankingu. Proszę sprawdźcie, czy gdzieś się nie pomyliłem. Wink

24/04/2017 18:39
Teraz o wiele lepiej GrinD

24/04/2017 17:00
Pewien twórca? pewien user? Wiem że tak trochę ból tyłka z mojej strony ale co tam Grin

23/04/2017 12:05
Dzięki, zaraz napisze

 
Wygenerowano w sekund: 0.02
4,715,732 unikalnych wizyt