Skocz do zawartości

RPG Structure System


Rekomendowane odpowiedzi

Tytuł: RPG Structure System

 

Opis: niżej. W skrócie: rozbudowany system organizacji danych dla gry RPG (i nie tylko!).

Wersja: 0.5

 

Download: https://gmclan.org/up506_4_RPG_Structure_System.html

Rozmiar pliku: 96 KB

 

Autor: Jakim

Wersja GM: Game Maker 8.1

 

Szczegółowy opis:

 

Oto kompleksowy system plików, który pozwoli stworzyć postacie, dialogi, przedmioty czy plansze w sposób spójny i zorganizowany. Kluczowym elementem tej struktury jest elastyczność - to od dalszego kodowania zależy jedynie, jak bardzo gra na bazie tej struktury będzie dała się modyfikować i ulepszać z zewnętrznego poziomu.

 

Struktura plików:

 

System obsługuje następujące typy plików:

 

.STR (string: łańcuchy znaków)

 

Główny plik zawierający wszystkie używane przez grę łańcuchy znaków - elementy menu, kwestie dialogowe, komunikaty i tak dalej. Wszystkie nazwy poza własnymi, jak np. postaci, będą uchowane właśnie tu. To rozwiązanie jest szczególnie przydatne, gdy zamierzamy tłumaczyć naszą grę/edytować nazwy istniejącej już gry bez przeszukiwania silnika czy też samych plików istot.

 

Warto pamiętać, że w grze pozostają jedynie informacje o id tekstu, do którego się dany obiekt odnosi. Za każdym razem w miejscu creature_name czy item_name wartością jest INTEGER, nie STRING. Dodatkowo, warto posługiwać się stałymi referencjami do odpowiednich kwestii - ułatwia to pracę. W tym celu stworzony został plik refs.cns.

 

W przyszłości tekst, o określonym charakterze, będzie można połaczyć z dźwiękiem; za każdym razem, gdy się pojawi w określonym przez typ kontekście, zostanie wydana komenda odtworzenia dźwięku. Z racji tego, iż radzę unikać wbudowanego systemu obsługi dźwięków, wprowadziłem komendę wav_play.

 

Kwestie zawarte w STR mogą zawierać znaczniki typu [CHARNAME] czy [HP], które automatycznie będą zamieniane na inny tekst/wartość odpowiedniej zmiennej (przez variable_global_? Nie wiem jeszcze). Planuję dodać również inicjowanie globalnych akcji z tego poziomu.

 

.ITM (items: przedmioty)

 

Wszystko, co powinniśmy wiedzieć o przedmiocie, powinno być tu zapisane, a więc atak, czy bonusy wynikające z noszenia/atakowania danym przedmiotem. Możemy ustalić liczbę dodatkowych parametrów i wprowadzić specjalne efekty broni. Podobnie jak typ powyżej, struktura zostanie omówiona szerzej w detalach technicznych.

 

.ARE (areas: lokacje)

 

