Esempio n. 1
0
    public int detectEnemy(eMapDirection dir)
    {
        int stepDistance = 0;
        int xStep = 0; int yStep = 0;

        switch (dir)
        {
        case eMapDirection.LEFT:
            xStep = -1; yStep = 0;
            break;

        case eMapDirection.RIGHT:
            xStep = 1; yStep = 0;
            break;

        case eMapDirection.TOP:
            xStep = 0; yStep = -1;
            break;

        case eMapDirection.BOTTOM:
            xStep = 0; yStep = 1;
            break;
        }

        int _2dx = -1; int _2dy = -1;

        GameLevelCommon._3dTo2d(targetToMove.x, targetToMove.z, out _2dx, out _2dy);
        eBrickType gridType = eBrickType.EMPTY;

        while (true)
        {
            _2dx     = _2dx + xStep;
            _2dy     = _2dy + yStep;
            gridType = (eBrickType)GameLevelCommon.instance.navData[_2dy, _2dx];
            if (gridType == eBrickType.EMPTY)
            {
                ++stepDistance;
            }
            else
            {
                if (gridType == eBrickType.ACTOR)
                {
                    ++stepDistance;
                    return(stepDistance);
                }
                else if (gridType == eBrickType.OCEAN || gridType == eBrickType.AWARD ||
                         gridType == eBrickType.SOIL || gridType == eBrickType.STEEL)
                {
                    ++stepDistance;
                }
                else
                {
                    return(-1);
                }
            }
        }
    }
Esempio n. 2
0
    private _2dPosition getClosetInfo(_2dPosition _from, _2dPosition to, eMapDirection _d)
    {
        if (_from.x <= 0 || _from.x >= navSize - 1 || to.x <= 0 || to.x >= navSize - 1)
        {
            behaviac.Debug.LogError("parameters of getClosetInfo() are illegal!");
            return(null);
        }

        int newX = 0; int newY = 0;

        switch (_d)
        {
        case eMapDirection.LEFT:
            newX = _from.x - 1;
            newY = _from.y;
            break;

        case eMapDirection.RIGHT:
            newX = _from.x + 1;
            newY = _from.y;
            break;

        case eMapDirection.TOP:
            newX = _from.x;
            newY = _from.y - 1;
            break;

        case eMapDirection.BOTTOM:
            newX = _from.x;
            newY = _from.y + 1;
            break;
        }

        bool isWakable = GameLevelCommon.instance.isPointWakable(newX, newY, walkLevel);

        if (isWakable)
        {
            _2dPosition n = new _2dPosition(newX, newY, _from);
            n.G = _from.G + 1;
            n.H = Mathf.Abs(to.x - n.x) + Mathf.Abs(to.y - n.y);
            // substract overlap distance
            if (to.x == n.x || to.y == n.y)
            {
                n.H -= 1;
            }

            n.F = n.H + n.G;
            return(n);
        }
        else
        {
            return(null);
        }
    }
Esempio n. 3
0
    public behaviac.EBTStatus canDestroyBrick(int step)
    {
        eMapDirection direction = (eMapDirection)Mathf.RoundToInt(currentOrientation / 90.0f);
        eBrickType    brickType = GameLevelCommon.instance.getBrickType(this, direction, step);

        if ((int)brickType < (int)eBrickType.STEEL)
        {
            return(behaviac.EBTStatus.BT_SUCCESS);
        }
        else if ((int)brickType < (int)eBrickType.OCEAN && damageLevel > 1)
        {
            return(behaviac.EBTStatus.BT_SUCCESS);
        }
        else
        {
            return(behaviac.EBTStatus.BT_FAILURE);
        }
    }
Esempio n. 4
0
    public behaviac.EBTStatus moveToDirection(eMapDirection direction)
    {
        if (isMoving || isRotating)
        {
            return(behaviac.EBTStatus.BT_RUNNING);
        }

        if (direction == eMapDirection.UNKNOWN)
        {
            return(behaviac.EBTStatus.BT_SUCCESS);
        }

        float angle = (float)direction * 90.0f;

        behaviac.EBTStatus btResult = rotateToAngle(angle);
        if (btResult == behaviac.EBTStatus.BT_SUCCESS)
        {
            btResult = moveForward();
        }
        return(btResult);
    }
