Ciao a tutti,
vorrei presentarvi il mio gioco «Symbol Wars». L’ho scritto utilizzando lo stesso motore sprite del mio gioco «Sternenschwarm». (Gli sprite seguono percorsi predefiniti).
symbol.dsk (190,3 KB) (run"start").
Sì, è il mio tentativo di programmare un gioco tower defense per il CPC. La particolarità sta nel fatto che tutti i livelli sono generati proceduralmente. Più sotto troverete maggiori dettagli a riguardo.
Ho passato parecchie partite a testarlo per trovare un giusto equilibrio tra nemici e difese. So bene che non è ancora perfettamente bilanciato. Però adesso ho bisogno di staccare un attimo, quindi ecco lo stato attuale dei lavori.
ISTRUZIONI
Impedisci ai nemici-simbolo di raggiungere la casella di arrivo: costruisci armi lungo il percorso, sconfiggi ogni ondata e sopravvivi all’intero livello. Ogni nemico che passa ti fa perdere vite; una volta esaurite le vite, la partita è persa.
Schermata del titolo e impostazioni
SPACE = Avvia la partita
Sinistra / Destra = Seleziona livello
S = Inserisci seed (0–65535); stesso seed = stessi livelli
C = Cambia schema di colori (12 palette, es. TRON, SIGNAL, EMBER, MINT, ICE, PLASMA)
D = Difficoltà: EASY (nemici più deboli del 25%, 50% di vite in più), NORMAL, HARD (nemici più forti del 25%, un terzo di vite in meno)
L = Carica partita (3 slot di salvataggio)
H = Visualizza la Hall of Fame (SPACE = indietro)
Campo di gioco e indicatori
In alto si trova la barra di stato, sotto il campo di gioco con il percorso. I nemici avanzano dal punto di partenza a quello di arrivo; entrambi hanno lo stesso aspetto, e a ogni ondata viene sorteggiato da quale lato arriveranno. A partire dal livello 2 e nell’ultimo terzo delle ondate, attaccheranno contemporaneamente da entrambi i lati.
- Barra delle armi: Le cinque armi con i rispettivi prezzi (in giallo); quella selezionata è sottolineata.
- Oro e vite: L’oro (giallo) e le vite (cuore) sono mostrati in alto, accanto al punteggio.
- Righe di info: Livello, ondata e conto alla rovescia per l’ondata successiva; sotto compaiono avvisi come «CANNOT BUILD HERE» e la priorità di mira della torre sotto il cursore.
- Raggio d’azione: Un anello di 24 punti intorno al cursore mostra la gittata dell’arma selezionata o di quella sottostante.
- Indicatore di velocità: «X2», «X4» o «/2» nella barra di stato.
- Riempimento nemici: L’energia rimanente si riconosce dal riempimento della forma (4 livelli, si svuota dal basso verso l’alto).
Controlli di gioco
- Tasti cursore / Joystick = Muovi il cursore di costruzione (tieni premuto = ripetizione continua)
- 1 2 3 4 5 = Seleziona arma: Laser, Missile, Freno, Bombardiere, Prisma
- SPACE / COPY / Fuoco = Costruisci arma; se posizionato su un’arma: potenzia al livello successivo
- DEL = Vendi l’arma sotto il cursore (recuperi il 75% di quanto speso)
- RETURN / ENTER = Chiama subito l’ondata successiva (i secondi rimanenti vengono convertiti in oro bonus)
- + = Più veloce: ×1 → ×2 → ×4
- − = Più lento: ×1 → ×½ → ¼
- T = Priorità di mira della torre sotto il cursore: FIRST (primo nemico), STRONG (più forte), WEAK (più debole), FAST (più veloce)
- S = Suono di sottofondo (battito cardiaco) on/off
- P = Pausa
- ESC = Richiesta «Tornare al titolo?» (ESC = sì, SPACE = no)
Armi
Ogni arma ha 3 livelli (simbolo interno sottile, doppio o pieno). I costi sono visibili nella barra delle armi; anche i potenziamenti hanno costi fissi. Quando sparano, un pixel rosso lampeggia brevemente al centro dell’arma.
- 1 Laser (quadrato con croce)
Gittata corta, molto rapido. Il raggio rimbalza su altri nemici. - 2 Missile (cerchio con triangolo)
Gittata media, raffica di due missili a ricerca (ciascuno infligge metà danno). - 3 Freno (rombo con anello)
Dimezza la velocità di un massimo di 3 / 5 / 8 nemici a portata (a seconda del livello). - 4 Bombardiere (quadrato pesante con sfera)
Gittata massima, lento. Esplosione: danno pieno nella metà interna del raggio, dimezzato all’esterno. - 5 Prisma (triangolo nel triangolo)
Non spara, aumenta il danno delle armi adiacenti (fino a 8) del 25 / 40 / 60% per livello.
Nemici e resistenze
Ci sono tredici forme. Due casi speciali:
- Saetta: piccolo e velocissimo, immune a Freno e Bombardiere. Solo Laser e Missili possono colpirlo. Compare dal livello 2 ogni paio di ondate.
- Boss: lento e resistente, un mutaforma: assume le resistenze della forma visualizzata in quel momento. Nell’ultima ondata di ciascun livello compare un boss (nei livelli avanzati anche più di uno).
Non tutti i nemici subiscono gli stessi danni da ogni arma (percentuale del danno normale): - NEMICO (LASER, MISSILE, BOMBARDIERE)
- Triangolo verticale (100, 100, 100)
- Triangolo orizzontale (100, 75, 75)
- Cerchio (75, 100, 100)
- Quadrato (100, 75, 125)
- Rettangolo orizzontale (75, 100, 100)
- Rettangolo verticale (50, 125, 100)
- Rombo (125, 50, 50)
- Pentagono (75, 100, 125)
- Esagono (50, 125, 100)
- Ettagono (100, 75, 125)
- Ottagono (75, 100, 125)
- Saetta (100, 100, immune)
Chi costruisce un solo tipo di arma prima o poi si ritroverà contro nemici verso cui è debole.
Consigli, punteggio e salvataggio
- Varia le armi: Laser e Missili contro i nemici veloci, Bombardieri contro i gruppi, Freni davanti alle armi potenti, Prismi al centro di più torri vicine.
- Posiziona le armi sulle curve e negli snodi stretti, così che coprano il percorso più a lungo.
- Usa T per impostare la priorità di mira, per esempio STRONG per i Bombardieri e FIRST per i Laser.
- Usa RETURN per chiamare presto l’ondata successiva se le difese sono pronte: i secondi rimanenti fruttano oro bonus.
- La prima ondata è la più facile; costruisci le prime difese prima di farla partire.
Punteggio: Nemico abbattuto = 10 × valore in oro del nemico, +100 a ogni ondata, oltre a un bonus a fine livello. Chi completa un livello senza perdere neanche una vita riceve +500 punti e 50 monete d’oro extra all’inizio del livello successivo. Se il punteggio entra nella top 8, puoi inserire 3 lettere; la Hall of Fame mostra nome, punti, seed e livello.
Salvataggio: Dopo ogni livello vinto scegli S = salva (slot 1–3) oppure SPACE = continua. Si carica dalla schermata iniziale premendo L. In caso di sconfitta, premendo SPACE si passa all’inserimento del nome (se sei nella top 8) e poi di nuovo alla schermata del titolo.
Qualche retroscena
Il gioco è stato in gran parte programmato a mano e anche la grafica è fatta a mano. L’IA è stata comunque utilizzata. Nello specifico: tutte le sequenze audio sono state generate con ChatGPT. Quelle che avevo provato a fare io erano totalmente inutilizzabili.
La generazione di un livello avviene in diverse fasi, e ciascuna viene verificata. Se una fallisce, il programma passa semplicemente al seed successivo.
-
Seed e numero del livello
Il seed è un numero che definisce l’intera partita. Da esso e dal numero del livello viene ricavato il valore di partenza per il generatore casuale. Lo stesso seed unito allo stesso numero genererà sempre lo stesso livello. Per questo è possibile condividere i livelli passando semplicemente il seed. -
Il percorso
Per prima cosa viene tracciato un percorso. Parte dal bordo sinistro, si sviluppa verso destra a tratti orizzontali, cambia riga ogni tanto e si conclude al traguardo. Il percorso curva solo ad angolo retto e non si incrocia mai con se stesso. -
Verifica del percorso
Se il percorso risulta troppo corto o troppo lungo, viene scartato. Lo stesso accade se presenta interruzioni o se non ci sono abbastanza caselle libere adiacenti per poter costruire. In tal caso si prova il seed successivo, finché non ne trova uno valido. -
Ostacoli
Nei livelli più avanzati aumentano gli ostacoli non edificabili. All’inizio sono pochi. In seguito si verifica se restano comunque abbastanza spazi per costruire. -
Crediti e vite
I crediti e le vite vengono definiti per ciascun livello. I crediti aumentano di livello in livello, mentre le vite calano leggermente. La difficoltà e l’oro iniziale vanno a modificare ulteriormente questi valori. -
Ondate
Il numero delle ondate cresce con il livello, con una leggera componente casuale. La forza di ogni ondata è calcolata in base alle risorse che si possono guadagnare fino a quel punto. Le prime ondate sono semplici, l’ultima ondata di un livello è decisamente più tosta. Nei livelli più alti la curva di difficoltà sale più rapidamente. I tipi di nemici che compaiono in un’ondata dipendono dalla loro posizione nella sequenza. L’ultima ondata include sempre un boss.
A cosa serve tutto questo?
Le ondate sono bilanciate in modo che con i crediti che si possono guadagnare sia sempre possibile allestire una difesa adatta. Il generatore fa questi calcoli a monte. In questo modo ogni livello generato casualmente risulta teoricamente fattibile. Beh, almeno sulla carta!