Mapa lokacji. Teren o ustalonych wymiarach składa się z trzech warstw - pierwsza odpowiada za kolor, druga za literkę obiektu (na potrzeby roguelike'a), a trzecia symbolizuje, czy obiekt stanowi przeszkodę czy nie. Po wypełnieniu informacji o całej lokacji, na końcu ładowane są obiekty specjalne: spawnpointy, NPC czy aktywatory odpowiadające za przenoszenie do innego obszaru.

 

.CHR (characters: postacie)

 

Upgrade'owany CRE o status gry, a więc informacje wynikające z prowadzenia fabuły, niepotrzebne "zwykłym" postaciom niezależnym.

 

.STO (stores: sklepy)

 

Plik zawierający listę sprzedawanych przedmiotów. Polecam obejrzeć sto_save/sto_load, by zobaczyć strukturę pliku. W przyszłości dodam informację o przelicznikach cen oraz wpływie reputacji na cenę.

 

.TBL (tables: tabele)

 

Tu znajdują się tabele. Ich głównym celem jest łączenie zasobów z wybranym przez nas identyfikatorem (głównie na potrzeby edytorów aniżeli samej gry); w przyszłości również tabele doświadczeń na następne poziomy, liczby możliwych zaklęć w zależności od poziomu - ogólnie wszystko, co da się zapisać w formie prostej tabeli.

 

Poniżej przedstawiono struktury, których wprowadzenie jest dopiero w planach lub nie jest możliwe bez silnika samej gry.

 

.SPL (spells: czary)

 

Ta opcja, mimo iż kluczowa dla wielu RPG, pozostaja na razie pusta - z racji tego, jak różnie można podejść do tej kwestii przy pisaniu własnego silnika; nie chcę narzucać żadnych odgórnych rozwiązań. Tym niemniej postaram się niedługo zamieścić przykład użycia.

 

.DLG (dialogs: dialogi)

 

System dialogów połączony z triggerami i akcjami, a więc inicjowaniem cutscenek, zdarzeń gry czy zmiany statusu gry. Oczywiście, pliki .dlg nie zawierają informacji o wypowiedzianych kwestiach, odnoszą się do pliku .str. Na razie jednak triggery i akcje muszę zostawić niezaimplementowane, gdyż silnie zależą od niezależnego od struktury systemu gry.

 

.ACT (actions: akcje)

 

Pliki akcji, czyli ewentualne oskryptowanie wszystkiego, co się rusza w świecie gry, rzucam jedynie jako sugestię. Zaletą tego rozwiązania jest tworzenie świata gry spoza, co jest właściwie głównym celem tego silnika. Bez tego feature'a jakiekolwiek modyfikowanie gry z zewnątrz będzie ograniczone, a czasami nawet niemożliwe. Wadą - spowolniona komunikacja między graczem a silnikiem gry. Tym niemniej zalecam korzystać z tego typu plików, chociażby dla zachowania spójności silnika.

 

WAV i PNG nie wymagają tłumaczenia. To drugie będzie jedynie źródłem grafik do zaimportowania przez Game Makera.

 

Parę technicznych komunikatów.

 

Główne pliki (ITM/CRE/ARE...) mają poniższą strukturę:

1. Nagłówek

2. Podstawowe parametry

3. Listowane dodatkowe elementy

 

O ile kwestia nagłówka jest jasna (na razie nie jest nam potrzebne nic więcej poza typem pliku), o tyle wyjaśnienia może wymagać dalsza część. Wygodnie będzie posłużyć się screenem:

 

itm.png

 

Nagłówek i podstawowe parametry mają stały rozmiar, dalsza część zależy od ilości dodatkowych elementów, które są naliczane w ostatnim bajcie drugiej sekcji - ten ostatni bajt zawiera informację o ilości podstruktur niższego rzędu o stałej wielkości, wyznaczoną przez xxx_secondary_size oraz poszczególne wielkości elementów size_xxx_.

 

Kluczową rolę odgrywają dodane stałe. Przy każdej modyfikacji liczby i własności czy to przedmiotów, postaci czy obszarów, gra się nie wysypie - bo o to głównie chodzi - by móc tworzyć RPG bez obawy, że trzeba będzie przerabiać pół gry, by wprowadzić dodatkowy współczynnik istot lub usunąć nieprzydatną. Kopia wprowadzonych stałych znajduje się w pliku engine.cns i, o ile wcześniej nie napiszemy własnego edytora do gry, z poziomu tego pliku modyfikujemy najistotniejsze dla silnika rzeczy.

 

Nieco inaczej wygląda struktura plików STR, która bardziej przypomina tablicę alokacji.

1. Nagłówek

2. Licznik kwestii

3. Offsety i długości kwestii

4. Tekst

 

str.png

 

Pon nagłówku występuje licznik (3 bity są zarezerwowane na wszelki wypadek, 2 jeszcze można przekroczyć) wszystkich elementów. Dalej, dla każdego elementu znajduje się jego absolutna pozycja i długość (z technicznego punktu widzenia można byłoby operować samą długością wejść, jednakże proszę sobie wyobrazić odczytywanie ostatnich stringów - byłoby to niewspółmiernie obciążające przy dużych plikach) elementu. Na końcu pozostaje umieścić sam tekst.

 

Jak widać, silnik jest mocno inspirowany Infinity Engine - moim skromnym zdaniem jest to pewien wzór do naśladowania. Nie jest on optymalny - np. brakuje narzędzia, które przydzielałoby określone miejsce zmiennej w pamięci gry (wszak wszystkie zmienne użyte w grze są z ustalonego zakresu, który co prawda można podnieść/obniżyć), co, chociaż można byłoby naprawić z użyciem odpowiedniej biblioteki, na razie zarzucam. Również kusiłoby wykorzystanie metod do powtarzających się fragmentów kodu - to jest jednak poza zasięgiem Game Makera. Przy tak wielu niezaimplementowanych rzeczach, można byłoby spytać, czemu publikuję już w tym momencie. Odpowiedź jest prozaiczna: umieszczam ten szkielet struktury już w tym momencie, ponieważ im szybciej zauważycie jakieś błędy bądź nieprzemyślenia silnika, tym łatwiej będzie je wyeliminować. Poza tym przy ciągłym supporcie mogę dostosowywać silnik do waszych potrzeb i wprowadzać rozwiązania, na które sam nie wpadłem.

 

Podstawowe skrypty:

 

xxx_save/xxx_load zapisuje do/ładuje z pamięci podręcznej informacje o przedmiocie/postaci/lokacji. strings_get_ pobiera wartość z zadanego pliku tekstowego STR. Ścieżki do plików uzyskuje się za pomocą komend file_path_.

 

Dodatkowe skrypty:

 

Zawarłem kilka dodatkowych, technicznych skryptów do obsługi plików binarnych, np.

- file_bin_copy_string(file,start,length) - kopiuje łańcuch znaków z pliku binarnego,

- file_bin_copy_value(file,start,length) - jak wyżej, tyle że wartość o ustalonej długości,

- file_bin_read_value(file,length) - odczytuje wartość o ustalonej długości (bez zmiany pozycji pliku),

- file_bin_write_chain(file,value,length) - zapisuje łańcuch bajtów na podstawie zadanej wartości,

- file_bin_write_string(file,position,string) - zapisuje ciąg znaków,

- decompose(value,index) - wyciąga odpowiedni bajt z n-bitowej wartości.

 

Posługuję się cienkokońcowym (little endian) sposobem zapisem informacji, według mnie jest to naturalna i przystępna droga kodowania danych.

 

Co będzie w przyszłości?

- rzeczy wymienione, aczkolwiek niezaimplementowane jeszcze,

- edytor CRE/ARE/ITM/TBL (napisany raczej już nie w GM) i, jeżeli się uda, kompleksowy edytor i walidator całego świata,

- silnik błędów i komunikatów,

- kilka przykładowych tagów i kwestii połączonych z dźwiękiem w pliku STR,

- przykład nieużywanych jeszcze elementów SPL (czary),

- przykładowa gierka RPG wykorzystująca cały system, wliczając osobny, prosty system skryptowania oraz zapis do SAV,

- automatyczne tworzenie pliku TBL na podstawie katalogów ITM/CRE,

- pakowanie i zabezpieczanie danych przed edycją,

- szczegółowy help.

 

Jaki jest cel tego silnika? Może zamiast odpowiedzieć, rzucę pytanie, które zawiera esencję tego, czego oczekiwałbym po dobrym, niestarzejącym się RPG:

- Czy jako gracz mogę stworzyć swój własny świat i własną historię na podstawie tej gry, jeżeli tylko dostanę odpowiednie narzędzia?

 

Oczywiście, nie musisz dążyć do tego podczas robienia swojej gry RPG (a może i nie tylko RPG?). Drugi powód jest jeszcze prostszy - zamierzam kiedyś skończyć roguelike ;).

