public void GenerateFloor(int id) { MySceneManager.SceneType scene; DungeonData.RootObject data = DungeonData.GetData(id); if (data.SceneIndex == 0) { scene = MySceneManager.SceneType.Explore; } else { scene = (MySceneManager.SceneType)data.SceneIndex; } StopEnemy(); MySceneManager.Instance.ChangeScene(scene, () => { LoadingUI.Instance.Open(() => { if (scene != MySceneManager.SceneType.Explore) { _mapInfo = GameObject.Find("DungeonFromScene").GetComponent <DungeonFromScene>().GetMapInfo(); InitPosition(); SetFloor(); LoadingUI.Instance.Close(); } else { DungeonBuilder.Instance.Generate(data); } }); }); Debug.Log("Generate Floor Complete"); }
private void GenerateEnemy() { for (int i = 0; i < _fieldEnemyList.Count; i++) { if (_fieldEnemyList[i] != null) { GameObject.Destroy(_fieldEnemyList[i].gameObject); } } _fieldEnemyList.Clear(); FieldEnemy enemy; DungeonData.RootObject data = DungeonData.GetData(_mapInfo.ID); Vector2Int position; Vector2Int playerPosition = Vector2Int.RoundToInt(_player.transform.position); for (int i = 0; i < _mapInfo.RoomPositionList.Count; i++) { for (int j = 0; j < 1; j++) //每個房間生一隻怪 { position = GetLegalPosition(_mapInfo.RoomPositionList[i]); if (Vector2.Distance(position, playerPosition) > 10 && AStarAlgor.Instance.GetPath(position, playerPosition, _pathFindList, true) != null) //如果位置不會離玩家太近 { enemy = ResourceManager.Instance.Spawn("FieldEnemy/FieldEnemyRandom", ResourceManager.Type.Other).GetComponent <FieldEnemy>(); enemy.OnPlayerEnterHandler += EnterBattle; enemy.Init(data.GetRandomBattleGroup(), position); _fieldEnemyList.Add(enemy); if (enemy is FieldEnemyRandom) { ((FieldEnemyRandom)enemy).SetData(_player.transform, _pathFindList); } } } } if (data.GoalBattleGroup != 0) { for (int i = 0; i < _mapInfo.GuardList.Count; i++) { enemy = ResourceManager.Instance.Spawn("FieldEnemy/FieldEnemyGuard", ResourceManager.Type.Other).GetComponent <FieldEnemy>(); enemy.OnPlayerEnterHandler += EnterBattle; ((FieldEnemyGuard)enemy).CheckPositionHandler += EncounterGuard; enemy.Init(data.GoalBattleGroup, _mapInfo.GuardList[i]); _fieldEnemyList.Add(enemy); } } }
public virtual void SetData(RoomData.RootObject roomData, DungeonData.RootObject dungeonData) { RoomData = roomData; DungeonData = dungeonData; Width = Random.Range(roomData.MinWidth, roomData.MaxWidth + 1); Height = Random.Range(roomData.MinHeight, roomData.MaxHeight + 1); _treasureAmount = Random.Range(roomData.MinTreasureAmount, roomData.MaxTreasureAmount + 1); _moneyAmount = Random.Range(roomData.MinMoneyAmount, roomData.MaxMoneyAmount + 1); WallDirectionList.Add(Vector2Int.left); WallDirectionList.Add(Vector2Int.right); WallDirectionList.Add(Vector2Int.up); WallDirectionList.Add(Vector2Int.down); }
public override void SetData(object obj) { if (obj is DungeonGroupData.RootObject) { DungeonGroupData.RootObject data = (DungeonGroupData.RootObject)obj; base.SetData(data); Label.text = data.Name; } else if (obj is DungeonData.RootObject) { DungeonData.RootObject data = (DungeonData.RootObject)obj; base.SetData(data); Label.text = data.FloorName; } }
public MapInfo(MapMemo memo) { ID = memo.ID; Group = memo.Group; DungeonData.RootObject dungeonData = DungeonData.GetData(ID); NextFloor = dungeonData.NextFloor; MapBound = memo.MapBound; Start = memo.Start; Goal = memo.Goal; MapList = Utility.StringToVector2Int(memo.MapList); GrassList = Utility.StringToVector2Int(memo.GrassList); KeyList = Utility.StringToVector2Int(memo.KeyList); DoorList = Utility.StringToVector2Int(memo.DoorList); ExploredList = Utility.StringToVector2Int(memo.ExploredList); ExploredWallList = Utility.StringToVector2Int(memo.ExploredWallList); GuardList = Utility.StringToVector2Int(memo.GuardList); for (int i = 0; i < memo.RoomPositionList.Count; i++) { RoomPositionList.Add(Utility.StringToVector2Int(memo.RoomPositionList[i])); } foreach (KeyValuePair <string, int> item in memo.MoneyDic) { MoneyDic.Add(Utility.StringToVector2Int(item.Key), item.Value); } foreach (KeyValuePair <string, Event.TypeEnum> item in memo.ExploreEventDic) { Event @event = null; if (item.Value == Event.TypeEnum.Recover) { @event = new RecoverEvent1(); } else if (item.Value == Event.TypeEnum.Telepoet) { @event = new TeleportEvent1(); } ExploreEventDic.Add(Utility.StringToVector2Int(item.Key), @event); } foreach (KeyValuePair <string, Treasure> item in memo.TreasureDic) { TreasureDic.Add(Utility.StringToVector2Int(item.Key), item.Value); } }
public override void SetData(RoomData.RootObject roomData, DungeonData.RootObject dungeonData) { RoomData = roomData; DungeonData = dungeonData; Width = Random.Range(roomData.MinWidth, roomData.MaxWidth + 1); if (Width % 2 == 1) { Width += 1; } Height = Random.Range(roomData.MinHeight, roomData.MaxHeight + 1); if (Height % 2 == 1) { Height += 1; } _treasureAmount = Random.Range(roomData.MinTreasureAmount, roomData.MaxTreasureAmount + 1); _moneyAmount = Random.Range(roomData.MinMoneyAmount, roomData.MaxMoneyAmount + 1); WallDirectionList.Add(Vector2Int.left); WallDirectionList.Add(Vector2Int.right); WallDirectionList.Add(Vector2Int.up); WallDirectionList.Add(Vector2Int.down); }
public IEnumerator generate(DungeonData.RootObject data) { int roomId; int random; Room room; Vector2Int position; Vector2Int roomPosition; List <KeyValuePair <Vector2Int, Room> > tempWallDirectionDic = new List <KeyValuePair <Vector2Int, Room> >(); List <Room> roomList = new List <Room>(); List <Room> treasureRoomList = new List <Room>(); _mapList.Clear(); _normalRoomMapList.Clear(); _treasureRoomMapList.Clear(); _wallDirectionDic.Clear(); //First Room roomId = data.RoomList[0]; room = RoomData.GetRoomClassByID(roomId); room.SetData(RoomData.GetData(roomId), data); roomList.Add(room); room.SetPosition(Vector2Int.zero); SetRoom(room); AddWallDirectionList(room); yield return(null); //The other room for (int i = 0; i < data.RoomAmount - 1; i++) { roomId = data.GetRandomRoomID(); room = RoomData.GetRoomClassByID(roomId); room.SetData(RoomData.GetData(roomId), data); if (room is TreasureRoom) { treasureRoomList.Add(room); } else { roomList.Add(room); } tempWallDirectionDic = new List <KeyValuePair <Vector2Int, Room> >(_wallDirectionDic); while (tempWallDirectionDic.Count > 0) { random = Random.Range(0, tempWallDirectionDic.Count); GetRoomPosition(tempWallDirectionDic[random].Key, tempWallDirectionDic[random].Value, room, out roomPosition); tempWallDirectionDic.RemoveAt(random); if (ScanSpace(roomPosition - Vector2Int.one, room.Width + 2, room.Height + 2)) { room.SetPosition(roomPosition); SetRoom(room); AddWallDirectionList(room); _wallDirectionDic.Remove(_wallDirectionDic[i]); break; } } yield return(null); } //取得房間以外的空間 BoundsInt mapBound = Utility.GetMapBounds(_mapList); List <Vector2Int> outsideList = new List <Vector2Int>(); for (int i = mapBound.xMin - 2; i <= mapBound.xMax + 2; i++) { for (int j = mapBound.yMin - 2; j <= mapBound.yMax + 2; j++) { position = new Vector2Int(i, j); if (!_mapList.Contains(position) && !_mapList.Contains(position + Vector2Int.left) && !_mapList.Contains(position + Vector2Int.right) && !_mapList.Contains(position + Vector2Int.up) && !_mapList.Contains(position + Vector2Int.down) && !_mapList.Contains(position + Vector2Int.left + Vector2Int.up) && !_mapList.Contains(position + Vector2Int.left + Vector2Int.down) && !_mapList.Contains(position + Vector2Int.right + Vector2Int.up) && !_mapList.Contains(position + Vector2Int.right + Vector2Int.down)) { outsideList.Add(position); } if (CheckLoadingCount()) { yield return(null); } } } //Cave for (int i = 0; i < 50; i++) { if (CaveGenerator.Instance.GetPosition(_mapList, _treasureRoomMapList, null, out position)) { _mapList.Add(position); } } yield return(null); //Generate path Vector2Int fromDoor; Vector2Int toDoor; List <Vector2Int> tempList = new List <Vector2Int>(); List <Vector2Int> pathList = new List <Vector2Int>(); for (int i = 1; i < roomList.Count; i++) { //GeneratePath(roomList[i - 1], roomList[i]); fromDoor = roomList[i - 1].GetDoor(); toDoor = roomList[i].GetDoor(); tempList = new List <Vector2Int>(outsideList); tempList.Add(fromDoor); tempList.Add(toDoor); if (!GeneratePath(fromDoor, toDoor, tempList)) //如果道路沒有生成功 { i--; } yield return(null); } //Random path List <Room> tempRoomList; for (int i = 0; i < 2; i++) { tempRoomList = new List <Room>(roomList); room = tempRoomList[Random.Range(0, tempRoomList.Count)]; fromDoor = room.GetDoor(); tempRoomList.Remove(room); room = tempRoomList[Random.Range(0, tempRoomList.Count)]; toDoor = room.GetDoor(); tempList = new List <Vector2Int>(outsideList); tempList.Add(fromDoor); tempList.Add(toDoor); if (!GeneratePath(fromDoor, toDoor, tempList)) //如果道路沒有生成功 { i--; } yield return(null); } //Treasure Room path List <Vector2Int> doorList = new List <Vector2Int>(); for (int i = 0; i < treasureRoomList.Count; i++) { //GeneratePath(roomList[i - 1], roomList[i]); fromDoor = treasureRoomList[i].GetDoor(); toDoor = roomList[Random.Range(0, roomList.Count)].GetDoor(); tempList = new List <Vector2Int>(outsideList); tempList.Add(fromDoor); tempList.Add(toDoor); if (!GeneratePath(fromDoor, toDoor, tempList)) //如果道路沒有生成功 { i--; } else { doorList.Add(fromDoor); } yield return(null); } //Grass //裝飾用的地形 List <Vector2Int> grassList = new List <Vector2Int>(); tempList = new List <Vector2Int>(_mapList); for (int i = 0; i < _mapList.Count / 16; i++) //起始草地的數量是土地的1/16 { position = tempList[Random.Range(0, tempList.Count)]; grassList.Add(position); tempList.Remove(position); if (CheckLoadingCount()) { yield return(null); } } int count = 0; for (int i = 0; i < _mapList.Count / 4; i++) //旁生草地的數量是土地的1/4 { if (CaveGenerator.Instance.GetPosition(grassList, null, _mapList, out position)) { grassList.Add(position); count++; if (CheckLoadingCount()) { yield return(null); } } } List <Vector2Int> spaceList = new List <Vector2Int>(_normalRoomMapList); //還沒有擺放物件的空地 //Treasure int monetAmount; //錢的數量是寶箱房以外的寶箱的兩倍 Dictionary <Vector2Int, Treasure> treasureDic = new Dictionary <Vector2Int, Treasure>(); for (int i = 0; i < roomList.Count; i++) { foreach (KeyValuePair <Vector2Int, Treasure> item in roomList[i].TreasureDic) { treasureDic.Add(item.Key, item.Value); spaceList.Remove(item.Key); } } monetAmount = treasureDic.Count * 2; for (int i = 0; i < treasureRoomList.Count; i++) { foreach (KeyValuePair <Vector2Int, Treasure> item in treasureRoomList[i].TreasureDic) { treasureDic.Add(item.Key, item.Value); spaceList.Remove(item.Key); } } //Key List <Vector2Int> keyList = new List <Vector2Int>(); for (int i = 0; i < treasureRoomList.Count; i++) { position = spaceList[Random.Range(0, spaceList.Count)]; keyList.Add(position); spaceList.Remove(position); } //money Dictionary <Vector2Int, int> moneyDic = new Dictionary <Vector2Int, int>(); for (int i = 0; i < roomList.Count; i++) { foreach (KeyValuePair <Vector2Int, int> item in roomList[i].MoneyDic) { moneyDic.Add(item.Key, item.Value); spaceList.Remove(item.Key); } } //explore point Dictionary <Vector2Int, Event> exploreEventDic = new Dictionary <Vector2Int, Event>(); //賽錢箱會有一個 position = spaceList[Random.Range(0, spaceList.Count)]; exploreEventDic.Add(position, new RecoverEvent1()); spaceList.Remove(position); //傳送點有 房間數量/2 個 for (int i = 0; i < data.RoomAmount / 2; i++) { position = spaceList[Random.Range(0, spaceList.Count)]; exploreEventDic.Add(position, new TeleportEvent1()); spaceList.Remove(position); } //起點 Vector2Int start = new Vector2Int(); Room startRoom = roomList[0]; tempList = new List <Vector2Int>(startRoom.PositionList); for (int i = 0; i < tempList.Count; i++) { position = tempList[Random.Range(0, tempList.Count)]; if (spaceList.Contains(position)) //是空地 { start = position; break; } tempList.Remove(position); i--; } grassList.Remove(start); //終點 Vector2Int goal = new Vector2Int(); Room goalRoom = roomList[1]; for (int i = 2; i < roomList.Count; i++) //尋找距離起始房間距離最遠的房間 { if (Vector2Int.Distance(startRoom.Position, goalRoom.Position) < Vector2Int.Distance(startRoom.Position, roomList[i].Position)) { goalRoom = roomList[i]; } } grassList.Remove(goal); tempList = new List <Vector2Int>(goalRoom.PositionList); for (int i = 0; i < tempList.Count; i++) { position = tempList[Random.Range(0, tempList.Count)]; if (spaceList.Contains(position)) //是空地 { goal = position; break; } tempList.Remove(position); i--; } MapInfo mapInfo = new MapInfo(); mapInfo.ID = data.ID; mapInfo.Group = data.Group; mapInfo.NextFloor = data.NextFloor; mapInfo.MapBound = Utility.GetMapBounds(_mapList); mapInfo.Start = start; mapInfo.Goal = goal; mapInfo.MapList = _mapList; mapInfo.GrassList = grassList; mapInfo.KeyList = keyList; mapInfo.MoneyDic = moneyDic; mapInfo.ExploreEventDic = exploreEventDic; mapInfo.TreasureDic = treasureDic; mapInfo.DoorList = doorList; for (int i = 0; i < roomList.Count; i++) { mapInfo.RoomPositionList.Add(roomList[i].PositionList); } ExploreController.Instance.SetMapInfo(mapInfo); DungeonPainter.Instance.Paint(mapInfo); }
public void Generate(DungeonData.RootObject data) { StartCoroutine(generate(data)); }
public void ForceEnterBattle() //事件或測試時使用 { DungeonData.RootObject data = DungeonData.GetData(_mapInfo.ID); EnterBattle(BattleGroupData.GetData(data.GetRandomBattleGroup())); }