Идея: Сделать компьютерного бота
Мы давно это хотели... и вот вчера я наткнулся на lua скрипт из Worms3D Итак, что примерно надо сделать для того, чтобы сделать бота(на примере файа stdvs.lua):
Code
function Initialise()
CurrentTurn = 0 --Номер хода компьютерного игрока
...
end
--Вызывается, когда ходит компьютерный игрок
function RunAILogic()
-- Надо вызывать при каждом ходе компа
SendMessage("AI.PerformDefaultAITurn");
-- После этого мы можем изменять логику комп. игрока
-- В данном случае при первых 4-х ходах комп будет ходить,
-- как мы ему прикажем, а после этого сам будет решать
if CurrentTurn == 0 then --1-ый ход
--SendStringMessage("CommentaryPanel.DebugText","Turn One AI Control")
SendMessage("AI.ClearActions") -- Подготавливаем комп. игрока к тому, что мы им будем управять
SetData("AI.DataString", "kWeaponGrenade") -- Выбираем гранату
SendMessage("AI.PerformSetWeaponAction")
SetData("AI.DataString", "FireOne") -- Стреляем по цели(цель-это эмитер, созданный в редакторе со свойством Lib=Target)
SendMessage("AI.PerformFireAtTargetAction")
elseif CurrentTurn == 1 then
--SendStringMessage("CommentaryPanel.DebugText","Turn Two AI Control")
SendMessage("AI.ClearActions")
SetData("AI.DataString", "FireOne")
SendMessage("AI.PerformMoveAction")
SetData("AI.DataString", "kWeaponGrenade")
SendMessage("AI.PerformSetWeaponAction")
SetData("AI.DataString", "FireTwo")
SendMessage("AI.PerformFireAtTargetAction")
elseif CurrentTurn == 2 then
--SendStringMessage("CommentaryPanel.DebugText","Turn Three AI Control")
SendMessage("AI.ClearActions")
SetData("AI.DataString", "MoveToTwo")
SendMessage("AI.PerformMoveAction")
SetData("AI.DataString", "kWeaponBazooka")
SendMessage("AI.PerformSetWeaponAction")
SetData("AI.DataString", "FireTwo")
SendMessage("AI.PerformFireAtTargetAction")
elseif CurrentTurn == 3 then
--SendStringMessage("CommentaryPanel.DebugText","Turn Four AI Control")
SendMessage("AI.ClearActions")
SetData("AI.DataString", "MoveToThree")
SendMessage("AI.PerformMoveAction")
SetData("AI.DataString", "kWeaponBazooka")
SendMessage("AI.PerformSetWeaponAction")
SetData("AI.DataString", "FireTwo")
SendMessage("AI.PerformFireAtTargetAction")
end
-- Теперь выполняем ту последоватеьность действий, которую мы хотим
SendMessage("AI.ExecuteActions")
-- Изменяем номер хода
CurrentTurn = CurrentTurn + 1
end
Вот все сообщения, которые я нашёл в exe файле, их надо использовать в SendMessage:
AI.PerformMoveAction
AI.PerformSetWeaponAction
AI.PerformFireAtTargetAction
AI.PerformPathMoveAction --Вот это я не знаю как использовать.
AI.PerformDefaultAITurn
AI.ClearActions
AI.ExecuteActions
Использование всех сообщений, кроме AI.PerformPathMoveAction показано в примере
Кроме того в Local.xml есть контейнеры:
<UintResources href='AI.BulletCount'/>
<UintResources href='AIStrike.SeekTarget'/>
<StringResources href='AI.DataString'/>
<VectorResources href='AI.LaunchVelocity'/>
<VectorResources href='AIStrike.Direction'/>
<VectorResources href='AIStrike.TargetPoint'/>
<VectorResources href='AIStrike.UpVector'/>
в WeapTwk.xml:
<IntResources href='AI.WeaponsDontEndTurn'/>
их можно использовать к примеру так:
SetData("AI.BulletCount",10)
и
GetData("AI.BulletCount")
Вектора - это строки вида "(x = 12312.232424, y = 12312.232424, z = 12312.232424)"
но их скорее всего нельзя менять
В данном скрипте испоьзуются следующие выражения:
SetData("AI.DataString", "MoveToTwo")
SendMessage("AI.PerformMoveAction")
Заметьте, что на карте должен быть эмитер под названием MoveToTwo с Lib=Target
Вроде всё, что хотел сказать... вот еси кто-нибудь придумает, как бота заставить ходить не только между червями, тот будет реально крут