public AzioneMovimento(Quantum quantum, Casella casellaPartenza, bool puòAttaccare = true) { this.casellaPartenza = casellaPartenza; naveMossa = casellaPartenza.Occupante; this.quantum = quantum; this.puòAttaccare = puòAttaccare; // Faccio partire il pathfinder pathFinder = new PathFinder(); pathFinder.Start(this.casellaPartenza, naveMossa.MuoveInDiagonale); // Illumino le caselle raggiungibili int[] caselleRaggiungibili = Tile.Tiles(t => { Casella casella = t as Casella; int d = pathFinder.DistanzaCasella(t); return (d <= naveMossa.Pwr && d > 0 && (puòAttaccare || (casella != null && casella.Occupante == null) )); } ).Select(t => t.ID).ToArray(); quantum.getGUI().Tabellone.ResetSelezioneMouse(); quantum.getGUI().Tabellone.IlluminaCaselle(caselleRaggiungibili); }
public AzioneSpecialDestroyer(Quantum quantum, Casella casellaPartenza) { _partenza = casellaPartenza; this.quantum = quantum; _naveMossa = casellaPartenza.Occupante; int[] disponibili = Tile.Tiles(t => t.PresenzaAlleata(quantum.getGestoreDiGiocatori().getGiocatoreDiTurno())).Select(t => t.ID).ToArray(); quantum.getGUI().Tabellone.IlluminaCaselle(disponibili); quantum.getGUI().Tabellone.ResetSelezioneMouse(); Interfaccia.ConsoleMessaggi.NuovoMessaggio("Scegli l'alleato con cui fare il warp:"); }
public AzioneSelezioneDestra(Quantum quantum, Casella casellaPartenza) { this.casellaPartenza = casellaPartenza; this.quantum = quantum; naveUsata = casellaPartenza.Occupante; GuiManager gui = quantum.getGUI(); gui.Tabellone.ResetSelezioneMouse(); gui.Tabellone.MostraSelezione = false; // HACK: gestire in maniera sensata e più agile il posizionamento dei Widget // (magari con un costruttore nuovo a cui si passa invece di solo un punto qualche informazione in più per posizionarsi?) // P.S: se ne è occupato Mirco! Ci metterà mano lui Vector2 pos1 = gui.Tabellone.Tile2Pixel(this.casellaPartenza); Vector2 pos2 = pos1; var lato = gui.Tabellone.LatoCasella; pos1 -= new Vector2(20 - lato / 2, 15); pos2 += new Vector2(20 + lato / 2, -15); bool puòRiconfig = !naveUsata.Riconfigurata; bool puòUsareSpecial = !naveUsata.SpecialUsata && checkSpecial(naveUsata); Riconfig = new Widget(pos1, doveDisegnoWidget.sinistra, widget.Riconfigura, puòRiconfig); Special = new Widget(pos2, doveDisegnoWidget.destra, widget.UsaSpecial, puòUsareSpecial); Riconfig.Click += riconfigura; Special.Click += usaSpecial; gui.Iscrivi(Riconfig); gui.Iscrivi(Special); }
public AzioneSpecialBattlestation(Quantum quantum, Casella posizioneIniziale) { this.quantum = quantum; this.posizione = posizioneIniziale; this.nave = posizione.Occupante; var bersagli = Tile.Tiles( (Tile t) => { var c = t as Casella; return c?.Adiacente(posizione, false) == true && c?.Occupante?.Alleato(quantum.getGestoreDiGiocatori().getGiocatoreDiTurno()) == false; }).Select(c => c.ID).ToArray(); quantum.getGUI().Tabellone.IlluminaCaselle(bersagli); quantum.getGUI().Tabellone.ResetSelezioneMouse(); ConsoleMessaggi.NuovoMessaggio("Scegli l'avversario da attaccare"); }
/// <summary> /// Azione per piazzare una nave dova clicca il giocatore /// </summary> public AzionePiazzaNave(Quantum quantum, Nave naveDaPiazzare, Casella[] caselleDisponibili) { // Piazzo una Nave in una casella arbitraria fra quelle dell'argomento this.quantum = quantum; this.caselleDisponibili = caselleDisponibili; this.naveDaPiazzare = naveDaPiazzare; quantum.getGUI().Tabellone.ResetSelezioneMouse(); if (!caselleDisponibili.Any()) { Interfaccia.ConsoleMessaggi.NuovoMessaggio("Impossibile piazzare la nave!", Color.Salmon); Cleanup(); } }
public AzioneSpecialFlagship(Quantum quantum, Casella casellaPartenza) { this.quantum = quantum; this.casellaFlagship = casellaPartenza; flagship = casellaPartenza.Occupante; // Selezione caselle da illuminare Func<Tile, bool> filtraAlleati = (t => t.EunaCasella && t.PresenzaAlleata(flagship)); int[] tiles = Tile.IdTiles(filtraAlleati); int[] caselle = tiles.Where(t => { return casellaFlagship.Adiacente(t, true); }).ToArray(); quantum.getGUI().Tabellone.IlluminaCaselle(caselle); fase = sceltaAlleato; Interfaccia.ConsoleMessaggi.NuovoMessaggio("Clicca su un alleato adiacente"); }
public AzioneSelezionePianeta(Quantum quantum, Pianeta pianeta) { this.quantum = quantum; this.pianeta = pianeta; GuiManager gui = quantum.getGUI(); Vector2 pos = gui.Tabellone.Tile2Pixel(pianeta); pos += new Vector2(gui.Tabellone.LatoCasella / 2, - gui.Tabellone.LatoCasella / 3); colonizza = new Widget(pos, doveDisegnoWidget.destra, widget.Colonizza, pianeta.Colonizzabile(quantum.getGestoreDiGiocatori().getGiocatoreDiTurno())); colonizza.Click += Colonizza; gui.Iscrivi(colonizza); gui.Tabellone.ResetSelezioneMouse(); gui.Tabellone.MostraSelezione = false; }
public AzioneInizioPartitaOffLine(Quantum quantum) { //EDIT: faccio tutto nel costruttore, tanto è una botta e via questa //REPLY: OK! Se il problema è che ti sta scomodo passare quantum, questa azione necessita // solo di GestoreDiAzioni e GestoreDiGiocatori per funzionare (in termini di memoria sono solo due liste, molto ragionevole). //Quindi si puo' costruirla come public AzioneInizioPartitaOffLine(GestoreDiAzioni a, GestoreDiGiocatori b). //Probabilmente vale anche per le altre azioni, avevo messo quantum in via provvisoria //EDIT2: serve anche la GUI a meno di non attivare i bottoni in qualche altro modo quantum.getGestoreDiAzioni().IncodaAzione(new AzioneStampaAConsole("Partita iniziata!")); foreach (Bottone b in quantum.getGUI().Bottoni) { b.Click += b.associatedEvent; } //probabilmente ha senso creare un'azione di inizio turno (che verrà usata anche dal bottone passa turno) quantum.getGestoreDiGiocatori().getGiocatoreDiTurno().Init(); quantum.getGestoreDiAzioni().IncodaAzione(new AzioneSelezione(quantum)); Cleanup(); }
//float pos = 0f; //Curve percorsoX; //Curve percorsoY; public Movimento(Quantum quantum, Nave naveMossa, Casella[] percorso) { // Avevo provato ad usare le curve, ma è un po' difficile (bisogna settare tutte le tangenti una per una) // e forse, con il tabellone quadrato, non viene nemmeno bene // però, con i percorsi dritti, viene un po' troppo squadrato // qualche idea? //percorsoX = new Curve(); //percorsoY = new Curve(); //float i = 0; //float n = percorso.Length; //foreach (var p in percorso) //{ // percorsoX.Keys.Add(new CurveKey(i / n, p.X)); // percorsoY.Keys.Add(new CurveKey(i / n, p.X)); // i++; //} this.quantum = quantum; this.naveMossa = naveMossa; _percorso = percorso.Select(casella => quantum.getGUI().Tabellone.Tile2Pixel(casella)).ToArray(); lungh = percorso.Length; }