[C++] Otvorena reimplementacija Nitroplus igara

C, C++, Java, PHP, Ruby...

Moderator/ica: Moderatori/ce

Pravila foruma
U naslovu teme unutar uglatih zagrada navesti o kojem jeziku je riječ. Primjer: [Java]
Odgovori
krofna
Postovi: 102
Pridružen/a: 17 tra 2013, 19:43
Spol: M
OS: Debian GNU/Linux

[C++] Otvorena reimplementacija Nitroplus igara

Post Postao/la krofna »

tl;dr verzija ovog posta:
jel' se da kom' pomoć' anime friku da napravi klonove vlasničih igara?

duga verzija ovog posta:
Zadnja 2 tjedna nisam uopće bio aktivan na forumu, ali zato sam radio na novom projektu. :twisted:

Odlučio sam reimplementirati Nitroplus igre, točnije vizualne novele. Za one koji nisu fanovi Animea i japanske kulture općenito, Nitroplus je tvrtka koja pravi vizualne novele bazirane na/na kojima su bazirani Anime. Vizualna novela je tip igre u kojemu igrač preuzima ulogu glavnog lika u Animeu i čita priču (koja je najčešće dijalog s drugim likovima), sluša odličnu glazbu, povremeno gleda kratke filmove i pravi odluke koje uzrokuju grananje priče (koje naravno, može voditi dobrim i lošim završetcima). Zanimljivost je najviše u tome što ima jako puno grananja. No, evo screenshot jedne takve igre da dobijete bolju ideju:

http://i.imgur.com/zTlnkY7.png

