Просмотр полной версии : [Решено] Как сделать, чтобы ИИ избегал повреждений юнитов от ландшафта?
NeverMind привет. Не подскажешь, что это да строчка в GlobalDefines
"PATH_DAMAGE_WEIGHT"
Вообще на модиках очень для многих строк в этом файле отсутствует описание, есть ли оно где-нибудь?
NeverMind
19.08.2009, 23:03
<div class='quotetop'>Цитата</div>
NeverMind привет. Не подскажешь, что это да строчка в GlobalDefines
"PATH_DAMAGE_WEIGHT"[/b] Помню, что смотрел, и не понял :blink:. Возможно, еще посмотрю.
<div class='quotetop'>Цитата</div>
Вообще на модиках очень для многих строк в этом файле отсутствует описание, есть ли оно где-нибудь?[/b] Да, некоторые параметры в этом файле трудно понять, некоторы трудно сформулировать. Врочем, большинство игровых параметров по нему описано. Описания этого файла нигде больше не встречал.
<div class='quotetop'>Цитата(NeverMind * 19.8.2009, 23:03) 301106</div>
<div class='quotetop'>Цитата
NeverMind привет. Не подскажешь, что это да строчка в GlobalDefines
"PATH_DAMAGE_WEIGHT"[/b] Помню, что смотрел, и не понял :blink:. Возможно, еще посмотрю.
<div class='quotetop'>Цитата</div>
Вообще на модиках очень для многих строк в этом файле отсутствует описание, есть ли оно где-нибудь?[/b] Да, некоторые параметры в этом файле трудно понять, некоторы трудно сформулировать. Врочем, большинство игровых параметров по нему описано. Описания этого файла нигде больше не встречал.
[/b][/quote]
Может быть этот параметр отвечает за понимание компьютером получения повреждений юнитами при прохождении каких-то запрограммированных на это feature элементов?
А то у меня в моде как раз с этим проблемы.
Кстати, может кто-то знает, в моде про космос (не помню как точно называется. официальный мод БтС), там тоже есть feature с повреждениями, там комп их избегает? И если и если избегает то чем это определено?
pashaintel
20.08.2009, 08:35
В доступном нам коде этот параметр используется только один раз:
[code]// Damage caused by features (mods)
<div class='quotetop'>Цитата(Пашок * 20.8.2009, 8:35) 301118</div>[quote]
В доступном нам коде этот параметр используется только один раз:
[code]// Damage caused by features (mods)
NeseryozniyVET
20.08.2009, 15:56
// Damage caused by features (mods)
if (0 != GC.getPATH_DAMAGE_WEIGHT()) //если есть повреждения (если GC.getPATH_DAMAGE_WEIGHT() не равно нулю) тогда
{
if (pToPlot->getFeatureType() != NO_FEATURE) //если на тайле есть феатура (лес, оазис и т. д.) тогда
{
+= (GC.getPATH_DAMAGE_WEIGHT() * std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage())) / GC.getMAX_HIT_POINTS();
// до значения iCost добавляем ((повреждения(GC.getPATH_DAMAGE_WEIGHT()) умноженые на количество ходов повреждений? [std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage())]) и деленные на максимум жизни [GC.getMAX_HIT_POINTS()])
}
if (pToPlot->getExtraMovePathCost() > 0) //если при движении на тайле тратятся дополнительные очки движения [pToPlot->getExtraMovePathCost()] (например в пустыне или на холмах) тогда
{
iCost += (PATH_MOVEMENT_WEIGHT * pToPlot->getExtraMovePathCost());
//до значения iCost добавляем (PATH_MOVEMENT_WEIGHT умноженое на дополнительные очки движения на тайле [pToPlot->getExtraMovePathCost()])
}
}
Для полного понимания надо код функций GC.getPATH_DAMAGE_WEIGHT(), getTurnDamage(), getExtraMovePathCost()
Из какого файла этот код?
<div class='quotetop'>Цитата(NeseryozniyVET * 20.8.2009, 15:56) 301183</div>
// Damage caused by features (mods)
if (0 != GC.getPATH_DAMAGE_WEIGHT()) //если есть повреждения (если GC.getPATH_DAMAGE_WEIGHT() не равно нулю) тогда
{
if (pToPlot->getFeatureType() != NO_FEATURE) //если на тайле есть феатура (лес, оазис и т. д.) тогда
{
+= (GC.getPATH_DAMAGE_WEIGHT() * std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage())) / GC.getMAX_HIT_POINTS();
// до значения iCost добавляем ((повреждения(GC.getPATH_DAMAGE_WEIGHT()) умноженые на количество ходов повреждений? [std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage())]) и деленные на максимум жизни [GC.getMAX_HIT_POINTS()])
}
if (pToPlot->getExtraMovePathCost() > 0) //если при движении на тайле тратятся дополнительные очки движения [pToPlot->getExtraMovePathCost()] (например в пустыне или на холмах) тогда
{
iCost += (PATH_MOVEMENT_WEIGHT * pToPlot->getExtraMovePathCost());
//до значения iCost добавляем (PATH_MOVEMENT_WEIGHT умноженое на дополнительные очки движения на тайле [pToPlot->getExtraMovePathCost()])
}
}
Для полного понимания надо код функций GC.getPATH_DAMAGE_WEIGHT(), getTurnDamage(), getExtraMovePathCost()
Из какого файла этот код?
[/b]
Спасибо! Всё более и боее убеждаюсь, что скоро решу проблему с умиранием отрядов AI в пустынях.
Из какого файла код, не знаю. Надо Пашка спросить.
Мне бы ещё знать какие значения может принимать этот параметр. Только 0 или 1? Или больше? А если больше, то на что влияет величина числа?
NeseryozniyVET
20.08.2009, 16:16
<div class='quotetop'>Цитата(vasaka * 20.8.2009, 15:11) 301190</div>
Мне бы ещё знать какие значения может принимать этот параметр. Только 0 или 1? Или больше? А если больше, то на что влияет величина числа?
[/b]
Надо посмотреть код функции GC.getPATH_DAMAGE_WEIGHT()
pashaintel
20.08.2009, 16:18
GC.getPATH_DAMAGE_WEIGHT() - возвращает число,прописанное в GlobalDefines. Похоже,это просто множитель, чем он больше,тем больше урон,наносимый юниту при прохождении тайла. Код из CvGameCore Utils.cpp
NeseryozniyVET
20.08.2009, 16:34
<div class='quotetop'>Цитата(vasaka * 20.8.2009, 15:11) 301190</div>
Спасибо! Всё более и боее убеждаюсь, что скоро решу проблему с умиранием отрядов AI в пустынях.
Из какого файла код, не знаю. Надо Пашка спросить.
Мне бы ещё знать какие значения может принимать этот параметр. Только 0 или 1? Или больше? А если больше, то на что влияет величина числа?
[/b]
По умолчанию PATH_DAMAGE_WEIGHT равен нулю, поэтому код просто игнорируется.
Может принимать любые целые числа, даже отрицательные.
Насколько я понял, AI делает расчёты сможет ли он преодолеть враждебный feature или он его по пути грохнет и в связи с этим решается идти или нет. Так?
NeverMind
20.08.2009, 22:31
В общих чертах да. Этот параметр учитывается при выборе пути юнитом. Насколько я понял, чем больше значение PATH_DAMAGE_WEIGHT, тем менее вероятно, что юнит пойдет через данный тайл при прочих равных.
<div class='quotetop'>Цитата(NeverMind * 20.8.2009, 22:31) 301251</div>
В общих чертах да. Этот параметр учитывается при выборе пути юнитом. Насколько я понял, чем больше значение PATH_DAMAGE_WEIGHT, тем менее вероятно, что юнит пойдет через данный тайл при прочих равных.
[/b]
Ясно. Осталось определить какое значения будет оптимальным. Чтобы войска и не погибали в песках и не совсем отказывались по ним ходить. Это можно как-то вычислить или только эксперементальным путём?
<div class='quotetop'>Цитата</div>
даже отрицательные[/b]
А если отрицательные то отряду на тайле наоборот очки здоровья прибавляться будут по логике?
В RFC варвары и вражеские юниты точно не предпочитают задерживаться на русской территории из-за эффекта "русская зима", но прбежками там передвигаются. Можно наверное там посмотреть.
Expression
24.08.2009, 12:28
Также В RFC: Europe на болотах легкие юниты(а также венецианцы, изза спецефической столицы на болотах, Рае говрит, что уберет потом) получают по 10% поврежений за ход, простоянный на болоте.
Я знаю, что берсерки, серироносцы, мечники, скирмишеры, рабочие поселенцы могут бегать по болотам.
<div class='quotetop'>Цитата(AR74 * 24.8.2009, 8:55) 301762</div>
В RFC варвары и вражеские юниты точно не предпочитают задерживаться на русской территории из-за эффекта "русская зима", но прбежками там передвигаются. Можно наверное там посмотреть.
[/b]
В RFC обычной или в RFC: Europe?
Expression
24.08.2009, 13:37
<div class='quotetop'>Цитата(vasaka * 24.8.2009, 17:29) 301840</div>
<div class='quotetop'>Цитата(AR74 * 24.8.2009, 8:55) 301762
В RFC варвары и вражеские юниты точно не предпочитают задерживаться на русской территории из-за эффекта "русская зима", но прбежками там передвигаются. Можно наверное там посмотреть.
[/b]
В RFC обычной или в RFC: Europe?
[/b][/quote]
В обычной
Наиболее подходяшее значение параметра:
PATH_DAMAGE_WEIGHT
500000 (пятьсот тысяч)
Оно же используется в официальном моде про космос (не помню названия).
Прописал коды всех функций GC.getPATH_DAMAGE_WEIGHT(), getTurnDamage(), getExtraMovePathCost() в Колонизацию.
Все прекрасно работает, но если пустить свой корабль на исследование территории, то независимо от значения PATH_DAMAGE_WEIGHT в GlobalDefines.xml корабль все время идет одним и тем же путем и естественно гибнет на одном и том же ходу.
Я попробовал значения PATH_DAMAGE_WEIGHT равные -500000, 0 и 500000.
Результат один и тот же. 20 ходов и "на корм рыбам".
Перемещение корабля по одному и тому же пути означает, что PATH_DAMAGE_WEIGHT не имеет смысла вообще. Оно что есть, что нет.
Поэтому вопрос. Как и на основании чего было выведено:
<div class='quotetop'>Цитата</div>
Наиболее подходяшее значение параметра:
PATH_DAMAGE_WEIGHT
500000 (пятьсот тысяч)[/b]
pashaintel
15.02.2010, 01:27
<div class='quotetop'>Цитата(kabjans * 14.2.2010, 23:41) 325166</div>
Прописал коды всех функций GC.getPATH_DAMAGE_WEIGHT(), getTurnDamage(), getExtraMovePathCost() в Колонизацию. [/b]
Ну прописал... и всё?
<div class='quotetop'>Цитата(kabjans * 14.2.2010, 23:41) 325166</div>
Все прекрасно работает, но если пустить свой корабль на исследование территории, то независимо от значения PATH_DAMAGE_WEIGHT в GlobalDefines.xml корабль все время идет одним и тем же путем и естественно гибнет на одном и том же ходу. [/b]
Само собой, ИИ не понимает,шо это за таинственные функции ты его заставил выполнять и что делать с результатом от выполнения этих функций. Ведь код,определяющий путь юнита и учёт всех опасностей на этом пути ты в колонизацию не перенёс...
<div class='quotetop'>Цитата(kabjans * 14.2.2010, 23:41) 325166</div>
Перемещение корабля по одному и тому же пути означает, что PATH_DAMAGE_WEIGHT не имеет смысла вообще. Оно что есть, что нет. [/b]
Именно так в результате и получается. Так что учи ИИ понимать новые функции.
<div class='quotetop'>Цитата(Пашок * 15.2.2010, 1:25) 325170</div>
<div class='quotetop'>Цитата(kabjans * 14.2.2010, 23:41) 325166
Прописал коды всех функций GC.getPATH_DAMAGE_WEIGHT(), getTurnDamage(), getExtraMovePathCost() в Колонизацию. [/b]
Ну прописал... и всё?
<div class='quotetop'>Цитата(kabjans * 14.2.2010, 23:41) 325166</div>
Все прекрасно работает, но если пустить свой корабль на исследование территории, то независимо от значения PATH_DAMAGE_WEIGHT в GlobalDefines.xml корабль все время идет одним и тем же путем и естественно гибнет на одном и том же ходу. [/b]
Само собой, ИИ не понимает,шо это за таинственные функции ты его заставил выполнять и что делать с результатом от выполнения этих функций. Ведь код,определяющий путь юнита и учёт всех опасностей на этом пути ты в колонизацию не перенёс...
<div class='quotetop'>Цитата(kabjans * 14.2.2010, 23:41) 325166</div>
Перемещение корабля по одному и тому же пути означает, что PATH_DAMAGE_WEIGHT не имеет смысла вообще. Оно что есть, что нет. [/b]
Именно так в результате и получается. Так что учи ИИ понимать новые функции.
[/b][/quote]
"Прописал коды всех функций" - это значит, что все, что было в Цивилизации полностью переехало в Колонизацию. Иначе скомпилировать без ошибок было бы невозможно.
Вот к примеру:
Sid Meier's Civilization IV Colonization
Search "PATH_DAMAGE_WEIGHT" (10 hits in 3 files)
C:\Program Files\2K Games\Firaxis Games\Sid Meier's Civilization IV Colonization\Mods\1492 Global Colonization Weather\SDK\CvGameCoreUtils.cpp (3 hits)
Line 31: #define PATH_DAMAGE_WEIGHT (500)
Line 935: if (0 != GC.getPATH_DAMAGE_WEIGHT())
Line 939: iCost += (GC.getPATH_DAMAGE_WEIGHT() * std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage())) / GC.getMAX_HIT_POINTS();
C:\Program Files\2K Games\Firaxis Games\Sid Meier's Civilization IV Colonization\Mods\1492 Global Colonization Weather\SDK\CvGlobals.cpp (5 hits)
Line 88: m_iPATH_DAMAGE_WEIGHT(0),
Line 2175: m_iPATH_DAMAGE_WEIGHT = getDefineINT("PATH_DAMAGE_WEIGHT");
Line 2175: m_iPATH_DAMAGE_WEIGHT = getDefineINT("PATH_DAMAGE_WEIGHT");
Line 2292: int CvGlobals::getPATH_DAMAGE_WEIGHT()
Line 2294: return m_iPATH_DAMAGE_WEIGHT;
C:\Program Files\2K Games\Firaxis Games\Sid Meier's Civilization IV Colonization\Mods\1492 Global Colonization Weather\SDK\CvGlobals.h (2 hits)
Line 589: int getPATH_DAMAGE_WEIGHT();
Line 921: int m_iPATH_DAMAGE_WEIGHT;
Sid Meier's Civilization 4\Beyond the Sword\CvGameCoreDLL
Search "PATH_DAMAGE_WEIGHT" (10 hits in 3 files)
C:\Program Files\Firaxis Games\Sid Meier's Civilization 4\Beyond the Sword\CvGameCoreDLL\CvGameCoreUtils.cpp (3 hits)
Line 30: #define PATH_DAMAGE_WEIGHT (500)
Line 1401: if (0 != GC.getPATH_DAMAGE_WEIGHT())
Line 1405: iCost += (GC.getPATH_DAMAGE_WEIGHT() * std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage())) / GC.getMAX_HIT_POINTS();
C:\Program Files\Firaxis Games\Sid Meier's Civilization 4\Beyond the Sword\CvGameCoreDLL\CvGlobals.cpp (5 hits)
Line 147: m_iPATH_DAMAGE_WEIGHT(0),
Line 2587: m_iPATH_DAMAGE_WEIGHT = getDefineINT("PATH_DAMAGE_WEIGHT");
Line 2587: m_iPATH_DAMAGE_WEIGHT = getDefineINT("PATH_DAMAGE_WEIGHT");
Line 2724: int CvGlobals::getPATH_DAMAGE_WEIGHT()
Line 2726: return m_iPATH_DAMAGE_WEIGHT;
C:\Program Files\Firaxis Games\Sid Meier's Civilization 4\Beyond the Sword\CvGameCoreDLL\CvGlobals.h (2 hits)
Line 696: int getPATH_DAMAGE_WEIGHT();
Line 1115: int m_iPATH_DAMAGE_WEIGHT;
Аналогично сделано и по getTurnDamage(), getExtraMovePathCost().
http://img28.imageshack.us/img28/9281/18023036.th.jpg (http://img28.imageshack.us/img28/9281/18023036.jpg)
http://img28.imageshack.us/img28/527/37240963.th.jpg (http://img28.imageshack.us/img28/527/37240963.jpg)
pashaintel
15.02.2010, 02:13
Возможно,я не прав. Я всего лишь хочу сказать,что во всех этих кодах напрочь отсутствует указание на то,как ИИ использует эти функции. Ну посчитал он тебе сколько "жизни" у него отнимется при прохождении,скажем,рифов. И что? Покажи мне код,где на основе этого ИИ принимает решение не ходить на эту клетку.
<div class='quotetop'>Цитата(Пашок * 15.2.2010, 2:11) 325173</div>
Возможно,я не прав. Я всего лишь хочу сказать,что во всех этих кодах напрочь отсутствует указание на то,как ИИ использует эти функции. Ну посчитал он тебе сколько "жизни" у него отнимется при прохождении,скажем,рифов. И что? Покажи мне код,где на основе этого ИИ принимает решение не ходить на эту клетку.
[/b]
Вот в этом и проблема. ИИ знает сколько ему будет стоить ход на опасную клетку, но все равно идет. И так до тех пор пока не гибнет.
А по логике надо, чтобы при уровне повреждений к примеру 50% ИИ остановливался и восстанавливал здоровье до 100%, а лишь потом шел бы дальше.
Вот только такого я в кодах не нашел, а самому сделать, увы, ума не хватает. А это было бы прекрасным дополнением и для Цивилизации, и для Колонизации.
Я тут прикинул варианты. Помнится встречалась такая фишка, как выход из боя, если повреждение больше скольки-то процентов. Причем "выход из боя" был с некоторой вероятностью. А что если прописать вероятность продолжения движения раненого юнита? Чем меньше хит-пойнтов осталось, тем менее вероятно, что юнит продолжит движение. По-моему, логично.
<div class='quotetop'>Цитата(Пашок * 15.2.2010, 2:11) 325173</div>
Возможно,я не прав. Я всего лишь хочу сказать,что во всех этих кодах напрочь отсутствует указание на то,как ИИ использует эти функции. Ну посчитал он тебе сколько "жизни" у него отнимется при прохождении,скажем,рифов. И что? Покажи мне код,где на основе этого ИИ принимает решение не ходить на эту клетку.
[/b]
Я такого места, где ИИ принимает решение не ходить на клетку не нашел. Поэтому и ищу варианты.
Нашел такой, который мне кажется наиболее логичным и простым в реализации. Вот его суть.
Вот участок кода, связанный с движением по опасной клетке из CvGameCoreUtils.cpp (я беру вариант Civ4BTS).
[code]
pashaintel
15.02.2010, 16:24
Все функции,связанные с поведением ИИ,находятся в CvUnitAI, CvPlayerAI, CvCityAI, CvSelectionGroupAI, CvTeamAI. Вот там и смотри. int pathCost ты нашёл,теперь ищи где это используется. И по-видимому, тебе понадобится кто-то с хорошими знаниями С++, так как дальше всё сложнее.
А в приведенном мной варианте можно ввести проверку на состояние юнита перед его дальнейшим движением?
Powered by vBulletin® Version 4.1.9 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot