Djinni Wiki PL
Advertisement

Tytuł strony nie bez przyczyny nazywa się "Mapy obszaru", zamiast "Mapa obszaru" - dla jednego obszaru można bowiem tworzyć nie tylko jedną, a kilka lub nawet kilkanaście map. W tym drugim przypadku tworzymy jedną mapę ogólną, ukazującą cały obszar, oraz dodatkowo jedną albo więcej map szczegółowych, które ukażą tylko wybrane fragmenty obszaru, ale niejako w powiększeniu. Działa to na takiej zasadzie iż:

  • jeśli gracz wejdzie na dany obszar, to otrzymuje np. mapę ogólną obszaru,
  • jeśli przemieści się po tym obszarze np. do lokacji zawierającej wioskę, to otrzymuje nową, bardziej szczegółową mapę, na której widoczna jest tylko wioska.


Ponadto dany obszar jest podzielony czasami na kilka regionów. Na początku gry mapa każdego regionu jest przysłonięta. Odsłaniane mapy następuje wtedy, gdy gracz wejdzie do danego regionu, co skutkuje również wyświetleniem komunikatu o nazwie nowoodkrytego regionu.


W danym momencie gracz może znajdować się oczywiście tylko na jednej mapie, dlatego należy zbudować pewien system obsługiwania map wyświetlanych w czasie gry (czym właśnie tutaj się zajmiemy).


W grze Wiedźmin są co najmniej trzy zestawy obszarów, które posiadają po kilka map. Również moduł Cena Neutralności posiada taki obszar – Kaer Morhen (L08_mod), więc jeśli lubisz analizować, to wczytaj ten moduł w D’jinnim i sprawdź, jak zostały ustawione mapy dla tego obszaru. W przeciwnym razie zapraszam do czytania – utworzymy moduł z obszarem podziemi-kanałów (GL04) i ustawimy jedną mapę ogólną oraz jedną mapę szczegółową. Posługując się tylko plikami map dostępnymi z gry Wiedźmin, na tej samej zasadzie możesz utworzyć moduł np. z obszarem wioski GL24 i dodać dwie mapy, które są dla niego dostępne. Ponadto oczywiście nic nie stoi na przeszkodzie, by stworzyć własną mapę dla danego obszaru, całego lub jakiejś wybranej lokacji, i dodać ją do modułu.



Wymagane programy[]

Do zabawy z mapami wyjątkowo poza samym D'jinnim potrzebny będzie jeszcze jakiś program do grafiki 2D, który dodatkowo potrafi obsługiwać format DDS. Może to być płatny Adobe Photoshop, jak i GIMP, którego używanie jest bezpłatne przez nieograniczony okres czasu:

Aby dodać do modułu mapę obszaru, która jest już w zasobach gry Wiedźmin, wystarczy znać same podstawy GIMP-a.


Wymagane pliki zasobów[]

Nie będziemy rysować żadnej nowej mapy, tylko wykorzystamy tę, która jest już dostępna, a znajduje się w archiwum BIF. Aby się do niej dobrać, musimy wypakować to archiwum – jeśli jeszcze nie posiadasz go wypakowanego i nie wiesz w jaki sposób należy to zrobić, to odpowiedni opis można znaleźć na tej stronie.


Gdy już archiwa BIF zostaną wypakowane, zwracamy uwagę na następujące katalogi:

1. \Data\2da\, z którego potrzebne nam będą pliki:
reggl04.2da
reggl04_1.2da
2. \Data\bmp\, z którego będą nam potrzebne pliki:
reggl04.bmp
reggl04_1.bmp
3. \Data\dds\, z którego potrzebujemy plików:
mapgl04.dds
mapgl04_1.dds

Jak widać po nazwach plików, została przyjęta pewna konwencja nazewnictwa, o której warto powiedzieć sobie kilka słów.



Konwencja nazewnictwa plików[]