Esempio n. 5
0
    public float detectNearestEnemyInView()
    {
        float angle       = -1.0f;
        int   minDistance = int.MaxValue;

        for (int i = 0; i < 4; ++i)
        {
            eMapDirection d        = (eMapDirection)i;
            int           distance = detectEnemy(d);
            if (distance > 0)
            {
                if (minDistance > distance)
                {
                    minDistance = distance;
                    angle       = 90.0f * (float)i;
                }
            }
        }

        return(angle);
    }
Esempio n. 6
0
    public int detectEnemy(eMapDirection dir)
    {
        int stepDistance = 0;
        int xStep = 0; int yStep = 0;
        switch(dir)
        {
        case eMapDirection.LEFT:
            xStep = -1; yStep = 0;
            break;
        case eMapDirection.RIGHT:
            xStep = 1; yStep = 0;
            break;
        case eMapDirection.TOP:
            xStep = 0; yStep = -1;
            break;
        case eMapDirection.BOTTOM:
            xStep = 0; yStep = 1;
            break;
        }

        int _2dx = -1; int _2dy = -1;
        GameLevelCommon._3dTo2d(targetToMove.x, targetToMove.z, out _2dx, out _2dy);
        eBrickType gridType = eBrickType.EMPTY;
        while(true)
        {
            _2dx = _2dx + xStep;
            _2dy = _2dy + yStep;
            gridType = (eBrickType)GameLevelCommon.instance.navData[_2dy, _2dx];
            if(gridType == eBrickType.EMPTY)
            {
                ++stepDistance;
            }
            else
            {
                if(gridType == eBrickType.ACTOR)
                {
                    ++stepDistance;
                    return stepDistance;
                }
                else if(gridType == eBrickType.OCEAN || gridType == eBrickType.AWARD ||
                        gridType == eBrickType.SOIL || gridType == eBrickType.STEEL)
                {
                    ++stepDistance;
                }
                else
                {
                    return -1;
                }
            }
        }
    }
Esempio n. 7
0
 public Assignment_bt_Tank_Wander_RandomFire_node15()
 {
     opr_p1 = eMapDirection.UNKNOWN;
 }
Esempio n. 8
0
 public Assignment_bt_Tank_Wander_node11()
 {
     opr_p1 = eMapDirection.UNKNOWN;
 }
Esempio n. 9
0
 public Assignment_bt_Tank_WalkUtilCollision_node6()
 {
     opr_p1 = eMapDirection.UNKNOWN;
 }
Esempio n. 10
0
 public Assignment_bt_Tank_SafeWander_node2()
 {
     opr_p0 = eMapDirection.UNKNOWN;
 }
Esempio n. 11
0
    public eMapDirection getBestMoveDirection(eMapDirection tendencyDirection)
    {
        List<eMapDirection> safeDirections = null;

        if(dodgeFromDanager)
        {
            eGameForce dodgeForce = eGameForce.UNKNOWN_FORCE;
            if(!GameLevelCommon.instance.isMelee)
            {
                if(force == eGameForce.RED_FORCE)
                    dodgeForce = eGameForce.BLUE_FORCE;
                else if(force == eGameForce.BLUE_FORCE)
                    dodgeForce = eGameForce.RED_FORCE;
            }
            safeDirections = GameLevelCommon.instance.dangerRecord.getSafeMoveDirections(transform.localPosition, dodgeForce);
        }
        else
        {
            safeDirections = new List<eMapDirection>();
            safeDirections.Add(eMapDirection.UNKNOWN);
            safeDirections.Add(eMapDirection.LEFT);
            safeDirections.Add(eMapDirection.RIGHT);
            safeDirections.Add(eMapDirection.TOP);
            safeDirections.Add(eMapDirection.BOTTOM);
        }
        List<eMapDirection> targetDirections = new List<eMapDirection>();
        bool isTendencyDirectionAvailable = false;
        for(int i = 0; i < safeDirections.Count; ++i)
        {
            bool isDirectionWakable = false;
            eMapDirection direction = safeDirections[i];
            if(direction == eMapDirection.UNKNOWN)
            {
                isDirectionWakable = true;
            }
            else
            {
                eBrickType brickType = GameLevelCommon.instance.getBrickType(this, direction, 1);
                if(GameLevelCommon.instance.isBrickTypeWakable(brickType, GameLevelCommon.defaultWalkLevel))
                    isDirectionWakable = true;
            }

            if(isDirectionWakable)
            {
                targetDirections.Add(direction);
                if(tendencyDirection == direction)
                    isTendencyDirectionAvailable = true;
            }
        }

        if(targetDirections.Count == 0)
            return eMapDirection.UNKNOWN;

        if(isTendencyDirectionAvailable)
            return tendencyDirection;
        else
        {
            int index = GameLevelCommon.instance.randomNumberInt(0, targetDirections.Count);
            eMapDirection target = targetDirections[index];
            return target;
        }
    }
