Starbound/attic/npcs/aviansentry/behavior.lua
2025-03-21 22:23:30 +11:00

137 lines
3 KiB
Lua

function init()
self.sensors = sensors.create()
self.state = stateMachine.create({
"moveState",
"cleanState",
"attackState"
})
self.state.leavingState = function(stateName)
entity.setAnimationState("movement", "idle")
end
entity.setAggressive(false)
entity.setDeathParticleBurst("deathPoof")
entity.setAnimationState("movement", "idle")
end
function update(dt)
self.state.update(dt)
self.sensors.clear()
end
function damage(args)
self.state.pickState(args.sourceId)
end
function move(direction)
entity.setAnimationState("movement", "move")
mcontroller.controlMove(direction, true)
end
--------------------------------------------------------------------------------
moveState = {}
function moveState.enter()
local direction
if math.random(100) > 50 then
direction = 1
else
direction = -1
end
return {
timer = entity.randomizeParameterRange("moveTimeRange"),
direction = direction
}
end
function moveState.update(dt, stateData)
if self.sensors.collisionSensors.collision.any(true) then
stateData.direction = -stateData.direction
end
move(stateData.direction)
stateData.timer = stateData.timer - dt
if stateData.timer <= 0 then
return true, 1.0
end
return false
end
--------------------------------------------------------------------------------
cleanState = {}
function cleanState.enter()
return { timer = entity.randomizeParameterRange("cleanTimeRange") }
end
function cleanState.update(dt, stateData)
stateData.timer = stateData.timer - dt
return stateData.timer <= 0
end
--------------------------------------------------------------------------------
attackState = {}
function attackState.enterWith(targetId)
if targetId == 0 then return nil end
attackState.setAggressive(targetId)
return { timer = entity.configParameter("attackTargetHoldTime") }
end
function attackState.update(dt, stateData)
util.trackExistingTarget()
if self.targetPosition ~= nil then
local toTarget = world.distance(self.targetPosition, mcontroller.position())
if world.magnitude(toTarget) < entity.configParameter("attackDistance") then
attackState.setAttackEnabled(true)
else
attackState.setAttackEnabled(false)
move(util.toDirection(toTarget[1]))
end
end
if self.targetId == nil then
stateData.timer = stateData.timer - dt
else
stateData.timer = entity.configParameter("attackTargetHoldTime")
end
if stateData.timer <= 0 then
attackState.setAttackEnabled(false)
attackState.setAggressive(nil)
return true
else
return false
end
end
function attackState.setAttackEnabled(enabled)
if enabled then
entity.setAnimationState("movement", "attack")
else
entity.setAnimationState("movement")
end
entity.setDamageOnTouch(enabled)
end
function attackState.setAggressive(targetId)
self.targetId = targetId
if targetId ~= nil then
entity.setAnimationState("movement")
entity.setAggressive(true)
else
entity.setAnimationState("movement", "idle")
entity.setAggressive(false)
end
end