Mapa danego obszaru na ogół jest podzielona na kilka regionów. Regionizacja działa na takiej zasadzie, iż np. jeśli gracz jest w podziemiach i wchodzi do pewnego korytarza, to w grze wyświetla się nazwa tego korytarza, a gdy przechodzi do jakiejś komnaty, to wyświetla się komunikat, iż aktualnie znajduje się w danej komnacie.

Amap01


Pliki .2DA oraz .BMP zawierają dane odnoszące się właśnie do tych regionów na mapie obszaru:

  • 2DA (skrót od 2 Dimensional Array) to definicje kluczy regionów i odnośniki do ich nazw. Pliki te można podglądać w D’jinnim albo np. w Notatniku lub Excelu (gdy są wyjątkowo duże);
  • BMP (skrót od Bitmap) to rysunki obrazujące obszary regionów, oznaczone indeksowanymi kolorami. Rozmiar rysunku wynosi 1024x1024 pikseli. Posiadają również dwa białe punkty, służące do określenia ułożenia mapy względem pozycji gracza w grze (za chwilę wyjaśnimy sobie to bardziej szczegółowo).


Nazwy tych plików są zbudowane następująco:

reg + [nazwa_zestawu_z_obszarem] + [przyrostek] . [rozszerzenie:_2da_albo_bmp]


Przedrostek "reg" wskazuje, iż dane w pliku dotyczą regionów występujących na danym obszarze. W omawianym przykładzie nazwa zestawu z obszarem to GL04, zaś przyrostek _1 jest tylko przy jednym z plików. Przyrostki są dosyć ważne dla map obszarów, dlatego zmodyfikujemy nazwę plików:

  • reggl04.2da zmieniamy na reggl04_0.2da
  • reggl04.bmp zmieniamy na reggl04_0.bmp

Oba powyższe pliki odnoszą się do ogólnej mapy obszaru, dlatego w ich nazwach dodaliśmy przyrostek _0. Pliki reggl04_1.2da oraz reggl04_1.bmp zawierają dane o jednym, wydzielonym regionie obszaru, który zostanie pokazany graczowi na nieco bardziej szczegółowej mapie, dlatego posiadają przyrostek _1.


Sam rysunek z mapą obszaru jest zapisany w plikach DDS. Na to, iż jest to mapa, wskazuje przedrostek "map" w nazwie pliku, zaś rozszerzenie DDS (skrót od Direct Draw Surface) oznacza, iż jest to rysunek:

map + [nazwa_zestawu_z_obszarem] + [przyrostek] . [rozszerzenie_dds]

Analogicznie jak to było w przypadku regionów:

  • nazwę pliku mapgl04.dds zmieniamy na mapgl04_0.dds. Zawiera on rysunek ogólnej mapy;
  • nazwę pliku mapgl04_1.dds pozostawiamy bez zmian. Zawiera on rysunek szczegółowej mapy wybranego kawałka obszaru.

Pliki z rozszerzeniem DDS można oglądać i edytować w dowolnym programie graficznym (np. GIMP lub Adobe Photoshop), który obsługuje ten format (np. dla GIMP lub Adobe Photoshop trzeba mieć dodatkowe pluginy DDS). Rysunki te posiadają jedną warstwę (nie ma mip-map), rozmiary 1024x1024 pikseli, są skompresowane w DXT5 oraz posiadają kanał Alpha.


Dla porządku przypominam, iż obecnie w katalogu:

1. \Data\2da\ znajdują się pliki:
reggl04_0.2da
reggl04_1.2da
2. \Data\bmp\ znajdują się pliki:
reggl04_0.bmp
reggl04_1.bmp
3. \Data\dds\ znajdują się pliki:
mapgl04_0.dds
mapgl04_1.dds

Ponadto, będzie nam jeszcze potrzebny sam plik .SET z zestawem obszaru GL04. Znajdziemy go w katalogu:

4. \Data\Meshes\Locations\GL04\ i posiada on nazwę:
gl04.set


