public Route[] RoutesWithSideAndType(EStairSide stairSide, EStairType stairType) { if (stairSide == EStairSide.Left && stairType == EStairType.Down) { return(leftDownRoutes); } else if (stairSide == EStairSide.Left && stairType == EStairType.Up) { return(leftUpRoutes); } else if (stairSide == EStairSide.Right && stairType == EStairType.Down) { return(rightDownRoutes); } else { return(rightUpRoutes); } }
private void ChangeNodeAndRoute(int randomSelector1, int randomSelector2, int stairSelector, float randomBlockTime) { //GetComponent<PhotonTransformView>().SetSynchronizedValues(new Vector3(0f, 0f), 0f); curNodeNum += 1; if (curRoute.NodeSet[curNodeNum].IsItemPoint) // Set item watching time. { isMoving = false; blockedTime = randomBlockTime; SetAnimationProperty(curRoute.NodeSet[curNodeNum].ItemDir, isMoving); } if (curNodeNum == curRoute.NodeSet.Length - 1) // Route ends, get next route. { if (curRoute.RouteType == ERouteType.In_Room) // Currunt root is In Room Route -> Next can be Room to Room/Stair { prevRoom = curRoute.CurRoom; nextRoom = (prevRoom + randomSelector1 % (mapDataManager.Rooms.Count - 1) + 1) % mapDataManager.Rooms.Count; if (curFloor == mapDataManager.Rooms[nextRoom].Floor) // The next room is in the same floor -> Room to Room route { //Debug.Log("Case: Room-to-Room"); List <Route> toNextRoomRoutes = mapDataManager.Rooms[curRoute.CurRoom].ToRoomRoutes[nextRoom]; if (toNextRoomRoutes == null) { Debug.LogError("Room " + prevRoom + " to Room " + nextRoom + " Route is not set."); return; } curRoute = toNextRoomRoutes[randomSelector2 % toNextRoomRoutes.Count]; } else // The next room is in one of the other floors -> Room to Stair route { EStairSide stairSide; if (stairSelector == 0) { stairSide = EStairSide.Left; } else { stairSide = EStairSide.Right; } EStairType stairType; if (mapDataManager.Rooms[nextRoom].Floor < curFloor) { stairType = EStairType.Down; } else { stairType = EStairType.Up; } Route[] toNextStairRoutes = mapDataManager.Rooms[prevRoom].ToStairRoutes.RoutesWithSideAndType(stairSide, stairType); if (toNextStairRoutes.Length == 0) { Debug.LogError("Room " + prevRoom + " to " + stairSide + " " + stairType + " Stair Route is not set."); return; } curRoute = toNextStairRoutes[randomSelector2 % toNextStairRoutes.Length]; } } else if (curRoute.RouteType == ERouteType.Room_to_Stair || curRoute.RouteType == ERouteType.Stair_to_Stair) // Current route is To Stair Route -> Next can be Stair to Room/Stair { if (curRoute.StairType == EStairType.Down) // Current route ends with down stair { curFloor -= 1; } else { curFloor += 1; } if (mapDataManager.Rooms[nextRoom].Floor == curFloor) // The target room is in this floor -> Stair to Room Route { EStairSide stairSide = curRoute.StairSide; EStairType stairType; if (curRoute.StairType == EStairType.Up) { stairType = EStairType.Down; } else { stairType = EStairType.Up; } Vector2 entryOffset = new Vector2(0.5f, 0f); if (Vector2.Distance(transform.position, (Vector2)curRoute.NodeSet[curRoute.NodeSet.Length - 1].transform.position - entryOffset) < Vector2.Distance(transform.position, (Vector2)curRoute.NodeSet[curRoute.NodeSet.Length - 1].transform.position + entryOffset)) { entryOffset = -entryOffset; } Route[] searchRouteSet = mapDataManager.Rooms[nextRoom].FromStairRoutes.RoutesWithSideAndType(stairSide, stairType); List <Route> candRouteSet = new List <Route>(); foreach (Route route in searchRouteSet) { if (route.NodeSet[0].DefaultOffset == entryOffset) { candRouteSet.Add(route); } } if (candRouteSet.Count == 0) { Debug.LogError((Vector2)(transform.position - curRoute.NodeSet[curRoute.NodeSet.Length - 1].transform.position)); Debug.LogError(stairSide + " " + stairType + " Stair to Room " + nextRoom + " Route is not set."); return; } curRoute = candRouteSet[randomSelector2 % candRouteSet.Count]; if (!PhotonNetwork.connected || PhotonNetwork.isMasterClient) { Vector2 newPos = curRoute.NodeSet[0].DefaultPos; bool posConfirmed = false; while (!posConfirmed) { RaycastHit2D[] hits = Physics2D.RaycastAll(newPos, new Vector2()); posConfirmed = true; foreach (RaycastHit2D hit in hits) { if (!hit.collider.isTrigger) { posConfirmed = false; if (stairType == EStairType.Down) { newPos += Vector2.up; } else { newPos += Vector2.down; } break; } } } if (stairType == EStairType.Down) { direction = Vector2.up; } else { direction = Vector2.down; } if (PhotonNetwork.connected) { photonView.RPC("SyncPosImmediately", PhotonTargets.All, newPos); PhotonNetwork.networkingPeer.SendOutgoingCommands(); } else { SyncPosImmediately(newPos); } } } else // The target room isn't in this floor -> Stair to Stair Route { EStairSide stairSide = curRoute.StairSide; EStairType stairType; if (curRoute.StairType == EStairType.Up) { stairType = EStairType.Up; } else { stairType = EStairType.Down; } Vector2 entryOffset = new Vector2(0.5f, 0f); if (Vector2.Distance(transform.position, (Vector2)curRoute.NodeSet[curRoute.NodeSet.Length - 1].transform.position - entryOffset) < Vector2.Distance(transform.position, (Vector2)curRoute.NodeSet[curRoute.NodeSet.Length - 1].transform.position + entryOffset)) { entryOffset = -entryOffset; } Route[] searchRouteSet = mapDataManager.StairToStairRoutes[curFloor].RoutesWithSideAndType(stairSide, stairType); List <Route> candRouteSet = new List <Route>(); foreach (Route route in searchRouteSet) { if (route.NodeSet[0].DefaultOffset == entryOffset) { candRouteSet.Add(route); } } if (candRouteSet.Count == 0) { Debug.LogError((Vector2)(transform.position - curRoute.NodeSet[curRoute.NodeSet.Length - 1].transform.position)); Debug.LogError(stairSide + " " + stairType + " Stair to Stair Route in " + curFloor + "th Floor is not set."); return; } curRoute = candRouteSet[randomSelector2 % candRouteSet.Count]; Vector2 newPos = curRoute.NodeSet[0].DefaultPos; bool posConfirmed = false; if (!PhotonNetwork.connected || PhotonNetwork.isMasterClient) { while (!posConfirmed) { RaycastHit2D[] hits = Physics2D.RaycastAll(newPos, new Vector2()); posConfirmed = true; foreach (RaycastHit2D hit in hits) { if (!hit.collider.isTrigger) { posConfirmed = false; if (stairType == EStairType.Up) { newPos += Vector2.up; } else { newPos += Vector2.down; } break; } } } if (stairType == EStairType.Up) { direction = Vector2.up; } else { direction = Vector2.down; } if (PhotonNetwork.connected) { photonView.RPC("SyncPosImmediately", PhotonTargets.All, newPos); PhotonNetwork.networkingPeer.SendOutgoingCommands(); } else { SyncPosImmediately(newPos); } } } } else if (curRoute.RouteType == ERouteType.Stair_to_Room || curRoute.RouteType == ERouteType.Room_to_Room) // The current route is To Room Route -> Next is In Room Route { curRoute = mapDataManager.Rooms[nextRoom].InRoomRoute; if (curRoute == null) { Debug.LogError("In Room Route of " + nextRoom + "th room is not set."); return; } } else { Debug.LogError("Undefined Route Type Error."); if (PhotonNetwork.connected) { Debug.LogError("Instance ID " + photonView.instantiationId); } } curNodeNum = 0; } }