Odnośnik do komentarza
Udostępnij na innych stronach

Widać że w powijakach, ale system wydaje się być stabilny. Znając Cię, wiem że nie będziesz miał problemu z dokończeniem reszty, niemniej jeśli zechcesz, chętnie pomogę z którymś z elementów (Huder zresztą też), bo cel jest szczytny, a silnik przyda mi się bardziej niż bardzo.

 

5/5

Odnośnik do komentarza
Udostępnij na innych stronach

W sumie jest rzecz, z którą można by mi pomóc, mianowicie edytory ITM/CRE/CHR/STR/itd. Chciałbym, żeby dla oszczędności miejsca i pamięci były napisane w C++/C#, niestety nie mam narzędzi/bibliotek, by to sporządzić tak, żeby działało również na nowszych systemach. To są proste programiki, relatywnie szybko się je pisze.

 

Na przykład walidacja STR to dosyć przyjemna rzecz, mogę opisać cały algorytm sprawdzania poprawności pliku.

Odnośnik do komentarza
Udostępnij na innych stronach

Coś jest nie tak w funkcji itm_load();

GML
___________________________________________

ERROR in

action number 1

of Create Event

for object obj_main:

 

In script itm_load:

Error in code at line 18:

for(iterator[itm_get_parameters]=0;iterator[itm_get_parameters]<item_main_size;iterator[itm_get_parameters]+=1)

^

at position 23: Unknown variable itm_get_parameters

Odnośnik do komentarza
Udostępnij na innych stronach

Zmieniałem nazwę funkcji przed uploadem, iteratorów nie poprawiłem - powinny mieć indeks skryptu, w którym się znajdują. Już wrzucam poprawkę.

 

A tak przy okazji iteratorów: przez tę strukturę zagnieżdżanie funkcji skończy się (ba, nie skończy się) nieprzerwaną pętlą. Jeżeli chcesz zagnieżdżać - to znaczy, że coś robisz już źle w momencie planowania.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Przypomina mi to, co robiłem do Almory Online 0.8 - ale od czasu jak można korzystać z plików XML, to przestało mi się to opłacać, bo edytorem zapisuję do XMLa od razu. Nie mniej dla pozostałych GMów, a także innych języków programowania - rozwiązanie wciąż bardzo ciekawe i uczące jak korzystać z plików binarnych. Propsy za wykonaną pracę.

