Autor Wątek: Etharnion RPG 1.0 - new version  (Przeczytany 6408 razy)

Offline Raptor

  • Użytkownik

# Wrzesień 15, 2012, 17:23:42
Dzięki za szybką odpowiedź, pomogło :)
Do tej pory zauważyłem jeszcze jedną małą nieściłość: w rozmowie z Rolfem mówimy mu, że zostaliśmy do niego przysłani przez maga z Serenis. Ale to mały błąd. Poza tym gra się naprawdę fajnie, jak przejdę całość to na pewno podzielę się wrażeniami :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Adam27

  • Użytkownik

# Wrzesień 15, 2012, 17:36:12
Dzięki za czujność, w pewnym momencie pisania dialogów musiały mi się pomylić nazwy wiosek i stąd ten błąd ;) Życzę miłej dalszej gry i pozdrawiam ;)

Offline Raptor

  • Użytkownik

# Wrzesień 16, 2012, 00:43:17
Dobra, przeszedłem. Grało się bardzo fajnie, większych bugów się nie dopatrzyłem. Fabuła główna całkiem niezła i dość oryginalna jak na taką grę.
Teraz kilka uwag:
-zdecydowanie za krótka :)
-mapa też mogła by być chociaż 2-3x większa
-balans rzeczywiście jest skopany; moim zdaniem poziom trudności powinien zostać znacząco podniesiony
-gracz zdobywa poziomy zdecydowanie zbyt szybko, do tego pod koniec gry zauważyłem, że mam po kilka mikstur do rozwijania każdej umiejętności; gracz powinien musieć się specjalizować w 1-3 rzeczach, bo na więcej nie starczy mu punktów i będzie za słaby

To tylko takie drobne sugestie, gra jest naprawdę przyjemna :)

Offline Adam27

  • Użytkownik

# Wrzesień 16, 2012, 01:33:37
Jak się fajnie gra to każda gra jest krótka ;P Niestety dłuższa fabuła/większa mapka znacząco przedłużyłyby czas potrzebny na ukończenie projektu. Myślę że balans się trochę poprawi gdy spowolnię rozwój bohatera - większy odstęp pomiędzy zdobywaniem kolejnych poziomów, wolniejszy przyrost zdrowia i many. Co do poziomu trudności, nie chciałem żeby był on za wysoki, ale chyba wyszło na to że pod koniec jest za niski. Dzięki za te uwagi ;)

Pozdrawiam.

Offline rhdbisgrt

  • Użytkownik

# Wrzesień 16, 2012, 10:16:13

Mam nadzieję, że pamiętacie projekt gry RPG Etharnion, którego pierwszą wersję miałem przyjemność zaprezentować około rok temu. Dzisiaj, po ponad półtora roku od rozpoczęcia tworzenia, chciałbym Wam udostępnić pełną wersję gry oznaczoną numerem 1.0! Jeszcze więcej

Hej, gratulacje. Nie sciagalem bo mam tylko starego zintegrowanego intela na kompie; pytania

- ile lini kodu?
- w czym dokladnie napisane?
- jaka czesc z wykonania najbardziej obciaza klatke?

Offline Adam27

  • Użytkownik

# Wrzesień 16, 2012, 12:35:30
16000 LoC. Pisane w C++ (Visual 2010 Express, jeśli ma to jakieś znaczenie), OpenGL 2.0, GLEW oraz z użyciem libów Audiere (do dźwięku) i Corona (do wczytywania tekstur).

Nie robiłem dokładnych testów, wszystko też zależy od miejsca w jakim się znajduje gracz, ale najbardziej wymagające jest renderowanie oświetlenia i cienii oraz rysowanie mapy i obiektów. Przykładowo, w mieście u mnie FPS wynosi ok. 200, a w lesie - gdzie nie ma ani oświetlenia ani dużej ilości obiektów - 450.