To je Steins;Gate pokrenut pomoću wine-a. Ne, nije potrebno poznavati japanski jezik za igranje. Postoji engleski prijevod. Ja samo volim vježbati japanski... Trenutno se fokusiram na reimplementiranje te igre, ali i ostale igre koje je ta tvrtka napravila su jako slične (tehnički gledano), pa vjerujem da ću jednim udarcem ubiti puno muha :D (Lista igara: http://en.wikipedia.org/wiki/Nitroplus )

U prvih nekoliko dana uspješno sam reverse engineero arhivni format i format binarnih (polu-kompajlanih) skripti koje izvršna datoteka igre interpreta. Napisao sam biblioteku za čitanje i pisanje tih fajlova:

libnpa: ( https://github.com/Future-Gadget-Resear ... ent/libnpa ) MIT licenca

Pomoću te biblioteke sam napisao i kolekciju alata za manipuliranje fajlovima igre:

nptools: ( https://github.com/Future-Gadget-Resear ... nt/nptools ) Trenutno nelicencirano
- npaextract: Raspakira ".npa" arhive
- npapack: Re-pakira folder u arhivu
- nsbparse: Pretvara binarnu skriptu u čitki kod
- nsbcompile: Kompajla izlaz nsbparse alata natrag u ".nsb" skriptu
- npinstall: Ovaj još nije napisan; planiram koristiti libunshield za instalaciju igre

... I počeo sam raditi na interpreteru binarnih skripti (koji se oslanja na libnpa). Još ne radi; od sutra počinjem ozbiljno na njemu raditi
UPDATE: Uspješno pokreće boot skriptu (prikazuje intro film): http://i.imgur.com/vmJsKLl.png

libnpengine: ( https://github.com/Future-Gadget-Resear ... ibnpengine ) GNU LGPL licenca

... I za kraj jedna izvršna datoteka (Steins;Gate) koja pokreće interpreter:

steins-gate: ( https://github.com/Future-Gadget-Resear ... teins-gate ) GNU GPL licenca

Da, da... Jako je modularno; u duhu unixa ;)
Eh sada na budućnost projekta, probleme (TODO) i poziv u pomoć...

Iako znam format binarnih skripti (u kojima, na sreću, su i stringovi s imenima funkcija i varijabli), postoji oko 200 vrijednosti (pogledaj libnpa include/nsbmagic.hpp) uz koje nema nikakvog naziva. To su pozivi na funkcije koje interpreter treba podržavati. Neke sam skužio (npr LoadMovie, StopMusic...) ali veliki broj nisam. To je lagan posao ali iziskuje puno vremena. Više-manje se svodi na uspoređivanje onoga što vidiš/čuješ (opaziš?) u igri i skripte u tekstualnom obliku. Vjerojatno je kompajlanje prilagođenih skripti isto dobra ideja...

Isječak iz ogromne (7200 linija) skripte (UNK je skraćeno za Unknown):

Kod: Označi sve

SetText();
UNK6();
TypeBegin();
UNK6();
TextBoxDelete();
UNK6();
SetParam(INT, 9000);
SetParam(STRING, #000000);
SetParam(INT, 533);
SetParam(STRING, null);
SetParam(STRING, true);
ColorOut(9000, #000000, 533, null, true);
UNK6();
SetParam(STRING, @ムービー*);
UNK18(@ムービー*);
UNK6();
SetParam(STRING, ムービー);
SetParam(INT, 0);
SetParam(INT, 0);
SetParam(STRING, null);
SetParam(STRING, true);
UNK19(ムービー, 0, 0, null, true);
UNK6();
SetParam(STRING, BGBUF1);
UNK18(BGBUF1);
UNK6();
SetParam(STRING, BGBUF1);
SetParam(INT, 100);
SetParam(STRING, cg/bg/BG_BLACK.jpg);
BgLoad(BGBUF1, 100, cg/bg/BG_BLACK.jpg);
U libnpa doc/ direktoriju sam dokumentirao hrpu funkcija, globalnih varijabli i konstanti. Dokumentacija je i dalje u ranoj fazi.

Trenutno nemam ni build system jer nikada nisam naučio pisati configure skripte... Kompajlam pomoću sh skripte koju me sramota uploadati na github :oops .

Neki tehnički detalji:
Koristim boost za filesystem, GNU libiconv za pretvaranje japanski-kodiranih skripti (SHIFT-JIS) u UTF-8. SFML za multimediju (prozor, glazba, crtanje) i jednu SFML ekstenziju, sfeMovie koja ugrađuje ffmpeg u SFML.

Cijeli projekt je trenutno mršavih 1500 linija koda (Ne brojeći prazne linije, komentare i dokumentaciju naravno) i treba mi pomoć da ga završim u razumnom vremenu (prije kraja godine bi bilo lijepo).
krofna
Postovi: 102
Pridružen/a: 17 tra 2013, 19:43
Spol: M
OS: Debian GNU/Linux

Re: [C++] Otvorena reimplementacija Nitroplus igara

Post Postao/la krofna »

U slučaju da nekoga zanima, jučer sam označio verziju 0.1.1 svih komponenti.
To je sedmo izadnje (iako ranije nisam objavljivao na ovom forumu).

Što radi:
- Videi, bez efekata :(
- Teksture, svi efekti (move, zoom, fade, mask, blur, smooth)
- Zvuk, sav (pozadinska, specijalni efekti i glasovi likova)
- Tekst, bez efekata :(
- Slijedeće poglavlje (skripta) je učitano nakon što jedno završi
- Alati dekriptiraju, ekstraktiraju i parsaju fajlove svih igara osim Robotic;Notes (jer nemam PS3)

Što ne radi:
- Animirani likovi
- Okabeov mobitel (I ostale interaktivne stvari)
- Menu/opcije/save&load
- ??? (puno detalja još nije reverse engineerano/testirano)

Pošto su najvažnije stvari implementirane, igra je igriva, ali ima jako puno bugova... Ipak, moja implementacija ima i neke prednosti:
- Koristi upola manje RAM-a** (Može i bolje, samo se još ne fokusiram toliko na optimizaciju; čak postoji i poznati memory leak...)
- Oko 10 puta manji CPU usage** (ponajviše zbog gstreamera)

** Testirano na Windows 7 i wine na Debian 8; u oba slučaja originalni program gubi bitku za barem toliko
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [C++] Otvorena reimplementacija Nitroplus igara

Post Postao/la kepica »

obožavam ovakve projekte.
bravo krofna.
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
krofna
Postovi: 102
Pridružen/a: 17 tra 2013, 19:43
Spol: M
OS: Debian GNU/Linux

Re: [C++] Otvorena reimplementacija Nitroplus igara

Post Postao/la krofna »

Jučer sam označio Verziju 0.1.2: Interpreter je znatno poboljšan i mnoge nove funkcije su podržane.
- Najvažnija posljedica poboljšanja su likovi koji se napokon pojavljuju** (pogledaj screenshot)
- Popravljen je "text wrapping" u engleskom prijevodu
- nsbparse alat sada indentira skripte

** Animacije pokreta, očiju te usana još ne rade. Potrebno je implementirati funkciju koja stvara novi script thread.
kepica je napisao/la:obožavam ovakve projekte.
bravo krofna.
Hvala :) Drago mi je da ti se sviđa.

EDIT: Na preporuku korisnika reddita, napravio sam IRC kanal za projekt, #FGRE na irc.freenode.net . Tamo možete dobiti tehničku podršku. Također mi je netko rekao da pakira igru za Arch Linux.
Odgovori