Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Neues Spiel: Deepspace » Themenansicht

Autor Thread - Seiten: -1-
000
22.04.2022, 17:39 Uhr
RobertK

Avatar von RobertK

Hallo Leute,

Ich möchte euch mein drittes plattformübergreifendes Spiel vorstellen, das ich mit dem z88dk-C-Compiler entwickelt habe: es ist das Remake eines Eintipp-Spiels namens "Deepspace", das ich Mitte der 1980er auf dem Atari 800XL eines Freundes gespielt habe.

Das Spielprinzip ist simpel: man ist mit seinem Raumschiff in ein rechteckiges Kraftfeld geraten, und der Treibstoff geht dramatisch schnell zu neige. Man muss nun versuchen, rechtzeitig die Tankstelle ("F" wie Fuel) zu erreichen. Glücklicherweise sind die Wände des Kraftfelds elastisch und lassen das Raumschiff unbeschadet abprallen. Doch das gilt nicht für die im Kraftfeld auftauchenden Asteroiden, ein Zusammenprall mit diesen endet immer tödlich. Fazit: man muss also versuchen, immer wieder aufzutanken und solange wie möglich zu überleben.

Derzeit werden 36 Zielsysteme unterstützt, davon dürften folgende für euch interessant sein:

Z1013 mit KRT-Grafik-Erweiterung
Z9001 (KC 85/1, KC 87) mit KRT-Grafik-Erweiterung
KC 85/2-5 und HC 900 (leider funktioniert es derzeit nur auf den Modellen KC 85/2 und KC 85/3)
Hübler Grafik-MC

Für den Z1013 und den Z9001 habe ich nur für Demo-Zwecke jeweils eine eigene Version mit Block-Grafik erstellt, die ohne KRT-Grafikerweiterung läuft. Die Spielbarkeit hält sich da aber in Grenzen.

Ihr könnt das Spiel und den Source-Code auf meiner Sourceforge-Seite herunterladen:

https://sourceforge.net/projects/deepspace-rk/

Ich darf euch bitten, es nach Möglichkeit auch auf echter Hardware auszuprobieren, ich habe alles bisher nur im Emulator testen können.

Hier noch ein paar Screenshots:

Z1013 KRT


Z9001 KRT


KC 85/2-5


Hübler Grafik-MC


Z1013 Standard (nur für Demo-Zwecke)


Z9001 Standard (nur für Demo-Zwecke)

Dieser Beitrag wurde am 22.04.2022 um 17:46 Uhr von RobertK editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
27.04.2022, 15:57 Uhr
phil91

Avatar von phil91

Über neue Spiele freue ich mich immer, vielen Dank dafür.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
27.04.2022, 16:27 Uhr
ralle



Der KC85/4 hat einen anderen Bildaufbau, vermutlich wird es das sein, warum es nicht geht.
--
Gruß Ralle

Wenn Sie dazu neigen, Bedienungsanleitungen zusammen mit dem Verpackungsmaterial wegzuwerfen, sehen Sie bitte von einem derart drastischen Schritt ab!...
... Nachdem Sie das Gerät eine Weile ausprobiert haben, machen Sie es sich am besten mit dieser Anleitung und ihrem Lieblingsgetränk ein oder zwei Stunden lang in Ihrem Sessel bequem. Dieser Zeitaufwand wird Sie dann später belohnen...

aus KENWOOD-Bedienungsanleitung TM-D700
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
27.04.2022, 17:17 Uhr
Bert



Hallo Robert!

Ich habe versucht das Spiel zu übersetzen, bekomme aber die folgenden Fehler:

Quellcode:

> zcc +kc -lndos -create-app -pragma-redirect:fputc_cons=fputc_cons_generic -pragma-define:CRT_ENABLE_STDIO=0 -o Deepspace_KC85_2-5 deepspace.c

