Beispiel #1
0
        public IEnumerator SugorokuMapCreate(SugorokuMapParameter parameter)
        {
            lastInterruptionTime = System.DateTime.Now;

            this.parameter = parameter;

            sugorokuPoints.Clear();
            masuTypes.Clear();
            pointDataList.Clear();
            extendablePoints.Clear();

            var startPoint = new FieldConnectPoint();

            startPoint.Initialize(allPoints[startIndex].Position, 0);
            startPoint.Index = startIndex;

            extendablePoints.Add(startPoint);
            sugorokuPoints.Add(startPoint);
            masuTypes.Add(0);
            usedList[startIndex] = true;

            int sugorokuSize = Mathf.Min(parameter.sugorokuSize, allPoints.Count);
            int minAisleSize = parameter.minAisleSize;
            int maxAisleSize = parameter.maxAisleSize;
            int count        = 0;

            while (sugorokuPoints.Count < sugorokuSize && count < sugorokuSize)
            {
                int aisleSize = random.Next(minAisleSize, maxAisleSize + 1);
                GenerateAisles(aisleSize);
                ++count;
                if (ShouldInterrupt() != false)
                {
                    yield return(null);

                    lastInterruptionTime = System.DateTime.Now;
                }
            }

            for (int i0 = 0; i0 < sugorokuPoints.Count; ++i0)
            {
                FieldConnectPoint sugorokuPoint = sugorokuPoints[i0];
                var data = new SugorokuPointData();
                data.SetPosition(sugorokuPoint.Position);
                data.SetRoomType(masuTypes[i0]);
                data.SetIndex(sugorokuPoint.Index);
                var indexList = new List <int>();
                for (int i1 = 0; i1 < sugorokuPoint.ConnectionList.Count; ++i1)
                {
                    indexList.Add(sugorokuPoint.ConnectionList[i1].Index);
                }
                data.SetConnectionIndexList(indexList);
                data.SetMassType(0);
                data.SetMassParam(0, 0);
                pointDataList.Add(data);
            }
        }
Beispiel #2
0
        /**
         * すごろくマップの生成
         */
        public IEnumerator SugorokuMapCreate()
        {
            var candidateList = new List <FieldConnectPoint>();
            var initPoint     = new FieldConnectPoint();
            int count         = 0;

            //int index = GetCenterPositionIndex();
            int index = 0;

            startIndex = index;

            sugorokuPointList.Clear();
            sugorokuDataList.Clear();
            // スタート地点
            initPoint.Initialize(pointList[index].Position, 0);
            initPoint.Index      = index;
            pointTypeList[index] = 1;
            sugorokuPointList.Add(initPoint);
            candidateList.Add(initPoint);
            sugorokuDataList.Add(0);

            /* 候補となるポイントが無くなるか一定回数行う */
            while (candidateList.Count > 0)
            {
                PassCreate(pointList, sugorokuPointList, candidateList, pointTypeList, 3);
                ++count;
                if (count > 25)
                {
                    candidateList.Clear();
                }
            }

            sugorokuPointDataList = new List <SugorokuPointData>();
            for (int i0 = 0; i0 < sugorokuPointList.Count; ++i0)
            {
                var data = new SugorokuPointData();
                data.SetPosition(sugorokuPointList[i0].Position);
                data.SetRoomType(sugorokuDataList[i0]);
                data.SetIndex(sugorokuPointList[i0].Index);
                var indexList = new List <int>();
                for (int i1 = 0; i1 < sugorokuPointList[i0].ConnectionList.Count; ++i1)
                {
                    indexList.Add(sugorokuPointList[i0].ConnectionList[i1].Index);
                }
                data.SetConnectionIndexList(indexList);
                data.SetMassType(0);
                data.SetMassParam(0, 0);
                sugorokuPointDataList.Add(data);
            }

            yield break;
        }
Beispiel #3
0
        void GenerateAisles(int aisleSize)
        {
            int index = random.Next(extendablePoints.Count);

            for (int i0 = 0; i0 < aisleSize && sugorokuPoints.Count < parameter.sugorokuSize; ++i0)
            {
                FieldConnectPoint        extendablePoint = extendablePoints[index];
                FieldConnectPoint        point           = allPoints[extendablePoint.Index];
                List <FieldConnectPoint> connectedPoints = point.ConnectionList;
                if (connectedPoints.Count - extendablePoint.ConnectionList.Count > 0)
                {
                    var candidates = new List <FieldConnectPoint>();
                    for (int i1 = 0; i1 < connectedPoints.Count; ++i1)
                    {
                        FieldConnectPoint connectedPoint = connectedPoints[i1];
                        if (usedList[connectedPoint.Index] == false)
                        {
                            candidates.Add(connectedPoint);
                        }
                    }

                    if (candidates.Count > 0)
                    {
                        FieldConnectPoint nextPointSrc = candidates[random.Next(candidates.Count)];
                        var sugorokuPoint = new FieldConnectPoint();
                        sugorokuPoint.Initialize(nextPointSrc.Position, 0);
                        sugorokuPoint.Index = nextPointSrc.Index;
                        ConnectPoints(extendablePoint, sugorokuPoint);
                        AddSugorokuPoint(sugorokuPoint, 0);

                        index = extendablePoints.Count - 1;
                    }
                }
            }

            int roomSize = random.Next(parameter.minRoomSize, parameter.maxRoomSize + 1);

            GenerateRoom(index, roomSize);
        }
