Ресурсы по проекту "Осваиваем 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
Очень интересно!
Я только на днях распаковал SDK и понял, что он может быть полезен даже для тех, кто не разбирается в программировании () С его помощью можно разобраться в механизме игры, в частности, в поведении AI игроков, которое меня очень интересует.
Например, я нашел четкое подтверждение предположению о том, что зависимость качества отношений от количества именно (-10;-3;3;10). Помимо этого, там очень много информации, которая будет весьма интересна именно для игроков, а не только для моддеров.
На модиках "не написано ни слова", потому что там вообще пока мало кто пишет, мягко говоря. А тем, кто пишет, надо еще работать, спать....да и поиграть иногда хотелось бы Так что, you are welcome на модики!
PS. Чувство одиночества у тебя не совсем правильное. На их-фанатиках SDK занимаются много моддеров, стоит туда заглядывать, чтобы не изобретать те части велосипеда, которые уже "в игре".
Blacksun, займешься описанием SDKна модиках? Если да, то милости просим. Мы будем только рады .
Если возникнут какие-то вопросы, то не стесняйся - задавай мне и NeverMind'у.
Чорное Солнце, организуй нас.
В смысле я в свободное время согласен покопаться в Си-коде, кой для меня понятен, но:
а) не хотелось бы повторять работу других энтузиастов (определи фронт работ)
б) не хотелось бы дублировать исследования ИхФанатов
в) (продолжение б) ) - на НашФанатах есть достаточно людей, могущих перевести (именно перевест, а не только понять) аглицкий текст - предлагай сцылко для перевода с ИхФанатов - ИМХО люди на перевод найдутся...
ЗЫ
Боже, Боже, ещё один хомут на себя надеваю. Во дурак....
ЗЗЫ
В рабочие дни пиши в асю (в личке)
<div class='quotetop'>Цитата(NeverMind * 24.6.2006, 23:05) [snapback]106379[/snapback]</div>Лучше всего редактировать в Microsoft Visual Studio.А есть какие нибудь программы для просмотра этих .cpp файлов не в виде простого текста, а чтобы была видна структура по командам/инструкциям?
[/b]
С пола не упасть!
http://img444.imageshack.us/img444/7241/samogonxg0.png
Я очень рад, что народ подтягивается. Значит есть надежда, что отсюда пойдут целые блоки по описанию 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
Приметка:Код:CvPlayerAI.cpp int CvPlayerAI::AI_diploVote(VoteTypes eVote);
1. Надпись в описании типа max(число_1, число_2) означает что в формулу будет подставлено большее из значений(число_1 или число_2).
2. Слово result в описании означает, что при этом условии ф-ция завершает свою работу и даёт результат.
Функция отвечает за выбор AI при голосовании.
Внимание! За достоверность и точность ниже следуещей информации не несу. Так что смотрите, исправляйте, дополняйте.
Всю функцию можно разбить на две части(голосование TeamVote и остальные), вторую на несколько независящих цепочек. Каждая из которых выполняется при своём типе голосования.
[code]
С пола не упасть!
http://img444.imageshack.us/img444/7241/samogonxg0.png
Связь 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
<div class='quotetop'>Цитата</div>3. Если голосование за генсека, то он голосует за эту команду, если отношения > 0 (result), если голосование за политическую победу, то голосует при отношениях > 7 (result). Иначе воздерживается[/b]
Вот где корова зарыта. Заставлял проводить голосования с самого начала игры. Казалось, что AI голусует за победу другого только при Friendly (+10), а за генсека только при Pleased (+3), но так было не всегда. Оказывается минимально необходимые отношения ниже на 3. И вообще, голосование зависит от количества, а не от качества отношения.
<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]
С пола не упасть!
http://img444.imageshack.us/img444/7241/samogonxg0.png
<div class='quotetop'>Цитата(NeverMind * 25.6.2006, 13:10) [snapback]106416[/snapback]</div>От AttitudeType также зависитЯ думал, что и голосование привязано к AttitudeType, а не к AttitudeVal. Но указанный тобой код показывает что это не так.
[/b]
часть голосования. Смотри мою статью. Если голосование не за генсека и не за диплом. победу, то следующим проверяется AttitudeType, если отношения дружеские, то AI голосует за.
С пола не упасть!
http://img444.imageshack.us/img444/7241/samogonxg0.png
Да смотрел, смотрел. Меня интересовала именно дипломатическая победа, я о ней.
Я бы согласился, но если тут в одной теме будет масса кода по разным файлам, и вопросы, и ответы, то это будет "куча", в которой разобраться еще трудней. Если этот проект вызовет достаточно энтузиазма, то, возможно, стоит создать отдельный подфорум, где для каждого важного файла была бы отдельная тема, в которой можно готовить его описание и задавать по нему вопросы. (?)Originally posted by Blacksun
3. NewerMind - умоляю тебя - не разбрасывай все по отдельным темам, а то мы потом не соберем все в кучу.
PS. Вот тут описания классов Pуthon в Ц4. Должно пригодиться: http://civilization4.net/files/modding/PythonAPI_v160/
<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 можем стать там модераторами. За ссылочку спасибо, еще не смотрел, но поскольку движок игры(не только этой, но и любой), плотно перекликается со скриптами, то действительно должно помочь.
С пола не упасть!
http://img444.imageshack.us/img444/7241/samogonxg0.png
<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
Напоминаю, что на Модиках ведётся работа по сбору материала о SDK. Приветствуются все кто может помочь! Если вы можете описать хоть какую-то часть SDK, что нибудь дополнить, исправить, или вообще хоть как-то помочь, милости просим.
С пола не упасть!
http://img444.imageshack.us/img444/7241/samogonxg0.png
Закончено описание класса CVPlot (Вернее в модики внесены все функции этого класса). Просьба к переводчикам - переведите пожалуйста названия функций!!!!!
Если дело пойдет так и дальше, то описание возможностей SDK нам с vpadlo, делать будет некогда (мы будем только тупо делать описания классов....((((
ЗЫ У меня временно отрубили нет (неполадки в системе) обещали через три дня сделать, но чего то ничего у них пока не получается....
Программирование - это не то, что ты думаешь.... - Это то, что думает о тебе компьютер.
http://blacksun.civfanatics.ru
-------------------------------------------------
MTDG2 - [civ]christianity[/civ]Монархия
---------------------------------
Председатель CFR Awards 2007
---------------------------------
Председатель CFR Awards 2008
Не расстраивайся. Я почти пол года с переменных успехом пытаюсь описывать XML. И ничего. Самое главное не переоценивать уровень общественного энтузиазма, чтобы потом не разочаровываться.
Описывать классы это явно не для меня. Но я могу выкладывать описания некоторых функций SDK, которые мне попадаются и которые мне понятны (есть такие).
PS. Симпатичный сайт
Отличный топик! Конечно, не-программистам все равно сильно не поможет описание фукнций, но оттуда можно извлечь много интересного о победении ИИ. А вот моддерам очень пригодится - в общем, код очень хорошо организован и, по-моему, прост к пониманию.