
Сообщение от
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 единицы, к примеру руды, то колонист добывать ее не мог. У него вообще не было профессии шахтера.
Такая возможность была в оригинальной версии, но при введении исчерпаемых ресурсов исчезла. Поэтому я ищу возможность восстановить утраченное, но при этом не загубить уже прекрасно работающий вариант исчерпаемых ресурсов.