LINGUAGGIO PER LA DESCRIZIONE DI ESERCITI E LA CREAZIONE DI LISTE PER IL GIOCO DI BATTAGLIE TRIDIMENSIONALI WARHAMMER FANTASY WarArmy Linguaggi e Modelli Computazionali L-S A.A Alessandro Pernafini
Introduzione Warhammer Fantasy è un gioco di battaglie fantasy Il gioco si svolge su un plastico raffigurante un campo di battaglia, sul quale due o più giocatori si sfidano l'uno con l'altro con le rispettive armate di miniature in plastica o in metallo Ogni armata appartiene ad un esercito ed è formata da diverse unità, ognuna con caratteristiche diverse Prima dell'inizio della partita i giocatori scelgono il punteggio massimo entro il quale deve essere scelta la composizione dell'armata Ogni pezzo schierato ha un proprio valore in punti dipendente dalla sua potenza e indicato nei manuali relativi a ciascun esercito Ogni armata deve essere costruita con dei criteri fondamentali relativi alla funzione di ciascuna unità che la compone Per mostrare la composizione dellarmata viene creata una lista che contiene le varie unità schierate e leventuale equipaggiamento aggiuntivo che viene dato loro
Caratteristiche del linguaggio Il linguaggio dovrà permettere di specificare: Informazioni sullesercito Nome Descrizioni delle unità Elenco degli oggetti magici Elenco degli stendardi Elenco dei poteri extra(se lesercito li prevede) Struttura della lista dellarmata che si vuole schierare Nome dellarmata Esercito a cui fa riferimento Limite di punti spendibili Elenco delle unità selezionate
Obiettivi Progettare un sistema che permetta di definire la struttura di un esercito con la descrizione di ogni singola unità per la successiva creazione di una lista delle unità da schierare nel corso di una partita Sviluppare un linguaggio semplice e di facile utilizzo per un giocatore che può essere suddiviso in due parti: Definizione di un esercito Creazione di una lista Realizzare un interprete che, data una stringa di caratteri in ingresso, ne valuti la correttezza sintattica e semantica e produca una struttura dati per mantenere le informazioni in memoria Realizzare una interfaccia grafica a supporto dellinserimento di informazioni Possibilità di stampare in PDF la lista dellarmata
Grammatica(1) WarArmy ::= ( ArmyDef | ArmyList )ArmyDefArmyList WarArmy ::= ( ArmyDef | ArmyList )ArmyDefArmyList Scope ArmyDef ::= "army" Text ( UnitDesc )+ MagicItemList MagicStandardList ( ExtraPowerList )? TextUnitDescMagicItemList MagicStandardListExtraPowerList ArmyDef ::= "army" Text ( UnitDesc )+ MagicItemList MagicStandardList ( ExtraPowerList )? TextUnitDescMagicItemList MagicStandardListExtraPowerList Struttura esercito UnitDesc ::= "unit" Text UnitSize Cost ( SpecialRules )? ( OptionDef )* ( MagicPoints )? ( StandardsPoints )? ( ExtraPoints )? TextUnitSizeCost SpecialRulesOptionDefMagicPointsStandardsPoints ExtraPoints UnitDesc ::= "unit" Text UnitSize Cost ( SpecialRules )? ( OptionDef )* ( MagicPoints )? ( StandardsPoints )? ( ExtraPoints )? TextUnitSizeCost SpecialRulesOptionDefMagicPointsStandardsPoints ExtraPoints Struttura unità MagicItemList ::= "magic" "items" ( Text Cost )+ TextCost MagicItemList ::= "magic" "items" ( Text Cost )+ TextCost Lista di oggetti magici MagicStandardList ::= "standards" ( Text Cost )+ TextCost MagicStandardList ::= "standards" ( Text Cost )+ TextCost Lista di stendardi
Grammatica(2) ExtraPowerList ::= "extra" "powers" ( Text Cost )+ TextCost ExtraPowerList ::= "extra" "powers" ( Text Cost )+ TextCost Lista di poteri extra UnitSize ::= "size" ( ( | ) )? Cost ::= "points" ( )? SpecialRules ::= "special" StringSequenceStringSequence OptionDef ::= "option" Text Cost TextCost MagicPoints ::= "magic" "items" "points" StandardsPoints ::= "standards" "points" ExtraPoints ::= "extra" "points" UnitSize ::= "size" ( ( | ) )? Cost ::= "points" ( )? SpecialRules ::= "special" StringSequenceStringSequence OptionDef ::= "option" Text Cost TextCost MagicPoints ::= "magic" "items" "points" StandardsPoints ::= "standards" "points" ExtraPoints ::= "extra" "points" Descrizione unità Text ::= ( )+ StringSequence ::= Text ( Text )*Text Text ::= ( )+ StringSequence ::= Text ( Text )*Text Stringhe di input
Grammatica(3) ArmyList ::= "armylist" Text "army" Text "points" ( Unit )+ Text Unit ArmyList ::= "armylist" Text "army" Text "points" ( Unit )+ Text Unit Struttura lista dellarmata Unit ::= "unit" Text Models ( Options )? ( MagicItems )? ( Standards )? ( ExtraPowers )? TextModelsOptionsMagicItemsStandardsExtraPowers Unit ::= "unit" Text Models ( Options )? ( MagicItems )? ( Standards )? ( ExtraPowers )? TextModelsOptionsMagicItemsStandardsExtraPowers Struttura di ununità inserita nella lista Models ::= "models" Options ::= "options" StringSequenceStringSequence MagicItems ::= "magic" "items" StringSequenceStringSequence Standards ::= "standards" StringSequenceStringSequence ExtraPowers ::= "extra" "powers" StringSequenceStringSequence Models ::= "models" Options ::= "options" StringSequenceStringSequence MagicItems ::= "magic" "items" StringSequenceStringSequence Standards ::= "standards" StringSequenceStringSequence ExtraPowers ::= "extra" "powers" StringSequenceStringSequence Descrizione di ununità inserita nella lista
Grammatica (4) } } Token Tipo dellunità: lord, hero, core unit, special unit, rare unit Riferito al costo: se presente andrà moltiplicato per il numero di modelli presenti nellunità
Esempio di esercito army Orcs and Goblins{ unit Ozag Greenskin{ size 1 points 375 L special Immune to Psychology, Hates Everybody, Da Immortulz option great axe points 6 weapons magic items points 100 standards points 50 extra points 50 } unit Orc Shaman { size 1 points 65 H option boar points 16 mounts option 2nd level wizard points 35 upgrades magic items points 50 } unit Goblins{ size 2-20 points 20 xmodel CU special Immune to Psychology, Stubborn } unit Orc Chariot { size 1 points 80 SU special Tusker Charge option additional orc crew points 5 extras } unit Titan { size 1 points 205 RU special Large Target, Terror, Stubborn, Longshanks, Fall Over, Giant Special Attacks } magic items { Sword of Striking points 15 Sword of Battle points 15 } standards { Spirit Totem points 50 Big Red Banner points 50 } extra powers{ High Strength 20 High Constitution 20 } UnitDesc UnitSize Cost Type SpecialRules OptionDef MagicPoints StandardsPoints ExtraPoints MagicItemList MagicStandardList ExtraPowerList
Esempio di lista dellarmata armylist mylist{ army Orcs and Goblins 1000 points unit Night Goblin Shaman{ models 1 options 2nd level wizard magic items Tricksy Trinket } unit Night Goblins{ models 50 options musician, standard bearer, goblin boss } unit Night Goblins{ models 20 options nets } unit Night Goblin Squig Herd{ models 3 } ArmyList ::= "armylist" Text "army" Text "points" ( Unit )+ Text Unit ArmyList ::= "armylist" Text "army" Text "points" ( Unit )+ Text Unit Unit ::= "unit" Text ModelsTextModels ( Options )? ( MagicItems )?OptionsMagicItems ( Standards )? ( ExtraPowers )? StandardsExtraPowers Unit ::= "unit" Text ModelsTextModels ( Options )? ( MagicItems )?OptionsMagicItems ( Standards )? ( ExtraPowers )? StandardsExtraPowers
Grammatica e linguaggio Grammatica: la grammatica è di tipo 2 (context free) secondo la classificazione di Chomsky. Infatti ci sono produzioni vincolate alla forma: A α con α є (VT U VN)* ed A є VN Linguaggio : il linguaggio generato risulta essere di tipo 3 perché la grammatica non contiene self- embedding
Grammatica e linguaggio(2) La grammatica è priva di ε-rules e la stringa vuota non può essere generata nemmeno a livello di scope in quanto sarebbe stato inutile definire o un esercito o una lista vuoti. Inoltre gli insiemi degli starter symbols corrispondenti alle parti destre delle produzioni alternative di uno stesso metasimbolo sono fra loro disgiunti, quindi il linguaggio risulta essere LL(1)
Schema di funzionamento(1) Sequenza di caratteri WarArmyParserTokenManager Lexer Sequenza di Token WarArmyParser Parser AST
Schema di funzionamento(2) AST Data Structure Visitor Tree Visitor
Strumenti utilizzati Linguaggio di programmazione Java jdk Ambiente di sviluppo Eclipse Indigo Generazione del parser e dello scanner JavaCC Eclipse plugin Generazione delle classi necessarie a creare lAST e del pattern visitor JTB Creazione di file PDF Libreria itext 5.1.3
Architettura: Packages parser: contiene le classi relative allo scanner ed al parser generate da JavaCC syntaxtree: contiene le classi utilizzate per la creazione dellAST generate da JTB visitor: contiene le classi generate da JTB e le implementazioni dellinterfaccia IVoidVisitor exceptions: contiene le classi che rappresentano le varie eccezioni semantiche wararmy: contiene le classi per lelaborazione e per rappresentare la struttura in memoria gui: contiene le classi relative alle interfacce grafiche
Architettura: parser Il package parser contiene le classi relative al Lexer, al Parser ed alle eccezioni sintattiche Parser: Realizzato da JavaCC; Rapporto Client/Server col Lexer; Restituisce lalbero generato, in modo che i vari visitor possano visitarlo ed interpretarlo. Il package syntaxtreecontiene le classi che rappresentano i nodi dellalbero, in particolare una per ogni metasimbolo della grammatica
Architettura: visitor Nel package visitor si trovano due classi che implementano linterfaccia IVoidVisitor generata da JTB. Entrambi i visitor effettuano unanalisi depth-first dellAST generato dal parser avvalendosi del meccanismo di double dispatch. Le classi presentano un metodo visit() per ogni classe dellAST le quali, a loro volta, prevedono un metodo accept() che rimpalla lazione sul visitor passando se stesso come oggetto da visitare DataStructureVisitor effettua unanalisi semantica e, se non ci sono stati errori semantici, produce una rappresentazione dellesercito o della lista creati, altrimenti lancia una SemanticException TreeVisitor solo se lanalisi semantica è andata a buon fine, produce una rappresentazione dei dati inseriti sotto forma di albero
Controlli semantici: esercito Il DataVisitor effettua i seguenti controlli semantici: il nome di ununità deve essere unico la dimensione minima di ununità deve essere minore della dimensione massima non ci possono essere regole speciali duplicate per una singola unità non ci possono essere nomi di opzioni duplicati per una singola unità non ci possono essere oggetti magici, stendardi o poteri extra duplicati
Controlli semantici: lista(1) Il DataVisitor effettua i seguenti controlli semantici: lesercito a cui la lista fa riferimento deve essere stato definito ununità inserita deve: essere stata definita nellesercito a cui la lista fa riferimento il numero di modelli che compongono lunità deve rispettare le dimensioni indicate nella descrizione dellunità il costo degli oggetti magici, stendardi o poteri extra assegnati allunità non deve superare il rispettivo limite definito nella descrizione dellunità unopzione, oggetto magico, stendardo o potere extra assegnato ad ununità deve essere stato definito nellesercito a cui la lista fa riferimento
Controlli semantici: lista(2) Il DataVisitor effettua i seguenti controlli semantici: nella lista deve essere presente almeno ununità di tipo H o L nella lista devono essere presenti almeno tre unità di tipo CU, SU o RU il costo totale della lista non deve superare il limite di punti imposto la somma dei costi delle unità di tipo H, L, RU non deve essere superiore al 25% del limite di punti imposto la somma dei costi delle unità di tipo SU non deve essere superiore al 50% del limite di punti imposto la somma dei costi delle unità di tipo CU non deve essere inferiore al 25% del limite di punti imposto non si possono inserire più di 3 unità uguali di tipo SU non si possono inserire più di 2 unità uguali di tipo RU
Linterfaccia grafica(1) Area di input Albero Area di output Errore semantico Errore sintattico
Interfaccia grafica(2) Form per la creazione di un nuovo esercito Alla pressione effettua dei controlli sulla validità dei dati inseriti Form per la creazione di ununità da aggiungere allesercito
Interfaccia grafica(3) Form per la creazione di una lista Alla pressione effettua dei controlli sulla validità dei dati inseriti
Collaudo Il sistema è stato collaudato attraverso limmissione di opportune frasi di input per: verificare la corretta segnalazione di errori sintattici verificare la corretta segnalazione di errori semantici verificare la corretta visualizzazione dellalbero verificare la corretta generazione del documento PDF Il sistema è stato testato anche da esperti del settore, ma privi di una qualsiasi competenza in ambito di programmazione, ei quali hanno giudicato positivamente lapplicazione Grazie ai loro test, sono riuscito a trovare alcuni bug che, altrimenti, non sarebbero venuti alla luce.
Sviluppi futuri Introduzione di sotto-opzioni da assegnare ad unopzione relativa ad ununità dellesercito Aggiungere la possibilità di definire costi di tipo frazionario così come previsto per alcuni eserciti dalla nuova edizione del regolamento Possibilità di caricare al momento dellapertura gli eserciti già inseriti così da non dover ripetere ogni volta la procedura Estendere il supporto al gioco Warhammer 4K
DEMO