Exemple #1
0
 public SoldierTypeInfo(SoldierState State, SoldierInfo Info, int queue, int time)
 {
     m_State    = State;
     m_Soldier  = Info;
     mFireQueue = queue;
     mFireTime  = time;
 }
    public void PerformTransition(SoldierTransition tran)
    {
        if (tran == SoldierTransition.NullTransition)
        {
            Debug.Log("要执行的转换条件为空");
        }

        SoldierStateType nextState = mCurrentState.GetTargetStateType(tran);

        if (nextState == SoldierStateType.NullState)
        {
            Debug.Log("在 " + tran + " 条件下,没有对应的目标状态");
            return;
        }

        foreach (SoldierState item in mStates)
        {
            if (item.StateType == nextState)
            {
                mCurrentState.DoBeforeLeaving();
                mCurrentState = item;
                mCurrentState.DoBeforeEntering();
            }
        }
    }
    // Use this for initialization
    void Start()
    {
        m_currentState = SoldierState.Idle;

        m_rb = gameObject.GetComponent <Rigidbody2D>();

        m_bulletEmitter = gameObject.GetComponent <BulletEmitter>();

        GameObject l_playerOne = Managers.GetInstance().GetPlayerManager().GetPlayerOne();
        GameObject l_playerTwo = Managers.GetInstance().GetPlayerManager().GetPlayerTwo();

        if (m_ignorePlayerCollision)
        {
            Physics2D.IgnoreCollision(l_playerOne.GetComponent <Collider2D>(), GetComponent <Collider2D>());
            Physics2D.IgnoreCollision(l_playerTwo.GetComponent <Collider2D>(), GetComponent <Collider2D>());
        }

        //m_animator = gameObject.GetComponent<Animator>();

        if (Mathf.Abs(transform.position.x - l_playerOne.transform.position.x) < Mathf.Abs(transform.position.x - l_playerTwo.transform.position.x))
        {
            m_target = l_playerOne;
        }
        else
        {
            m_target = l_playerTwo;
        }
    }
Exemple #4
0
 public void StartAttack()
 {
     soldierState = SoldierState.ATTACKING;
     agent.enabled = false;
     swordTween = sword.transform.DOLocalRotate (new Vector3 (0, -83, -20), 0.2f).SetLoops (-1, LoopType.Yoyo);
     StartCoroutine (AttackJump ());
 }
Exemple #5
0
 private void StartMarching()
 {
     navMeshAgent.isStopped   = false;
     navMeshAgent.destination = destination.transform.position;
     navMeshAgent.SetAreaCost(randomArea, 1f);
     state = SoldierState.Marching;
 }
    //添加状态到系统
    public void AddState(SoldierState s)
    {
        if (s == null || s.ID == SoldierStateID.NullStateID)
        {
            Debug.LogError("添加状态不能为空");
            return;
        }

        //首次添加状态时,设置系统的初始数据,
        //执行状态的DoBeforeEntering方法
        if (states.Count == 0)
        {
            states.Add(s);
            currentState = s;

            currentState.DoBeforeEntering();
            return;
        }

        if (states.Any(state => state.ID == s.ID))
        {
            Debug.LogError("已经存在 " + s);
            return;
        }

        states.Add(s);
    }
Exemple #7
0
    public void AcquireTarget(Soldier soldier, SoldierState previousState)
    {
        if (soldier.behaviour == m_soldierBehaviour && previousState != soldier.state)
        {
            switch (soldier.state)
            {
            case SoldierState.Protect:
                currentTarget = queen.transform;
                break;

            case SoldierState.Attack:
                currentTarget = soldier.attackTarget.behaviour.transform;
                break;

            case SoldierState.Harvest:
                if (soldier.harvestPileTarget == null)
                {
                    currentTarget = soldier.harvestUnitTarget.behaviour.transform;
                }
                else
                {
                    currentTarget = soldier.harvestPileTarget.behaviour.transform;
                }
                break;

            case SoldierState.StealEgg:
                currentTarget = soldier.stealEggTarget.behaviour.transform;
                break;
            }
            acquireTimer = 0;
        }
    }
