コード例 #1
0
 //in a normal controlled division this will do nothing, but the ai controller will override
 public virtual void OnEmptyOrder(ControlledDivision Host)
 {
     if (EndOnEmptyOrder)
     {
         Canceled = true;
     }
 }
コード例 #2
0
ファイル: Move.cs プロジェクト: RyanChomistek/stratagyv2
 public void UpdateCalculatedValues(ControlledDivision Host)
 {
     _ai.canMove = true;
     Host.RecalculateAggrigateValues();
     Host.RefreshDiscoveredTiles();
     _ai.maxSpeed = Host.Speed * GameManager.GameSpeed * Host.CommandingOfficer.SupplyUsage.Value;
 }
コード例 #3
0
    private void EngageDivision(ControlledDivision Host)
    {
        var rememberedTarget = GetRememberedDivisionFromHost(Host, RememberedTargetId);

        //if the target has been destroyed do nothing and to end the order
        if (rememberedTarget.HasBeenDestroyed)
        {
            OngoingOrder = new EmptyOrder();
            Canceled     = true;
            return;
        }

        if (Host.FindVisibleDivision(RememberedTargetId, out ControlledDivision division))
        {
            var distanceToTarget = (division.Controller.transform.position - Host.Controller.transform.position).magnitude;

            //need to move closer
            if (distanceToTarget > Host.MaxHitRange)
            {
                StartOrder(Host, new Move(Host, CommanderSendingOrderId, division.Position, Host.MaxHitRange * .5f));
            }
            else
            {
                //if the target is within range attack
                StartOrder(Host, new AttackOrder(Host, CommanderSendingOrderId, division.DivisionId, Host.MaxHitRange));
            }
        }
        else
        {
            //else go find him again
            StartOrder(Host, new FindDivision(Host, CommanderSendingOrderId, RememberedTargetId, Host.MaxSightDistance));
        }
    }
コード例 #4
0
    public override void Proceed(ControlledDivision Host)
    {
        if (!IsFinished && Host.FindVisibleDivision(RememberedTargetId, out ControlledDivision division))
        {
            var distanceToTarget = (division.Controller.transform.position - Host.Controller.transform.position).magnitude;
            if (distanceToTarget > Host.MaxHitRange)
            {
                IsFinished = true;
                return;
            }

            float totalAttackerDamage = 0;
            for (int i = 0; i < Host.Soldiers.Count; i++)
            {
                Soldier soldier = Host.Soldiers[i];

                if (distanceToTarget > soldier.MinRange && distanceToTarget < soldier.MaxRange)
                {
                    var result = soldier.Attack(ref division, distanceToTarget);
                    totalAttackerDamage += result.DamageToDefender;
                }
            }


            bool isDestroyed     = division.CheckDamageDone(Host);
            bool isHostDestroyed = Host.CheckDamageDone(division);
            if (isDestroyed)
            {
                RememberedDivision RememberedTarget = GetRememberedDivisionFromHost(Host, RememberedTargetId);
                RememberedTarget.HasBeenDestroyed = true;
                RememberedTarget.TimeStamp        = GameManager.Instance.GameTime;
                IsFinished = true;
            }
        }
    }
コード例 #5
0
    public void Resupply(ControlledDivision Host)
    {
        //find closest supply dump
        Func <TerrainMapTile, bool> findSupplyTile = tile => {
            return(tile.Supply > 100);
        };

        //UnityEngine.Profiling.Profiler.BeginSample("find supply");

        //find closest supply
        if (Host.TryFindKnownTileMatchingPred(findSupplyTile, out Vector3 foundPosition))
        {
            //Debug.Log($"resupply position : {foundPosition}");
            this.ReceiveOrder(Host, new Move(Host, Host.DivisionId, foundPosition));
            var supplyOrder = new GatherSuppliesOrder(Host, Host.DivisionId);
            // add the supply to Host
            Host.ReceiveOrder(supplyOrder);
            this.ReceiveOrder(Host, new WaitOrder(Host, Host.DivisionId, 2, x => {
                x.CancelOrder(supplyOrder.orderId);
            }));
        }
        else
        {
            RandomMove(Host);
        }

        //UnityEngine.Profiling.Profiler.EndSample();
    }
