PDA

Просмотр полной версии : [Решено] Как сделать, чтобы ИИ избегал повреждений юнитов от ландшафта?



vasaka
19.08.2009, 11:48
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] Да, некоторые параметры в этом файле трудно понять, некоторы трудно сформулировать. Врочем, большинство игровых параметров по нему описано. Описания этого файла нигде больше не встречал.

vasaka
20.08.2009, 07:24
<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)

vasaka
20.08.2009, 10:59
<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()

Из какого файла этот код?

vasaka
20.08.2009, 16:11
<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 равен нулю, поэтому код просто игнорируется.
Может принимать любые целые числа, даже отрицательные.

vasaka
20.08.2009, 18:48
Насколько я понял, AI делает расчёты сможет ли он преодолеть враждебный feature или он его по пути грохнет и в связи с этим решается идти или нет. Так?

NeverMind
20.08.2009, 22:31
В общих чертах да. Этот параметр учитывается при выборе пути юнитом. Насколько я понял, чем больше значение PATH_DAMAGE_WEIGHT, тем менее вероятно, что юнит пойдет через данный тайл при прочих равных.

vasaka
21.08.2009, 06:17
<div class='quotetop'>Цитата(NeverMind * 20.8.2009, 22:31) 301251</div>

В общих чертах да. Этот параметр учитывается при выборе пути юнитом. Насколько я понял, чем больше значение PATH_DAMAGE_WEIGHT, тем менее вероятно, что юнит пойдет через данный тайл при прочих равных.
[/b]

Ясно. Осталось определить какое значения будет оптимальным. Чтобы войска и не погибали в песках и не совсем отказывались по ним ходить. Это можно как-то вычислить или только эксперементальным путём?

Triver
21.08.2009, 12:58
<div class='quotetop'>Цитата</div>
даже отрицательные[/b]
А если отрицательные то отряду на тайле наоборот очки здоровья прибавляться будут по логике?

AR74
24.08.2009, 08:55
В RFC варвары и вражеские юниты точно не предпочитают задерживаться на русской территории из-за эффекта "русская зима", но прбежками там передвигаются. Можно наверное там посмотреть.

Expression
24.08.2009, 12:28
Также В RFC: Europe на болотах легкие юниты(а также венецианцы, изза спецефической столицы на болотах, Рае говрит, что уберет потом) получают по 10% поврежений за ход, простоянный на болоте.

Я знаю, что берсерки, серироносцы, мечники, скирмишеры, рабочие поселенцы могут бегать по болотам.

vasaka
24.08.2009, 13:29
<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]

В обычной

vasaka
28.08.2009, 08:37
Наиболее подходяшее значение параметра:
PATH_DAMAGE_WEIGHT

500000 (пятьсот тысяч)

Оно же используется в официальном моде про космос (не помню названия).

kabjans
15.02.2010, 00:43
Прописал коды всех функций 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]
Именно так в результате и получается. Так что учи ИИ понимать новые функции.

kabjans
15.02.2010, 01:42
<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&#39;s Civilization IV Colonization
Search "PATH_DAMAGE_WEIGHT" (10 hits in 3 files)

C:\Program Files\2K Games\Firaxis Games\Sid Meier&#39;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&#39;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&#39;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&#39;s Civilization 4\Beyond the Sword\CvGameCoreDLL
Search "PATH_DAMAGE_WEIGHT" (10 hits in 3 files)

C:\Program Files\Firaxis Games\Sid Meier&#39;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&#39;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&#39;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
Возможно,я не прав. Я всего лишь хочу сказать,что во всех этих кодах напрочь отсутствует указание на то,как ИИ использует эти функции. Ну посчитал он тебе сколько "жизни" у него отнимется при прохождении,скажем,рифов. И что? Покажи мне код,где на основе этого ИИ принимает решение не ходить на эту клетку.

kabjans
15.02.2010, 02:22
<div class='quotetop'>Цитата(Пашок * 15.2.2010, 2:11) 325173</div>

Возможно,я не прав. Я всего лишь хочу сказать,что во всех этих кодах напрочь отсутствует указание на то,как ИИ использует эти функции. Ну посчитал он тебе сколько "жизни" у него отнимется при прохождении,скажем,рифов. И что? Покажи мне код,где на основе этого ИИ принимает решение не ходить на эту клетку.
[/b]
Вот в этом и проблема. ИИ знает сколько ему будет стоить ход на опасную клетку, но все равно идет. И так до тех пор пока не гибнет.

А по логике надо, чтобы при уровне повреждений к примеру 50% ИИ остановливался и восстанавливал здоровье до 100%, а лишь потом шел бы дальше.

Вот только такого я в кодах не нашел, а самому сделать, увы, ума не хватает. А это было бы прекрасным дополнением и для Цивилизации, и для Колонизации.

Я тут прикинул варианты. Помнится встречалась такая фишка, как выход из боя, если повреждение больше скольки-то процентов. Причем "выход из боя" был с некоторой вероятностью. А что если прописать вероятность продолжения движения раненого юнита? Чем меньше хит-пойнтов осталось, тем менее вероятно, что юнит продолжит движение. По-моему, логично.

kabjans
15.02.2010, 13:25
<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 ты нашёл,теперь ищи где это используется. И по-видимому, тебе понадобится кто-то с хорошими знаниями С++, так как дальше всё сложнее.

kabjans
15.02.2010, 16:32
А в приведенном мной варианте можно ввести проверку на состояние юнита перед его дальнейшим движением?