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.
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…
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.
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.