PPS-24-psim

Design di dettaglio

Il sistema è suddiviso in quattro moduli principali:

Struttura dei package

drawing

Tecnologie utilizzate

Le tecnologie utilizzate, oltre a quelle obbligatorie, sono:

Core del progetto

drawing

Il sistema é sviluppato come un sistema di simulazione a eventi dove ogni evento rappresenta un cambiamento dello stato della simulazione. É strutturato in diverse parti:

Engine

SimulationEngine rappresenta la parte centrale del sistema: ha il puro compito di eseguire uno step della simulazione e internamente mantiene lo stato della simulazione in modo immutabile, aggiornandolo ogni volta che viene eseguito uno step. Esegue in cascata tutti gli eventi, uno dopo l’altro, e alla fine ritorna il nuovo stato della simulazione. Non contiene logiche specifiche ma si limita a invocare gli eventi, rispettando un flusso di simulazione prestabilito. Questa impostazione riflette un’architettura event-driven, dove ogni evento è un’unità indipendente che incapsula una modifica ben definita sul sistema. Inoltre, questo approccio assicura un’alta coesione interna e una bassa dipendenza da altre parti del progetto, facilitando manutenzione, testing e riutilizzo.

Malattia

Disease rappresenta la malattia evolvibile dal giocatore durante la partita. È principalmente composto da Trait che ne determinano le caratteristiche. I Trait possono essere:

Evoluzione / Involuzione

È possibile aggiungere o rimuovere Trait a Disease:

Alcuni Trait più avanzati richiedono l’acquisto di altri Trait per essere evoluti. Per un Symptom basta che uno solo tra i suoi prerequisites sia stato acquistato dal giocatore, mentre per un Symptom o un Transmission tutti i prerequisites devono essere evoluti.

Infezione e Morte

Un Event è adibito al calcolo tramite PopulationEffect dei nuovi infetti e morti nei diversi Node in base alle statistiche dei Trait presenti in Disease.

Guadagno punti dna

Un Event è adibito al calcolo dei punti dna, dipendenti dal numero di persone infettate e/o uccise determinate da PopulationEffect.

Alterazione della cura

Durante la partita è possibile evolvere Trait che alterano Cure, modifiche sempre apportate tramite Event o EventBuffer.

Mondo

Il sottosistema Mondo rappresenta la rete globale su cui si muove la popolazione e si diffonde la malattia. È composto da tre elementi principali:

  1. Nodi: rappresentano le entità geografiche (città, regioni) con una popolazione, una quantità di infetti e morti.
  2. Collegamenti: Connessioni tra i nodi che definiscono la struttura del grafo. Ogni edge è non orientato e ha una tipologia.
  3. Strategie di Movimento: Definiscono come le persone si muovono tra i nodi, influenzando la diffusione della malattia.

Quando si applica una strategia di movimento, viene determinato non solo quante persone si spostano, ma anche quanti tra questi sono infetti, così da mantenere una propagazione realistica dell’infezione durante i trasferimenti.

Cura

Il sottosistema di ricerca della cura modella gli sforzi scientifici globali per sviluppare un rimedio alla malattia. È composto da due elementi chiave:

  1. Stato della ricerca: Tiene traccia del progresso (0-100%) e della velocità base di avanzamento della cura
  2. Modificatori della ricerca: Rappresentano le azioni che possono influenzare la velocità e il progresso della ricerca

Il sistema di cura interagisce con:

Reazioni

Il sottosistema delle reazioni modella le risposte del mondo di gioco alla malattia e/o alla cura. Si basa su un meccanismo di regole condizionali associate ad azioni specifiche:

  1. Regole di Attivazione: Definiscono le condizioni che devono essere soddisfatte per attivare una reazione.
  2. Azioni: Le azioni che vengono eseguite quando le condizioni sono
  3. Durata: La durata per cui la reazione rimane attiva. Può essere temporanea o permanente.

Le reazioni possono essere di vario tipo e comportano una modifica allo stato del mondo, come ad esempio la chiusura di collegamenti tra nodi, impedendo la diffusione della malattia.

Avvio della Simulazione

La simulazione viene inizializzata e avviata tramite dsl con il comando setup fornendo i seguenti elementi:

Quando viene avviata l’applicazione, viene chiesto al giocatore di selezionare il Node da dove vuole fare iniziare la sua Disease. Dopo la selezione, questa informazione viene passata al SimulationState tramite dsl.

Simulation loop

Il Controller esegue ricorsivamente la catena di Event dichiarati all’interno del SimulationEngine su un thread separato finché la simulazione non termina raggiungendo le condizioni di fine simulazione. Durante il loop, una volta che tutti gli eventi sono stati eseguiti, il Controller si occupa anche di richiamare l’aggiornamento della UpdatableView passando il nuovo stato della simulazione, ottenuto dopo l’esecuzione della catena di eventi.

Collegamento Model-View

Il collegamento tra il Model e la View avviene durante il setup della simulazione: la DSL contiene la keyword binding alla quale bisogna passare un oggetto che implementa l’interfaccia UpdatableView e che contenga tutte le parti di view che si vogliono aggiornare. Questo design si ispira al pattern Observer: la subscribe é mascherata dalla keyword binding e il notify é lasciato alla responsabilità del Controller che, una volta ottenuto il nuovo stato della simulazione, lo passa all’oggetto che implementa l’interfaccia UpdatableView chiamandone l’aggiornamento. Il Controller fa quindi come da collante tra il Model e la View, permettendo di mantenere separati i due moduli.

Back to index | Previous Chapter | Next Chapter