Exemple #8
0
 public void StartAttack()
 {
     soldierState  = SoldierState.ATTACKING;
     agent.enabled = false;
     swordTween    = sword.transform.DOLocalRotate(new Vector3(0, -83, -20), 0.2f).SetLoops(-1, LoopType.Yoyo);
     StartCoroutine(AttackJump());
 }
    //执行状态转换
    public void PerformTransition(SoldierTransition trans)
    {
        if (trans == SoldierTransition.NullTransition)
        {
            Debug.LogError("转换条件不能为空");
            return;
        }

        SoldierStateID nextId = currentState.GetOutputState(trans);

        if (nextId == SoldierStateID.NullStateID)
        {
            Debug.LogError("转换的状态不能为空");
            return;
        }

        foreach (SoldierState state in states)
        {
            if (state.ID != nextId)
            {
                continue;
            }

            currentState.DoBeforeLeaving();  //转换前执行现有状态的DoBeforeLeaving方法
            currentState = state;
            currentState.DoBeforeEntering(); //转换完成,执行转换后状态的DoBeforeEntering方法
            return;
        }
    }
 public void Attack(Building target)
 {
     if (MoveToLocation(target.Position))
     {
         soldierState = SoldierState.Attacking;
         this.target  = target;
     }
 }
Exemple #11
0
 public IEnumerator StartCelebration()
 {
     soldierState = SoldierState.CELEBRATING;
     agent.enabled = false;
     yield return new WaitForSeconds(Random.Range(0.1f,0.5f));
     transform.LookAt (new Vector3(Camera.main.transform.position.x, transform.position.y, Camera.main.transform.position.z) );
     GetComponent<Rigidbody> ().AddForce(Vector3.up * celeberateForce);
 }
Exemple #12
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="attack"></param>
 /// <param name="notifyTarget"></param>
 public void SetAttack(bool attack, bool notifyTarget)
 {
     state = SoldierState.Seeking;
     if (notifyTarget)
     {
         myTarget.SetAttack(attack, false);
     }
 }
 void FixedUpdateReloading()
 {
     currentReloadTime -= Time.fixedDeltaTime;
     if (currentReloadTime <= 0f)
     {
         State = SoldierState.Firing;
     }
 }
Exemple #14
0
    private void StartAttacking()
    {
        Vector3 direction = currentTarget.transform.position - transform.position; direction.y = 0; direction.Normalize();

        transform.rotation = Quaternion.LookRotation(direction);
        state = SoldierState.Attacking;
        animator.SetBool("Attacking", true);
    }
Exemple #15
0
 private void StartApproaching()
 {
     navMeshAgent.isStopped = false;
     //navMeshAgent.destination = farTarget.GetComponent<Collider>().ClosestPointOnBounds(transform.position);
     navMeshAgent.destination = farTarget.transform.position;
     navMeshAgent.SetAreaCost(randomArea, 1f);
     state = SoldierState.Approaching;
 }
Exemple #16
0
 private void StartMarching()
 {
     marching = true;
     navMeshAgent.isStopped   = false;
     navMeshAgent.destination = destination.transform.position;
     navMeshAgent.SetAreaCost(randomArea, 1f);
     state = SoldierState.Marching;
     UpdateAnimatorWalkSpeed();
 }
Exemple #17
0
		public void setAttackTarget(Soldier target){
			if (attackTarget != null)
				attackTarget.SoldierDeath -= targetDied;

			intention = SoldierState.Attacking;
			target.SoldierDeath += targetDied;
			attackTarget = target;
			attackTargetTransform = target.transform;
		}
Exemple #18
0
    public IEnumerator StartCelebration()
    {
        soldierState  = SoldierState.CELEBRATING;
        agent.enabled = false;
        yield return(new WaitForSeconds(Random.Range(0.1f, 0.5f)));

        transform.LookAt(new Vector3(Camera.main.transform.position.x, transform.position.y, Camera.main.transform.position.z));
        GetComponent <Rigidbody> ().AddForce(Vector3.up * celeberateForce);
    }
