В файле CvEnums.h новые значения надо добавлять в конец списка перед значением обозначающим количество всех значений, название которого начинается на NUM_. В твоем случае WIDGET_HELP_WAREHOUSE надо добавлять после WIDGET_GOTO_CITY перед NUM_WIDGET_TYPES.
Все дело в том что при кампиляции названия энумом заменяются на обычные числа начиная с нуля или того числа которое указано в самом первом энуме, причем число следующего энума на 1 больше предыдущего. Так вот, весь прикол в том что экзешник скомпилирован с теми значениями энумов которые установлены в оригинальном CvEnums.h, если ты добавляешь новый энум в середину списка, то все энумы после него становатся больше на 1. Но они становятся больше только в твоем DLL и питоне, а в экзешнике остаются старыми. В итоге при нажатии кнопки через пион передается число на 1 больше того что предусмотрено в экзешнике. Ну и естественно экзешник питается выполнить алгоритм, который не предусмотрен для выполнения с данными которые передаются при нажатии кнопки.
В подсказку можно добавить прибавление ресурсов
В подсказку TXT_KEY_MISC_WAREHOUSE надо добавить новую строчку отображающую прибавление или убавление ресурсов. Как в подсказке про очки рождаимости.Код:void CvDLLWidgetData::parseWarehouseHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer) { if (GC.getNEW_CAPACITY() != 0) { CvCity* pHeadSelectedCity = gDLL->getInterfaceIFace()->getHeadSelectedCity(); if (pHeadSelectedCity != NULL) { int iI, iJ, iNumProfessionInfos, iUnproducedYield, iYieldConsumed, iProducedYield; int aiProducedYields[NUM_YIELD_TYPES]; bool bBIRTH_POINTS = (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0); iNumProfessionInfos = GC.getNumProfessionInfos(); for (iI = 0; iI < NUM_YIELD_TYPES; iI++) {aiProducedYields[iI] = 0;} for (iI = 0; iI < NUM_YIELD_TYPES; iI++) { iUnproducedYield = pHeadSelectedCity->calculateActualYieldProduced((YieldTypes)iI) - pHeadSelectedCity->getBaseRawYieldProduced((YieldTypes)iI); 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); } iProducedYield = 0; for (iI = 0; iI < NUM_YIELD_TYPES; iI++) { if ((bBIRTH_POINTS || (iI != YIELD_FOOD)) && GC.getYieldInfo((YieldTypes)iI).isCargo()) {iProducedYield += aiProducedYields[iI];} } szBuffer.assign(gDLL->getText("TXT_KEY_MISC_WAREHOUSE", pHeadSelectedCity->getTotalYieldStored(), iProducedYield, pHeadSelectedCity->getMaxYieldCapacity())); } } }


Ответить с цитированием