PDA

Просмотр полной версии : Осваиваем SDK. Описание SDK.



Blacksun
24.06.2006, 14:30
Ресурсы по проекту "Осваиваем SDK".

Раздел по SDK на "модиках" (http://modiki.civfanatics.ru/index.php/SDK)

* Уроки C++ (http://forum.civfanatics.ru/index.php?showtopic=5299) - вопросы-ответы по основам SDK
* Связь SDK и Python. Вызов функций, описанных в СДК, через Питон. (http://forum.civfanatics.ru/index.php?showtopic=4090)
* Добавление новых XML атрибутов и их использование в SDK (http://forum.civfanatics.ru/index.php?showtopic=4631)

* * * * *


Сколько месяцев прошло, а про 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.

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);
}
}



Как видите она, при определенных условиях вызывает функцию doTurn (), что практически означает нажать кнопку End Of Turn. Начало Turnа найдено, дальше можно смотреть, как оно (это начало) активирует все остальные объекты Цивы (очень многие классы в своем теле имеют свою функцию doTurn() (например: CvPlot, CvCity, CvUnit,…)
На этом пока все. (жара не дает сосредоточиться). Дальше будем рассматривать уже конкретные классы и возможно с примерами. Если Вы что то знаете о функциях и классах SDK, то пишите прямо в эту тему. Если я где-то ошибся, тоже пишите в эту тему, буду поправляться.

NeverMind
24.06.2006, 15:01
Очень интересно! :w00t:

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

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

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

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

Дмитрий_rnd
24.06.2006, 16:06
Blacksun, займешься описанием SDKна модиках? Если да, то милости просим. :yes: Мы будем только рады :worthy: .
Если возникнут какие-то вопросы, то не стесняйся - задавай мне и NeverMind'у.

White Hawk
24.06.2006, 23:41
Чорное Солнце, организуй нас.

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

ЗЫ
Боже, Боже, ещё один хомут на себя надеваю. Во дурак....
ЗЗЫ
В рабочие дни пиши в асю (в личке)

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

vpadlo
25.06.2006, 00:48
<div class='quotetop'>Цитата(NeverMind * 24.6.2006, 23:05) 106379</div>

А есть какие нибудь программы для просмотра этих .cpp файлов не в виде простого текста, а чтобы была видна структура по командам/инструкциям?
[/b]
Лучше всего редактировать в Microsoft Visual Studio.

Blacksun
25.06.2006, 08:33
Я очень рад, что народ подтягивается. Значит есть надежда, что отсюда пойдут целые блоки по описанию 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...

vpadlo
25.06.2006, 09:18
CvPlayerAI.cpp
int CvPlayerAI::AI_diploVote(VoteTypes eVote);

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

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

Blacksun
25.06.2006, 11:38
Связь 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 файл:


//====================================================================
// 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;
}


Первая функция – это конструктор, которая устанавливает начальные значения для переменных. Вторая функция – это деструктор, которая высвобождает память (вызывается при разрушении объекта). Конструктор вызывается каждый раз, когда идет обращение к классу, Функция 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). Видно про него забыли, когда писали программу (или в том месте его легче загружать).
//------------------------------------------------------------------------------------------------------
//
// 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);
}
}


Здесь устанавливается массив на проверку структуры (лес, джунгли, вернее их вырубка). И опять же эти переменные запоминаются в своих уникальных переменных и запоминаются также ссылки на них.
После того, как мы посмотрим классы CvUnit и CvPlot мы попробуем поподробней разобрать этот класс. (Уже на примере какого нибудь конкретного Builda.)

NeverMind
25.06.2006, 13:11
<div class='quotetop'>Цитата</div>
3. Если голосование за генсека, то он голосует за эту команду, если отношения > 0 (result), если голосование за политическую победу, то голосует при отношениях > 7 (result). Иначе воздерживается[/b]
:applau2:
Вот где корова зарыта. Заставлял проводить голосования с самого начала игры. Казалось, что AI голусует за победу другого только при Friendly (+10), а за генсека только при Pleased (+3), но так было не всегда. Оказывается минимально необходимые отношения ниже на 3. И вообще, голосование зависит от количества, а не от качества отношения.

vpadlo
25.06.2006, 13:59
<div class='quotetop'>Цитата(NeverMind * 25.6.2006, 12:11) 106413</div>
И вообще, голосование зависит от количества, а не от качества отношения.
[/b]

Прошу уточнить, что имеется в виду под кол-ом и под кач-ом отношения?

<div class='quotetop'>Цитата(NeverMind * 25.6.2006, 12:11) 106413</div>
И вообще, голосование зависит от количества, а не от качества отношения.
[/b]

Прошу уточнить, что имеется в виду под кол-ом и под кач-ом отношения?

NeverMind
25.06.2006, 14:10
Под количеством подразумевается AttitudeVal, под качестовом - AttitudeType.

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

