Пример #1
0
            public override void HandleClick()
            {
                bool clearSelectionFirst = false;
                bool unselectingInstead  = false;

                if (Engine_AIW2.Instance.PresentationLayer.GetAreInputFlagsActive(ArcenInputFlags.Additive))
                {
                }
                else if (Engine_AIW2.Instance.PresentationLayer.GetAreInputFlagsActive(ArcenInputFlags.Subtractive))
                {
                    unselectingInstead = true;
                }
                else
                {
                    clearSelectionFirst = true;
                }

                bool isAssigningToGroup = Engine_AIW2.Instance.PresentationLayer.GetAreInputFlagsActive(ArcenInputFlags.ModifyingControlGroup);

                ControlGroup group = this.GetControlGroup();

                if (group == null)
                {
                    return;
                }

                Planet planet   = Engine_AIW2.Instance.NonSim_GetPlanetBeingCurrentlyViewed();
                bool   foundOne = false;

                if (isAssigningToGroup)
                {
                    GameCommandType commandType = GameCommandType.SetControlGroupPopulation;
                    if (unselectingInstead)
                    {
                        commandType = GameCommandType.RemoveFromControlGroupPopulation;
                    }
                    else if (!clearSelectionFirst)
                    {
                        commandType = GameCommandType.AddToControlGroupPopulation;
                    }
                    else
                    {
                        commandType = GameCommandType.SetControlGroupPopulation;
                    }
                    GameCommand command = GameCommand.Create(commandType);
                    command.SentWithToggleSet_SetOrdersForProducedUnits = Engine_AIW2.Instance.SettingOrdersForProducedUnits;
                    command.RelatedControlGroup = group;
                    Engine_AIW2.Instance.DoForSelected(delegate(GameEntity selected)
                    {
                        command.RelatedEntityIDs.Add(selected.PrimaryKeyID);
                        return(DelReturn.Continue);
                    });
                    World_AIW2.Instance.QueueGameCommand(command);
                }
                else
                {
                    group.DoForEntities(delegate(GameEntity entity)
                    {
                        if (entity.Combat.Planet != planet)
                        {
                            return(DelReturn.Continue);
                        }
                        if (!foundOne)
                        {
                            foundOne = true;
                            if (clearSelectionFirst)
                            {
                                if (entity.GetIsSelected())
                                {
                                    Engine_AIW2.Instance.PresentationLayer.CenterPlanetViewOnEntity(entity, false);
                                }
                                Engine_AIW2.Instance.ClearSelection();
                            }
                        }
                        if (unselectingInstead)
                        {
                            entity.Unselect();
                        }
                        else
                        {
                            entity.Select();
                        }
                        return(DelReturn.Continue);
                    });
                    if (!foundOne && clearSelectionFirst)
                    {
                        Engine_AIW2.Instance.ClearSelection();
                        group.DoForEntities(delegate(GameEntity entity)
                        {
                            if (!foundOne)
                            {
                                foundOne = true;
                                Engine_AIW2.Instance.PresentationLayer.ReactToLeavingPlanetView(planet);
                                planet = entity.Combat.Planet;
                                World_AIW2.Instance.SwitchViewToPlanet(planet);
                                Engine_AIW2.Instance.PresentationLayer.CenterPlanetViewOnEntity(entity, true);
                                Engine_AIW2.Instance.PresentationLayer.ReactToEnteringPlanetView(planet);
                            }
                            if (entity.Combat.Planet != planet)
                            {
                                return(DelReturn.Continue);
                            }
                            entity.Select();
                            return(DelReturn.Continue);
                        });
                    }
                }
            }
Пример #2
0
        public static void Helper_FindAndPlaceCoreUnit(ControlGroup Group, ArcenPoint MoveOrderPoint, out ArcenSparseLookup <GameEntity, ArcenPoint> _entitiesToPlace, out GameEntity coreUnit, out int shieldCoverageRadiusOrEquivalent, out int paddingAroundEachUnit, out ArcenRectangle firstUnitRect)
        {
            Planet localPlanet = Engine_AIW2.Instance.NonSim_GetPlanetBeingCurrentlyViewed();

            ArcenSparseLookup <GameEntity, ArcenPoint> entitiesToPlace = _entitiesToPlace = new ArcenSparseLookup <GameEntity, ArcenPoint>();

            Group.DoForEntities(delegate(GameEntity entity)
            {
                if (entity.Combat.Planet != localPlanet)
                {
                    return(DelReturn.Continue);
                }
                entitiesToPlace[entity] = ArcenPoint.OutOfRange;
                return(DelReturn.Continue);
            });

            coreUnit = null;
            GameEntity backupCoreUnit = null;

            for (int i = 0; i < entitiesToPlace.GetPairCount(); i++)
            {
                GameEntity entity = entitiesToPlace.GetPairByIndex(i).Key;
                if (entity.TypeData.ShieldRadius <= 0)
                {
                    if (coreUnit == null)
                    {
                        if (backupCoreUnit != null)
                        {
                            if (entity.TypeData.BalanceStats.StrengthPerSquad <= backupCoreUnit.TypeData.BalanceStats.StrengthPerSquad)
                            {
                                continue;
                            }
                        }
                        backupCoreUnit = entity;
                    }
                    continue;
                }
                if (coreUnit != null)
                {
                    if (entity.TypeData.ShieldRadius < coreUnit.TypeData.ShieldRadius)
                    {
                        continue;
                    }
                    if (entity.TypeData.ShieldRadius == coreUnit.TypeData.ShieldRadius &&
                        entity.TypeData.BalanceStats.ShieldPoints <= coreUnit.TypeData.BalanceStats.ShieldPoints)
                    {
                        continue;
                    }
                }
                coreUnit = entity;
            }

            if (coreUnit == null)
            {
                backupCoreUnit = coreUnit;
            }

            int initialCoreRadius = 4;

            shieldCoverageRadiusOrEquivalent = initialCoreRadius;
            if (coreUnit != null)
            {
                entitiesToPlace[coreUnit]        = MoveOrderPoint;
                initialCoreRadius                = coreUnit.TypeData.Radius;
                shieldCoverageRadiusOrEquivalent = Math.Max(initialCoreRadius, coreUnit.GetCurrentShieldRadius());
            }

            paddingAroundEachUnit = 20;
            firstUnitRect.Width   = initialCoreRadius + initialCoreRadius + paddingAroundEachUnit;
            firstUnitRect.Height  = firstUnitRect.Width;
            firstUnitRect.X       = MoveOrderPoint.X - initialCoreRadius;
            firstUnitRect.Y       = MoveOrderPoint.Y - initialCoreRadius;
        }