+ Ответить в теме
Показано с 1 по 6 из 6

Тема: [SDK] Добавление новых XML атрибутов и их использование в SDK

  1. #1
    Бессмертный Аватар для JCricket


    Регистрация
    21.09.2005
    Адрес
    Roads of Israel
    Сообщений
    3,008
    Как всегда наврала, обещала к пятнице .


    Добавление новых XML атрибутов и их использование в SDK


    Автор Kael
    Оригинал


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

    Изначальная цель этого проекта была добавить лидерам 4 новых параметра, определяющие их отношение. Эти четыре параметра:

    1. Модификатор отношений основанный на расположении (???) других цивилизаций относительно выбранной.
    2. Модификатор отношений в случае если другая цивилизация использует Смертельное волшебство (Death Magic).
    3. Модификатор отношений в случае если другая цивилизация использует Энтропическое волшебство (Entropy Magic).
    4. Модификатор отношений в случае если другая цивилизация выбирает в качестве Гос. Института Сострадания (Compassion civic option) "Добро" (Good).
    5. Модификатор отношений в случае если другая цивилизация выбирает в качестве Гос. Института Сострадания "Зло" (Evil).

    Я отдаю себе отчет в том, что это специфические (FfH??? ) параметры, но предполагаю, что процесс достаточно стандартен, и может быть приспособлен для других функций.

    В принципе, когда у вас возникает желание создать новый параметр в XML и связать его с SDK:

    Шаг первый: Добавление параметра в XML

    Для начала следует модифицировать файл CIV4CivilizationsSchema.xml, для того, чтобы сделать доступными новые атрибуты. Определение новых атрибутов вносится в следующем отрезке. Новые строки выделены жирным шрифтом.

    [codebox] <ElementType name="iSameReligionAttitudeChange" content="textOnly" dt:type="int"/>
    <ElementType name="iSameReligionAttitudeDivisor" content="textOnly" dt:type="int"/>
    <ElementType name="iSameReligionAttitudeChangeLimit" content="textOnly" dt:type="int"/>
    <ElementType name="iDifferentReligionAttitudeChange" content="textOnly" dt:type="int"/>
    <ElementType name="iDifferentReligionAttitudeDivisor" content="textOnly" dt:type="int"/>
    <ElementType name="iDifferentReligionAttitudeChangeLimit" content="textOnly" dt:type="int"/>
    <ElementType name="Alignment" content="textOnly" dt:type="int"/>
    <ElementType name="iUseDeathAttitudeChange" content="textOnly" dt:type="int"/>
    <ElementType name="iUseEntropyAttitudeChange" content="textOnly" dt:type="int"/>
    <ElementType name="iHighCompassionAttitudeChange" content="textOnly" dt:type="int"/>
    <ElementType name="iLowCompassionAttitudeChange" content="textOnly" dt:type="int"/>

    <ElementType name="iBonusTradeAttitudeDivisor" content="textOnly" dt:type="int"/>
    <ElementType name="iBonusTradeAttitudeChangeLimit" content="textOnly" dt:type="int"/>[/codebox]

    Я добавил определения в секции <ElementType name="LeaderHeadInfo" content="eltOnly">, чтобы они стали законными атрибутами для элементов LeaderHeadInfo (изменения жирным шрифтом):

    [codebox] <element type="iSameReligionAttitudeChange"/>
    <element type="iSameReligionAttitudeDivisor"/>
    <element type="iSameReligionAttitudeChangeLimit"/>
    <element type="iDifferentReligionAttitudeChange"/>
    <element type="iDifferentReligionAttitudeDivisor"/>
    <element type="iDifferentReligionAttitudeChangeLimit"/>
    <element type="Alignment"/>
    <element type="iUseDeathAttitudeChange"/>
    <element type="iUseEntropyAttitudeChange"/>
    <element type="iHighCompassionAttitudeChange"/>
    <element type="iLowCompassionAttitudeChange"/>

    <element type="iBonusTradeAttitudeDivisor"/>
    <element type="iBonusTradeAttitudeChangeLimit"/>[/codebox]

    После этого нужно модифицировать каждого лидера в файле CIV4LeaderHeadInfos.xml, внести новые атрибуты и задать им величину.

    [codebox] <iSameReligionAttitudeChange>1</iSameReligionAttitudeChange>
    <iSameReligionAttitudeDivisor>10</iSameReligionAttitudeDivisor>
    <iSameReligionAttitudeChangeLimit>3</iSameReligionAttitudeChangeLimit>
    <iDifferentReligionAttitudeChange>-1</iDifferentReligionAttitudeChange>
    <iDifferentReligionAttitudeDivisor>-5</iDifferentReligionAttitudeDivisor>
    <iDifferentReligionAttitudeChangeLimit>-1</iDifferentReligionAttitudeChangeLimit>
    <Alignment>1</Alignment>
    <iUseDeathAttitudeChange>-4</iUseDeathAttitudeChange>
    <iUseEntropyAttitudeChange>-4</iUseEntropyAttitudeChange>
    <iHighCompassionAttitudeChange>1</iHighCompassionAttitudeChange>
    <iLowCompassionAttitudeChange>-1</iLowCompassionAttitudeChange>

    <iBonusTradeAttitudeDivisor>50</iBonusTradeAttitudeDivisor>
    <iBonusTradeAttitudeChangeLimit>2</iBonusTradeAttitudeChangeLimit>[/codebox]

    После того, как мы это сделали, лидер получит модификатор отношений -4, если другая цивилизация не использует Смертельное колдовство, -4, если использует Энтропическое колдовство, +1, если Сострадательным Гос. Институтом выбрано добро, и -1, если зло.

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

    Шаг второй: Открываем SDK доступ к чтению новых атрибутов

    Следующим действием будет открыть доступ для SDK к нашим новым XML атрибутам. Для этого нам потребуется описать функции читающие эти атрибуты. Это делается в двух модулях. В CvInfo.cpp мы должны сделать следующие изменения:

    CvInfos.cpp

    Сначала необходимо дать определение внутренним параметрам, которые мы будем использовать:

    [codebox]m_iSameReligionAttitudeChange(0),
    m_iSameReligionAttitudeDivisor(0),
    m_iSameReligionAttitudeChangeLimit(0),
    m_iDifferentReligionAttitudeChange(0),
    m_iDifferentReligionAttitudeDivisor(0),
    m_iDifferentReligionAttitudeChangeLimit(0),
    m_iAlignment(0),
    m_iUseDeathAttitudeChange(0),
    m_iUseEntropyAttitudeChange(0),
    m_iHighCompassionAttitudeChange(0),
    m_iLowCompassionAttitudeChange(0),

    m_iBonusTradeAttitudeDivisor(0),
    m_iBonusTradeAttitudeChangeLimit(0),[/codebox]

    Затем (также в CvInfos.cpp) мы должны добавить функции позволяющие нам запрашивать этот атрибут.

    [codebox]int CvLeaderHeadInfo::getSameReligionAttitudeChange() const
    {
    return m_iSameReligionAttitudeChange;
    }

    int CvLeaderHeadInfo::getSameReligionAttitudeDivisor() const
    {
    return m_iSameReligionAttitudeDivisor;
    }

    int CvLeaderHeadInfo::getSameReligionAttitudeChangeLimit() const
    {
    return m_iSameReligionAttitudeChangeLimit;
    }

    int CvLeaderHeadInfo::getDifferentReligionAttitudeChange() const
    {
    return m_iDifferentReligionAttitudeChange;
    }

    int CvLeaderHeadInfo::getDifferentReligionAttitudeDivisor() const
    {
    return m_iDifferentReligionAttitudeDivisor;
    }

    int CvLeaderHeadInfo::getDifferentReligionAttitudeChangeLimit() const
    {
    return m_iDifferentReligionAttitudeChangeLimit;
    }

    int CvLeaderHeadInfo::getAlignment() const
    {
    return m_iAlignment;
    }

    void CvLeaderHeadInfo::setAlignment(int i)
    {
    m_iAlignment = i;
    }

    int CvLeaderHeadInfo::getUseDeathAttitudeChange() const
    {
    return m_iUseDeathAttitudeChange;
    }

    int CvLeaderHeadInfo::getUseEntropyAttitudeChange() const
    {
    return m_iUseEntropyAttitudeChange;
    }

    int CvLeaderHeadInfo::getHighCompassionAttitudeChange() const
    {
    return m_iHighCompassionAttitudeChange;
    }

    int CvLeaderHeadInfo::getLowCompassionAttitudeChange() const
    {
    return m_iLowCompassionAttitudeChange;
    }


    int CvLeaderHeadInfo::getBonusTradeAttitudeDivisor() const
    {
    return m_iBonusTradeAttitudeDivisor;
    }

    int CvLeaderHeadInfo::getBonusTradeAttitudeChangeLimit() const
    {
    return m_iBonusTradeAttitudeChangeLimit;
    }[/codebox]

    Потом в функции CvLeaderHeadInfo::read(FDataStreamBase* stream) мы добавим возможность читать новые атрибуты.

    [codebox] stream->Read(&m_iSameReligionAttitudeChange);
    stream->Read(&m_iSameReligionAttitudeDivisor);
    stream->Read(&m_iSameReligionAttitudeChangeLimit);
    stream->Read(&m_iDifferentReligionAttitudeChange);
    stream->Read(&m_iDifferentReligionAttitudeDivisor);
    stream->Read(&m_iDifferentReligionAttitudeChangeLimit);
    stream->Read(&m_iAlignment);
    stream->Read(&m_iUseDeathAttitudeChange);
    stream->Read(&m_iUseEntropyAttitudeChange);
    stream->Read(&m_iHighCompassionAttitudeChange);
    stream->Read(&m_iLowCompassionAttitudeChange);

    stream->Read(&m_iBonusTradeAttitudeDivisor);
    stream->Read(&m_iBonusTradeAttitudeChangeLimit);[/codebox]

    По тому же принципу, что мы использовали с функцией CvLeaderHeadInfo::write(FDataStreamBase* stream), мы должны добавить и возможность писать в новые атрибуты.

    [codebox] stream->Write(m_iSameReligionAttitudeChange);
    stream->Write(m_iSameReligionAttitudeDivisor);
    stream->Write(m_iSameReligionAttitudeChangeLimit);
    stream->Write(m_iDifferentReligionAttitudeChange);
    stream->Write(m_iDifferentReligionAttitudeDivisor);
    stream->Write(m_iDifferentReligionAttitudeChangeLimit);
    stream->Write(m_iAlignment);
    stream->Write(m_iUseDeathAttitudeChange);
    stream->Write(m_iUseEntropyAttitudeChange);
    stream->Write(m_iHighCompassionAttitudeChange);
    stream->Write(m_iLowCompassionAttitudeChange);

    stream->Write(m_iBonusTradeAttitudeDivisor);
    stream->Write(m_iBonusTradeAttitudeChangeLimit);[/codebox]

    И напоследок, мы должны добавить возможность вытащить атрибут из XML. Это делается в функции
    CvLeaderHeadInfo::read(CvXMLLoadUtility* pXML) .

    [codebox] pXML->GetChildXmlValByName(&m_iSameReligionAttitudeChange, "iSameReligionAttitudeChange");
    pXML->GetChildXmlValByName(&m_iSameReligionAttitudeDivisor, "iSameReligionAttitudeDivisor");
    pXML->GetChildXmlValByName(&m_iSameReligionAttitudeChangeLimit, "iSameReligionAttitudeChangeLimit");
    pXML->GetChildXmlValByName(&m_iDifferentReligionAttitudeChange, "iDifferentReligionAttitudeChange");
    pXML->GetChildXmlValByName(&m_iDifferentReligionAttitudeDivisor, "iDifferentReligionAttitudeDivisor");
    pXML->GetChildXmlValByName(&m_iDifferentReligionAttitudeChangeLimit, "iDifferentReligionAttitudeChangeLimit");
    pXML->GetChildXmlValByName(&m_iAlignment, "Alignment");
    pXML->GetChildXmlValByName(&m_iUseDeathAttitudeChange, "iUseDeathAttitudeChange");
    pXML->GetChildXmlValByName(&m_iUseEntropyAttitudeChange, "iUseEntropyAttitudeChange");
    pXML->GetChildXmlValByName(&m_iHighCompassionAttitudeChange, "iHighCompassionAttitudeChange");
    pXML->GetChildXmlValByName(&m_iLowCompassionAttitudeChange, "iLowCompassionAttitudeChange");

    pXML->GetChildXmlValByName(&m_iBonusTradeAttitudeDivisor, "iBonusTradeAttitudeDivisor");
    pXML->GetChildXmlValByName(&m_iBonusTradeAttitudeChangeLimit, "iBonusTradeAttitudeChangeLimit");[/codebox]

    Затем в CvInfos.h описать новые добавленные функции.

    CvInfos.h

    [codebox] DllExport int getSameReligionAttitudeChange() const; // Exposed to Python (Доступно Питону)
    DllExport int getSameReligionAttitudeDivisor() const; // Exposed to Python
    DllExport int getSameReligionAttitudeChangeLimit() const; // Exposed to Python
    DllExport int getDifferentReligionAttitudeChange() const; // Exposed to Python
    DllExport int getDifferentReligionAttitudeDivisor() const; // Exposed to Python
    DllExport int getDifferentReligionAttitudeChangeLimit() const; // Exposed to Python
    DllExport int getAlignment() const; // Exposed to Python
    DllExport void setAlignment(int i); // Exposed to Python
    DllExport int getUseDeathAttitudeChange() const; // Exposed to Python
    DllExport int getUseEntropyAttitudeChange() const; // Exposed to Python
    DllExport int getHighCompassionAttitudeChange() const; // Exposed to Python
    DllExport int getLowCompassionAttitudeChange() const; // Exposed to Python

    DllExport int getBonusTradeAttitudeDivisor() const; // Exposed to Python
    DllExport int getBonusTradeAttitudeChangeLimit() const; // Exposed to Python[/codebox]

    И новые параметры:

    [codebox] int m_iSameReligionAttitudeChange;
    int m_iSameReligionAttitudeDivisor;
    int m_iSameReligionAttitudeChangeLimit;
    int m_iDifferentReligionAttitudeChange;
    int m_iDifferentReligionAttitudeDivisor;
    int m_iDifferentReligionAttitudeChangeLimit;
    int m_iAlignment;
    int m_iUseDeathAttitudeChange;
    int m_iUseEntropyAttitudeChange;
    int m_iHighCompassionAttitudeChange;
    int m_iLowCompassionAttitudeChange;

    int m_iBonusTradeAttitudeDivisor;
    int m_iBonusTradeAttitudeChangeLimit;[/codebox]


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

    Шаг третий: Приводим атрибуты в действие

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

    Модификаторы отношений описаны в файле CvPlayerAI.cpp, поэтому мы создали в нем 4 новых функции. Из кода можно увидеть, что здесь мы опередеяем, что же именно ознчает "UseDeath" (использовать смертельно колдовство) или "HighCompassion". В принципе, цивилизация применяет модификатор iUseDeathAttitudeChange, если у цивилизации-оппонента есть ресурс "магическая сила" (mana) в пределах столицы. Если мы хотим изменить это определение (заглянуть во все города, чтобы проверить производятся ли "смертоносные" отряды и т.д.), мы опише это в этих функциях.

    CvPlayerAI.cpp

    [codebox]int CvPlayerAI::AI_getAlignmentAttitude(PlayerTypes ePlayer)
    {
    int iAttitude;

    iAttitude = 0;

    if (GC.getLeaderHeadInfo(getPersonalityType()).getAlignment() == 1)
    {
    if (GC.getLeaderHeadInfo(GET_PLAYER(ePlayer).getPersonalityType()).getAlignment() == 1)
    {
    iAttitude = 2;
    }
    if (GC.getLeaderHeadInfo(GET_PLAYER(ePlayer).getPersonalityType()).getAlignment() == 0)
    {
    iAttitude = 0;
    }
    if (GC.getLeaderHeadInfo(GET_PLAYER(ePlayer).getPersonalityType()).getAlignment() == -1)
    {
    iAttitude = -6;
    }
    }
    if (GC.getLeaderHeadInfo(getPersonalityType()).getAlignment() == 0)
    {
    if (GC.getLeaderHeadInfo(GET_PLAYER(ePlayer).getPersonalityType()).getAlignment() == 1)
    {
    iAttitude = -2;
    }
    if (GC.getLeaderHeadInfo(GET_PLAYER(ePlayer).getPersonalityType()).getAlignment() == 0)
    {
    iAttitude = 0;
    }
    if (GC.getLeaderHeadInfo(GET_PLAYER(ePlayer).getPersonalityType()).getAlignment() == -1)
    {
    iAttitude = -2;
    }
    }
    if (GC.getLeaderHeadInfo(getPersonalityType()).getAlignment() == -1)
    {
    if (GC.getLeaderHeadInfo(GET_PLAYER(ePlayer).getPersonalityType()).getAlignment() == 1)
    {
    iAttitude = -4;
    }
    if (GC.getLeaderHeadInfo(GET_PLAYER(ePlayer).getPersonalityType()).getAlignment() == 0)
    {
    iAttitude = -2;
    }
    if (GC.getLeaderHeadInfo(GET_PLAYER(ePlayer).getPersonalityType()).getAlignment() == -1)
    {
    iAttitude = 2;
    }
    }

    return iAttitude;
    }

    int CvPlayerAI::AI_getUseDeathAttitude(PlayerTypes ePlayer)
    {
    int iAttitude;

    iAttitude = 0;

    if (GET_PLAYER(ePlayer).getCapitalCity() != NULL)
    {
    if (GET_PLAYER(ePlayer).getCapitalCity()->hasBonus((BonusTypes)GC.getInfoTypeForString("BONUS_MANA_DEATH")))
    {
    iAttitude += GC.getLeaderHeadInfo(getPersonalityType()).getUseDeathAttitudeChange();
    }
    }

    return iAttitude;
    }

    int CvPlayerAI::AI_getUseEntropyAttitude(PlayerTypes ePlayer)
    {
    int iAttitude;

    iAttitude = 0;

    if (GET_PLAYER(ePlayer).getCapitalCity() != NULL)
    {
    if (GET_PLAYER(ePlayer).getCapitalCity()->hasBonus((BonusTypes)GC.getInfoTypeForString("BONUS_MANA_ENTROPY")))
    {
    iAttitude += GC.getLeaderHeadInfo(getPersonalityType()).getUseEntropyAttitudeChange();
    }
    }

    return iAttitude;
    }

    int CvPlayerAI::AI_getHighCompassionAttitude(PlayerTypes ePlayer)
    {
    int iAttitude;

    iAttitude = 0;

    if (GET_PLAYER(ePlayer).getCivics((CivicOptionTypes)GC.getInfoTypeForString("CIVICOPTION_COMPASSION")) == (CivicOptionTypes)GC.getInfoTypeForString("CIVIC_PUBLIC_HEALERS") ||
    GET_PLAYER(ePlayer).getCivics((CivicOptionTypes)GC.getInfoTypeForString("CIVICOPTION_COMPASSION")) == (CivicOptionTypes)GC.getInfoTypeForString("CIVIC_PROTECT_THE_MEET"))
    {
    iAttitude += GC.getLeaderHeadInfo(getPersonalityType()).getHighCompassionAttitudeChange();
    }

    return iAttitude;
    }

    int CvPlayerAI::AI_getLowCompassionAttitude(PlayerTypes ePlayer)
    {
    int iAttitude;

    iAttitude = 0;

    if (GET_PLAYER(ePlayer).getCivics((CivicOptionTypes)GC.getInfoTypeForString("CIVICOPTION_COMPASSION")) == (CivicOptionTypes)GC.getInfoTypeForString("CIVIC_FEND_FOR_THEMSELVES") ||
    GET_PLAYER(ePlayer).getCivics((CivicOptionTypes)GC.getInfoTypeForString("CIVICOPTION_COMPASSION")) == (CivicOptionTypes)GC.getInfoTypeForString("CIVIC_SACRIFICE_THE_WEAK"))
    {
    iAttitude += GC.getLeaderHeadInfo(getPersonalityType()).getLowCompassionAttitudeChange();
    }

    return iAttitude;
    }
    [/codebox]

    Теперь мы должны заставить функцию, вычисляющую отношение, запрашивать модификатор у вышеописанных функций. Это делается в функции CvPlayerAI::AI_getAttitudeVal(PlayerTypes ePlayer).

    [codebox] iAttitude += AI_getSameReligionAttitude(ePlayer);
    iAttitude += AI_getDifferentReligionAttitude(ePlayer);
    iAttitude += AI_getAlignmentAttitude(ePlayer);
    iAttitude += AI_getUseDeathAttitude(ePlayer);
    iAttitude += AI_getUseEntropyAttitude(ePlayer);
    iAttitude += AI_getHighCompassionAttitude(ePlayer);
    iAttitude += AI_getLowCompassionAttitude(ePlayer);

    iAttitude += AI_getBonusTradeAttitude(ePlayer);[/codebox]


    И в последнюю очередь мы должны дать определение 4 новым функциям, которые мы создали в файле CvPlayerAI.h .

    CvPlayerAI.h


    [codebox] int AI_getSameReligionAttitude(PlayerTypes ePlayer);
    int AI_getDifferentReligionAttitude(PlayerTypes ePlayer);
    int AI_getAlignmentAttitude(PlayerTypes ePlayer);
    int AI_getUseDeathAttitude(PlayerTypes ePlayer);
    int AI_getUseEntropyAttitude(PlayerTypes ePlayer);
    int AI_getHighCompassionAttitude(PlayerTypes ePlayer);
    int AI_getLowCompassionAttitude(PlayerTypes ePlayer);

    int AI_getBonusTradeAttitude(PlayerTypes ePlayer);[/codebox]


    Вот и все. На первый взгляд кажется, что это очень трудоемкая процедура, но теперь, когда мы имеем новые атрибуты, которым мы дали определение, мы можем приписать их к каждому лидеру через xml, что значительно облегчает жизнь. Кроме этого, теперь, когда мы проделали всю тяжкую работу, делающую доступным чтение атрибутов из XML движком игры и связывающую их с любым лидером, мы можем с легкостью вызвать их в любой новой функции, которую мы добавляем.


    Шаг четвертый (опционально): Отображение нововведений в окне дипломатии

    Спасибо Chalid за то, что показал мне как это сделать. CvGameTextMgr.cpp содержит игровой текст. Следущее дополнение в CvGameTextMgr::getAttitudeString позволит изменениям в отношениях отображаться в окне дипломатии.

    CvGameTextMgr.cpp

    [codebox] iAttitudeChange = GET_PLAYER(ePlayer).AI_getAlignmentAttitude(eTargetPlayer);
    if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
    {
    if (GC.getLeaderHeadInfo(GET_PLAYER(eTargetPlayer).getPersonalityType()).getAlignment() == 1)
    {
    szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_GOOD_ALIGNMENT", iAttitudeChange).GetCString());
    szBuffer += NEWLINE + szTempBuffer;
    }
    if (GC.getLeaderHeadInfo(GET_PLAYER(eTargetPlayer).getPersonalityType()).getAlignment() == 0)
    {
    szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_NEUTRAL_ALIGNMENT", iAttitudeChange).GetCString());
    szBuffer += NEWLINE + szTempBuffer;
    }
    if (GC.getLeaderHeadInfo(GET_PLAYER(eTargetPlayer).getPersonalityType()).getAlignment() == -1)
    {
    szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_EVIL_ALIGNMENT", iAttitudeChange).GetCString());
    szBuffer += NEWLINE + szTempBuffer;
    }
    } iAttitudeChange = GET_PLAYER(ePlayer).AI_getUseDeathAttitude(eTargetPlayer);
    if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
    {
    szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_DEATH_USE", iAttitudeChange).GetCString());
    szBuffer += NEWLINE + szTempBuffer;
    }
    iAttitudeChange = GET_PLAYER(ePlayer).AI_getUseEntropyAttitude(eTargetPlayer);
    if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
    {
    szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_ENTROPY_USE", iAttitudeChange).GetCString());
    szBuffer += NEWLINE + szTempBuffer;
    }
    iAttitudeChange = GET_PLAYER(ePlayer).AI_getHighCompassionAttitude(eTargetPlayer);
    if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
    {
    szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_HIGH_COMPASSION", iAttitudeChange).GetCString());
    szBuffer += NEWLINE + szTempBuffer;
    }
    iAttitudeChange = GET_PLAYER(ePlayer).AI_getLowCompassionAttitude(eTargetPlayer);
    if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
    {
    szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_LOW_COMPASSION", iAttitudeChange).GetCString());
    szBuffer += NEWLINE + szTempBuffer;
    }
    [/codebox]

    И естественно, текстовые строки использованные в коде выше должны быть зафиксированы в одном из файлов в директории ‘/Assets/xml/text/’. Я использовал следующие определения, но вы можете адаптировать их под свой мод.


    CIV4GameText_FFH2.xml
    (или любой другой файл в директории ‘/Assets/xml/text’ )

    [codebox] <TEXT>
    <Tag>TXT_KEY_MISC_ATTITUDE_EVIL_ALIGNMENT</Tag>
    <English>%D1: "You are Evil."</English>
    <French>%D1: "You are Evil."</French>
    <German>%D1: "You are Evil."</German>
    <Italian>%D1: "You are Evil."</Italian>
    <Spanish>%D1: "You are Evil."</Spanish>
    </TEXT>
    <TEXT>
    <Tag>TXT_KEY_MISC_ATTITUDE_GOOD_ALIGNMENT</Tag>
    <English>%D1: "You are Good."</English>
    <French>%D1: "You are Good."</French>
    <German>%D1: "You are Good."</German>
    <Italian>%D1: "You are Good."</Italian>
    <Spanish>%D1: "You are Good."</Spanish>
    </TEXT>
    <TEXT>
    <Tag>TXT_KEY_MISC_ATTITUDE_NEUTRAL_ALIGNMENT</Tag>
    <English>%D1: "You are Neutral."</English>
    <French>%D1: "You are Neutral."</French>
    <German>%D1: "You are Neutral."</German>
    <Italian>%D1: "You are Neutral."</Italian>
    <Spanish>%D1: "You are Neutral."</Spanish>
    </TEXT>
    <TEXT>
    <Tag>TXT_KEY_MISC_ATTITUDE_DEATH_USE</Tag>
    <English>%D1: "You use Death magic."</English>
    <French>%D1: "You use Death magic."</French>
    <German>%D1: "You use Death magic."</German>
    <Italian>%D1: "You use Death magic."</Italian>
    <Spanish>%D1: "You use Death magic."</Spanish>
    </TEXT>
    <TEXT>
    <Tag>TXT_KEY_MISC_ATTITUDE_ENTROPY_USE</Tag>
    <English>%D1: "You use Entropy magic."</English>
    <French>%D1: "You use Entropy magic."</French>
    <German>%D1: "You use Entropy magic."</German>
    <Italian>%D1: "You use Entropy magic."</Italian>
    <Spanish>%D1: "You use Entropy magic."</Spanish>
    </TEXT>
    <TEXT>
    <Tag>TXT_KEY_MISC_ATTITUDE_HIGH_COMPASSION</Tag>
    <English>%D1: "You treat your people well."</English>
    <French>%D1: "You treat your people well."</French>
    <German>%D1: "You treat your people well."</German>
    <Italian>%D1: "You treat your people well."</Italian>
    <Spanish>%D1: "You treat your people well."</Spanish>
    </TEXT>
    <TEXT>
    <Tag>TXT_KEY_MISC_ATTITUDE_LOW_COMPASSION</Tag>
    <English>%D1: "You treat your people poorly."</English>
    <French>%D1: "You treat your people poorly."</French>
    <German>%D1: "You treat your people poorly."</German>
    <Italian>%D1: "You treat your people poorly."</Italian>
    <Spanish>%D1: "You treat your people poorly."</Spanish>
    </TEXT>[/codebox]
    продвинь это сообщение в соцсеть:  
    Learn from yesterday, live for today, hope for tomorrow.
    Albert Einstein_______________________

  2. #2
    JCricket, спасибо!

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

    PS. На модиках надо <pre></pre> использовать для кода.
    продвинь это сообщение в соцсеть:  

  3. #3
    Бессмертный Аватар для JCricket


    Регистрация
    21.09.2005
    Адрес
    Roads of Israel
    Сообщений
    3,008
    Упаси ...
    В самом крайнем случае в группу самаритян-бездельников. И в мыслях ничего моддерировать и моделировать нет .

    За подсказку спасибо. Проверю.
    Красотааа!
    продвинь это сообщение в соцсеть:  
    Learn from yesterday, live for today, hope for tomorrow.
    Albert Einstein_______________________

  4. #4
    Оказывается у нас на форуме действует [codebox)!

    Я все про спойлеры думаю, а тут обнаружил этот codebox. Скрывает большие объемы кода и внутри работают всякие [b]. Очень удобно, по моему. JCricket, ты должна оценить)

    А FFH это супермод, который разрабатывает Kael. "Потрясающая конверсия для любителей фэнтази". Правда, ты непохожа на любительницу фэнтази, но мало ли...

    PS. Хм, сейчас зашел через IE, этот код почему то справа не ограничивается рамками страницы. А в Опере все так аккуратненько выглядит. Странно.
    продвинь это сообщение в соцсеть:  

  5. #5
    Король Аватар для Blacksun


    Регистрация
    10.05.2006
    Адрес
    М.О. г. Раменское
    Сообщений
    1,873
    NM - опять ты у меня статью тиснул... (Она же, как учебное пособие...)
    продвинь это сообщение в соцсеть:  
    Программирование - это не то, что ты думаешь.... - Это то, что думает о тебе компьютер.
    http://blacksun.civfanatics.ru
    -------------------------------------------------
    MTDG2 - [civ]christianity[/civ]Монархия
    ---------------------------------
    Председатель CFR Awards 2007
    ---------------------------------
    Председатель CFR Awards 2008

  6. #6
    Бессмертный Аватар для JCricket


    Регистрация
    21.09.2005
    Адрес
    Roads of Israel
    Сообщений
    3,008


    [codebox]
    В FF тоже все нормально выглядит.
    Даже смайлы работают! Красотааааа! [/codebox]
    <div class='quotetop'>Цитата</div>
    А FFH это супермод, который разрабатывает Kael. "Потрясающая конверсия для любителей фэнтази". Правда, ты непохожа на любительницу фэнтази, но мало ли...
    [/b]
    Не, я не просто непохожа, я очень непохожа.
    Я вообще "немножко" офигела, когда начала читать эту статью.
    "Death Magic" завел меня в полный тупик . Еще немного и я бы подумала, что Блэксан надо мной приколоться решил.

    Фантазия цивфанатов неисчерпаема!
    продвинь это сообщение в соцсеть:  
    Learn from yesterday, live for today, hope for tomorrow.
    Albert Einstein_______________________

+ Ответить в теме

Ваши права

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

free counters