/**********************************************************************************/
    //  добавляем нового босса на карту
    //
    /**********************************************************************************/
    void AddNewBoss(string bossType)
    {
        // преобразовываем строку к типу юнита
        Base.GO_TYPE bossGOType = (Base.GO_TYPE)Enum.Parse(typeof(Base.GO_TYPE), bossType);

        // создаем экземпляр юнита
        GameObject bossObject = ObjectFactory.GetInstance().CreateGObject(new Vector2(0, 0), Base.DIREC.DOWN, bossGOType);
        // устанавливаем владельца
        CIGameObject gmo = bossObject.GetComponent <CIGameObject>();

        gmo.Owner = (int)PLAYER.NEUTRAL;

        // выбираем рандомную позицию для юнита
        MapGenerator mg = MapGenerator.GetInstance();
        int          xMapSizeInBlocks = mg.MapSizeX / mg.SizeOfBlocks;
        int          yMapSizeInBlocks = mg.MapSizeY / mg.SizeOfBlocks;

        int x = Random.Range(0, xMapSizeInBlocks);
        int y = Random.Range(0, yMapSizeInBlocks);

        // помещаем юнита в блок
        mg.PlaceObjectInBlock(x, y, bossObject);

        // сохраняем объект как цель уровня
        m_npcTarget[gmo.ID] = bossObject;
    }
示例#2
0
    /**********************************************************************************************/
    // устанавливаем новые значения для диалога
    //
    /**********************************************************************************************/
    public void SetDialog(Base.GO_TYPE icoForType, string textKey, string NameKey)
    {
        m_dialogTextCtr.SetNewKey(textKey);

        // определяемся с иконкой
        if (icoForType == Base.GO_TYPE.PLAYER)
        {
            if (GameManager.GetInstance().GetPlayer().playerId == PLAYER.PL1)
            {
                Sprite spriteToSet = Player1Ico;
                DialogIco.sprite = spriteToSet;
                NameKey         += "_1";
            }
            else
            {
                Sprite spriteToSet = Player2Ico;
                DialogIco.sprite = spriteToSet;
                NameKey         += "_2";
            }
        }
        else
        {
            Sprite spriteToSet = m_icoDictionary[icoForType];
            DialogIco.sprite = spriteToSet;
        }

        m_nameTextCtr.SetNewKey(NameKey);

        // активируем диалог, если он был спрятан
        gameObject.SetActive(true);
    }
示例#3
0
 public DropItemDescriptorEditor(DropItemDescriptor desc)
 {
     this.DropType         = Base.StringToGOType(desc.DropType);
     this.DropWeight       = desc.DropWeight;
     this.MaxNumOfDrop     = desc.MaxNumOfDrop;
     this.TimeForDropStart = desc.TimeForDropStart;
 }
    /**********************************************************************************/
    // функция устанавливает
    //
    /**********************************************************************************/
    protected void ShowNextDialogPage()
    {
        string     levelKey = "mission_" + m_levelNumber + m_dialogKey;
        DialogData dialogs  = m_dialogDataCollection[levelKey];

        if (dialogs.pairs.Length > m_dialogPage)
        {
            DialogPair   currentDialogPage = dialogs.pairs[m_dialogPage];
            Base.GO_TYPE goIconType        = (Base.GO_TYPE)Enum.Parse(typeof(Base.GO_TYPE), currentDialogPage.IconType);

            UIController.GetInstance().SetDialog(goIconType, currentDialogPage.textKey, currentDialogPage.NameKey);

            // взводим таймер блокировки
            m_controllerBlockTimer = m_controllerBlockTimerLimit;
            m_dialogPage++;
        }
        else
        {
            Debug.Log("Dialog complited");

            // скрываем диалог и переходим к игре
            m_state = CDM_STATE.READY;
            UIController.GetInstance().HideDialog();
            GameManager.SetPauseState(false, true);
        }
    }
    /**********************************************************************************/
    // функция захвата строения
    // здесь определяется сменит ли здание владельца и устанавливается тип производимых юнитов
    //
    /**********************************************************************************/
    public virtual void Capture(CaptureData cdata)
    {
        if (m_ownerId != cdata.OwnweID)
        {
            m_currentVirusStamina -= cdata.CapturePower;
            if (m_currentVirusStamina <= 0)
            {
                m_ownerId = cdata.OwnweID;
                Debug.Log("Building was captured by pl# " + m_ownerId.ToString());

                m_animator.SetInteger("ownerID", m_ownerId);
                m_animator.SetTrigger("isCuptured");

                if (m_IIFlAnimator != null)
                {
                    m_IIFlAnimator.SetInteger("ownerID", m_ownerId);
                    m_IIFlAnimator.SetTrigger("isCuptured");
                }

                // выбираем юнита для производства
                if (m_ownerId == (int)PLAYER.PL1)
                {
                    m_unitProdactionType = UnitToProduce_Pl1;
                }
                else if (m_ownerId == (int)PLAYER.PL2)
                {
                    m_unitProdactionType = UnitToProduce_Pl2;
                }
                else
                {
                    m_unitProdactionType = UnitToProduce_Neutral;
                }

                // при захвате обновляем счётчик производства, чтобы не воровать чужих юнитов
                m_currentProductionTime = RateOfProduction;

                // выставляем новую сопротивляемость
                if (m_ownerId == (int)PLAYER.NEUTRAL)
                {
                    m_currentVirusStamina = NeutralVirusStamina;
                }
                else
                {
                    m_currentVirusStamina = MaxVirusStamina;
                }

                // увеличиваем счётчик очков за захват
                GameManager.GetInstance().IncreasePlayerScopeBuildingCuptured((PLAYER)m_ownerId, CuptureScope);
                m_virusMarker.SetOwner((PLAYER)m_ownerId);

                m_createdUnitIDs.Clear();

                // помечаем здание как разрушенное - больше оно не будет производить нейтральных юнитов
                m_isDestroyed = true;
            }

            m_virusMarker.SetStamina(m_currentVirusStamina);
        }
    }
示例#6
0
 /**********************************************************************************/
 //  функция возвращает префаб по типу
 //
 /**********************************************************************************/
 public GameObject GetPrefab(Base.GO_TYPE type)
 {
     if (!m_prefabsCollection.ContainsKey(type))
     {
         Debug.LogError("We have no prefabs for " + type.ToString() + " !!!");
         return(null);
     }
     return(m_prefabsCollection[type]);
 }
示例#7
0
    /**********************************************************************************/
    //  выбираем тип бонуса бонус
    //
    /**********************************************************************************/
    private Base.GO_TYPE ChoseDropType()
    {
        int weightOfDropSet = 0;

        // формируем список допустимого дропа
        List <DropItemDescriptorEditor> avalibleDrop = new List <DropItemDescriptorEditor>();

        foreach (var possibleDrop in m_dropDescriptor)
        {
            Base.GO_TYPE type = possibleDrop.DropType;

            // отсекаем тех, с кем мы работать не можем
            // по количеству
            if (m_deploedDrops[type] <= 0)
            {
                continue;
            }

            // по времени
            if (possibleDrop.TimeForDropStart > m_levelTimer)
            {
                continue;
            }

            // подсчитываем суммарынй вес всего дропа
            weightOfDropSet += possibleDrop.DropWeight;
            avalibleDrop.Add(possibleDrop);
        }

        // проверочка
        if (avalibleDrop.Count == 0)
        {
            Debug.LogError("avalibleDrop is empty!");
            return(Base.GO_TYPE.NONE_TYPE);
        }

        // определяем бонус для дропа
        int randomDropIndex = Random.Range(1, weightOfDropSet + 1);

        Base.GO_TYPE bonusType     = Base.GO_TYPE.NONE_TYPE;
        int          growingWeight = 0;
        int          itemIndex     = 0;


        do
        {
            DropItemDescriptorEditor potantialDrop = avalibleDrop[itemIndex];
            bonusType      = potantialDrop.DropType;
            growingWeight += potantialDrop.DropWeight;

            itemIndex++;
        }while (growingWeight < randomDropIndex && itemIndex < avalibleDrop.Count);

        return(bonusType);
    }
示例#8
0
    /**********************************************************************************/
    // функция возврата игровых объектов в кеш
    //
    /**********************************************************************************/
    public void ReturnObjectToCash(GameObject objectInstance, Base.GO_TYPE objectType)
    {
        if (!m_objectColection.ContainsKey(objectType))
        {
            m_objectColection[objectType] = new LinkedList <GameObject>();
        }

        LinkedList <GameObject> cash = m_objectColection[objectType];

        cash.AddLast(objectInstance);
    }
示例#9
0
    /**********************************************************************************/
    // функция создания игровых объектов
    // создаём новый объект
    /**********************************************************************************/
    protected GameObject GetNewGObjectInstance(Vector2 from, Base.DIREC direction, Base.GO_TYPE objectType, bool useOffset)
    {
        GameObject instance      = null;
        GameObject toInstantiate = ObjectLibrary.GetInstance().GetPrefab(objectType);

        if (toInstantiate == null)
        {
            Debug.LogError("ObjectFactory::GetNewGObjectInstance: toInstantiate is null!!!");
            return(null);
        }

        float OffsetSize = offset;

        if (!useOffset)
        {
            OffsetSize = 0;
        }

        Vector2 objectDirection = new Vector2(0f, 0f);

        switch (direction)
        {
        case Base.DIREC.DOWN:
            instance          = Instantiate(toInstantiate, new Vector3(from.x, from.y - OffsetSize, 0f), Quaternion.identity) as GameObject;
            objectDirection.y = -1f;
            break;

        case Base.DIREC.UP:
            instance          = Instantiate(toInstantiate, new Vector3(from.x, from.y + OffsetSize, 0f), Quaternion.identity) as GameObject;
            objectDirection.y = 1f;
            break;

        case Base.DIREC.LEFT:
            instance          = Instantiate(toInstantiate, new Vector3(from.x - OffsetSize, from.y, 0f), Quaternion.identity) as GameObject;
            objectDirection.x = -1f;
            break;

        case Base.DIREC.RIGHT:
            instance          = Instantiate(toInstantiate, new Vector3(from.x + OffsetSize, from.y, 0f), Quaternion.identity) as GameObject;
            objectDirection.x = 1f;
            break;
        }

        // бонусы у нас недвижимые объекты и контроллер у них соответсвенно свой
        if (instance.tag != "Bonus")
        {
            CIGameObject ctr = instance.GetComponent <CIGameObject>();
            ctr.ID = GetUnitID();
            ctr.SetDirection(objectDirection);
        }

        return(instance);
    }
    /**********************************************************************************/
    // функция инициализации здания
    //
    /**********************************************************************************/
    void InitializeBuilding()
    {
        if (!m_isInitialized)
        {
            m_animator = GetComponent <Animator>();
            m_rb2d     = GetComponent <Rigidbody2D>();

            // ставим дефолтного юнита на производство
            m_unitProdactionType = UnitToProduce_Neutral;

            if (m_ownerId == (int)PLAYER.NEUTRAL)
            {
                // устанавливаем ранодное стартовое значение для того, чтобы нейтральные войска выходили не в один момент
                m_currentProductionTime = Random.Range(1.0f, RateOfProductionNeutral);
            }
            else
            {
                m_currentProductionTime = RateOfProduction;
            }

            // получаем контроллер маркеров
            Transform[] allChildren = GetComponentsInChildren <Transform>();
            for (int ind = 0; ind < allChildren.Length; ind++)
            {
                GameObject component = allChildren[ind].gameObject;
                if (component.tag == "VirusStaminaMarker")
                {
                    m_virusMarker = component.GetComponent <BuildingStaminaMarker>();
                    if (m_virusMarker == null)
                    {
                        Debug.LogError("We have a problem with Virus Marker!");
                    }
                }

                // получаем аниматор 2 этажа для контроля
                if (component.tag == "II_Floor")
                {
                    m_IIFlAnimator = component.GetComponent <Animator>();
                }
            }

            CalculateProductionPoint();

            m_currentVirusStamina = NeutralVirusStamina;
            m_virusMarker.SetStamina(m_currentVirusStamina);
            m_virusMarker.SetOwner(PLAYER.NEUTRAL);
            m_isInitialized = true;

            // регистрируем здание в контроллере
            GameObjectMapController.GetInstance().RegistBuilding(this);
        }
    }
示例#11
0
    /**********************************************************************************/
    // функция создания игровых объектов
    // используется, когда надо добавить что-то на игровую сцену
    /**********************************************************************************/
    public GameObject CreateGObject(Vector2 from, Base.DIREC direction, Base.GO_TYPE objectType, bool useOffset = true)
    {
        GameObject instance = null;

        // пробуем получить объект из кеша
        instance = GetGObjectFromCash(from, direction, objectType, useOffset);

        // если в кеше ничего нет, создаём новые объект
        if (instance == null)
        {
            instance = GetNewGObjectInstance(from, direction, objectType, useOffset);
        }

        if (instance == null)
        {
            Debug.Log("CreateGObject:: MAIN ERROR!");
        }

        return(instance);
    }
