public override void OnInspectorGUI() { ControlledMazeManager manager = (ControlledMazeManager)target; if (window != null) { DrawDefaultInspector(); } else { if (GUILayout.Button("Show Editor")) { window = (ControlledMazeEditor)EditorWindow.GetWindow(typeof(ControlledMazeEditor)); window.Show(); } } EditorUtility.SetDirty(manager); }
public void Start() { manager = (ControlledMazeManager)target; }
void StartControlled() { if (isServer && string.IsNullOrEmpty(mazeSeed)) { string[] types = { "adjectives", "adjectives", "animals" }; mazeSeed = Wordlist.GenerateWordFromList(types); } if (isServer) { nvs.seed = mazeSeed; nvs.mazeID = AnalyticsController.GenerateMazeId(mazeSeed, mazeSize); } ControlledMazeManager controlledManager = GetComponent <ControlledMazeManager>(); mazeRandom = new System.Random(mazeSeed.GetHashCode()); playersList = GameObject.Find("Players"); int startX = int.MinValue; int startY = int.MinValue; for (int y = 0; y < controlledManager.rows.Length; y++) { for (int x = 0; x < controlledManager.rows[y].column.Length; x++) { if (controlledManager.rows[y].column[x] == null) { continue; } if (controlledManager.rows[y].column[x].category == RoomObject.RoomCategory.Start) { startX = x; startY = y; break; } } } if (startX == int.MinValue || startY == int.MinValue) { Debug.LogError("No start room in the list of rooms"); return; } int msX = Mathf.RoundToInt(mazeSize.x), msY = Mathf.RoundToInt(mazeSize.y); float midPointX = ((msX - 1) * ROOM_GAP) / 2f; float midPointY = ((msY - 1) * ROOM_GAP) / 2f; startRoom = new Vector2(startX, startY); GameObject roomParent = Instantiate(parentPrefab, new Vector3(-midPointX, 0f, -midPointY), Quaternion.identity) as GameObject; NetworkInstanceID parentID = roomParent.GetComponent <NetworkInstanceID>(); parentID.objectName = "Room"; NetworkServer.Spawn(roomParent); RoomController[,] allRooms = new RoomController[msX, msY]; for (int x = 0; x < msX; x++) { for (int y = 0; y < msY; y++) { //Generate basic rooms GameObject room = Instantiate(roomPrefab, Vector3.zero, Quaternion.identity) as GameObject; string _name = x * ROOM_GAP + ", " + y * ROOM_GAP; room.name = _name; RoomController rc = room.GetComponent <RoomController>(); rc.mazeSeed = mazeSeed + "" + _name; rc.roomPosition = new Vector2(x, y); rc.roomGap = ROOM_GAP; room.transform.SetParent(roomParent.transform); room.transform.localPosition = new Vector3(x * ROOM_GAP, 0f, y * ROOM_GAP); if (Mathf.RoundToInt(startRoom.x) == x && Mathf.RoundToInt(startRoom.y) == y) { //rc.categories.Add(RoomObject.RoomCategory.Start); rc.isStart = true; //a very dirty cheat to the start room bug where it can get another room on remote clients } //Make it update it's parent and name NetworkInstanceID roomID = room.GetComponent <NetworkInstanceID>(); roomID.parentNetId = roomParent.GetComponent <NetworkIdentity>().netId; roomID.objectName = _name; //Send it to every client NetworkServer.Spawn(room); if (Mathf.RoundToInt(startRoom.x) == x && Mathf.RoundToInt(startRoom.y) == y) { //Spawn the spawnpoint GameObject spawn = Instantiate(spawnPrefab) as GameObject; spawn.transform.SetParent(rc.transform); spawn.transform.localPosition = Vector3.zero + spawnPrefab.transform.position; string n = "Spawn Point"; spawn.name = n; //Make it update it's parent and name NetworkInstanceID spawnID = spawn.GetComponent <NetworkInstanceID>(); spawnID.parentNetId = roomID.netId; spawnID.objectName = n; //Send it to every client NetworkServer.Spawn(spawn); } allRooms[x, y] = rc; } } LocalConnections localhost = GameObject.FindObjectOfType <LocalConnections>(); List <RoomController> open_ends = new List <RoomController>(); open_ends.Add(allRooms[Mathf.RoundToInt(startRoom.x), Mathf.RoundToInt(startRoom.y)]); while (open_ends.Count != 0) { int i = mazeRandom.Next(0, open_ends.Count); RoomController current = open_ends[i]; int roomX = Mathf.RoundToInt(current.roomPosition.x); int roomY = Mathf.RoundToInt(current.roomPosition.y); int doorsInStart = 4; for (int d = 0; d < doorsInStart; d++) { int dir = d; RoomController nextRoom = allRooms[roomX, roomY]; //Will never be this room, it's just to fix a 'unassigned' error. int setDirOnNext = -1; if (dir == 0) //North +1x { if (allRooms.GetLength(0) - 1 >= roomX + 1) { nextRoom = allRooms[roomX + 1, roomY]; setDirOnNext = 1; if (nextRoom.hasBeenScanned) { continue; } if (controlledManager.rows[roomY].column[roomX + 1] == null) { continue; } } else { continue; } } else if (dir == 1) //South -1x { if (0 <= roomX - 1) { nextRoom = allRooms[roomX - 1, roomY]; setDirOnNext = 0; if (nextRoom.hasBeenScanned) { continue; } if (controlledManager.rows[roomY].column[roomX - 1] == null) { continue; } } else { continue; } } else if (dir == 2) //East -1y { if (0 <= roomY - 1) { nextRoom = allRooms[roomX, roomY - 1]; setDirOnNext = 3; if (nextRoom.hasBeenScanned) { continue; } if (controlledManager.rows[roomY - 1].column[roomX] == null) { continue; } } else { continue; } } else if (dir == 3) //West +1y { if (allRooms.GetLength(1) - 1 >= roomY + 1) { nextRoom = allRooms[roomX, roomY + 1]; setDirOnNext = 2; if (nextRoom.hasBeenScanned) { continue; } if (controlledManager.rows[roomY + 1].column[roomX] == null) { continue; } } else { continue; } } setDoorBoolInRoom(dir, true, ref current); nextRoom.cameFrom = setDirOnNext; nextRoom.setRoom = localhost.rooms.IndexOf(controlledManager.rows[Mathf.RoundToInt(nextRoom.roomPosition.y)].column[Mathf.RoundToInt(nextRoom.roomPosition.x)]); setDoorBoolInRoom(setDirOnNext, true, ref nextRoom); nextRoom.hasBeenScanned = true; open_ends.Add(nextRoom); } current.hasBeenScanned = true; open_ends.Remove(current); if (controlledManager.spawnWithAllRoomsOpen || current.roomPosition == new Vector2(Mathf.RoundToInt(startRoom.x), Mathf.RoundToInt(startRoom.y))) { current.displayRoom = true; } } }
void OnGUI() { if (manager == null) { manager = GameObject.FindObjectOfType <ControlledMazeManager>(); } GUILayout.Label("Controlled Maze Controller: " + (manager == null ? "N/A" : "Found (" + manager.getManager().mazeSize.x + "x" + manager.getManager().mazeSize.y + ")"), EditorStyles.boldLabel); //We couldn't find it, so we'll try again next update if (manager == null) { return; } EditorGUILayout.BeginHorizontal(); GUILayout.Label(" W"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("S + N"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); GUILayout.Label(" E"); EditorGUILayout.EndHorizontal(); for (int y = manager.rows.Length - 1; 0 <= y; y--) { EditorGUILayout.BeginHorizontal(); for (int x = 0; x < manager.rows[y].column.Length; x++) { manager.rows[y].column[x] = (RoomObject)EditorGUILayout.ObjectField(manager.rows[y].column[x], typeof(RoomObject)); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Clear Maze")) { int option = EditorUtility.DisplayDialogComplex("Are you sure?", "What do you REALLY want to clear the maze?", "Yes", "No", "Cancel"); switch (option) { // Yes case 0: ClearMaze(); break; // No case 1: break; // Cancel case 2: break; default: Debug.LogError("Unrecognized option."); break; } } EditorGUILayout.EndHorizontal(); EditorUtility.SetDirty(manager); }