コード例 #6
0
    private void SendHeartBeat(ControlledDivision Host)
    {
        RememberedDivision CommanderSendingOrder = GetRememberedDivisionFromHost(Host, CommanderSendingOrderId);
        RememberedDivision rememberedTarget      = GetRememberedDivisionFromHost(Host, RememberedTargetId);

        Host.SendOrdersTo(rememberedTarget, new List <Order>(), ref Host.RememberedDivisions);

        /*
         * DivisionController HeartBeatMessenger;
         * if (Host.TryCreateNewDivision(out HeartBeatMessenger))
         * {
         *  HeartBeatMessenger.name = "Heatbeat messenger";
         *
         *  Debug.Log($" heartbeat {Host.DivisionId} {RememberedTargetId}");
         *  HeartBeatMessenger.AttachedDivision.ReceiveOrders(
         *      new List<Order>()
         *      {
         *      new FindDivision(
         *          HeartBeatMessenger.AttachedDivision,
         *          Host.DivisionId,
         *          RememberedTargetId),
         *      new SendMessage(
         *          HeartBeatMessenger.AttachedDivision,
         *          Host.DivisionId,
         *          new List<Order>(),
         *          RememberedTargetId,
         *          Host.DivisionId)
         *      });
         *
         * }
         */
    }
コード例 #7
0
 public SendMessage(Division controller, int commanderSendingOrderId, List <Order> message, int targetId, int endTargetId)
     : base(controller, commanderSendingOrderId, "Send Message", targetId)
 {
     this._visibleTarget = null;
     this._message       = message;
     this._endTargetId   = endTargetId;
 }
コード例 #8
0
ファイル: Soldier.cs プロジェクト: RyanChomistek/stratagyv2
    public virtual CombatResult Attack(ref ControlledDivision division, float distanceToTarget)
    {
        CombatResult result = new CombatResult();

        if (distanceToTarget < MinRange || distanceToTarget > MaxRange)
        {
            result.AttackSuccess = false;
            return(result);
        }

        result.Attacker = this;

        foreach (var defender in division.Soldiers)
        {
            if (defender.Health > 0)
            {
                result.DamageToDefender = DoDamage(this, defender);
                result.Defender         = defender;
                result.DamageToAttacker = defender.Defend(this, distanceToTarget);
                break;
            }
        }

        return(result);
    }
コード例 #9
0
 public virtual void DoOrders(ControlledDivision Host)
 {
     if (OngoingOrder.Canceled)
     {
         OngoingOrder.End(Host);
         TryStartNextOrder(Host);
     }
     else if (GameManager.Instance.IsPaused)
     {
         OngoingOrder.Pause(Host);
     }
     else if (OngoingOrder.GetType() != typeof(EmptyOrder))
     {
         //if we are finished stop
         if (OngoingOrder.TestIfFinished(Host))
         {
             OngoingOrder.End(Host);
             OngoingOrder = new EmptyOrder();
             Host.OnChange();
         }
         else
         {
             ContinueOrder(Host);
         }
     }
     //grab a new order
     else if (TryStartNextOrder(Host))
     {
     }
 }
コード例 #10
0
 public void CancelOrders(ControlledDivision Host, HashSet <int> orderIdsToCancel)
 {
     CancelOrders(OrderQueue, orderIdsToCancel);
     CancelOrders(BackgroundOrderList, orderIdsToCancel);
     CancelOrder(OngoingOrder, orderIdsToCancel);
     //DoOrders(Host);
 }
コード例 #11
0
    private void AddMoveToTarget(ControlledDivision Host)
    {
        RememberedDivision rememberedTarget;

        if (TryGetRememberedDivisionFromHost(Host, RememberedTargetId, out rememberedTarget))
        {
            if (rememberedTarget.HasBeenDestroyed)
            {
                RememberedTargetId = rememberedTarget.Commander;
                if (RememberedTargetId == rememberedTarget.Commander)
                {
                    //the command chain is dead so give up
                    Canceled = true;
                }

                AddMoveToTarget(Host);
            }
            else
            {
                this.OrderQueue.Add(new Move(Host, CommanderSendingOrderId, rememberedTarget.PredictedPosition, _thresholdDistance * .5f));
            }
        }
        else
        {
            //add wait order to wait until we find the remembered division
            this.OrderQueue.Add(new WaitOrder(Host, CommanderSendingOrderId, .1f));
        }
    }