Beispiel #4
0
        public void SetSerializedData(SugorokuSerializedData data)
        {
            int i0, i1;

            sugorokuPointDataList = data.GetPointDataList();

            sugorokuPointList.Clear();
            sugorokuDataList.Clear();

            for (i0 = 0; i0 < sugorokuPointDataList.Count; ++i0)
            {
                var point = new FieldConnectPoint();
                point.Initialize(sugorokuPointDataList[i0].GetPosition(), PointType.kGridRoad);
                point.Index = sugorokuPointDataList[i0].GetIndex();
                sugorokuDataList.Add(sugorokuPointDataList[i0].GetRoomType());
                sugorokuPointList.Add(point);
            }
            for (i0 = 0; i0 < sugorokuPointDataList.Count; ++i0)
            {
                var indexList = sugorokuPointDataList[i0].GetConnectionIndexList();
                for (i1 = 0; i1 < indexList.Count; ++i1)
                {
                    sugorokuPointList[i0].SetConnection(sugorokuPointList[indexList[i1]]);
                }
            }

            startIndex = data.GetStartIndex();
            goalIndex  = data.GetGoalIndex();

            if (pointList == null)
            {
                pointList = new List <FieldConnectPoint>();
            }
            pointList.Clear();
            pointList.AddRange(sugorokuPointList);
        }
Beispiel #5
0
        public void SetSerializedData(SugorokuSerializedData data)
        {
            pointDataList = data.GetPointDataList();

            sugorokuPoints.Clear();
            masuTypes.Clear();

            for (int i0 = 0; i0 < pointDataList.Count; ++i0)
            {
                var point = new FieldConnectPoint();
                SugorokuPointData pointData = pointDataList[i0];
                point.Initialize(pointData.GetPosition(), PointType.kGridRoad);
                point.Index = pointData.GetIndex();
                masuTypes.Add(pointData.GetRoomType());
                sugorokuPoints.Add(point);
            }

            for (int i0 = 0; i0 < pointDataList.Count; ++i0)
            {
                var indexList = pointDataList[i0].GetConnectionIndexList();
                for (int i1 = 0; i1 < indexList.Count; ++i1)
                {
                    sugorokuPoints[i0].SetConnection(sugorokuPoints[indexList[i1]]);
                }
            }

            startIndex = data.GetStartIndex();
            goalIndex  = data.GetGoalIndex();

            if (allPoints == null)
            {
                allPoints = new List <FieldConnectPoint>();
            }
            allPoints.Clear();
            allPoints.AddRange(sugorokuPoints);
        }
