
Сообщение от
NeseryozniyVET
Будем искать ошибку так
Добавь новые строчки (отмечени красным) в алгоритм поиска самого дешевого ресурса
Код:
if (GC.getYieldInfo((YieldTypes)iYield).isCargo())
{
iYieldStored = getYieldStored((YieldTypes)iYield);
CvWString szBuffer = CvWString::format(L"/t%c, Stored%d, Price%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iLossYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_BLUE"), getX_INLINE(), getY_INLINE(), true, true);
//VET BirthPoints - begin 11/16
/*if ((iYieldStored > 0) && (aiPrices[iYield] < iMinPrice))
{
iLossYieldStored = iYieldStored;*/
if ((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))//iYieldStored отрицательным быть не может
{
CvWString szBuffer = CvWString::format(L"/t/t%c, Stored%d, PriceNew%d, PriceOld%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield], iLossYield == -1 ? -1 : aiPrices[iLossYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iLossYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), getX_INLINE(), getY_INLINE(), true, true);
iLossYieldStored = iYieldStored;
if (iYield == YIELD_FOOD)//это возможно только когда (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0)
{iLossYieldStored -= iMinFood;}
//VET BirthPoints - end 11/16
iMinPrice = aiPrices[iYield];
iLossYield = iYield;
}
}
доведи склад до переполнения и смотри на сообщения
Синее сообщение - проверяемый ресурс, его количество на складе и цена продажи (проверить эти значения с значениями в городском экране)
Зеленое сообщение - прошедший проверку ресурс. Ресурс цена которого ниже цены ресурса в прошлом (нижнем) зеленом сообщении. В сообщении будет цена нового и старого ресурса для сравнения.
Проанализируй сообщения и определи какой ресурс и по каким причинам не прошол правильную проверку
Итак, начинаем искать. Вот отчет о том, что получилось и что я увидел на экране.
Твой вариант с новыми строчками я скомпилировал без проблем. Более того можно даже запустить игру без каких-либо сообщений об ошибке. Но, в конце самого первого хода при нажатии кнопки окончания хода происходит сбой и выброс на основной экран виндовса.
К счастью, я проводил тестирование на том же компе, где и компилировал CvGameCoreDLL.dll, поэтому нажав на экране об ошибке на кнопку "Debug", я сразу же увидел строку, из-за которой происходил сбой.
Код:
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iLossYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_BLUE"), getX_INLINE(), getY_INLINE(), true, true);
Далее уже моя "самодеятельность". Я посмотрел как пишутся такого рода строки в исходных файлах и что им предшествует. После этого я внес небольшое изменение. Вместо "iLossYield" я записал "iYield".
В итоге конечная строка выглядела так:
Код:
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_BLUE"), getX_INLINE(), getY_INLINE(), true, true);
Аналогичный трюк с заменой "iLossYield" на "iYield" я проделал и для следующей строки.
В итоге твой код получился в таком виде:
Код:
if (GC.getYieldInfo((YieldTypes)iYield).isCargo())
{
iYieldStored = getYieldStored((YieldTypes)iYield);
CvWString szBuffer = CvWString::format(L"/t%c, Stored%d, Price%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_BLUE"), getX_INLINE(), getY_INLINE(), true, true);
//VET BirthPoints - begin 11/16
/*if ((iYieldStored > 0) && (aiPrices[iYield] < iMinPrice))
{
iLossYieldStored = iYieldStored;*/
if ((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))//iYieldStored отрицательным быть не может
{
CvWString szBuffer = CvWString::format(L"/t/t%c, Stored%d, PriceNew%d, PriceOld%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield], iLossYield == -1 ? -1 : aiPrices[iLossYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), getX_INLINE(), getY_INLINE(), true, true);
iLossYieldStored = iYieldStored;
if (iYield == YIELD_FOOD)//это возможно только когда (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0)
{iLossYieldStored -= iMinFood;}
//VET BirthPoints - end 11/16
iMinPrice = aiPrices[iYield];
iLossYield = iYield;
}
}
Я не специалист по С++ и поэтому возможно сделанные мной изменения неверны в принципе, однако после них я смог без труда запустить игру и увидеть синие и зеленые сообщения на экране. Насколько они достоверны зависит от того, насколько правильны были внесенные мной изменения. Если они неверны, то дальнейшее можно не читать, ибо это писано "вилами по воде".
Итак, город на два жителя, скорость игры нормальная, запас еды чуть больше "неприкосновенного" (48 еды), поэтому сначала удаляется небольшой избыток еды. На экране я вижу:

Количество хранящихся ресурсов (Stored) верно по всем позициям. Цена для еды -2147483648 довольно "странная", но "PricеOld -1" кажется правильной, так как еда действительно самый дешевый ресурс и стОит она именно 1 монету.
Далее постепенно опорожняем склад и наконец доходим до следующего варианта.
До удаления избытков:

Стоимость табака 4 монеты, железной руды 3. Поэтому по идее должна удаляться железная руда. Однако почему-то удаляется табак.

На экране мы видим сообщение об этом:

И опять те же странные значения по ценам: "2147483648" и "PricеOld -1". В данном случае "PricеOld -1" уже неверно, поскольку табак стоит 4 монеты, а не одну. А следовательно и в первом случае с едой этому значению верить нельзя.
Что в данном случае смущает меня больше всего?
Это одно и то же значение для цены на все без исключения товары. Я еще могу допустить, что на экране мы видим некое "внутреннее значение", которое программа использует для расчетов цен, но по логике оно должно быть разным для различных товаров. Тут же оно почему-то одно и то же по всем товарам.
В общем, получилось пока так.....