Własny format mapy do gry

Gry, programy i inne dobra stworzone przez użytkowników, także pomoc w ich kreacji. Bo nie tylko Postalem człowiek żyje.

Moderatorzy: Moderatorzy, Admini

Awatar użytkownika
Ryuq
Administrator
Administrator
Posty: 1338
Rejestracja: 03 paź 2010, 18:20
Lokalizacja: Galicja
Postawił piwo: 2 razy
Otrzymał  piwo: 4 razy

13 wrz 2013, 19:28

Jako że w Game Maker robienie czegokolwiek w 3d jest straszne, szukam sposobu na zrobienie własnego formatu mapy, żebym mógł sobie łatwiej pracować.

Jak na razie, po kilku pomysłach wymyśliłem coś takiego.

Każda mapa jest archiwum zip, zawierającym:
info.xml
xyz.xml
Folder Textures
Folder Models
Folder Scripts

I tak: w Info.xml będą informacje typu kto zrobił mape, data, kontakt i inne pierdoły.
foldery wiadomo, ostatni folder opowiada za wszelkie własne pliki dodane do mapy, mam na myśli skrypty w Lua. Z lua akurat pomoże mi znajomy, ale niestety ten na razie nie ma jak mi pomóc, dopiero jak wróci [Ferie/Wakacje] ale do tej pory chce wszystko ogarnąć.
w xyz.xml będą koordynaty każdego z dodanych obiektów na mapę.

Na początku myślałem o wspólnym pliku info.xml z tego typu zawartością:

Kod: Zaznacz cały

 <map>
  <details>
   <name>nazwamapy</name>
   <author>Ryuq</name>
  </details>
   <main>
    <model>"path_to_3ds_model_in_zip"</model>
    <textures>"Path_to_texture_folder"</textures>
   <objects xyz>
   <object>Trash</object>
   <x>000.000.000.</X>
   <Y>000.000.000.</Y>
   <Z>000.000.000.</Z>
   ...
   </main>
  
Ale to by za dużo klepania było, wolę zrobić przejrzyściej w osobnych plikach.
Czyli osobno info o mapie + model mapy w 3d, i osobno koordynaty wszystkich Actorów.

Tak więc zostanie tak:

Info.xml:

Kod: Zaznacz cały

<meta>
  <info author="Ryuq" name="Mapencja" version="1" type="Map" description="Bóbr bóbr bóóóbr"/> 
  <script src="main.lua" type="server"/> 
  </meta>
xyz.xml

Kod: Zaznacz cały

 <map_objects>
   <object>Trash</object>
   <xyz>000.000.000.</Xyz>
      <object>Pudło</object>
      <xyz>000.000.000.</Xyz>
    </map_objects>
   
Itp itp. Mam nadzieje że wiadomo o co chodzi.
Na razie chce sobie tak rozplanować wszystko, pisać powoli żebym nie doszedł do momentu kiedy żeby dodać mapę będę musiał od nowa kompilować całą grę, dodawać XXX linijek w kodzie, a i uniemożliwić moddowanie.

Myślę że taki Zip ułatwi robotę Moddersom, prawda? I przy okazji i mnie na wstępie.

Tylko nie wiem co zrobić z BSP, czyli z całą geometrią itp.
Zrobić po prostu na wstępie w "info.xml" coś w stylu <model>ścieżka_do_modelu.3ds</model> i tyle?

Czy jakieś inne propozycje?


EDIT:
Ale nawaliłem głupot, to prawie nawet XML nie jest. Ale mniej wiecej wiecie o co chodzi. Sproboje to poprawic zeby bylo jasniej.
Ostatnio zmieniony 13 wrz 2013, 19:54 przez Ryuq, łącznie zmieniany 2 razy.


Awatar użytkownika
Lothar
Pierwsi PSI
Pierwsi PSI
Posty: 2570
Rejestracja: 30 kwie 2007, 15:10
Lokalizacja: Lublin

13 wrz 2013, 23:47

Ogólnodostępne formaty są jak najbardziej mile widziane, (zmutowany)XML POWAH! Osobiście sam używam czegoś podobnego, czasami przeskakując na JSON(ale to głównie w HTML5, po prostu łatwiej i szybciej można z JSON-a zrobić tablicę niż z XML-a w JavaScript).
Pomysł z ZIP-ami też jest dobry, z automatu znikają problemy z brakiem jakiejś paczki z teksturami, czy coś. Minus jest taki, że dla każdej mapy teoretycznie trzeba te same tekstury pakować (teoretycznie, bo w praktyce można zmieniać ścieżki dostępu), ale z drugiej strony 1GB w jedną czy w drugą stronę w obecnych czasach to tyle co nic. Fajnie, że z góry bierzesz pod uwagę modding gry. :)

Zamiast ręcznego klepania polecam wykorzystać np.: Blender-a jako edytor map. Jest masa skryptów eksportujących do formatów zbliżonych do XML-a, weźmy taki txml na przykład:

Kod: Zaznacz cały

<scene >
  <entity id="100" >
    <component type="EC_Name" sync="1" >
      <attribute value="Cube.003" name="name" />
      <attribute value="" name="description" />
    </component>
    <component type="EC_Placeable" sync="1" >
      <attribute value="1.622870,0.474269,-4.258871,0.000000,0.000000,0.000000,1.000000,1.000000,1.000000" name="Transform" />
      <attribute value="false" name="Show bounding box" />
      <attribute value="true" name="Visible" />
      <attribute value="1" name="Selection layer" />
    </component>
    <component type="EC_Mesh" sync="1" >
      <attribute value="Cube.mesh" name="Mesh ref" />
      <attribute value="Material.material" name="Mesh materials" />
      <attribute value="0" name="Draw distance" />
      <attribute value="false" name="Cast shadows" />
    </component>
  </entity>
  <entity id="101" >
    <component type="EC_Name" sync="1" >
      <attribute value="Lamp" name="name" />
      <attribute value="" name="description" />
    </component>
    <component type="EC_Placeable" sync="1" >
      <attribute value="4.076245,5.903862,-1.005454,127.261052,106.936317,-3.163707,1.000000,1.000000,1.000000" name="Transform" />
      <attribute value="false" name="Show bounding box" />
      <attribute value="true" name="Visible" />
      <attribute value="1" name="Selection layer" />
    </component>
    <component type="EC_Name" sync="1" >
      <attribute value="Lamp" name="name" />
    </component>
    <component type="EC_Light" sync="1" >
      <attribute value="0" name="light type" />
      <attribute value="1.0 1.0 1.0 1" name="diffuse color" />
      <attribute value="1.0 1.0 1.0 1" name="specular color" />
      <attribute value="true" name="cast shadows" />
      <attribute value="59.99996566772461" name="light range" />
      <attribute value="1.0" name="brightness" />
      <attribute value="0" name="constant atten" />
      <attribute value="0.25" name="linear atten" />
      <attribute value="0.0" name="quadratic atten" />
    </component>
  </entity>
</scene>
Powyższy kod to mapa z 4 sześcianami (plik Cube.mesh). Można np.: dodać atrybut "pickupType" z możliwymi parametrami "health", "armor", "weapon1", ..., "none". Przy obrabianiu pliku przez silnik gry dodajesz prostego if-a albo switch-a, który sprawdza (między innymi) ten parametr. I tak oto jeśli jest na "none" to traktuje obiekt jako element mapy, a np.: "weapon1" -> wyrzuca kostkę i podstawia shotgun-a.

W pliku xyz.xml mają być tylko i wyłącznie koordynaty? Jak chcesz zapisywać same obiekty występujące w grze - podobnie pliki .xml, z podanym modelem, teksturą, ewentualnie shaderami, rozmiarami i innymi parametrami, czy obiekty będą "hard-coded"?

Co do BSP - jeśli w grze mają przeważać otwarte przestrzenie, polecam darować sobie tę technologię. Najzwyczajniej się nie sprawdza, jest powolna w porównaniu np.: do Octree (powtarzam - przy OTWARTYCH przestrzeniach). Pozostaje pytanie, czy w ogóle powinieneś sobie czymś takim zawracać głowę? Masz jakiś silnik na oku, chcesz jakoś to wmontować w Game Maker? Na start możesz po prostu traktować całą mapę jako prosty zlepek modeli 3D, a dopiero później bawić się w optymalizacje, o ile będą konieczne. 8-)