Beispiel #6
0
        /**
         * 部屋を拡張する
         *
         * @param list			マスとして使用可能なポイントのリスト
         * @param save_list		すごろくマスとして新たに生成したポイントのリスト
         * @param enable_list	伸ばす余地のあるすごろくマスのリスト
         * @param room_list		同じ部屋のすごろくマスのリスト
         * @param use_type_list	マスの使用状況
         */
        void ExtendRoom(List <FieldConnectPoint> list, List <FieldConnectPoint> save_list, List <FieldConnectPoint> enable_list,
                        List <FieldConnectPoint> room_list, List <int> use_type_list)
        {
            var idx_list = new List <int>();                    // 拡張候補のマスのインデックス
            var room_idx_list = new List <int>();               // 拡張候補のマスがどの部屋からなのかのインデックス
            var extend_idx_list = new List <int>();             // さらに拡張する際の候補となるidx_listのインデックス
            FieldConnectPoint tmp_point, tmp_point2, tmp_point3;
            int i0, i1, idx, tmp_idx, rand;

            for (i0 = 0; i0 < room_list.Count; ++i0)
            {
                idx       = room_list[i0].Index;
                tmp_point = list[idx];
                for (i1 = 0; i1 < tmp_point.ConnectionList.Count; ++i1)
                {
                    tmp_idx = tmp_point.ConnectionList[i1].Index;
                    if (use_type_list[tmp_idx] == 0)
                    {
                        room_idx_list.Add(i0);
                        idx_list.Add(tmp_idx);
                    }
                }
            }

            /* 拡張できるマスが無いので終了 */
            if (room_idx_list.Count <= 0)
            {
                return;
            }

            /* すごろくマスの生成 */
            rand       = randomSystem.Next(0, room_idx_list.Count);
            idx        = idx_list[rand];
            tmp_point2 = room_list[room_idx_list[rand]];
            tmp_point  = new FieldConnectPoint();
            tmp_point.Initialize(list[idx].Position, 0);
            tmp_point.Index = list[idx].Index;
            tmp_point.SetConnection(tmp_point2);
            tmp_point2.SetConnection(tmp_point);
            enable_list.Add(tmp_point);
            room_list.Add(tmp_point);
            save_list.Add(tmp_point);
            sugorokuDataList.Add(1);
            use_type_list[tmp_point.Index] = 1;

            /* 伸ばしたマスからさらに伸ばした時に、部屋と繋がるマスがあるかどうか調べる */
            for (i0 = 0; i0 < list[idx].ConnectionList.Count; ++i0)
            {
                tmp_idx = list[idx].ConnectionList[i0].Index;
                for (i1 = 0; i1 < idx_list.Count; ++i1)
                {
                    if (idx_list[i1] == tmp_idx)
                    {
                        extend_idx_list.Add(i1);
                    }
                }
            }

            /* さらに拡張できるマスが無いので終了 */
            if (extend_idx_list.Count <= 0)
            {
                return;
            }
            rand       = randomSystem.Next(0, extend_idx_list.Count);
            tmp_idx    = extend_idx_list[rand];
            idx        = idx_list[tmp_idx];
            tmp_point3 = room_list[room_idx_list[tmp_idx]];
            tmp_point2 = new FieldConnectPoint();
            tmp_point2.Initialize(list[idx].Position, 0);
            tmp_point2.Index = list[idx].Index;
            tmp_point3.SetConnection(tmp_point2);
            tmp_point2.SetConnection(tmp_point3);
            tmp_point.SetConnection(tmp_point2);
            tmp_point2.SetConnection(tmp_point);
            enable_list.Add(tmp_point2);
            room_list.Add(tmp_point2);
            save_list.Add(tmp_point2);
            sugorokuDataList.Add(1);
            use_type_list[tmp_point2.Index] = 1;
        }
Beispiel #7
0
        /**
         * 候補のリストから通路と部屋を作る処理
         *
         * @param list			マスとして使用可能なポイントのリスト
         * @param save_list		すごろくマスとして新たに生成したポイントのリスト
         * @param enable_list	伸ばす余地のあるすごろくマスのリスト
         * @param use_type_list	マスの使用状況
         * @param pass_num		通路の数。0の場合は通路作成後に部屋の生成を行う。
         * @param use_enable_index	通路を伸ばすすごろくマスの指定。-1の場合はランダムなすごろくマスを使う。
         */
        void PassCreate(List <FieldConnectPoint> list, List <FieldConnectPoint> save_list, List <FieldConnectPoint> enable_list, List <int> use_type_list,
                        int pass_num = 1, int use_enable_index = -1)
        {
            int i0, index, randomIndex, count, tmp_i;
            FieldConnectPoint tmp_point, tmp_point2;
            var  tmp_list = new List <int>();
            bool flg      = false;

            if (use_enable_index < 0)
            {
                randomIndex = randomSystem.Next(0, enable_list.Count);
            }
            else
            {
                randomIndex = use_enable_index;
            }
            index     = enable_list[randomIndex].Index;
            tmp_point = list[index];
            index     = randomIndex;

            /*! 残りの接続数がいくつか調べる */
            count = tmp_point.ConnectionList.Count - enable_list[index].ConnectionList.Count;
            if (count > 0)
            {
                tmp_list.Clear();
                for (i0 = 0; i0 < tmp_point.ConnectionList.Count; ++i0)
                {
                    tmp_i = tmp_point.ConnectionList[i0].Index;
                    if (use_type_list[tmp_i] == 0)
                    {
                        tmp_list.Add(i0);
                    }
                }

                if (tmp_list.Count > 0)
                {
                    /*! 通路として繋ぐ */
                    randomIndex = randomSystem.Next(0, tmp_list.Count);
                    randomIndex = tmp_list[randomIndex];
                    tmp_point2  = new FieldConnectPoint();
                    tmp_point2.Initialize(tmp_point.ConnectionList[randomIndex].Position, 0);
                    tmp_point2.Index = tmp_point.ConnectionList[randomIndex].Index;
                    use_type_list[tmp_point2.Index] = 1;
                    tmp_point2.SetConnection(enable_list[index]);
                    enable_list[index].SetConnection(tmp_point2);
                    enable_list.Add(tmp_point2);
                    save_list.Add(tmp_point2);
                    sugorokuDataList.Add(0);

                    --pass_num;
                    if (pass_num <= 0)
                    {
                        /*! 四角の部屋を作る */
                        SquareRoomCreate(list, save_list, enable_list, use_type_list, save_list.Count - 1, 1);
                    }
                    else
                    {
                        /*! 通路を伸ばす */
                        PassCreate(list, save_list, enable_list, use_type_list, pass_num, enable_list.Count - 1);
                    }

                    flg = true;
                }
            }

            if (flg == false)
            {
                enable_list.RemoveAt(index);
            }
        }