deepspace.c:694:7: warning: Implicit definition of function 'drawb' it will return an int. Prototype it explicitly if this is not what you want. [-Wimplicit-function-definition]
deepspace.c:698:7: warning: Implicit definition of function 'draw' it will return an int. Prototype it explicitly if this is not what you want. [-Wimplicit-function-definition]
deepspace.c:724:8: warning: Implicit definition of function 'plot' it will return an int. Prototype it explicitly if this is not what you want. [-Wimplicit-function-definition]
deepspace.c:1027:6: warning: Implicit definition of function 'clg' it will return an int. Prototype it explicitly if this is not what you want. [-Wimplicit-function-definition]
deepspace.c:1069:14: warning: Implicit definition of function 'getmaxx' it will return an int. Prototype it explicitly if this is not what you want. [-Wimplicit-function-definition]
deepspace.c:1070:14: warning: Implicit definition of function 'getmaxy' it will return an int. Prototype it explicitly if this is not what you want. [-Wimplicit-function-definition]
deepspace.c:1401:14: warning: Implicit definition of function 'undraw' it will return an int. Prototype it explicitly if this is not what you want. [-Wimplicit-function-definition]
Error at file 'deepspace.c::ShowIntroScreen' line 776: symbol '_joystick_type' not defined
Error at file 'deepspace.c::main' line 969: symbol '_joystick_type' not defined
Errors in source file ..../z88dk/lib/config/../..//lib/target/kc/classic/kc_crt0.asm:
Error at file 'deepspace.c::ShowIntroScreen' line 776: symbol '_joystick_type' not defined
                   ^ ----               printk(INTRO_LINE1_BOLD,27,27);
Error at file 'deepspace.c::main' line 969: symbol '_joystick_type' not defined
                   ^ ----


Was habe ich falsch gemacht?

Viele Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
27.04.2022, 17:23 Uhr
RobertK

Avatar von RobertK

@Bert: ich vermute, du verwendest eine ältere z88dk-Version. Hol dir den aktuellen nächtlichen Build:
http://nightly.z88dk.org/
Der Support für den virtuellen Joystick für den KC (und noch ein paar andere Rechner) ist nämlich erst im Februar 2022 hinzugefügt worden.

@Ralle:
> Der KC85/4 hat einen anderen Bildaufbau, vermutlich wird es das
> sein, warum es nicht geht.

Erklär mir bitte kurz, wo die Unterschiede liegen, ich würde versuchen, das dem z88dk-Entwickler weiterzugeben. Derzeit bekommt man im Emulator nur vertikale Streifen, wenn man ein z88dk-Grafikprogramm auf einem /4 oder /5 startet.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
27.04.2022, 17:24 Uhr
Bert




Zitat:
ralle schrieb
Der KC85/4 hat einen anderen Bildaufbau, vermutlich wird es das sein, warum es nicht geht.


Nein, prinzipiell geht es, aber irgendwo bei Spielbeginn wird in den Hires-Modus geschaltet. Vermutlich ausgelöst durch ein ESC-'A'...

Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
27.04.2022, 18:11 Uhr
Bert




Zitat:
RobertK schrieb
Hol dir den aktuellen nächtlichen Build:
http://nightly.z88dk.org/


Ich hatte eigentlich die aktuelle Version aus dem github-Repository geholt.
Aber ich hatte vergessen, die neu zu bauen...

Jetzt geht es und es gibt nur noch die warnings.

Danke,
Bert

Dieser Beitrag wurde am 27.04.2022 um 18:12 Uhr von Bert editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
27.04.2022, 18:57 Uhr
ralle




Zitat:
RobertK schrieb

@Ralle:
> Der KC85/4 hat einen anderen Bildaufbau, vermutlich wird es das
> sein, warum es nicht geht.

Erklär mir bitte kurz, wo die Unterschiede liegen, ich würde versuchen, das dem z88dk-Entwickler weiterzugeben. Derzeit bekommt man im Emulator nur vertikale Streifen, wenn man ein z88dk-Grafikprogramm auf einem /4 oder /5 startet.



Frag am beste Mario Leubner. Fakt ist, das Programme für den /3er auf dem /4 nicht mehr gehen, wenn diese Hardwarenah programmiert sind. Boulder|Dash von F.Klemm hat deshalb 2 Zeichenbildtabellen.
--
Gruß Ralle

Wenn Sie dazu neigen, Bedienungsanleitungen zusammen mit dem Verpackungsmaterial wegzuwerfen, sehen Sie bitte von einem derart drastischen Schritt ab!...
... Nachdem Sie das Gerät eine Weile ausprobiert haben, machen Sie es sich am besten mit dieser Anleitung und ihrem Lieblingsgetränk ein oder zwei Stunden lang in Ihrem Sessel bequem. Dieser Zeitaufwand wird Sie dann später belohnen...

