125 lines
3 KiB
Lua
125 lines
3 KiB
Lua
--------------------------------------------------------------------------------
|
|
function init()
|
|
self.sensors = sensors.create()
|
|
|
|
self.state = stateMachine.create({
|
|
"idleState",
|
|
"moveState",
|
|
"attackState"
|
|
})
|
|
self.state.enteringState = function(stateName)
|
|
self.state.shuffleStates()
|
|
end
|
|
|
|
self.state.leavingState = function(stateName)
|
|
entity.setAggressive(false)
|
|
end
|
|
|
|
entity.setAggressive(false)
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
function update(dt)
|
|
if util.trackTarget(30) then
|
|
self.state.pickState({ targetId = self.targetId })
|
|
end
|
|
|
|
if not self.state.update(dt) then
|
|
mcontroller.controlFly({ 0, 0 })
|
|
end
|
|
|
|
if self.state.stateDesc() ~= "attackState" then
|
|
if mcontroller.onGround() then
|
|
entity.setAnimationState("movement", "idle")
|
|
else
|
|
entity.setAnimationState("movement", "fly")
|
|
end
|
|
end
|
|
|
|
self.sensors.clear()
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
function damage(args)
|
|
if entity.health() > 0 then
|
|
self.state.pickState({ targetId = args.sourceId })
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
idleState = {}
|
|
|
|
function idleState.enter()
|
|
if mcontroller.onGround() or self.sensors.idleLandSensor.collisionTrace.any(true) then
|
|
return { timer = entity.randomizeParameterRange("idleTimeRange") }
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
function idleState.update(dt, stateData)
|
|
if not mcontroller.onGround() then
|
|
if not self.sensors.idleLandSensor.collisionTrace.any(true) then
|
|
return true, entity.configParameter("idleCooldown")
|
|
end
|
|
|
|
mcontroller.controlFly({0, -entity.flySpeed() / 2 })
|
|
end
|
|
|
|
stateData.timer = stateData.timer - dt
|
|
if stateData.timer <= 0 then
|
|
return true, entity.configParameter("idleCooldown")
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
moveState = {}
|
|
|
|
function moveState.enter()
|
|
return {
|
|
timer = entity.randomizeParameterRange("moveTimeRange"),
|
|
direction = util.randomDirection()
|
|
}
|
|
end
|
|
|
|
function moveState.update(dt, stateData)
|
|
if self.sensors.blockedSensors.collision.any(true) then
|
|
stateData.direction = -stateData.direction
|
|
end
|
|
|
|
local delta = { stateData.direction, 0 }
|
|
if self.sensors.moveGroundSensor.collisionTrace[1].value then
|
|
delta[2] = 0.5
|
|
elseif self.sensors.moveCeilingSensor.collisionTrace[1].value then
|
|
delta[2] = -0.5
|
|
end
|
|
|
|
delta = vec2.mul(vec2.norm(delta), entity.flySpeed())
|
|
mcontroller.controlFly(delta)
|
|
|
|
stateData.timer = stateData.timer - dt
|
|
if stateData.timer <= 0 then
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
attackState = {}
|
|
|
|
function attackState.enterWith(args)
|
|
if args.targetId ~= nil then
|
|
return nil -- TODO
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
function attackState.enteringState(stateData)
|
|
entity.setAggressive(true)
|
|
end
|
|
|
|
function attackState.update(dt, stateData)
|
|
return true -- TODO
|
|
end
|