Gioco: Symbol Wars

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.

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

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

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

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

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

  6. 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!

6 Mi Piace

Wow, gioco e programmazione davvero, davvero fantastici. Mi è piaciuto molto giocarci. Dato che adoro giocare a «Defence» di Shining e a «OTP» di Roudoudou, mi piace anche questa versione. C’è un ottimo utilizzo della grafica in Modo 1 e dei simboli, il che permette al giocatore di capire cosa fare e come giocare già dopo una prima prova veloce. Il bilanciamento è programmato alla grande. È divertente. Sì, il sonoro è funzionale, ma sono convinto che tu possa fare lo stesso senza IA. :slight_smile:

(mamma mia, questo mi ricorda che io e Shining volevamo creare un Defence 2…)

Niente male come gioco! Mi piace particolarmente l’estetica! A livello facile sembra… abbastanza facile :). Voglio proprio vedere cosa succede nei livelli più difficili.

Anch’io! Ho testato e ritestato solo i primi due livelli con le loro 15-25 ondate e la generazione dei primi 20 livelli circa.

Mi è piaciuto molto, molto divertente grazie.

1 Mi Piace

Oh! Grazie mille per il complimento e per aver creato il video su YouTube. :slight_smile:

1 Mi Piace

Oh sì! Non solo adoro i giochi TD, ma questo sembra anche fantastico!