aus KENWOOD-Bedienungsanleitung TM-D700
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
27.04.2022, 19:51 Uhr
Bert



Der Bildaufbau ist hier kein Problem. Schau Dir das Spiel doch mal genau an!

Die Umschaltung in die Hires-Mode wird hier von Zeile 706 getriggert:

Quellcode:

        printk(SCORE_LINE,numberOfShips,score);        


Offensichtlich steckt in SCORE_LINE noch eine ANSI-Sequenz drin.
Leider ist das c-Programm schwierig zu debuggen, weil es für 100te Plattformen Anpassungen enthält.

Du kannst mit JKCEMU einen Haltepunkt auf 12E4 setzen. Dort gibt es einen Call nach 21A9 (printk):

Quellcode:

printk                          = $21A9 ; addr, public, , printk, code_clib, printk.asm:22



Danach ist der hires-Mode aktiv.

@RobertK: Aus welcher Bibliothek kommt die printk?

Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
27.04.2022, 20:22 Uhr
RobertK

Avatar von RobertK

Hmm, ich habe ein wenig herumprobiert und glaube nicht, dass es daran alleine liegt. Bei meiner Megatoll-Demo tritt das Problem nämlich zu einem Zeitpunkt auf, wo nur Linien gezeichnet werden, die Textausgabe davor klappt fehlerfrei.

In SCORE_LINE in Deepspace sollten nur %d drinnen sein, da am KC keine Fettschrift unterstützt wird. Das wird hier definiert:

...
#elif defined(__KC__) ...
#define SCORE_LINE "Ships: %d Score: %d"
#define SCORE_LINE_HI "Hi: %d"

printk() kommt aus stdio.h. Es macht das gleiche wie printf() - die genauen Unterschiede kenne ich nicht, aber das habe ich als Tipp bekommen, um Speicher zu sparen: man verwendet einfach printk() statt printf() und kompiliert mit dem Parameter -pragma-define:CRT_ENABLE_STDIO=0. Ohne diesem Trick hätte ich das Spiel auf manchen Systemen nie zum Laufen gebracht.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
27.04.2022, 22:45 Uhr
Bert



Ich konnte das Problem etwas einkreisen. Die Auswirkungen sind tatsächlich bei dem angegebenen printk zu spüren. Aber die Ursache liegt zeitlich kurz vorher: die Funktion draw, die in Zeile 694 aufgerufen wird:

Quellcode:

        draw(0,yMax,xMax,yMax);    // draw initial fuel bar


Die Funktion verbiegt den Zeiger auf IX. Und das darf man beim KC85 nicht ungestraft machen.
Das Register wird von Interruptroutinen genutzt und ist auf diesem System quasi tabu.

Ich habe mal an den Stellen mit der Tankanzeige etwas nachgeholfen:

Quellcode:

      #asm
      push iy
      #endasm
        draw(...  bzw. undraw(...
      #asm
      pop iy
      #endasm



Damit scheint es zu klappen:


Aber den eigentlichen Fehler, warum IX in draw/undraw verändert wird, sollte man nochmal suchen.

Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
27.04.2022, 23:09 Uhr
RobertK

Avatar von RobertK

Tatsächlich, mit dem Push und Pop rund um jedes draw/undraw funktioniert es, und zwar auf jedem KC-Modell. Vielen Dank für die Forschungsarbeit!

Allerdings wird es dadurch seltsamerweise deutlich langsamer, man hat nun einen "Ruckler" bei jeder Verringerung der Treibstoffanzeige (ich habe beide Versionen am KC85/2 verglichen). Ich hätte nicht erwartet, dass die beiden Push- und Pop-Befehle so aufwändig sind??

Wie auch immer, ich werde deine Erkenntnisse dem z88dk-Entwickler weitergeben, damit sollte er das eigentliche Problem hoffentlich lösen können.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
01.05.2022, 12:45 Uhr
RobertK

Avatar von RobertK

Der Entwickler (Dom) hat das Problem nun gelöst, jetzt funktioniert es auch ohne Workaround auf allen KC85-Modellen 2 bis 5. Ich habe das Paket auf meine Sourceforge-Repo bereits aktualisiert, ich musste das Spiel nur mit dem aktuellen Nightly Build von z88dk neu kompilieren.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek