Beispiel #1
0
    /**********************************************************************************/
    // функция извещающая CompanyManager о загрузке новой карты в компании
    //
    /**********************************************************************************/
    public void OnSceneLoaded()
    {
        MissionDescriptor missionSettings = m_companyMissionData.missions[m_levelNumber];

        MapGenerator.MapGeneratorSettings set = new MapGenerator.MapGeneratorSettings();
        set.MapXSize = missionSettings.MapXSize;
        set.MapYSize = missionSettings.MapYSize;

        // разбираем все доступные для данной миссии здания и устанавливаем их в сет
        for (int i = 0; i < missionSettings.Buildings.Length; i++)
        {
            AvailableBuilding building  = missionSettings.Buildings[i];
            Base.BLOCK_TYPE   blockType = Base.StringToBlockType(building.BuildingType);

            MapGenerator.BlockWeight bw = new MapGenerator.BlockWeight();
            bw.BlockType = blockType;
            bw.Weight    = building.Weight;

            set.AvalibleBlocks.Add(bw);
        }

        // генерируем карту для уровня в соответствии с настройками
        MapGenerator.GetInstance().GenerateMap(set);

        // устанавливаем параметры дропа
        List <DropItemDescriptor> dropList = new List <DropItemDescriptor>(missionSettings.DropDescriptor.DropItems);

        DropManager.GetInstance().SetLevel(dropList, missionSettings.DropDescriptor.MaxNumOfDroppedItem);

        /*
         * DropManager.GetInstance().TimeBetweenDropMin = 8;
         * DropManager.GetInstance().TimeBetweenDropMin = 16;
         */

        // приостанавливаем игру до момента начала раунда
        GameManager.SetPauseState(true, true);

        // ожидаем начала раунда
        m_state        = DM_STATE.WAIT_FOR_ROUND_START;
        m_currectTimer = PauseBeforeRound;

        // обновляем счётчик побед
        UIController.GetInstance().SetGameScore(m_pl1WinnNum, m_pl2WinnNum);
    }
Beispiel #2
0
    /**********************************************************************************/
    // возвращаем настройки для указанного типа блока
    //
    /**********************************************************************************/
    public BlockSettings GetBlockSettings(Base.BLOCK_TYPE type)
    {
        if (BlockSettings.Length == 0)
        {
            Debug.LogError("BlockSettings is empty!");
            return(null);
        }

        // хешируем таблицу, если ещё этого не сделали
        if (m_hash.Count == 0)
        {
            for (int i = 0; i < BlockSettings.Length; i++)
            {
                m_hash[BlockSettings[i].Type] = BlockSettings[i].Settings;
            }
        }

        return(m_hash[type]);
    }
Beispiel #3
0
    /**********************************************************************************/
    // функция выбиарет тип блока для размещения на карте
    //
    /**********************************************************************************/
    virtual protected Base.BLOCK_TYPE GetBlockTypeToGenerate()
    {
        int randomWeight       = Random.Range(1, m_maxBlockGenerationWeight + 1);
        int currentBlockWeight = 0;

        Base.BLOCK_TYPE blockToInstantiate = Base.BLOCK_TYPE.NO_TYPE;

        for (int i = 0; i < m_availableBlocks.Count; i++)
        {
            blockToInstantiate  = m_availableBlocks[i].BlockType;
            currentBlockWeight += m_availableBlocks[i].Weight;

            // если достигли или перешагнули значение случайного веса - выходим из цикла и используем последнее выбранное здание
            if (currentBlockWeight >= randomWeight)
            {
                break;
            }
        }

        return(blockToInstantiate);
    }
    /**********************************************************************************/
    // функция извещающая CompanyManager о загрузке новой карты в компании
    //
    /**********************************************************************************/
    public void OnSceneLoaded()
    {
        // переключаем состояние миссии в "запущено"
        m_missionState = MISSION_STATE.RUNNED;

        // при загрузке новой сцены запускаем генерацию карты
        MissionDescriptor missionSettings = m_companyMissionData.missions[m_levelNumber];

        MapGenerator.MapGeneratorSettings set = new MapGenerator.MapGeneratorSettings();
        set.MapXSize = missionSettings.MapXSize;
        set.MapYSize = missionSettings.MapYSize;

        // разбираем все доступные для данной миссии здания и устанавливаем их в сет
        for (int i = 0; i < missionSettings.Buildings.Length; i++)
        {
            AvailableBuilding building  = missionSettings.Buildings[i];
            Base.BLOCK_TYPE   blockType = Base.StringToBlockType(building.BuildingType);

            MapGenerator.BlockWeight bw = new MapGenerator.BlockWeight();
            bw.BlockType = blockType;
            bw.Weight    = building.Weight;

            set.AvalibleBlocks.Add(bw);
        }

        // генерируем карту для уровня в соответствии с настройками
        MapGenerator.GetInstance().GenerateMap(set);

        // добавляем новые цели для уровня
        TargetController.GetInstance().SetNewCompanyMission(missionSettings.MissionDifficulties, new List <string>(missionSettings.MissionBosses));

        CompanyDialogManager.GetInstance().OnMissionLoaded(m_levelNumber);


        List <DropItemDescriptor> dropList = new List <DropItemDescriptor>(missionSettings.DropDescriptor.DropItems);

        DropManager.GetInstance().SetLevel(dropList, missionSettings.DropDescriptor.MaxNumOfDroppedItem);
    }