示例#12
0
    /**********************************************************************************/
    //  дропаем рандомный бонус
    //
    /**********************************************************************************/
    protected void DeployRandomBonus()
    {
        if (m_dropDescriptor.Count == 0)
        {
            Debug.LogError("m_dropDescriptor is empty!");
            return;
        }

        Base.GO_TYPE bonusType = ChoseDropType();

        // определяем место дропа
        // выбираем рандомную позицию и проверяем её на доступность
        int xMapSize = MapGenerator.GetInstance().MapSizeX;
        int yMapSize = MapGenerator.GetInstance().MapSizeY;

        Point positionToDrope = new Point(-1, -1);

        while (!PathFinder.GetInstance().ValidatePathCell(positionToDrope))
        {
            positionToDrope.x = Random.Range(0, xMapSize);
            positionToDrope.y = Random.Range(0, yMapSize);
        }

        // создаём дроп под
        Vector2    positionOutsideTheMap = new Vector2(-100, -100);
        GameObject dropPod = ObjectFactory.GetInstance().CreateGObject(positionOutsideTheMap, Base.DIREC.DOWN, Base.GO_TYPE.DROP_POD, false);
        DropPodCtr podeCtr = dropPod.GetComponent <DropPodCtr>();

        if (podeCtr == null)
        {
            Debug.LogError("podeCtr is null!");
            return;
        }

        // загружаем под полезной нагрузкой и отправляем
        podeCtr.SetDropType(bonusType);
        podeCtr.DropInPosition(positionToDrope);

        m_currentNumberOfDroppedBonus++;
    }
示例#13
0
    /**********************************************************************************/
    // функция проверяет наличие возможного дропа с юнита
    //
    /**********************************************************************************/
    private void CheckUnitDrop()
    {
        // проверяем дроп
        if (Drop != null)
        {
            if (Drop.Length > 0)
            {
                // получаем общий вес набора потенциального лута
                int weightOfSet = 0;
                for (int i = 0; i < Drop.Length; i++)
                {
                    weightOfSet += Drop[i].Weight;
                }

                // выбираем объект для дропа
                int          random     = Random.Range(0, weightOfSet + 1);
                Base.GO_TYPE typeOfDrop = Base.GO_TYPE.NONE_TYPE;
                weightOfSet = 0;
                for (int i = 0; i < Drop.Length; i++)
                {
                    weightOfSet += Drop[i].Weight;
                    typeOfDrop   = Drop[i].Drop;

                    if (weightOfSet >= random)
                    {
                        break;
                    }
                }

                // создаём дроп
                if (typeOfDrop != Base.GO_TYPE.NONE_TYPE)
                {
                    Vector2    dropPosition = GetGlobalPosition().GetUnityPoint() + new Vector2(Base.HALF_OF_CELL, Base.HALF_OF_CELL);
                    GameObject production   = ObjectFactory.GetInstance().CreateGObject(dropPosition, Base.DIREC.DOWN, typeOfDrop, false);
                }
            }
        }
    }
示例#14
0
    /**********************************************************************************/
    //  извещаем менеджер, что бонус был подобран
    //
    /**********************************************************************************/
    public void BonusWasTaked(Base.GO_TYPE bonusType)
    {
        // в отношении бонусов прибывших не с орбиты - ничего не предпринимаем - они не в юрисдикции DropManager
        if (!m_deploedDrops.ContainsKey(bonusType))
        {
            Debug.Log("Bonus ignored: " + bonusType.ToString());
            return;
        }

        m_currentNumberOfDroppedBonus--;

        // увеличиваем счётчик одновременно присутствующих бонусов
        if (m_deploedDrops[bonusType] != (int)DropItemDescriptorEditor.DROP_MARKER.UNLIMITED)
        {
            m_deploedDrops[bonusType]++;
        }

        // корректируем общий счётчик бонусов
        if (m_currentNumberOfDroppedBonus < m_maxNumberOfDroppedBonus)
        {
            m_state = DM_STATE.WAIT_FOR_DEPLAY;
            m_currentTimerToNextDrop = Random.Range(TimeBetweenDropMin, TimeBetweenDropMax);
        }
    }