Zanim przejdziemy do samego tworzenia modułu, sprawdźmy jeszcze współrzędne lokalizacyjne mapy, aby można było ją poprawnie dopasować do pozycji gracza na mapie wyświetlanej w trakcie gry.



Sprawdzenie współrzędnych lokalizacyjnych mapy[]

Gdybyśmy wczytali plik mapgl04_0.dds w GIMP-ie, okazałoby się, że jest on odbity pionowo. Aby móc oglądać mapę obszaru tak, jak widzi ją gracz w grze, należałoby odbić rysunek w pionie. W GIMP-ie funkcja pionowego odbijania rysunku jest dostępna w oknie roboczym, w menu Obraz – Przekształcenie. Po odbiciu obrazu mapa wygląda tak:

Amap02


Plik mapgl04_1.dds natomiast zawiera następującą mapę:

Amap03


Jak widać, jest to szczegółowa mapa regionu znajdującego się mniej więcej w środkowej części obszaru, którego mapa jest zapisana w pliku mapgl04_0.dds.


Teraz wróćmy do rysunku z ogólną mapą obszaru; sprawdzimy współrzędne lokalizacyjne punktów oznaczonych białym kolorem na obrazie BMP. Wczytaj plik reggl04_0.bmp w edytorze graficznym (GIMP/Adobe Photoshop).


Ważna rzecz, o której należy pamiętać, to fakt, iż rysunki DDS z mapą obszaru należy odbijać pionowo, natomiast dla obrazków BMP z regionami obszaru nie należy tego robić, ponieważ od razu znajdują się w takiej pozycji, jakby widział je gracz w czasie gry.

Amap04


Powyżej znajduje się rysunek z porównaniem mapy obszaru GL04 z obrazem rozmieszczenia regionów. Jak widać, np. kolor fioletowy odpowiada jednemu z korytarzy "poziomych", a kolor zielony jednemu z korytarzy "pionowych". Kolor ciemny niebieski natomiast jest mniej więcej tą częścią obszaru, dla której mamy szczegółową mapę w pliku mapgl04_1.dds.


Wracamy do sprawdzania obrazka regionów z pliku reggl04_0.bmp. Zróbmy duże zbliżenie rysunku (np. 400% lub 800%). Jeśli rozejrzymy się po całym obrazku, zauważymy dwie białe kropki – jedna jest na jasnoniebieskim regionie, a druga na fioletowym. Ja używam programu GIMP i u mnie dla fioletowego regionu wygląda to tak:

Amap05


Dwoma czerwonymi obwódkami zaznaczyłem dwie ważne rzeczy: ta wyżej wskazuje biały punkt na obrazku, a ta niżej współrzędne tego punktu, czyli (163,834). Teraz przechodzimy do rysunku mapy ogólnej mapgl04_0.dds i wyszukujemy piksel, który posiada znalezione przez nas współrzędne – okazuje się, iż leży on w lewej dolnej części mapy, przy końcu jednego z korytarzy:

Amap06


Roboczo możemy zaznaczyć sobie to miejsce w jakiś sposób, na przykład rysując czerwony znak X.


W ten sam sposób na obrazku regionów wyszukujemy drugą białą kropkę – posiada współrzędne (601,230), a następnie miejsce to oznaczamy na mapie. Każda mapa posiada tylko dwa punkty lokalizacyjne, więc dalej nie trzeba szukać.

Amap07


W ten sposób udało nam się określić położenie punktów lokalizacyjnych na mapie. Można powiedzieć, że są to niejako dwie pineski, którymi przypniemy mapę to deski z ekwipunku gracza tak, iż jeśli otworzy w grze menu z mapą, to ta się nie przesunie ani nigdzie nie wypadanie. Dzięki tym pineskom, które za chwilę "wbijemy" w mapę, gra będzie potrafiła dokładnie określić położenie gracza oraz wszystkich innych postaci i obiektów względem mapy.