Beispiel #5
0
    /**********************************************************************************/
    // функция генерирует внутренности блока
    //
    // порядок генерации объектов:
    // - Здания
    // - Дороги
    // - Генерируемое окружение
    /**********************************************************************************/
    void GenerateBlockContent(GameObject block, BlockDescriptor descriptor, int x, int y)
    {
        // определяемся с ограничениями на соединение дорог
        RoadManager.GetInstance().SetRoadRulesToBlock(descriptor, x, y);


        // обновляем карту занятых и свободных клеток
        descriptor.UpdateFreeSpaceMap(SizeOfBlocks);


        // определяем тип блока для генерации
        Base.BLOCK_TYPE blockToGenerate = GetBlockTypeToGenerate();

        // олучаем настройки для данного блока из библиотеки блоков
        BlockSettings settingsForGeneration = BlockLibrary.GetInstance().GetBlockSettings(blockToGenerate);

        // устанавливаем здания
        // для это выбираем его(их) из имеющейся коллекции
        List <GameObject> toInstantiateCollection = GetBuildingToInstance(settingsForGeneration);

        foreach (GameObject toInstantiate in toInstantiateCollection)
        {
            // получаем контроллер у объекта шаблона, он нам потребуется для определения размеров здания
            BuildingController bcOfPattern = toInstantiate.GetComponent <BuildingController>();

            // пробуем установить здание в блок
            bool success  = false;
            int  attempts = 10;
            while (!success && attempts > 0)
            {
                int xBuildingSize = bcOfPattern.XBuildingSize;
                int yBuildingSize = bcOfPattern.YBuildingSize;


                int xCorToPlace = Random.Range(0, (descriptor.xSize * SizeOfBlocks) - xBuildingSize + 1);
                int yCorToPlace = Random.Range(0, (descriptor.ySize * SizeOfBlocks) - yBuildingSize + 1);

                bool isPossible = true;

                // проверяем тушку здания
                for (int xCorToCheck = xCorToPlace; xCorToCheck < xCorToPlace + xBuildingSize; xCorToCheck++)
                {
                    for (int yCorToCheck = yCorToPlace; yCorToCheck < yCorToPlace + yBuildingSize; yCorToCheck++)
                    {
                        if (descriptor.FreeSpaceMap[xCorToCheck, yCorToCheck] != true)
                        {
                            isPossible = false;
                        }
                    }
                }

                // проверяем точку выхода из здания
                if (isPossible)
                {
                    Point roadPoint = new Point(xCorToPlace, yCorToPlace) + bcOfPattern.RoadPoint;
                    if (roadPoint.x < 0 || roadPoint.y < 0 || roadPoint.x >= SizeOfBlocks || roadPoint.y >= SizeOfBlocks)
                    {
                        isPossible = false;
                    }
                    else
                    {
                        if (descriptor.FreeSpaceMap[roadPoint.x, roadPoint.y] != true)
                        {
                            isPossible = false;
                        }
                    }
                }

                // если получилось подобрать координаты, устанавливаем новое здание в позицию и выходим из цикла
                if (isPossible)
                {
                    // правильные координаты будут выставлены несколькими шагами дальше через localPosition
                    GameObject instance = Instantiate(toInstantiate, new Vector3(0.0f, 0.0f, 0.0f), Quaternion.identity) as GameObject;

                    // устанавливаем в родителя
                    instance.transform.SetParent(block.transform);
                    instance.transform.localPosition = new Vector3((float)(xCorToPlace + xBuildingSize / 2) * SizeOfCell,
                                                                   (float)(yCorToPlace + yBuildingSize / 2) * SizeOfCell, 0.0f);

                    // сохраняем ссылку на все сгенерированные здания
                    descriptor.Buildings.Add(instance);

                    // обновляем карту свободных клеток в блоке
                    descriptor.UpdateFreeSpaceMap(SizeOfBlocks);

                    success = true;
                }

                // уменьшаем оставшееся кол-во попыток
                attempts--;
            }
        }


        // достраиваем дороги
        RoadManager.GetInstance().BuildRoadInBlock(descriptor, x, y, SizeOfBlocks);

        // генерируем прочие декоротивные и не только объекты
        GenerateBlockEnviroment(block, descriptor, settingsForGeneration, SizeOfBlocks);
    }