26

(8 odpowiedzi, napisanych Fabryka - 8bit)

Hej,

Jakiś czas temu informowałem, że pracuję nad 8bitowym RPGiem ("Mini-Crawl", który ostatecznie stał się "Wiedźminem") . Projekt w wolnych chwilach powstaje, ale gra nie jest tak grywalna, jak bym chciał...
Dlatego czekając na inspirację tymczasowo go wstrzymałem i prezentuję wersję roboczą innej gry, którą piszę na małe Atari.
"His Dark Majesty" to gra pisana w C (CC65+asm). Jest to turowa gra taktyczna typu "Advance Wars", czyli dwie strony konfliktu wyrzynają się na mapie 2D. Jeżeli ktoś grał w "Reign of Swords" na Iphonie, to słusznie zauważy podobieństwa w jednostkach :) Również w podobny sposób chciałbym rozwiązać kwestię kampanii na jednego gracza i ekonomii w grze (chyba, że ktoś podrzuci inny pomysł).

Co jest zrobione? Zrobiony jest właściwie cały "silnik" i większość sztucznej inteligencji. Przy ocenie sytuacji przez AI nie uwzględniane są jedynie specjalne cechy jednostek (typu "first strike").

Demo to plik wykonywalny dla Windows, który działa w trybie tekstowym. Docelowo chciałbym mieć jednak grafikę w stylu: http://www.atarimania.com/detail_soft.p … ON_ID=8635

Binarki przekompilowane z różnymi układami sterowania oraz źródła wrzuciłem na http://www.alamak0ta.republika.pl/hdm.zip

Podobnie jak w przypadku Wiedźmina - szukam chętnych do współtworzenia. Mogę zająć się silnikiem gry, ale na pewno przydałaby się osoba znająca się na programowaniu grafiki czy dźwięku.

27

(9 odpowiedzi, napisanych Programowanie - 8 bit)

1.20
- MADS code profiler works on labels now, not on procedures only, which has much more sense.
- MADS v1.7.3 compatibility added. By default it worked with 1.8.4.
- MADS example Tetris changed to Mandelbrot.

Przykład z MADSa - http://www.alamak0ta.republika.pl/mads.png

28

(7 odpowiedzi, napisanych Programowanie - 8 bit)

eru napisał/a:

Klasyczną metodą jest też zrobienie map 256-bajtowej szerokości - jeśli nie używasz całej strony, może da się użyć pozostałej części do czegoś innego.
Wszystko zależy jak bardzo chcesz to zoptymalizować.

256 bajtów szerokości to ciut za dużo :-)
Dzięki za pomysły, są w zupełności wystarczające.

Hej,

Zacząłem optymalizować krytyczny pod względem szybkości fragment kodu w mojej grze, ponieważ CC65 generuje kod wyjątkowo brzydki.
Pytanie - w jaki sposób najszybciej można wykonać poniższą operację? ASMa 6502 w miarę znam, ale nie znam sztuczek optymalizacyjnych przy pisaniu w nim...
Chodzi o równoważnik asemblerowy kodu w C: 

if (Map[x+y*MAP_SIZE_X]==TILE_WALL)
      shadow=TRUE;