コード例 #12
0
    public void OnEnemiesSeen(ControlledDivision Host, List <ControlledDivision> enemies)
    {
        //Debug.Log("ENEMY!!!!!!!!!!!!!!!");

        if (Division.PredictCombatResult(Host, enemies.ConvertAll(x => (Division)x)) > Host.CommandingOfficer.EngagementThreshold.Value)
        {
            //Debug.Log("ATTACK");
            _currentBehavior = $"Attack: {enemies[0].DivisionId}";
            StartOrder(Host, new EngageOrder(Host, Host.DivisionId, enemies[0].DivisionId));
        }
        else
        {
            //Debug.Log("RUN AWAY");
            _currentBehavior = $"Running Away";
            Vector3 enemiesCentoid = Vector3.zero;

            foreach (var enemy in enemies)
            {
                enemiesCentoid += enemy.Position;
            }

            enemiesCentoid /= enemies.Count;

            Vector3 delta      = (Host.Position - enemiesCentoid) * Host.CommandingOfficer.RunAwayDistance.Value;
            Vector3 retreatPos = Host.Position + delta;
            StartOrder(Host, new Move(Host, Host.DivisionId, MapManager.Instance.ClampPositionToInBounds(retreatPos)));
        }
        //descide whether to attack or not

        //attack if we can win and it doesnt put us out of position

        //run if we cant win also send messengers to nearby units to call for help
    }
コード例 #13
0
 public override void Start(ControlledDivision Host)
 {
     //generate zones
     //startup background orders to look for enemies/may just make this a controlled division thing with a callback
     base.Start(Host);
     OnEnemiesSeenCallback = enemies => OnEnemiesSeen(Host, enemies);
     Host.RegisterOnEnemiesSeenCallback(OnEnemiesSeenCallback);
 }
コード例 #14
0
    public virtual void GenerateZones(ControlledDivision Host)
    {
        //make zones for things

        //for commander units use zones to bound where they can move and stuff

        //maybe use zones to trigger behaviors, like have a close zone to trigger a defensive behavior
    }
コード例 #15
0
 public override void Proceed(ControlledDivision Host)
 {
     if (Host.FindVisibleDivision(TargetId, out ControlledDivision divisionToMergeWith))
     {
         Host.ShareMapInformation(divisionToMergeWith);
         FinishedSharing = true;
     }
 }
コード例 #16
0
    public override void Start(ControlledDivision Host)
    {
        base.Start(Host);
        Host.MergeZones(ZoneInfo);

        //end the order
        Canceled = true;
    }
コード例 #17
0
 public override void Proceed(ControlledDivision Host)
 {
     if (OrderQueue.Count == 0)
     {
         AddMoveToTarget(Host);
     }
     base.Proceed(Host);
 }
コード例 #18
0
    public override void Start(ControlledDivision Host)
    {
        //look for enemies with some units
        //recruit with others

        //once enemies found generate zones to set up defencive paremeter, and allocate troops to front line
        //also generate zones for potential advancement or retreat
        base.Start(Host);
    }
コード例 #19
0
 /// <summary>
 /// starts a new order
 /// </summary>
 /// <param name="Host"></param>
 /// <param name="order"></param>
 protected virtual void StartOrder(ControlledDivision Host, Order order)
 {
     OngoingOrder = order;
     OngoingOrder.Start(Host);
     //DOES not use continueOrder to proceed the order, this is because sub classes of multi use the continue order to start new orders and can cause infinite recursion
     OngoingOrder.Proceed(Host);
     Host.OnChange();
     name = $"{_baseName} {OngoingOrder.name}";
 }