Esempio n. 12
0
    public behaviac.EBTStatus moveToDirection(eMapDirection direction)
    {
        if(isMoving || isRotating)
            return behaviac.EBTStatus.BT_RUNNING;

        if(direction == eMapDirection.UNKNOWN)
            return behaviac.EBTStatus.BT_SUCCESS;

        float angle = (float)direction*90.0f;
        behaviac.EBTStatus btResult = rotateToAngle(angle);
        if(btResult == behaviac.EBTStatus.BT_SUCCESS)
        {
            btResult = moveForward();
        }
        return btResult;
    }
Esempio n. 13
0
    public behaviac.EBTStatus navigate()
    {
        GameLevelCommon.instance.dangerousBullets = null;
        if (pathResult == null || pathResult.Count == 0)
        {
            return(behaviac.EBTStatus.BT_FAILURE);
        }

        if (isMoving || isRotating)
        {
            return(behaviac.EBTStatus.BT_RUNNING);
        }
        else
        {
            int currect2DX = -1; int currect2DY = -1;
            GameLevelCommon._3dTo2d(transform.localPosition.x, transform.localPosition.z, out currect2DX, out currect2DY);
            AStarPathFinding._2dPosition targetNode = pathResult[0] as AStarPathFinding._2dPosition;

            float target3DX = 0.0f; float target3DZ = 0.0f;
            if (currect2DX == targetNode.x && currect2DY == targetNode.y)
            {
                pathResult.RemoveAt(0);
                if (pathResult.Count == 0)
                {
                    return(behaviac.EBTStatus.BT_SUCCESS);
                }
                else
                {
                    // todo:
                    targetNode = pathResult[0] as AStarPathFinding._2dPosition;
                    GameLevelCommon._2dTo3d(targetNode.x, targetNode.y, out target3DX, out target3DZ);
                    eMapDirection direction = GameLevelCommon.getRelativeDirection(currect2DX, currect2DY, targetNode.x, targetNode.y);

                    if (dodgeFromDanager)
                    {
                        eGameForce dodgeForce = eGameForce.UNKNOWN_FORCE;
                        if (!GameLevelCommon.instance.isMelee)
                        {
                            if (force == eGameForce.RED_FORCE)
                            {
                                dodgeForce = eGameForce.BLUE_FORCE;
                            }
                            else if (force == eGameForce.BLUE_FORCE)
                            {
                                dodgeForce = eGameForce.RED_FORCE;
                            }
                        }
                        List <kBulletStatus> dangerousBullet = GameLevelCommon.instance.dangerRecord.estimate(new Vector3(target3DX, 0, target3DZ), dodgeForce);
                        if (dangerousBullet != null && dangerousBullet.Count > 0)
                        {
                            GameLevelCommon.instance.dangerousBullets = dangerousBullet;
                            GameLevelCommon.instance.creditSystem.addDodgeFromDangerCredit(dangerousBullet.Count);
                            return(behaviac.EBTStatus.BT_FAILURE);
                        }
                    }
                    return(moveToDirection(direction));
                }
            }
            else
            {
                // todo:
                targetNode = pathResult[0] as AStarPathFinding._2dPosition;
                GameLevelCommon._2dTo3d(targetNode.x, targetNode.y, out target3DX, out target3DZ);
                eMapDirection direction = GameLevelCommon.getRelativeDirection(currect2DX, currect2DY, targetNode.x, targetNode.y);

                if (dodgeFromDanager)
                {
                    eGameForce dodgeForce = eGameForce.UNKNOWN_FORCE;
                    if (!GameLevelCommon.instance.isMelee)
                    {
                        if (force == eGameForce.RED_FORCE)
                        {
                            dodgeForce = eGameForce.BLUE_FORCE;
                        }
                        else if (force == eGameForce.BLUE_FORCE)
                        {
                            dodgeForce = eGameForce.RED_FORCE;
                        }
                    }
                    List <kBulletStatus> dangerousBullet = GameLevelCommon.instance.dangerRecord.estimate(new Vector3(target3DX, 0, target3DZ), dodgeForce);
                    if (dangerousBullet != null && dangerousBullet.Count > 0)
                    {
                        GameLevelCommon.instance.dangerousBullets = dangerousBullet;
                        GameLevelCommon.instance.creditSystem.addDodgeFromDangerCredit(dangerousBullet.Count);
                        return(behaviac.EBTStatus.BT_FAILURE);
                    }
                }
                return(moveToDirection(direction));
            }
        }
    }