Nobody Expects The Spanish Inquisition! :biskup:
Awatar użytkownika
Ryuq
Administrator
Administrator
Posty: 1338
Rejestracja: 03 paź 2010, 18:20
Lokalizacja: Galicja
Postawił piwo: 2 razy
Otrzymał  piwo: 4 razy

14 wrz 2013, 00:13

Jak na razie korzystam z zagrzybiałego Ultimate 3d który dostosowuje do swoich potrzeb.
W pliku xyz.xml mają być tylko i wyłącznie koordynaty? Jak chcesz zapisywać same obiekty występujące w grze - podobnie pliki .xml, z podanym modelem, teksturą, ewentualnie shaderami, rozmiarami i innymi parametrami, czy obiekty będą "hard-coded"?
ogólnie to chce zrobić tak żeby jedynie mapy były, bez modeli pakowane. Modele "dostarczone z grą" będą normalnie w folderze "models" dźwięki w "sfx" itp. Ale doczytywane "zewnętrzne" już będą musiały być w zipie. Każdy dodatkowy obiekt itp musi być w zipie, w odpowiednim folderze, razem ze skryptem w Lua.
Myślę że większość plików STANDARDOWYCH będzie zrobionych po prostu już w grze, i będzie sie można do nich odwołać z poziomu takiego XML'a podając odpowiednio ID, oraz koordynaty gdzie ma sie pojawić obiekt.
Ale jak już wszystko zapisze, to dodam kilka przykładowych skryptów, albo "opcji" typu ustawienie "nastroju" [postać krazy sobie po mieście, albo chce zabić gracza itp]
które będą pozwalały na modyfikacje Standardowych bystanderów, na mapę stworzoną przez użytkownika.
Z bronią będzie pewnie podobnie, ew zrobimy plik "template" pistoletu, i zostawimy dla Moddersów.
Jak nowy "bystander" to w "Scripts" wszystko, ew w podkatalogu "Bystanders" i tyle. Tam wszelkie skrypty wrzucane.
Fajnie, że z góry bierzesz pod uwagę modding gry. :)
Biorę przykład z Postala. :P
A chcę nie tylko ułatwić sobie pracę, ale i modderom, którzy nie będą chyba źli, jeżeli Ułatwię im pracę? :D


Awatar użytkownika
Lothar
Pierwsi PSI
Pierwsi PSI
Posty: 2570
Rejestracja: 30 kwie 2007, 15:10
Lokalizacja: Lublin

14 wrz 2013, 02:24

W przypadków modów bardzo przyjemnym rozwiązaniem byłby miks obsługi modów z TES III - V + Quake III Arena.
Innymi słowy - poza standardowymi folderami ze wszelkimi zasobami dodać jeszcze jeden o, zupełnie nic nie mówiącej, nazwie MODS. Do tego też folderu użytkownik/gracz/modder wrzucałby mody albo tworzył własne. Oczywiście mod musiałby zawierać podstawową hierarchię plików i folderów, czyli np.:

Kod: Zaznacz cały

-MOD1&#58;
    -MAPS
    -SCRIPTS
    -TEXTURES
    -SFX
    -MUSIC
    -MODELS
    -modinfo.xml
Plik modinfo.xml zawierałby info o autorach (może prosta struktura dla credits-ów), nazwę moda, ewentualnie wersja, jakieś dane do kontaktu, może adres url do auto-update'ów, etc. czyli coś w stylu:

Kod: Zaznacz cały

<?xml version="1.0" encoding="UTF-8"?>
<modinfo version="0.9.2">
    <modname>MOD1</modname>
    <author>Autor</author>
    <releaeDate>14.09.2013</releaseDate>
    <authorEmail>[email protected]</authorEmail>
    <updateServer>http&#58;//example.com/mod1/updateinfo.xml</updateServer>
    <credits>
        <person position="Author">
            <name>Imię autora</name>
            <lastName>Nazwisko Autora</lastname>
            <contactEmail>Email autora</contactEmail>
            <www>Adres strony WWW autora</www>
        </person>
        <person position="Programmer">
            <name>Imię programisty</name>
            <lastName>Nazwisko programisty</lastname>
            <contactEmail>Email programisty</contactEmail>
            <www>Adres strony WWW programisty</www>
        </person>
        <person position="Graphics">
            <name>Imię grafika</name>
            <lastName>Nazwisko grafika</lastname>
            <contactEmail>Email grafika</contactEmail>
            <www>Adres strony WWW grafika</www>
        </person>
        <person position="Graphics">
            <name>Imię grafika 2</name>
            <lastName>Nazwisko grafika 2</lastname>
            <contactEmail>Email grafika 2</contactEmail>
            <www>Adres strony WWW grafika 2</www>
        </person>
    </credits>
    ...
