//---------------------------------------------------------------------------------- // 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
//---------------------------------------------------------------------------------- //-- controllo eli in hangar e moviementazione sul ponte ------------------// // è necessario controllare se gli eli assegnati sugli spot sono superiori al // numero di spot effettivamente disponibile, in tal caso gli eli devono essere riassegnati public int ElisSpotAutoHangarChangeNumber(SpotManager SpotM, InfoWindow WinI) { int n = this.EliOnDEck(); // numero di elicotteri pianificati sul ponte int k = SpotM.NumSpotEfficient(); // numero di spot efficienti presente int diff = (n - k); // qundo positivo indica il numero di elicotteri da ridurre int z = 0; // variabile indice int i = 0; // variabile indice // se il numero di elicotteri è superiore al nuemro di spot efficienti // allora serve ridurre il numero di elicottero sullo spot if (diff > 0) // se la diff è positiva il numero di eli assegnati al ponte supera il numero degli spot disponibili { WinI.InsertSomeText(" SIMULATORE: auto correzione del numero di elicotteri sul ponte. Decremento di " + diff + " unità"); // correzione del valore di posizione sui primi i elicotteri trovati while (i < diff) { if (this.ElicotteriList [z].PosEli == true) { this.ElicotteriList [z].PosEli = false; // cambio a false i++; // valore trovato incremento indice } z++; // incremento l'indice } return(k); // restituisce il numero di elicotteri ga gestire manualmente } return(n); // restituisce il numero di elicotteri da gestire manualmente }
//---------------------------------------------------------------------------------- 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"); } } }
// COSTRUTTORE DELLA CLASSE SPOT OPTION protected SpotOptions(int spot, InfoWindow _win) : base(Gtk.WindowType.Toplevel) { this.WinI = InfoWindow.Instance(); // gli passo la finestra informazioni _totSpot = spot; this._spotRec = 0; Build(); WinI.InsertSomeText("OPZIONI SPOT: EFFETTUATA APERTURA FINESTRA OPZIONI SPOT"); SpotM = (SpotManager)FactoryManager.Make(2, spot, WinI); // viene creato lo Spot Manager tramite factory method SpotM.MakeList(spot); // crea la lista iniziale di un numero di spot impostato this.label1.Text = ("Numero di Record SPOT # " + this._spotRec); this.InitValue(); this.label1.Text = "Record # " + _spotRec + " Record inseriti: " + SpotM.Spotlist.Count + " Record disponibli: " + this._totSpot; }
// le classi statiche non hanno un costruttore // con la variabile elementi viene indicato il numero iniziale di elementi che dovra' vestire il manager. public static AbstractManager Make(int id, int elementi, InfoWindow winI) { switch (id) { case 0: default: return(EliManager.Instance(elementi, winI)); // manager per elicotteri case 1: return(TroopsManager.Instance(elementi, winI)); // manager per truppe case 2: return(SpotManager.Instance(elementi, winI)); // manager per spot case 3: return(CargoManager.Instance(elementi, winI)); //manager per cargo } }
// 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 }
//istanza singleton è prevista l'esistenza di un'unica finestra public static SpotManager Instance(int SpotNum, InfoWindow winI) { if (instance == null) instance= new SpotManager( SpotNum , winI ); return instance; // ritorno il costruttore }
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 }
} // 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 }
// LIST DISPOSER MODULES // - controllo il numero di spot occupati // - calcolo lo spazio totate sugli eli // - distribuisco le truppe equamente sugli elicotteri public void EliSpotTroopDistribution (SpotManager SpotM , TroopsManager TroopsM , InfoWindow winI) { int totWEli=SpotM.TotalWEliSpotForTroopS(); // calcolo il peso totale disponibile dagli elicotteri sugli spot int totWTroops = TroopsM.TroopList.Count*TroopsM.SingleSoldierW; // calcolo il peso totale delle truppe da imbarcare int w_Embarcable=0;// peso imbarcabile corrispondente al minore tra il peso totale disponibile ed il peso totale truppe int troopsE=0;// truppe imbarcabili int i=0; // variabile indice if (totWTroops<totWEli) w_Embarcable=totWTroops; else w_Embarcable=totWEli; // se il peso totale dell truppe da imbarcare è // minore rispetto al peso totale disponibile sugli elicotteri // allora le truppe imbarcabili saranno il minimo tra i due valori troopsE=w_Embarcable/TroopsM.SingleSoldierW;//trasformo il peso imbarcabile in uomini da imbarcare winI.InsertSomeText("TROOPS DISPOSER: ponte di volo occupato da: "+SpotM.TotalElionDeck() + " Elicotteri sul ponte pronti per l'imbarco di "+troopsE +" truppe"); //trasferisco ogno uomo su ogni elicottero disponibile con una distribuzione alternata //su tutti gli elicotteri disponibili, la distribuzione di reitera fino a a quando tutti gli uomini // sono stati spostati sugli elicotteri. if (troopsE>0) // se esistono truppe da imbarcare while ( i<troopsE) // continua fino a quando l'indice è inferiore alle truppe { foreach (Spot spot in SpotM.Spotlist) // per ogni spot { // se spot occupato da un elicottero in moto e pale aperte e l'elicottero puo' ospitare le truppe, allora effettuo il carico if (spot != null && spot.Eli != null && !spot.Eli.IsBlocked // eli non bloccato &&!spot.Eli.IsFull // eli non pieno di cargo e truppe && !spot.Eli.isTroopsFull // eli non pieno di truppe && spot.Eli.IsRunning // eli in moto && spot.Eli.IsBladeSpread // eli a pale a perte && (TroopsM.TroopList.Count>0) // eli con truppe a bordo && (spot.Eli.WTroopsLeftOnBoard >= TroopsM.SingleSoldierW)) {// truppe accettabili superano il peso del singolo // scambio di lista, simulo che la truppa imbarca sull'elicottero sistemato sul ponte, la lista verra poi passata alla landing zone // per permettere lo sbarco della truppa TroopsM.TroopList [TroopsM.TroopList.Count - 1].IsEli = true; // imposto la truppa in elicottero spot.Eli.IstroopsOnBoard = true; // elicottero ha truppe a bordo try{ // sposto la truppa dalla lista truppe a bordo TroopsM.MoveElement (TroopsM.TroopList, spot.Eli.EliSoldierList, TroopsM.TroopList [(TroopsM.TroopList.Count) - 1]); } catch{ System.Console.WriteLine ("ERRORE SPOSTAMENTO TRUPPE"); } // alla lista truppe sull'elicottero spot.Eli.IsBoarding = true; // l'elicottero sta imbarcando truppe // diminuisco il peso totale disponibile sull'eli spot.Eli.WTroopsLeftOnBoard = (spot.Eli.WTroopsLeftOnBoard - TroopsM.SingleSoldierW); if (spot.Eli.WTroopsLeftOnBoard < TroopsM.SingleSoldierW) spot.Eli.isTroopsFull = true; // modifico la flag di full truppe if (spot.Eli.isTroopsFull && spot.Eli.IsCargoFull) spot.Eli.IsFull = true;; // modifico la flag di full cargo e truppe i++; // VAR INDICE,indica il numero di truppe spostate }}}// fine metodo // inserisco attesa elicotteri imbarco truppe se la variaibile is boarding is TRUE foreach (Spot spot in SpotM.Spotlist) { // per ogni spot if (spot.Eli != null && spot.Eli.IsBoarding) // gestione tempi attesa spot.Eli.EliBlock (StaticSimulator.timeToEmbarcTroops, 8); // blocco l'eli e resetto la variabile isBoarding to false } } // fine metodo