Brak serwerów w ciągu najbliższych 2 tygodni. Kliknij, by dodać swój serwer!
Tworzenie misji - XML

Menu - poradnik tworzenia misji

W drugiej części poradnika zajmiemy się plikami XML, czyli tymi, które zajmują się głównie językiem, ułożeniem całej masy elementów oraz różnymi statystykami. Aby było Tobie oraz mi łatwiej się w tym wszystkim połapać podzielę go na trzy części: Lang, Spec (pliki w tych folderach) oraz Reszta.

Zanim zaczniesz uczyć się z tą częścią poradnika warto liznąć sobie choć podstawy XMLa (jak znasz XHTML lub od biedy HTML lub inny język znacznikowy powinieneś być jak u siebie). Jeśli jednak nie wiesz lub nie pamiętasz z czym to się je opiszę zasady pokrótce. Dane w plikach XML zapisujemy w tzw. znacznikach lub tagach. Każdy znacznik musi mieć początek (np. <b>) oraz koniec (np. </b>). Jak widać znacznik kończy się tak samo jak zaczyna - wystarczy dodać znak slash (/). Niektóre znaczniki nie wymagają jednak zamknięcia, jednak, aby poinformować interpreter, że tag ma zostać zamknięty należy także dodać znak slash (np. <br />). Bardzo często zdarza się, że znaczniki posiadają swoje atrybuty oraz przypisane do nich wartości (np. <tag nazwa="Tekst pierwszy" porzadek="0" />). Wszelkie komentarze natomiast możemy pisać między znakami <!-- oraz -->, np.

<!-- To jest komentarz! -->


Nawet gry swój język mieć muszą!

Pierwsze pod skalpel idą pliki z folderu językowego, czyli Lang. Opiszę jednak tylko te pliki, które uważam za istotne dla nas (wszystkie opisane w poprzedniej części poradnika). Resztę niestety będziesz musiał rozszyfrować sam (o ile to, rzecz jasna będzie potrzebne).

W plikach językowych wszystkie dane składają się ze znaczników zwanych string (w programowaniu tego rodzaju zmienne to ciągi znaków, u nas takimi znakami są zarówno litery, jak i cyfry, czy znaki interpunkcyjne). W każdym pliku wszystkie linie kodu zawierają się w znacznikach <strings></strings>. Dopiero wewnątrz nich zapisane są poszczególne ciągi znaków, które odczytuje dla nas gra. Każdy ciąg posiada atrybut 'name', którego wartość jest istotna w celu rozpoznania jej przez edytor bądź skrypty. Przykładowo mamy plik z nazwami misji (missiontitles.xml), w którym nazywamy wszystkie nasze misje:

<strings>
  <string name="MISJA01">Nazwa misji pierwszej!</string>
  <string name="MISJA02">Nazwa misji drugiej!</string>

</strings>

Wartości atrybutu name można sobie dowolnie zmieniać dla własnych potrzeb i upodobań, ale należy trzymać się przyjętego schematu wszędzie (w edytorze i skryptach), bo inaczej gra nie będzie w stanie znaleźć odpowiednich elementów i w najlepszym razie zobaczymy tylko teksty bez sensu typu 'ID_01' lub 'MISSION17'.


Specyfikacje modu.

Tym razem zajmiemy się plikami z folderu Specs. Tutaj sprawy mają się podobnie jak poprzednio - mamy jednak nieco więcej możliwości, głównie dzięki większej ilości możliwych do zaaplikowania atrybutów.
awards.xml
Podobnie jak w plikach językowych tutaj wszystkie nagrody zawierają się w tagu <awards>, natomiast same nagrody to znaczniki <award>. Przyjmują one takie atrybuty jak: id (określenie rodzaju nagrody - potrzebne do skryptów), text (zmienna tekstu, który jest zapisany w pliku językowym w 'Lang/*/score.xml') oraz image (ścieżka do obrazka naszej odznaki).
Dodatkowo, jeśli chcemy, aby odznaki dostawali tylko gracze, którzy po ukończeniu wybranych przez nas misji w tagu nagrody dodajemy tag <condition />, który może przyjąć atrybuty: 'missionindex' (po ukończeniu których misji nagroda ma być przyznana) oraz 'minefficiency' (z jakim wynikiem minimalnym muszą zostać wygrane dane misje).
W poniższym przykładzie nagroda pierwsza jest przyznana za wygranie misji 1 oraz 3 z efektywnością nie mniejszą niż kolejno 95% oraz 80%, nagrodę drugą otrzymamy po przejściu misji 2 z wynikiem minimum 60%, a trzecia nagroda może zostać przyznana tylko w skryptach:

<awards>
 <award id="nr1" text="ID_NAGRODA_NR1" image="mod:UI/Game/Awards/1.dds">
   <condition missionindex="1" minefficiency="95" />

   <condition missionindex="3" minefficiency="80" />
 </award>
 <award id="nr2" text="ID_NAGRODA_NR2" image="mod:UI/Game/Awards/2.dds">
   <condition missionindex="2" minefficiency="60" />
 </award>
 <award id="nr3" text="ID_NAGRODA_NR3" image="mod:UI/Game/Awards/3.dds" />

</awards>

campaign.xml
Tym razem dane są zapisywane w tagach <campaign>, a których mamy określone <mission>. Ten drugi znacznik powinien zawierać atrybuty 'name' (nazwa misji - taka jak w 'Lang/*/missiontitles.xml'), 'index' (numer identyfikacyjny - każda misja powinna mieć indywidualny, czyli po prostu zaczynamy od 0 i do każdej następnej misji dodajemy 1), 'order' (porządek, w jakim misje pojawiają się w kampanii, także zaczynając od 0), 'budget' (czyli startowa ilość kasy, jaką możemy dysponować), 'map', 'script', 'video' (czyli kolejno ścieżki do plików mapy, skryptu oraz klipu video, wyświetlanego przed misją), 'transevac' (czy misja jest TransEvac - czyli najpierw kupujemy, potem wysyłamy, bez możliwości dosyłania jednostek), 'hascampaign' (nie rozumiem za bardzo działanie tego atrybutu ^_^'), 'missionspecial' (misja specjalna - cokolwiek to znaczy), 'final' (czy misja jest misją kończącą kampanię) oraz 'tutorial' (czyli, czy misja jest samouczkiem).

keys.xml
Jak poprzednio - nadrzędnym tagiem jest <keys> natomiast w nim znajdziemy <binding> (być może wiesz co to bindowanie klawiszy - to innymi słowy przypisywanie ich do danej akcji lub ciągu wielu akcji). Ten drugi zawiera parametry 'key' (typ wciskanego klawisza) oraz 'action' (czyli wykonanie akcji, która jest zapisana gdzieś w odmętach kodu gry lub skryptu). Tobie pozostawiam eksperymentowanie oraz sprawdzanie który klawisz jaki ma kod oraz do czego by tu go przypisać. =p

metastrings.xml
Plik, który - można by go tak nazwać - jest linkerem plików językowych. Łączy wszystkie pliki językowe, które mu wpiszemy (tak! Pliki językowe możemy umieścić w DOWOLNYM katalogu modu i mogą mieć DOWOLNĄ nazwę - ba! Może być to nawet tylko jeden plik, a nie kilka, ale aby wszystkim żyło się lepiej producenci modów nie wykraczają poza szablon dany przez twórców).
Dane zawarte w pliku mieszczą się w tagu <meta> i w nim znajdziemy subtagi <file>, które posiadają atrybut 'name'. Dopiero jego wartość określa ścieżkę do pliku.
Co do samej ścieżki - mamy możliwość używania zamienników, z których dwa główne to 'lang:' oraz 'mod:'. Pierwszy określa ścieżkę do oryginalnego folderu z plikami językowymi (np. C:/Gry/Emergency 4/Data/Lang/en/), natomiast drugi do folderu z naszym modem (przykładowo C:/Gry/Emergency 4/Mods/MojMod/).


Reszta ważniejsza i ta mniej ważna.

Tak się składa, że plików XML jest nieco więcej porozrzucanych po katalogach modu oraz samej gry. Właśnie tutaj postaram się Ci przybliżyć ich tajemnice. Może zacznijmy od tej łatwiejszej i przyjemniejszej części.
e4mod.info
Chociaż rozszerzenie może być mylące - co do składni jest to zwykły plik XML - taki, z jakimi mieliśmy przed chwilą do czynienia. Otwórz go więc za pomocą edytora, którym otwierałeś pliki XML (wystarczy notatnik, wordpad, czy cokolwiek tam masz) i rozszyfrujmy go. Cały plik zawiera aż dwa tagi - ten wyższy hierarchią to <e4mod>. Ten niższy natomiast to <mod> i możemy przypisać do niego atrybuty 'name' (nazwa naszego modu), 'author' (czyli nasz nick, imię, nazwisko, czy co tam chcemy podać), 'comment' (czyli jednolinijkowy - więcej się nie mieści przy wyświetlaniu - komentarz lub opis tego, co skleciliśmy). Dodatkowo można spotkać atrybuty 'minor' oraz 'major', ale nie wiem do końca czemu one służą.

<e4mod>
    <mod name="Mój własny mod" author="Ja" comment="Piękny ten mod, czyż nie? =)" />

</e4mod>

Save/campaignprogress.xml
W tym właśnie pliku zapisywane są wszelkie postępy w kampanii. Pierwszym znacznikiem, z jakim mamy do czynienia jest <?xml version="1.0" ?>, czyli.. ustalenie wersji używanego XMLa (dziwne, że tylko w tym pliku oryginalnie się ono znajduje). Następnie tag <progress> opisujący postępy, a w nim <missions> określający misje, <medals>, mówi nam o zdobytych medalach oraz <tutorialdone> (czy ukończyliśmy tutorial) oraz <unitupgrades>, czyli dokonane ulepszenia naszych jednostek.
W tagu misji możemy dodać poszczególne zadania znacznikiem <mission> z atrybutami 'index' (taki, jak index misji w 'Spesc/campaign.xml'), 'score' (czyli nasz procentowy wynik) oraz 'questsolved' (1 jeśli misję zaliczyliśmy, 0 jeśli nie).
Kolejny tag oznacza przyznane nam odznaczenia, które dodajemy tagiem <medal> z zaznaczeniem atrybutu 'type' (nie wiem za bardzo do czego to przyłatać, ale jak się dowiem uaktualnię ten poradnik). Tag odhaczający nam zaliczenie tutorialu ma jedyny atrybut 'value' (wiem, że to dziwnie brzmi - atrybut o nazwie wartość ma jakąś wartość =p), gdzie 0 oznacza, że samouczka nie przeszliśmy, a 1, że mamy go z głowy.
Ostatnim tagiem jest <unitupgrade>, który opisuje ulepszenia poszczególnych jednostek. I tak atrybut 'id' mówi nam o ID jednostki (opisane w katalogach Units) oraz 'level', czyli poziom ulepszenia (np. 1 albo 3).
Aby zrobić tak, że gracz może zagrać w każdą misję i nie musi lecieć całej kampanii od początku przyjrzyj się tagom misji w poniższym przykładzie:

<?xml version="1.0" ?>
<progress>
 <missions>
  <mission index="0" score="0" questSolved="1" />
  <mission index="1" score="0" questSolved="1" />
 </missions>
 <medals />

 <TutorialDone value="1" />
 <UnitUpgrades>
  <UnitUpgrade id="DIVER" level="3" />
  <UnitUpgrade id="DOCTOR" level="3" />
  <UnitUpgrade id="DOG LEADER" level="3" />
  <UnitUpgrade id="ENGINEER" level="3" />

  <UnitUpgrade id="FIREFIGHTER" level="3" />
  <UnitUpgrade id="FIREFIGHTERABC" level="3" />
  <UnitUpgrade id="FIREFIGHTERMASK" level="3" />
  <UnitUpgrade id="PARAMEDICS" level="3" />
  <UnitUpgrade id="POLICEMAN" level="3" />
  <UnitUpgrade id="PROFILER" level="3" />

  <UnitUpgrade id="SCOUT" level="3" />
  <UnitUpgrade id="SHARP SHOOTER" level="3" />
  <UnitUpgrade id="SHOOTER" level="3" />
 </UnitUpgrades>
</progress>


Units/*/*/*/unit.xml
W katalogu Units mamy różne informacje na temat naszych jednostek. I tak foldery Equipment (wyposażenie), Personnel (personel) oraz Vehicles (pojazdy) zawierają kolejne podkatalogi. W wyposażeniu mamy tylko posegregowane przyrządy, a w plikach unit.xml znajdziemy tylko tag <unit> z atrybutami 'id' (identyfikator, potrzebny do np. nazwania elementu) oraz 'prototype', który określa prototyp z edytora, do którego jest przypisany przedmiot.
W katalogach personelu i pojazdów mamy podfoldery kategorii: Ambulance (ratownictwo medyczne), Fire Department (straż pożarna), Police (policja) oraz TEC (służba techniczna). W poszczególnych podfolderach tych katalogów znajdziemy oznakowane kodami jednostki, którymi dysponujemy w grze (o kodach poczytaj niżej).
Tam właśnie, w tych zakodowanych folderach znajdują się istotne dla nas pliki unit.xml, które zawierają tag <unit>, wraz z atrybutem 'id' (porównaj z przykładem z akapitu wyżej). Pod tym tagiem znajdziemy dwa kolejne - <campaign> oraz <freeplay>, jednak oba nie różnią się zbytnio - po prostu możemy ustalić, że w kampanii jakaś jednostka jest szybsza/wolniejsza, mniej lub więcej kosztuje itd. w porównaniu z grą swobodną.
Do tego mamy taki <missions> z atrybutem 'value', którego wartością są liczby oddzielone spacją - te liczby to numery misji, w których dana jednostka ma być dostępna. Kolejnym znacznikiem jest <price>, gdzie 'value' definiuje cenę jednostki oraz <space>, który mówi ile miejsca jednostka posiada (dla pojazdów) lub ile zajmuje (dla personelu) miejsca.
Każda jednostka posiada także prototyp odzwierciedlany w edytorze, z tym, że w pojazdach sprowadza się od do jednego argumentu 'name', gdzie określamy ścieżkę do prototypu, natomiast personel może posiadać różny prototyp względem poziomu ulepszenia, tak więc możemy podać kilka prototypów, gdzie 'name' będzie ścieżką, a 'level' poziomem ulepszenia. Jeśli jest ich więcej niż jeden, powinny być zgrupowane w tagu <prototypes>.
Pojazdy posiadają kilka dodatkowych tagów do dodania. Są to <speed> (określa prędkość pojazdu), <loadspace> (mówi ile osób trzecich mieści pojazd - czy to przestępców, czy poszkodowanych) oraz dodatkowo <personnel> i <equipment>, gdzie w podtagach podajemy znacznik <unit> z atrybutem 'id' dla każdego - w pierwszym przypadku - użytkownika pojazdu lub - w drugim przypadku - przedmiotu posiadanego przez pojazd. Dodatkowo możemy ustalić, czy dany pracownik personelu ma być dodany do wysyłanego wozu domyślnie dodając tag <defaultcount> z atybutem 'value' ustalającym ilość osób domyślnie dodanych do pojazdu.

To tyle na tą część poradnika. Dodatkowo dorzucę jeszcze schemat katalogów w folderze Units, żebyście nie musieli szukać który kod to jaka jednostka / przedmiot:
Units
Equipment
F010Fire Extinguisher (Gaśnica)
F020Fire Hose (Wąż gaśniczy)
F030Jaws Of Life (Nożyce hydrauliczne)
F040Chain Saw (Piła łańcuchowa)
F050Axe (taki dezodorant.. znaczy Topór strażacki)
F060Jump Pad (Skokochron)
P010Flash Grenade (Granat ogłuszający)
P020Road Block (Kolczatka drogowa)
Personnel
Ambulance (Pogotowie ratunkowe)
010Doctor (Lekarz)
020Paramedics (Sanitariusze)
030Dog Leader (Opiekun psa ratowniczego / pies ratowniczy)
Fire Department (Straż pożarna)
010Fire Fighter (Strażak)
020Fire Fighter Masked (Strażak w sprzęcie do ochrony dróg oddechowych)
030Fire Fighter ABC (Strażak w kombinezonie ochronnym ABC)
040Diver (Nurek straży pożarnej)
Police (Policja)
010Policeman (Policjant)
020Shooter (Strzelec)
030Sharp Shooter (Snajper)
040Scout (Zwiadowca)
050Profiler (Negocjator)
TEC (Pogotowie techniczne)
(Inżynier)
Vehicles
Ambulance (Pogotowie ratunkowe)
010NEF (Karetka pogotowia)
020RTW (Ambulans pogotowia)
030RHF (Samochód z psem ratowniczym)
040ITW (Ambulans Intensywnej Opieki Medycznej)
050RHC (Śmigłowiec ratowniczy)
Fire Department (Straż pożarna)
010RW (SCRt - Wóz ratownictwa technicznego)
020GTF (Wóz strażacki ze zbiornikiem)
030TLF (GCA - Ciężki wóz strażacki)
040DLK (GCD - Autodrabina)
050LPF (SCA – Opancerzony wóz gaśniczy)
060DEKON (SChem - Pojazd służb odkażania)
070FMB (Łódź motorowa)
080TFMB (Transporter łodzi motorowej)
090FLB (Łódź gaśnicza)
100LF (Samolot gaśniczy)
Police (Policja)
010STW (Radiowóz policyjny)
020MTW (Furgon policyjny)
030SW (Policyjny transporter opancerzony)
040WAW (Armatka wodna)
050GTW (Duży transporter)
060PHC (Śmigłowiec policyjny)
070FLIGHT (Samochód do ucieczki)
TEC (Pogotowie techniczne)
010FGRI (Pojazd inżynieryjny)
020ASF (Pomoc drogowa)
030FGRR (Wóz z podnośnikiem hydraulicznym WPH)
040FGRB (Wóz z rozkładanym mostem WRM)
050FGRT (Helikopter ratowniczy)
060RL (Buldożer)
070TRL (Transporter z buldożerem)
Jak poprzednio jeśli masz jakieś sugestie, spostrzeżenia lub uwagi, pisz PW na forum http://emergency.gry-online.pl/forum lub na shlizer@wp.pl (preferuję to pierwsze =p). Jeżeli będę miał czas, chęci oraz odpowiednią wiedzę na pewno Ci odpiszę. =)