Exemple #19
0
        public void LookupsTest()
        {
            var x     = 50.0f;
            var r     = PhysicsConsts.SoldierRadius * 2;
            var posA  = new Vector2(x, 0);
            var posB  = new Vector2(x, r);
            var posC  = new Vector2(x, r * 2.0f);
            var unitA = new SoldierState {
                Side = Side.Player, Id = "0", LaneKey = "0", Position = posA
            };
            var unitB = new SoldierState {
                Side = Side.Enemy, Id = "1", LaneKey = "0", Position = posB
            };
            var unitC = new SoldierState {
                Side = Side.Enemy, Id = "2", LaneKey = "0", Position = posC
            };
            var a = new GameState(Difficulty.Easy);

            a.Soldiers = new List <SoldierState>(new[] { unitA, unitB, unitC });
            Game.LoadFromState(a);
            var lookups = Game.Queries;
            Func <BaseUnitState, bool> enemyFilter = v => v.Id != unitA.Id && v.Side != unitA.Side;
            Func <BaseUnitState, bool> anyFilter   = v => true;
            var closestEnemyQuery = new Queries.NearestUnit
            {
                LaneKey     = "0",
                MaxDistance = 200,
                PreferredId = null,
                SearchFrom  = unitA.Position
            };
            var preferredEnemyQuery = new Queries.NearestUnit
            {
                LaneKey     = "0",
                MaxDistance = 200,
                PreferredId = "2",
                SearchFrom  = unitA.Position
            };
            var nonexistentEnemyQuery = new Queries.NearestUnit
            {
                LaneKey     = "0",
                MaxDistance = 0,
                PreferredId = null,
                SearchFrom  = unitA.Position
            };
            var closesetEnemy    = lookups.GetNearestUnit(closestEnemyQuery, enemyFilter);
            var preferredEnemy   = lookups.GetNearestUnit(preferredEnemyQuery, enemyFilter);
            var nonexistentEnemy = lookups.GetNearestUnit(nonexistentEnemyQuery, enemyFilter);
            var self             = lookups.GetNearestUnit(closestEnemyQuery, anyFilter);

            Assert.AreEqual(closesetEnemy.Id, "1");
            Assert.AreEqual(preferredEnemy.Id, "2");
            Assert.AreEqual(self.Id, "0");
            Assert.AreEqual(nonexistentEnemy, null);
        }
    void FixedUpdateFiring()
    {
        // Check to see if we have a target to shoot.
        if (m_nearestEnemy == null || m_nearestEnemy.State == SoldierState.Dead)
        {
            FindNearestEnemy();

            // If there's *no* valid target to shoot, resume the march.
            if (m_nearestEnemy == null)
            {
                State = SoldierState.Marching;
                return;
            }
            else
            {
                // If the nearest target is too far to shoot, resume the march.
                float distance = (transform.position - m_nearestEnemy.transform.position).magnitude;
                if (distance > firingDistance)
                {
                    State = SoldierState.Marching;
                    return;
                }
            }
        }

        float enemydistance = (transform.position - m_nearestEnemy.transform.position).magnitude;

        if (enemydistance > firingDistance)
        {
            State = SoldierState.Marching;
            return;
        }

        Vector2 enemyDirection = (Vector2)(m_nearestEnemy.transform.position - transform.position);

        enemyDirection.Normalize();
        enemyDirection.x += Random.Range(-accuracyDeviation, accuracyDeviation);
        enemyDirection.y += Random.Range(-accuracyDeviation, accuracyDeviation);
        enemyDirection.Normalize();

        // Spawn bullet
        Bullet newBullet = Instantiate <Bullet>(bulletPrefab);

        newBullet.gameObject.name     = "Bullet - (" + name + ")";
        newBullet.shooter             = gameObject;
        newBullet.transform.position  = transform.position;
        newBullet.transform.position += (Vector3)(enemyDirection * 1.1f);               // @TODO Fix this hack. Shifts the bullet out of the shooter's collider

        // Fire bullet.
        newBullet.Fire(enemyDirection);

        // Reload.
        State = SoldierState.Reloading;
    }