Odnośnik do komentarza
Udostępnij na innych stronach

Proponuję zmienić show_message("ITM file will be overwritten.")

na

show_debug_message("ITM file ( " + filename_name( temp_item_path ) + " ) will be overwritten.")

 

Raz że nie wyskakuje tabelka z informacją zamiast tego będzie info w debugu to 2 że poda konkretną nazwę pliku.

Odnośnik do komentarza
Udostępnij na innych stronach

Na razie tak, dlatego muszę czym prędzej znaleźć kogoś, kto napisze kompatybilny edytor .str :D. Na razie ta wersja jest poglądowa, służy do zapoznania się z wizją architektury - to dobry moment, byście zaproponowali własne elementy, których obecność byłaby mile widziana ;).

Odnośnik do komentarza
Udostępnij na innych stronach

To nie bug, pierwszy string jest pusty celowo. Czasami będziemy takiego potrzebować. Ustawienie go jako pierwszego wydaje się najrozsądniejszym pomysłem - gdy jakaś zmienna się przypadkowo wyzeruje, otrzymamy empty string. Jak już pewnie zauważyłeś, znacznik każdej kwestii jest siedmiobajtowy.

Odnośnik do komentarza
Udostępnij na innych stronach

UWAGA, duży update: dodałem przykład roguelike'a jako sztampowe zastosowanie silnika.

 

Na razie bez AI wrogów i bez opisu funkcji. Między innymi pojawiło się:

- korzystanie z plików TBL,

- przechodzenie między lokacjami,

- wczytywanie świata z pliku ARE,

- 60 przedmiotów, 5 typów potworów i 5 sklepów (większość jeszcze nieaktywna w grze),

- system RPG: ekwipunek, sklep, walka,

- wiele, wiele więcej.

 

Pozostaje dodać dialogi i skrypty oraz narzędzia do edycji świata :).

 

sklep.png

 

Link pozostaje ten sam. W miarę możliwości starałem się oddzielić skrypty dotyczące samego silnika od skryptów dla roguelike'a.

 

Teraz każdemu dodanemu elementowi (plikowi ITM/CRE/STO) trzeba nadać identyfikator w odpowiedniej tabeli. Lepiej operować refkami do zasobu aniżeli ścieżką do pliku.

 

CTRL służy do ataku/rozmowy.

Odnośnik do komentarza
Udostępnij na innych stronach

___________________________________________
COMPILATION ERROR in Script: compose_from_string
Error in code at line 5:
       temp_value+=string_byte_at(argument0,1+iterator[compose_from_string])*power(256,iterator[compose_from_string]);
                   ^
at position 18: Unknown function or script: string_byte_at

Odnośnik do komentarza
Udostępnij na innych stronach

https://gmclan.org/up506_4_RPG_Structure_System.html

Plik EXE dołączony + naprawiono parę bugów z wyświetlaniem oraz dodano zapis postaci przy wyjściu z gry.

 

Dodałem prowizoryczny area_editor:

CTRL+1...K - wybór koloru,

CTRL-Q/W/E - wybór stawianego obiektu (PPM), posługują się refkami z odpowiedniego pliku TBL (id obiektu ARE/CRE),

F2 - zapis,

F3 - odczyt (gdy mapy są innych rozmiarów, najpierw raz poziom się zrestartuje),

F5 - stawianie przeszkód ON/OFF,

F7 - usuń obiekt.

Jako że korzysta z keyboard_string, zwiesi się, gdy przełączymy grę. Polecam wczytać jedną z map, by zobaczyć, jak to wewnątrz wygląda.

 

Amaterasu przygotował także string_editor, obsługa jest intuicyjna.

 

Ja się zmywam na 2 tygodnie. Stay tuned!

Odnośnik do komentarza
Udostępnij na innych stronach

Po rozpoczęciu gry zacząłem zdobywać 30 poziomów na sekundę, na samej górze przy napisie "Exp" niezmiennie widniała liczba -16777215. To tak miało być? : |

Fajnie się sprawuje kupowanie przedmiotów.

Na trawiastym terenie pojawił się czerwony x, którego nie sposób było trafić nawet z najlepszej broni (miałem już 415 lvl [wyłączyłem zdobywanie poziomów] i ulepszyłem staty). Przydałoby się, żeby gracz dowiadywał się, jaki stwór zabrał mu właśnie 7-8 hp.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...