4XCPC, un gioco 4X ispirato ad Ascendancy per Amstrad CPC 6128

Ciao! Ho creato la versione v1.1 del mio gioco 4X, che aggiunge un breve messaggio di aiuto. In effetti era un po’ ostico se non avevi mai giocato ad Ascendancy prima d’ora.

Coinvolgimento per codice e logica

Ibrido (routine chiave generate dall’IA; assemblate/modificate da un umano)

Coinvolgimento per asset e pipeline

Storia, dialoghi o testo del manuale

Note di progetto e prompt

Claude Code + Arkos Tracker + RASM + alcuni strumenti personalizzati scritti in Go per modificare gli asset, fare fuzzing e compilare il gioco.

Questo gioco fa un uso massiccio di split-raster per visualizzare molti colori in modalità 1. È necessario un vero CPC o un emulatore accurato.

2 Mi Piace

4xcpc.dsk (199,8 KB)

Questo pulsante «Gioca nel browser» è fantastico! È automatico quando viene pubblicato un DSK?

I raster splittati si vedono benissimo.

Sì. Devi solo trascinare il file nel corpo del messaggio.

1 Mi Piace

Se a qualcuno interessa:

  • Il file DSK viene generato direttamente da una libreria Go che ho scritto qualche anno fa. Consente di posizionare dati binari direttamente su qualsiasi settore. Il loader |cpm ha una tabella che contiene la posizione dei dati e la relativa destinazione nella RAM del CPC (banchi, offset). In questo modo si evita l’uso del catalogo, che fa tornare la testina all’inizio del disco.
  • Gli split raster sono gestiti da una libreria di emulazione CPC scritta da Claude, basata su GitHub - koron-go/z80: Z80 emulator written in Go · GitHub . Una volta calibrati i NOP su un CPC reale, consente di eseguire unit test automatici degli split raster.
  • La musica e la tastiera vengono gestite prima dell’area di disegno, dove avvengono i raster. L’esecuzione avviene a tempo costante, usando il player FAP per la musica.
  • Quando lo schermo viene oscurato per il calcolo del turno nemico, la musica viene ricollegata ai normali interrupt del CPC per evitare scatti.
  • Può mostrare tutti i 27 colori contemporaneamente sullo schermo. Ogni linea ha una tavolozza di 6 colori. Beh, 5 in realtà: il nero è fisso. Vengono impostate 3 penne durante l’hsync (circa 30 NOP), poi la penna 1 e la penna 3 vengono reimpostate durante il disegno della linea. Questo permette di far lampeggiare un colore nella colonna di sinistra o di destra. L’icona a sinistra non viene toccata dall’oscuramento.
  • Penso che questo sistema possa essere usato in qualsiasi gioco in stile foglio di calcolo. Permette di far lampeggiare una riga modificando solo 8 valori a ogni ciclo.

Il gioco è fattibile in circa 2 o 3 ore. Oppure in pochi minuti se vi limitate a passare il tempo finché l’avversario non vince…

1 Mi Piace

Ooooh, sembra fantastico! Mi interessano molto i dettagli tecnici delle modifiche al raster.

(Cioè, vorrei usarle nelle mie produzioni)

Ho usato AceDL per vedere come è stato fatto nel gioco Le Fugitif. L’idea di base è creare una lunga lista di penne (pen), puntarla con HL e poi avere qualcosa del tipo:

    ; imposta il colore di sfondo
    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


Ogni outi imposterà il colore puntato da HL nella penna selezionata, per poi incrementarlo. È fondamentale fare inc b subito dopo, perché outi decrementa B.

E, ovviamente, prima di questo, bisogna attendere il VBL per sincronizzarsi.

    ; attendi VBL
    ei ; attiva gli interrupt (ne abbiamo bisogno per l'HALT)
    ld b,0xF5
novbl:
    in a,(c)
    rra
    jr nc,novbl

    halt ; siamo sincronizzati 16 linee prima dello schermo
    di ; ed ora disattiviamo gli interrupt fino alla fine

    ; qui può andare qualsiasi codice con tempistiche precise, come il player FAP. Oppure un sacco di nop e cicli per consumare tempo.

E, chiaramente, puoi eseguire outi;inc b più volte per cambiare la stessa penna più volte durante la linea, da cui lo split.

Uhm, mi sta sfuggendo qualcosa? Come si fa a dare il proprio contributo?

Nel gioco? Usa le frecce e Invio per selezionare una voce in un menu. Poi usa le lettere evidenziate in rosso nei verbi per [Avanti]. Oppure [Passa] per passare all’evento successivo (fine della costruzione, crescita della popolazione, ricerca completata…).\n\nForse dovrei aggiungere una schermata di aiuto sui comandi. :thinking: