コード例 #1
0
        /// <summary>
        /// This routine is what pulls up the GUI to assign units to a single combat
        /// </summary>
        /// <param name="singleCombat"></param>
        public void CallCombatDisplay(GameObject singleCombat)
        {
            Button okButton;
            Button cancelButton;
            Canvas combatCanvas = new Canvas();

            // I'm going to unhighight all the units potentially involved in this attack.  When selected for inclusion in the attack they
            // will be highlighted.  I will restore the must-attack and must-be-attacked highlighting when leaving the gui

            foreach (GameObject unit in singleCombat.GetComponent <Combat>().defendingUnits)
            {
                GlobalDefinitions.UnhighlightUnit(unit);
            }
            foreach (GameObject unit in singleCombat.GetComponent <Combat>().attackingUnits)
            {
                GlobalDefinitions.UnhighlightUnit(unit);
            }

            // The panel needs to be at least the width for four units to fit everything
            int maxUnits = 5;

            if (singleCombat.GetComponent <Combat>().defendingUnits.Count > maxUnits)
            {
                maxUnits = singleCombat.GetComponent <Combat>().defendingUnits.Count;
            }
            if (singleCombat.GetComponent <Combat>().attackingUnits.Count > maxUnits)
            {
                maxUnits = singleCombat.GetComponent <Combat>().attackingUnits.Count;
            }
            float panelWidth  = (maxUnits + 1) * GlobalDefinitions.GUIUNITIMAGESIZE;
            float panelHeight = 7 * GlobalDefinitions.GUIUNITIMAGESIZE;

            GlobalDefinitions.combatGUIInstance = GUIRoutines.CreateGUICanvas("CombatGUIInstance",
                                                                              panelWidth,
                                                                              panelHeight,
                                                                              ref combatCanvas);

            GUIRoutines.CreateUIText("Combat Odds", "OddsText",
                                     3 * GlobalDefinitions.GUIUNITIMAGESIZE,
                                     GlobalDefinitions.GUIUNITIMAGESIZE,
                                     (0.5f * (maxUnits + 1) * GlobalDefinitions.GUIUNITIMAGESIZE) - 0.5f * panelWidth,
                                     6.5f * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelHeight,
                                     Color.white, combatCanvas);

            float xSeperation = (maxUnits + 1) * GlobalDefinitions.GUIUNITIMAGESIZE / maxUnits;
            float xOffset     = xSeperation / 2;

            for (int index = 0; index < singleCombat.GetComponent <Combat>().defendingUnits.Count; index++)
            {
                Toggle tempToggle;
                tempToggle = GUIRoutines.CreateUnitTogglePair("unitToggleDefendingPair" + index,
                                                              index * xSeperation + xOffset - 0.5f * panelWidth,
                                                              5.5f * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelHeight,
                                                              combatCanvas,
                                                              singleCombat.GetComponent <Combat>().defendingUnits[index]);
                tempToggle.gameObject.AddComponent <CombatToggleRoutines>();
                tempToggle.gameObject.GetComponent <CombatToggleRoutines>().currentCombat     = singleCombat;
                tempToggle.gameObject.GetComponent <CombatToggleRoutines>().unit              = singleCombat.GetComponent <Combat>().defendingUnits[index];
                tempToggle.gameObject.GetComponent <CombatToggleRoutines>().attackingUnitFlag = false;
                tempToggle.onValueChanged.AddListener((bool value) => tempToggle.GetComponent <CombatToggleRoutines>().AddOrDeleteSelectedUnit());

                if (CheckForInvasionDefense(singleCombat.GetComponent <Combat>().defendingUnits[index], singleCombat))
                {
                    // This executes if the defender is on an invasion hex of at least one of the attackers.  If it is the toggle will be set and there are checks in the toggle routines from allowing
                    // it to be turned off.  If the defenders are being invaded they can't be attacked separately.
                    tempToggle.isOn         = true;
                    tempToggle.interactable = false;
                }
            }

            for (int index = 0; index < singleCombat.GetComponent <Combat>().attackingUnits.Count; index++)
            {
                Toggle tempToggle;
                tempToggle = GUIRoutines.CreateUnitTogglePair("unitToggleAttackingPair" + index,
                                                              index * xSeperation + xOffset - 0.5f * panelWidth,
                                                              3.5f * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelHeight,
                                                              combatCanvas,
                                                              singleCombat.GetComponent <Combat>().attackingUnits[index]);
                tempToggle.gameObject.AddComponent <CombatToggleRoutines>();
                tempToggle.gameObject.GetComponent <CombatToggleRoutines>().currentCombat     = singleCombat;
                tempToggle.gameObject.GetComponent <CombatToggleRoutines>().unit              = singleCombat.GetComponent <Combat>().attackingUnits[index];
                tempToggle.gameObject.GetComponent <CombatToggleRoutines>().attackingUnitFlag = true;
                tempToggle.onValueChanged.AddListener((bool value) => tempToggle.GetComponent <CombatToggleRoutines>().AddOrDeleteSelectedUnit());

                if (CheckForInvadingAttacker(singleCombat.GetComponent <Combat>().attackingUnits[index]))
                {
                    // This executes if the attacker is invading this turn. The unit will be selected and the toggle routines will not allow it to be turned off
                    tempToggle.isOn         = true;
                    tempToggle.interactable = false;
                }
            }

            GlobalDefinitions.combatAirSupportToggle    = null;
            GlobalDefinitions.combatCarpetBombingToggle = null;
            // If there are air missions left present the user with the option of adding air support to the attack
            if (GameControl.gameStateControlInstance.GetComponent <GameStateControl>().currentState.currentNationality == GlobalDefinitions.Nationality.Allied)
            {
                Toggle airToggle;
                airToggle = GUIRoutines.CreateToggle("CombatAirSupportToggle",
                                                     0.5f * (maxUnits + 1) * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelWidth - 2 * GlobalDefinitions.GUIUNITIMAGESIZE,
                                                     1.5f * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelHeight,
                                                     combatCanvas).GetComponent <Toggle>();
                GlobalDefinitions.combatAirSupportToggle = airToggle.gameObject;
                airToggle.gameObject.AddComponent <CombatToggleRoutines>();
                airToggle.gameObject.GetComponent <CombatToggleRoutines>().currentCombat = singleCombat;
                airToggle.onValueChanged.AddListener((bool value) => airToggle.GetComponent <CombatToggleRoutines>().ToggleAirSupport());
                if (GlobalDefinitions.tacticalAirMissionsThisTurn <= GlobalDefinitions.maxNumberOfTacticalAirMissions)
                {
                    airToggle.GetComponent <Toggle>().interactable = true;
                }
                else
                {
                    airToggle.GetComponent <Toggle>().interactable = false;
                }

                GUIRoutines.CreateUIText("Air Support", "CombatAirSupportText",
                                         1 * GlobalDefinitions.GUIUNITIMAGESIZE,
                                         1 * GlobalDefinitions.GUIUNITIMAGESIZE,
                                         0.5f * (maxUnits + 1) * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelWidth - 1 * GlobalDefinitions.GUIUNITIMAGESIZE,
                                         1.5f * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelHeight,
                                         Color.white, combatCanvas);

                Toggle carpetToggle;
                carpetToggle = GUIRoutines.CreateToggle("CombatCarpetBombingToggle",
                                                        0.5f * (maxUnits + 1) * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelWidth + 1 * GlobalDefinitions.GUIUNITIMAGESIZE,
                                                        1.5f * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelHeight,
                                                        combatCanvas).GetComponent <Toggle>();
                GlobalDefinitions.combatCarpetBombingToggle = carpetToggle.gameObject;
                carpetToggle.gameObject.AddComponent <CombatToggleRoutines>();
                carpetToggle.gameObject.GetComponent <CombatToggleRoutines>().currentCombat = singleCombat;
                carpetToggle.onValueChanged.AddListener((bool value) => carpetToggle.GetComponent <CombatToggleRoutines>().ToggleCarpetBombing());
                if (CheckIfCarpetBombingIsAvailable(singleCombat))
                {
                    carpetToggle.GetComponent <Toggle>().interactable = true;
                }
                else
                {
                    carpetToggle.GetComponent <Toggle>().interactable = false;
                }

                GUIRoutines.CreateUIText("Carpet Bombing", "CarpetBombingSupportText",
                                         1.5f * GlobalDefinitions.GUIUNITIMAGESIZE,
                                         1 * GlobalDefinitions.GUIUNITIMAGESIZE,
                                         0.5f * (maxUnits + 1) * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelWidth + 2 * GlobalDefinitions.GUIUNITIMAGESIZE,
                                         1.5f * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelHeight,
                                         Color.white, combatCanvas);
            }

            // OK button
            okButton = GUIRoutines.CreateButton("combatOKButton", "OK",
                                                0.5f * (maxUnits + 1) * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelWidth - 0.5f * GlobalDefinitions.GUIUNITIMAGESIZE,
                                                0.5f * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelHeight,
                                                combatCanvas);
            okButton.gameObject.AddComponent <CombatGUIOK>();
            okButton.gameObject.GetComponent <CombatGUIOK>().singleCombat = singleCombat;
            okButton.onClick.AddListener(okButton.GetComponent <CombatGUIOK>().OkCombatGUISelection);

            // Cancel button
            cancelButton = GUIRoutines.CreateButton("combatCancelButton", "Cancel",
                                                    0.5f * (maxUnits + 1) * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelWidth + 0.5f * GlobalDefinitions.GUIUNITIMAGESIZE,
                                                    0.5f * GlobalDefinitions.GUIUNITIMAGESIZE - 0.5f * panelHeight,
                                                    combatCanvas);
            cancelButton.gameObject.AddComponent <CombatGUIOK>();
            cancelButton.gameObject.GetComponent <CombatGUIOK>().singleCombat = singleCombat;
            cancelButton.onClick.AddListener(cancelButton.GetComponent <CombatGUIOK>().CancelCombatGUISelection);
        }