Ejemplo n.º 1
0
 static void PostfixCalculateCurrentOrder(Formation ____mainFormation, ref FacingOrder ___CurrentFacingOrder)
 {
     if (____mainFormation != null)
     {
         ___CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(____mainFormation.Direction);
     }
 }
Ejemplo n.º 2
0
 static void PostfixCalculateCurrentOrder(Formation ____mainFormation, ref FacingOrder ___CurrentFacingOrder)
 {
     if (____mainFormation != null)
     {
         MethodInfo method = typeof(FacingOrder).GetMethod("FacingOrderLookAtDirection", BindingFlags.NonPublic | BindingFlags.Static);
         method.DeclaringType.GetMethod("FacingOrderLookAtDirection");
         ___CurrentFacingOrder = (FacingOrder)method.Invoke(___CurrentFacingOrder, new object[] { ____mainFormation.Direction });
     }
 }
Ejemplo n.º 3
0
            static void PostfixCalculateCurrentOrder(Formation ____mainFormation, Formation ___formation, ref MovementOrder ____currentOrder, ref FacingOrder ___CurrentFacingOrder)
            {
                if (____mainFormation != null && ___formation != null)
                {
                    ___CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(____mainFormation.Direction);

                    WorldPosition medianPosition = ____mainFormation.QuerySystem.MedianPosition;
                    //medianPosition.SetVec2(medianPosition.AsVec2 - ____mainFormation.Direction * ((____mainFormation.Depth + ___formation.Depth) * 1.5f));
                    medianPosition.SetVec2(medianPosition.AsVec2 - ____mainFormation.Direction * ((____mainFormation.Depth + ___formation.Depth) * 0.25f + 0.0f));
                    ____currentOrder = MovementOrder.MovementOrderMove(medianPosition);
                }
            }
Ejemplo n.º 4
0
        static bool PrefixCalculateCurrentOrder(ref Formation ___formation, ref MovementOrder ____currentOrder, ref FacingOrder ___CurrentFacingOrder)
        {
            if (___formation != null && ___formation.QuerySystem.IsInfantryFormation && ___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation != null)
            {
                Formation significantEnemy = Utilities.FindSignificantEnemy(___formation, true, true, false, false, false);
                if (significantEnemy != null)
                {
                    ___formation.ArrangementOrder = ArrangementOrder.ArrangementOrderLine;
                    ___formation.FiringOrder      = FiringOrder.FiringOrderFireAtWill;
                    ___formation.FormOrder        = FormOrder.FormOrderWide;
                    ___formation.WeaponUsageOrder = WeaponUsageOrder.WeaponUsageOrderUseAny;

                    WorldPosition medianPosition = ___formation.QuerySystem.MedianPosition;
                    ____currentOrder = MovementOrder.MovementOrderMove(medianPosition);

                    Vec2 direction = (significantEnemy.QuerySystem.MedianPosition.AsVec2 - ___formation.QuerySystem.AveragePosition).Normalized();
                    ___CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(direction);

                    return(false);
                }
            }
            return(true);
        }