</modinfo>
Foldery - jak same nazwy wskazują - zawierają mapy, skrypty, modele, etc..
W grze można by zaimplementować prosty launcher, pozwalający na wybranie modów, które mają zostać odpalone. I tak np.: gracz ma zainstalowane mody "MOD1", "MOD2", "MOD3" = struktura wygląda tak:

Kod: Zaznacz cały

-MODS&#58;
    -MOD1&#58;
        -...
    -MOD2&#58;
        -...
    -MOD3&#58;
        -...
Ale stwierdza, że chce grać tylko z MOD1 i MOD3 -> zatem wybiera je w launcherze i klika URUCHOM/GRAJ/COKOLWIEK. Efekt jest taki, że gra np.: uruchamia się z parametrem: gra.exe -mods mod1,mod3.
To daje silnikowi do zrozumienia, że ma nieco zmienić standardowe uruchamianie gry z przykładowego:

Kod: Zaznacz cały

1. uruchom silnik
2. wczytaj zasoby z oryginalnych folderów
3. wczytaj skrypty
4. pokaż menu
5. TUTAJ_WKRACZA_UŻYTKOWNIK
na:

Kod: Zaznacz cały

1. uruchom silnik
2. wczytaj zasoby z oryginalnych folderów
3. wczytaj skrypty
4. wczytaj zasoby z folderów dla MOD1 &#40;jeśli zasoby w modzie mają takie same nazwy jak oryginały -> zastępują je&#41;
5. wczytaj skrypty z MOD1 &#40;jeśli skrypty w modzie mają takie same nazwy jak oryginały -> zastępują je&#41;
6. wczytaj zasoby z folderów dla MOD3 &#40;jeśli zasoby w modzie mają takie same nazwy jak oryginały -> zastępują je&#41;
7. wczytaj skrypty z MOD3 &#40;jeśli skrypty w modzie mają takie same nazwy jak oryginały -> zastępują je&#41;
8. pokaż menu
9. TUTAJ_WKRACZA_UŻYTKOWNIK
Taki zabieg praktycznie wyzerowałby możliwość nieprawidłowej instalacji modyfikacji, ułatwił pracę i tworzenie paczek z modami no i nie trzeba by było robić kopii zapasowej całej gry przez instalacją czegokolwiek :D
Oczywiście koniczne byłoby dodanie też możliwości zmiany kolejności wczytywania modów, bo np.: chcemy tektury i modele z MOD3, ale skrypty z MOD1 a okazuje się, że MOD3 nadpisuje te same skrypty co MOD1. 8-)
Ostatnio zmieniony 14 wrz 2013, 02:25 przez Lothar, łącznie zmieniany 1 raz.


Nobody Expects The Spanish Inquisition! :biskup:
Awatar użytkownika
Ryuq
Administrator
Administrator
Posty: 1338
Rejestracja: 03 paź 2010, 18:20
Lokalizacja: Galicja
Postawił piwo: 2 razy
Otrzymał  piwo: 4 razy

14 wrz 2013, 12:02

Jak na razie pisze prosty skrypcik, który będzie sie pojawiać przy starcie gry.
Który będzie odpalać odpowiednie mapy, zamiast startować kolejny room itp.
Co będzie przydatne, bo nie będę musiał robić XXX osobnych room'ów do następnych map, tylko jeden pusty Room w którym sie wszystko wygeneruje. Ewentualnie jeden room na Menu, a drugi do gry. A ten skrypcik wszystko będzie już sobie generował.
Tam też w okienku, podobnym do tego z AWPModa [w przyszłości] będzie można ustawić jakie mody mają być odpalane.
Ewentualnie wmontuje to w opcje po prostu. :D

Ja tak planuje to wszystko szczegółowo, bo chcę wiedzieć na wstępie co robić. Bo nie chce dojść do momentu takiego, że 3/4 Silnika będzie gówno warte, non moddable, albo jedynie że będę mógł sobie Hello World'a wkleić i sie cieszyć. :D


ODPOWIEDZ