PS. Myślę że nawet zintegrowana karta powinna pociągnąć grę, chętnie bym się też dowiedział jak na takiej chodzi, więc jeśli masz chwilkę, uruchom i daj znać chociaż ile FPS ;)

Pozdrawiam.

Offline rhdbisgrt

  • Użytkownik

# Wrzesień 16, 2012, 12:52:44
16000 LoC. Pisane w C++ (Visual 2010 Express, jeśli ma to jakieś znaczenie), OpenGL 2.0, GLEW oraz z użyciem libów Audiere (do dźwięku) i Corona (do wczytywania tekstur).

Nie robiłem dokładnych testów, wszystko też zależy od miejsca w jakim się znajduje gracz, ale najbardziej wymagające jest renderowanie oświetlenia i cienii oraz rysowanie mapy i obiektów. Przykładowo, w mieście u mnie FPS wynosi ok. 200, a w lesie - gdzie nie ma ani oświetlenia ani dużej ilości obiektów - 450.

PS. Myślę że nawet zintegrowana karta powinna pociągnąć grę, chętnie bym się też dowiedział jak na takiej chodzi, więc jeśli masz chwilkę, uruchom i daj znać chociaż ile FPS ;)

Pozdrawiam.

Mam w domu b starego kompa z pentium 4 i zintegrowany intel wspiera z tego co pisze ogl 1.3 tak ze raczej nie pojdzie

