yupplemayham/Resources/scripts/ai/grunt_behaviour.lua
Ethan Adams 1f38730c96 Added normal parameter for easier knockback implemention script-side
Moved scripts to more descriptive location
2024-06-25 15:40:17 -04:00

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