/// <summary>
    /// Gets the total quantity for each type of unit.
    /// </summary>
    /// <returns>The total quantity.</returns>
    public int GetUnitTotalQuantity()
    {
        CombatUnitManagerMetaData data = CombatUnitManagerMetaData.Load();

        _unitTypeAndNumber = data.GetAllUnit();

        int retVal = 0;

        foreach (CombatUnitType unitType in _unitTypeAndNumber.Keys)
        {
            retVal += _unitTypeAndNumber[unitType];
        }

        return(retVal);
    }
    /// <summary>
    /// Gets the type of the unit quantity for unit type.
    /// Return 0 if can't find unit type
    /// </summary>
    /// <returns>The unit quantity for type.</returns>
    /// <param name="type">Type.</param>
    public int GetUnitQuantityForType(CombatUnitType type)
    {
        CombatUnitManagerMetaData data = CombatUnitManagerMetaData.Load();

        _unitTypeAndNumber = data.GetAllUnit();

        foreach (CombatUnitType unitType in _unitTypeAndNumber.Keys)
        {
            if (type == unitType)
            {
                return(_unitTypeAndNumber[unitType]);
            }
        }

        return(0);
    }
    /// <summary>
    /// Updates combat unit manager.
    /// </summary>
    void UpdateCombatUnitManager()
    {
        CombatUnitManagerMetaData data = CombatUnitManagerMetaData.Load(true);

        maxCombatUnit      = data.maxCombatUnit;
        currentCombatUnit  = data.CurrentCombatUnit;
        _unitTypeAndNumber = data.GetAllUnit();

        if ((data.producingUnit) && (_task == null))
        {
            _task = ProduceUnitTask.CreateTask(data.producingUnitType, data.producingAmount, OnProducingUnitComplete, OnTimeLeftToComplete, data.producingDuration);

            TaskManager.Instance.AddTask(_task);
        }
        else
        {
            _task = null;
        }
    }
    /// <summary>
    /// Gets the current produced number of combat unit.
    /// Filter true will filt out unit type that current number is 0
    /// </summary>
    /// <returns>The avaliable combat unit number.</returns>
    /// <param name="filter">If set to <c>true</c> filter.</param>
    public Dictionary <CombatUnit, int> GetAvaliableCombatUnitNumber(bool filter = true)
    {
        CombatUnitManagerMetaData data = CombatUnitManagerMetaData.Load(false);

        Dictionary <CombatUnitType, int> dic = data.GetAllUnit(filter);

        Dictionary <CombatUnit, int> retDic = new Dictionary <CombatUnit, int>();

        //keep combat unit defination order
        for (int i = 0; i < combatUnitInfo.Count; i++)
        {
            if (dic.ContainsKey(combatUnitInfo[i].unitType))
            {
                retDic.Add(combatUnitInfo[i], dic[combatUnitInfo[i].unitType]);
            }
        }

        return(retDic);
    }