PDA

Просмотр полной версии : Разработка мода (все пожелания сюда)



Sylexz
22.01.2011, 15:51
Расскажу байку.

Мод был мной почти заброшен, но как-то я решил поставить на домашнем ПК Trac+SVN+MSYS. В качестве тестового проекта полу-случайно добавил, собственно, мод. Угасший было интерес возник снова, и разработка потихоньку сдвинулась с мертвого места. Была поставлена VS2010, раскопаны старые исходники ядра, созданы тикеты (задачи) в Trac.

Часть из тикетов уже выполнена (или почти выполнена):
4458

А количество ревизий скоро дойдет до 100:
4459

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

В данной теме будет комментироваться процесс разработки, и с выходом каждой более-менее важной ревизии будет выкладываться небольшой обзор. Все комментарии и разумная критика приветствуются.

NeseryozniyVET
24.01.2011, 15:39
Привет!

У меня небольшая проблема с python'ом. Хочу вынести на основной экран усталость от войны (численный показатель + получаемое недовольство в городах от него), но MainInterface.py на 5000 строк без автодополнения меня немного пугает.

Хочу попросить тебя о помощи в этом нелегком для меня деле - в программировании интерфейса для Civ 4 я пока разбираюсь слабовато. :)Создай новый тэг INTERFACE_WAR_SUCCESS для текста усталости от войны. (Усталость от войны: %d1_Num%%)

Затем в файле CvMainInterface.py найди функцию (def updateGameDataStrings(self): ) и в ней напиши код


screen.hide("WarSuccessLabel")

if !pHeadSelectedCity:
szText = localText.getText("INTERFACE_WAR_SUCCESS", (gc.getPlayer(ePlayer).getWarWearinessPercentAnger(),))
screen.setLabel("WarSuccessLabel", "Background", szText, CvUtil.FONT_LEFT_JUSTIFY, Координата_X, Координата_Y, -0.1, FontTypes.SMALL_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)


CvUtil.FONT_LEFT_JUSTIF - означает что заданые координаты - это самая левая часть текста (текст пишется с лева на право). Есть еще варианты FONT_RIGHT_JUSTIF и FONT_CENTER_JUSTIF
Параметрт getWarWearinessPercentAnger() - это сумма усталостей от войны от всех игроков. Она вычисляется функцией CvPlayer::updateWarWearinessPercentAnger() в SDK.
Можно сделать чтоб при наведении курсора выводилась подсказка для военной усталости от каждого игрока.

Для этого нужно заменить
screen.setLabel("WarSuccessLabel", "Background", szText, CvUtil.FONT_LEFT_JUSTIFY, Координата_X, Координата_Y, -0.1, FontTypes.SMALL_FONT, WidgetTypes.WIDGET_GENERAL, -1, -1)
на
screen.setText("WarSuccessLabel", "Background", szText, CvUtil.FONT_LEFT_JUSTIFY, Координата_X, Координата_Y, -0.1, FontTypes.SMALL_FONT, WidgetTypes.WIDGET_WAR_SUCCESS, ePlayer, -1)
Потом создать новый WidgetTypes.WIDGET_WAR_SUCCESS в CvEnums.h (CyEnumsInterface.cpp для вывода в Python) и написать соответствующий код в функции CvDLLWidgetData::parseHelp(CvWStringBuffer &szBuffer, CvWidgetDataStruct &widgetDataStruct)
Файл CvDLLWidgetData.cpp


