Сообщение от
Sylexz
Привет!
У меня небольшая проблема с 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;