Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
Ты не учел вариант когда в месторождении ресурса меньше чем отдача от бонуса и после пополнения ресурса стало больше или равно чем отдача от бонуса
Код:
void CvPlot::doTurn()
{
 
....

// VET AmountResourses - begin 2/24
    BonusTypes eBonus = (BonusTypes)m_eBonusType;
    if (eBonus != NO_BONUS) // если на тайле есть месторождение ресурса
    {
        CvBonusInfo& kBonusInfo = GC.getBonusInfo(eBonus);
        if (kBonusInfo.getMaxAmount() > 0) // если ресурс исчерпаемый
        {
            YieldTypes eYield;
            for (int i = 0; i < NUM_YIELD_TYPES; i++) // перебираем отдачу
            {
                eYield = (YieldTypes)i; // тип отдачи
                if (kBonusInfo.getYieldChange(eYield) > 0) // если ресурс увеличивает отдачу
                {
                    int iOldAmount = m_iAmount; // запас месторождения до изменений
                    int iAmountYields = 0; // расход месторождения за этот ход
//KJ addon Renewable resourses START                    
                    int iAmountYields2 = 0; // увеличение запаса ресурса за этот ход для тайлов внутри городской черты
                    int iAmountYields3 = 0; // увеличение запаса ресурса за этот ход за пределами городской черты
//KJ addon Renewable resourses END

                    if (getPlotCity() != NULL) // если на тайле город
                    {
                        iAmountYields = kBonusInfo.getYieldChange(eYield);
                    }
                    
                    if (CvCity* pWorkingCity = getWorkingCity())        
                    {
                        if ((pWorkingCity != NULL) && (pWorkingCity->getUnitWorkingPlot(this) != NULL)) // если тайл в пределах городских границ и на тайле трудится горожанин
    
//KJ addon Renewable resourses START
                        {
                            if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы                        
                                {
                                iAmountYields = calculateYield(eYield, false, /*OnlyBonus*/true);  // уменьшения запаса ресурса происходит НА ВЕЛИЧИНУ БОНУСА
                                }
                                
                            if ((eYield == YIELD_FUR) || (eYield == YIELD_FOOD))  // Renewable resourses YIELD_FUR and YIELD_FOOD (ONLY BONUS_CRAB and )                
                                {                                
                                iAmountYields = calculateYield(eYield, false) + 1;        // уменьшения запаса ресурса происходит на величину БОНУСА  + БАЗОВАЯ ОТДАЧА с тайла,  + 1 для корректировки
                                }
                        }
//KJ comments START                        
/*                    
                        Если тайл в пределах городских границ, НО на тайле НЕ трудится горожанин.
                        Ввести корректировку (псевдо-коэффициент) для возобновляемых ресурсов
                        Этот псевдо-коэффициент РАВЕН НУЛЮ для исчерпаемых минеральных ресурсов и БОЛЬШЕ НУЛЯ для возобновляемых ресурсов                        
*/
                        else
                        {
                            if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы невосполнимы                    
                                {
                                iAmountYields2 = 0;  //увеличения запаса ресурса НЕ происходит
                                }
                                
                            else
                                {
                                    iAmountYields2 = calculateYield(eYield, false, /*OnlyBonus*/true) * 1 / 2 - 2;        // увеличение запаса ресурса на +1 за счет восстанавления в пределах городской черты                             
                                }
                        }
//KJ addon END    
                    }
                    
//KJ addon START
/*                    
                        Если тайл ЗА ПРЕДЕЛАМИ городских границ.
                        Введена корректировка (псевдо-коэффициент) для возобновляемых ресурсов, равная +2. 
                        Этот псевдо-коэффициент РАВЕН НУЛЮ для исчерпаемых минеральных ресурсов и БОЛЬШЕ НУЛЯ для возобновляемых ресурсов                        
*/
                    if (getPlotCity() == NULL) // если на тайле НЕТ города
                    {                    
                        if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы невосполнимы
                        {
                            iAmountYields3 = 0;
                        }
                        
                        else                                                                            // возобновляемые ресурсы восстанавливаются со скоростью iAmountYields3
                        {
                            iAmountYields3 = 2;        // увеличение запаса ресурса на +2 за счет восстанавления за пределами городской черты
                        }            
                    }
//KJ addon END

//KJ addon START                    
                    if ((iAmountYields > 0) || (iAmountYields2 > 0) || (iAmountYields3 > 0)) // если есть расход ИЛИ приход месторождения

                    {
                    //корректировка запаса ресурса в зависимости от iAmountYields, iAmountYields2 и iAmountYields3     
                    setAmount(m_iAmount - iAmountYields + iAmountYields2 + iAmountYields3); // уменьшаем запас месторождения + увеличиваем за счет восстанавления для животных и растительных ресурсов
//KJ addon END
                    if (m_eBonusType != NO_BONUS) // если месторождение не израсходовано
                        {
                            if ((m_iAmount < iAmountYields) || (iOldAmount < iAmountYields)) // если в месторождении стало или было меньше ресурса, чем полная отдача ресурса
                            {
                                updateYield(true); // пересчитываем отдачу от тайла
                            }
                        }
                    }                    
                }
            }
        }
    }
// VET AmountResourses - end 2/24
И я все-таки рекомендую сделать новый параметр для бонуса естественное пополнение. Во-первых не надо будет помнить порядок ресурсов в XML, а во-вторых - можно для каждого бонуса делать разныое пополнение.
Большое спасибо за уточнение. Я посмотрю, что смогу сделать для восполнимого ресурса.

Правда для начала я попытаюсь понять почему в CIV4UnitInfos.xml не работает этот участок
Код:
   <YieldChanges>
    <YieldChange>
     <YieldType>YIELD_ORE</YieldType>
     <iYieldChange></iYieldChange>
    </YieldChange>
   </YieldChanges>
где iYieldChange есть некая величина МИНУС Х.

Я планирую с одной стороны унифицировать профессию "шахтера", поручив ему одному добывать все минеральные ресурсы, где необходима шахта. А это железная руда, серебро, золото (но не россыпное), и новые ресурсы типа угля, серы, соли и т.д. Все операции должен выполнять один юнит, причем только при условии построения шахты.

С другой стороны требуется исключить возможность добычи минеральных ресурсов остальными юнитами. Раньше это было сделать очень просто, введя в CIV4UnitInfos.xml к примеру условие, где Х = 3:
Код:
   <YieldChanges>
    <YieldChange>
     <YieldType>YIELD_ORE</YieldType>
     <iYieldChange>-3</iYieldChange>
    </YieldChange>
   </YieldChanges>
Если на бонусной клетке было 3 единицы, к примеру руды, то колонист добывать ее не мог. У него вообще не было профессии шахтера.

Такая возможность была в оригинальной версии, но при введении исчерпаемых ресурсов исчезла. Поэтому я ищу возможность восстановить утраченное, но при этом не загубить уже прекрасно работающий вариант исчерпаемых ресурсов.