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); }
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); }