Exemple #21
0
    void Update()
    {
        Vector3 dir;

        /// Battle has not started, mantain idle state.
        if (state == SoldierState.Idle || state == SoldierState.Dead)
        {
            return;
        }
        /// Battle begun, walk towards starting point.
        else if (state == SoldierState.Move)
        {
            transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
        }
        else if (state == SoldierState.Seeking)
        {
            if (isRedArmy)
            {
                dir = (myTarget.transform.position - transform.position).normalized;
            }
            else
            {
                dir = (transform.position - myTarget.transform.position).normalized;
            }
            transform.Translate(dir * Time.deltaTime * moveSpeed);
            if (Vector3.Distance(transform.position, myTarget.transform.position) < 5.0f)
            {
                state = SoldierState.Attack;
                anim.SetBool(moveParam, false);
                anim.SetBool(attackParam, true);
            }
        }
        else if (state == SoldierState.Attack)
        {
            if (Vector3.Distance(transform.position, myTarget.transform.position) > 5.0f)
            {
                if (isRedArmy)
                {
                    dir = (myTarget.transform.position - transform.position).normalized;
                }
                else
                {
                    dir = (transform.position - myTarget.transform.position).normalized;
                }
                transform.Translate(dir * Time.deltaTime * moveSpeed);
            }
        }
    }
	public override void SoldierStateChanged(SoldierState state) {

		base.SoldierStateChanged(state);
		myText.text = state + " State";

		//Change the Panel to Attack Panel

		if (state == SoldierState.ATTACK)
		{
			//Active Action btns
			//Debug.Log ("Attack !!");
			if (MovePanel.gameObject.activeSelf && !ActionPanel.gameObject.activeSelf)
			{
				//Debug.Log("Change to Action Panel");       
				MovePanel.transform.DOMove(new Vector3(MovePanel.transform.position.x, MovePanel.transform.position.y + 50.0f), 1).SetEase(Ease.OutSine).OnComplete(() => MovePanel.gameObject.SetActive(false));
				ActionPanel.transform.DOMove(new Vector3(MovePanel.transform.position.x, MovePanel.transform.position.y - 8.0f), 1).SetEase(Ease.OutSine).OnStart(() => ActionPanel.gameObject.SetActive(true));
				//MovePanel.transform.DOLocalMoveY(1.0f, 1).SetEase(Ease.OutSine).OnComplete(() => MovePanel.gameObject.SetActive(false));
				//ActionPanel.transform.DOLocalMoveY(-1.0f, 1).SetEase(Ease.OutSine).OnStart(() => ActionPanel.gameObject.SetActive(true));
			}

			//ActionPanel.gameObject.SetActive(true);
			//MovePanel.gameObject.SetActive(false);
		}
		//Change the Panel to Move Panel
		if (state == SoldierState.MOVE)
		{
			//Active Move btns
			//Debug.Log ("Move !!");

			if (!MovePanel.gameObject.activeSelf && ActionPanel.gameObject.activeSelf)
			{
				//Debug.Log("Change to Move Panel");
				MovePanel.transform.DOMove(new Vector3(MovePanel.transform.position.x, MovePanel.transform.position.y - 50.0f), 1).SetEase(Ease.OutSine).OnStart(() => MovePanel.gameObject.SetActive(true));
				ActionPanel.transform.DOMove(new Vector3(MovePanel.transform.position.x, MovePanel.transform.position.y + 8.0f), 1).SetEase(Ease.OutSine).OnComplete(() => ActionPanel.gameObject.SetActive(false));
				//MovePanel.transform.DOLocalMoveY(-1.0f, 1).SetEase(Ease.OutSine).OnStart(() => MovePanel.gameObject.SetActive(true));
				//ActionPanel.transform.DOLocalMoveY(1.0f, 1).SetEase(Ease.OutSine).OnComplete(() => ActionPanel.gameObject.SetActive(false));
			}
		}


		if (state == SoldierState.PLAY)
		{
			MovePanel.gameObject.SetActive(false);
			ActionPanel.gameObject.SetActive(false);
		}

    }
    void FixedUpdateMarching()
    {
        // Find the nearest enemy soldier to figure out if we should stop marching
        // This doesn't need to be recalculated every physics frame, but it's simpler to implement right now...
        FindNearestEnemy();

        if (m_nearestEnemy != null)
        {
            float distance = (transform.position - m_nearestEnemy.transform.position).magnitude;
            if (distance <= firingDistance)
            {
                State = SoldierState.Firing;
                return;
            }
        }

        // March!
        rb.velocity = marchDirection * marchSpeed * Time.fixedDeltaTime;
    }
    void Start()
    {
        if (mySpawner == null)
        {
            Debug.LogAssertion(string.Format("Soldier '{0}' has no spawner", name));
        }
        myAnimator = GetComponentInChildren <Animator>();
        State      = SoldierState.Marching;
        Health     = maxHealth;

        if (army == Army.BlueArmy)
        {
            GetComponentInChildren <SpriteRenderer>().color = new Color(0.3f, 0.3f, 1f);
        }
        else if (army == Army.RedArmy)
        {
            GetComponentInChildren <SpriteRenderer>().color = new Color(1f, 0.3f, 0.3f);
        }
    }
    void SwitchState(SoldierState newState)
    {
        curWP = 0;
        if ((state == SoldierState.Patrol))
        {
            animator.SetTrigger("Alerted");
            agent.SetDestination(transform.position);
        }

        if (newState == SoldierState.Alerted)
        {
            alertTime = Time.time;
        }

        if (newState == SoldierState.Patrol)
        {
            agent.SetDestination(patrolRoute[curWP].position);
            animator.SetTrigger("Calmed");
        }

        state = newState;
    }
    private void AddState(SoldierState state)
    {
        if (state == null)
        {
            Debug.Log("将要添加的状态为空");
        }
        if (mStates.Count == 0)
        {
            mStates.Add(state);
            mCurrentState = state;
            return;
        }

        if (mStates.Contains(state))
        {
            Debug.Log("已经包含了该状态");
        }
        else
        {
            mStates.Add(state);
            mCurrentState = state;
        }
    }
 bool CheckCanHeal()
 {
     lowestHPSoldier = soldierManager.FindNearestInjuredSoldierWithinRange(this, currentWeapon.range);
     if (lowestHPSoldier)
     {
         lowestSoldierHealth = lowestHPSoldier.GetComponent<Health>();
         if (lowestSoldierHealth.GetHealth < lowestSoldierHealth.maxHealth)
         {
             state = SoldierState.Healing;
             return true;
         }
         else
         {
             state = prevState;
             return false;
         }
     }
     else
     {
         state = prevState;
         return false;
     }
 }
 bool CheckCanAttack()
 {
     if (enemiesInSight.Count > 0)
     {
         state = SoldierState.Attacking;
         return true;
     }
     else
     {
         state = prevState;
         return false;
     }
 }
	void FixedUpdateFiring() {
		// Check to see if we have a target to shoot.
		if (m_nearestEnemy == null || m_nearestEnemy.State == SoldierState.Dead) {
			FindNearestEnemy();

			// If there's *no* valid target to shoot, resume the march.
			if (m_nearestEnemy == null) {
				State = SoldierState.Marching;
				return;
			}
			else {
				// If the nearest target is too far to shoot, resume the march.
				float distance = (transform.position - m_nearestEnemy.transform.position).magnitude;
				if (distance > firingDistance) {
					State = SoldierState.Marching;
					return;
				}
			}
		}

		float enemydistance = (transform.position - m_nearestEnemy.transform.position).magnitude;
		if (enemydistance > firingDistance) {
			State = SoldierState.Marching;
			return;
		}

		Vector2 enemyDirection = (Vector2)(m_nearestEnemy.transform.position - transform.position);
		enemyDirection.Normalize();
		enemyDirection.x += Random.Range(-accuracyDeviation, accuracyDeviation);
		enemyDirection.y += Random.Range(-accuracyDeviation, accuracyDeviation);
		enemyDirection.Normalize();

		// Spawn bullet
		Bullet newBullet = Instantiate<Bullet>(bulletPrefab);
		newBullet.gameObject.name = "Bullet - (" + name + ")";
		newBullet.shooter = gameObject;
		newBullet.transform.position = transform.position;
		newBullet.transform.position += (Vector3)(enemyDirection * 1.1f);	// @TODO Fix this hack. Shifts the bullet out of the shooter's collider

		// Fire bullet.
		newBullet.Fire(enemyDirection);

		// Reload.
		State = SoldierState.Reloading;
	}
