Requisiti

L’analisi del problema svolta nella prima fase del progetto ha permesso di evidenziare i requisiti elencati di seguito.

Requisiti di business

  • Creare un’esperienza di gioco coinvolgente e sfidante: Il genere tower defense è stato scelto per la sua natura strategica che richiede pianificazione e decisioni tattiche continue. La scelta di un sistema a ondate infinite con difficoltà crescente, invece di livelli predefiniti, è motivata dalla volontà di massimizzare la rigiocabilità e creare una sfida sempre nuova per il giocatore
  • Utilizzo di Scala e di paradigmi funzionali: Il progetto deve essere sviluppato in Scala 3 per permettere al team di apprendere e applicare costrutti funzionali di alto livello
  • Rispetto della deadline: Realizzare il progetto entro il 24 ottobre 2025, pianificando gli sprint in modo da completare prima le funzionalità core e lasciare le feature opzionali per le iterazioni finali

Modello di dominio

Il dominio del progetto ruota attorno ai seguenti concetti principali:

Grid

La griglia di gioco rappresenta il campo di battaglia:

  • Definisce le posizioni valide dove possono essere posizionati i maghi
  • È composta da celle organizzate in righe (5) e colonne (9)
  • Mantiene traccia delle celle occupate e di quelle disponibili
  • Valida i tentativi di posizionamento impedendo sovrapposizioni

Wizard

Unità difensiva posizionabile dal giocatore sulla griglia:

  • Ha un costo in elisir necessario per il posizionamento
  • Possiede statistiche: salute, danno, raggio d’attacco, tempo di ricarica tra attacchi
  • Attacca automaticamente i troll che entrano nel proprio raggio
  • Rimane fermo nella posizione in cui è stato piazzato
  • Viene rimosso quando la salute raggiunge zero

Esistono cinque tipi di maghi:

  • Mago Generatore: Genera 25 elisir ogni 10 secondi invece di attaccare. Costo: 100, Vita: 150
  • Mago del Vento: Attacco base a distanza. Costo: 150, Vita: 100, Danno: 25, Gittata: 3.0, Cooldown: 3s
  • Mago del Fuoco: Infligge alto danno a corto raggio. Costo: 250, Vita: 100, Danno: 50, Gittata: 2.0, Cooldown: 2.5s
  • Mago del Ghiaccio: Rallenta temporaneamente i nemici colpiti. Costo: 200, Vita: 150, Danno: 25, Gittata: 2.5, Cooldown: 4s
  • Mago Barriera: Alta salute ma nessun attacco. Funziona come muro difensivo. Costo: 200, Vita: 300

Troll

Unità nemica che avanza verso la torre:

  • Si muove automaticamente da destra verso sinistra
  • Ha statistiche: salute, velocità, danno, raggio d’attacco, cooldown
  • Attacca i maghi che incontra sul percorso (se nel raggio d’azione)
  • Se raggiunge il lato sinistro della griglia, causa la sconfitta immediata del giocatore
  • Viene rimosso quando la salute raggiunge zero
  • Rilascia elisir come ricompensa quando eliminato

Esistono quattro tipi di troll:

  • Troll Base: Statistiche equilibrate. Vita: 100, Vel: 0.10, Danno: 20, Gittata: 1.0, Cooldown: 1s
  • Troll Guerriero: Alta salute e danno, movimento più veloce, corto raggio. Vita: 130, Vel: 0.15, Danno: 30, Gittata: 0.5, Cooldown: 1.5s
  • Troll Assassino: Altissima velocità e danno ma bassa salute, si muove a zigzag. Vita: 70, Vel: 0.2, Danno: 60, Gittata: 1.5, Cooldown: 0.8s
  • Troll Lanciatore: Attacca i maghi a distanza, rimanendo fermo. Vita: 40, Vel: 0.10, Danno: 10, Gittata: 5.0, Cooldown: 3s

Elixir

Risorsa economica gestita dal giocatore:

  • Ha un valore corrente (inizia a 200) e un limite massimo (1000)
  • Si rigenera automaticamente (+100 elisir ogni 10 secondi)
  • Viene consumato per posizionare i maghi
  • Viene guadagnato sconfiggendo i troll (quantità varia per tipo di troll)
  • Può essere generato dai Maghi Generatori (+25 elisir ogni 10 secondi)
  • Determina quali maghi possono essere posizionati in un dato momento

Castle

