+ Ответить в теме
Страница 1 из 6 12 ... ПоследняяПоследняя
Показано с 1 по 20 из 111

Тема: Осваиваем SDK. Описание SDK.

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


    Регистрация
    10.05.2006
    Адрес
    М.О. г. Раменское
    Сообщений
    1,873

    Red face

    Ресурсы по проекту "Осваиваем SDK".

    Раздел по SDK на "модиках"

    * Уроки C++ - вопросы-ответы по основам SDK
    * Связь SDK и Python. Вызов функций, описанных в СДК, через Питон.
    * Добавление новых XML атрибутов и их использование в SDK

    * * * * *


    Сколько месяцев прошло, а про SDK в модиках не написано ни слова. Возможно это происходит потому, что там лежит слишком огромный объем информации и осмыслить его одному человеку, за такое короткое время, практически не под силу. Поэтому я попытаюсь начать осмысливание той информации, что лежит в SDK. Оговорюсь сразу – одному мне это тоже не под силу, ведь кроме того, что надо копаться в SDK – надо еще ходить на работу, заниматься с семьей и т.д. и т.п. (А еще надо хоть иногда и поспать).
    ПОЭТОМУ – я призываю всех, кто хоть в чем то разобрался в SDK писать в эту тему. Потом, по возможности, можно будет переносить законченные блоки в «модики».
    Кстати – это касается не только тех, кто программирует на Cpp, но и тех, кто программирует на Питоне. Ведь практически все классы и функции из SDK передаются в Питон. А SDK использует некоторые функции Питона. А управлять SDK – лучше все –таки из Питона.
    Если программисты будут знать, как работает та, или иная функция, написанная в SDK, то они смогут делать более качественные моды, и новых функций у этих модов будет гораздо больше.

    НАЧАЛО:

    Если кто видел весь пакет SDK, он наверное обратил внимание, на то, что одни файлы начинаются с букв Cv…, а другие с букв Cy… . Может это и не новость, но в Visual Studio 2003 (в дальнейшем VS) – файлы, которые начинаются с Cy вынесены в отдельную папку – CyPython. А если рассматривать их более внимательно, то можно заметить, что названия классов и функций, содержащихся в файлах Cv…, повторяются в файлах Cy… (только с приставкой Cy). Это скорее всего сделано описание классов и функций SDK для Питона. Значит для изучения у нас осталась всего лишь половина файлов (приблизительно). И разобраться с «чего же начинается Родина» можно только, если заберешься в само SDK.
    А начинается она с класса CvGame. Именно в этом классе есть функции, которые не вызываются больше ниоткуда. (см. список функций и переменных класса CvGame в файле CvGame.h).

    Как видите функций очень много (и так в каждом файле). Поэтому описать их в одиночку практически невозможно. Лучше будет, если описывать их будут все, кто может это сделать. У всех функций описание дано в их названии. Практически надо только перевести название функций и все станет ясно. Правда если что то надо уточнить придется смотреть всю функцию.
    Из файла заголовка (благо там есть какие то комментарии) видно, что часть экспортируемых функций не передается в Питон (DllExport). Часть этих функций – (setInitialItems, regenerateMap,… ) вызывается из других функций SDK. Другая часть – (initDiplomacy, update,…) вероятнее всего вызываются из самого движка.(Кстати первая часть тоже скорее всего используется движком). Третья часть функций используется самим классом (или SDK, если они public). Так вот, те функции которые вызываются из движка наверное и будут начальными (для SDK). Если мы уже вошли в игру, то будет выполняться функция update() класса CvGame.

    [codebox]void CvGame::update()
    {
    PROFILE("CvGame::update");

    if (!gDLL->GetWorldBuilderMode())
    {
    sendPlayerOptions();

    // sample generic event
    CyArgsList pyArgs;
    pyArgs.add(getTurnSlice());
    gDLL->getEventReporterIFace()->genericEvent("gameUpdate", pyArgs.makeFunctionArgs());

    if (getTurnSlice() == 0)
    {
    gDLL->getEngineIFace()->AutoSave(true);
    }

    if (getNumGameTurnActive() == 0)
    {
    if (!isPbem() || !getPbemTurnSent())
    {
    doTurn();
    }
    }

    updateScore();

    updateWar();

    updateMoves();

    updateTimers();

    updateTurnTimer();

    AI_updateAssignWork();

    testAlive();

    if ((getAIAutoPlay() == 0) && !(gDLL->GetAutorun()))
    {
    if (countHumanPlayersAlive() == 0)
    {
    setGameState(GAMESTATE_OVER);
    }
    }

    changeTurnSlice(1);
    }
    }
    [/codebox]


    Как видите она, при определенных условиях вызывает функцию doTurn (), что практически означает нажать кнопку End Of Turn. Начало Turnа найдено, дальше можно смотреть, как оно (это начало) активирует все остальные объекты Цивы (очень многие классы в своем теле имеют свою функцию doTurn() (например: CvPlot, CvCity, CvUnit,…)
    На этом пока все. (жара не дает сосредоточиться). Дальше будем рассматривать уже конкретные классы и возможно с примерами. Если Вы что то знаете о функциях и классах SDK, то пишите прямо в эту тему. Если я где-то ошибся, тоже пишите в эту тему, буду поправляться.
    продвинь это сообщение в соцсеть:  
    Программирование - это не то, что ты думаешь.... - Это то, что думает о тебе компьютер.
    http://blacksun.civfanatics.ru
    -------------------------------------------------
    MTDG2 - [civ]christianity[/civ]Монархия
    ---------------------------------
    Председатель CFR Awards 2007
    ---------------------------------
    Председатель CFR Awards 2008

  2. #2
    Очень интересно!

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

    Например, я нашел четкое подтверждение предположению о том, что зависимость качества отношений от количества именно (-10;-3;3;10). Помимо этого, там очень много информации, которая будет весьма интересна именно для игроков, а не только для моддеров.

    На модиках "не написано ни слова", потому что там вообще пока мало кто пишет, мягко говоря. А тем, кто пишет, надо еще работать, спать....да и поиграть иногда хотелось бы Так что, you are welcome на модики!

    PS. Чувство одиночества у тебя не совсем правильное. На их-фанатиках SDK занимаются много моддеров, стоит туда заглядывать, чтобы не изобретать те части велосипеда, которые уже "в игре".
    продвинь это сообщение в соцсеть:  

  3. #3
    Blacksun, займешься описанием SDKна модиках? Если да, то милости просим. Мы будем только рады .
    Если возникнут какие-то вопросы, то не стесняйся - задавай мне и NeverMind'у.
    продвинь это сообщение в соцсеть:  

  4. #4
    Мракоборец на консервации

    Аватар для White Hawk


    Регистрация
    07.11.2005
    Адрес
    где я только не живу
    Сообщений
    7,653
    Чорное Солнце, организуй нас.

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

    ЗЫ
    Боже, Боже, ещё один хомут на себя надеваю. Во дурак....
    ЗЗЫ
    В рабочие дни пиши в асю (в личке)
    продвинь это сообщение в соцсеть:  
    The Settlers Online, Эвеланс, Соломон Окотопус, Гильдия "Верные сердца inGame [heart]". Дружим?
    Вокс, где брат твой - Виго?
    Гость вечно живой! (Гость жил! Гость жив! Гость вечно будет жить!)

  5. #5
    А есть какие нибудь программы для просмотра этих .cpp файлов не в виде простого текста, а чтобы была видна структура по командам/инструкциям?
    продвинь это сообщение в соцсеть:  

  6. #6
    <div class='quotetop'>Цитата(NeverMind * 24.6.2006, 23:05) [snapback]106379[/snapback]</div>
    А есть какие нибудь программы для просмотра этих .cpp файлов не в виде простого текста, а чтобы была видна структура по командам/инструкциям?
    [/b]
    Лучше всего редактировать в Microsoft Visual Studio.
    продвинь это сообщение в соцсеть:  

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


    Регистрация
    10.05.2006
    Адрес
    М.О. г. Раменское
    Сообщений
    1,873

    Cool

    Я очень рад, что народ подтягивается. Значит есть надежда, что отсюда пойдут целые блоки по описанию SDK в модики. Но объем очень большой и быстрых результатов ждать не приходится, но..., начало положено. Теперь маленькие хитрости и орг. вопросы.
    1. Как это не парадоксально - но копаться в SDK - лучше в Visual Studio 2005 платформа. Почему - объясню. После того, как ты скомпилируешь SDK (с ошибками) - он тебе показывает не только классы, но и какие классы вызывает класс (по моему до самого конца - он даже цепляет Boost_Python). - это первое - а это очень удобно.

    2. По поводу их фанатиков. Кричу на всю страну (хоть и стыдно) - я не знаю английского в той степени, чтобы копаться на их форуме. Можно конечно попробовать и через PROMPT, но как он переводит вы знаете, да и время перевод занимает много. Поэтому - если найдется человек, который может лазить по их фанатикам и кидать ссылки (с кратким описанием, чего там лежит) сюда, то я буду очень рад.
    3. NewerMind - умоляю тебя - не разбрасывай все по отдельным темам, а то мы потом не соберем все в кучу.
    4. С чего начинать. У нас в модиках дано очень много описаний XML файлов. Так вот классы в Срр - практически повторяют эти XML - и поэтому описание входных данных может занять не так много времени, поэтому начинать, наверное, надо с XML прототипов. Тем более что все функции там практически одинаковы. Классы этих прототипов имеют функции get.... для чтения переменных, и лежат они почти все в CvInfo.cpp (И... давайте подумаем, может и не стоит описывать эти классы, ведь получается, что они уже описаны...) Но хотя бы их перечисление надо дать.
    5. Чтобы легче было разбираться... Если в срр встречается чего нибудь типа get.....Info (e....).getTime().get... - то это однозначно, что значение взято из XML.

    6. Вот полный список фсех файлов SDK

    CvArea.cpp
    CvArtFileMgr.cpp
    CvCity.cpp
    CvCityAI.cpp
    CvDeal.cpp
    CvDiploParameters
    CvButtonPopup.cpp
    CvDLLEntity.cpp
    CvDLLPython.cpp
    CvDLLWidgetData.cpp
    CvFractal.cpp
    CvGame.cpp
    CvGameAI.cpp
    CvGameCoreDLL.cpp
    CvGameCoreUtils.cpp
    CvGameTextMgr.cpp - вывод текстов на экран
    CvGlobals.cpp
    CvHallOfFameInfo.cpp
    CvInfos.cpp
    CvInfoWater.cpp
    CvInitCore.cpp
    CvMap.cpp При установке нового мира
    CvMapGenerator.cpp Так же
    CvPlayer.cpp
    CvPlayerAI.cpp
    CvPlot.cpp
    CvPlotGroup.cpp
    CvPopupInfo.cpp
    CvPopupReturn.cpp
    CvRandom.cpp
    CvReplayInfo.cpp В последнюю (самую) очередь
    CvReplayMessage.cpp То же
    CvSelectionGroup.cpp
    CvSelectionGroupAI.cpp
    CvStructs.cpp
    CvTalkingHeadMessage.cpp
    CvTeam.cpp
    CvTeamAI.cpp
    CvUnit.cpp
    CvUnitAI.cpp

    Загрузка XML - файлов - здесь только найти список XML - у которых классы создаются автоматом
    CvXMLLoadUtility.cpp
    CvXMLLoadUtilityGet.cpp
    CvXMLLoadUtilityInit.cpp
    CvXMLLoadUtilitySet.cpp

    Сторож брату моему (сторож ошибок) - если кто хочет, посмотрите
    Fassert.cpp

    не смотрел
    FdialogTemplate.cpp

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

    Здесь используется венгерская нотация, и , мы с vpadlo посоветовались и решили, что лучше смотреть по h (описателю) файлу и просто пока переводить имена функций (обычно имена говорят сами за себя),
    а потом, если что то непонятно, то придется просматривать всю функцию.

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

    Ну вот вроде бы и все. - НАЛЕТАЙ НАРОД

    ЗЫ. Простите меня программисты Питона, совсем про вас забыл - присоединяйтесь, ведь описание питоновских файлов тоже очень важно для того, чтобы понять - а что же все таки происходит в Циве, да и возможно здесь вы узнаете про новые возможности, которые вам может предоставить SDK...
    продвинь это сообщение в соцсеть:  
    Программирование - это не то, что ты думаешь.... - Это то, что думает о тебе компьютер.
    http://blacksun.civfanatics.ru
    -------------------------------------------------
    MTDG2 - [civ]christianity[/civ]Монархия
    ---------------------------------
    Председатель CFR Awards 2007
    ---------------------------------
    Председатель CFR Awards 2008

  8. #8

    Red face

    Код:
    CvPlayerAI.cpp
    int CvPlayerAI::AI_diploVote(VoteTypes eVote);
    Приметка:
    1. Надпись в описании типа max(число_1, число_2) означает что в формулу будет подставлено большее из значений(число_1 или число_2).
    2. Слово result в описании означает, что при этом условии ф-ция завершает свою работу и даёт результат.

    Функция отвечает за выбор AI при голосовании.
    Внимание! За достоверность и точность ниже следуещей информации не несу. Так что смотрите, исправляйте, дополняйте.
    Всю функцию можно разбить на две части(голосование TeamVote и остальные), вторую на несколько независящих цепочек. Каждая из которых выполняется при своём типе голосования.
    [code]
    продвинь это сообщение в соцсеть:  

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


    Регистрация
    10.05.2006
    Адрес
    М.О. г. Раменское
    Сообщений
    1,873
    Связь SDK и XML.

    Как только вы запускаете игру, вы видите Init Python, init XML, Init engine, и т.д. в общем Цива проверяет наличие всех необходимых, для нормальной работы, компонентов. В том числе и наличие XML файлов. SDK, считывает информацию из XML файлов и готовит объекты для игры. В свою очередь напомню – класс это описатель всех переменных и функций, которые работают с этими переменными. На основе классов готовятся объекты. (при этом класс один – а объектов может быть много). Но и объект может описываться при помощи нескольких классов. Например объект Build (класс CvBuildInfo) он описывается в 3 или 4х классах (смотря что Build). На примере этого класса мы и рассмотрим связь SDK и XML файлов.

    Описание класса CvBuildInfo есть на модиках (описание Civ4CvBuildInfoXML). Поэтому я не буду описывать каждую переменную, просто приведу пример программы, как это описывается со своими комментариями. Описание в SDK – лежит в файле CvInfos.cpp. Причем, как я понял здесь описаны не все функции класса CvBuildInfo. Где они еще описаны – это мы посмотрим потом, а сейчас посмотрим, как считывается XML файл:

    [codebox]
    //====================================================================
    // CvBuildInfo
    //====================================================================

    //------------------------------------------------------------------------------------------------------
    //
    // FUNCTION: CvBuildInfo()
    //
    // PURPOSE : Default constructor
    //
    //------------------------------------------------------------------------------------------------------
    CvBuildInfo::CvBuildInfo() :
    m_iTime(0), //Переменные описанные в Civ4CvBuildInfo
    m_iTechPrereq(NO_TECH),
    m_iImprovement(NO_IMPROVEMENT),
    m_iRoute(NO_ROUTE),
    m_iEntityEvent(ENTEVENT_NONE),
    m_iMissionType(NO_MISSION),
    m_bKill(false),
    m_paiFeatureTech(NULL),
    m_paiFeatureTime(NULL),
    m_paiFeatureProduction(NULL),
    m_pabFeatureRemove(NULL)
    {
    }

    //------------------------------------------------------------------------------------------------------
    //
    // FUNCTION: ~CvBuildInfo()
    //
    // PURPOSE : Default destructor
    //
    //------------------------------------------------------------------------------------------------------
    CvBuildInfo::~CvBuildInfo()
    {
    SAFE_DELETE_ARRAY(m_paiFeatureTech);
    SAFE_DELETE_ARRAY(m_paiFeatureTime);
    SAFE_DELETE_ARRAY(m_paiFeatureProduction);
    SAFE_DELETE_ARRAY(m_pabFeatureRemove);
    }

    int CvBuildInfo::getTime() const
    {
    return m_iTime;
    }

    int CvBuildInfo::getTechPrereq() const
    {
    return m_iTechPrereq;
    }

    int CvBuildInfo::getImprovement() const
    {
    return m_iImprovement;
    }

    int CvBuildInfo::getRoute() const
    {
    return m_iRoute;
    }

    int CvBuildInfo::getEntityEvent() const
    {
    return m_iEntityEvent;
    }

    int CvBuildInfo::getMissionType() const
    {
    return m_iMissionType;
    }

    void CvBuildInfo::setMissionType(int iNewType)
    {
    m_iMissionType = iNewType;
    }

    bool CvBuildInfo::isKill() const
    {
    return m_bKill;
    }

    // Arrays

    int CvBuildInfo::getFeatureTech(int i) const
    {
    FAssertMsg(i < GC.getNumFeatureInfos(), "Index out of bounds");
    FAssertMsg(i > -1, "Index out of bounds");
    return m_paiFeatureTech ? m_paiFeatureTech[i] : -1;
    }

    int CvBuildInfo::getFeatureTime(int i) const
    {
    FAssertMsg(i < GC.getNumFeatureInfos(), "Index out of bounds");
    FAssertMsg(i > -1, "Index out of bounds");
    return m_paiFeatureTime ? m_paiFeatureTime[i] : -1;
    }

    int CvBuildInfo::getFeatureProduction(int i) const
    {
    FAssertMsg(i < GC.getNumFeatureInfos(), "Index out of bounds");
    FAssertMsg(i > -1, "Index out of bounds");
    return m_paiFeatureProduction ? m_paiFeatureProduction[i] : -1;
    }

    bool CvBuildInfo::isFeatureRemove(int i) const
    {
    FAssertMsg(i < GC.getNumFeatureInfos(), "Index out of bounds");
    FAssertMsg(i > -1, "Index out of bounds");
    return m_pabFeatureRemove ? m_pabFeatureRemove[i] : false;
    }

    bool CvBuildInfo::read(CvXMLLoadUtility* pXML)
    {
    CvString szTextVal;
    if (!CvHotkeyInfo::read(pXML))
    {
    return false;
    }

    pXML->GetChildXmlValByName(szTextVal, "PrereqTech");
    m_iTechPrereq = pXML->FindInInfoClass(szTextVal, GC.getTechInfo(), sizeof(GC.getTechInfo((TechTypes)0)), GC.getNumTechInfos());

    pXML->GetChildXmlValByName(&m_iTime, "iTime");
    pXML->GetChildXmlValByName(&m_bKill, "bKill");

    pXML->GetChildXmlValByName(szTextVal, "ImprovementType");
    m_iImprovement = pXML->FindInInfoClass(szTextVal, GC.getImprovementInfo(), sizeof(GC.getImprovementInfo((ImprovementTypes)0)), GC.getNumImprovementInfos());
    pXML->GetChildXmlValByName(szTextVal, "RouteType");
    m_iRoute = pXML->FindInInfoClass(szTextVal, GC.getRouteInfo(), sizeof(GC.getRouteInfo((RouteTypes)0)), GC.getNumRouteInfos());
    pXML->GetChildXmlValByName(szTextVal, "EntityEvent");
    m_iEntityEvent = pXML->FindInInfoClass(szTextVal, GC.getEntityEventInfo(), sizeof(GC.getEntityEventInfo((EntityEventTypes)0)),
    GC.getNumEntityEventInfos());

    pXML->SetFeatureStruct(&m_paiFeatureTech, &m_paiFeatureTime, &m_paiFeatureProduction, &m_pabFeatureRemove);

    return true;
    }
    [/codebox]

    Первая функция – это конструктор, которая устанавливает начальные значения для переменных. Вторая функция – это деструктор, которая высвобождает память (вызывается при разрушении объекта). Конструктор вызывается каждый раз, когда идет обращение к классу, Функция CvBuildInfo::read инициализирует переменные конкретного Build-a. В итоге получается, что переменных будет столько, сколько описано Build-ов в файле Civ4BuildInfos.XML, а функции будут храниться в памяти только в единственном экземпляре. Чтобы вызвать конкретно ту функцию, которая вас интересует, вам придется написать примерно так:

    iTime = GC.getBuildInfo (eBuild).getTime();

    eBuild – описывается в Срр как:

    BuildTypes eBuild;

    eBuild – это конкретно BUILD_ROAD, BUILD_RAILROAD, BUILD_FARM и т.д. или эквивалент 0,1,2,…(идут по порядку друг за другом).

    Поэтому при вызове функции время возьмется то, для какого Build-а оно предназначено. Ну а само значение eBuild устанавливается при нажатии на кнопку у рабочего.
    Те функции Build – у которых стоит ImprovementType (в XML) обрабатываются в классе Improvement, соответственно те у которых RouteType – обрабатываются в классе Route.(Там подставляются кнопки) Но потом все они приходят в класс CvPlot.
    При считывании Civ4CvBuildInfo.XML одновременно с установкой класса CvBuildInfo Устанавливается класс CvHotKeyInfo (if (!CvHotkeyInfo::read(pXML))) Причем, если вы забудете указать клавиши в XML файле, ваш класс не инициализируется и будет выдана ошибка при загрузке. (Вот так объект Build описывается уже двумя классами – а где то есть еще описание и Button). Загрузка массива (Arrays) происходит совсем в другом месте (вероятнее всего в классе XML). Видно про него забыли, когда писали программу (или в том месте его легче загружать).
    [codebox]//------------------------------------------------------------------------------------------------------
    //
    // FUNCTION: SetFeatureStruct(int** ppiFeatureTech, int** ppiFeatureTime, int** ppiFeatureProduction, bool** ppbFeatureRemove)
    //
    // PURPOSE : allocate and set the feature struct variables for the CvBuildInfo class
    //
    //------------------------------------------------------------------------------------------------------
    void CvXMLLoadUtility::SetFeatureStruct(int** ppiFeatureTech, int** ppiFeatureTime, int** ppiFeatureProduction, bool** ppbFeatureRemove)
    {
    int i=0; //loop counter
    int iNumSibs; // the number of siblings the current xml node has
    int iFeatureIndex;
    TCHAR szTextVal[256]; // temporarily hold the text value of the current xml node
    int* paiFeatureTech = NULL;
    int* paiFeatureTime = NULL;
    int* paiFeatureProduction = NULL;
    bool* pabFeatureRemove = NULL;

    if(GC.getNumFeatureInfos() < 1)
    {
    char szMessage[1024];
    sprintf( szMessage, "no feature infos set yet! \n Current XML file is: %s", GC.getCurrentXMLFile().GetCString());
    gDLL->MessageBox(szMessage, "XML Error");
    }
    InitList(ppiFeatureTech, GC.getNumFeatureInfos(), -1);
    InitList(ppiFeatureTime, GC.getNumFeatureInfos());
    InitList(ppiFeatureProduction, GC.getNumFeatureInfos());
    InitList(ppbFeatureRemove, GC.getNumFeatureInfos());

    paiFeatureTech = *ppiFeatureTech;
    paiFeatureTime = *ppiFeatureTime;
    paiFeatureProduction = *ppiFeatureProduction;
    pabFeatureRemove = *ppbFeatureRemove;

    if (gDLL->getXMLIFace()->SetToChildByTagName(m_pFXml,"FeatureStructs"))
    {
    iNumSibs = gDLL->getXMLIFace()->GetNumChildren(m_pFXml);

    if (0 < iNumSibs)
    {
    if (gDLL->getXMLIFace()->SetToChildByTagName(m_pFXml,"FeatureStruct"))
    {
    if(!(iNumSibs <= GC.getNumFeatureInfos()))
    {
    char szMessage[1024];
    sprintf( szMessage, "iNumSibs is greater than GC.getNumFeatureInfos in SetFeatureStruct function \n Current XML file is: %s", GC.getCurrentXMLFile().GetCString());
    gDLL->MessageBox(szMessage, "XML Error");
    }
    for (i=0;i<iNumSibs;i++)
    {
    GetChildXmlValByName(szTextVal, "FeatureType");
    iFeatureIndex = FindInInfoClass(szTextVal, GC.getFeatureInfo(), sizeof(GC.getFeatureInfo((FeatureTypes) 0)), GC.getNumFeatureInfos());
    if(!(iFeatureIndex != -1))
    {
    char szMessage[1024];
    sprintf( szMessage, "iFeatureIndex is -1 inside SetFeatureStruct function \n Current XML file is: %s", GC.getCurrentXMLFile().GetCString());
    gDLL->MessageBox(szMessage, "XML Error");
    }
    GetChildXmlValByName(szTextVal, "PrereqTech");
    paiFeatureTech[iFeatureIndex] = FindInInfoClass(szTextVal, GC.getTechInfo(), sizeof(GC.getTechInfo((TechTypes) 0)), GC.getNumTechInfos());
    GetChildXmlValByName(&paiFeatureTime[iFeatureIndex], "iTime");
    GetChildXmlValByName(&paiFeatureProduction[iFeatureIndex], "iProduction");
    GetChildXmlValByName(&pabFeatureRemove[iFeatureIndex], "bRemove");

    if (!gDLL->getXMLIFace()->NextSibling(m_pFXml))
    {
    break;
    }
    }

    gDLL->getXMLIFace()->SetToParent(m_pFXml);
    }
    }

    gDLL->getXMLIFace()->SetToParent(m_pFXml);
    }
    }
    [/codebox]

    Здесь устанавливается массив на проверку структуры (лес, джунгли, вернее их вырубка). И опять же эти переменные запоминаются в своих уникальных переменных и запоминаются также ссылки на них.
    После того, как мы посмотрим классы CvUnit и CvPlot мы попробуем поподробней разобрать этот класс. (Уже на примере какого нибудь конкретного Builda.)
    продвинь это сообщение в соцсеть:  
    Программирование - это не то, что ты думаешь.... - Это то, что думает о тебе компьютер.
    http://blacksun.civfanatics.ru
    -------------------------------------------------
    MTDG2 - [civ]christianity[/civ]Монархия
    ---------------------------------
    Председатель CFR Awards 2007
    ---------------------------------
    Председатель CFR Awards 2008

  10. #10
    <div class='quotetop'>Цитата</div>
    3. Если голосование за генсека, то он голосует за эту команду, если отношения > 0 (result), если голосование за политическую победу, то голосует при отношениях > 7 (result). Иначе воздерживается[/b]

    Вот где корова зарыта. Заставлял проводить голосования с самого начала игры. Казалось, что AI голусует за победу другого только при Friendly (+10), а за генсека только при Pleased (+3), но так было не всегда. Оказывается минимально необходимые отношения ниже на 3. И вообще, голосование зависит от количества, а не от качества отношения.
    продвинь это сообщение в соцсеть:  

  11. #11
    <div class='quotetop'>Цитата(NeverMind * 25.6.2006, 12:11) [snapback]106413[/snapback]</div>
    И вообще, голосование зависит от количества, а не от качества отношения.
    [/b]
    Прошу уточнить, что имеется в виду под кол-ом и под кач-ом отношения?

    <div class='quotetop'>Цитата(NeverMind * 25.6.2006, 12:11) [snapback]106413[/snapback]</div>
    И вообще, голосование зависит от количества, а не от качества отношения.
    [/b]
    Прошу уточнить, что имеется в виду под кол-ом и под кач-ом отношения?
    продвинь это сообщение в соцсеть:  

  12. #12
    Под количеством подразумевается AttitudeVal, под качестовом - AttitudeType.

    Зависимость между ними:

    [code]AttitudeTypes CvPlayerAI::AI_getAttitude(PlayerTypes ePlayer)
    {
    продвинь это сообщение в соцсеть:  

  13. #13
    <div class='quotetop'>Цитата(NeverMind * 25.6.2006, 13:10) [snapback]106416[/snapback]</div>
    Я думал, что и голосование привязано к AttitudeType, а не к AttitudeVal. Но указанный тобой код показывает что это не так.
    [/b]
    От AttitudeType также зависит
    часть голосования. Смотри мою статью. Если голосование не за генсека и не за диплом. победу, то следующим проверяется AttitudeType, если отношения дружеские, то AI голосует за.
    продвинь это сообщение в соцсеть:  

  14. #14
    Да смотрел, смотрел. Меня интересовала именно дипломатическая победа, я о ней.

    Originally posted by Blacksun
    3. NewerMind - умоляю тебя - не разбрасывай все по отдельным темам, а то мы потом не соберем все в кучу.
    Я бы согласился, но если тут в одной теме будет масса кода по разным файлам, и вопросы, и ответы, то это будет "куча", в которой разобраться еще трудней. Если этот проект вызовет достаточно энтузиазма, то, возможно, стоит создать отдельный подфорум, где для каждого важного файла была бы отдельная тема, в которой можно готовить его описание и задавать по нему вопросы. (?)

    PS. Вот тут описания классов Pуthon в Ц4. Должно пригодиться: http://civilization4.net/files/modding/PythonAPI_v160/
    продвинь это сообщение в соцсеть:  

  15. #15
    <div class='quotetop'>Цитата(NeverMind * 25.6.2006, 13:35) [snapback]106419[/snapback]</div>
    Я бы согласился, но если тут в одной теме будет масса кода по разным файлам, и вопросы, и ответы, то это будет "куча", в которой разобраться еще трудней. Если этот проект вызовет достаточно энтузиазма, то, возможно, стоит создать отдельный подфорум, где для каждого важного файла была бы отдельная тема, в которой можно готовить его описание и задавать по нему вопросы. (?)

    PS. Вот тут описания классов Pуthon в Ц4. Должно пригодиться: http://civilization4.net/files/modding/PythonAPI_v160/
    [/b]
    Открыть отдельный
    подфорум, идея хорошая, так как тема SDK очень обширная. Если у кого есть на это права, открывайте. Мы с Blacksun можем стать там модераторами. За ссылочку спасибо, еще не смотрел, но поскольку движок игры(не только этой, но и любой), плотно перекликается со скриптами, то действительно должно помочь.
    продвинь это сообщение в соцсеть:  

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


    Регистрация
    10.05.2006
    Адрес
    М.О. г. Раменское
    Сообщений
    1,873
    <div class='quotetop'>Цитата</div>
    Я бы согласился, но если тут в одной теме будет масса кода по разным файлам, и вопросы, и ответы, то это будет "куча", в которой разобраться еще трудней. Если этот проект вызовет достаточно энтузиазма, то, возможно, стоит создать отдельный подфорум, где для каждого важного файла была бы отдельная тема, в которой можно готовить его описание и задавать по нему вопросы. (?)

    PS. Вот тут описания классов Pуthon в Ц4. Должно пригодиться: http://civilization4.net/files/modding/PythonAPI_v160/
    [/b]
    В принципе да! Отдельные файлы занимают очень много информационного места. И удобочитаемость информации при этом теряется. (Даже найти то что тебе нужно будет очень трудно). Тогда эти файлы надо переносить в подфорумы, но чтобы все хранилось рядышком (желательно в алфавитном порядке).
    Тут у тебя опыта больше.
    Сылку, что ты дал - просто бесценна для программирования (что в SDK, что в Питоне). Нельзя ли как нибудь переместить эту инфу (пусть даже в таком виде) в модики Питона ? (Практически это финальный этап по программированию Цивы в Питоне). И еще Классы Питона оказались более полными, чем классы SDK. (В SDK используются многие методы Питоновских функций, которые никак не описаны в SDK).
    продвинь это сообщение в соцсеть:  
    Программирование - это не то, что ты думаешь.... - Это то, что думает о тебе компьютер.
    http://blacksun.civfanatics.ru
    -------------------------------------------------
    MTDG2 - [civ]christianity[/civ]Монархия
    ---------------------------------
    Председатель CFR Awards 2007
    ---------------------------------
    Председатель CFR Awards 2008

  17. #17

    Question

    Напоминаю, что на Модиках ведётся работа по сбору материала о SDK. Приветствуются все кто может помочь! Если вы можете описать хоть какую-то часть SDK, что нибудь дополнить, исправить, или вообще хоть как-то помочь, милости просим.
    продвинь это сообщение в соцсеть:  

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


    Регистрация
    10.05.2006
    Адрес
    М.О. г. Раменское
    Сообщений
    1,873
    Закончено описание класса CVPlot (Вернее в модики внесены все функции этого класса). Просьба к переводчикам - переведите пожалуйста названия функций!!!!!
    Если дело пойдет так и дальше, то описание возможностей SDK нам с vpadlo, делать будет некогда (мы будем только тупо делать описания классов....((((

    ЗЫ У меня временно отрубили нет (неполадки в системе) обещали через три дня сделать, но чего то ничего у них пока не получается....
    продвинь это сообщение в соцсеть:  
    Программирование - это не то, что ты думаешь.... - Это то, что думает о тебе компьютер.
    http://blacksun.civfanatics.ru
    -------------------------------------------------
    MTDG2 - [civ]christianity[/civ]Монархия
    ---------------------------------
    Председатель CFR Awards 2007
    ---------------------------------
    Председатель CFR Awards 2008

  19. #19
    Не расстраивайся. Я почти пол года с переменных успехом пытаюсь описывать XML. И ничего. Самое главное не переоценивать уровень общественного энтузиазма, чтобы потом не разочаровываться.

    Описывать классы это явно не для меня. Но я могу выкладывать описания некоторых функций SDK, которые мне попадаются и которые мне понятны (есть такие).

    PS. Симпатичный сайт
    продвинь это сообщение в соцсеть:  

  20. #20

    Консультант/разработчик Firaxis Games




    Регистрация
    18.10.2005
    Сообщений
    531


    Отличный топик! Конечно, не-программистам все равно сильно не поможет описание фукнций, но оттуда можно извлечь много интересного о победении ИИ. А вот моддерам очень пригодится - в общем, код очень хорошо организован и, по-моему, прост к пониманию.
    продвинь это сообщение в соцсеть:  
    Solver, консультант / разработчик Firaxis Games.

+ Ответить в теме
Страница 1 из 6 12 ... ПоследняяПоследняя

Ваши права

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

free counters