Esempio n. 14
0
    public eMapDirection getBestMoveDirection(eMapDirection tendencyDirection)
    {
        List <eMapDirection> safeDirections = null;

        if (dodgeFromDanager)
        {
            eGameForce dodgeForce = eGameForce.UNKNOWN_FORCE;
            if (!GameLevelCommon.instance.isMelee)
            {
                if (force == eGameForce.RED_FORCE)
                {
                    dodgeForce = eGameForce.BLUE_FORCE;
                }
                else if (force == eGameForce.BLUE_FORCE)
                {
                    dodgeForce = eGameForce.RED_FORCE;
                }
            }
            safeDirections = GameLevelCommon.instance.dangerRecord.getSafeMoveDirections(transform.localPosition, dodgeForce);
        }
        else
        {
            safeDirections = new List <eMapDirection>();
            safeDirections.Add(eMapDirection.UNKNOWN);
            safeDirections.Add(eMapDirection.LEFT);
            safeDirections.Add(eMapDirection.RIGHT);
            safeDirections.Add(eMapDirection.TOP);
            safeDirections.Add(eMapDirection.BOTTOM);
        }
        List <eMapDirection> targetDirections = new List <eMapDirection>();
        bool isTendencyDirectionAvailable     = false;

        for (int i = 0; i < safeDirections.Count; ++i)
        {
            bool          isDirectionWakable = false;
            eMapDirection direction          = safeDirections[i];
            if (direction == eMapDirection.UNKNOWN)
            {
                isDirectionWakable = true;
            }
            else
            {
                eBrickType brickType = GameLevelCommon.instance.getBrickType(this, direction, 1);
                if (GameLevelCommon.instance.isBrickTypeWakable(brickType, GameLevelCommon.defaultWalkLevel))
                {
                    isDirectionWakable = true;
                }
            }

            if (isDirectionWakable)
            {
                targetDirections.Add(direction);
                if (tendencyDirection == direction)
                {
                    isTendencyDirectionAvailable = true;
                }
            }
        }

        if (targetDirections.Count == 0)
        {
            return(eMapDirection.UNKNOWN);
        }

        if (isTendencyDirectionAvailable)
        {
            return(tendencyDirection);
        }
        else
        {
            int           index  = GameLevelCommon.instance.randomNumberInt(0, targetDirections.Count);
            eMapDirection target = targetDirections[index];
            return(target);
        }
    }
Esempio n. 15
0
	private _2dPosition getClosetInfo(_2dPosition _from, _2dPosition to, eMapDirection _d)
	{
		if(_from.x <= 0 || _from.x >= navSize - 1 || to.x <= 0 || to.x >= navSize - 1)
		{
			behaviac.Debug.LogError("parameters of getClosetInfo() are illegal!");
			return null;
		}

		int newX = 0; int newY = 0;
		switch(_d)
		{
		case eMapDirection.LEFT:
			newX = _from.x - 1;
			newY = _from.y;
			break;
		case eMapDirection.RIGHT:
			newX = _from.x + 1;
			newY = _from.y;
			break;
		case eMapDirection.TOP:
			newX = _from.x;
			newY = _from.y - 1;
			break;
		case eMapDirection.BOTTOM:
			newX = _from.x;
			newY = _from.y + 1;
			break;
		}

		bool isWakable = GameLevelCommon.instance.isPointWakable(newX, newY, walkLevel);
		if(isWakable)
		{
			_2dPosition n = new _2dPosition(newX, newY, _from);
			n.G = _from.G + 1;
			n.H = Mathf.Abs(to.x - n.x) + Mathf.Abs(to.y - n.y);
			// substract overlap distance
			if(to.x == n.x || to.y == n.y)
				n.H -= 1;

			n.F = n.H + n.G;
			return n;
		}
		else
		{
			return null;
		}
	}
Esempio n. 16
0
 public Precondition_bt_Tank_FSM_MoveFire_attach3()
 {
     opr2_p1 = eMapDirection.UNKNOWN;
     this.Phase = Precondition.EPhase.E_ENTER;
     this.IsAnd = true;
 }