예제 #1
0
 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);
     }
 }
예제 #2
0
        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;
            }
        }