Beispiel #1
0
    public void SetRoomActive(int currRoomID, DIRECTION side)
    {
        GameObject currentRoom    = roomList[currRoomID];
        Vector3    currPos        = currentRoom.transform.position;
        RoomScript currRoomScript = currentRoom.GetComponent <RoomScript>();

        int newGridX = currRoomScript.GetGridX() + (side == DIRECTION.LEFT ? -1 : (side == DIRECTION.RIGHT ? 1 : 0));
        int newGridY = currRoomScript.GetGridY() + (side == DIRECTION.DOWN ? -1 : (side == DIRECTION.UP ? 1 : 0));

        roomMap[newGridY][newGridX].SetActive(true);

        Debug.Log("SetRoomActive: " + currRoomID);
        Debug.Log("roomDataList size:" + roomDataList.Count);
        if (roomDataList.Count > 0)
        {
            roomDataList[currRoomID].isActive = true;
        }
        // Send msg to client that a room is active
        //NetworkServer.Spawn(roomMap[newGridY][newGridX]);
        //MessageHandler.Instance.SendSpawnRoom_S2C(currRoomID, side);
    }
Beispiel #2
0
    public void GenerateRoom(int currRoomID, DIRECTION side)
    {
        if (DEBUG_ROOMGEN)
        {
            Debug.Log("Generating Room for " + side + " at " + currRoomID + "  roomListSize: " + roomList.Count);
        }
        GameObject currentRoom    = roomList[currRoomID];
        Vector3    currPos        = currentRoom.transform.position;
        RoomScript currRoomScript = currentRoom.GetComponent <RoomScript>();

        DIRECTION forceTrueDir = this.GetOppositeDir(side);
        int       newGridX     = currRoomScript.GetGridX() + (side == DIRECTION.LEFT ? -1 : (side == DIRECTION.RIGHT ? 1 : 0));
        int       newGridY     = currRoomScript.GetGridY() + (side == DIRECTION.DOWN ? -1 : (side == DIRECTION.UP ? 1 : 0));

        if (roomMap.ContainsKey(newGridY))
        {
            if (roomMap[newGridY].ContainsKey(newGridX))
            {
                return;
            }
        }

        Dictionary <DIRECTION, RANDACTION> boolArray = new Dictionary <DIRECTION, RANDACTION>();//= GetDoorOpenBooleans(forceTrueDir, true);
        int numOfPotentialOpen = 0;

        boolArray[DIRECTION.NONE]  = 0;
        boolArray[DIRECTION.LEFT]  = IsNeighbourHaveUnlockedDoor(newGridX, newGridY, DIRECTION.LEFT);
        boolArray[DIRECTION.RIGHT] = IsNeighbourHaveUnlockedDoor(newGridX, newGridY, DIRECTION.RIGHT);
        boolArray[DIRECTION.UP]    = IsNeighbourHaveUnlockedDoor(newGridX, newGridY, DIRECTION.UP);
        boolArray[DIRECTION.DOWN]  = IsNeighbourHaveUnlockedDoor(newGridX, newGridY, DIRECTION.DOWN);

        List <DIRECTION> dirToOffTrigger = new List <DIRECTION>();
        List <DIRECTION> openDoors       = new List <DIRECTION>();

        //pre calculate the chances to spawn doors
        foreach (KeyValuePair <DIRECTION, RANDACTION> pair in boolArray)
        {
            if (pair.Key == DIRECTION.NONE)
            {
                continue;
            }
            if (pair.Value == RANDACTION.MUSTOPEN)
            {
                //This side of the new room MUST open
                --numOfOpenedDoors;
                //connect the doors
                dirToOffTrigger.Add(pair.Key);
                openDoors.Add(pair.Key);
            }
            else if (pair.Value == RANDACTION.CANCHOOSE)
            {
                //THIS Side of the new room will undergo calculation
                ++numOfPotentialOpen;
            }
            else
            {
                if (DEBUG_ROOMGEN)
                {
                    //lock this door
                    Debug.Log("MustLock activated");
                }
            }
        }

        //calculate the opened door chances based on current situation
        foreach (KeyValuePair <DIRECTION, RANDACTION> pair in boolArray)
        {
            if (pair.Value == RANDACTION.CANCHOOSE)
            {
                bool openDaDoor = UnityEngine.Random.value < (0.5f * Mathf.Log(1 + estTotalRooms - currID, estTotalRooms)
                                                              + (1.0f / Mathf.Max(10.0f * (currID / (float)estTotalRooms), numOfOpenedDoors + numOfPotentialOpen)));
                if (openDaDoor)
                {
                    openDoors.Add(pair.Key);
                    ++numOfOpenedDoors;
                }
            }
        }

        GameObject room;
        float      offsetX = (side == DIRECTION.LEFT ? -scaleX : (side == DIRECTION.RIGHT ? scaleX : 0));
        float      offsetY = (side == DIRECTION.DOWN ? -scaleY : (side == DIRECTION.UP ? scaleY : 0));
        Vector3    tempRoomPos;
        int        randIndex = -1;

        if (!generatedBossRoom)
        {
            //attempt to generate bossroom
            if (numOfOpenedDoors == 0 || 0.25f * ((currID + 1) / estTotalRooms) > UnityEngine.Random.value)
            {
                tempRoomPos       = new Vector3(currPos.x + offsetX, currPos.y + offsetY, zOffset);
                room              = Instantiate(bossRoom, tempRoomPos, Quaternion.identity);
                generatedBossRoom = true;

                //NetworkServer.Spawn(room);
            }
            else
            {
                randIndex   = UnityEngine.Random.Range(0, randomRooms.Count - 1);
                tempRoomPos = new Vector3(currPos.x + offsetX, currPos.y + offsetY, zOffset);
                room        = Instantiate(randomRooms[randIndex], tempRoomPos, Quaternion.identity);

                //here is network spawn the room for sync
                //NetworkServer.Spawn(room);
            }
        }
        else
        {
            tempRoomPos = new Vector3(currPos.x + offsetX, currPos.y + offsetY, zOffset);
            room        = Instantiate(defaultRoom, tempRoomPos, Quaternion.identity);
            //NetworkServer.Spawn(room);
        }
        room.transform.localScale.Set(scaleX, scaleY, 1);
        RoomScript roomScript = room.GetComponent <RoomScript>();

        roomScript.Set(currID, newGridX, newGridY,
                       openDoors.Contains(DIRECTION.LEFT), openDoors.Contains(DIRECTION.RIGHT),
                       openDoors.Contains(DIRECTION.UP), openDoors.Contains(DIRECTION.DOWN));


        //here is network spawn the room for sync

        //foreach (DIRECTION dir in dirToOffTrigger)
        //{
        //    roomScript.OffTriggerBox(dir);
        //    RoomScript neighbourRS = GetNeighbourRoomScript(newGridX, newGridY, dir);
        //    DIRECTION oppoSide = GetOppositeDir(dir);
        //    neighbourRS.OffTriggerBox(oppoSide);
        //}
        //StoreRoom(currID, newGridX, newGridY, room);


        //foreach (DIRECTION dir in dirToOffTrigger)
        //{
        //    roomScript.OffTriggerBox(dir);
        //    RoomScript neighbourRS = GetNeighbourRoomScript(newGridX, newGridY, dir);
        //    DIRECTION oppoSide = GetOppositeDir(dir);
        //    neighbourRS.OffTriggerBox(oppoSide);
        //}

        StoreRoom(currID, newGridX, newGridY, room);
        room.SetActive(false);
        //RoomStruct temp = new RoomStruct();
        //temp.room = room;
        //syncListRooomStruct.Add(temp);
        //NETWORK
        //NetworkServer.Spawn(room);



        PopulateRoomListMessage popRoomMsg = new PopulateRoomListMessage();

        //Debug.Log(currID);
        popRoomMsg.roomID      = room.GetComponent <RoomScript>().GetRoomID();
        popRoomMsg.gridX       = newGridX;
        popRoomMsg.gridY       = newGridY;
        popRoomMsg.roomPos     = tempRoomPos;
        popRoomMsg.roomScale   = room.transform.localScale;
        popRoomMsg.roomType    = randIndex;
        popRoomMsg.isLeft      = room.GetComponent <RoomScript>().GetIsLocked(DIRECTION.LEFT);
        popRoomMsg.isRight     = room.GetComponent <RoomScript>().GetIsLocked(DIRECTION.RIGHT);
        popRoomMsg.isUp        = room.GetComponent <RoomScript>().GetIsLocked(DIRECTION.UP);
        popRoomMsg.isDown      = room.GetComponent <RoomScript>().GetIsLocked(DIRECTION.DOWN);
        popRoomMsg.isActive    = false;
        popRoomMsg.isCompleted = false;
        roomDataList.Add(popRoomMsg);
    }