Ejemplo n.º 1
0
        private void GenerateWorldLevels()
        {
            int         id    = 0;
            LevelParams param = new LevelParams(MapType.LevelOne);

            param.worldLevel = worldLevel;

            if (GameSession.testMode)
            {
                param.levelType = MapType.PresentationLevel;
                mapTree         = new LevelTree(LevelTree.LEVEL_MAIN, id++, LevelTree.DIFF_MEDIUM, 0, param, "Start level", "Unknown");
            }
            else if (GameSession.arenaMode)
            {
                param.levelType = MapType.Arena;
                mapTree         = new LevelTree(LevelTree.LEVEL_MAIN, id++, LevelTree.DIFF_MEDIUM, 0, param, "Start level", "Unknown");
            }
            else
            {
                if (worldLevel > 0)
                {
                    param.levelType = MapType.GenericMonster;

                    param.shop = new ShopData();
                    param.shop.GenerateRandomShopItems(worldLevel, 2);

                    //param.levelType = MapType.FinalBoss;
                    mapTree = new LevelTree(LevelTree.LEVEL_MAIN, id++, LevelTree.DIFF_MEDIUM, 0, param, "Start level", "This level is filled with random monsters.");
                }
                else
                {
                    param.levelType = MapType.LevelOne;
                    //param.levelType = MapType.Test;
                    mapTree = new LevelTree(LevelTree.LEVEL_MAIN, id++, LevelTree.DIFF_EASY, 0, param, "First Tutorial", "Unknown");
                }
            }


            //mapTree.AddLevelReward(typeof(Heal));
            mapTree.AddLevelReward(typeof(DnaItem), 100, 3, 100);
            mapTree.AddLevelReward(typeof(XpItem), 100, 4, 100);

            mapTree.Unlocked = true;

            int levelsCount   = 15;
            int mainLineCount = 4;
            int minGenericLevelsCount;
            int minSpecialLevelsCount;

            switch (worldLevel)
            {
            case 1:
                levelsCount   = 7;
                mainLineCount = 4;
                break;

            case 2:
                levelsCount   = Random.Range(10, 12);
                mainLineCount = 4;
                break;

            case 3:
                levelsCount   = Random.Range(10, 12);
                mainLineCount = 4;
                break;

            case 4:
                levelsCount   = Random.Range(14, 16);
                mainLineCount = 5;
                break;

            default:
                levelsCount   = 15;
                mainLineCount = 5;
                break;
            }

            int maxSpecialLevelsCount = Mathf.CeilToInt((levelsCount - mainLineCount) / 4);

            if (maxSpecialLevelsCount <= 0)
            {
                maxSpecialLevelsCount = 1;
            }

            // one level is already created
            levelsCount--;
            mainLineCount--;

            int counter = levelsCount;

            if (worldLevel > 0)             // main line for all worlds
            {
                int shopLevel = Random.Range(0, mainLineCount - 1);

                // main line - all medium
                for (int i = 0; i < mainLineCount; i++)
                {
                    LevelTree newNode = null;
                    param            = new LevelParams(MapType.LevelOne);
                    param.worldLevel = worldLevel;

                    // grand boss is the last level
                    if (i + 1 == mainLineCount)
                    {
                        param.levelType  = MapType.FinalBoss;
                        param.mapLevel   = worldLevel;
                        param.worldLevel = worldLevel;
                        newNode          = new LevelTree(LevelTree.LEVEL_MAIN, id++, LevelTree.DIFF_MEDIUM, i + 1, param, "Main" + id, "The final boss.");
                    }
                    else
                    {
                        newNode = CreateRandomMainNodeLevel(id++, i + 1, shopLevel == i, LevelTree.DIFF_MEDIUM);
                    }

                    if (newNode == null)
                    {
                        continue;
                    }

                    mapTree.GetLastMainNode().AddChild(newNode);

                    if (i + 1 == mainLineCount)
                    {
                        newNode.IsLastNode = true;
                    }

                    counter--;
                }
            }
            else             // main line for tutorial world
            {
                // main line - tutorial levels - all easy
                for (int i = 0; i < mainLineCount; i++)
                {
                    LevelTree newNode = null;
                    param            = new LevelParams(MapType.LevelOne);
                    param.worldLevel = worldLevel;

                    switch (i)
                    {
                    case 0:
                        param.levelType = MapType.LevelTwo;
                        newNode         = new LevelTree(LevelTree.LEVEL_MAIN, id++, LevelTree.DIFF_EASY, i + 1, param, "Second Tutorial", "Unknown");
                        break;

                    case 1:
                        param.levelType = MapType.LevelThree;
                        newNode         = new LevelTree(LevelTree.LEVEL_MAIN, id++, LevelTree.DIFF_EASY, i + 1, param, "Third Tutorial", "Unknown");
                        break;

                    case 2:
                        param.levelType = MapType.LevelFour;
                        newNode         = new LevelTree(LevelTree.LEVEL_MAIN, id++, LevelTree.DIFF_EASY, i + 1, param, "Fourth Tutorial", "Unknown");
                        break;

                    case 3:
                        param.levelType = MapType.LevelFive;
                        newNode         = new LevelTree(LevelTree.LEVEL_MAIN, id++, LevelTree.DIFF_EASY, i + 1, param, "Last Tutorial", "Unknown");
                        break;
                    }

                    if (newNode == null)
                    {
                        continue;                                      // shouldnt happen
                    }
                    mapTree.GetLastMainNode().AddChild(newNode);

                    if (i + 1 == mainLineCount)
                    {
                        newNode.IsLastNode = true;
                    }

                    counter--;
                }
            }

            if (worldLevel > 0)
            {
                for (int i = 0; i < counter; i++)
                {
                    LevelTree mainNode = mapTree.GetRandomMainNode();
                    LevelTree nextNode = CreateRandomExtraNodeLevel(id++, mainNode.Depth);
                    mainNode.AddChild(nextNode);
                }

                for (int i = 0; i < maxSpecialLevelsCount; i++)
                {
                    LevelTree mainNode = mapTree.GetRandomSpecialNode();
                    LevelTree nextNode = CreateRandomExtraNodeLevel(id++, mainNode.Depth);
                    mainNode.AddChild(nextNode);
                }
            }

            Debug.Log(mapTree.PrintInfo());
        }