Plik zawierający rysunek mapy z naszymi oznaczeniami można zapisać, zmieniając oczywiście nazwę z mapgl04_0.dds na jakąś inną, roboczą, aby rysunki robocze nie pomieszały się nam z rysunkami gotowymi dla modułu.


Na tej samej zasadzie sprawdzamy i oznaczamy współrzędne lokalizacyjne mapy mapgl04_1.dds – mi wyszło, że pineski te posiadają współrzędne (112,633) oraz (897,450).

Amap08



Moduł z obszarem i plikami zasobów[]

Pliki gotowe, pineski już tylko czekają, by je wbić w mapę, a zatem można uruchomić program D’jinni i utworzyć nowy obszar z zestawu GL04 – sposób, w jaki należy to zrobić, został opisany np. na stronie Pierwsze kroki albo w oficjalnym podręczniku, w części o tworzeniu nowego obszaru.


Uwaga:
Często zdarzają się pytania o błąd występujący podczas tworzenia nowego obszaru, 
a zgłaszany w D’jinnim za pomocą komunikatu:
   Invalid .set file. Cannot read TILE0/Model entry.
Jeśli u Ciebie również ten błąd się pojawia, to w FAQ jest jeden z punktów, 
który być może zawiera rozwiązanie.


Po utworzeniu obszaru do modułu dodajemy wszystkie wspomniane wcześniej pliki zasobów. Jeśli okno z zestawieniem plików zasobów nie jest włączone, to przechodzimy do menu View – Utility Windows i klikamy na opcję Resources Explorer (obok nazwy tej opcji pojawi się odpowiedni znacznik). Rozwijamy gałąź data\2da, klikamy prawym przyciskiem myszy na plik reggl04_0.2da i wybieramy opcję Add to Module:

Amap09


W analogiczny sposób dodajemy do modułu plik reggl04_1.2da oraz pozostałe zasoby, czyli pliki .BMP oraz .DDS. Jeśli do modułu chcemy dodać wszystkie pliki znajdujące się w danym folderze, to można kliknąć prawym przyciskiem myszy na nazwę folderu i wybrać opcję Add Folder Contents to Module, a wtedy cały folder wraz ze wszystkimi zapisanymi w nim plikami zostanie dodany do modułu.


Należy pamiętać, aby zapisać moduł zaraz po dodaniu do niego nowych plików. Struktura drzewa plików w oknie eksploratora modułu powinna teraz wyglądać tak:

Amap10


Dodajmy jeszcze do obszaru punkt startowy gracza, aby później móc testować moduł. Po wykonaniu tej operacji możemy przejść do przypisywania (czy też przypinania) mapy do obszaru.



Specjalne punkty drogi[]

Aby zachować porządek i później, gdy będziesz rozbudowywać moduł, móc np. wyłączyć w obszarze niepotrzebne obiekty, dodajmy do obszaru nową warstwę (kliknięcie PPM na węzeł gl04(Empty) i opcja Add New Layer) o nazwie np. MapaObszaru, a następnie aktywujmy tę warstwę (kliknięcie PPM na węzeł MapaObszaru i opcja Activate Layer).


W tej chwili będą nam potrzebne rysunki, na których czerwonym krzyżykiem oznaczyliśmy położenie punktów lokalizacyjnych (pinesek) – najpierw dla ogólnej mapy obszaru. Musimy odnaleźć te miejsca na modelu 3D obszaru, w edytorze obszarów. Ja zaczynam poszukiwania od punktu znajdującego się w prawym górnym rogu mapy. Nie jest to jakieś specjalnie trudne, ponieważ obszar kanałów ma kilka charakterystycznych lokacji. Po znalezieniu tego miejsca ustawiam w nim punkt drogi (Waypoint) ze standardowego szablonu m0_wp_standard.utw.

Amap11


