/// <summary> /// please use these values: /// 1 = N, 2 = NE, 3 = E, 4 = SE, 5 = S, 6 = SW, 7 = W, 8 = NW /// This is because it is better to not allow any variations between the /// defined directions /// </summary> protected void NudgeInDir(int dir) { Vector2Int nudgeDir = Vector2Int.zero; switch (dir) { case 1: //N nudgeDir = Vector2Int.up; break; case 2: //NE nudgeDir = Vector2Int.one; break; case 3: //E nudgeDir = Vector2Int.right; break; case 4: //SE nudgeDir = new Vector2Int(1, -1); break; case 5: //S nudgeDir = Vector2Int.down; break; case 6: //SW nudgeDir = Vector2Int.one * -1; break; case 7: //W nudgeDir = Vector2Int.left; break; case 8: //NW nudgeDir = new Vector2Int(-1, 1); break; } if (nudgeDir != Vector2Int.zero) { cnt.Push(nudgeDir); var angleOfDir = Vector3.Angle((Vector2)nudgeDir, transform.up); if (nudgeDir.x < 0f) { angleOfDir = -angleOfDir; } dirSprites.CheckSpriteServer(angleOfDir); } }
/// <summary> /// Nudge the Mob in a certain direction /// </summary> /// <param name="dir"></param> protected void NudgeInDirection(Vector2Int dir) { if (dir != Vector2Int.zero) { cnt.Push(dir); var angleOfDir = Vector3.Angle((Vector2)dir, transform.up); if (dir.x < 0f) { angleOfDir = -angleOfDir; } dirSprites.CheckSpriteServer(angleOfDir); } }
/// <summary> /// General use movement for npcs /// 0 = no move (1 - 8 are directions to move in reading from left to right) /// </summary> /// <param name="act"></param> protected void PerformMoveAction(int act) { if (act == 0) { performingDecision = false; } else { Vector2Int dirToMove = Vector2Int.zero; int count = 1; for (int y = 1; y > -2; y--) { for (int x = -1; x < 2; x++) { if (count == act) { dirToMove.x += x; dirToMove.y += y; y = -100; break; } else { count++; } } } if (dirToMove == Vector2Int.zero) { performingDecision = false; return; } var dest = registerObj.LocalPositionServer + (Vector3Int)dirToMove; if (!cnt.Push(dirToMove)) { //Path is blocked try again performingDecision = false; DoorController tryGetDoor = registerObj.Matrix.GetFirst <DoorController>( dest, true); if (tryGetDoor) { tryGetDoor.MobTryOpen(gameObject); } } else { OnPushSolid(dest); } var angleOfDir = Vector2.Angle(dirToMove, transform.up); if (dirToMove.x < 0f) { angleOfDir = -angleOfDir; } if (dirSprites != null) { dirSprites.CheckSpriteServer(angleOfDir); } } }
IEnumerator PerformFollowPath(List <Node> path) { int node = 1; while (node < path.Count) { if (!activated) { yield return(WaitFor.EndOfFrame); yield break; } if (!movingToTile) { if (tickRate != 0f) { yield return(WaitFor.Seconds(tickRate)); } var dir = path[node].position - Vector2Int.RoundToInt(transform.localPosition); if (!registerTile.Matrix.IsPassableAt(registerTile.LocalPositionServer + (Vector3Int)dir, true)) { var dC = registerTile.Matrix.GetFirst <DoorController>( registerTile.LocalPositionServer + (Vector3Int)dir, true); if (dC != null) { dC.ServerTryOpen(gameObject); yield return(WaitFor.Seconds(1f)); } else { ResetMovingValues(); FollowCompleted(); Logger.Log("Path following timed out. Something must be in the way", Category.Movement); yield break; } } var angleOfDir = Vector2.Angle(dir, transform.up); if (dir.x < 0f) { angleOfDir = -angleOfDir; } if (dirSprites != null) { dirSprites.CheckSpriteServer(angleOfDir); } cnt.Push(dir); movingToTile = true; } else { if (arrivedAtTile) { movingToTile = false; arrivedAtTile = false; timeOut = 0f; node++; } else { //Mob has 5 seconds to get to the next tile //or the AI should do something else timeOut += Time.deltaTime; if (timeOut > 5f) { ResetMovingValues(); Logger.Log("Path following timed out. Something must be in the way", Category.Movement); FollowCompleted(); yield break; } } } yield return(WaitFor.EndOfFrame); } yield return(WaitFor.EndOfFrame); ResetMovingValues(); FollowCompleted(); }