MAP_SIZE_X mogę mieć dowolne, np. 32 gdyby przesunięcia bitowe były w stanie kod przyspieszyć.
TILE_WALL też mogę mieć dowolne, ale najlepiej, gdyby było to 0 lub 1.
Ponieważ MAP_SIZE_Y też mogę wybrać (aktualnie 32), może warto przeliczyć wskaźniki dla poszczególnych Map+y*MAP_SIZE_X i wrzucić je na stronę zerową?

      00041Ar 1               ; if (Map[x+y*MAP_SIZE_X]==TILE_WALL)
      00041Ar 1               ;
      00041Ar 1  A0 04        L00BE:    ldy     #$04
      00041Cr 1  A2 00            ldx     #$00
      00041Er 1  B1 rr            lda     (sp),y
      000420r 1  20 rr rr         jsr     pushax
      000423r 1  A0 05            ldy     #$05
      000425r 1  B1 rr            lda     (sp),y
      000427r 1  20 rr rr         jsr     pushax
      00042Ar 1  A9 05            lda     #$05
      00042Cr 1  20 rr rr         jsr     tosshlax
      00042Fr 1  20 rr rr         jsr     tosaddax
      000432r 1  18               clc
      000433r 1  69 rr            adc     #<(_Map)
      000435r 1  85 rr            sta     ptr1
      000437r 1  8A               txa
      000438r 1  69 rr            adc     #>(_Map)
      00043Ar 1  85 rr            sta     ptr1+1
      00043Cr 1  A0 00            ldy     #$00
      00043Er 1  B1 rr            lda     (ptr1),y
      000440r 1  C9 01            cmp     #$01
      000442r 1  D0 02            bne     L00C3
      000444r 1               ;
      000444r 1               ; shadow=TRUE;
      000444r 1               ;
      000444r 1  91 rr            sta     (sp),y

Źródła tosshlax z CC65 są tu:
http://svn.xp-dev.com/svn/gideonz_1541U … time/shl.s

30

(9 odpowiedzi, napisanych Programowanie - 8 bit)

News nie zasługuje pewnie na nowy wątek, ale dodałem dwie przydatne funkcjonalności:
- Profilowanie kodu skompilowanego MADS
- Profilowanie kodu "w stylu C" - po instrukcjach C, nie asma.
http://www.alamak0ta.republika.pl/profiler.html

31

(9 odpowiedzi, napisanych Programowanie - 8 bit)

Pytałem, czy ktoś chce, bo nie wiem, czy kogokolwiek projekt zainteresuje :-)
www.alamak0ta.republika.pl/Atari800WinProfiler.zip
Jest tam binarka, źródła i przykład używania. Aktualnie profiler korzysta z formatów plików wygenerowanych przez asembler i linker CC65. Nic nie stoi na przeszkodzie, aby korzystał z wygenerowanych przez XASMa, MADSa, lub cokolwiek innego.
Czekam na komentarze.

32

(9 odpowiedzi, napisanych Programowanie - 8 bit)

Hej,

Napisałem dodatek do Atari800Win - Profiler kodu wygenerowanego przez CC65 wraz z "podglądem źródeł".
Profilowanie odbywa się na podstawie wygenerowanych plików .lst i .label.
http://img10.imageshack.us/img10/1729/profilerr.png
Z tego powodu kody w C nie są potrzebne i można go używać też przy pisaniu w ASMie.

Dodałem komendy w Monitorze:
PSTART [1] - uruchomienie profilera. Parametr 1 powoduje profilowanie kodu wykonywanego z całej pamięci, nie tylko znanego z plików .lst. Przydatne przy nie korzystaniu wyłącznie z C.
PEND/PSTOP - zatrzymanie i zapisanie wyników.
PRESET - wyzerowanie liczników profilera (automatyczne przy resecie)

Jako GUI wykorzystałem lekko przerobiony profiler Sleepy.
Mój profiler działa podobnie jak Sleepy - co określony interwał sprawdza na jaki adres wskazuje rejestr PC, a następnie przelicza to na postać czytelną. Aktualnie działa na GetTicksCount, ale warto by go zsynchronizować z czasem emulowanego Atari, co umożliwiałoby profilowanie kodu podczas Full Speed.
Inną możliwością jest zliczanie wszystkich wykonywanych instrukcji, ale nie uwzględniałoby to cykli procesora. Wynik precyzyjnie pokazuje za to która instrukcja ile razy została wykonana.

Ktoś jest zainteresowany binarką, źródłami, diffem?

33

(20 odpowiedzi, napisanych Fabryka - 8bit)

Nowa wersja do ściągnięcia:
http://alamak0ta.republika.pl/minicrawl3.zip
Są tam przekompilowane wersje na Atari, C64, NES i Windows z użyciem klawiatury i joysticka oraz kod źródłowy.
W nowej wersji:
Dodany inwentarz, możliwość podnoszenia, zostawiania, zakładania przedmiotów (sterowanie z klawiatury lub joy).
Dodane podstawowe mechanizmy walki z użyciem broni i bez (balans walki pozostał do modyfikacji).
Dodany wpływ szybkości potworków na liczbę czynności, które mogą zrobić podczas tury.
Dodana konsola tekstowa.

Wersje na Atari i C64 są WOLNE.
I takie będą, póki nie zacznę optymalizować i przepisywać fragmentów na asm.
A może ktoś z forumowiczów mi w tym pomoże? :-)

34

(20 odpowiedzi, napisanych Fabryka - 8bit)

Ależ się namęczyłem z tą zmianą zestawu znaków... Dla przyszłych ludzi zaczynających z CC65 dwie małe informacje:
- Pod koniec pamięci jest runtime, więc obniżenie dostępnej pamięci jak jest we wszystkich tutorialach powoduje mazanie po kodzie. Przealokować go gdzieś inaczej nie jest tak prosto...
- Obniżenie pamięci o mniej też powoduje losowe zwiechy, ponieważ CC65 zakłada, że dostępna liczba pamięci się nie zmieni.
- Mało gdzie jest napisany taki drobny szczegół, że dostęp do zestawu znaków musi być wyrównany do 512 bajtów...
- Teoretycznie powinno się dać wyrównać bufory w plikach asm za pomocą .align, ale wyrównanie jest maks. do 256 bajtów.

Ostatecznie z przekopiowania znaków zrezygnowałem. Jak będzie na koniec miejsce w pamięci, to zacznę się bawić.
Zamieszczam poweekendowy progress:
http://www.alamak0ta.republika.pl/minicrawl2.zip
Na funkcję grafiki zrobiłem wrappery zgodne z biblioteką Curses wraz z podwójnym buforowaniem, dzięki czemu ekran przestał być odrysowywany. Dzięki temu mogę też kompilować i wykonywać kod natywnie pod Windows, co znacznie ułatwia szukanie i poprawianie bugów. Wczoraj zaś natrafiłem na kompilator z88dk. W nim na dostęp do ekranu też dodałem wrappery zgodne z curses i udało mi się skompilować gierkę na Spectrumnę :D
W grze można już chodzić i powalczyć z potworkami, ale jest to maksymalnie uproszczone - nie można na razie używać broni ani innych przedmiotów. Statystyki wrogów już na to czekają, więc umiera się szybko.
Są też losowo generowane przedmioty i sporo rzeczy w środku niewidocznych jeszcze dla użytkownika.
Pobawiłem się też  trybami graficznymi >0 i efekt jest całkiem zadowalający :) Gra działa szybciej, bo jest mniejszy ekran do kopiowania, pole gry jest czytelniejsze przy większej czcionce, może być w prosty sposób kolorowe, zaś na dole pozostanie konsola tekstowa na komunikaty.
Czyli ogólnie może powstać z tego coś fajnego.

35

(20 odpowiedzi, napisanych Fabryka - 8bit)

Zmiany generatora znaków to dla mnie zbyt dużo pracy... i nauki. Ostatni raz na Atari programowałem ze 20 lat temu :-)
Do ADOMa to był mój projekt PoC: http://www.alamak0ta.republika.pl/adomhack.html

Page flipping powinien być prosty przy jednym dl.

Grafika wbrew pozorom wiele nie zmienia. W oryginalnego Dungeon Crawl (wersja Stone-Soup) grywam głównie w wersję graficzną.
Klimat jest zachowany, zaś potworki bardziej czytelne. W przypadku tak małej rozdzielczości, jaką mają kompy 8 bitowe, pozostanę raczej przy literkach.

36

(20 odpowiedzi, napisanych Fabryka - 8bit)

a było z gotowym kodem to robiącym? :)

37

(20 odpowiedzi, napisanych Fabryka - 8bit)

I tu i tu muszę rysować do bufora. W przypadku page flipping jak rozumiem jedynie zmieniam adres pamięci ekranu (2 bajty), zaś przy kopiowaniu będzie kilkaset bajtów pamięci ekranu. W artku wskazanym przez xxl jest:
"Nie pozostaje nic innego, jak zmusić ANTIC, by wyświetlał dane bezpośrednio w kodach ATASCII. Jak? Wiem, ale nie powiem. A może ktoś z Was sam zgadnie?". Czy chodzi o zamianę miejscami poszczególnych fontów?

38

(20 odpowiedzi, napisanych Fabryka - 8bit)

dzięki.

39

(20 odpowiedzi, napisanych Fabryka - 8bit)

Potestowałem jeszcze i wydaje mi się, że bez ASMa w time-critical code się nie obejdzie... :-/ Próbowałem bezpośredniego dostępu do pamięci ekranu na Atari i C64. Na Atari przyspieszenie w stosunku do conio jest duże. Na C64 prawie niewidoczne.
Natrafiłem za to na nieznany mi problem :-)
W pamięci ekranu znaki mają inną reprezentację niż w tabelach ASCII/ATASCII/PETSCII, które przynajmniej w 0x20-0x5E powinny się zgadzać... Nakieruje mnie ktoś na artykuł o tym lub rzuci słówko wyjaśnienia?
Będzie się trzeba też zająć PageFlippingiem, bo odrysowywanie jest męczące dla oczu.
Ktoś chętny do pomocy? :-)

40

(20 odpowiedzi, napisanych Fabryka - 8bit)

Hej,

Na początek witam wszystkich.
Kilka dni temu natrafiłem na kompilator cc65 i postanowiłem sprawdzić jak działa. Działa, więc trzeba było zabrać się za jakiś projekt...
Popularność komputerów 8 bitowych jest prawdopodobnie porównywalna z popularnością gier roguelike, czyli niewielka.
Gdyby więc brak popularności przemnożyć, mogłby wyjść projekt, który wyjątkowo mało kogo zainteresuje :-)
Tak oto zrodził się u mnie pomysł stworzenia 8 bitowej wersji gry Dungeon Crawl, czyli remake "w drugą stronę".
Od pomysłu do czynów nie daleko i efekt dwóch wieczorów można znaleźć tu:
www.alamak0ta.republika.pl/minicrawl.zip

W założeniach ma to być okrojona wersja pełnej gry, sterowana joystickiem/klawiaturą.

Aktualnie zrobione jest:
- Środowisko do kompilacji - Visual Studio + WinVice, ze względu na wygodę.
- Definicje broni, zbroi, potworów.
- Dwa generatory podziemi - standardowy oraz jaskinia. Zapewniona przechodniość.
- Losowo rozmieszczanie potworów, zależne od poziomu. Gra nie będzie dawała możliwości wyboru gałęzi, jak w oryginale.
- Podstawowa struktura gry - gracz, potwory
- Field of View - dwa rodzaje - w tym jeden rzucający cienie typu Ultima4.

Największy problem mam z prędkością funkcji rysujących z conio.h, co można zobaczyć w załączonym archiwum. Na Atari i C64 są koszmarnie wolne. Pod NES działają przyzwoicie.
Próbowałem używać dodatkowego bufora + refresh w stylu biblioteki Curses, ale w centrowanym FOV lub przy wykorzystaniu rzucania cieni zmian do narysowania jest zbyt dużo.

Dwa pytania:
- Czy jest ktoś chętny do pomocy w tym projekcie? Każda pomoc się liczy :-)
- Czy ma ktoś gotowe procedurki asm do szybszego rysowania znaków (dowolne platformy wspierane przez cc65)?

pozdrawiam,
Jakub