示例#1
0
    public bool Attack(SquadControl targetSquad, bool usePrimary)
    {
        if (!CanAttack)
        {
            Debug.Log(transform.name + " has no way to attack");
            return(false);
        }

        Transform mySquad         = unitControl.Squad.transform;
        Vector3   offsetFromSquad = targetSquad.transform.position - mySquad.position;

        float heading = Vector3.Angle(offsetFromSquad.normalized, mySquad.forward) *
                        Mathf.Sign(Vector3.Dot(offsetFromSquad.normalized, mySquad.right));

        int attackDir = Mathf.RoundToInt(heading / 90);

        bool attackAttempted = false;

        if (offsetFromSquad.magnitude < (GameManager.instance.GridSize * 1.1f))
        {
            attackAttempted = TryMeleeAttack(usePrimary ? primaryWeapon : secondaryWeapon, targetSquad, attackDir);
        }

        if (!attackAttempted)
        {
            attackAttempted = TryAttackRanged(usePrimary ? primaryWeapon: secondaryWeapon, targetSquad, attackDir);
        }

        if (!attackAttempted)
        {
            unitControl.AttackComplete();
        }
        return(attackAttempted);
    }
示例#2
0
 public void RemoveEnemySquad(SquadControl oldSquad)
 {
     if (enemySquads.Contains(oldSquad))
     {
         enemySquads.Remove(oldSquad);
     }
 }
示例#3
0
 public void SquadTurnComplete(SquadControl squad)
 {
     if (squad == PlayerSquad)
     {
         foreach (SquadControl enemySquad in enemySquads)
         {
             enemySquad.StartTurn();
         }
     }
     else if (enemySquads.Contains(squad))
     {
         bool allDone = true;
         foreach (SquadControl enemySquad in enemySquads)
         {
             if (enemySquad.UnitsAreBusy)
             {
                 allDone = false;
             }
         }
         if (allDone)
         {
             PlayerSquad.StartTurn();
         }
     }
 }
示例#4
0
 public void SquadSelected(SquadControl selectedSquad)
 {
     if (selectedSquad.squadType == SquadControl.SquadType.Enemy)
     {
         squad.Attack(selectedSquad);
     }
 }
示例#5
0
    public void Init()
    {
        gameManager = GameManager.instance;

        gameObject.tag   = "Unit";
        gameObject.layer = LayerMask.NameToLayer("Units");

        animator = GetComponent <Animator>();

        unitMover  = gameObject.AddComponent <UnitMover>();
        unitAttack = gameObject.AddComponent <UnitAttack>();
        //navAgent = gameObject.AddComponent<NavMeshAgent>();

        TeamName = teamName;

        AddWeapon(TempPrimaryWeapon);

        if (!TempSecondaryWeapon.Equals(""))
        {
            AddWeapon(TempSecondaryWeapon);
        }

        if (!squad && teamName.Equals("Player"))
        {
            squad = gameManager.PlayerSquad;
        }
        if (!squad)
        {
            Debug.Log(transform.name + " has no squad");
        }

        UnitId = squad.AddUnit(this);

        animator.SetFloat("AnimOffset", (float)UnitId / 4.0f);

        transform.position = SquadPosition;
        transform.rotation = squad.transform.rotation;

        CapsuleCollider collision = gameObject.AddComponent <CapsuleCollider>();

        collision.radius = 0.5f;
        collision.height = 2.0f;
        collision.center = new Vector3(0.0f, 1.0f, 0.0f);

        hitPoint = maxHits;


        RagdollConfig ragdollConfig = gameObject.AddComponent <RagdollConfigCombot>();

        if (ragdollConfig)
        {
            ragdollControl = ragdollConfig.Init();
        }
    }
示例#6
0
    public void Attack(SquadControl targetSquad)
    {
        if (IsAttacking)
        {
            return;
        }

        ReCenterPosition();
        hasAttacked = true;
        StartCoroutine(StartAttack(targetSquad));
    }
        public void Should_set_on_expected_direction_when_only_one_robot_moves(string inputList, string expectedOutput)
        {
            //Given
            var mockOutput        = new Mock <IOutput>();
            var roverSquadControl = new SquadControl(mockOutput.Object);
            var input             = inputList.Split('\n').ToList();

            //When
            roverSquadControl.SendCommand(input);

            //Then
            mockOutput.Verify(output => output.Debug(It.Is <string>(outputValue => outputValue == expectedOutput)));
        }