Beispiel #8
0
        void GenerateRoom(int basePointIndex, int roomSize = 3)
        {
            var  roomPoints = new List <FieldConnectPoint>();
            bool extendable = false;

            if (sugorokuPoints.Count <= parameter.sugorokuSize - 2)
            {
                FieldConnectPoint basePoint = extendablePoints[basePointIndex];
                roomPoints.Add(basePoint);
                FieldConnectPoint        basePointSrc    = allPoints[basePoint.Index];
                List <FieldConnectPoint> connectedPoints = basePointSrc.ConnectionList;
                var candidates = new List <FieldConnectPoint>();
                for (int i0 = 0; i0 < connectedPoints.Count; ++i0)
                {
                    FieldConnectPoint connectedPoint = connectedPoints[i0];
                    if (usedList[connectedPoint.Index] == false)
                    {
                        candidates.Add(connectedPoint);
                    }
                }

                while (candidates.Count > 0)
                {
                    int randomIndex = random.Next(candidates.Count);
                    FieldConnectPoint nextPointSrc = candidates[randomIndex];

                    if (TryGetCommonPoint(basePointSrc, nextPointSrc, out FieldConnectPoint commonPoint) != false)
                    {
                        var sugorokuPoint = new FieldConnectPoint();
                        sugorokuPoint.Initialize(nextPointSrc.Position, 0);
                        sugorokuPoint.Index = nextPointSrc.Index;
                        ConnectPoints(basePoint, sugorokuPoint);
                        AddSugorokuPoint(sugorokuPoint, 1);
                        roomPoints.Add(sugorokuPoint);

                        var sugorokuPoint2 = new FieldConnectPoint();
                        sugorokuPoint2.Initialize(commonPoint.Position, 0);
                        sugorokuPoint2.Index = commonPoint.Index;
                        ConnectPoints(basePoint, sugorokuPoint2);
                        AddSugorokuPoint(sugorokuPoint2, 1);
                        roomPoints.Add(sugorokuPoint2);

                        ConnectPoints(sugorokuPoint, sugorokuPoint2);

                        int baseSugorokPointIndex = sugorokuPoints.FindIndex(point => point.Index == basePoint.Index);
                        masuTypes[baseSugorokPointIndex] = 1;

                        extendable = true;
                        break;
                    }
                    else
                    {
                        candidates.RemoveAt(randomIndex);
                    }
                }
            }

            while (roomPoints.Count < roomSize && extendable != false && sugorokuPoints.Count < parameter.sugorokuSize)
            {
                bool foundNewRoomPoint = false;
                for (int i0 = 0; i0 < roomPoints.Count; ++i0)
                {
                    FieldConnectPoint roomPoint1 = roomPoints[i0];
                    FieldConnectPoint point1     = allPoints[roomPoint1.Index];
                    for (int i1 = 0; i1 < roomPoints.Count; ++i1)
                    {
                        if (i1 != i0)
                        {
                            FieldConnectPoint roomPoint2 = roomPoints[i1];
                            FieldConnectPoint point2     = allPoints[roomPoint2.Index];
                            if (TryGetCommonPoint(point1, point2, out FieldConnectPoint commonPoint) != false)
                            {
                                var sugorokuPoint = new FieldConnectPoint();
                                sugorokuPoint.Initialize(commonPoint.Position, 0);
                                sugorokuPoint.Index = commonPoint.Index;
                                ConnectPoints(roomPoint1, sugorokuPoint);
                                ConnectPoints(roomPoint2, sugorokuPoint);
                                AddSugorokuPoint(sugorokuPoint, 1);
                                roomPoints.Add(sugorokuPoint);

                                foundNewRoomPoint = true;
                                break;
                            }
                        }
                    }

                    if (foundNewRoomPoint != false)
                    {
                        break;
                    }
                }

                extendable = foundNewRoomPoint;
            }
        }