예제 #1
0
        // disposizione di elicotteri e truppe
        public void InitDeckSpotAssign()
        {
            //--------------------------------------------------------------
            // fase inizializzazione GENERALE e controllo dei dati inseriti
            //--------------------------------------------------------------

            WinI.infoTimeList.Add(new InfoWindow.timeInfoStruct(EliM.MainTime.GetTime(), " - INIZIO MOVIMENTAZIONI PONTE- ", "", -1));
            this.WinI.InsertSomeText(" - SIMULATORE: INIZIO MOVIMENTAZIONI SUL PONTE");

            // crea la LZ e L'HP come membro di elimanager
            this.EliM.MakeHoldingPoint(3);             // creazione dell'HP con la distanza standard di 3 miglia dalla NAVE
            this.EliM.MakeLZ(this.Distance);           // viene creata la LZ con la distanza dalla nave
            //---------------------------------------------------------------------

            this.EliM.initEliNum = this.EliM.ElicotteriList.Count;        // salvo il numero iniziale di elicotteri poiche' la variabile tendera a mutare

            this.EliM.CheckSpotDataConsistency(SpotM, DNOps);             // controllo la consistenza dei dati sugli spot se esistono degli elicotteri
            // che non sono in gradi di ospitare gli spot è necessario eliminare gli elicotteri che non possono transitare sul ponte di volo
            // prima dell'inizio della simulazione

            this.EliM.CheckEliDataFuelConsistency(this.Distance);             // controllo il carburante a bordo degli elicotteri per poter effettuare la missione

            this.EliM.TroopsW_Data_correction(TroopM.SingleSoldierW);         // corregge i pesi degli elicotteri diventando multipli


            this.EliM.Check_Eli_Usability(WinI, TroopM, CargoM);              // controllo l'effettiva necessità iniziale degli elicotteri inseriti
            // elimino gli elicotteri che non servono alla missione


            EliM.EliAutoSpotAssign(SpotM, WinI, DNOps);              // assegnazione AUTOMATICA degli spot-possibile riduzione degli elicotteri
            // se gli elicotteri definiti sul ponte superano il numero degli spot assegnabili

            if (CargoM != null)                    // se il cargo è stato inserito
            {
                CargoM.CheckCargoIsFittable(EliM); // controllo che il cargo sia imbarcabile su almeno 1 elicottero
                // se i dati del cargo non sono coerenti con i pesi trasportabili dall'elicottero il cargo viene taggato non trasportabile
            }

            EliM.CheckState();         // eli manager check state
            TroopM.CheckState();       // troops manager check state
            SpotM.CheckState();        // spot manager check state
            simMoverLogic.AssignEli(); // assegna le destinazioni iniziali
            // INIZIO SIMULAZIONE
            this.Start();              // passa il controllo a start()
            // INIZIO SIMULAZIONE
        }
