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); } } } }
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); } }
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); } }
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); }
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); }
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; } } } }
public Assignment_bt_Tank_Wander_RandomFire_node15() { opr_p1 = eMapDirection.UNKNOWN; }
public Assignment_bt_Tank_Wander_node11() { opr_p1 = eMapDirection.UNKNOWN; }
public Assignment_bt_Tank_WalkUtilCollision_node6() { opr_p1 = eMapDirection.UNKNOWN; }
public Assignment_bt_Tank_SafeWander_node2() { opr_p0 = eMapDirection.UNKNOWN; }
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; } }
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; }
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)); } } }
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); } }
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; } }
public Precondition_bt_Tank_FSM_MoveFire_attach3() { opr2_p1 = eMapDirection.UNKNOWN; this.Phase = Precondition.EPhase.E_ENTER; this.IsAnd = true; }