Obiettivo da difendere (non una vera entità, ma la condizione di sconfitta):

  • Rappresenta la meta finale del percorso dei troll (lato sinistro della griglia)
  • Se un troll la raggiunge, la partita termina immediatamente con la sconfitta

Wave

Ondata di troll che appare periodicamente:

  • Ha un numero identificativo progressivo
  • Contiene una composizione di diversi tipi di troll generata proceduralmente
  • La difficoltà aumenta ad ogni ondata successiva:
    • Più troll vengono generati (max troll per ondata aumenta)
    • Le statistiche dei troll (salute, velocità, danno) aumentano progressivamente
    • Il tempo tra le generazioni diminuisce
    • La distribuzione dei tipi di troll cambia, introducendo tipi più forti
  • Il sistema di spawn si attiva dopo il posizionamento del primo mago
  • Non ha limite massimo: il gioco continua all’infinito fino alla sconfitta

Projectile

Proiettile lanciato dai maghi (Vento, Fuoco, Ghiaccio) o dai Troll Lanciatori:

  • Ha una posizione e si muove verso il lato opposto (destra per maghi, sinistra per troll)
  • Ha un tipo che determina il danno e gli effetti (Fuoco, Ghiaccio, Vento, Troll)
  • Colpisce il primo bersaglio valido sulla stessa riga nella cella in cui entra
  • Viene rimosso dopo aver colpito
  • I proiettili del Mago del Ghiaccio applicano un effetto di rallentamento temporaneo

Requisiti funzionali

Requisiti di utente

Dal punto di vista dell’utente, il sistema deve consentire:

  • Il setup della partita:
    • Visualizzazione del menu principale
    • Avvio di una nuova partita
    • Accesso alle informazioni di gioco
  • L’interazione di gioco:
    • Selezionare un tipo di mago dal pannello laterale (shop) visualizzando costo, icona e nome
    • Posizionare i maghi cliccando su celle valide della griglia
    • Visualizzare in tempo reale:
      • Quantità di elisir disponibile
      • Numero dell’ondata corrente
      • Barre della vita di maghi e troll (quando non a vita piena o uguale a 0)
      • Proiettili in movimento
    • Ricevere feedback immediato per:
      • Tentativi di posizionamento non validi (cella occupata, elisir insufficiente, mago non selezionato)
      • Inizio di nuove ondate
    • Mettere in pausa il gioco e riprendere
  • La fine della partita:
    • Ricevere notifica chiara di game over quando un troll raggiunge la fine
    • Ricevere notifica di vittoria alla fine di un’ondata
    • Possibilità di continuare alla prossima ondata (dopo vittoria) o iniziare una nuova partita (dopo sconfitta o da menu pausa)
    • Possibilità di tornare al menu principale

Requisiti di sistema