[code]AttitudeTypes CvPlayerAI::AI_getAttitude(PlayerTypes ePlayer)
{

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

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


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

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

vpadlo
25.06.2006, 16:01
<div class='quotetop'>Цитата(NeverMind * 25.6.2006, 13:35) 106419</div>

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

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

Blacksun
25.06.2006, 17:37
<div class='quotetop'>Цитата</div>
Я бы согласился, но если тут в одной теме будет масса кода по разным файлам, и вопросы, и ответы, то это будет "куча", в которой разобраться еще трудней. Если этот проект вызовет достаточно энтузиазма, то, возможно, стоит создать отдельный подфорум, где для каждого важного файла была бы отдельная тема, в которой можно готовить его описание и задавать по нему вопросы. (?)

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

В принципе да! Отдельные файлы занимают очень много информационного места. И удобочитаемость информации при этом теряется. (Даже найти то что тебе нужно будет очень трудно). Тогда эти файлы надо переносить в подфорумы, но чтобы все хранилось рядышком (желательно в алфавитном порядке).
Тут у тебя опыта больше.
Сылку, что ты дал - просто бесценна для программирования (что в SDK, что в Питоне). Нельзя ли как нибудь переместить эту инфу (пусть даже в таком виде) в модики Питона ? (Практически это финальный этап по программированию Цивы в Питоне). И еще Классы Питона оказались более полными, чем классы SDK. (В SDK используются многие методы Питоновских функций, которые никак не описаны в SDK).

vpadlo
28.06.2006, 13:08
Напоминаю, что на Модиках (http://modiki.civfanatics.ru) ведётся работа по сбору материала о SDK. Приветствуются все кто может помочь! Если вы можете описать хоть какую-то часть SDK, что нибудь дополнить, исправить, или вообще хоть как-то помочь, милости просим.

Blacksun
28.06.2006, 22:51
Закончено описание класса CVPlot (Вернее в модики внесены все функции этого класса). Просьба к переводчикам - переведите пожалуйста названия функций!!!!!
Если дело пойдет так и дальше, то описание возможностей SDK нам с vpadlo, делать будет некогда (мы будем только тупо делать описания классов....((((

ЗЫ У меня временно отрубили нет (неполадки в системе) обещали через три дня сделать, но чего то ничего у них пока не получается....

NeverMind
29.06.2006, 00:25
Не расстраивайся. Я почти пол года с переменных успехом пытаюсь описывать XML. :biglol: И ничего. Самое главное не переоценивать уровень общественного энтузиазма, чтобы потом не разочаровываться. :whistle:

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

PS. Симпатичный сайт http://nm.civfanatics.ru/smiles/smile2.gif

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

Пет
29.06.2006, 05:28
Сольвер, привет! :bye: У тебя чего с аськой? Ник какой-то многосимвольный стал :whistle:

Solver
29.06.2006, 17:07
Не знаю, мне вот двое из ваших жалуются, а по мне так все в порядке там. Может у ICQ протесты по поводу моих личных действий, вот и выражает несогласие.

vpadlo
29.06.2006, 19:30
Большая просьба к администрации не офтопить в этой ветке, а то в ней и так тяжело разбиратся. :worthy:

//Пардон :shy2:
хотел "пардон" отдельным постом сделать, но передумал :) //Пет

White Hawk
30.06.2006, 22:48
Итак, по просьбе BlackSun&#39;аб я начал копаться в файле CvUnit.cpp :)

Сразу же нашёл интересную вещицу в методе CvUnit::init(), которая возможно прольёт свет на загадочный параметр CIV4WorldInfo::iUnitNameModifier

[code]
if (GC.getGameINLINE().getUnitCreatedCount(getUnitType()) < GC.getUnitInfo(getUnitType()).getNumUnitNames())
{

swan
01.07.2006, 05:19
<div class='quotetop'>Цитата</div>
В последних же двух строках мы ещё раз проверяем "влезание" полученного номера в список и, наконец, присваевем имя юниту функцией setName()[/b]
Отсюда вывод - мы можем создать список имен для всех вновь строящихся кораблей, как это делается например в парадоксовсих играх, навроде Victoria, где каждый корабль создается с уникальным именем и припиской, к какому классу он принадлежит. Фича малопрактичная, но занимательная

White Hawk
03.07.2006, 01:53
Продолжаем разговор о CvUnit.cpp

Копался я в методе CvUnit::canMoveInto

Что могу сказать интересного:

судя по
[code]
case DOMAIN_LAND:

swan
03.07.2006, 03:47
Считаю, что настала пора создать на модиках раздел - "Поведение ИИ" и скидывать всякие фичи, подобные описанной в предыдущем посте туда

vpadlo
03.07.2006, 11:25
<div class='quotetop'>Цитата(White Hawk * 3.7.2006, 0:53) 107344</div>[quote]
Продолжаем разговор о CvUnit.cpp

Копался я в методе CvUnit::canMoveInto

Что могу сказать интересного:

судя по
[code]
case DOMAIN_LAND:

White Hawk
03.07.2006, 11:55
Не скажи...

!isHuman() и !canLoad(pPlot) проверяются через ИЛИ - то есть если либо ИИ, либо НЕ МОЖЕТ загрузить - ход сухопутному юниту ЗАПРЕЩЁН.

Конечно ещё смотреть надо... :whistle:

vpadlo
03.07.2006, 12:01
<div class='quotetop'>Цитата(White Hawk * 3.7.2006, 10:55) 107386</div>

Не скажи...

!isHuman() и !canLoad(pPlot) проверяются через ИЛИ - то есть если либо ИИ, либо НЕ МОЖЕТ загрузить - ход сухопутному юниту ЗАПРЕЩЁН.

Конечно ещё смотреть надо... :whistle:
[/b]
Сори, оплашал :shy2:

NeverMind
03.07.2006, 12:17
<div class='quotetop'>Цитата(swan * 1.7.2006, 5:19) 107231</div>

Отсюда вывод - мы можем создать список имен для всех вновь строящихся кораблей, как это делается например в парадоксовсих играх, навроде Victoria, где каждый корабль создается с уникальным именем и припиской, к какому классу он принадлежит. Фича малопрактичная, но занимательная
[/b]
Так это давно можно делать, независимо от SDK. Параметр UniqueNames в CIV4UnitInfos (http://modiki.civfanatics.ru/index.php/CIV4UnitInfos) может быть легко использован для любого юнита так же как он используется для ВЛ.


<div class='quotetop'>Цитата(White Hawk * 3.7.2006, 1:53) 107344</div>

... - то есть загрузка на транспорты производится Искусственнвм Идиотом ТОЛЬКО в портах! :w00t:
[/b]Это предположение противоречит тому, что происходит в игре :whistle:

<div class='quotetop'>Цитата(White Hawk * 3.7.2006, 1:53) 107344</div>

Поэтому для какого-нибудь судна на воздушной подушке думаю лучше создавать отдельный домен.
В связи с этим интересно, кстати, как в Варлордах в китайском сценарии Firaxis&#39;ы заставили галеры плавать по рекам ;)
[/b]
http://forums.civfanatics.com/showthread.php?t=171813
<div class='quotetop'>Цитата</div>
This mod allows users to add a <bFlying> tag to any unit they want. A unit that has <bFlying>1</bFlying> will be able to move over both water and land. There is no need to, nor should you, change the domain type.[/b]

<div class='quotetop'>Цитата</div>
Считаю, что настала пора создать на модиках раздел - "Поведение ИИ" и скидывать всякие фичи, подобные описанной в предыдущем посте туда[/b]Пока на модиках разделов больше, чем содержания. Настала пора их наполнять :D Для этого есть раздел "SDK" и раздел "Стратегия и механика игры".

White Hawk
03.07.2006, 14:39
<div class='quotetop'>Цитата</div>
Это предположение противоречит тому, что происходит в игре[/b]
Не спорю, хотя и не видел такого...

Solver
03.07.2006, 17:10
Угу, загрузка не только в портах производится. Функция дает, что перемещение наземного юнита на водяную клетку невозможно, если этим ходом юнит не погрузится на корабль (то есть, на клетке такого нету, или корабли все заполнены).

White Hawk
03.07.2006, 18:40
<div class='quotetop'>Цитата</div>
Функция дает, что перемещение наземного юнита на водяную клетку невозможно, если этим ходом юнит не погрузится на корабль (то есть, на клетке такого нету, или корабли все заполнены).[/b]
Скорее это разрешается где то ещё...

Может я в Циве матчасть знаю недостаточно, но условия по ИЛИ сложить ещё могу, а то, что одним из запретов написано !isHuman() - неоспримый факт...

Для уточнения надо бы посмотреть функцию isWater() - может фишка здесь заложена... - то есть корабль - не вода!

PS
В посте выше (оригинальном) прокомментировал свои ошибочные выводы!

Solver
03.07.2006, 19:11
Корабль тоже вода. Как раз вопросы про корабль решаются функцией canLoad(). canLoad() - вообще функция класса юнита. А isWater(), естественно, реагирует только на собственно тип данной клетки.

White Hawk
03.07.2006, 19:34
<div class='quotetop'>Цитата</div>
Корабль тоже вода. Как раз вопросы про корабль решаются функцией canLoad(). canLoad() - вообще функция класса юнита. А isWater(), естественно, реагирует только на собственно тип данной клетки.[/b]
Оставим сей вопрос до полного разбора класса CvUnit :) - пока просто неясно и всё...

Solver
03.07.2006, 20:16
Ну ладно, только я не вижу, зачем что-то оставлять под заголовком "неясное", если я вроде разяснил :).

White Hawk
03.07.2006, 20:22
Но не убедил ;)

NeverMind
03.07.2006, 21:54
[code]

vpadlo
03.07.2006, 22:00
<div class='quotetop'>Цитата(NeverMind * 3.7.2006, 20:54) 107526</div>[quote]
[code]

NeverMind
03.07.2006, 22:11
Про "ляляфафа" и добавляется я как раз все понял, вот с арифметикой, видимо, проблемы. Короче, с ростом значения PopulationPercent и CityPercent, общее значение iUpkeep должно расти, исходя из игрового смысла. Это подтверждается формулой?

Возможно я запутался в скобочках :whistle:

//Ок. Учел)

vpadlo
03.07.2006, 22:17
<div class='quotetop'>Цитата(NeverMind * 3.7.2006, 21:11) 107532</div>

Про "ляляфафа" и добавляется я как раз все понял, вот с арифметикой, видимо, проблемы. Короче, с ростом значения PopulationPercent и CityPercent, общее значение iUpkeep должно расти, исходя из игрового смысла. Это подтверждается формулой?

Возможно я запутался в скобочках :whistle:
[/b]
Подтверждается

Blacksun
04.07.2006, 09:24
Всем кому интересно:

[code]
bool CvPlayerAI::AI_isCommercePlot(CvPlot* pPlot)
{

NeverMind
04.07.2006, 15:31
int CvArea::countNumUniqueBonusTypes()

[code]{

vpadlo
04.07.2006, 15:55
<div class='quotetop'>Цитата(NeverMind * 4.7.2006, 14:31) 107752</div>[quote]
int CvArea::countNumUniqueBonusTypes()

[code]{

NeverMind
04.07.2006, 16:37
OneArea берется из bArea в CIV4BonusInfos (http://modiki.civfanatics.ru/index.php/CIV4BonusInfos). (1/0)

Что за "бонусная зона"? Что в этой формуле считается iCount и что меняется в счете от OneArea?

Вообще, меня именно OneArea интересует, она еще при генерации карты используется в CvMapGenerator. Посмотри, если будет время, каким образом она влияет на распределение ресурсов. А то одной игровой логики тут не хватает :whistle:

vpadlo
04.07.2006, 16:54
Что такое бонусная зона не знаю.
iCount -- "number of unique bonuses on the area".
Если OneArea равно true(1), то iCount увеличивается на 1.
Буду разбиратся дальше.

Blacksun
04.07.2006, 20:09
Это значение берется из Civ4BonusInfos.XML - bArea

NeverMind
05.07.2006, 13:34
<div class='quotetop'>Цитата(Blacksun * 4.7.2006, 20:09) 107847</div>

Это значение берется из Civ4BonusInfos.XML - bArea
[/b]

Кхм. А я как сказал? :whistle:

<div class='quotetop'>Цитата(NeverMind * 4.7.2006, 16:37) 107773</div>

OneArea берется из bArea в CIV4BonusInfos (http://modiki.civfanatics.ru/index.php/CIV4BonusInfos). (1/0)
[/b]

Blacksun
05.07.2006, 15:07
По моему - она используется для определения стартовой позиции. Если у бонуса этот флаг установлен, то бонус считается уникальным и если в стартовой области есть этот бонус, то стартовая позиция будет выбираться рядом с этим бонусом

<div class='quotetop'>Цитата</div>
number of unique bonuses starting on the area, plus this one[/b]

NeverMind
05.07.2006, 18:35
Не думаю. Cтартовая позиция задается в CvGame::assignStartingPlots, а ее "нормализация" происходит через CvGame::normalizeStartingPlotLocations и далее. Ресурсы, которые применяются в нормализации, задаются параметром bNormalize в СIV4BonusInfos.

А в этом CvMapGenerator::addUniqueBonusType ничего про стартовые позиции нет. Тут, наверное, проиходит первоначальное распределение ресурсов, а при добавлении следующих ресурсов проверяется, есть ли ресурс данного типа на каждой этой Area, и можно ли туда добавить его еще.

Blacksun
05.07.2006, 21:15
CvCityAI::AI_bestPlotBuild

При просмотре этой функции – я не до конца выяснил, как же все таки происходит выбор лучшей работы для плота. Поэтому пока не выставляю ее на модики. Если кто заинтересован, как же работает эта функция – прошу помочь разобраться в этом запутанном алгоритме саму функцию вы можете увидеть на моем сайте (ссылка на сайт внизу).
Функция AI_bestPlotBuild() – выбирает лучшую работу для рабочего.
Критерии выбора очень обширны – основные – недостаток продовольствия, недостаток продукции и недостаток коммерции.
Далее добавляются очки предусмотренные для лидера и проверяется наличие флага защиты окружающей среды (для вырубки лесов или джунглей).
Сначала идет инициализация всех переменных и проверяется наличие бонуса. Затем проверяется наличие улучшений для бонуса и выставляется флаг bHasBonusImprovement = true; если все улучшения для бонуса уже построены. А затем идет попытка определить – если нет улучшений для бонуса то, что надо строить.
Если нет улучшений для бонуса:

1. Подсчитываем продовольствие, продукцию и торговлю на всех плотах (тейлах) города и устанавливаем флаги (мало продовольствия, мало продукции, нуждаемся в коммерции).
2. Затем по очень странной схеме (переборка плотов , после того, как iCount = 0; выясняется – нужна ли продукция или продовольствие…. (если кто может, посмотрите – там все с комментариями)
3. Затем выясняется – есть ли пресная вода в области.
4. А потом происходит попытка – выявить лучшую работу и лучшее улучшение. (импровемент).
5. Пытаемся запретить вырубку леса (если защита окружающей среды)
6. Затем, если работа выбрана – идет подсчет очков для этой работы, проверка на бонусы и примерка постройки коттеджей (там очень длинный цикл по улучшениям).
7. Если работа не выбрана – снова идет попытка вырубки лесов.
8. И только после этого – если работа выбрана то она переправляется в Питон, а если нет, то в Питоне остаются старые значения.

Вот так примерно выбирается работа для AI рабочего.

Blacksun
08.07.2006, 20:46
Да! ребята! - хотел я сделать учебник по СДК, но что то пока не получается, и , наверное, не получится, до тех пор, пока я остаюсь единственным - на нашфанатиках - пишущим программером в SDK...

Гость
09.07.2006, 11:20
есть только один путь - путь Дао
надо продолжать писать статьи и включать их дайджесты на главную страницу сайта
по истечении месяца-полутора поисковики наберут критмассу по теме SDK и народ из инета начнёт подтягиваться

Blacksun
13.07.2006, 23:58
Тема 5:

«Внедрение» в SDK.


Шофер объясняет бабке про устройство машины:
«Вот здесь бабушка зажигание, здесь карбюратор, здесь вентилятор,
Для того чтобы машина поехала – надо включить зажигание…»
И так часа полтора. Потом спрашивает ее «Ну, все ясно бабуля?»
Она отвечает: «Все ясно…, только непонятно, а куды оглобли вставлять?»…

Для того, чтобы научиться писать свои коды в СДК – необходимо четко себе представлять, куда их надо вставить. И еще надо знать, а что вы хотите получить на выходе. Дальше вам придется посмотреть, (или предположить), - какие объекты участвуют в тех местах, где вы хотите внести изменения. Давайте рассмотрим это на примере посадки леса и преобразования местности.
1. Объект Build (постройки). Так как, это описывается в СДК, то это будет класс CvBuild.
2. Объект Unit (класс CvUnit). Так как он непосредственно делает все эти действия (Конкретно – это рабочий (Worker)). Надо только не забыть, что их два – рабочий и быстрый рабочий (Индия).
3. Объект Plot (класс CvPlot) – это непосредственно тот участок местности, который обрабатывается. (в дальнейшем мы его так и будем называть – Плот).

Это основные объекты, есть еще и дополнительные, такие, как Button (кнопка), CvHotKeyInfo (горячие клавиши). Есть и другие классы и объекты. Но если смотреть на алгоритм работ, то он, обычно, всегда одинаков. (Когда рабочий встает на плоту – у него открываются возможности для построек. Затем – если нажимается кнопка (или клавиши), он начинает выполнять работу, затем, когда работа выполнена результат появляется на плоту (на местности)). Каждый, кто играл в Цивилизацию – видел все это неоднократно.

А с чего начать ? спросите вы, а начинать надо с XML файлов (которые достаточно хорошо описаны NeverMind-ом).
Первое что мы делаем – это ищем рабочих в файле CvUnitInfos.XML и добавляем им два новых Build-а:
BUILD_FEATURE_FOREST и BUILD_TERAFORM:

[code]<Build>

White Hawk
14.07.2006, 11:10
BlackSun, респект! Можешь прям учебники писать.

Только CvPlot лучше тайлом называть (привычнее для цивилизатора) или участком местности (длинно, зато по русски).

Blacksun
14.07.2006, 20:43
<div class='quotetop'>Цитата(White Hawk * 14.7.2006, 11:10) 109721</div>

BlackSun, респект! Можешь прям учебники писать.

Только CvPlot лучше тайлом называть (привычнее для цивилизатора) или участком местности (длинно, зато по русски).
[/b]

Смогешь вертолет заставить по морю летать и корабли долбить ?

З.Ы. А как феатура переводится ?

White Hawk
14.07.2006, 20:46
Зависит от срочности.

С моим реалом можно и месяц провозиться..

Blacksun
14.07.2006, 21:01
Не расстраивайся - Играй - сам напишу... (может кто подключится...) :yes:

Гость
15.07.2006, 00:57
<div class='quotetop'>Цитата(Blacksun * 14.7.2006, 20:43) 109846</div>
А как феатура переводится ?
[/b]
FEATURE (http://www.rambler.ru/dict/scripts/go.cgi?btnG=%CD%E0%E9%F2%E8%21&query=FEATURE&where=enru&start=0&count=15)
7. топографический термин: местный предмет; подробность рельефа местности

я бы перевёл как... эх ё-моё... модификатор тайла... по-русски, ага... :) setFeatureType() определитьТипМодификатораТайла

возможно, всё проще - FEATURE как "признак", "свойство", тогда определитьСвойствоТайла

больше всего мне нравится перевод слова set http://www.rambler.ru/dict/new-enru/03/93/32.shtml
хотя программизмский set вполне сойдёт как "установить значение"

Blacksun
15.07.2006, 06:29
Немного о программировании и правилах русского языка

Вся загвоздка с переводом возникает тогда, когда мы пытаемся совместить то, что написано на языке Срр с русским языком. Если в учебниках переводить фразу setFeatureType - как "определить свойство тайла", то мало кто поймет, о чем идет речь. Потом у тайла (Plot - в СДК) - уже есть свойства. Причем эти свойства немножечко хитренькие. и описываются они в перечислении TERRAIN. B SDK у них (у этих свойств) есть отдельные функции для работы с ними. (getTerrainType(), setTerrainType()). В Срр - что, TERRAIN, что FEATURE, что Plot - это отдельные классы - описывающие свои типы объектов. А слово set - тоже имеет для программирования свой смысл. Его обычно переводят как "Установить"(т.е. изменить значение). get - для программирования - это получить(посмотреть значение). Тогда что же получается ?

setFeatureType - мы должны перевести как "установить свойство тайла" ??????? А свойства тайла (Plot) - устанавливается другими функциями...

Если рассматривать ТАЙЛ - с точки зрения игры (и с точки зрения программирования, а не перевода), то получается, что тайл - это нечто большее, чем Plot - а именно - тайл включает в себя свойства классов Plot, Terrain, Feature, Improvement, Message (Может что то и упустил)...

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

З.Ы. Plot - смысл этого слова в Циве - это скорее "фундамент" участка местности. CvPlot - работает с такими понятиями, как:
0. Океан (самая низкая точка местности)
1. Побережье ? (1 уровень)
2. Холм (2 уровень)
3. Пик (3 уровень).

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

curious person
17.07.2006, 15:29
<div class='quotetop'>Цитата("Blacksun")</div>
Вся загвоздка с переводом возникает тогда, когда мы пытаемся совместить то, что написано на языке Срр с русским языком.[/b]

Иначе говоря, вся загвоздка с переводом возникает тогда, когда мы пытаемся переводить. :)
Я сам долго не мог понять примерно того же: как не старайся переводить, все равно смысл текста с одного языка на другой перенести не удается. Это просто бесит, чувствуешь себя законченным кретином и мучаешься: почему?! Причем, как мне кажется, этому процессу подвержены в основном мужчины – левополушарные особи :)

Такая загвоздка, как выясняется, может возникнуть только в одном случае: когда на языке на самом-то деле и не написано ничего. Ни на каком. Переводить просто нечего! И вы сами это только что показали: в переводимом тексте нет ничего, кроме его структуры. А структуру перевести нельзя – это будет уже другая структура. По этой причине люди даже думают на разных языках по разному.

P.S. Я тут где-то видел ваш пост, где повторяется рефрен: "Но это тоже все знают... и молчат". Сознательно или не сознательно, но суть того, что вы хотели сказать, вы там во многом доносите именно этим повторением - т.е. этой очевидной особенностью структуры.

Blacksun
17.07.2006, 23:03
Переводить - все равно приходится. Сначала с английского на русский,с попыткой понять, о чем идет речь. Затем на язык машины... Как я говорил раньше - в названиях функций используется венгерская нотация, то есть программист, который пишет прогу, пытается в названии функции дать ответ о том, что делает эта функция. (Ну плюс еще ее тип и еще что то, что не помню). А когда этих функций очень много - то приходится "понимать" о чем речь не по кодам, которые написаны в этих функциях, а по их названию. Так что от преревода никуда не денешься. И еще - желательно, что бы перевод был правильным...

Blacksun
29.07.2006, 00:52
Сегодня (днем) я выложу мод для Варлордов (сначала протестирую - ночью). Он включает в себя:

1. Посадка леса
2. Преобразование местности
3. пп. 1 и 2 для AI рабочего
4. Введен новый юнит - полицейский с дубинкой. (Очень класно разгоняет пацифистов, которые устали от войны...)

К сожалению все пока на Англицком. :no:

МОД ДЛЯ ВАРЛОРДОВ (http://blacksun.civfanatics.ru/dwn.php?get=BlacksunModEng.rar)

Качайте...

З.Ы. Теперь можно запускать и 50 наций...

Blacksun
08.08.2006, 22:21
Итак. Пока все время ушло на строительство мостов (там еще надо заставить АИ по ним передвигаться). Поэтому новых статей по СДК не было. Если у кого есть какие то вопросы по СДК или предложения - Пишите - не стесняйтесь. Следующая статья будет (если не поступят другие предложения) про полицейского и про то, как он машет дубинкой и вообще, что он еще может сделать - если это захочет сделать программер...

PSYX
08.08.2006, 23:24
Есть пару вопросов:
1. Можно ли сделать, такую вещь, как "волчья яма" (яма, в нутрь которой вбиты колья и сма яма спрятана листьями)? Т.е. враг пападает на клетку с ямой и умирает (яма убивает любого юнита и пропадает на следующем ходу)
2. Можно ли сделать так, чтобы стены можно было бы строить, не вокруг города, а на любой территории своей империи? Т.е. делать не просто замки, а огромные цитадели...

Blacksun
09.08.2006, 09:33
Сделать это можно. Но только все будет делаться через IMPROVEMENT - а это значит, что больше никаких улучшений ты на тайле не построишь. Ну а рисовать всевозможные направления стен ты, наверное, умеешь (в т.ч. и волчьи ямы).

PSYX
10.08.2006, 11:21
Ясны... Ну, графическую сторону, сделать смогу...

NeverMind
20.08.2006, 18:17
Blacksun, у меня как раз есть предложение. Если будет возможность, опиши подробно сам процесс компиляции. Что для этого нужно, какие программы. И желательно какой нибудь простой пример (увеличение числа игроков). Ведь для того чтобы просто изменить какой то параметр в SDK, необязательно быть специалистом по C++. А если желающие поймут, как это сделать технически, может у них потом и к собственно программированию SDK интерес появится.

Blacksun
22.08.2006, 05:34
<div align="right">Мы, программисты, народ рассеянный
- мы всегда забываем про то, что что то,
для нас может быть легко,
- для других может являться целой проблемой</div>

<div align="center">Установка и работа с Visual Studio Net 2003.</div>

Первая проблема у меня возникла при установке VS 2003. Я ее попытался поставить в другую директорию, не ту что указана в установке. В результате – загнал систему Windows и мне ее просто пришлось переустанавливать. (Все такие вещи происходят от большого ума.). Так что если не хотите повторить моих ошибок – устанавливайте VS 2003 туда – куда она просит.
Вторая проблема возникла уже при установке. На каком то определенном этапе (Место выяснить не удалось, потому что каждый раз – это происходило в разных местах) – отключался CD (и DVD) – То есть возникала ошибка типа – не могу прочитать файл… (Все устройства просто отрубались – на определенном этапе установки системы). Возможно – это глюк взламывания кода (не до конца поломали). Но лечится это просто. Запускаешь Alcohol 120% - Переписываешь диск с системой VS 2003 и спокойно ее устанавливаешь…(Через виртуальный CD_ROM). После установки VS 2003 (не забудьте установить также и библиотеку MSN 2004), можно спокойно приступать к компиляции СДК Цивилизации 4 и Варлордов.
СДК Цивилизации 4 (ванилы) лежит сдесь (http://www.2kgames.com/civ4/downloads.htm). СДК Варлордов – поставляется вместе с Варлордами. Так что если после установки Варлордов вы не обнаружили папки CvGameCoreDll – в директории игры (CivilizationIV\Warlords) – то знайте – вас дико обманули…(В крайнем случае СДК можно будет спросить на форуме…).
Лучше всего эту папку (CvGameCoreDll) поместить в корень и вложить ее еще в одну папку (например MyGames\CvGameCoreDll). Это делается для того , чтобы папка Assets создавалась в директории MyGames, а не в корне. Тогда вы точно будете знать – какую библиотеку вы создали. Потому, что она будет находиться (после компиляции) в папке MyGames\Assets.
Может вы захотите иметь несколько разных библиотек (или вам придется иметь несколько разных библиотек CvGameCoreDll.dll) (Две то точно – одна искомая, другая отладочная – в которую вы будете вносить все изменения).
После установки VS 2003 и СДК вам надо будет в папке с СДК (CvGameCoreDll) снять со всех файлов признак – «Только для чтения». Делается это просто – наводите курсор мыши на папку CvGameCoreDll , затем нажимаете правую кнопку мыши (обратную клавишу) и заходите в меню «Свойства». В самом низу снимаете галочку «Только для чтения» и нажимаете кнопочку «Применить» (на вопрос – «Сделать это для всех вложенных папок» - надо ответить «Да – для всех». После этого вы можете смело приступать к редактированию СДК.
После Установки VS 2003 все файлы срр у вас будут отмечены синим значком С: Файлы описания – h, а файл проекта будет отмечен двумя желтыми плюсами. Вот на этот файл вы и кликните мышкой. После этого у вас запустится VS 2003 c СДК.
Справа (или слева) У вас откроется окно (3 в одном) – Solution explorer, class view, resource view. В первом окне вы сможете выбирать файлы для редактирования, во втором вы сможете просматривать все имеющиеся классы СДК, третье окно для СДК – не используется, потому что все ресурсы зашиты в движке игры, а не в библиотеке.
Для того, чтобы получить полноценную библиотеку, вам надо зайти в меню Project -> CvGameCoreDll Properties… и, с помощью кнопки configuration manager… изменить свойство Debug на final release (Будьте внимательны, там это надо сделать 2 раза). Тогда, при компиляции, в папке MyGames\Assets у вас появится файл CvGameCoreDll.dll. Этот файл можно скинуть в директорию CivilizationIV\Mods\MyMod\Asssets или CivilizationIV\Warlords\Mods\MyMod\Asssets – в зависимости от того, с каким СДК вы работали. (Варлордов или ванилы)

<div align="center">ПРИМЕР РАБОТЫ С СДК.</div>

Newer Mind – попросил меня описать, как сделать любое количество наций в игре. Честно скажу – это не для новичков, которые пытаются что то сделать в СДК, потому что Фираксисы конечно сняли это ограничение в Варлордах, но сделали это очень своеобразно. Для того чтобы добраться и посмотреть, как сделано это ограничение – вам нужно открыть файл CvDefines.h (через окно Solution explorer). Там вы сразу увидите предупрежление:
<div class='quotetop'>Цитата</div>

// The following #defines should not be moddable...
[/b]

То бишь – не стоит изменять эти определения. Честно скажу – некоторые определения изменить можно, но если вы будете изменять MAX_CIV_PLAYERS, то скомпилировать СДК – вам не удастся, т.к. будет все время выскакивать ошибка, что эта константа уже определена… (она определена в движке). Я человек простой, и не люблю ошибаться, поэтому не стал долбиться в эту стену лбом, я просто ее обошел.
Раз нельзя изменить MAX_CIV_PLAYERS – я его менять и не стал. Я просто ввел новую переменную…. :

#define MAX_WAR_PLAYERS (50)

И поменял MAX_CIV_PLAYERS на MAX_WAR_PLAYERS во всех файлах СДК (это можно сделать с помощью меню: Edit->Find and Replase -> Find in files. Только будьте осторожны. Определение define заменяет MAX_WAR_PLAYERS на 50 – везде, где эта константа встречается, а есть места – где нельзя заменить MAX_CIV_PLAYERS на MAX_WAR_PLAYERS. Это нельзя сделать там , где MAX_CIV_PLAYERS является частью имени функции:


DllExport int getMAX_CIV_PLAYERS();

Потому что после подстановки MAX_CIV_PLAYERS эта строка будет читаться так:


DllExport int get18();

А, если вы сюда подставите MAX_WAR_PLAYERS, то ваша строка превратится в:


DllExport int get50();

Но если функция get18() – описана в движке, то описания функции get50 (); там нет точно.
После этого вы смело можете компилировать – уже свое СДК. Заходите в меню Build->Build Solution (первый раз лучше Rebuild Solution) и создаете свою библиотеку. При компиляции у вас будет одно предупреждение. Не пугайтесь, это не ошибка – это просто не состыковка Windows и VS 2003 (вернее там все уже давно состыковано, но компилятор об этом еще не знает (он старый). Далее можно поместить свою библиотеку в директорию модов и начинать спокойно играть… (в данном случае с 50 нациями…)

NeverMind
22.08.2006, 12:20
Blacksun, большое спасибо! http://nm.civfanatics.ru/smiles/up.gif В ближайшее время попробую что нибудь простое скомпилировать самостоятельно. Осталось только выяснить, где взять эту VS2003. Это большая махина? надо диск покупать или скачать можно?

А с "простотой" изменения числа игроков я видать промахнулся. Думал, просто поменять число (18-24) в одном месте и все. :D

PS. У меня есть подозрение, что SDK-моддеры решают проблему увеличения числа игроков по разному. Скачал два варианта dll, в которых заявлено только увеличение числа игроков, а размер у них весьма разнится. Надо будет поинтересоваться.

Blacksun
22.08.2006, 13:04
Эта "махина" весит 3,5 гБ. Купил я ее на царицынском рынке. (DVD диск) (один). Но в основном сейчас продается 2005 студия - так что еще поискать придется 2003. А скачать можно. (Ты сам где то ссылку кидал на форум ихфанатиков). По мому бесплатно. (если не считать, что придется качать где то метров 400).

З.Ы. Размеры у них могут разниться. (если компилируешь через VS2003, то размер библиотеки будет как и в Циве, а если компилируешь через CodeBlocks, (по рецепту ихфанатиков), то размер увеличивается (с 3,53 в ваниле до 3,67 мб)

А вот и ссылочка - где НМ описывал, как можно получить VS 2003 (http://forum.civfanatics.ru/index.php?showtopic=3360)

Dynamic
22.08.2006, 13:15
Мне в Питере купить VS 2003 не удалось...:( Только 2002 и 2005...

NeverMind
22.08.2006, 13:27
Ну вот ссылка с описанием процесса с их-фанатиков: http://forums.civfanatics.com/showthread.php?t=166933

Там предлагается скачать за основу VC++ Toolkit 2003 - всего 30m. Это все таки поменьше 3,5Г. :nerves: Или это чего то не то?

PS. А царицынский рынок разве еще не перебросили на мкад?

Blacksun
22.08.2006, 13:30
<div class='quotetop'>Цитата(NeverMind * 22.8.2006, 13:27) 116989</div>

Ну вот ссылка с описанием процесса с их-фанатиков: http://forums.civfanatics.com/showthread.php?t=166933

Там предлагается скачать за основу VC++ Toolkit 2003 - всего 30m. Это все таки поменьше 3,5Г. :nerves: Или это чего то не то?

PS. А царицынский рынок разве еще не перебросили на мкад?
[/b]

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

bay
07.11.2006, 17:48
мдя все хорошо но SDK меняется от патча к патчу :(

vpadlo
07.11.2006, 18:29
<div class='quotetop'>Цитата(bay * 7.11.2006, 16:48) 135713</div>

мдя все хорошо но SDK меняется от патча к патчу :(
[/b]
Это логично. Исправляют ошибки. А что в этом плохого?

bay
15.11.2006, 10:28
<div class='quotetop'>Цитата</div>
А что в этом плохого?[/b]

я не утверждаю что это плохо..... беда только с модами составленными под старым sdk - их civ4coredll.dll не работает на новых пропатченых версиях игры......

NeverMind
15.11.2006, 13:01
<div class='quotetop'>Цитата</div>
Раз нельзя изменить MAX_CIV_PLAYERS – я его менять и не стал. Я просто ввел новую переменную…. :

#define MAX_WAR_PLAYERS (50)[/b]

Blacksun, в 208 по прежнему нельзя напрямую менять MAX_CIV_PLAYERS?

И еще вопрос, для общего развития. На их-фанатиках попадалась .dll тоже увеличивающая только число игроков, но размером 5м. Откуда может взяться такой размер? Это нормально?

Blacksun
15.11.2006, 13:45
<div class='quotetop'>Цитата(NeverMind * 15.11.2006, 13:01) 138204</div>

<div class='quotetop'>Цитата
Раз нельзя изменить MAX_CIV_PLAYERS – я его менять и не стал. Я просто ввел новую переменную…. :

#define MAX_WAR_PLAYERS (50)[/b]

Blacksun, в 208 по прежнему нельзя напрямую менять MAX_CIV_PLAYERS?

И еще вопрос, для общего развития. На их-фанатиках попадалась .dll тоже увеличивающая только число игроков, но размером 5м. Откуда может взяться такой размер? Это нормально?
[/b][/quote]

В 2.08 - MAX_CIV_PLAYERS - меняется напрямую (я уже об этом где то говорил). От 3,67 до 5 Мб это что то из области фантастики... Хотя если компилировать с различными ключами (ну, там оптимизацию выключить...) Размер увеличится, но не настолько... Значит там еще чего то дописано... :shock:

Blacksun
19.11.2006, 16:21
Связь СДК и XML

См. статью http://forum.civfanatics.ru/index.php?showtopic=4631

НМ у меня ее тиснул отсюда. А без нее учебник будет не полный.

NeverMind
19.11.2006, 19:05
И это только начало. Отсюда надо несколько самостоятельных статетй выделить, чтобы их видно сразу было. А тут ты подредактируешь шапку темы, которая уже устарела и дашь ссылки на статьи проекта "Осваиваем SDK". А в них - на эту основную тему. И в шапку лучше перенести твою статью об установке SDK. Надо заняться. Крепись. :yes:

И на модиках надо раздел SDK поредактировать. И продублировать туда твои статьи и другие материалы из этой темы. А то кто то (:doctor:) писал
<div class='quotetop'>Цитата</div>
Сколько месяцев прошло, а про SDK в модиках не написано ни слова.[/b] Cколько месяцев уже после написанного прошло? :whistle:

Blacksun
19.11.2006, 22:42
Это не хорошо так делать - вырывать фразы из текста. Там и дальше написано:

<div class='quotetop'>Цитата</div>
Возможно это происходит потому, что там лежит слишком огромный объем информации и осмыслить его одному человеку, за такое короткое время, практически не под силу[/b] :nono:

qthree
11.05.2008, 19:44
как заюзать функцию косинус/синус? о_О
Пишет ambiguous call to overloaded function

General
11.05.2008, 20:26
На крайний случай можно использовать разложение в ряд:

sinx=x-x^3/3!+x^5/5!-x^7/7!+...
cosx=1-x^2/2!+x^4/4!-x^6/6!+...

А слагаемых берём столько, чколько нужно для точности

qthree
12.05.2008, 14:07
Можешь вот что подсказать, немогу понять что делать....
Делаю спутник, он автоматически пролетает по траектории.
Мне надо, чтобы он оставлял за собой видимую на один ход область.
Т.е. он допустим перемещается на 15 клеток, а радиус обзора 3 клетки, следовательно в конце перемещения остаются видны только лишь эти 3x3 клетки. А надо чтобы вокруг каждой точки на территории была видимая область 3x3.
Т.е. у меня просчитывается (for) для каждого X свой Y, тут же можно дописать функцию, делающую область видимой.

Я в принципе это сделал с помощью changeAdjacentSight:

for(int iI = MoveX1; iI < MoveX2; iI++)
{
//
//просчет Y
//
setXY(iI, MoveY2, true, true, true);
CvPlot* pPlot = GC.getMapINLINE().plotINLINE(iI, MoveY2);
pPlot->changeAdjacentSight(getTeam(), visibilityRange(), true, this, true);
}

- перемещаеся на каждую XY отдельно, и каждый раз делает сhangeAdjacentSight

Все вроде бы прекрасно, но как убрать обратно нормальную видимость? Клетка навсегда остается видимой.
Делаю алгаритм, чтобы по той же траектории он прошелся еще раз и скрыл все клетки.
Пробую changeAdjacentSight(getTeam(), visibilityRange(), false, this, true)
Он делает клетку невидимой. Так же перманетно.Даже если отправить на клетку юнит, то юнит просто пропадет.
Отсюда вопрос: как вернуть клетке обычное состояние?

Blacksun
12.05.2008, 17:11
Запоминаешь траекторию, а в начале турна делаешь все опять невидимым...

qthree
12.05.2008, 19:14
Как сделать невидимым? Я ж говорю, changeAdjacentSight меняет состояние на перманентное. Вот я прошу сказать какой функцией и с какими аргументами можно сделать клетку обычной обычной.


upd: проблема решена. Оказалось просто что при вызвании changeAdjacentSight (с false, т.е. сделать клетку невидимой) с радиусом большим чем расстояние до ближайшей клетки где вызывалась эта же функция создает эффект перекрывания. Таким образом я захожу на клетку, а она по прежнему невидимая так как её делает невидимой соседняя (не находящаяся в поле зрения юнита) клетка.

Peter
11.07.2008, 13:06
кто хочет загрузить 2008 студию:
http://www.microsoft.com/express/download/#webInstall

не помню сколько она весит, кажется мегабайт 600.

swan
11.07.2008, 18:10
<div class='quotetop'>Цитата</div>
кто хочет загрузить 2008 студию:
http://www.microsoft.com/express/download/#webInstall

не помню сколько она весит, кажется мегабайт 600.[/b]
В принципе цивовский движок корректно понимает только скомпиленные дллки на 2003-ем и через танцы с бубном на 2005-м - поэтому для моддеров вряд-ли 2008-я пойдет

NeverMind
12.09.2008, 00:34
Все файлы SDK размещены на модиках (http://modiki.civfanatics.ru/index.php/SDK_files) и в обычном виде (http://nm.civfanatics.ru/civ4/sdk/).

ppbis
12.09.2008, 03:55
Возможно, этот вопрос уже был, но тем не менее - можно ли как-то использовать SDK без Visual Studio?

Peter
12.09.2008, 08:40
просто возьмите какой нибудь компилятор и вперед.
студия то она удобнее просто.

White Hawk
12.09.2008, 09:40
<div class='quotetop'>Цитата</div>
просто возьмите какой нибудь компилятор и вперед.студия то она удобнее просто.[/b]
Есть один нюанс: системные функции и библиотечные функции самой Визуал Студии. Подозреваю, что для маковской цивы немножко другой СДК :) - и другой рекомендованный компилятор.

ppbis
13.09.2008, 05:36
<div class='quotetop'>Цитата</div>
просто возьмите какой нибудь компилятор и вперед.[/b]
Какой порекомендуете? Только размером поменьше. У меня винты и так забиты всякой дрянью :)

NeverMind
15.04.2009, 17:00
На их-фанатиках xienwolf делает отличное Руководство по редактированию DLL для идиотов (http://forums.civfanatics.com/showthread.php?t=314201). Очень рекомендую всем желающим начать!

NeseryozniyVET
31.07.2009, 17:04
Подскажите где 2003 студию взять.

NeverMind
31.07.2009, 23:10
А зачем? Если для Civ4, то можно вполне успешно пользоваться CodeBlocks.

Инструкция по установке и компиляции. (http://forums.civfanatics.com/showthread.php?t=166933)

Хальк Юсдаль
04.09.2009, 01:25
<div class='quotetop'>Цитата</div>
CodeBlocks[/b]
В общем скачал я этот CodeBlocks, скачал все что там требовалось, в итоге на 1 ГБ где-то потянуло.
Выставил как там указано. Для компиляции выбираю просто папку CvGameCoreDLL
Что в папке Beyond the Sword. Запускаю, никаких изменений в содержимое не внося. В итоге.


-------------- Build: Final Release Win32 in CvGameCoreDLL ---------------

CvCityAI.cpp
CvDLLButtonPopup.cpp
CvDLLEntity.cpp
CvDLLPython.cpp
CvDLLWidgetData.cpp
CvDeal.cpp
CvDiploParameters.cpp
CvDllPythonEvents.cpp
CvDllTranslator.cpp
CvEventReporter.cpp
CvFractal.cpp
CvGame.cpp
CvGameAI.cpp
CvGameCoreDLL.cpp
Execution of &#39;rc.exe /IBoost-1.32.0\inсludе /IPython24\inсludе -fo"Final Release Win32\CvGameCoreDLL.res" CvGameCoreDLL.rc&#39; in &#39;D:\Program Files\Firaxis Games\Sid Meier&#39;s Civilization 4\Beyond the Sword\CvGameCoreDLL&#39; failed.
Nothing to be done.

NeverMind
04.09.2009, 01:31
Насколько я понимаю, ты не сделал следующее...
<div class='quotetop'>Цитата</div>
1) remove CvGameCoreDLL.rc from the project (you must have already done this though to get this far):
- in the Projects workspace tab go to the directory (Resources) and right click on the CvGameCoreDLL.rc file. Select "Remove from project"[/b]
?

Хальк Юсдаль
04.09.2009, 02:44
<div class='quotetop'>Цитата</div>
Насколько я понимаю, ты не сделал следующее...[/b]
:huh1:
Именно. Как удалил, так нормально завершилась пробная компиляция, за 64 минуты правда, но там ещё и другие процессы мешали. Так что относительно терпимо время.
В итоге вышло
CvGameCoreDLL.dll - 6.32 МБ
CvGameCoreDLL.exp -510 КБ
CvGameCoreDLL.lib - 867 КБ
CvGameCoreDLL.pdb - 24.6 МБ

Первое похоже и есть то что требовалось. А остальные три на что?
И перед компиляцией измененные файлы помещаются в основную папку SDK, что в BTS?

NeverMind
04.09.2009, 09:45
64 минуты - это как то долго, у меня обычно минут 15 занимает. Хотя наверное действительно зависит от общей загруженности процессора.
Остальные три файла точно для игры не нужны. :)
Я бы советовал не делать компиляцию в основной папке игры, лучше оставить там CvGameCoreDLL нетронутой. У меня отдельная папка "SDK", куда я скопировал CvGameCoreDLL, там вношу изменения и компилирую.

Хальк Юсдаль
04.09.2009, 11:46
<div class='quotetop'>Цитата</div>
64 минуты - это как то долго, у меня обычно минут 15 занимает. Хотя наверное действительно зависит от общей загруженности процессора.[/b]
Ну и ещё от самого процессора. Все таки компьютер у меня ещё до появления цивы (4 конечно) сделан, и только некоторые улучшения претерпел. Впрочем сегодня в районе получаса шло.

<div class='quotetop'>Цитата</div>
Я бы советовал не делать компиляцию в основной папке игры, лучше оставить там CvGameCoreDLL нетронутой. У меня отдельная папка "SDK", куда я скопировал CvGameCoreDLL, там вношу изменения и компилирую.[/b]
Так вроде же компиляция происходит по адресу Beyond the Sword\Beyond the Sword\Assets
И оригинальный не затрагивает, а насчет самих файлов, я на ту копию, что выложена на форуме надеюсь.

В общем результат первого экперимента. Попытка совместить CAR-мод и Горный компонент, ну и на 50 цив.
Разве что ругался, но после удаления того на что ругался, нормально прошло.

bool CvPlot::isPotentialIrrigation() const
{
//===NM=====Mountain Mod===0X=====
if ((isCity() && !(isHills() || isPeak())) || ((getImprovementType() != NO_IMPROVEMENT) && (GC.getImprovementInfo(getImprovementType()).isCarriesIrrigation())))
{
if ((getTeam() != NO_TEAM) && GET_TEAM(getTeam()).isIrrigation())
{
return true;
}
}

return false;
}


bool CvPlot::canHavePotentialIrrigation() const
{
int iI;/Вредничает. Пишет CvPlot.cpp|1334|warning C4101: &#39;iI&#39; : unreferenced local variable|
||=== Build finished: 0 errors, 1 warnings ===|


//===NM=====Mountain Mod===0X=====
if ((isCity() && !isHills()) || ((getImprovementType() != NO_IMPROVEMENT) && (GC.getImprovementInfo(getImprovementType()).isCarriesIrrigation())))
{
if ((getTeam() != NO_TEAM) && GET_TEAM(getTeam()).isIrrigation())
{
return true;
}
}

return false;
}

Было когда сильно ругался на повтор bool CvPlot::canHavePotentialIrrigation() const

[spoiler][code]bool CvPlot::canHavePotentialIrrigation() const
{

NeverMind
04.09.2009, 11:58
Поздравляю с переходом к SDK-моддингу! :.V.:

Возможность увеличения лимита цив сделали в Warlords, в ванильной игре это не проходит.

PS. Кстати, Хальк Юсдаль, если будет время, может попробуешь перевести/составить аналогичное описание по установке/компиляции SDK на русском? А то дело нужное, а у меня все руки не доходят.

swan
04.09.2009, 12:28
<div class='quotetop'>Цитата</div>
Возможность увеличения лимита цив сделали в Warlords, в ванильной игре это не проходит[/b]
В ванилле 1.61 это сделали, но через заднепроходное отверстие, в 1.72 и 1.74 уже попроще, но тоже слишком геморно - уже и забыл как это делается, но мне показывали - если вспомню - опишу - но всё же это возможно в этих версиях - в 1.52 и ранее это было абсолютно невозможно

NeverMind
04.09.2009, 12:45
<div class='quotetop'>Цитата(swan * 4.9.2009, 12:28) 305363</div>
В ванилле 1.61 это сделали, но через заднепроходное отверстие, в 1.72 и 1.74 уже попроще, но тоже слишком геморно - уже и забыл как это делается, но мне показывали - если вспомню - опишу - но всё же это возможно в этих версиях - в 1.52 и ранее это было абсолютно невозможно[/b] Я такого не видел. Ссылку, пожалуйста.

swan
04.09.2009, 13:06
Ссылки нема (давно это было) - но это было - для 1.74, если не ошибаюсь даже блэксан чего-то ковырял (хотя могу и ошибаться)

ЗЫ кстати, Нёва - вспомни корень files.civfanatics.ru района середины 2007 года ;) (если память с кем нить изменяет - то ЛС)

NeverMind
04.09.2009, 13:19
<div class='quotetop'>Цитата(swan * 4.9.2009, 13:06) 305372</div>
Ссылки нема (давно это было) - но это было - для 1.74, если не ошибаюсь даже блэксан чего-то ковырял (хотя могу и ошибаться)[/b] Blacksun действительно чего то ковырял в этом направлении, но без результатов. Иначе бы он, конечно, не стал скрывать такого полезного достижения. Равно как и куча моддеров на их-фанатиках, которые тоже ковыряли с тем же успехом.

Если нет ссылки, то, может быть, спросим у того, кто тебе показывал? Тогда можно будет о чем то говорить или даже сделать. А так это слишком туманно...

"Корень" то я помню, но про обхождение ванильного лимита в 18 цив там ничего не было. Мы же вроде об этом?

swan
04.09.2009, 18:29
Не хочу показаться умным или что нибудь в этом роде, но точно помню, что каким-то образом, хоть и через жопу, но можно было таки увеличить число наций

Хальк Юсдаль
04.09.2009, 21:28
<div class='quotetop'>Цитата</div>
Поздравляю с переходом к SDK-моддингу![/b]
Спасибо, если бы я ещё понимал хоть что к чему. Меня содержимое этих файлов пугает. Хотя далеко не так сильно как Питон. По крайней мере вставлять куски кода в указанных местах хоть могу.

<div class='quotetop'>Цитата</div>
PS. Кстати, Хальк Юсдаль, если будет время, может попробуешь перевести/составить аналогичное описание по установке/компиляции SDK на русском? А то дело нужное, а у меня все руки не доходят.[/b]
Когда вчера читал, все думал об этом, а сегодня вечером и сделал. Некоторые поправки внес основываясь на собственном опыте.
С тем предупреждением разобрался, оказывается просто скопировал неправильно, ещё когда Блокнотом соединял.
А когда изменен только один файл и Dll осталась лежать где и в прошлый раз, то перекомпилируется только тот файл что изменен?
У меня это изменение заняло 1 минуту 13 секунд.
P.S. А вот горы почему-то так и остались непроходимыми. Странно, придется разбираться с ними дальше.

swan
05.09.2009, 04:07
<div class='quotetop'>Цитата</div>
Спасибо, если бы я ещё понимал хоть что к чему. Меня содержимое этих файлов пугает. Хотя далеко не так сильно как Питон. По крайней мере вставлять куски кода в указанных местах хоть могу. [/b]
Питон по своей сути - это Васик в сишной обёртке - его изучить не так уж и сложно - главное не забывать про табуляции - главный бред питона в том, что тело функции в нем обозначается табулированием или смещением начала кода тела функции на одну или более позиций с помощью пробела