Aby ten punkt drogi był specjalny, trzeba go specjalnie oznaczyć, czyli ustawić mu odpowiedni tag. Klikam zatem podwójnie na ten obiekt, by otworzyć okienko jego właściwości, i w polu Tag wpisuję:

wp_special_near_0


Właściwości punktu drogi są teraz następujące:

Amap12


Wyszukuję drugi z punktów lokalizacyjnych, dodaję na obszarze standardowy punkt drogi (Waypoint) w miejscu, które wskazane jest na rysunku z mapą, i jako Tag wpisuję:

wp_special_far_0

W ten sposób mapa została przypięta pineskami do obszaru.


Powiedzmy sobie jeszcze kilka słów o budowie nazwy tagu tych pinesek. Pierwszy człon nazwy zawsze jest taki sam:

  • wp_special_far - dla punktu położonego dalej od środka mapy,
  • wp_special_near - dla punktu położonego bliżej środka mapy.

Gdyby podczas testowania wyszło, że znacznik pozycji gracza znajduje się gdzieś poza mapą, a masz pewność, że specjalne punkty drogi zostały poprawnie rozmieszczone na obszarze i posiadają odpowiednie tagi, to wystarczy zmienić wp_special_far na wp_special_near i odwrotnie, a pozycja gracza ma mapie powinna już być wskazywana prawidłowo.


Do nazwy tagu dodajemy przyrostek, taki sam, jaki posiadają nazwy plików regionu i mapy danego obszaru. W tym przykładzie dla ogólnej mapy wybraliśmy przyrostek _0, dlatego też taki sam dodajemy do nazwy specjalnych punktów drogi.


W analogiczny sposób ustawiamy specjalne punkty drogi dla tej drugiej, szczegółowej mapy, z tym że nazwy tagów oczywiście musimy odpowiednio zmodyfikować na:

wp_special_near_1
wp_special_far_1


Drzewo obiektów dotyczących mapy w obszarze wygląda teraz tak:

Amap13


Lokalizacja tych specjalnych punktów drogi na ogół jest w dosyć specyficznych miejscach, np. te z przyrostkiem _1 znajdują się we wnękach przeznaczonych na okna:

Amap14


Gdybyśmy sprawdzili jeszcze raz położenie punktów drogi dla ogólnej mapy, czyli posiadających tag z przyrostkiem _0, to okazałoby się, że one również znajdują się w pobliżu takich okien – gdyby później podczas testowania w grze mapa była dopasowana nierówno, to można spróbować przestawić punkty właśnie do tych okiennych wnęk.



Obsługiwanie wczytywania map[]

Do wczytania mapy potrzebny będzie krótki skrypt. Dla mapy ogólnej, tej z przyrostkiem _0 w nazwie, stworzenie takiego skryptu jest bardzo proste. Chcemy, aby ogólna mapa była wczytywana w grze zawsze gdy gracz wchodzi do obszaru (sama akcja wyświetlenia mapy na ekranie będzie oczywiście przeprowadzana tylko gdy gracz naciśnie klawisz M albo otworzy menu z mapą obszaru). Otwieramy zatem okno właściwości obszaru, podwójnie klikając na węzeł Area Properties, i w grupie Scripts, w polu On Enter wpisujemy unikalną nazwę skryptu, np. StartMapy0. Przechodzimy do edytowania kodu skryptu i modyfikujemy go do następującej postaci:

void main()
{
     LoadAreaMap("_0");
}

Posłużyliśmy się funkcją LoadAreaMap, aby wczytać plik mapgl04_0.dds. Według składni tej funkcji, argumentem, który należy podać koniecznie, jest przyrostek z nazwy mapy. U nas nazwa mapy ogólnej obszaru ma przyrostek _0, więc taki podaliśmy. Pozostałych argumentów funkcji nie musimy zmieniać, a ponieważ nie trzeba ich koniecznie podawać, więc wystarczy zapisać skrypt w takiej formie, jak jest to podane powyżej.


