
Сообщение от
NeserVET
Я сделал несколько изменений
1) Немного подправил алгоритм в CvCity::doYields() после строчки //VET NewCapacity - begin 8/9
2) Сделал новую функцию CvCity::calculateTotalProducedYields() и заменил ею алгоритмы в CvDLLWidgetData.cpp и CvMainInterface.py
Привет, NeseryozniyVET!
Патч, оптимизирующий вывод данных на экран, мне удалось-таки совместить с текущей версией мода. При первой компиляции я получил букет ошибок:
Код:
CvGameCoreDLL\CvCity.cpp(4191): error C2065: 'pHeadSelectedCity' : undeclared identifier
CvGameCoreDLL\CvCity.cpp(4191): error C2227: left of '->calculateActualYieldProduced' must point to class/struct/union type is ''unknown-type''
CvGameCoreDLL\CvCity.cpp(4205): error C2227: left of '->calculateNetYield' must point to class/struct/union type is ''unknown-type''
CvGameCoreDLL\CvCity.cpp(4191): error C2227: left of '->getBaseRawYieldProduced' must point to class/struct/union type is ''unknown-type''
CvGameCoreDLL\CvCity.cpp(4191): error C3861: 'pHeadSelectedCity': identifier not found, even with argument-dependent lookup
CvGameCoreDLL\CvCity.cpp(4205): error C3861: 'pHeadSelectedCity': identifier not found, even with argument-dependent lookup
Однако как следует из первой строки все они имели одну первопричину:
Код:
'pHeadSelectedCity' : undeclared identifier
Я сначала по-дурости попытался выполнить "пожелания" программы-компилятора, а именно ввести и описать новую переменную 'pHeadSelectedCity'. Обычно такой трюк приводил меня в конце концов к успеху. После пары попыток мне действительно удалось это сделать и я смог без ошибок скомпилировать CvGameCoreDLL.dll. Однако вскоре оказалось, это был тупиковый путь. Мод с новой CvGameCoreDLL.dll запускался, но CvMainInterface.py естественно выдавал ошибку, поскольку TotalProducedYields не были правильно рассчитаны (если они вообще хоть как-то рассчитались).
Поэтому мне ничего не оставалось как вернуться к моему старому способу и посмотреть как и где описывается, в частности
или нечто подобное и
Код:
calculateActualYieldProduced((YieldTypes)iI)
или нечто подобное.
Оказалось, что в CvCity.cpp вполне можно обойтись без pHeadSelectedCity->, что я незамедлительно и применил.
В итоге в патч были внесены небольшие изменения и сейчас эти участка кода выглядят так:
Код:
// iUnproducedYield = pHeadSelectedCity->calculateActualYieldProduced((YieldTypes)iI) - pHeadSelectedCity->getBaseRawYieldProduced((YieldTypes)iI); //KJ closed due to error 'pHeadSelectedCity' : undeclared identifier
iUnproducedYield = calculateActualYieldProduced((YieldTypes)iI) - getBaseRawYieldProduced((YieldTypes)iI); //KJ correction
и
Код:
// aiProducedYields[iI] += pHeadSelectedCity->calculateNetYield((YieldTypes)iI); //KJ closed due to error 'pHeadSelectedCity' : undeclared identifier
aiProducedYields[iI] += calculateNetYield((YieldTypes)iI); //KJ correction
В таком виде CvGameCoreDLL.dll компилируется без ошибок, мод запускается без проблем, а на городском экране все отражается правильно. По-видимому, так и должно быть.
Посмотри, пожалуйста, еще разок на этот участок кода:
CvCity.cpp:
Скрытый текст
Код:
//VET NewCapacity - begin 2/9
int CvCity::calculateTotalProducedYields() const
{
int iI, iJ, iNumProfessionInfos, iUnproducedYield, iYieldConsumed, iProducedYield;
int aiProducedYields[NUM_YIELD_TYPES];
bool bBIRTH_POINTS;
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
aiProducedYields[iI] = 0;
}
iNumProfessionInfos = GC.getNumProfessionInfos();
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
// iUnproducedYield = pHeadSelectedCity->calculateActualYieldProduced((YieldTypes)iI) - pHeadSelectedCity->getBaseRawYieldProduced((YieldTypes)iI); //KJ closed due to error 'pHeadSelectedCity' : undeclared identifier
iUnproducedYield = calculateActualYieldProduced((YieldTypes)iI) - getBaseRawYieldProduced((YieldTypes)iI); //KJ correction
if (iUnproducedYield < 0)
{
for (iJ = 0; iJ < iNumProfessionInfos; iJ++)
{
CvProfessionInfo& kProfession = GC.getProfessionInfo((ProfessionTypes)iJ);
if (kProfession.getYieldProduced() == iI)
{
iYieldConsumed = kProfession.getYieldConsumed();
if (iYieldConsumed != NO_YIELD)
{
aiProducedYields[iYieldConsumed] += iUnproducedYield;
}
}
}
}
// aiProducedYields[iI] += pHeadSelectedCity->calculateNetYield((YieldTypes)iI); //KJ closed due to error 'pHeadSelectedCity' : undeclared identifier
aiProducedYields[iI] += calculateNetYield((YieldTypes)iI); //KJ correction
}
bBIRTH_POINTS = (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0);
iProducedYield = 0;
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
if ((bBIRTH_POINTS || (iI != YIELD_FOOD)) && GC.getYieldInfo((YieldTypes)iI).isCargo())
{
iProducedYield += aiProducedYields[iI];
}
}
return iProducedYield;
}
Если такие изменения допустимы, то я выложу версию с патчем. Заранее большое спасибо.