4XCPC, ein von Ascendancy inspiriertes 4X-Spiel für den Amstrad CPC 6128

Hi! Ich habe eine Version v1.1 meines 4X-Spiels erstellt, die eine kurze Hilfemeldung hinzufügt. Es war in der Tat etwas holprig, wenn man „Ascendancy“ noch nie zuvor gespielt hat.

Code & Logic Involvement

Hybrid (KI-generierte Schlüsselroutinen; von Hand zusammengestellt/bearbeitet)

Assets & Pipeline Involvement

Story, Dialoge oder Handbuchtexte

Project Notes & Prompts

Claude Code + Arkos Tracker + RASM + einige eigene, in Go geschriebene Tools zum Bearbeiten von Assets, Fuzzen und Builden des Spiels.

Dieses Spiel macht intensiven Gebrauch von Split-Rastern, um im Mode 1 viele Farben darzustellen. Ein echter CPC oder ein präziser Emulator ist erforderlich.

2 „Gefällt mir“

4xcpc.dsk (199,8 KB)

Dieser „Im Browser spielen“-Button ist klasse! Passiert das automatisch, wenn eine DSK gepostet wird?

Die Split-Raster kommen super rüber.

Ja. Du musst die Datei einfach nur in das Nachrichtenfeld ziehen.

1 „Gefällt mir“

Falls es jemanden interessiert:

  • Das DSK wird direkt von einer Go-Bibliothek generiert, die ich vor ein paar Jahren geschrieben habe. Damit lassen sich Binärdaten direkt auf beliebigen Sektoren platzieren. Der |cpm-Loader verfügt über eine Tabelle mit dem Speicherort der Daten und deren Zieladresse im CPC-RAM (Bänke, Offset). Dadurch wird die Verwendung des Katalogs vermieden, die sonst den Kopf jedes Mal an den Anfang der Diskette zurückfahren lässt.
  • Hinter den Split-Rastern steckt eine CPC-Emulationsbibliothek, die von Claude unter Verwendung von GitHub - koron-go/z80: Z80 emulator written in Go · GitHub geschrieben wurde. Sobald die NOPs auf einem echten CPC kalibriert sind, ermöglicht dies automatische Unit-Tests der Split-Raster.
  • Musik und Tastatur werden vor dem Zeichenbereich verarbeitet, in dem die Raster auftreten. Das Ganze geschieht in konstanter Zeit, wobei für die Musik der FAP-Player verwendet wird.
  • Wenn der Bildschirm für die Zugberechnung des Gegners abgedunkelt (blanked) wird, wird die Musik wieder an die normalen CPC-Interrupts gekoppelt, um Ruckler zu vermeiden.
  • Es können alle 27 Farben gleichzeitig auf dem Bildschirm dargestellt werden. Jede Zeile hat eine Palette von 6 Farben. Na ja, eigentlich 5 – Schwarz ist fest eingestellt. Während des HSYNC (ca. 30 NOPs) werden 3 Pens gesetzt, danach werden Pen 1 und Pen 3 während des Zeichnens der Zeile erneut gesetzt. Das ermöglicht es, eine Farbe entweder in der linken oder in der rechten Spalte blinken zu lassen. Das linke Icon bleibt vom Blanking unberührt.
  • Ich denke, das ließe sich für jedes tabellenkalkulationsartige Spiel verwenden. Man kann damit eine Zeile blinken lassen, indem man pro Zyklus nur 8 Werte ändert.

Das Spiel ist in etwa 2 bis 3 Stunden machbar. Oder in ein paar Minuten, wenn man einfach nur Zeit verstreichen lässt, bis der Gegner gewinnt…

1 „Gefällt mir“

Ooooh, das sieht toll aus. Ich bin sehr an den technischen Details der Raster-Änderungen interessiert.

(D. h., ich möchte sie in meinen eigenen Produktionen verwenden)

Ich habe mir mit AceDL angeschaut, wie das im Spiel Le Fugitif gelöst wurde. Die grundlegende Idee ist, eine lange Liste von Stiften (Pens) zu erstellen, mit HL darauf zu zeigen und dann so etwas wie Folgendes zu haben:

    ; Hintergrundfarbe setzen
    ld e, 0x54
    out (c), 0
    out (c), e

    ld c, 0x01
    ld d, 0x02
    ld e, 0x03

display_loop:
    out (c), c
    outi
    inc b
    out (c), d
    outi
    inc b
    out (c), e
    outi
    
    nop
    ...
    nop
    
    dec a
    jp nz, display_loop


Jedes outi setzt die Farbe, auf die HL zeigt, in den ausgewählten Stift und inkrementiert diesen dann. Es ist sehr wichtig, danach ein inc b auszuführen, da outi das Register B dekrementiert.

Und davor muss man natürlich auf den VBL warten, um synchron zu werden.

    ; auf VBL warten
    ei ; Interrupts aktivieren (wir brauchen sie für den HALT)
    ld b,0xF5
novbl:
    in a,(c)
    rra
    jr nc,novbl

    halt ; wir sind 16 Zeilen vor dem Bildschirm synchron
    di ; und jetzt schalten wir die Interrupts bis zum Ende ab

    ; hier kann beliebiger Code mit exaktem Timing wie z. B. ein FAP-Player stehen. Oder jede Menge NOPs und Schleifen, um Zeit zu vertrödeln.

Und natürlich kann man outi;inc b mehrmals ausführen, um denselben Stift mehrfach während einer Zeile zu ändern – daher der Split.

Hm, stehe ich gerade auf dem Schlauch? Wie gibt man hier eigentlich seinen Senf dazu?

Im Spiel? Benutze die Pfeiltasten und die Eingabetaste, um einen Eintrag im Menü auszuwählen. Verwende dann die rot hervorgehobenen Buchstaben in den Verben für [Weiter]. Oder [Überspringen], um zum nächsten Ereignis zu springen (Bauabschluss, Bevölkerungswachstum, Forschung abgeschlossen …).

Vielleicht sollte ich einen Hilfebildschirm zur Steuerung hinzufügen. :thinking: