Ejemplo n.º 1
0
        public RandomRoom CreateRoom(WaitUser[] members)
        {
            string roomID;

            do
            {
                // create a random string of 8 characters
                string chars       = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
                char[] stringChars = new char[8];
                Random random      = new Random();
                for (int i = 0; i < stringChars.Length; i++)
                {
                    stringChars[i] = chars[random.Next(chars.Length)];
                }
                roomID = new String(stringChars);
            } while (SearchRoom(roomID) != null);

            RandomRoom room = new RandomRoom
            {
                ID      = roomID,
                Members = members
            };

            RoomList.Add(room);
            return(room);
        }
Ejemplo n.º 2
0
        public async Task SendMessage(string message)
        {
            RandomRoom room = RoomManager.Instance.GetRoom(Context.ConnectionId);

            if (room != null)
            {
                await Clients.Group(room.ID).ReceiveMessage(Context.ConnectionId, message);
            }
            Debug();
        }
Ejemplo n.º 3
0
        public async Task SkipChat(int userID, string username)
        {
            WaitUser user = new WaitUser
            {
                ConnectionID = Context.ConnectionId,
                UserID       = userID,
                UserName     = username
            };
            RandomRoom usrroom = RoomManager.Instance.GetRoom(user.ConnectionID);

            if (usrroom != null)
            {
                foreach (WaitUser usr in usrroom.Members)
                {
                    if (usr.ConnectionID != user.ConnectionID)
                    {
                        user.SkipID.Add(usr.ConnectionID);
                    }
                }
                ;
            }

            RandomRoom room = RoomManager.Instance.RemoveRoom(user);

            if (room != null)
            {
                foreach (WaitUser usr in room.Members)
                {
                    await Clients.Group(room.ID).BroadcastMessage($"Người dùng {usr.ConnectionID} đã rời khỏi phòng chat {room.ID}.");

                    await Groups.RemoveFromGroupAsync(usr.ConnectionID, room.ID);

                    // Join possible room after leave old room
                    RandomRoom newroom = RoomManager.Instance.GetRoom(usr.ConnectionID);
                    if (newroom != null)
                    {
                        foreach (WaitUser usr1 in newroom.Members)
                        {
                            await Groups.AddToGroupAsync(usr1.ConnectionID, newroom.ID);

                            await Clients.Group(newroom.ID).BroadcastMessage($"Người dùng {usr1.ConnectionID} đã tham gia phòng chat {newroom.ID}.");
                        }
                    }
                }
            }

            // DEBUG
            Debug();
        }
Ejemplo n.º 4
0
        public async Task LeaveChat(int userID, string username)
        {
            if (RoomManager.Instance.GetRoom(Context.ConnectionId) != null)
            {
                // If user leaves while in a room
                RandomRoom room = RoomManager.Instance.RemoveRoom(new WaitUser
                {
                    ConnectionID = Context.ConnectionId,
                    UserID       = userID,
                    UserName     = username
                });
                if (room != null)
                {
                    foreach (WaitUser usr in room.Members)
                    {
                        await Clients.Group(room.ID).BroadcastMessage($"Người dùng {usr.ConnectionID} đã rời khỏi phòng chat {room.ID}.");

                        await Groups.RemoveFromGroupAsync(usr.ConnectionID, room.ID);

                        // Join possible room after leave old room
                        RandomRoom newroom = RoomManager.Instance.GetRoom(usr.ConnectionID);
                        if (newroom != null)
                        {
                            foreach (WaitUser usr1 in newroom.Members)
                            {
                                await Groups.AddToGroupAsync(usr1.ConnectionID, newroom.ID);

                                await Clients.Group(newroom.ID).BroadcastMessage($"Người dùng {usr1.ConnectionID} đã tham gia phòng chat {newroom.ID}.");
                            }
                        }
                    }
                }
            }
            else
            {
                // If user leaves while in queue
                QueueManager.Instance.Dequeue(Context.ConnectionId);
            }

            // DEBUG
            Debug();
        }
Ejemplo n.º 5
0
    public static GameObject Create(int floorNum, int numEnemies)
    {
        if (prefab == null)
        {
            prefab = Resources.Load("Prefabs/Floor");
        }
        GameObject  go = Instantiate(prefab) as GameObject;
        RandomFloor rf = go.GetComponent <RandomFloor>();

        rf.floorNum = floorNum;
        rf.rooms    = new List <GameObject>();
        for (int i = 0; i < rf.roomCount; i++)
        {
            GameObject room = RandomRoom.Create(go, i, floorNum, rf.roomCount, hasEnemy: true);
            rf.rooms.Add(room);
        }

        go.transform.localPosition = new Vector3(0.0f, rf.GetFloorY, 0.0f);


        return(go);
    }
Ejemplo n.º 6
0
        public async Task AddToQueue(int userID, string username, string filter)
        {
            RandomRoom room = QueueManager.Instance.Enqueue(new WaitUser
            {
                ConnectionID = Context.ConnectionId,
                UserID       = userID,
                UserName     = username,
                Filter       = filter
            });

            if (room != null)
            {
                foreach (WaitUser usr in room.Members)
                {
                    await Groups.AddToGroupAsync(usr.ConnectionID, room.ID);

                    await Clients.Group(room.ID).BroadcastMessage($"Người dùng {usr.ConnectionID} đã tham gia phòng chat {room.ID}.");
                }
            }

            // DEBUG
            Debug();
        }
Ejemplo n.º 7
0
        public async Task AddFriend(string token)
        {
            RandomRoom room = RoomManager.Instance.GetRoom(Context.ConnectionId);

            if (room != null)
            {
                foreach (WaitUser usr in room.Members)
                {
                    if (usr.UserID <= 0)
                    {
                        await Clients.Group(room.ID).BroadcastMessage($"Người dùng {Context.ConnectionId} đề xuất kết bạn thất bại vì ít nhất 1 trong 2 người chưa đăng nhập!");

                        return;
                    }
                    if (usr.ConnectionID == Context.ConnectionId)
                    {
                        usr.FriendRequest = true;
                    }
                }

                await Clients.Group(room.ID).BroadcastMessage($"Người dùng {Context.ConnectionId} đã đề xuất kết bạn!");

                // Call API create chat room
                if (room.Members.Length >= 2 && room.Members[0].FriendRequest && room.Members[1].FriendRequest)
                {
                    IChatRepo chatRepo = new ChatRepo();
                    await chatRepo.CreateChatRoom(
                        room.Members[0].UserID,
                        room.Members[1].UserID,
                        room.Members[0].UserName,
                        room.Members[1].UserName,
                        token);
                }
            }

            Debug();
        }
Ejemplo n.º 8
0
        public RandomRoom RemoveRoom(WaitUser user)
        {
            for (int i = 0; i < RoomList.Count; i++)
            {
                for (int j = 0; j < RoomList[i].Members.Length; j++)
                {
                    if (RoomList[i].Members[j].ConnectionID == user.ConnectionID)
                    {
                        RoomList[i].Members.SetValue(user, j);
                        RandomRoom room = RoomList[i];

                        RoomList.RemoveAt(i);

                        // Enqueue room memebers after removal
                        foreach (WaitUser usr1 in room.Members)
                        {
                            if (user.SkipID.Count > 0)
                            {
                                QueueManager.Instance.Enqueue(usr1);
                            }
                            else
                            {
                                if (usr1.ConnectionID != user.ConnectionID)
                                {
                                    QueueManager.Instance.Enqueue(usr1);
                                }
                            }
                        }

                        // return old room before removal
                        return(room);
                    }
                }
            }
            return(null);
        }
Ejemplo n.º 9
0
 public int sortLG_Rooms(RandomRoom x, RandomRoom y)
 {
     if( x.garbage < y.garbage)
     {
         return -1;
     }//if
     else if(x.garbage > y.garbage)
     {
         return 1;
     }//if
     else
     {
         return 0;
     }//if
 }
Ejemplo n.º 10
0
    public void placeLG_Rooms_rand(int minW, int maxW, int minH, int maxH, int numLG_Rooms)
    {
        int maxHorz = (int)Mathf.Floor(width  / (maxW+6));
        int maxVert = (int)Mathf.Floor(height / (maxH+6));

        int maxNumLG_Rooms = maxHorz * maxVert;
        numLG_Rooms = Mathf.Min(numLG_Rooms, maxNumLG_Rooms);

        System.Collections.Generic.List<RandomRoom> tempLG_RoomList = new System.Collections.Generic.List<RandomRoom>();
        RandomRoom theLG_Room;

        for(int i = 0; i < numLG_Rooms; i++)
        {
            int xx = r.getIntInRange(0, width-maxW);
            int yy = r.getIntInRange(0,height-maxH);
            theLG_Room = new RandomRoom(xx,yy, minW, maxW, minH, maxH, r);
            theLG_Room.garbage = r.getIntInRange(int.MinValue, int.MaxValue);
            tempLG_RoomList.Add(theLG_Room);
            //int widthDiff = maxW - theLG_Room.width;
            //int heightDiff = maxH - theLG_Room.height
        }

        for(int j = 0; j < numLG_Rooms; j++)
        {
            theLG_Room = tempLG_RoomList[j];
            Rect roomRect = new Rect(theLG_Room.x * tileWidth, theLG_Room.y * tileHeight, theLG_Room.width * tileWidth, theLG_Room.height * tileHeight);
            Vector2 center = new Vector2(roomRect.x + Mathf.Floor(roomRect.width/2), roomRect.y + Mathf.Floor(roomRect.height/2));
            roomCenterPoints.Add(center);
            this.addLG_Room(theLG_Room);
            rooms_sorted[center] = theLG_Room;
        }//for

        tempLG_RoomList.Sort(sortLG_Rooms);

        //Using the data in the acutal level, figure out all the room connections
        roomTree = new MinimumSpan(roomCenterPoints);
        roomConnections = roomTree.createMinimumSpan();
    }
Ejemplo n.º 11
0
    //NEED TO REPLACE THIS WITH A SYSTEM THAT DOESN'T MAKE AS MANY OVERLAPPING ROOMS
    public void placeLG_Rooms(int minW, int maxW, int minH, int maxH, int numLG_Rooms)
    {
        int maxLG_RoomsHorz = (int)Mathf.Floor(width/(maxW+3));
        int maxLG_RoomsVert = (int)Mathf.Floor(height/(maxH+3));;

        int maxNumLG_Rooms = maxLG_RoomsHorz * maxLG_RoomsVert;
        numLG_Rooms = Mathf.Min(numLG_Rooms, maxNumLG_Rooms);

        System.Collections.Generic.List<RandomRoom> tempLG_RoomList = new System.Collections.Generic.List<RandomRoom>();
        RandomRoom theRoom;

        //Track all the "buckets" that the "screen" can hold.
        bool[,] screenBuckets = createEmptyScreenBucketsArray(maxLG_RoomsHorz, maxLG_RoomsVert);

        //Loop until you've spawned all the rooms (numLG_Rooms)
        for(var i=0; i<numLG_Rooms; i++)
        {
            //Choose a random bucket
            int x = r.getIntInRange(0, maxLG_RoomsHorz-1);
            int y = r.getIntInRange(0, maxLG_RoomsVert-1);

            int maxTimesLooped = numLG_Rooms+r.getIntInRange(0, 5);
            while(screenBuckets[x,y] == true && maxTimesLooped > 0)
            {
                //If the bucket is false set it to true and add a room within the bucket bounds
                if(x < maxLG_RoomsHorz-1)
                {
                    x++;
                }//if
                else
                {
                    y++;
                    if(y > maxLG_RoomsVert-1)
                    {
                        y=0; //loop back around
                    }//if

                    x=0; //loop back around
                }//else
                maxTimesLooped--;
            }//if

            screenBuckets[x,y] = true;
            theRoom = new RandomRoom(x*(maxW+3)+1,y*(maxH+3)+1, minW, maxW, minH, maxH, r);
            theRoom.garbage = r.getIntInRange(int.MinValue, int.MaxValue);
            tempLG_RoomList.Add(theRoom);
        }
        //tempLG_RoomList.Sort(sortLG_Rooms);

        for(int j = 0; j < numLG_Rooms; j++)
        {
            theRoom = tempLG_RoomList[j];
            Rect roomRect = new Rect(theRoom.x * tileWidth, theRoom.y * tileHeight, theRoom.width * tileWidth, theRoom.height * tileHeight);
            Vector2 center = new Vector2(roomRect.x + Mathf.Floor(roomRect.width/2), roomRect.y + Mathf.Floor(roomRect.height/2));
            roomCenterPoints.Add(center);
            this.addLG_Room(theRoom);
            rooms_sorted[center] = theRoom;
        }//for

        //Using the room placement data, figure out all the room connections
        roomTree = new MinimumSpan(roomCenterPoints);
        roomConnections = roomTree.createMinimumSpan();
    }
Ejemplo n.º 12
0
    public static GameObject Create(GameObject parentFloor, int roomID, int floorNum, int roomCount, bool hasEnemy = false)
    {
        if (prefab == null)
        {
            prefab = Resources.Load("Prefabs/Room");
        }
        GameObject go      = Instantiate(prefab) as GameObject;
        RandomRoom rr      = go.GetComponent <RandomRoom>();
        RoomLUT    roomLUT = go.GetComponent <RoomLUT>();

        rr.floorNum = floorNum;
        rr.roomID   = roomID;
        go.transform.SetParent(parentFloor.transform);
        var   numRoomPieces = rr.roomWidth / rr.roomPieceWidth;
        float offset        = 0.0f;

        if (roomCount % 2 == 0)
        {
            offset = rr.roomWidth / 2;
        }
        float floorWidth = rr.roomWidth * roomCount;
        bool  evenFloor  = floorNum % 2 == 0;

        if (evenFloor)
        {
            go.transform.localPosition = new Vector3(-floorWidth / 2 + roomID * rr.roomWidth + offset, 0, 0);
        }
        else
        {
            go.transform.localPosition = new Vector3(floorWidth / 2 - roomID * rr.roomWidth - offset, 0, 0);
        }

        offset = 0.0f;
        if (numRoomPieces % 2 == 0)
        {
            offset = rr.roomPieceWidth / 2;
        }
        int randomIdx;

        for (int i = 0; i < numRoomPieces; i++)
        {
            GameObject roomPiece = null;
            if (i == 0)
            {
                // instantiate left piece
                if ((!evenFloor && floorNum > 1 && roomID == 0) ||
                    (evenFloor && roomID == roomCount - 1))
                {
                    roomPiece = Instantiate(roomLUT.floorLeftEnd);
                }
                else
                {
                    randomIdx = rnd.Next(roomLUT.leftPieces.Count);
                    roomPiece = Instantiate(roomLUT.leftPieces[randomIdx]);
                }
            }
            else if (i == numRoomPieces - 1)
            {
                // Instantiate right piece
                if ((!evenFloor && roomID == roomCount - 1) ||
                    (evenFloor && roomID == 0))
                {
                    roomPiece = Instantiate(roomLUT.floorRightEnd);
                }
                else
                {
                    randomIdx = rnd.Next(roomLUT.rightPieces.Count);
                    roomPiece = Instantiate(roomLUT.rightPieces[randomIdx]);
                }
            }
            else
            {
                // instantiate center
                if (RandomRoom.IsCamp(roomID, floorNum))
                {
                    if (i == 1)
                    {
                        roomPiece = Instantiate(roomLUT.campPiece1);
                    }
                    else if (i == 2)
                    {
                        roomPiece = Instantiate(roomLUT.campPiece2);
                    }
                }
                else
                {
                    randomIdx = rnd.Next(roomLUT.centerPieces.Count);
                    roomPiece = Instantiate(roomLUT.centerPieces[randomIdx]);
                }
            }
            roomPiece.transform.SetParent(go.transform);
            rr.roomPieces.Add(roomPiece);
            roomPiece.transform.localPosition = new Vector3(rr.roomWidth / 2 - i * rr.roomPieceWidth - offset, 0, 0);

            randomIdx = rnd.Next(roomLUT.floorPieces.Count);
            GameObject floorPiece = Instantiate(roomLUT.floorPieces[randomIdx]);
            floorPiece.transform.SetParent(go.transform);
            rr.floorPieces.Add(floorPiece);
            floorPiece.transform.localPosition = new Vector3(rr.roomWidth / 2 - i * rr.roomPieceWidth - offset, -rr.roomPieceHeight, 0);
        }
        if (roomID == roomCount - 1)
        {
            // Add ladder
            rr.ladder = Instantiate(roomLUT.ladder);
            rr.ladder.transform.SetParent(go.transform);
            if (evenFloor)
            {
                rr.ladder.transform.localPosition = new Vector3(rr.roomWidth / 2 - rr.ladderMargin, -0.1f, -0.5f);
                rr.ladder.transform.Rotate(new Vector3(0, 180, 0));
            }
            else
            {
                rr.ladder.transform.localPosition = new Vector3(-rr.roomWidth / 2 + rr.ladderMargin, -0.1f, -0.5f);
            }
        }
        if (hasEnemy && !RandomRoom.IsCamp(roomID, floorNum))
        {
            randomIdx = rnd.Next(roomLUT.enemies.Count);
            rr.enemy  = Instantiate(roomLUT.enemies[randomIdx]);
            rr.enemy.transform.SetParent(go.transform);
            rr.enemy.transform.localPosition = new Vector3(0, 0.0f, 0);
            if (evenFloor)
            {
                rr.enemy.transform.Rotate(new Vector3(0, -90, 0));
            }
            else
            {
                rr.enemy.transform.Rotate(new Vector3(0, 90, 0));
            }
        }

        return(go);
    }
Ejemplo n.º 13
0
        public RandomRoom Enqueue(WaitUser usr)
        {
            int maxScore = 0;
            WaitUser targetUser = new WaitUser();
            if (usr.Filter != null)
            {
                string[] filterData = usr.Filter.Split(",");
                for (int i = 0; i < UserQueue.Count; i++)
                {
                    // Match conditions with filter
                    if (usr.ConnectionID != UserQueue[i].ConnectionID && !usr.SkipID.Contains(UserQueue[i].ConnectionID)
                        && !UserQueue[i].SkipID.Contains(usr.ConnectionID))
                    {
                        // Filter
                        if (UserQueue[i].Filter != null)
                        {
                            string[] filterDataI = UserQueue[i].Filter.Split(",");
                            int score = Similarity(filterData, filterDataI);
                            if (score > maxScore)
                            {
                                maxScore = score;
                                targetUser = UserQueue[i];
                            }
                        }

                        // RandomRoom room = RoomManager.Instance.CreateRoom(new WaitUser[] {
                        //     usr,
                        //     UserQueue[i]
                        // });
                        // Dequeue(i);
                        // return room;
                    }
                }
            }

            if (maxScore == 0)
            {
                // In case no filter found
                for (int i = 0; i < UserQueue.Count; i++)
                {
                    if (usr.ConnectionID != UserQueue[i].ConnectionID && !usr.SkipID.Contains(UserQueue[i].ConnectionID)
                        && !UserQueue[i].SkipID.Contains(usr.ConnectionID))
                    {
                        RandomRoom room = RoomManager.Instance.CreateRoom(new WaitUser[] {
                            usr,
                            UserQueue[i]
                        });
                        Dequeue(i);
                        return room;
                    }
                }
            }
            else
            {
                // In case match filter found
                RandomRoom room = RoomManager.Instance.CreateRoom(new WaitUser[] {
                    usr,
                    targetUser
                });
                Dequeue(targetUser.ConnectionID);
                return room;
            }
            UserQueue.Add(usr);
            return null;
        }