예제 #2
0
        }         // termine CheckCargoBoolZero-----------------------------------------------------------------

        //----------------------------------------------------------------------------------------------
        #region [LOGICA DI FUNZIONAMENTO DEL PROGRAMMA ]
        // LOOP LOGICO PRINCIPALE, QUI SI SVOLGE LA LOGICA DI FUNZIONAMENTO DEL PROGRAMMA //
        //----------------------------------------------------------------------------------------------
        // looping delle attività di controllo effettuate dalla logica del programma
        // le informazioni vengono passate al manager grafico per la visualizzazione
        // AL TERMINE DELL'AGGIORNAMENTO LOGICO VIENE RICHIAMATO IL LOOP
        // CHE SI OCCUPA DELL'AGGIORNAMENTO DELLA GRAFICA E DELLA VISUALIZZAZIONE
        public void LoopforUpdate(float elapsed)
        {
            this.FuelandBlockChekEliloop(elapsed);              // CONTROLLO E AGGIORNO FUEL A BORDO ELI

            // ----- inizio il loop con aggiorno gli STATI dei manager
            EliM.CheckState();
            SpotM.CheckState();
            TroopM.CheckState();
            //------termine controllo stati

            // CARGO-------------------------------------------------------------------------
            // controllo se esiste del cargo da prelevare
            // il cargo non deve essere inserito necessariamente negli elicotteri sul ponte
            // puo' essere inserito anche se gli elicotteri sono in hangar
            if (CargoM != null)
            {
                CargoM.CheckState();
                if (CargoM.Status != AbstractManager.StatusManager.Empty)
                {
                    // carica il cargo se disponibile sugli elicotteri disponibili
                    if (this.CargoM != null)
                    {
                        CargoM.CargoDistribution(WinI, EliM, TroopM); // distribuisci prima il cargo delle truppe,
                    }
                }                                                     // il cargo potrebbe non essere presente

                this.CheckEliRequired();                              // se gli elicotteri non sono required vengono rimessi in hangar
                CargoM.CheckState();                                  // aggiorno lo status del cargo
                TroopM.CheckState();                                  // aggiorno lo statu delle truppe
            }
            //-------------------------------------------------------------------------------------


            // SPOSTO ELI SUL PONTE ------------------------------------------------------------------
            // controllo se l'hangar ha ancora elicotteri da movimentare
            // se l'hangar è vuoto non ho possibilità di movimentare altri elicotteri
            // se il ponte è pieno non ho possibilità di movimentare gli elicotteri
            // inoltre se esistono piu' di due elicotteri bloccati non ne posso movimentare altri,
            // il ponte dispone solo di due elevatori per elicottero


            if (((EliM.Stato != AbstractManager.StatusManager.Empty) &&
                 (SpotM.Stato != AbstractManager.StatusManager.Full)) /*&& (EliM.CheckBlockedHangar()<=2)*/)
            {
                // sposta gli elicotteri sul ponte se ci sono spost liberi
                EliM.MoveEliOnSpot(SpotM, DNOps, WinI); // muovi, se possibile, gli elicotteri dall'hangar sugli spot
                EliM.CheckState();                      // check elim state
                SpotM.CheckState();                     // check spot state
            }


            //-------------------------------------------------------------------------------------------
            //  RUNNING AND BLADE SPREADING
            // controllo la presenza di elicotteri sul ponte
            if (SpotM.Stato != AbstractManager.StatusManager.Empty)
            {
                // controlla che gli elicotteri sul ponte siano funzionali per l'attività altrimenti li rimette in hangar
                this.CheckEliRequired();
                // metti in moto gli elicotteri sul ponte
                if ((EliM.CheckBlockedHangar() == 0))                    // se non ci sono piu' elicotteri in attesa in hangar

                // posso metter in moto tutti gli elicotteri sul ponte
                {
                    SpotM.AllEliSpottedRunning();                     // elicotteri sul ponte mettono in moto INIZIO FUEL CHECK

                    // apri le pale degli elicotteri sul ponte
                    SpotM.AllEliBladeSpreading();                     // elicotteri sul ponte aprono le pale pronti per l'imbarco

                    // controllo lo STATO del carburante degli elicotteri sul ponte PER LA MISSIONE
                    // se gli elciotteri hanno necessità di carburante devo effettuare il rifornimento
                    // avvinado un ritardo al decollo di 6 primi
                    SpotM.CheckHOTREFLowFuelState(EliM.initEliNum);
                }
            }

            //---------------------------------------------------------------------------------------------

            // SPOSTO LE TRUPPE A BORDO -------------------------------------------------------------------
            // controllo che ci siano truppe ancora non assegnate, che il ponte non sia vuoto e che gli elicotteri presenti non siano bloccati
            // le truppe devono essere assegnate agli elicotteri sul ponte running e a pale aperte

            if ((TroopM.Status == AbstractManager.StatusManager.CanAll) &&         // se il manager ha delle truppe
                (SpotM.Stato != AbstractManager.StatusManager.Empty) &&             // se il ponte ha degli elicotteri
                (EliM.ElicotteriList.FindAll(x => (x.IsRunning &&              // il numero di elicotteri running
                                                   !x.IsFlying &&// ma che non volano
                                                   !x.IsBlocked &&// elicottero non bloccato
                                                   !x.isTroopsFull)).Count > 0)) //  hanno spazio per le truppe
            // procedo con l'imbarco delle truppe se le condizioni sono corrette
            {
                //carica le truppe a bordo degli elicotteri disponibili sul ponte
                TroopM.EliSpotTroopDistribution(SpotM, TroopM, WinI); // muovi le truppe sul sugli spot dopo l'apertura

                TroopM.CheckState();                                  // aggiorno lo stato delle truppe dopo l'imbarco
                this.CheckEliRequired();                              // se gli elicotteri non sono required vengono rimessi in hangare successivamente eliminati
            }

            //-----------------------------------------------------------------------------------------------

            // HOT REF, READY STATUS, TAKE OFF PER TUTTI GLI ELICOTTERI SUL PONTE-------------------------
            // controllo che esistano elicotteri sul ponte per il decollo
            if (SpotM.Stato != AbstractManager.StatusManager.Empty)
            {
                // se gli elicotteri sul ponte non bloccati assumono lo stato di pronti al decollo
                SpotM.EliReadyStatus();                  // gli elicotteri in volo non entrano in questo loop
                // viene settata la velocità di crociera per gli elicotteri decollati

                this.SpotM.AllEliTakingOff(this.Speed);                  // decolla ed assume destinazione HP
                // gli eicotteri in volo non entrano in questo loop
                // assegna una destinazione agli elicotteri (HP , LZ , DECK )

                //RICONTROLLO GLI STATI -----
                EliM.CheckState();                 // controlla lo stato hangat
                SpotM.CheckState();                // controlla lo stato ponte
                this.AssignEli();                  // assegna una destinazione vettoriale
                //---------------------------
            }

            //----------------------------------------------------------------
            // se gli elicotteri disponibi sono tutti in HP lascia  HP
            // e assegna LZ come nuova destinazione
            if (EliM.HoldingP.EliHolding.Count > 0)
            {
                // controlla che tutti gli elicotteri disponibili siano in HP
                this.HPCheckAndChange();
            }

            // se l'elicottero è sulla LZ sbarca le truppe
            if (EliM.LandingZoneL.LZeliList.Count > 0)
            {
                this.LZTroopsandCargo_Disembark_changeDST(); //TRUPPE E CARGO RILASCIO

                TroopM.CheckState();                         // aggiorno lo statu delle truppe
                EliM.CheckState();
            }                                                // controllo gli spot assegnabili

            if (EliM.LandingZoneL.LZeliList.Count > 0)
            {
                EliM.LandingZoneL.LZeliList.RemoveAll(x => x.isLZ == false);                  // rimuovo dalla LZ l'elicottero ridecollato
            }
            // se il numero di elicotteri lista è 0
            // in quanto se non utili sono stati eliminati
            // allora fine simulazione raggiunto
            //controllo la fine della simulazione
            if (EliM.ElicotteriList.Count == 0)
            {
                this.EndProgramState = true;
                // loggo il tempo di termine operazioni
                WinI.InsertSomeText("TERMINE OPERAZIONI " + EliM.MainTime.GetTime().ToString());
                WinI.InsertEvent(EliM.MainTime.GetTime(), "TERMINE OPERAZIONI ", "", -2);
                // loggo il tempo di termine operazioni

                // MOTIVAZIONI PROGRAM FAIL
                if (this.TroopM.TroopList.Count == 0 && CheckCargoBoolZero()) // se il numero di truppe da trasportare ==0 e il cargo è == 0
                {                                                             // simulazione terminata con successo altrimenti simulazione fallita
                    WinI.InsertSomeText("SIMULAZIONE TERMINATA CON SUCCESSO");
                    WinI.InsertEvent(EliM.MainTime.GetTime(), "SIMULAZIONE TERMINATA CON SUCCESSO ", "", -3);
                }
                else
                {
                    WinI.InsertSomeText("SIMULAZIONE FALLITA");
                    WinI.InsertEvent(EliM.MainTime.GetTime(), "SIMULAZIONE FALLITA ", "", -3);
                }
                // stoppa i thread ------------------------
                EliM.MainTime.Stop();
                //-----------------------------------------
            }

            this.EliMovingLogic(elapsed);                      // logica movimento eli
        }