Ejemplo n.º 5
0
        private void Check()
        {
            float time = this.Mission.Time;

            if (this._battlePhase == CPUBenchmarkMissionLogic.BattlePhase.Start && (double)time >= 5.0)
            {
                this.Mission.IsTeleportingAgents = false;
                this._battlePhase = CPUBenchmarkMissionLogic.BattlePhase.ArrowShower;
            }
            else
            {
                if (this._battlePhase == CPUBenchmarkMissionLogic.BattlePhase.Start)
                {
                    return;
                }
                if (!this._isCurPhaseInPlay)
                {
                    Debug.Print("State: " + (object)this._battlePhase, color: Debug.DebugColor.Cyan, debugFilter: 64UL);
                    switch (this._battlePhase)
                    {
                    case CPUBenchmarkMissionLogic.BattlePhase.ArrowShower:
                        this._attLeftRanged.FiringOrder    = FiringOrder.FiringOrderFireAtWill;
                        this._attRightRanged.FiringOrder   = FiringOrder.FiringOrderFireAtWill;
                        this._defLeftBInf.FiringOrder      = FiringOrder.FiringOrderFireAtWill;
                        this._defRightBInf.FiringOrder     = FiringOrder.FiringOrderFireAtWill;
                        this._defMidBInf.FiringOrder       = FiringOrder.FiringOrderFireAtWill;
                        this._defLeftInf.ArrangementOrder  = ArrangementOrder.ArrangementOrderShieldWall;
                        this._defRightInf.ArrangementOrder = ArrangementOrder.ArrangementOrderShieldWall;
                        this._defLeftInf.FormOrder         = FormOrder.FormOrderCustom(35f);
                        this._defRightInf.FormOrder        = FormOrder.FormOrderCustom(35f);
                        this._attLeftInf.ArrangementOrder  = ArrangementOrder.ArrangementOrderShieldWall;
                        this._attRightInf.ArrangementOrder = ArrangementOrder.ArrangementOrderShieldWall;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.MeleePosition:
                        Vec3 vec3_1 = -(this._attLeftInf.OrderPosition.Position - this._defRightInf.OrderPosition.Position);
                        Vec3 vec3_2 = -(this._attRightInf.OrderPosition.Position - this._defLeftInf.OrderPosition.Position);
                        vec3_1.RotateAboutZ((float)Math.PI / 36f);
                        vec3_2.RotateAboutZ(-1f * (float)Math.PI / 36f);
                        this._attLeftInf.MovementOrder  = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, this._attLeftInf.OrderPosition.Position + vec3_1));
                        this._attRightInf.MovementOrder = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, this._attRightInf.OrderPosition.Position + vec3_2));
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.Cav1Pos:
                        Vec3 position1  = this._attLeftRanged.OrderPosition.Position;
                        Vec2 direction1 = this._attLeftRanged.Direction;
                        Vec3 vec3_3     = position1 - 15f * direction1.ToVec3();
                        direction1.RotateCCW(1.570796f);
                        this._attLeftCav.MovementOrder = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, vec3_3 + 60f * direction1.ToVec3()));
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.Cav1PosDef:
                        MatrixFrame globalFrame1 = this.Mission.Scene.FindEntityWithTag("defend_right").GetGlobalFrame();
                        this._defMidCav.MovementOrder = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, globalFrame1.origin + 40f * globalFrame1.rotation.s));
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.CavalryPosition:
                        Vec3 position2  = this._attRightRanged.OrderPosition.Position;
                        Vec2 direction2 = this._attRightRanged.Direction;
                        Vec3 vec3_4     = position2 + 20f * direction2.ToVec3();
                        direction2.RotateCCW(-1.570796f);
                        this._attRightCav.MovementOrder = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, vec3_4 + 80f * direction2.ToVec3()));
                        this._attLeftInf.MovementOrder  = MovementOrder.MovementOrderCharge;
                        this._attRightInf.MovementOrder = MovementOrder.MovementOrderCharge;
                        this._defLeftBInf.FiringOrder   = FiringOrder.FiringOrderFireAtWill;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.MeleeAttack:
                        this._defLeftInf.FiringOrder       = FiringOrder.FiringOrderFireAtWill;
                        this._defMidBInf.FiringOrder       = FiringOrder.FiringOrderFireAtWill;
                        this._defRightBInf.FiringOrder     = FiringOrder.FiringOrderFireAtWill;
                        this._attLeftInf.ArrangementOrder  = ArrangementOrder.ArrangementOrderLine;
                        this._attRightInf.ArrangementOrder = ArrangementOrder.ArrangementOrderLine;
                        this._attLeftInf.MovementOrder     = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, this._defRightInf.GetAveragePositionOfUnits(true, false).ToVec3()));
                        this._attRightInf.MovementOrder    = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, this._defLeftInf.GetAveragePositionOfUnits(true, false).ToVec3()));
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.RangedAdvance:
                        Vec2 averagePositionOfUnits1 = this._attLeftRanged.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_5 = averagePositionOfUnits1.ToVec3();
                        averagePositionOfUnits1 = this._attLeftRanged.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_6 = averagePositionOfUnits1.ToVec3();
                        averagePositionOfUnits1 = this._defRightInf.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_7    = averagePositionOfUnits1.ToVec3();
                        Vec3 vec3_8    = 0.15f * (vec3_6 - vec3_7);
                        Vec3 position3 = vec3_5 - vec3_8;
                        averagePositionOfUnits1 = this._attRightRanged.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_9 = averagePositionOfUnits1.ToVec3();
                        averagePositionOfUnits1 = this._attRightRanged.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_10 = averagePositionOfUnits1.ToVec3();
                        averagePositionOfUnits1 = this._defLeftInf.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_11   = averagePositionOfUnits1.ToVec3();
                        Vec3 vec3_12   = 0.15f * (vec3_10 - vec3_11);
                        Vec3 position4 = vec3_9 - vec3_12;
                        this._attLeftRanged.MovementOrder  = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, position3));
                        this._attRightRanged.MovementOrder = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, position4));
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.CavalryAdvance:
                        this.Mission.Scene.FindEntityWithTag("attacker_mid").GetGlobalFrame();
                        MatrixFrame globalFrame2 = this.Mission.Scene.FindEntityWithTag("defend_right").GetGlobalFrame();
                        this.Mission.Scene.FindEntityWithTag("defend_left").GetGlobalFrame();
                        Vec3 position5 = globalFrame2.origin + globalFrame2.rotation.s * 68f + 10f * this._attLeftRanged.Direction.ToVec3();
                        this._attLeftCav.MovementOrder = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, position5));
                        this._defMidCav.MovementOrder  = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, position5));
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.CavalryCharge:
                        MatrixFrame globalFrame3 = this.Mission.Scene.FindEntityWithTag("defend_left").GetGlobalFrame();
                        this._defLeftBInf.FacingOrder   = FacingOrder.FacingOrderLookAtDirection((this._attRightCav.CurrentPosition - this._defLeftBInf.CurrentPosition).Normalized());
                        this._defLeftBInf.MovementOrder = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, globalFrame3.origin - globalFrame3.rotation.s * 10f));
                        this._attRightCav.MovementOrder = MovementOrder.MovementOrderChargeToTarget(this._defLeftBInf);
                        this._attLeftCav.MovementOrder  = MovementOrder.MovementOrderChargeToTarget(this._attLeftInf);
                        this._defMidCav.MovementOrder   = MovementOrder.MovementOrderChargeToTarget(this._attRightInf);
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.CavalryCharge2:
                        this._attRightCav.MovementOrder    = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, this._defLeftBInf.OrderPosition.Position));
                        this._attLeftRanged.FiringOrder    = FiringOrder.FiringOrderFireAtWill;
                        this._attLeftRanged.MovementOrder  = MovementOrder.MovementOrderAdvance;
                        this._attRightRanged.FiringOrder   = FiringOrder.FiringOrderFireAtWill;
                        this._attRightRanged.MovementOrder = MovementOrder.MovementOrderAdvance;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.RangedAdvance2:
                        Vec2 averagePositionOfUnits2 = this._attLeftRanged.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_13 = averagePositionOfUnits2.ToVec3();
                        averagePositionOfUnits2 = this._attLeftRanged.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_14 = averagePositionOfUnits2.ToVec3();
                        averagePositionOfUnits2 = this._defRightInf.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_15   = averagePositionOfUnits2.ToVec3();
                        Vec3 vec3_16   = 0.15f * (vec3_14 - vec3_15);
                        Vec3 position6 = vec3_13 - vec3_16;
                        averagePositionOfUnits2 = this._attRightRanged.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_17 = averagePositionOfUnits2.ToVec3();
                        averagePositionOfUnits2 = this._attRightRanged.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_18 = averagePositionOfUnits2.ToVec3();
                        averagePositionOfUnits2 = this._defLeftInf.GetAveragePositionOfUnits(true, false);
                        Vec3 vec3_19   = averagePositionOfUnits2.ToVec3();
                        Vec3 vec3_20   = 0.15f * (vec3_18 - vec3_19);
                        Vec3 position7 = vec3_17 - vec3_20;
                        this._attLeftRanged.MovementOrder  = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, position6));
                        this._attRightRanged.MovementOrder = MovementOrder.MovementOrderMove(new WorldPosition(this.Mission.Scene, position7));
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.FullCharge:
                        using (IEnumerator <Formation> enumerator = this.Mission.AttackerTeam.Formations.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                Formation current = enumerator.Current;
                                if (current != this._attLeftRanged && current != this._attRightRanged && current != this._attRightCav)
                                {
                                    current.MovementOrder = MovementOrder.MovementOrderCharge;
                                }
                            }
                            break;
                        }
                    }
                    this._isCurPhaseInPlay = true;
                }
                else
                {
                    switch (this._battlePhase)
                    {
                    case CPUBenchmarkMissionLogic.BattlePhase.ArrowShower:
                        if ((double)time <= 14.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.MeleePosition;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.MeleePosition:
                        if ((double)time <= 19.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.MeleeAttack;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.Cav1Pos:
                        if ((double)time <= 19.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.Cav1PosDef;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.Cav1PosDef:
                        if ((double)time <= 24.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.CavalryAdvance;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.CavalryPosition:
                        if ((double)time <= 74.5)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.CavalryCharge;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.MeleeAttack:
                        if ((double)time <= 19.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.Cav1Pos;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.RangedAdvance:
                        if ((double)time <= 60.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.CavalryPosition;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.CavalryAdvance:
                        if ((double)time <= 30.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.RangedAdvance;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.CavalryCharge:
                        if ((double)time <= 92.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.CavalryCharge2;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.CavalryCharge2:
                        if ((double)time <= 93.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.RangedAdvance2;
                        break;

                    case CPUBenchmarkMissionLogic.BattlePhase.RangedAdvance2:
                        if ((double)time <= 94.0)
                        {
                            break;
                        }
                        this._isCurPhaseInPlay = false;
                        this._battlePhase      = CPUBenchmarkMissionLogic.BattlePhase.FullCharge;
                        break;
                    }
                }
            }
        }
        public static bool Prefix_MoveToLineSegment(
            IEnumerable <Formation> formations,
            Dictionary <Formation, Formation> simulationFormations,
            WorldPosition TargetLineSegmentBegin,
            WorldPosition TargetLineSegmentEnd,
            OnOrderIssuedDelegate OnOrderIssued,
            Dictionary <Formation, float> actualWidths,
            Dictionary <Formation, int> actualUnitSpacings,
            bool isFormationLayoutVertical)
        {
            try
            {
                foreach (Formation formation in formations)
                {
                    if (actualUnitSpacings.TryGetValue(formation, out var num))
                    {
                        formation.SetPositioning(new WorldPosition?(), new Vec2?(), num);
                    }
                    if (actualWidths.TryGetValue(formation, out var customWidth))
                    {
                        formation.FormOrder = FormOrder.FormOrderCustom(customWidth);
                    }
                }
                formations = GetSortedFormations(formations, isFormationLayoutVertical);
                OrderController.SimulateNewOrderWithPositionAndDirection(formations, simulationFormations, TargetLineSegmentBegin, TargetLineSegmentEnd, out var formationChanges, out var isLineShort, isFormationLayoutVertical);
                foreach ((Formation element, int unitSpacingReduction, float customWidth1, Vec2 direction, WorldPosition position) in formationChanges)
                {
                    int   oldUnitSpacing = element.UnitSpacing;
                    float oldWidth       = element.Width;
                    if (unitSpacingReduction > 0)
                    {
                        // change minimum unit spacing from 0 to 1 in circle arrangement.
                        int newUnitSpacing = Math.Max(oldUnitSpacing - unitSpacingReduction,
                                                      element.ArrangementOrder.OrderType == OrderType.ArrangementCircular ? 1 : 0);
                        element.SetPositioning(new WorldPosition?(), new Vec2?(), newUnitSpacing);
                        if (element.UnitSpacing != oldUnitSpacing)
                        {
                            actualUnitSpacings[element] = oldUnitSpacing;
                        }
                    }
                    if (Math.Abs(element.Width - (double)customWidth1) > 0.1f)
                    {
                        element.FormOrder = FormOrder.FormOrderCustom(customWidth1);
                        if (isLineShort)
                        {
                            actualWidths[element] = oldWidth;
                        }
                    }
                    if (!isLineShort)
                    {
                        element.MovementOrder = MovementOrder.MovementOrderMove(position);
                        element.FacingOrder   = FacingOrder.FacingOrderLookAtDirection(direction);
                        element.FormOrder     = FormOrder.FormOrderCustom(customWidth1);
                        if (OnOrderIssued != null)
                        {
                            IEnumerable <Formation> singleFormation = Enumerable.Repeat(element, 1);
                            OnOrderIssued(OrderType.Move, singleFormation, (object)position);
                            OnOrderIssued(OrderType.LookAtDirection, singleFormation, (object)direction);
                            OnOrderIssued(OrderType.FormCustom, singleFormation, (object)customWidth1);
                        }
                    }
                    else
                    {
                        Formation largestFormation = formations.MaxBy(f => f.CountOfUnitsWithoutDetachedOnes);
                        switch (OrderController.GetActiveFacingOrderOf(largestFormation))
                        {
                        case OrderType.LookAtEnemy:
                            element.MovementOrder = MovementOrder.MovementOrderMove(position);
                            if (OnOrderIssued != null)
                            {
                                IEnumerable <Formation> local_20 = Enumerable.Repeat(element, 1);
                                OnOrderIssued(OrderType.Move, local_20, (object)position);
                                OnOrderIssued(OrderType.LookAtEnemy, local_20, Array.Empty <object>());
                            }
                            continue;

                        case OrderType.LookAtDirection:
                            element.MovementOrder = MovementOrder.MovementOrderMove(position);
                            element.FacingOrder   = FacingOrder.FacingOrderLookAtDirection(direction);
                            if (OnOrderIssued != null)
                            {
                                IEnumerable <Formation> local_21 = Enumerable.Repeat(element, 1);
                                OnOrderIssued(OrderType.Move, local_21, (object)position);
                                OnOrderIssued(OrderType.LookAtDirection, local_21, (object)largestFormation.Direction);
                            }
                            continue;

                        default:
                            continue;
                        }
                    }
                }

                return(false);
            }
            catch (Exception)
            {
                return(true);
            }
        }
Ejemplo n.º 7
0
            static bool PrefixTickOccasionally(Formation ____mainFormation, ref Formation ___formation, BehaviorScreenedSkirmish __instance, ref MovementOrder ____currentOrder, ref FacingOrder ___CurrentFacingOrder)
            {
                MethodInfo method = typeof(BehaviorScreenedSkirmish).GetMethod("CalculateCurrentOrder", BindingFlags.NonPublic | BindingFlags.Instance);

                method.DeclaringType.GetMethod("CalculateCurrentOrder");
                method.Invoke(__instance, new object[] { });
                //bool flag = formation.QuerySystem.ClosestEnemyFormation == null || _mainFormation.QuerySystem.MedianPosition.AsVec2.DistanceSquared(formation.QuerySystem.ClosestEnemyFormation.MedianPosition.AsVec2) <= formation.QuerySystem.AveragePosition.DistanceSquared(formation.QuerySystem.ClosestEnemyFormation.MedianPosition.AsVec2) || formation.QuerySystem.AveragePosition.DistanceSquared(position.AsVec2) <= (_mainFormation.Depth + formation.Depth) * (_mainFormation.Depth + formation.Depth) * 0.25f;
                //if (flag != _isFireAtWill)
                //{
                //    _isFireAtWill = flag;
                //    formation.FiringOrder = (_isFireAtWill ? FiringOrder.FiringOrderFireAtWill : FiringOrder.FiringOrderHoldYourFire);
                //}
                ___formation.MovementOrder = ____currentOrder;
                ___formation.FacingOrder   = ___CurrentFacingOrder;
                return(false);
            }
Ejemplo n.º 8
0
            static void PostfixCalculateCurrentOrder(Formation ____mainFormation, Formation ___formation, ref MovementOrder ____currentOrder, ref FacingOrder ___CurrentFacingOrder)
            {
                if (____mainFormation != null && ___formation != null)
                {
                    MethodInfo method = typeof(FacingOrder).GetMethod("FacingOrderLookAtDirection", BindingFlags.NonPublic | BindingFlags.Static);
                    method.DeclaringType.GetMethod("FacingOrderLookAtDirection");
                    ___CurrentFacingOrder = (FacingOrder)method.Invoke(___CurrentFacingOrder, new object[] { ____mainFormation.Direction });

                    WorldPosition medianPosition = ____mainFormation.QuerySystem.MedianPosition;
                    //medianPosition.SetVec2(medianPosition.AsVec2 - ____mainFormation.Direction * ((____mainFormation.Depth + ___formation.Depth) * 1.5f));
                    medianPosition.SetVec2(medianPosition.AsVec2 - ____mainFormation.Direction * ((____mainFormation.Depth + ___formation.Depth) * 0.25f + 0.0f));
                    ____currentOrder = MovementOrder.MovementOrderMove(medianPosition);
                }
            }
Ejemplo n.º 9
0
        static bool PrefixTickOccasionally(ref Formation ___formation, ref MovementOrder ____currentOrder, ref FacingOrder ___CurrentFacingOrder, BehaviorVanguard __instance)
        {
            MethodInfo method = typeof(BehaviorVanguard).GetMethod("CalculateCurrentOrder", BindingFlags.NonPublic | BindingFlags.Instance);

            method.DeclaringType.GetMethod("CalculateCurrentOrder");
            method.Invoke(__instance, new object[] { });

            ___formation.MovementOrder = ____currentOrder;
            ___formation.FacingOrder   = ___CurrentFacingOrder;
            if (___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation != null && ___formation.QuerySystem.AveragePosition.DistanceSquared(___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation.MedianPosition.AsVec2) > 1600f && ___formation.QuerySystem.UnderRangedAttackRatio > 0.2f - ((___formation.ArrangementOrder.OrderEnum == ArrangementOrder.ArrangementOrderEnum.Loose) ? 0.1f : 0f))
            {
                ___formation.ArrangementOrder = ArrangementOrder.ArrangementOrderLoose;
            }
            else
            {
                ___formation.ArrangementOrder = ArrangementOrder.ArrangementOrderLine;
            }

            return(false);
        }
Ejemplo n.º 10
0
        static void PostfixCalculateCurrentOrder(ref Vec2 ____shootPosition, ref Formation ___formation, ref Formation ____archerFormation, BehaviorCautiousAdvance __instance, ref BehaviorState ____behaviorState, ref MovementOrder ____currentOrder, ref FacingOrder ___CurrentFacingOrder)
        {
            if (___formation != null && ____archerFormation != null && ___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation != null)
            {
                Formation significantEnemy = Utilities.FindSignificantEnemy(___formation, true, true, false, false, false);

                if (significantEnemy != null)
                {
                    Vec2  vec      = significantEnemy.QuerySystem.MedianPosition.AsVec2 - ___formation.QuerySystem.AveragePosition;
                    float distance = vec.Normalize();

                    switch (____behaviorState)
                    {
                    case BehaviorState.Shooting:
                    {
                        if (waitCountShooting > 75)
                        {
                            if (distance > 100f)
                            {
                                WorldPosition medianPosition = ___formation.QuerySystem.MedianPosition;
                                medianPosition.SetVec2(medianPosition.AsVec2 + vec * 5f);
                                ____shootPosition = medianPosition.AsVec2 + vec * 5f;
                                ____currentOrder  = MovementOrder.MovementOrderMove(medianPosition);

                                ___CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(vec);
                            }
                            waitCountShooting    = 0;
                            waitCountApproaching = 0;
                        }
                        else
                        {
                            ___CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(vec);
                            waitCountShooting++;
                        }
                        break;
                    }

                    case BehaviorState.Approaching:
                    {
                        if (waitCountApproaching > 30)
                        {
                            if (distance < 210f)
                            {
                                WorldPosition medianPosition = ___formation.QuerySystem.MedianPosition;
                                medianPosition.SetVec2(medianPosition.AsVec2 + vec * 5f);
                                ____shootPosition = medianPosition.AsVec2 + vec * 5f;
                                ____currentOrder  = MovementOrder.MovementOrderMove(medianPosition);

                                ___CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(vec);
                            }
                            waitCountApproaching = 0;
                        }
                        else
                        {
                            if (distance < 210f)
                            {
                                WorldPosition medianPosition = ___formation.QuerySystem.MedianPosition;
                                medianPosition.SetVec2(____shootPosition);
                                ____currentOrder = MovementOrder.MovementOrderMove(medianPosition);

                                ___CurrentFacingOrder = FacingOrder.FacingOrderLookAtDirection(vec);
                            }
                            waitCountApproaching++;
                        }
                        break;
                    }

                    case BehaviorState.PullingBack:
                    {
                        if (waitCountApproaching > 30)
                        {
                            if (distance < 210f)
                            {
                                WorldPosition medianPosition = ___formation.QuerySystem.MedianPosition;
                                medianPosition.SetVec2(medianPosition.AsVec2 - vec * 10f);
                                ____shootPosition = medianPosition.AsVec2 + vec * 5f;
                                ____currentOrder  = MovementOrder.MovementOrderMove(medianPosition);
                            }
                            waitCountApproaching = 0;
                        }
                        else
                        {
                            if (distance < 210f)
                            {
                                WorldPosition medianPosition = ___formation.QuerySystem.MedianPosition;
                                medianPosition.SetVec2(____shootPosition);
                                ____currentOrder = MovementOrder.MovementOrderMove(medianPosition);
                            }
                            waitCountApproaching++;
                        }
                        break;
                    }
                    }
                }
            }
        }