case WIDGET_WAR_SUCCESS:
if ((widgetDataStruct.m_iData1 > -1) && (widgetDataStruct.m_iData1 < MAX_PLAYERS))
{
CvWString szTemp;
bool bNotFirst = false;
int iI, iOurWarWeariness, iLoopWarWeariness;
TeamTypes eLoopTeam;
TeamTypes eOurTeam = GET_PLAYER(widgetDataStruct.m_iData1).getTeam();
CvTeam& kOurTeam = GET_TEAM(eOurTeam);

for (iI = 0; iI < MAX_PLAYERS; iI++)
{
CvPlayer& kLoopPlayer = GET_PLAYER((PlayerTypes)iI);
eLoopTeam = kLoopPlayer.getTeam();
CvTeam& kLoopTeam = GET_TEAM(eLoopTeam);
if (kLoopTeam.isAlive() && (eLoopTeam != eOurTeam) && !kLoopTeam.isMinorCiv())
{
if (bNotFirst)
{szBuffer.append(NEWLINE);}
else
{bNotFirst = true;}

if (kLoopTeam.isAtWar(eOurTeam))
{szTemp.Format(SETCOLR L"%s: " ENDCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT"), kLoopPlayer.getName());}
else
{szTemp.Format(SETCOLR L"%s: " ENDCOLR, TEXT_COLOR("COLOR_POSITIVE_TEXT"), kLoopPlayer.getName());}
szBuffer.append(szTemp);

iOurWarWeariness = (kOurTeam.getWarWeariness(eLoopTeam) * std::max(0, 100 + kLoopTeam.getEnemyWarWearinessModifier())) / 10000;
iLoopWarWeariness = (kLoopTeam.getWarWeariness(eOurTeam) * std::max(0, 100 + kOurTeam.getEnemyWarWearinessModifier())) / 10000;

szTemp.Format(SETCOLR L"%d%%" ENDCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT"), iOurWarWeariness);
szBuffer.append(szTemp);
szTemp.Format(L"/");
szBuffer.append(szTemp);
szTemp.Format(SETCOLR L"%d%%" ENDCOLR, TEXT_COLOR("COLOR_POSITIVE_TEXT"), iLoopWarWeariness);
szBuffer.append(szTemp);
}
}
}
break;

Sylexz
24.01.2011, 16:13
Огромное спасибо, NeseryozniyVET! :applau2:

Теперь я примерно понимаю как использовать виджеты, и смогу по аналогии добавить и другие показатели. Еще раз спасибо!

Vensan
20.10.2011, 14:02
Здравствуйте!
Я обнаружил баговый чит в моде: при торговле катапультами есть возможность менять катапульту на катапульту с доплатой! Неограниченное число раз))
Точнее, пока у игрока ИИ деньги не кончатся))
Баг обнаружен при торговле с Манса Мусой, расположение его: Доволен, доплата составила 6 ед золота.:cool:

А за обмен 2 катапульт 13 ед. золота дают!

Vensan
20.10.2011, 14:26
Н-да. При тех же условиях фокус с Уайна Капаком не прошел( Он затребовал доплатить 2 золота за катапульту или 3 золота за две(
Но зато ему без разницы какими катапультами меняться - можно разменять катапульту с 1 прокачкой на катапульту с тремя...и наоборот.
А вот 18 Кроликов(Майя) вообще жадный: потребовал 13 золота за обмен катапульты на катапульту. Хотя тоже довольный.
Короче, повезло мне с Манса Мусой(он мировой лидер ,я пока третий). Пока,да. Скоро все может поменяться ,хоть я и на императоре играю.

Vensan
20.10.2011, 15:01
Еще: до открытия очередной техи оставалось 111 колб, Манса уступил ее за 105 золота... для меня не очень выгодно, но помог фокус с катапультами: после муторных, но приятных манипуляций все мои денежки вернулись ко мне обратно:D

Vensan
20.10.2011, 15:04
Маленький незначительный недочетик заметил: когда советник предлагает перейти на вновь открывшуюся парадигму в скобочках появляется подсказка по парадигме из оригинальной цивы.
А так: СПАСИБО ЗА ПРОДЕЛАННУЮ РАБОТУ ОГРОМНОЕ!!!!!

Vensan
03.11.2011, 16:41
Еще заметил:
Видимо ,в связи с тем ,что у осадной техники(катапульт и проч.) появилась возможность атаковать не вступая в прямой бой, игроки АИ не умеют этой функцией пользоваться!
...Что существенно облегчает войну с ними...
Помню, как огромным стеком захватывал Рим... в итоге я 3 хода добивал орду катапульт и требушетов ,которые так и не произвели по моему стеку ни единого выстрела...:D

Да, фокус с катапультами также срабатывает с другой осадной техникой, иногда с рабочими, дирижаблями, кораблями и проч.
Вот только именные(созданные в городах игрока-человека) юниты АИ принципиально обратно не отдает, только безымянными(созданными АИ) юнитами можно так меняться...

neocrator
27.11.2012, 20:37
АВТОР УМЕР? загруженные на обменники файлы удалены, пятая цива надоела, а поиграть этот мод не получится

Snake_B
28.11.2012, 13:39
АВТОР УМЕР? загруженные на обменники файлы удалены, пятая цива надоела, а поиграть этот мод не получится

чего так оптимистично... видимо просто надоело... пусть кто-нибудь, у кого есть, зальет на файлообменник и положит сюда ссылку...

Leopold
01.08.2013, 20:07
Ну не верю, что все ушли на пятую циву. Откликнитесь у кого есть файлы и hotfix для civilization universalis 1.690