Decision Maker
Материал из GTAModding.ru
Версия от 06:17, 24 июля 2011; VcSaJen (обсуждение | вклад)
Decision Maker - это модель поведения педов, или AI. В ней хранится базовое поведение актёра, его реакция на различные события.
Содержание |
DM для актёров
Создает виртуальную модель поведения с типом 0 и записывает в $DM:
060A: create_decision_maker_type 0 store_to $DM // see pedstats.dat
Типы:
- DM 0 - поведение актера в группе
- DM 1 - модель поведения копа
- DM 2 - обычная модель
- DM 3 - храброе поведение
- DM 4 - трусливое поведение
- DM 5 - модель поведения пожарного
- DM 6 - модель поведения водителя поезда (?)
Добавить реакцию для события:
0709: set_decision_maker $DM on_event 36 taskID 1022 chance_if_acquaintance respect 0.0 hate 100.0 unk 0.0 unk 0.0 in_car 1 on_foot 1 // see *.ped files
Где $DM - хендл модели поведения, on_event 36 - событие, на которое реагирует актёр, taskID 1022 - реакция (задача) актёра, четыре числа после chance_if_acquaintance - вероятность события при разных отношениях к объекту события, in_car 1 - реакция действует, когда актёр в машине; on_foot 1 - реакция действует, когда актёр пешком.
Расскажем теперь поподробнее. На одно событие может быть несколько реакций, например:
0709: set_decision_maker 1@ on_event 7 taskID 702 chance respect 50.0 hate 50.0 unk 50.0 unk 50.0 in_car 1 on_foot 1 0709: set_decision_maker 1@ on_event 7 taskID 911 chance respect 50.0 hate 50.0 unk 50.0 unk 50.0 in_car 1 on_foot 1
При возникновении события 7 (педа выбросили из машины) с вероятностью пятьдесят на пятьдесят при любых отношениях к угонщику (все четыре шанса - 50%) пед или выбросит угонщика и уедет (задача 702), или убежит от угонщика (задача 911).
Пример посложнее:
0709: set_decision_maker 1@ on_event 7 taskID 702 chance respect 10.0 hate 0.0 unk 70.0 unk 70.0 in_car 1 on_foot 1 0709: set_decision_maker 1@ on_event 7 taskID 911 chance respect 90.0 hate 0.0 unk 20.0 unk 20.0 in_car 1 on_foot 1 0709: set_decision_maker 1@ on_event 7 taskID 1000 chance respect 0.0 hate 100.0 unk 10.0 unk 10.0 in_car 1 on_foot 1
Если отношение педа к угонщику уважительное (respect), то с шансом 90% он убежит, с шансом 10% выбросит угонщика и быстро уедет. Если отношение педа к угонщику ненавистное (hate), то со 100% шансом он его убьёт (задача 1000). Если отношение педа к угонщику нейтральное (неприязненное или приязненное), с шансом 70% он выбросит угонщика и быстро уедет, с шансом 20% убежит, с шансом 10% нападёт на угонщика.
Ещё пример:
0709: set_decision_maker 1@ on_event 31 taskID 1000 chance respect 0.0 hate 100.0 unk 0.0 unk 0.0 in_car 0 on_foot 1 0709: set_decision_maker 1@ on_event 31 taskID 1022 chance respect 0.0 hate 100.0 unk 0.0 unk 0.0 in_car 1 on_foot 0
При событии 31 (пед увидел ненавистного ему педа) если он в машине (in_car 1 on_foot 0), то нападёт на него в DriveBy (задача 1022), высунувшись из окна и стреляя оружием. Если он пешком (in_car 0 on_foot 1), то он просто нападёт на педа (задача 1000).
Примечание: Не все задачи работают с конкретными событиями. Те задачи, которые работают в одном событии, могут не работать в другом событии.
Продолжим перечислять опкоды:
Сбросить информацию для события:
0708: reset_decision_maker $DM event 27
Перед тем как добавлять реакции на событие в модель поведения, следует сбросить информацию об этом событии.
Назначение этих опкодов неизвестно:
07E5: unknown_set 65543 decision_maker $DM
0978: unknown_set 65543 decision_maker $DM
Известно лишь, что 65543 - это маска. При компиляции данное число будет храниться как 0700 0100. Игра не читает целиком все число 65543, а только 1-й байт (07), у остальных 3-х байтов какое-то иное предназначение.
Присваивает актеру данную модель поведения:
060B: set_actor 1@ decision_maker_to $DM
07BC: set_actor -1 decision_maker_to $DM // AS_pack version
Удаление модели поведения:
065C: release_decision_maker $DM
Пример скрипта:
{$CLEO}
wait 4000
0@ = Actor.Create(Gang2, #MALE01, 2503.4812, -1671.2251, 13.3625)
#AK47.Load
while not #AK47.Available
wait 0
end
01B2: give_actor 0@ weapon 30 ammo 99999
#AK47.Destroy
060A: create_decision_maker_type 0 store_to 1@
0708: reset_decision_maker 1@ event 36
0708: reset_decision_maker 1@ event 37
0709: set_decision_maker 1@ on_event 36 taskID 1022 chance_if_acquaintance respect 0.0 hate 100.0 unk_like_dislike 0.0 unk_like_dislike 0.0 in_car 1 on_foot 0
0709: set_decision_maker 1@ on_event 37 taskID 1022 chance_if_acquaintance respect 0.0 hate 1.0 unk_like_dislike 0.0 unk_like_dislike 0.0 in_car 1 on_foot 0
0709: set_decision_maker 1@ on_event 36 taskID 1024 chance_if_acquaintance respect 0.0 hate 100.0 unk_like_dislike 0.0 unk_like_dislike 0.0 in_car 0 on_foot 1
060B: set_actor 0@ decision_maker_to 1@
0631: put_actor 0@ in_group $PLAYER_GROUP
077A: set_actor 0@ acquaintance 1 {respect} to_actors_pedtype 0
077A: set_actor 0@ acquaintance 1 {respect} to_actors_pedtype 8
077A: set_actor 0@ acquaintance 3 {dislike} to_actors_pedtype 6
077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 7
077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 9
077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 11
077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 12
077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 17
while not Actor.Dead(0@)
wait 1500
end
Actor.RemoveReferences(0@)
065C: release_decision_maker 1@
0A93: end_custom_thread
DM для групп
создать групповую модель поведения:
06AE: create_group_decision_maker_type 0 store_to $GDM // see pedstats.dat
Тип 0 - групповое поведение.
Присвоить группе групповую модель поведения:
06AD: set_group $PLAYER_GROUP group_decision_maker_to $GDM
Задать реакцию на событие (аналогично описанию выше, но есть групповые события, например EVENT_LEADER_ENTERED_CAR_AS_DRIVER (54), EVENT_LEADER_EXITED_CAR_AS_DRIVER (55)):
074A: set_group_decision_maker $GDM on_event 54 taskID 1513 chance_if_acquaintance respect 100.0 hate 100.0 unk 100.0 unk 100.0 in_car 1 on_foot 1
Неизвестно:
07E6: unknown_set -1 group_decision_maker $GDM
Сбросить информацию для события:
0749: reset_group_decision_maker $GDM event 54
Связь DM и .PED, .GRP файлов
По умолчанию модель поведения всех педов берётся из папки data\Decision\Allowed из *.ped файлов.
При создании модели поведения в скриптах за основу берётся тоже *.ped файл из папки data\Decision\Allowed.
В опкоде060A: create_decision_maker_type 0 store_to $DM
- 0 - m_empty.ped
- 1 - m_norm.ped
- 2 - m_tough.ped
- 3 - m_weak.ped
- 4 - m_steal.ped
Модель группового поведения хранится в *.grp файлах.
В опкоде06AE: create_group_decision_maker_type 0 store_to $GDM
- 0 - MISSION.grp
Познакомимся подробнее с форматом *.ped и *.grp файлов.
Параметры разделяются запятыми, после последнего параметра также идёт запятая. На одной строчке перечисляются реакции на определённое событие.
На первой строчке написано "data values2:".
Первый параметр - событие, на которое реагирует актёр, затем идёт целое число (назначение неизвестно, всегда равно 4), затем шесть групп параметров. В каждой группе параметров первый параметр - код задачи, четыре дробных числа, определяющих шансы при различных отношениях к объекту события, потом идут два флага, первый - реакция работает, если пед в машине, второй - реакция работает, если пед пешком (эти параметры в точности копируют опкод 0709), затем идут шесть целых чисел, назначение которых неизвестно. Группы друг от друга ничем не разделяются.
Примечание: Формат *.ped и *.grp файлов в папке data\Decision и в папке data\Decision\Allowed различаются. Игра использует некоторые файлы из папки data\Decision\Allowed.
Ссылки
- gta-objects-20080711.txt - txt-файл, в конце которого есть дерево классов CTask. Имеется кроме всего прочего ID каждой задачи (в шестнадцатеричной форме).
- Тема по обсуждению Decision Maker на sannybuilder.com