91 lines
2.6 KiB
Lua
91 lines
2.6 KiB
Lua
-- global vars
|
|
patrolDestination = { x=500.0, y=500.0, z=0.0 }
|
|
moveLeft = true
|
|
-- helper functions
|
|
function watchPosition(actor, pos)
|
|
y = pos.y - actor.position.y
|
|
x = pos.x - actor.position.x
|
|
rotation = math.atan(y, x)
|
|
actor.rotation = math.deg(rotation)
|
|
end
|
|
|
|
function distance(a, b)
|
|
return math.sqrt((math.abs(a.x - b.x)^2) + (math.abs(a.y - b.y)^2))
|
|
end
|
|
|
|
function moveTo(actor, pos)
|
|
watchPosition(actor, pos)
|
|
if distance(actor.position, pos) < 50 then
|
|
return true
|
|
end
|
|
actor:moveForward()
|
|
return false
|
|
end
|
|
|
|
-- Behaviour Functions called on AI
|
|
|
|
-- These functions are ai behaviour functions called in the game
|
|
-- The AI will be spawned in idle mode, so if you want to put the bot into patrol mode
|
|
-- It's on you to do that in this function.
|
|
function idle(actor, target)
|
|
if target ~= nil then
|
|
-- print("target is at " .. target.position.x)
|
|
-- watchPosition(actor, target.position)
|
|
ai.state = AIState.Patrol
|
|
actor.rotation = 180
|
|
end
|
|
actor:shoot()
|
|
--print("actor is idling at " .. actor.position.x)
|
|
end
|
|
|
|
-- It is most appropriate to put any patrolling behaviour into this function of course
|
|
function patrol(actor, target)
|
|
if target ~= nil then
|
|
-- print("target is at " .. target.position.x)
|
|
end
|
|
--if moveTo(actor, patrolDestination) == true then
|
|
-- patrolDestination = { x=math.random(400.0, 750.0), y=math.random(400.0, 750.0), z=0.0 }
|
|
--end
|
|
-- performRaycast returns if true if the raycast hits the target position it also sets the getter function
|
|
-- distFromWall, at bot creation distFromWall is and infinite float value.
|
|
-- This performRaycast function is highly discourage due to slow down
|
|
--if raycaster:performRaycast(actor.position, actor.rotation, target.position) == true then
|
|
--ai.state = AIState.Alert
|
|
--end
|
|
if raycaster:bresenhamRaycast(actor.position, actor.rotation, target.position) == true then
|
|
--target hit!
|
|
ai.state = AIState.Alert
|
|
end
|
|
if raycaster:distFromWall() < 3 then
|
|
upOrDown = math.random(2)
|
|
if moveLeft == true then
|
|
if upOrDown == 1 then
|
|
actor.rotation = 180
|
|
else
|
|
actor.rotation = 270
|
|
end
|
|
moveLeft = false
|
|
else
|
|
if upOrDown == 1 then
|
|
actor.rotation = 0
|
|
else
|
|
actor.rotation = 90
|
|
end
|
|
moveLeft = true
|
|
end
|
|
end
|
|
actor:moveForward()
|
|
end
|
|
|
|
-- the ai has found the player, this is what function is called
|
|
function alert(actor, target)
|
|
if target ~= nil then
|
|
-- print("target is at " .. target.position.x)
|
|
watchPosition(actor, target.position)
|
|
end
|
|
--print("actor is alert at " .. actor.position.x)
|
|
if distance(actor.position, target.position) > 300 then
|
|
actor:moveForward()
|
|
end
|
|
actor:shoot()
|
|
end
|