internal ArrangementOrder(ArrangementOrder.ArrangementOrderEnum orderEnum) { this.OrderEnum = orderEnum; this._walkRestriction = new float?(); switch (this.OrderEnum) { case ArrangementOrder.ArrangementOrderEnum.Circle: this._runRestriction = new float?(0.5f); break; case ArrangementOrder.ArrangementOrderEnum.Line: this._runRestriction = new float?(0.8f); break; case ArrangementOrder.ArrangementOrderEnum.Loose: case ArrangementOrder.ArrangementOrderEnum.Scatter: case ArrangementOrder.ArrangementOrderEnum.Skein: this._runRestriction = new float?(0.9f); break; case ArrangementOrder.ArrangementOrderEnum.ShieldWall: case ArrangementOrder.ArrangementOrderEnum.Square: this._runRestriction = new float?(0.3f); break; default: this._runRestriction = new float?(1f); break; } this._unitSpacing = ArrangementOrder.GetUnitSpacingOf(this.OrderEnum); this.tickTimer = new Timer(MBCommon.GetTime(MBCommon.TimeType.Mission), 0.5f); }
public static Agent.UsageDirection GetShieldDirectionOfUnit( Formation formation, Agent unit, ArrangementOrder.ArrangementOrderEnum orderEnum) { Agent.UsageDirection usageDirection; if (formation.IsUnitDetached(unit)) { usageDirection = Agent.UsageDirection.None; } else { switch (orderEnum) { case ArrangementOrder.ArrangementOrderEnum.Circle: case ArrangementOrder.ArrangementOrderEnum.Square: usageDirection = ((IFormationUnit)unit).FormationRankIndex != 0 ? Agent.UsageDirection.AttackEnd : Agent.UsageDirection.DefendDown; break; case ArrangementOrder.ArrangementOrderEnum.ShieldWall: IFormationUnit unit1 = (IFormationUnit)unit; usageDirection = unit1.FormationRankIndex != 0 ? (formation.arrangement.GetNeighbourUnitOfLeftSide(unit1) != null ? (formation.arrangement.GetNeighbourUnitOfRightSide(unit1) != null ? Agent.UsageDirection.AttackEnd : Agent.UsageDirection.DefendRight) : Agent.UsageDirection.DefendLeft) : Agent.UsageDirection.DefendDown; break; default: usageDirection = Agent.UsageDirection.None; break; } } return(usageDirection); }
internal void OnApply(Formation formation) { formation.SetPositioning(unitSpacing: new int?(this.GetUnitSpacing())); this.Rearrange(formation); if (this.OrderEnum == ArrangementOrder.ArrangementOrderEnum.Scatter) { this.TickOccasionally(formation); } ArrangementOrder.ArrangementOrderEnum orderEnum = this.OrderEnum; formation.ApplyActionOnEachUnit((Action <Agent>)(agent => { if (agent.IsAIControlled) { Agent.UsageDirection shieldDirectionOfUnit = ArrangementOrder.GetShieldDirectionOfUnit(formation, agent, orderEnum); agent.EnforceShieldUsage(shieldDirectionOfUnit); } agent.UpdateAgentProperties(); })); if (formation.MovementOrder.OrderEnum != MovementOrder.MovementOrderEnum.Charge && formation.MovementOrder.OrderEnum != MovementOrder.MovementOrderEnum.ChargeToTarget) { if (this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Circle && this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.ShieldWall && (this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Square && this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Column)) { formation.ApplyActionOnEachUnit(new Action <Agent>(MovementOrder.SetDefaultMoveBehaviorValues)); } else if (this.OrderEnum != ArrangementOrder.ArrangementOrderEnum.Column) { formation.ApplyActionOnEachUnit(new Action <Agent>(MovementOrder.SetDefensiveArrangementMoveBehaviorValues)); } else { formation.ApplyActionOnEachUnit(new Action <Agent>(MovementOrder.SetFollowBehaviorValues)); } } this.tickTimer = new Timer(MBCommon.GetTime(MBCommon.TimeType.Mission), 0.5f); }
internal static int GetUnitSpacingOf(ArrangementOrder.ArrangementOrderEnum a) { if (a == ArrangementOrder.ArrangementOrderEnum.Loose) { return(2); } return(a == ArrangementOrder.ArrangementOrderEnum.ShieldWall ? 0 : 1); }
internal static bool GetUnitLooseness(ArrangementOrder.ArrangementOrderEnum a) => a != ArrangementOrder.ArrangementOrderEnum.ShieldWall;