// 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 }
} // 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 }