Exemple #30
0
 public void StartWalk()
 {
     soldierState = SoldierState.WALKING;
     agent.enabled = true;
 }
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
            if (!isActive)
            {
                healthText.Text = "";
                return;
            }
            healthText.Position = new Vector2(position.X - 8, position.Y - 8);
            healthText.Text     = health.ToString();

            if (soldierState == SoldierState.Attacking)
            {
                //If soldier is out of range, move them until they are in range
                if (Vector2.Distance(position, targetLocation) > soldierRange)
                {
                    if (Vector2.Distance(position, curTarget) < slowRadius + 5 && targetPath.Count > 2)
                    {
                        if (!graph.IsNodeBlocked(targetPath.Peek()))
                        {
                            curTarget = targetPath.Pop();
                            if (!graph.IsNodeBlocked(targetPath.Peek()))
                            {
                                curTarget = (curTarget + targetPath.Pop()) / 2;
                            }
                            else
                            {
                                Attack(target);
                                return;
                            }
                        }
                        else
                        {
                            Attack(target);
                            return;
                        }
                        curTarget = new Vector2(curTarget.X + sprite.Width / 2, curTarget.Y + sprite.Height / 2);
                    }
                    else if (Vector2.Distance(position, curTarget) < slowRadius + 5 && targetPath.Count > 0)
                    {
                        if (!graph.IsNodeBlocked(targetPath.Peek()))
                        {
                            curTarget = targetPath.Pop();
                        }
                        else
                        {
                            Attack(target);
                            return;
                        }
                        curTarget = new Vector2(curTarget.X + sprite.Width / 2, curTarget.Y + sprite.Height / 2);
                    }
                    else if (targetPath.Count == 0 && Vector2.Distance(position, curTarget) < stopRadius)
                    {
                        if (graph.IsNodeBlocked(position))
                        {
                            Attack(target);
                            return;
                        }
                        //graph.SetNodeBlocked(position);
                    }


                    //rotate based on orientation
                    base.rotation = (float)Math.Atan2(orientation.X, -orientation.Y);
                    acceleration  = curTarget - this.Position;
                    distance      = Math.Abs(acceleration.Length());
                    if (distance < stopRadius)
                    {
                        speed = 0;
                    }
                    else if (distance < slowRadius)
                    {
                        speed = maxSpeed * distance / slowRadius;
                    }
                    else
                    {
                        speed = maxSpeed;
                    }

                    oldVelocity  = velocity;
                    acceleration = Vector2.Normalize(curTarget - this.Position) * maxAccel;
                    velocity    += velocity * gameTime.ElapsedGameTime.Milliseconds + .5f * acceleration * gameTime.ElapsedGameTime.Milliseconds * gameTime.ElapsedGameTime.Milliseconds;
                    velocity     = Vector2.Normalize(velocity) * speed;
                    position    += velocity;


                    if (velocity != Vector2.Zero)
                    {
                        orientation = velocity;
                    }
                }
                else// if (!graph.IsNodeBlocked(position))
                {
                    //graph.SetNodeBlocked(position);
                    if (target.IsActive)
                    {
                        AttackTarget(gameTime);
                    }
                    else
                    {
                        soldierState = SoldierState.Idle;
                    }
                }
            }
            else if (soldierState == SoldierState.Idle)
            {
                graph.SetNodeBlocked(position);
            }
        }