示例#8
0
    void LateUpdate()
    {
        if (!squad)
        {
            squad = gameManager.PlayerSquad;
        }

        if (moveTimer >= 0)
        {
            moveTimer += Time.deltaTime / squad.MoveDuration;
            float amount = cameraMove.Evaluate(moveTimer);
            transform.position = Vector3.Lerp(startPos, endPos, amount);
            if (moveTimer > 1)
            {
                moveTimer = -1;
            }
        }
    }
示例#9
0
    IEnumerator StartAttack(SquadControl targetSquad)
    {
        int[] normalOrder = new int[6] {
            0, 1, 2, 3, 1, 0
        };
        int[] mixedOrder = new int[6] {
            1, 0, 3, 2, 1, 0
        };

        int[] order = Random.value > 0.5f ? normalOrder : mixedOrder;

        for (int i = 0; i < 6; i++)
        {
            UnitControl unit = units[order[i]];
            if (unit && unit.Attack(targetSquad, (i < 4)))
            {
                yield return(new WaitForSeconds(0.5f));
            }
        }
    }
示例#10
0
    public SquadControl[] FindEnemiesAtPosition(Vector3 pos, SquadControl.SquadType squadType)
    {
        List <SquadControl> squads     = new List <SquadControl>();
        LayerMask           enemyMask  = 1 << LayerMask.NameToLayer("Squads");
        LayerMask           playerMask = 1 << LayerMask.NameToLayer("Player");

        pos.y += 1.0f;

        for (int i = 0; i < 4; i++)
        {
            Vector3 dir = Quaternion.AngleAxis(90 * i, Vector3.up) * (Vector3.forward * GridSize);

            Collider[] hits = Physics.OverlapSphere(pos + dir, 1.0f, enemyMask | playerMask);

            if (hits.Length > 0)
            {
                SquadControl enemySquad = hits[0].transform.GetComponent <SquadControl>();
                if (enemySquad)
                {
                    if ((squadType == SquadControl.SquadType.Enemy && enemySquad.squadType == SquadControl.SquadType.Player) ||
                        (squadType == SquadControl.SquadType.Player && enemySquad.squadType == SquadControl.SquadType.Enemy) ||
                        (squadType == SquadControl.SquadType.Enemy && enemySquad.squadType == SquadControl.SquadType.Friendly) ||
                        (squadType == SquadControl.SquadType.Friendly && enemySquad.squadType == SquadControl.SquadType.Enemy))
                    {
                        squads.Add(enemySquad);
                    }
                }
                Debug.DrawRay(pos + dir, Vector3.up, Color.green, 5);
            }
            else
            {
                Debug.DrawRay(pos + dir, Vector3.up, Color.red, 5);
            }
        }
        return(squads.ToArray());
    }
示例#11
0
    public void TakeTurn()
    {
        SquadControl[] possibleMeleeTargets = squad.GetAttackTargets();
        bool           playerVisible        = CanSeePlayer();
        int            directionToPlayer    = 0;

        if (playerVisible)
        {
            directionToPlayer = GetOrthagonalDirection(gameManager.PlayerSquad.transform);
        }

        bool    shouldMove    = false;
        Vector3 moveDirection = Vector3.zero;

        bool shouldRotate    = false;
        int  rotateDirection = 0;

        bool         shouldAttack = false;
        SquadControl attackTarget = null;

        switch (currentState)
        {
        case AIState.Waiting:
            if (possibleMeleeTargets.Length > 0)
            {
                ChangeState(AIState.Chasing);
                shouldAttack = true;
                attackTarget = possibleMeleeTargets[0];
            }

            if (playerVisible)
            {
                ChangeState(AIState.Chasing);
            }


            break;

        case AIState.Patrolling:
            break;

        case AIState.Chasing:
            Debug.Log("directionToPlayer: " + directionToPlayer);
            if (!playerVisible && possibleMeleeTargets.Length == 0)
            {
                ChangeState(AIState.Waiting);
            }

            if (possibleMeleeTargets.Length > 0)
            {
                Debug.Log("Should Attack");
                shouldAttack = true;
                attackTarget = possibleMeleeTargets[0];
            }
            else if (directionToPlayer < 0.1f)
            {
                shouldMove    = true;
                moveDirection = transform.forward;
            }
            else
            {
                shouldRotate    = true;
                rotateDirection = Mathf.Clamp(directionToPlayer, -1, 1);
            }
            break;
        }


        if (shouldAttack)
        {
            Debug.Log(transform.name + " is Attacking");
            squad.Attack(attackTarget);
        }
        else if (shouldMove)
        {
            Debug.Log(transform.name + " is Moving");
            squad.Move(moveDirection);
        }
        else if (shouldRotate)
        {
            Debug.Log(transform.name + " is Rotating");
            squad.Rotate(rotateDirection);
        }
        else
        {
            Debug.Log(transform.name + " is Passing");
            squad.CompleteTurn();
        }
    }