Il sistema dovrà occuparsi di:

  • Gestione delle entità di gioco:
    • Creare e mantenere tutte le entità (maghi, troll, proiettili) con identificatori unici
    • Associare a ogni entità le sue caratteristiche (componenti: posizione, salute, statistiche, etc.)
    • Permettere ricerche efficienti di entità con specifiche caratteristiche
    • Rimuovere automaticamente entità quando vengono eliminate
  • Gestione dell’elisir:
    • Inizializzare l’elisir al valore predefinito (200) all’inizio della partita
    • Rigenerare elisir automaticamente a intervalli regolari (+100 ogni 10s)
    • Rispettare il limite massimo di elisir accumulabile (1000)
    • Verificare che il giocatore abbia elisir sufficiente prima di permettere il posizionamento di maghi
    • Sottrarre il costo corretto quando un mago viene posizionato
    • Aggiungere elisir quando un troll viene eliminato (quantità variabile)
    • Gestire la generazione periodica di elisir dai Maghi Generatori (+25 ogni 10s)
  • Validazione del posizionamento:
    • Verificare che il click sia all’interno della griglia
    • Verificare che la cella non sia già occupata da un altro mago
    • Verificare che il giocatore abbia elisir sufficiente per il mago selezionato
    • Fornire feedback (messaggio di errore) in caso di tentativo non valido
  • Gestione del movimento:
    • Aggiornare continuamente le posizioni dei troll (da destra a sinistra) e dei proiettili (direzione opposta) in base alla loro velocità e al delta time
    • Implementare il movimento a zigzag per i Troll Assassini
    • Applicare gli effetti di rallentamento quando un troll viene colpito dal ghiaccio, riducendone la velocità
    • Rilevare quando un troll raggiunge il lato sinistro della griglia
    • Rimuovere i proiettili che escono dai bordi dello schermo
  • Gestione del combattimento:
    • Implementare il targeting automatico: maghi attaccano il troll più vicino sulla stessa riga nel loro range; Troll Lanciatori attaccano il mago più vicino sulla stessa riga nel loro range
    • Gestire i tempi di ricarica per ogni entità attaccante
    • Creare proiettili quando un’entità effettua un attacco a distanza
    • Rilevare le collisioni tra entità e bersagli nella stessa cella e gestirne l’effetto (meleeAttack o projectile-entity collision)
    • Applicare effetti speciali alla collisione
    • Gestire il blocco del movimento per i Troll che attaccano in mischia
  • Gestione della salute:
    • Processare le collisioni per ridurre la vita delle entità
    • Rilevare quando un’entità raggiunge salute zero o inferiore
    • Rimuovere le entità morte dal gioco
    • Assegnare ricompense in elisir quando un troll viene eliminato
  • Gestione delle ondate:
    • Iniziare a generare ondate di troll solo dopo che il primo mago è stato piazzato
    • Determinare la composizione di ogni ondata (numero e tipi di troll) proceduralmente in base al numero dell’ondata
    • Aumentare progressivamente la difficoltà:
      • Incrementando il numero massimo di troll per ondata
      • Aumententando le statistiche base (salute, velocità, danno) dei troll generati
      • Diminuendo l’intervallo tra le generazioni
      • Modificando la probabilità di apparizione dei tipi di troll
    • Generare troll in “batch” a intervalli randomizzati
    • Rilevare il completamento di un’ondata (spawn terminato e nessun troll rimasto)
  • Ciclo di gioco principale:
    • Mantenere aggiornato e consistente lo stato del gioco
    • Processare tutti gli aggiornamenti dei sistemi ECS in un ordine definito
    • Gestire correttamente la pausa e la ripresa del gioco, sospendendo gli aggiornamenti e la generazione di spawn
    • Rilevare le condizioni di vittoria e sconfitta e terminare/procedere la partita
  • Rendering e interfaccia:
    • Disegnare la mappa di gioco e la griglia
    • Visualizzare tutte le entità (maghi, troll, proiettili) nelle loro posizioni con le loro icone
    • Mostrare l’effetto visivo per le entità congelate
    • Disegnare le barre della vita delle entità con salute non piena
    • Mostrare l’HUD con informazioni su elisir, ondata corrente, pannello shop
    • Gestire la visualizzazione e l’interazione con i menu

Requisiti non funzionali

Requisiti esterni

  • Performance:
    • Mantenere un frame rate stabile (idealmente vicino a 60 FPS) anche con un numero elevato di entità
  • Affidabilità:
    • Garantire stabilità durante sessioni di gioco prolungate senza crash
    • Gestire robustamente input utente non validi
    • Mantenere la consistenza dello stato durante pausa/ripresa
  • Usabilità:
    • Interfaccia intuitiva
    • Icone e testi chiari
    • Feedback visivo immediato per le azioni
    • Informazioni essenziali sempre visibili

Requisiti interni

  • Scalabilità:
    • Facilità di aggiungere nuovi tipi di maghi e troll modificando principalmente le configurazioni
    • Aggiungere nuove caratterisitche e funzionalità per le entità di gioco
    • Capacità di introdurre nuove meccaniche
  • Manutenibilità:
    • Separazione netta tra logica di gioco e interfaccia grafica
    • Codice modulare
    • Utilizzo di immutabilità per ridurre effetti collaterali
    • Codice ben documentato e con nomi descrittivi
  • Testabilità:
    • Logica di gioco testabile in isolamento dal rendering
    • Comportamento deterministico facilitato dall’immutabilità e dal game loop fisso
    • Utilizzo di DSL per creare scenari di test specifici
    • Buona copertura dei test sulle logiche critiche

Requisiti di implementazione

  • Metodologia di sviluppo: Agile SCRUM-inspired
  • Architettura: MVC con Model implementato tramite ECS
  • Tecnologie e linguaggio: Scala 3.x, ScalaFX per la UI, SBT per il build
  • Testing: ScalaTest
  • Versioning e collaborazione: Git, GitHub, GitHub Actions per CI