Ejemplo n.º 1
0
    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");
    }
Ejemplo n.º 2
0
    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);
            }
        }
    }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
 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;
     }
 }
Ejemplo n.º 5
0
    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);
        }
    }
Ejemplo n.º 6
0
    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);
    }
Ejemplo n.º 7
0
    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);
    }
Ejemplo n.º 8
0
 public void Generate(DungeonData.RootObject data)
 {
     StartCoroutine(generate(data));
 }
Ejemplo n.º 9
0
 public void ForceEnterBattle() //事件或測試時使用
 {
     DungeonData.RootObject data = DungeonData.GetData(_mapInfo.ID);
     EnterBattle(BattleGroupData.GetData(data.GetRandomBattleGroup()));
 }