Wczytanie szczegółowej mapy także nie stanowi specjalnego problemu, zwłaszcza dla osób, które zapoznały się z rozdziałem oficjalnego podręcznika, w którym jest mowa o wyzwalaczu (Trigger). Bo jak inaczej sprawić, aby na wydzielonym obszarze gracz posiadał jedną, szczegółową mapę tego obszaru? Przykrycie terenu płaszczyzną wyzwalacza jest w tym przypadku najprostszym i najbardziej efektywnym rozwiązaniem.


Musimy rzucić okiem na szczegółową mapę wycinka obszaru, którą wcześniej przygotowaliśmy:

Amap03


a następnie poszukać tej lokacji w edytowanym obszarze w D’jinnim - jest to mniej więcej centralna część. Tworzymy wyzwalacz, który mniej więcej przykryje ten kawałek obszaru.

Amap15


Wyzwalacz musimy utworzyć od początku do końca, od otwarcia granic obszaru wyzwalacza do zamknięcia, dlatego podczas jego tworzenia nie ma możliwości przełączania się na podgląd mapy terenu. Nie jest to duży problem, ponieważ węzły granicy wyzwalacza można przesuwać, a ponadto tak naprawdę określenie wycinka obszaru, który przykryjemy wyzwalaczem, zależy tylko od nas. Czyli obszar wyzwalacza nie musi idealnie pokrywać się z terenem przedstawionym na szczegółowej mapie obszaru; to my decydujemy, w którym momencie w grze ma zostać wczytana ta szczegółowa mapa. Niemniej warto jednak zwrócić uwagę, aby w miarę dokładnie pokryć teren wyzwalaczem.


Uwaga:
Jeśli podczas tworzenia wyzwalacza nie widać kursora, to posługuj się prawym 
przyciskiem myszy, by określić położenie kursora na scenie. Podczas dodawania 
kolejnych węzłów wyzwalacza wystarczy po prostu przez chwilę przytrzymać 
wciśnięty prawy przycisk myszy, a kursor powinien się pojawić.


Aby spowodować samo wczytanie pliku z mapą, ponownie posłużymy się skryptem. Szczegółowa mapa ma się pojawić gdy gracz wejdzie na obszar wyzwalacza, dlatego we właściwościach tego wyzwalacza, w grupie Scripts, w polu On Enter wpisujemy nazwę nowego skryptu – aby zachować przyjętą konwencję, nazwiemy go StartMapy1. Przechodzimy do edytowania kodu skryptu i modyfikujemy go do następującej postaci:

void main()
{
     LoadAreaMap("_1");
}

Proste, prawda? Wczytujemy mapę, której nazwa posiada przyrostek _1, ponieważ jest to nasza szczegółowa mapa kawałka obszaru.


No dobrze, gracz wchodzi na obszar wyzwalacza i otrzymuje szczegółową mapę wcinka obszaru, ale co się stanie, gdy już wyjdzie poza obszar wyzwalacza? Musi z powrotem otrzymać ogólną mapę całego obszaru, a my musimy o to zadbać - we właściwościach wyzwalacza, w skrypcie On Exit wpisując nazwę skryptu, który spowoduje wczytanie mapy o nazwie z przyrostkiem _0. Skrypt taki już mamy przygotowany, nazywa się StartMapy0, dlatego możemy użyć go tutaj ponownie:

Amap16


Klikamy na ikonkę z czerwonym napisem NSS, by upewnić się, że wpisaliśmy poprawną nazwę skryptu – powinno otworzyć okno edytowania skryptu, który wcześniej już pisaliśmy, czyli z następującym kodem:

void main()
{
     LoadAreaMap("_0");
}


Na koniec pozostaje przetestowanie modułu pod względem obsługiwana map ogólnej

Amap17


i szczegółowej

Amap18


a następnie rozbudowanie modułu – dodanie aktorów, questów, dialogów, cutscenek itd.


Zobacz również[]

Advertisement