コード例 #20
0
    public override void End(ControlledDivision Host)
    {
        RememberedDivision CommanderSendingOrder = GetRememberedDivisionFromHost(Host, CommanderSendingOrderId);
        RememberedDivision commander             = Host.RememberedDivisions[CommanderSendingOrder.DivisionId];

        Host.ReceiveOrder(new FindDivision(Host, _visibleTarget.DivisionId, commander.DivisionId));
        Host.ReceiveOrder(new MergeDivisions(Host, commander.DivisionId, commander.DivisionId));
        base.End(Host);
    }
コード例 #21
0
 public override void Proceed(ControlledDivision Host)
 {
     base.Proceed(Host);
     TimeSinceLastHeartbeat += GameManager.DeltaTime;
     if (TimeSinceLastHeartbeat > SecondsPerHeartbeat)
     {
         SendHeartBeat(Host);
         TimeSinceLastHeartbeat = 0;
     }
 }
コード例 #22
0
ファイル: WaitOrder.cs プロジェクト: RyanChomistek/stratagyv2
    public override bool TestIfFinished(ControlledDivision Host)
    {
        if (TimeRemaining < 0)
        {
            OnFinish?.Invoke(Host);
            return(true);
        }

        return(false);
    }
コード例 #23
0
    public override void Proceed(ControlledDivision Host)
    {
        _timeSinceLastTick += GameManager.DeltaTime;

        if (_timeSinceLastTick > _timeBetweenTicks)
        {
            _timeSinceLastTick = 0;
            OnTick(Host);
        }
    }
コード例 #24
0
    public void RandomMove(ControlledDivision Host)
    {
        _currentBehavior = $"Random Move";
        Vector3 pos = UnityEngine.Random.insideUnitCircle * UnityEngine.Random.Range(2, 10);

        pos.z = 0;
        pos  += Host.Position;
        pos   = MapManager.Instance.ClampPositionToInBounds(pos);
        StartOrder(Host, new Move(Host, Host.DivisionId, pos));
    }
コード例 #25
0
    private string Serializeremembered(ControlledDivision division)
    {
        string str = "";

        foreach (KeyValuePair <int, RememberedDivision> remembered in division.RememberedDivisions)
        {
            str += $"<{remembered.Value.ToString()}> \n";
        }

        return(str);
    }
コード例 #26
0
    public override void OnTick(ControlledDivision Host)
    {
        var tile = MapManager.Instance.GetTileFromPosition(Host.Controller.transform.position);

        if (tile.Supply > 50)
        {
            foreach (var soldier in Host.Soldiers)
            {
                soldier.GatherSupplies(tile);
            }
        }
    }
コード例 #27
0
ファイル: Move.cs プロジェクト: RyanChomistek/stratagyv2
 public override void Proceed(ControlledDivision Host)
 {
     /*
      * Vector3 currLoc = Host.Controller.transform.position;
      * Vector3 dir = (finish - currLoc).normalized;
      * Vector3 moveVec = dir * Host.Speed;
      * //set start moving twords finish
      * Host.Controller.GetComponent<Rigidbody>().velocity = moveVec * GameManager.Instance.GameSpeed;
      */
     //MoveToTarget(Host);
     UpdateCalculatedValues(Host);
 }
コード例 #28
0
    public bool TakeDamage(float damage, ControlledDivision from)
    {
        base.TakeDamage(damage, from);

        if (Soldiers.Count == 0)
        {
            from.DestroyDivision(this);
            return(true);
        }

        RecalculateAggrigateValues();
        return(false);
    }
コード例 #29
0
    public bool CheckDamageDone(ControlledDivision from)
    {
        base.CheckDamageDone(from);

        if (Soldiers.Count == 0)
        {
            from.DestroyDivision(this);
            return(true);
        }

        RecalculateAggrigateValues();
        return(false);
    }
コード例 #30
0
ファイル: Move.cs プロジェクト: RyanChomistek/stratagyv2
    public override bool TestIfFinished(ControlledDivision Host)
    {
        Vector3 currLoc          = Host.Controller.transform.position;
        float   distanceToFinish = (finish - currLoc).magnitude;

        if (distanceToFinish <= _thresholdDistance)
        {
            return(true);
        }
        return(false);

        //for whatever reason the pathPending doesnt get updated for a few frames
        //return  !_ai.pathPending && _ai.reachedEndOfPath;
    }