// restituisce il primo spot efficiente in grado di ospitare una determinata categoria di elicottero // se non ci sono spot efficienti allora viene restituito il valore nullo public Spot SpotToHostaCat (int catEli, Spot.day_night _dn) { if (this.Spotlist.Count > 0) { // controllo se il numero di spot presenti è maggiore di 0 foreach (Spot _spot in this.Spotlist) { if (_spot.SpotRunnable && (!_spot.SpotOccupied) && !_spot.IsReservd) { // controllo se lo spot trovat è efficiente e non è gia occupato if (_dn == Spot.day_night.day) { // controllo le cateogire accettate di giorno if (((catEli == 1) && (_spot.DayCanAccept.Cat1 == true)) || ((catEli == 2) && (_spot.DayCanAccept.Cat2 == true)) || ((catEli == 3) && (_spot.DayCanAccept.Cat3 == true))) return _spot; } else {// qua la categoria deve essere per forza notturna if (((catEli == 1) && (_spot.NightCanAccept.Cat1 == true)) || ((catEli == 2) && (_spot.NightCanAccept.Cat2 == true)) || ((catEli == 3) && (_spot.NightCanAccept.Cat3 == true))) return _spot; } } } } return null; }// fine metodo SpotToHostaCat
//---------------------------------------------------------------------------------- // assegnazione degli elicotteri assegnati agli spot // è necessario assegnare agli spot gli elicotteri che di default sono stati posizionati sugli spot public void EliAutoSpotAssign(SpotManager SpotM, InfoWindow winI, Spot.day_night DN) { // cambia automanticamente il numero di elicotteri assegnati sul ponte // la funzione assicura che il nuemero di eli è inferiore o uguale agli spot disponibili // e restituisce il numero di elicotteri da gestire per l'assegnazione automatica degli spot int manualAssign = this.ElisSpotAutoHangarChangeNumber(SpotM, winI); // una volta determinato il numero di elicotteri da assegnare procedo con l'assegnazione if (manualAssign > 0) // se il numero di assegnazioni è maggiore di 0 creo la finestra per le assegnazioni { foreach (Elicottero eli in this.ElicotteriList) { if (eli.PosEli) // se l'elicottero è posizionato sul ponte di default cerco di assegnarlo ad uno spot { Spot spot = SpotM.SpotToHostaCat(eli.CatEli, DN); if (spot != null) { winI.InsertSomeText("SIMULATOR: Spot trovato per assegnazione AUTOMATICA: " + spot.SpotPos); eli.DirToGo = Elicottero.Direction.hp; // direzione assegnata all'eli sul ponte holding point eli.SpotAssigned = spot; // spot assegnato eli.PosEli = true; // posizione elicottero sul ponte spot.IsReservd = true; // lo spot viene riservato spot.eliWhoReservd = eli; // l'elicottero che ha richiesto il reserve spot.Eli = eli; // assegno l'elicottero spot.SpotOccupied = true; // lo spot e' occupato } } } } } // fine metodo
} // flag di fine simulazione // costruttore della classe public SimMover(Spot.day_night _dnOps, InfoWindow _winI, TroopsManager _troopM, EliManager _eliM, SpotManager _spotM, CargoManager _cargoM) { this.DNOps = _dnOps; // passo la struttua giorno notte this.WinI = _winI; // passo la finestra informazioni this.TroopM = _troopM; // passo il manager truppe this.EliM = _eliM; // passo il manager elicotteri this.SpotM = _spotM; // passo il manager spot this.CargoM = _cargoM; // passo il manager cargo this.Speed = 100; // set iniziale della velocità pari a 100 knots this.EndProgramState = false; // inizializzo l'end state a falso }
//---------------------------------------------------------------------------------- public void CheckSpotDataConsistency(SpotManager spotm, Spot.day_night _dn) { foreach (Elicottero eli in this.ElicotteriList) { if (spotm.SpotToHostaCat(eli.CatEli, _dn) == null) { eli.IsEfficient = false; eli.isRequiredForOP = false; WinI.InsertSomeText("SIMULATOR: rimosso elicottero " + eli.IdEli + " ,nessuno spot accessibile"); } } }
public bool assignEnded; // se TRUE indica l'assegnazione iniziale degli spot dedicati // al simulatore vengono passate tutte le informazioni necessarie alla simulazione degli eventi public Simulator(int distance, Spot.day_night _dnOps, InfoWindow _winI, TroopsManager _troopM, EliManager _eliM, SpotManager _spotM, CargoManager _cargoM) { // passo al simulatore TUTTE le informazioni necessarie this.DNOps = _dnOps; // operazione day night this.TroopM = _troopM; // manager truppe e lista truppe this.EliM = _eliM; // manager eli e lista eli this.SpotM = _spotM; // magaer spot e lista spot this.CargoM = _cargoM; // manager cargo e lista cargo this.WinI = _winI; // information window this.Distance = distance; // pass il paramentro distanz this.WinI.InsertSomeText("SIMULATOR: simulatore creato. Effettuo l'inizializzazione...."); // creazione della logica di gesitione e della grafica di funzionamento simMoverLogic = new SimMover(this.DNOps, this.WinI, this.TroopM, this.EliM, this.SpotM, this.CargoM); simulG = new GrafXNA(this.simMoverLogic); // costruzione del supporto grafico di riferimento }
// LIST DISPOSER METODI - metodi di movimentazione degli elementi in relazione agli altri manager #region list disposer // sposta gli elicotteri sugli spot se questi possono contenerli public void MoveEliOnSpot(SpotManager SpotM, Spot.day_night DN, InfoWindow WinI) { bool elidispoSuccess; // flag disposizione avvenuta con successo // controllo se esistono elicotteri che possono essere ospitati dagli spot per le caratteristiche // che hanno elicottero e spot foreach (Elicottero eli in this.ElicotteriList) { if (!eli.IsBlocked && // controllo se l'elico non è bloccato ed è in hangar !eli.PosEli && // eli è in hangar !eli.hasSpotReserved // eli non ha riservato uno spot ) { Spot _spot = SpotM.SpotToHostaCat(eli.CatEli, DN); //ritorno il primo spot in grado di ospitare l'elicottero if (_spot != null) // se lo spot è stato trovato { WinI.InsertSomeText("Spot trovato per assegnazione: " + _spot.SpotPos); // scrittura info // viene se l'elicottero è efficiente, la posizione è in hangar //e lo spot esiste e non è riservato ad altri elicotteri // inoltre possono essere movimentati solo due elicotteri alla volta if (elidispoSuccess = SpotM.SpotEliAssign(eli, _spot)) // prova ad assegnare l'elicottero { WinI.InsertSomeText("DISPOSER: movimentato elicottero : " + eli.IdEli + " su spot: " + eli.Spotrequested.SpotPos); } } else { WinI.InsertSomeText("DISPOSER: movimentazione elicottero " + eli.IdEli + " non effettuabile"); } } //termine IF } // termin foreach elicottero ciclo }
// menu - opzioni simulazione - operazioni notturne protected void OnNotteActionActivated(object sender, EventArgs e) { DNOperation = Spot.day_night.night; // setto lo sbarco notturne InformationWin.InsertSomeText("MAIN WINDOW: selezionata operazione NOTTURNA"); }
//menu - opzioni simulazione - operazioni diurne protected void OnGiornoAction2Activated(object sender, EventArgs e) { DNOperation = Spot.day_night.day; // setto lo sbarco diurno InformationWin.InsertSomeText("MAIN WINDOW: selezionata operazione DIURNA"); }