Exemple #32
0
 // Use this for initialization
 void Start()
 {
     rb = GetComponent <Rigidbody>();
     ene2.SetBool("State", false);
     SS = SoldierState.Fire;
 }
Exemple #33
0
 public SoldierTypeInfo(SoldierState State, SoldierInfo Info)
 {
     m_State   = State;
     m_Soldier = Info;
 }
Exemple #34
0
 private void Awake()
 {
     anim  = GetComponent <Animator>();
     state = SoldierState.IDLE;
 }
 public JsonSoldier(int health, float posX, float posY, bool canAttack, SoldierState state)
 {
     this.hp        = health; this.posX = (float)Math.Round(posX, 2); this.posY = (float)Math.Round(posY, 2);
     this.canAttack = canAttack; this.state = state.ToString();
 }
    void SwitchState(SoldierState newState)
    {
        curWP = 0;
        if ((state == SoldierState.Patrol ))
        {
            animator.SetTrigger("Alerted");
            agent.SetDestination(transform.position);
        }

        if(newState == SoldierState.Alerted)
        {
            alertTime = Time.time;
        }

        if(newState == SoldierState.Patrol)
        {
            agent.SetDestination(patrolRoute[curWP].position);
            animator.SetTrigger("Calmed");
        }

        state = newState;
    }
 public virtual void SoldierStateChanged(SoldierState arg1) {
 }
	void FixedUpdateReloading() {
		currentReloadTime -= Time.fixedDeltaTime;
		if (currentReloadTime <= 0f) {
			State = SoldierState.Firing;
		}
	}
 // Use this for initialization
 void Start()
 {
     destination = transform.position;
     moveDirection = Vector3.zero;
     state = SoldierState.Guarding;
     prevState = state;
     selected = false;
     line.enabled = false;
     EquipWeapon("MP5");
     sight.UpdateSight(currentWeapon.range);
 }
 public void Start()
 {
     mSCurrentState = mSMoveState;
 }
    void Update()
    {
        Weapon_HealingBeam healingWpn = null;
        if (currentWeapon is Weapon_HealingBeam)
        {
            healingWpn = (Weapon_HealingBeam)currentWeapon;
        }
        switch (state)
        {
            case SoldierState.Moving:
                if (healingWpn)
                {
                    healingWpn.StopHealing();
                    healingWpn.StopFiring();
                }
                if (Vector3.Distance(destination, transform.position) > .5f)
                {
                    currentWeapon.StopFiring();
                    moveDirection = (destination - transform.position).normalized;
                    transform.rotation = Quaternion.LookRotation(moveDirection);
                    moveDirection = transform.forward * moveSpeed;
                    controller.SimpleMove(moveDirection);
                    DrawLine(destination, Color.cyan);
                    animation.CrossFade("run");
                }
                else
                {
                    state = SoldierState.Guarding;
                }
                break;
            case SoldierState.Guarding:

                if (healingWpn)
                {
                    if (CheckCanHeal())
                    {
                        prevState = SoldierState.Guarding;
                        break;
                    }
                    else if(CheckCanAttack())
                    {
                        prevState = SoldierState.Guarding;
                        break;
                    }
                    else
                    {
                        healingWpn.StopHealing();
                        healingWpn.StopFiring();
                        animation.CrossFade("idle");
                        line.enabled = false;
                    }
                }
                else if (CheckCanAttack())
                {
                    prevState = SoldierState.Guarding;
                    break;
                }
                else
                {
                    currentWeapon.StopFiring();
                    animation.CrossFade("idle");
                    line.enabled = false;
                }

                break;
            case SoldierState.AttackMove:
                prevState = SoldierState.AttackMove;
                DrawLine(destination, Color.red);

                if(healingWpn)
                {
                    if(CheckCanHeal())
                    {
                        prevState = SoldierState.AttackMove;
                    }
                    else if(CheckCanAttack())
                    {
                        prevState = SoldierState.AttackMove;
                    }
                    else
                    {
                        healingWpn.StopHealing();
                        healingWpn.StopFiring();
                        if (Vector3.Distance(destination, transform.position) > .5f)
                        {
                            moveDirection = (destination - transform.position).normalized;
                            transform.rotation = Quaternion.LookRotation(moveDirection);
                            moveDirection = transform.forward * moveSpeed;
                            controller.SimpleMove(moveDirection);

                            animation.CrossFade("run");
                        }
                        else
                        {
                            state = SoldierState.Guarding;
                        }
                    }
                }
                else if (!CheckCanAttack())
                {
                    currentWeapon.StopFiring();
                    if (Vector3.Distance(destination, transform.position) > .5f)
                    {
                        moveDirection = (destination - transform.position).normalized;
                        transform.rotation = Quaternion.LookRotation(moveDirection);
                        moveDirection = transform.forward * moveSpeed;
                        controller.SimpleMove(moveDirection);

                        animation.CrossFade("run");
                    }
                    else
                    {
                        state = SoldierState.Guarding;
                    }
                }
                else
                {
                    prevState = SoldierState.AttackMove;
                }
                break;
            case SoldierState.Attacking:
                if(healingWpn && CheckCanHeal())
                {

                }
                else if (CheckCanAttack())
                {
                    if(healingWpn)
                    {
                        AttackHealingWpn();
                    }
                    else
                    {
                        Attack();
                    }
                }

                break;
            case SoldierState.Healing:
                if (CheckCanHeal())
                {
                    Heal();
                }
                break;
            case SoldierState.HealMove:
                break;
            default:
                currentWeapon.StopFiring();
                break;
        }
        selectionBox.enabled = selected;
        healthBar.SetActive(selected);
    }