示例#15
0
    /**********************************************************************************/
    // функция создания игровых объектов
    // пытаемся найти объект в кеше
    /**********************************************************************************/
    protected GameObject GetGObjectFromCash(Vector2 from, Base.DIREC direction, Base.GO_TYPE objectType, bool useOffset)
    {
        GameObject instance        = null;
        Vector2    objectDirection = new Vector2(0f, 0f);
        Vector2    newPosition     = new Vector2(0f, 0f);

        // проверяем кеш объектов
        // если он у нас уже имеется - реиспользуем
        if (m_objectColection.ContainsKey(objectType))
        {
            LinkedList <GameObject> objectPull = m_objectColection[objectType];

            if (objectPull.Count > 0)
            {
                instance = objectPull.First.Value;
                objectPull.RemoveFirst();

                float OffsetSize = offset;
                if (!useOffset)
                {
                    OffsetSize = 0;
                }

                switch (direction)
                {
                case Base.DIREC.DOWN:
                    newPosition       = new Vector2(from.x, from.y - OffsetSize);
                    objectDirection.y = -1f;
                    break;

                case Base.DIREC.UP:
                    newPosition       = new Vector2(from.x, from.y + OffsetSize);
                    objectDirection.y = 1f;
                    break;

                case Base.DIREC.LEFT:
                    newPosition       = new Vector2(from.x - OffsetSize, from.y);
                    objectDirection.x = -1f;
                    break;

                case Base.DIREC.RIGHT:
                    newPosition       = new Vector2(from.x + OffsetSize, from.y);
                    objectDirection.x = 1f;
                    break;
                }
            }
        }
        else
        {
            // если это первое создание объекта - создаем так же для него LinkedList для последующего хранения
            m_objectColection[objectType] = new LinkedList <GameObject>();
        }

        // если нашёлся объект - устанавливаем ему направление
        if (instance != null)
        {
            Transform objTransform = instance.GetComponent <Transform>();
            objTransform.position = new Vector3(newPosition.x, newPosition.y, 0);

            if (instance.tag != "Bonus")
            {
                CIGameObject ctr = instance.GetComponent <CIGameObject>();
                ctr.SetDirection(objectDirection);

                instance.GetComponent <CIGameObject>().ResetGObject();
            }
            else
            {
                BonusCtr ctr = instance.GetComponent <BonusCtr>();
                ctr.ResetBonus();
            }
        }

        return(instance);
    }
示例#16
0
    /**********************************************************************************/
    // функция выбиарет здание(ия) для генерации на карте.
    //
    /**********************************************************************************/
    virtual protected List <GameObject> GetBuildingToInstance(BlockSettings settings)
    {
        /*****************/
        // определяем кол-во зданий, которые необходимо будет выбрать для генерации
        int numOfBuildings = 0;
        int maxGenWeight   = 0;

        foreach (var numVariant in settings.NumOfBuildings)
        {
            maxGenWeight += numVariant.y;
        }

        int randomWeight     = Random.Range(1, maxGenWeight + 1);
        int currentGenWeight = 0;

        for (int i = 0; i < settings.NumOfBuildings.Length; i++)
        {
            numOfBuildings    = settings.NumOfBuildings[i].x;   // количество зданий для генерации
            currentGenWeight += settings.NumOfBuildings[i].y;   // веса для данного варианта кол-ва зданий

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

        /*****************/
        // выбираем здания для генерации
        List <GameObject> toInstantiate = new List <GameObject>();

        // подсчитываем сумму всех весов в списке потенциальных зданий
        maxGenWeight = 0;
        foreach (var building in settings.Buildings)
        {
            maxGenWeight += building.Weight;
        }

        // собираем коллекцию префабов для дальнейшей генерации
        ObjectLibrary objLib = ObjectLibrary.GetInstance();

        for (; numOfBuildings > 0; numOfBuildings--)
        {
            randomWeight = Random.Range(1, maxGenWeight + 1);
            int          currentBuildingWeight = 0;
            Base.GO_TYPE buildingType          = Base.GO_TYPE.NONE_TYPE;


            for (int i = 0; i < settings.Buildings.Length; i++)
            {
                buildingType           = settings.Buildings[i].BuildingType;
                currentBuildingWeight += settings.Buildings[i].Weight;

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

            GameObject prefab = objLib.GetPrefab(buildingType);
            toInstantiate.Add(prefab);
        }

        return(toInstantiate);
    }
示例#17
0
    /**********************************************************************************************/
    // отображаем диалог на экране
    //
    /**********************************************************************************************/
    public void SetDialog(Base.GO_TYPE icoForType, string textKey, string NameKey)
    {
        DialogController ctr = DialogPanel.GetComponent <DialogController>();

        ctr.SetDialog(icoForType, textKey, NameKey);
    }
示例#18
0
 /**********************************************************************************/
 // устанавливаем тип сбрасываемого дропа
 //
 /**********************************************************************************/
 public void SetDropType(Base.GO_TYPE dropType)
 {
     m_dropType = dropType;
 }