(ja pod tym pisze tylko w OpenGL 1 i tylko takiego OpenGL'a znam ;-)

16 tys lini kodu to niezwykle mało mz,(a liczone ze spacjami czy bez, ile KB zrodel? ) 

Mozesz opisac paroma slowami 'wewnetrzna architekture projektu'? Byłoby to ciekawe..

Co wykonuje sie przed loopem (jaki setup) co w loopie (mozna sie domyslec ze jakies ai/kolizje i wizualizacja, ale dokladniej? Jaki podzial na pliki/moduly, i jak przechowywane sa glowne struktury/kontenery danych? Pare slow o kilku/ kilkunastu najwazniejszych blokach kodu..


 
« Ostatnia zmiana: Wrzesień 16, 2012, 12:55:30 wysłana przez rhdbisgrt »

Offline Adam27

  • Użytkownik

# Wrzesień 16, 2012, 13:43:03
Jeśli karta obsługuje tylko OpenGL 1.3 to faktycznie nie pójdzie - gra korzysta z shaderów dostępnych od wersji 2.0.

Linijki zliczyłem tak jak pokazuje Visual - czyli razem ze wszystkimi komentarzami, odstępami itp. Kodu naliczyłem 470kB. Nie wiem czy to dużo czy nie, to mój pierwszy tak duży projekt, ale trzeba zwrócić uwagę że to tylko tak naprawdę "silnik" - cała kampania (fabuła, postaci, dialogi, questy, potworki, itemy itp.) zapisana jest w osobnych plikach, których łącznie jest 180kB + kolejne 180kB na samą mapę.


Struktura programu nie jest skomplikowana, więc jeśli Cię to interesuje, nic nie stoi na przeszkodzie żebym o tym napisał. W wielu miejscach nie mam nawet klas, tylko luźne funkcje służące do wykonywania poszczególnych zadań. Jest moduł w którym trzymam funkcje pomocnicze (matematyczne, do ładowania tekstur, rysowania prymitywów itp), wszystkie inne moduły z niego korzystają.

Mapa zapisana jest głównie w postaci kafelkowej - a przynajmniej obiekty na mapie, bo podłoże to trochę inna metoda. Kafelki posiadają przesunięcie i obrót, dzięki czemu obiekty nie muszą być wyrównane do siatki. Ma to taką przewagę, że można szybko sprawdzać kolizje postaci z najbliższymi obiektami oraz rysować mapę w zasięgu widzenia gracza, iterując tylko po kafelkach, zamiast po wszystkich obiektach na mapie.

Dalej mam bazową klasę postaci, która realizuje podstawowe zadania takie jak poruszanie, kolizje, rysowanie i animowanie postaci, proste AI. Po niej dziedziczą klasy Animal (neutralne zwierzęta), Monster (negatywnie nastawione moby) oraz Human - bazowa klasa dla ludzi. Z niej z kolei wychodzą NPC oraz Player.

Oprócz tego, są klasy Dialog i Quest, których znaczenie jest chyba jasne. Dalej m.in. Bullet i Spell, odpowiadające za aktualizację i sprawdzanie kolizji pocisków (strzały, bełty) i zaklęć. Z tym ostatnim związany jest także system cząsteczkowy posiadający własną klasę i zarządzający wszystkimi cząsteczkami. W osobnych modułach są funkcje do ładowania czcionek i wyświetlania tekstu oraz wczytywania i odtwarzania dźwięków.

No i ostatni, główny, największy moduł, łączy to wszystko w całość. Ma dostęp do vectorów obiektów wszystkich wcześniej wymienionych klas, aktualizuje i wyświetla je. Przed pętlą główną jest oczywiście inicjalizacja OpenGL i bibliotek, wczytywanie shaderów. W tym module znajduje się także masa funkcji do renderowanie poszczególnych elementów sceny, w tym okien ekwipunku, menu itp. No i to chyba tyle :)

Pozdrawiam.

Offline rhdbisgrt

  • Użytkownik

# Wrzesień 16, 2012, 14:27:37
Jeśli karta obsługuje tylko OpenGL 1.3 to faktycznie nie pójdzie - gra korzysta z shaderów dostępnych od wersji 2.0.

Linijki zliczyłem tak jak pokazuje Visual - czyli razem ze wszystkimi komentarzami, odstępami itp. Kodu naliczyłem 470kB. Nie wiem czy to dużo czy nie, to mój pierwszy tak duży projekt, ale trzeba zwrócić uwagę że to tylko tak naprawdę "silnik" - cała kampania (fabuła, postaci, dialogi, questy, potworki, itemy itp.) zapisana jest w osobnych plikach, których łącznie jest 180kB + kolejne 180kB na samą mapę.


Spox, ja tez obracam sie wlasnie w takiej skali projektow (niedokonczony roguelike 700k,niedokonczona space shooter OGL 500k, reszta moich nowszych 'prototypow' w 2d ok 1000k czyli razem ok 2M / 80 tys lini) - z tym ze moje sa niedokonczone; i o tyle zdziwilo mnie ze 16 tys dalo juz ukonczona gre rpg

Ew to ze trzymasz dane w postaci zewnetrznych plikow wyjasnia krotkosc kodu (ja tak nigdy nie robilem tylko prawie wszystko (poza bitmapami itp) hardkoduje w kodzie.. :/

Co do liczenia lini to spok, mz wlasnie tak sie powinno liczyc czyli sume dlugosci plikow, ew podzielic liczbe wlasnorecznie napisanych zrodel przez 25 znakow na linijke

(na reszte odpowiem pozniej bo obiad :O)


« Ostatnia zmiana: Wrzesień 16, 2012, 14:35:38 wysłana przez rhdbisgrt »

Offline Oti

  • Użytkownik

# Wrzesień 16, 2012, 14:39:19
(niedokonczony roguelike 700k,niedokonczona space shooter OGL 500k, reszta moich nowszych 'prototypow' w 2d ok 1000k czyli razem ok 2M / 80 tys lini) - z tym ze moje sa niedokonczone;
O matko. To co Ty tam w tym kodzie robisz? Wszystkie możliwe koła wymyślasz na nowo, czy jak?

Offline rhdbisgrt

  • Użytkownik

# Wrzesień 16, 2012, 14:56:33
O matko. To co Ty tam w tym kodzie robisz? Wszystkie możliwe koła wymyślasz na nowo, czy jak?

Sprawy zwiazane z 'wymyslaniem kól' akurat raczej nie zajmuja dodatkowego miejsca w kodzie, tak ze to nie to.

Na co to idzie? w sumie nie wiem, chyba po prostu na 'rozbudowe'  -ilosc modulow (czyli swojego rodzaju enumeracje) - jak pisalem roguelika to powymyslalem z  50 ekranow z rozmaitymi opcjami (skille, exp, statystyki, debugowe, itd itd przesada ze 50 ale ze 20 moglo byc jesli liczyc wszystkie), jak pisalem 'sigme' (shooter w ogl)  to tez zaqczalem mnozyc rozne byty w przestrzeni kosmicznej, kazdy wymagal innego kodu bo mial inne zachowanie itp i tez zrobilo sie tego ze 20 - tak samo  moje ostatnie 'dzieła' czyli szereg 'prototypow' niepodokanczanych gier (i podakanczanych mniejszych progsow czy efektow)w 2d, tez zrobilem tego z 10 - tak ze moj domowy dorobek 80 tys lini i praktycznie nic nie skonczone
 
« Ostatnia zmiana: Wrzesień 16, 2012, 14:58:05 wysłana przez rhdbisgrt »

Offline Oti

  • Użytkownik

  • +2
# Wrzesień 16, 2012, 15:20:10
Aha...

(niedokonczony roguelike 700k,niedokonczona space shooter OGL 500k, reszta moich nowszych 'prototypow' w 2d ok 1000k czyli razem ok 2M)
Źle zrozumiałem. Myślałem, że masz tam kolejno 700 000 linii kodu, 500 000 linii kodu i w podsumowaniu 2 miliony linii kodu. My bad.

Offline rhdbisgrt

  • Użytkownik

# Wrzesień 16, 2012, 15:29:06


Dalej mam bazową klasę postaci, która realizuje podstawowe zadania takie jak poruszanie, kolizje, rysowanie i animowanie postaci, proste AI. Po niej dziedziczą klasy Animal (neutralne zwierzęta), Monster (negatywnie nastawione moby) oraz Human - bazowa klasa dla ludzi. Z niej z kolei wychodzą NPC oraz Player.

Oprócz tego, są klasy Dialog i Quest, których znaczenie jest chyba jasne. Dalej m.in. Bullet i Spell, odpowiadające za aktualizację i sprawdzanie kolizji pocisków (strzały, bełty) i zaklęć. Z tym ostatnim związany jest także system cząsteczkowy posiadający własną klasę i zarządzający wszystkimi cząsteczkami. W osobnych modułach są funkcje do ładowania czcionek i wyświetlania tekstu oraz wczytywania i odtwarzania dźwięków.

No i ostatni, główny, największy moduł, łączy to wszystko w całość. Ma dostęp do vectorów obiektów wszystkich wcześniej wymienionych klas, aktualizuje i wyświetla je. Przed pętlą główną jest oczywiście inicjalizacja OpenGL i bibliotek, wczytywanie shaderów. W tym module znajduje się także masa funkcji do renderowanie poszczególnych elementów sceny, w tym okien ekwipunku, menu itp. No i to chyba tyle :)

Pozdrawiam.

Mialbym do tego kilka pytan, np:

- jak trzymane sa te postaci? - globalny vector encji dziedziczacych po klasie bazowej dla postaci? Jak tworzysz te postaci przed wstawieniem ich do pojemnika? (przez new i w konstruktorze doczytywanie ich wlasnosci z z pliku?)

- Dialog Quest Bullet i Spell wcale nie jest dla mnie jasne jak to dziala i jest osadzone w kodzie - zwłaszcza Quest, mam znikome wyobrazenie jak to moze dzialac :>

- Jak zrealizowane sa te obiektowe zaleznosci  miedzy glownymi obiektami czy tez kontenerami, np w jaki sposob glowny obiekt gry 'widzi' te kilka pozostalych najwazniejszych ?

 
« Ostatnia zmiana: Wrzesień 16, 2012, 15:31:16 wysłana przez rhdbisgrt »

Offline hfjh

  • Użytkownik

# Wrzesień 16, 2012, 17:46:56
Gratulacje, świetna robota! Zagrałem prawie do końca, fajnie spędzony czas. Mam dwie uwagi:
-przy pierwszym podejściu do handlu straciłem trochę sprzętu, bo nie kliknąłem "wyrównaj" - kod mógłby wyświetlić jakieś ostrzeżenie
-trochę dziwnie wygląda sytuacja, kiedy wioskowy mag skupuje wszystkie topory/miecze/pałki - handlarze powinni skupować tylko sprzęt z ich specjalizacji
-ostatni, i najpoważniejszy błąd: nie mogłem okraść skarbca w stolicy. Po prostu nie miałem punktów nauki, a (o ile nie pominąłem jakiegoś zakamarka) wybiłem wszystkie potwory. Fajnie by było gdyby pająki, czy wilki się odradzał, tak aby było na czym zdobywać doświadczenie

I na koniec dwa pytania:
-planujesz wersję na Linuksa? Co prawda pod Wine działa znośnie (czasami kursor laguje), ale miło by było zobaczyć wersję natywną
-jak wygląda Twój toolset?

Offline Adam27

  • Użytkownik

# Wrzesień 16, 2012, 18:31:40
@rhdbisgrt:

Bullet i Spell tak jak pisałem to klasy pocisków i zaklęć - realizują sprawdzanie kolizji, zadawanie obrażeń itp.

Dialog to klasa która wczytuje z pliku dialogi dla każdej postaci. Każdy dialog posiada pewne opcje dialogowe (które później pojawiają się do wybrania przez gracza) i listę następstw dla każdej opcji - co rozmówca powie, jaki quest przyjmiemy itp. Dialog zajmuje się więc sprawdzaniem warunków dla każdej opcji dialogowej, a po wybraniu odpowiedniej, wykonuje wszystkie akcje związane z daną opcją.

Quest zawiera informacje o nazwie questa, jego opis, warunki ukończenia, ilość doświadczenia które dostaniemy za jego ukończenie, oraz stan - przyjęty/aktywny/zakończony/zepsuty/anulowany. Ta klasa nie robi nic szczególnego poza zarządzaniem listą aktywnych zadań i wyświetlaniem informacji gdy któryś został przyjęty, ukończony, zaktualizowany itp.

Co do ostatniego pytania - każdy moduł posiada globalnie zadeklarowany vector wskaźników na obiekty danej klasy (np. vector<Quest*> quests) oraz mapę asocjacyjną służącą do wyszukiwania liczbowych identyfikatorów obiektów po ich tekstowych identyfikatorach używanych w skryptach (np. map<string,short> questIDs). Główny moduł dzięki temu może bez problemu dostać się do każdego takiego elementu, dostęp do niektórych mają również inne moduły (np. Dialog ma dostęp do questów żeby móc zmieniać ich stan).


@hfjh:

- nie używam żadnej biblioteki do gui więc będę musiał w takim razie sam doskrobać jakieś małe okienko ostrzegające jeśli wartość przedmiotów gracza jest większa od NPC
- masz rację, to mogłoby być bardziej realistyczne, choć na razie nie mam jeszcze pomysłu jak takie ograniczenie zrobić - ale niewykluczone że będzie to w którejś z przyszłych wersji
- dlatego właśnie dodałem alternatywną metodę przejścia gry w przypadku braku punktów nauki, zamiast okradać skarbiec - pogadaj z Darenem w mieście :)

- nie wykluczam opcji na Linuksa, ale najpierw muszę go zainstalować i zaznajomić się z nim trochę, potem dostosować kod (zmienić bibliotekę okienek, zadbać o case-sensitivity we wszystkich nazwach) i wtedy dopiero coś się może udać ;)
- odsyłam do lektury ReadMe, jest tam też o narzędziach z których korzystałem :)

Pozdrawiam.