示例#12
0
 void Start()
 {
     squad       = gameObject.GetComponent <SquadControl>();
     gameManager = GameManager.instance;
 }
示例#13
0
 public void SetSquad(SquadControl newSquad)
 {
     squad = newSquad;
 }
示例#14
0
 public bool Attack(SquadControl targetSquad)
 {
     return(Attack(targetSquad, true));
 }
示例#15
0
 public void AddFrientlySquad(SquadControl newSquad)
 {
     friendlySquads.Add(newSquad);
 }
示例#16
0
 public void AddEnemySquad(SquadControl newSquad)
 {
     enemySquads.Add(newSquad);
 }
示例#17
0
        static void Main()
        {
            var squadControl = new SquadControl(new ConsoleOutput(false));

            squadControl.SendCommand(FromConsoleInput().ToList());
        }
示例#18
0
    void Update()
    {
        if (!squad)
        {
            squad = gameManager.PlayerSquad;
        }

        if (squad && !squad.IsWaitingForTurn)
        {
            Vector2 touchPos = (GvrController.TouchPos * 2) - Vector2.one;

            if (GvrController.TouchDown)
            {
                swipeTimer = swipeTime;
                swipeStart = touchPos;
            }

            if (swipeTimer > 0)
            {
                swipeTimer -= Time.deltaTime;
            }

            if (Input.GetKeyDown(KeyCode.W))
            {
                int offset = GetDirectionOffset();
                if (offset == 0)
                {
                    squad.Move(squad.transform.forward);
                }
                else
                {
                    squad.Rotate(GetDirectionOffset());
                }
            }

            if (Input.GetKeyDown(KeyCode.S))
            {
                squad.Move(-squad.transform.forward);
            }

            if (Input.GetKeyDown(KeyCode.A))
            {
                squad.Move(-squad.transform.right);
            }

            if (Input.GetKeyDown(KeyCode.D))
            {
                squad.Move(squad.transform.right);
            }

            if (Input.GetKeyDown(KeyCode.Q))
            {
                squad.Rotate(-1);
            }

            if (Input.GetKeyDown(KeyCode.E))
            {
                squad.Rotate(1);
            }

            if (swipeTimer > 0 && GvrController.TouchUp)
            {
                float horizontalDistance = touchPos.x - swipeStart.x;
                float verticleDistance   = touchPos.y - swipeStart.y;

                if (Mathf.Abs(horizontalDistance) > 0.5f || Mathf.Abs(verticleDistance) > 0.5f)
                {
                    Vector3 direction = Vector3.zero;
                    if (Mathf.Abs(horizontalDistance) > Mathf.Abs(verticleDistance))
                    {
                        direction = horizontalDistance < 0 ? -squad.transform.right : squad.transform.right;
                    }
                    else
                    {
                        direction = verticleDistance < 0 ? squad.transform.forward : -squad.transform.forward;
                    }

                    int offset = GetDirectionOffset();
                    if (offset == 0)
                    {
                        squad.Move(direction);
                    }
                    else
                    {
                        squad.Rotate(GetDirectionOffset());
                    }
                }
            }
        }
    }
示例#19
0
 void Start()
 {
     gameManager = GameManager.instance;
     squad       = gameManager.PlayerSquad;
 }