Exemple #42
0
    public void Start()
    {
        mSCurrentState = mSMoveState;

        //StartCoroutine(RemoveDestroyedObjectInRange());
    }
 public void Attack(Building target)
 {
     if (MoveToLocation(target.Position))
     {
         soldierState = SoldierState.Attacking;
         this.target = target;
     }
 }
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
            if (!isActive)
            {
                healthText.Text = "";
                return;
            }
            healthText.Position = new Vector2(position.X - 8, position.Y - 8);
            healthText.Text = health.ToString();

            if (soldierState == SoldierState.Attacking)
            {
                //If soldier is out of range, move them until they are in range
                if (Vector2.Distance(position, targetLocation) > soldierRange)
                {
                    if (Vector2.Distance(position, curTarget) < slowRadius + 5 && targetPath.Count > 2)
                    {
                        if (!graph.IsNodeBlocked(targetPath.Peek()))
                        {
                            curTarget = targetPath.Pop();
                            if (!graph.IsNodeBlocked(targetPath.Peek()))
                            {
                                curTarget = (curTarget + targetPath.Pop()) / 2;
                            }
                            else
                            {
                                Attack(target);
                                return;
                            }
                        }
                        else
                        {
                            Attack(target);
                            return;
                        }
                        curTarget = new Vector2(curTarget.X + sprite.Width / 2, curTarget.Y + sprite.Height / 2);
                    }
                    else if (Vector2.Distance(position, curTarget) < slowRadius + 5 && targetPath.Count > 0)
                    {
                        if (!graph.IsNodeBlocked(targetPath.Peek()))
                        {
                            curTarget = targetPath.Pop();
                        }
                        else
                        {
                            Attack(target);
                            return;
                        }
                        curTarget = new Vector2(curTarget.X + sprite.Width / 2, curTarget.Y + sprite.Height / 2);
                    }
                    else if (targetPath.Count == 0 && Vector2.Distance(position, curTarget) < stopRadius)
                    {
                        if (graph.IsNodeBlocked(position))
                        {
                            Attack(target);
                            return;
                        }
                        //graph.SetNodeBlocked(position);
                    }


                    //rotate based on orientation
                    base.rotation = (float)Math.Atan2(orientation.X, -orientation.Y);
                    acceleration = curTarget - this.Position;
                    distance = Math.Abs(acceleration.Length());
                    if (distance < stopRadius)
                    {
                        speed = 0;
                    }
                    else if (distance < slowRadius)
                    {
                        speed = maxSpeed * distance / slowRadius;
                    }
                    else
                    {
                        speed = maxSpeed;
                    }

                    oldVelocity = velocity;
                    acceleration = Vector2.Normalize(curTarget - this.Position) * maxAccel;
                    velocity += velocity * gameTime.ElapsedGameTime.Milliseconds + .5f * acceleration * gameTime.ElapsedGameTime.Milliseconds * gameTime.ElapsedGameTime.Milliseconds;
                    velocity = Vector2.Normalize(velocity) * speed;
                    position += velocity;


                    if (velocity != Vector2.Zero)
                    {
                        orientation = velocity;
                    }
                }
                else// if (!graph.IsNodeBlocked(position))
                {
                    //graph.SetNodeBlocked(position);
                    if (target.IsActive)
                    {
                        AttackTarget(gameTime);
                    }
                    else
                    {
                        soldierState = SoldierState.Idle;
                    }
                    
                }
            }
            else if (soldierState == SoldierState.Idle)
            {
                graph.SetNodeBlocked(position);
            }
        }
