+ Ответить в теме
Страница 21 из 26 ПерваяПервая ... 11202122 ... ПоследняяПоследняя
Показано с 401 по 420 из 517

Тема: "1492: Global Colonization. Глобальная Колонизация"

  1. #401
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    У меня нормально рапаковуется

    Ладно, вот новый архив
    http://rghost.ru/39949086
    То же самое.

    Ошибка идет как при открывании 7-Zip, так и при WinRAR.

    Нажмите на изображение для увеличения
Название: error1.jpg
Просмотров: 2
Размер:	56.8 Кб
ID:	5545
    продвинь это сообщение в соцсеть:  

  2. #402
    Цитата Сообщение от kabjans Посмотреть сообщение
    То же самое.

    Ошибка идет как при открывании 7-Zip, так и при WinRAR.
    После танца с бубном вокруг компьютера и установки самой распоследней версии 7-Zip (http://7-zip.en.softonic.com/download) открыть архив с третьего раза (!!!) удалось!

    Почему такая фигня приключилось - не знаю. Вчерашний твой архив раскрылся старым архиватором без проблем и с первого раза. Впрочем, неважно. Бубен я повесил пока на стенку рядом с компом.
    продвинь это сообщение в соцсеть:  

  3. #403
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Для того чтоб избавится от кнопки надо убрать все коды связаные с названием "AvoidGrowth". Там два таких кода: первый ты указал, а второй начинается со строчки 2468
    Помогло! Кнопку "AvoidGrowth" удалось убрать. Но в данном случае я этим трюком пока не пользовался, и в дальнейшем использовал твой CvMainInterface.py файл без всяких изменений.

    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Подправил автоматическую продажу еды (DLL там старый, поэтому сам скомпилируй его из вложеных исходников. Я там только три файла изменил)
    http://rghost.ru/39947697
    Скомпилировал со второй попытки. Первая не удалась, поскольку в файле CvGlobals.cpp было дважды прописано одно и то же.

    Код:
    //VET BirthPoints - begin 3/4
    int CvGlobals::getBASE_BIRTH_POINTS_THRESHOLD()
        {return m_iBASE_BIRTH_POINTS_THRESHOLD;}
    
    int CvGlobals::getBASE_BIRTH_POINTS_THRESHOLD()
        {return m_iBASE_BIRTH_POINTS_THRESHOLD;}
    //VET BirthPoints - end 3/4
    а должно быть, как я понимаю, так:

    Код:
    //VET BirthPoints - begin 3/4
    int CvGlobals::getBASE_BIRTH_POINTS_THRESHOLD()
        {return m_iBASE_BIRTH_POINTS_THRESHOLD;}
    
    int CvGlobals::getTURNS_FOR_FOOD()
        {return m_iTURNS_FOR_FOOD;}
    //VET BirthPoints - end 3/4
    После этого скомпилировать удалось без проблем, но при входе в город выскакивает этот экран и .....

    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось kabjans; 23.08.2012 в 13:43.

  4. #404
    Пишет что в питон не выведена функция getTotalYieldStored
    Я эту функцию в питон выводил, так что надо перекомпилировать заново DLL используя все файлы SDK, которые идут с моим модом. (эта функция выводится в питон через файлы CyCity.h, CyCity.cpp, CyCityInterface1.cpp)
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  5. #405
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Пишет что в питон не выведена функция getTotalYieldStored
    Я эту функцию в питон выводил, так что надо перекомпилировать заново DLL используя все файлы SDK, которые идут с моим модом. (эта функция выводится в питон через файлы CyCity.h, CyCity.cpp, CyCityInterface1.cpp)
    Сейчас повторю компиляцию, но прошлый раз я в директорию с исходные кодами перенес все твои 12 файлов.

    Минуточку....



    Опаньки, получилось! Большое спасибо!

    Не иначе как исправляя опечатку в CvGlobals.cpp я забыл забыл выполнить команду "Clean GameCore.dll", а тупо продолжил компиляцию.

    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    На счет автомотической продажи еды. Может сделать новый параметр в GlobalDefinesAlt.xml в котором указать минимальное количество ходов, для которых будет сохранятся еда в городе? Например, если етот параметр равен 10 и в городе 4 жителя (потребляют 8 еды за ход), то еда будет продаватся пока ее количество больше 10 * 8 = 80.
    Очень разумно. Это получается нечто НЗ - неприкосновенного запаса. Поскольку этот параметр задается в GlobalDefinesAlt.xml то его, равно как и BASE_BIRTH_POINTS_THRESHOLD, надо будет подбирать экспериментально.


    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Жители в твоем примере не умирают с голода, потому что никакого голода на скриншотах нету (Под едой нету отрицательного числа). Жители производят столько еды, сколько потребляют: 5 от рыбака + 2 от города + 1 от фермера = 8.
    Тоже верно. В приведенном выше случае жители не голодали. Это я снова лопухнулся. Они просто съедали все производимое за ход.

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

    Вообще, насколько я помню, в оригинальной кол2 жители не умирают, а уезжают из города на глобальную карту.


    Я почему-то был твердо уверен, что они вымирают. Да, наверное надо хоть иногда запускать игру для игры, а не для моддинга.
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось kabjans; 23.08.2012 в 18:47.

  6. #406
    В самой последней версии, скомпилированной вчера, нашел довольно странное поведение при переполнении городского склада.

    Начальная логика при переполненном складе случае была понятна:
    Если склад переполнен, то теряются наиболее дешевые товары.
    Поэтому когда еда стала обычным ресурсом, то именно она и терялась.

    Затем был введен TURNS_FOR_FOOD или количество ходов, на которое будет накапливатся еда в городе (учитывая ее потребление всеми жителями города) вне зависмости от заполнености склада другими ресурсами при включеном NEW_CAPACITY.

    Тоже все совершенно логично. Таким образом создавался некий городской "неприкосновенный запас" еды.

    Однако в реальности почему-то получается по другому. Вот пример:

    Город 4 человека. Запас еды 62. Это значение, равно как и население, по ходу игры не меняются.
    TURNS_FOR_FOOD = 12.
    Таким образом можно вычислить "неприкосновенный запас" еды для города. Он равен

    Код:
    2 еды х 4 человека х 12 ходов = 96 еды
    Это значение больше, чем то количество еды, что есть в городе (62).
    Из этого следует, что еда не будет исчезать при переполнении склада. Прекрасно!

    Теперь смотрим что есть на складе. На городском складе есть древесина (самый дешевый товар, цена продажи 1 монета), шкуры, табак (продается за 3 монеты) и сигары (самый дорогой товар, 6 монет за штуку).



    При переполнении склада по логике должны были исчезать доски (древесина), как самый дешевый товар. Не еда, поскольку ее запас меньше критического (62<96), а именно древесина.

    Реально же исчезают только (!!!) сигары или табак. Странно?

    Я провел дополнительный тест, подселяя в город по очереди пионера (на складе появилось +150 инструментов), затем ветерана (+150 оружия) и наконец скаута (+150 лошадей).

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



    Другими словами всегда исчезает не самый дешевый, а самый крайний справа товар. Почему не работает старая логика, когда исчезать должен самый дешевый товар, совершенно непонятно?
    продвинь это сообщение в соцсеть:  

  7. #407
    Вечером попробую разобратся.
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  8. #408
    В файле CvCity.cpp найди строчку номер 6095:
    if ((iYieldStored != 0) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))
    и измени ее так чтоб получилось
    ((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))

    Случайно удалил нужное условие (которое и находило минимальную цену) при редактировании
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  9. #409
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    В файле CvCity.cpp найди строчку номер 6095:
    if ((iYieldStored != 0) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))
    и измени ее так чтоб получилось
    ((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))

    Случайно удалил нужное условие (которое и находило минимальную цену) при редактировании
    Спасибо, сейчас попробую.....

    Скомпилировал и уже попробовал. Все работает прекрасно! При переполнении городского склада исчезает самый дешевый товар, в моем случае - древесина. То есть именно так, как и должно быть. Здорово!

    ОГРОМНЕЙШЕЕ СПАСИБО, NeseryozniyVET!
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось kabjans; 24.08.2012 в 23:19.

  10. #410
    Проверь на нормальное удаление еды. Сделай чтоб еды было болше необходимого минимума, а потом переполняй склад.
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  11. #411
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Проверь на нормальное удаление еды. Сделай чтоб еды было болше необходимого минимума, а потом переполняй склад.
    Обязательно проверю на выходных. На переполненном городском складе есть еще некоторые не совсем понятные моменты. Мне нужно несколько дней, чтобы суммировать наблюдения при различных ситуация.
    продвинь это сообщение в соцсеть:  

  12. #412
    Привет, NeseryozniyVET!

    Все эксперименты я проводил с учетом твоей последней корректировки:
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    В файле CvCity.cpp найди строчку номер 6095:
    if ((iYieldStored != 0) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))
    и измени ее так чтоб получилось
    ((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))

    Случайно удалил нужное условие (которое и находило минимальную цену) при редактировании
    Вот результаты тестов.
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Проверь на нормальное удаление еды. Сделай чтоб еды было больше необходимого минимума, а потом переполняй склад.
    При переполнении склада (в том числе и едой сверх "неприкосновенного запаса") первой исчезает избыточная еда. Когда запас еды оказывается равным неприкосновенному запасу, то еда больше не удаляется.

    Для города с населением 2 человека мы имеем
    2 еды х 2 человека х 12 ходов = 48 еды
    Это для нормальной скорости. Если игра идет на марафоне, то 48 надо умножить на коэффициент 3, будет 144. Именно это я и наблюдаю.

    Таким образом, данная часть мода работает совершенно правильно.

    Однако затем возникает ошибка. Если до твоей последней корректировки с переполненного склада удалялся не самый дешевый, а самый крайний справа товар, то сейчас удаление идет в обратном порядке начиная с древесины и далее слева направо.

    Для того, чтобы наверняка поймать эту ошибку я специально подредактировал CIV4YieldInfos.xml, задав новые цены при продаже:

    древесина (2 монеты), хлопок (5), шкуры (6), сахар (7), табак (4), руда (3)
    По логике должно быть
    Если склад переполнен, то теряются наиболее дешевые товары.
    После того, как запас еды стал равен неприкосновенному запасу, первой с переполненного склада исчезает древесина, что правильно, ибо она самый дешевый товар (2 монеты). Следующим кандидатом на удаление должна быть руда (3 монеты), поскольку после того, как вся древесина исчезла, именно она оказывается самым дешевым товаром. Однако вместо нее первым со склада исчезает хлопок (5 монет).



    Если хлопка нет, то первыми исчезают шкуры (6 монет), затем более дешевый табак (4 монеты). До удаления железной руды, как самого дешевого товара дело не доходит.



    Таким образом, в данном варианте программа не может найти самый дешевый товар, а удаляет самый первый из списка после еды:

    CvEnums.h:
    Код:
    	YIELD_FOOD,
    	YIELD_LUMBER,
    	YIELD_SILVER,
    	YIELD_COTTON,
    	YIELD_FUR,
    	YIELD_SUGAR,
    	YIELD_TOBACCO,
    	YIELD_ORE,
    	YIELD_CLOTH,
    	YIELD_COATS,
    	YIELD_RUM,
    	YIELD_CIGARS,
    	YIELD_TOOLS,
    	YIELD_MUSKETS,
    	YIELD_HORSES,
    	YIELD_TRADE_GOODS,
    продвинь это сообщение в соцсеть:  

  13. #413
    Просмотрел алгоритм, вроде, все правильно.
    Может дело в том, что используется не цена в CIV4YieldInfos.xml, а цена в Европе, причем, если в товар в Европе продавать нельзя, то цена считается 0.
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  14. #414
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Просмотрел алгоритм, вроде, все правильно.
    Странно....

    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Может дело в том, что используется не цена в CIV4YieldInfos.xml, а цена в Европе, причем, если в товар в Европе продавать нельзя, то цена считается 0.
    Да нет, не похоже. Я тестирование проводил на примере города, который стоил через WorldBuilder, размещая нужное количество поселенцев на какой-то определенной клетке. Корабль с поселенцами я останавливал на первом ходу и он оставался в начальной точке все время. Это означает, что с Европой я не торговал вообще, а следовательно король не мог вводить мне налоги, а я от этого предложения соответственно отказываться. Другими словами, ни один из моих товаров не подпадал под запрет на продажу в Европе.

    Относительно цены я не совсем понял твою мысль. Все цены на торговлю с Европой и туземцами прописаны в CIV4YieldInfos.xml. В этом файле есть целый букет тегов, связанных с ценами. Для хлопка к примеру это выглядит так:

    Код:
    			<iBuyPriceLow>3</iBuyPriceLow>
    			<iBuyPriceHigh>5</iBuyPriceHigh>
    			<iSellPriceDifference>2</iSellPriceDifference>
    			<iPriceChangeThreshold>800</iPriceChangeThreshold>
    			<iPriceCorrectionPercent>2</iPriceCorrectionPercent>
    			<iNativeBuyPrice>-1</iNativeBuyPrice>
    			<iNativeSellPrice>5</iNativeSellPrice>
    Европейская цена находится в пределах от 3 до 5 монет.

    Код:
    			<iBuyPriceLow>3</iBuyPriceLow>
    			<iBuyPriceHigh>5</iBuyPriceHigh>
    Именно одно из этих значений - 3, 4 или 5 - мы видим, когда наводим курсор на значок хлопка на экране города. Естественно можно пойти на экран Европы, но и там мы увидем ту же самую цену. Поэтому европейские цены, действующие в данный момент, проще смотреть прямо на городском экране.

    Однако эти цены, во-первых, колеблются в неких пределах (<iSellPriceDifference>), во-вторых, в оригинальной версии игры они очень близки или даже равны друг к другу.

    Поэтому для прояснения ситуации я при тестировании твоего мода подредактировал CIV4YieldInfos.xml, задав новые цены при продаже:
    древесина (2 монеты), хлопок (5), шкуры (6), сахар (7), табак (4), руда (3)
    При этом оба значения <iBuyPriceLow> и <iBuyPriceHigh> были одними и теми же для данного товара. Это позволило мне избавиться от колебания европейских цен. Причем, обрати внимание на порядок цен. После дешевой древесины (2 монеты) я специально поставил более дорогие хлопок (5), шкуры (6), сахар (7), а лишь потом более дешевые табак (4) и руду (3). Однако при переполнении городского склада почему-то сперва исчезали более дорогие хлопок (5), шкуры (6), сахар (7), а лишь потом более дешевые табак (4) и руда (3). Причем, что самое важное - удаление излишков шло совершенно четко слева направо.

    Возможно именно этот ньюанс позволит понять логику принятия решения какой товар удалять.
    продвинь это сообщение в соцсеть:  

  15. #415
    Будем искать ошибку так
    Добавь новые строчки (отмечени красным) в алгоритм поиска самого дешевого ресурса
    Код:
    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;
    					}
    				}
    доведи склад до переполнения и смотри на сообщения
    Синее сообщение - проверяемый ресурс, его количество на складе и цена продажи (проверить эти значения с значениями в городском экране)
    Зеленое сообщение - прошедший проверку ресурс. Ресурс цена которого ниже цены ресурса в прошлом (нижнем) зеленом сообщении. В сообщении будет цена нового и старого ресурса для сравнения.
    Проанализируй сообщения и определи какой ресурс и по каким причинам не прошол правильную проверку
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  16. #416
    Цитата Сообщение от 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 монеты, а не одну. А следовательно и в первом случае с едой этому значению верить нельзя.

    Что в данном случае смущает меня больше всего?
    Это одно и то же значение для цены на все без исключения товары. Я еще могу допустить, что на экране мы видим некое "внутреннее значение", которое программа использует для расчетов цен, но по логике оно должно быть разным для различных товаров. Тут же оно почему-то одно и то же по всем товарам.

    В общем, получилось пока так.....
    продвинь это сообщение в соцсеть:  

  17. #417
    Привет! Всем!!! Как же давно я в циву не играл...
    Спасибо ребята, что делаете!!!
    продвинь это сообщение в соцсеть:  

  18. #418
    Привет
    Надеюсь проблемы решаемы и у Вас получится
    А мы пока будем ждать полного мода
    продвинь это сообщение в соцсеть:  

  19. #419
    Решение проблемы я ему отправил личным сообщением несколько дней назад. Но, видимо, он опять в командировке.
    Скрытый текст

    Добавь ! в условие if (GET_PLAYER(getOwnerINLINE()).isYieldEuropeTradable(eYield))
    и проверь заново
    //VET NewCapacity - begin 6/9
    if (bNEW_CAPACITY)
    {
    aiPrices[iYield] = getOverflowYieldSellPercent() * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 1000);// Цена за 1000 единиц ресурса
    if (!GET_PLAYER(getOwnerINLINE()).isYieldEuropeTradable(eYield))// непродоваемые в европе
    {
    aiPrices[iYield] += MIN_INT;
    }
    }
    else
    {
    //VET NewCapacity - end 6/9

    цены в сообщениях должны быть нормальными, только надо учесть что это цены за 1000 единиц ресурса.

    Твое исправление влияет только на изображение ресурса на игровом экране отвечающее за сообщение. Вылет был из-за того что при самом первом проходе iLossYield равен (-1), а функция GC.getYieldInfo((YieldTypes)iYield) корректно работает только когда iYield >= 0 и меньше количества всех ресурсов в игре.
    продвинь это сообщение в соцсеть:  

  20. #420


    Цитата Сообщение от NeserVET Посмотреть сообщение
    Решение проблемы я ему отправил личным сообщением несколько дней назад. Но, видимо, он опять в командировке.
    Нет, напротив ко мне гости приехали и мы неделю из-за стола не поднимались. А в командировку я уеду на несколько дней в самом конце этой недели.

    Итак, что получилось в последнем варианте, когда вводится

    Код:
     if (!GET_PLAYER(getOwnerINLINE()).isYieldEuropeTradable(eYield))// непродоваемые в европе
    Компиляция и запуск игры - без проблем.
    Набор городом "очков рождаемости" и поддержание "неприкосновенного запаса" еды в переполненном городском складе тоже все работает правильно.

    Затем идет та же самая ошибка.

    Вот город на 2 жителя. Скорость нормальная, вместимость склада 100, "неприкосновенный запас" еды равен 48. Остальное при переполнении должно удаляться.

    И тут снова, как и раньше удаление излишков идет строго слева направо, причем совершенно независимо от стоимость удаляемого товара. Я даже оставил на складе 100 единиц серебра, то есть товара следующего по списку после древесины (если идти слева направо).



    На следующий ход серебро было удалено, несмотря на то, что его цена была 19 монет и оно было самым дорогим товаром на переполненном складе.



    Так же были удалены излишки хлопка (3 монеты) и шкур (5 монет). Самая крайняя справа и при этом дешевая же железная руда (3 монеты) осталась нетронутой.

    Вот сообщения с экранаю Они не влезли в один снимок, поэтому я сделал три снимка по каждой позиции.
    Сначала исчезло серебро:



    Затем хлопок



    И наконец самыми последними были удалены шкуры:

    продвинь это сообщение в соцсеть:  

+ Ответить в теме
Страница 21 из 26 ПерваяПервая ... 11202122 ... ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Рейтинг@Mail.ru

free counters