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

Пример скрипта:

  1. {$CLEO}
  2.  
  3. wait 4000
  4.  
  5. 0@ = Actor.Create(Gang2, #MALE01, 2503.4812, -1671.2251, 13.3625)
  6.  
  7. #AK47.Load
  8. while not #AK47.Available
  9.  wait 0
  10. end
  11. 01B2: give_actor 0@ weapon 30 ammo 99999
  12. #AK47.Destroy
  13.  
  14. 060A: create_decision_maker_type 0 store_to 1@
  15. 0708: reset_decision_maker 1@ event 36
  16. 0708: reset_decision_maker 1@ event 37
  17. 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
  18. 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
  19. 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
  20. 060B: set_actor 0@ decision_maker_to 1@
  21.  
  22. 0631: put_actor 0@ in_group $PLAYER_GROUP 
  23. 077A: set_actor 0@ acquaintance 1 {respect} to_actors_pedtype 0
  24. 077A: set_actor 0@ acquaintance 1 {respect} to_actors_pedtype 8
  25. 077A: set_actor 0@ acquaintance 3 {dislike} to_actors_pedtype 6
  26. 077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 7
  27. 077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 9
  28. 077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 11
  29. 077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 12
  30. 077A: set_actor 0@ acquaintance 4 {hate} to_actors_pedtype 17
  31. while not Actor.Dead(0@)
  32.   wait 1500
  33. end
  34. Actor.RemoveReferences(0@)
  35. 065C: release_decision_maker 1@
  36. 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
параметр определяет *.ped файл, который берётся за основу.
  • 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
параметр определяет *.grp файл, который берётся за основу. Параметр может иметь только одно значение:
  • 0 - MISSION.grp

Познакомимся подробнее с форматом *.ped и *.grp файлов.

Параметры разделяются запятыми, после последнего параметра также идёт запятая. На одной строчке перечисляются реакции на определённое событие.

На первой строчке написано "data values2:".

Первый параметр - событие, на которое реагирует актёр, затем идёт целое число (назначение неизвестно, всегда равно 4), затем шесть групп параметров. В каждой группе параметров первый параметр - код задачи, четыре дробных числа, определяющих шансы при различных отношениях к объекту события, потом идут два флага, первый - реакция работает, если пед в машине, второй - реакция работает, если пед пешком (эти параметры в точности копируют опкод 0709), затем идут шесть целых чисел, назначение которых неизвестно. Группы друг от друга ничем не разделяются.

Примечание: Формат *.ped и *.grp файлов в папке data\Decision и в папке data\Decision\Allowed различаются. Игра использует некоторые файлы из папки data\Decision\Allowed.

Ссылки