Esempio n. 1
0
        //----------------------------------------------------------------------------------
        // 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
Esempio n. 2
0
        //----------------------------------------------------------------------------------
        //-- 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
        }
Esempio n. 3
0
        //----------------------------------------------------------------------------------

        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");
                }
            }
        }
Esempio n. 4
0
 // 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;
 }
Esempio n. 5
0
        // 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
            }
        }
Esempio n. 6
0
        // 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
        }
Esempio n. 7
0
		//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	
		}
Esempio n. 8
0
        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
        }
Esempio n. 9
0
        }                                               // 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
        }
Esempio n. 10
0
		// 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