示例#20
0
 public bool Attack(SquadControl targetSquad, bool usePrimary)
 {
     isAttacking = true;
     return(unitAttack.Attack(targetSquad, usePrimary));
 }
示例#21
0
 bool TryAttackRanged(Weapon weapon, SquadControl targetSquad, int direction)
 {
     return(false);
 }
示例#22
0
    bool TryMeleeAttack(Weapon weapon, SquadControl target, int direction)
    {
        if (!weapon)
        {
            return(false);
        }

        bool        attackedUsingReach = false;
        bool        attackDodged       = false;
        bool        needsToAdvance     = false;
        string      attackResult       = "";
        int         attackDirection    = direction;
        UnitControl victim             = null;

        //check forward
        Vector3 dir        = Quaternion.AngleAxis(90 * direction, Vector3.up) * (transform.forward * 3);
        Vector3 forwardPos = unitControl.SquadPosition + dir;

        victim = CheckForTarget(forwardPos);

        // secondary attack if direction is forward;
        if (weapon.isSecondary)
        {
            if (victim)
            {
                animator.SetTrigger("AttackSecondary");
                weapon.StartAttack();
                lastAttackTarget = victim;
                lastWeaponUsed   = weapon;
                return(true);
            }
            Debug.Log("No Target for Secondary");
            return(false);
        }

        //check forward with reach
        if (!victim && weapon.hasReach)
        {
            dir    = Quaternion.AngleAxis(90 * direction, Vector3.up) * (transform.forward * 2);
            victim = CheckForTarget(forwardPos + dir);
            if (victim)
            {
                attackedUsingReach = true;
            }
        }

        //Special attacks if attacking forward
        if (direction == 0)
        {
            //no special attacks from the backrow
            if (!victim)
            {
                float distanceForMe    = Vector3.Distance(unitControl.SquadPosition, target.transform.position);
                float distanceForSquad = Vector3.Distance(unitControl.Squad.transform.position, target.transform.position);
                if (distanceForMe > distanceForSquad)
                {
                    return(false);
                }
            }

            // advance and check right
            if (!victim)
            {
                dir             = Quaternion.AngleAxis(90 * -1, Vector3.up) * (transform.forward * 2);
                victim          = CheckForTarget(forwardPos + dir);
                attackDirection = -1;
                needsToAdvance  = true;
            }

            // advance and check left
            if (!victim)
            {
                dir             = Quaternion.AngleAxis(90 * 1, Vector3.up) * (transform.forward * 2);
                victim          = CheckForTarget(forwardPos + dir);
                attackDirection = 1;
                needsToAdvance  = true;
            }

            // advance and check forward
            if (!victim)
            {
                dir             = (transform.forward * 2);
                victim          = CheckForTarget(forwardPos + dir);
                attackDirection = 0;
                needsToAdvance  = true;
            }
        }

        if (victim)
        {
            animator.SetInteger("AttackDirection", attackDirection);

            if (needsToAdvance)
            {
                animator.SetTrigger("Advance");
            }

            if (attackedUsingReach)
            {
                animator.SetTrigger("UseReachAttack");
            }

            //find if attack hits
            float attackRoll = Random.value;
            attackRoll += unitControl.AttackBonus;
            attackRoll += weapon.AttackBonus;
            attackRoll -= unitControl.ParryBonus;

            float victimOffset = Vector3.Dot(victim.transform.forward,
                                             Quaternion.AngleAxis(90 * attackDirection, Vector3.up) * transform.forward);

            if (victimOffset > -0.75)
            {
                attackResult = "Primary";
            }
            else if (attackRoll > 0.5f || attackedUsingReach)
            {
                attackResult = "Primary";
                if (victim.DodgeBonus > Random.value)
                {
                    attackDodged = true;
                    victim.DodgeAttack(attackDirection);
                }
            }
            else
            {
                attackResult = "Blocked";
                victim.BlockAttack(attackDirection);
            }

            if (!needsToAdvance && !attackedUsingReach)
            {
                animator.SetTrigger("Attack" + attackResult);
            }

            weapon.StartAttack();

            lastAttackTarget = attackDodged ? null : victim;
            lastWeaponUsed   = weapon;

            return(true);
        }
        return(false);
    }