Exemple #45
0
 public void Start()
 {
     mSCurrentState = mSMoveState;
 }
 public void SetAttackMove(Vector3 _dest)
 {
     destination = _dest;
     state = SoldierState.AttackMove;
 }
Exemple #47
0
 public void StartWalk()
 {
     soldierState  = SoldierState.WALKING;
     agent.enabled = true;
 }
 public void SetMove(Vector3 _dest)
 {
     destination = _dest;
     state = SoldierState.Moving;
 }
	void FixedUpdateMarching() {
		// Find the nearest enemy soldier to figure out if we should stop marching
		// This doesn't need to be recalculated every physics frame, but it's simpler to implement right now...
		FindNearestEnemy();

		if (m_nearestEnemy != null) {
			float distance = (transform.position - m_nearestEnemy.transform.position).magnitude;
			if (distance <= firingDistance) {
				State = SoldierState.Firing;
				return;
			}
		}

		// March!
		rb.velocity = marchDirection * marchSpeed;
	}
	void Start () {
		if (mySpawner == null) {
			Debug.LogAssertion(string.Format("Soldier '{0}' has no spawner", name));
		}
		myAnimator = GetComponentInChildren<Animator>();
		State = SoldierState.Marching;
		Health = maxHealth;

		if (army == Army.BlueArmy) {
			GetComponentInChildren<SpriteRenderer>().color = new Color(0.3f, 0.3f, 1f);
		}
		else if (army == Army.RedArmy) {
			GetComponentInChildren<SpriteRenderer>().color = new Color(1f, 0.3f, 0.3f);
		}
	}