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); }); } } }
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; }