public static bool IsHoldPsionic(Psionic psi) { if (psi == null) { return(false); } switch (psi.Type) { case SectionEnumerations.PsionicAbility.TKFist: case SectionEnumerations.PsionicAbility.Hold: case SectionEnumerations.PsionicAbility.Crush: case SectionEnumerations.PsionicAbility.Repair: case SectionEnumerations.PsionicAbility.Fear: case SectionEnumerations.PsionicAbility.Posses: case SectionEnumerations.PsionicAbility.PsiDrain: case SectionEnumerations.PsionicAbility.Control: case SectionEnumerations.PsionicAbility.LifeDrain: case SectionEnumerations.PsionicAbility.Movement: return(true); case SectionEnumerations.PsionicAbility.Reflector: case SectionEnumerations.PsionicAbility.AbaddonLaser: case SectionEnumerations.PsionicAbility.Inspiration: case SectionEnumerations.PsionicAbility.Reveal: case SectionEnumerations.PsionicAbility.Listen: case SectionEnumerations.PsionicAbility.Block: case SectionEnumerations.PsionicAbility.WildFire: case SectionEnumerations.PsionicAbility.Mirage: case SectionEnumerations.PsionicAbility.FalseFriend: return(false); default: return(false); } }
private void ClearHoldPsionic() { if (this.m_HoldPsionic == null) { return; } this.m_HoldPsionic.Deactivate(); this.m_HoldPsionic = (Psionic)null; }
public ShipPsionicControl(App game, CombatAI commanderAI, Ship ship) { this.m_Game = game; this.m_CommanderAI = commanderAI; this.m_Ship = ship; this.m_HoldPsionic = (Psionic)null; this.m_MinFrames = ship.IsSuulka ? ShipPsionicControl.kSuulkaMinThinkDelay : ShipPsionicControl.kMinThinkDelay; this.m_MaxFrames = ship.IsSuulka ? ShipPsionicControl.kSuulkaMaxThinkDelay : ShipPsionicControl.kMaxThinkDelay; this.m_CurrMaxUpdateFrame = commanderAI.AIRandom.NextInclusive(this.m_MinFrames, this.m_MaxFrames); this.m_CurrUpdateFrame = this.m_CurrMaxUpdateFrame; this.m_State = PsionicControlState.Think; }
private void ChoosePsionic() { if (this.m_Ship == null || this.m_Ship.Target == null) { return; } this.m_HoldPsionic = (Psionic)null; Psionic psionic1 = (Psionic)null; float maxValue = 0.0f; Dictionary <Psionic, float> dictionary = new Dictionary <Psionic, float>(); foreach (Psionic psionic2 in this.m_Ship.Psionics) { float weightForPsionic = ShipPsionicControl.GetWeightForPsionic(this.m_CommanderAI, this.m_Ship, psionic2); if ((double)weightForPsionic > 0.0) { dictionary.Add(psionic2, weightForPsionic); maxValue += weightForPsionic; } } if (dictionary.Count == 0) { this.m_State = PsionicControlState.Think; } else { float num = this.m_CommanderAI.AIRandom.NextInclusive(1f, maxValue); foreach (KeyValuePair <Psionic, float> keyValuePair in dictionary) { if ((double)num <= (double)keyValuePair.Value) { psionic1 = keyValuePair.Key; break; } num -= keyValuePair.Value; } if (psionic1 == null) { return; } psionic1.Activate(); if (ShipPsionicControl.IsHoldPsionic(psionic1)) { this.m_State = PsionicControlState.HoldPsionic; this.m_HoldPsionic = psionic1; } else { switch (psionic1.Type) { case SectionEnumerations.PsionicAbility.Repair: case SectionEnumerations.PsionicAbility.Inspiration: case SectionEnumerations.PsionicAbility.Block: psionic1.PostSetProp("SetTarget", (IGameObject)this.m_CommanderAI.GetFriendlyShips()[this.m_CommanderAI.AIRandom.Next(this.m_CommanderAI.GetFriendlyShips().Count)]); break; default: psionic1.PostSetProp("SetTarget", this.m_Ship.Target.ObjectID); break; } psionic1.Deactivate(); this.m_State = PsionicControlState.Think; } } }
public static float GetWeightForPsionic(CombatAI cmdAI, Ship ship, Psionic psi) { float num = 0.0f; if (psi != null && ship != null && !psi.IsActive) { switch (psi.Type) { case SectionEnumerations.PsionicAbility.TKFist: case SectionEnumerations.PsionicAbility.AbaddonLaser: num = 50f; break; case SectionEnumerations.PsionicAbility.Hold: case SectionEnumerations.PsionicAbility.Repair: case SectionEnumerations.PsionicAbility.Fear: case SectionEnumerations.PsionicAbility.WildFire: case SectionEnumerations.PsionicAbility.Control: case SectionEnumerations.PsionicAbility.Mirage: case SectionEnumerations.PsionicAbility.FalseFriend: num = 10f; break; case SectionEnumerations.PsionicAbility.Crush: case SectionEnumerations.PsionicAbility.Reflector: case SectionEnumerations.PsionicAbility.Posses: case SectionEnumerations.PsionicAbility.LifeDrain: case SectionEnumerations.PsionicAbility.Invisibility: case SectionEnumerations.PsionicAbility.Movement: num = 15f; break; case SectionEnumerations.PsionicAbility.Inspiration: case SectionEnumerations.PsionicAbility.Block: bool flag1 = false; foreach (EnemyGroup enemyGroup in cmdAI.GetEnemyGroups()) { foreach (Ship ship1 in enemyGroup.m_Ships) { using (IEnumerator <Psionic> enumerator = ship1.Psionics.GetEnumerator()) { if (enumerator.MoveNext()) { Psionic current = enumerator.Current; flag1 = true; } } if (flag1) { break; } } if (flag1) { break; } } num = !flag1 ? 0.0f : 50f; break; case SectionEnumerations.PsionicAbility.Reveal: bool flag2 = false; foreach (EnemyGroup enemyGroup in cmdAI.GetEnemyGroups()) { foreach (Ship ship1 in enemyGroup.m_Ships) { if ((double)cmdAI.GetCloakedDetectionPercent(ship1) < 1.0) { flag2 = true; break; } } if (flag2) { break; } } num = !flag2 ? 0.0f : 50f; break; case SectionEnumerations.PsionicAbility.PsiDrain: if (ship.CurrentPsiPower < (int)((double)ship.MaxPsiPower * 0.899999976158142)) { num = 10f; if (ship.CurrentPsiPower < ship.MaxPsiPower / 2) { num += 20f; break; } break; } num = 0.0f; break; } } return(num); }
public static bool CanUsePsionic(Ship ship, Psionic psi, CombatAI cmdAI) { if (ship == null || psi == null || psi == null) { return(false); } switch (psi.Type) { case SectionEnumerations.PsionicAbility.TKFist: case SectionEnumerations.PsionicAbility.Hold: case SectionEnumerations.PsionicAbility.Crush: case SectionEnumerations.PsionicAbility.Reflector: case SectionEnumerations.PsionicAbility.AbaddonLaser: case SectionEnumerations.PsionicAbility.Fear: case SectionEnumerations.PsionicAbility.Posses: case SectionEnumerations.PsionicAbility.WildFire: case SectionEnumerations.PsionicAbility.Control: if (ship.Target is Ship) { Ship target = ship.Target as Ship; float num = ship.SensorRange + target.ShipSphere.radius; if ((double)(ship.Position - target.Position).Length < (double)num * (double)num) { return(true); } break; } break; case SectionEnumerations.PsionicAbility.Repair: case SectionEnumerations.PsionicAbility.Inspiration: case SectionEnumerations.PsionicAbility.Reveal: case SectionEnumerations.PsionicAbility.Block: case SectionEnumerations.PsionicAbility.Mirage: case SectionEnumerations.PsionicAbility.FalseFriend: case SectionEnumerations.PsionicAbility.Movement: return(true); case SectionEnumerations.PsionicAbility.PsiDrain: case SectionEnumerations.PsionicAbility.LifeDrain: if (ship.Target != null) { if (ship.Target is Ship) { Ship target = ship.Target as Ship; float num = ship.SensorRange + target.ShipSphere.radius; if ((double)(ship.Position - target.Position).Length < (double)num * (double)num) { return(true); } break; } if (ship.Target is StellarBody) { StellarBody target = ship.Target as StellarBody; float num = ship.SensorRange + target.Parameters.Radius; if ((double)(ship.Position - target.Parameters.Position).Length < (double)num * (double)num) { return(true); } break; } break; } break; } return(false); }