moonfall/Assets/Scripts/DoorDefault.lua
2014-10-21 13:54:42 +09:00

67 lines
2.0 KiB
Lua

DOOR_STATE_OPEN = 1
DOOR_STATE_CLOSED = 2
DOOR_STATE_OPENING = 3
DOOR_STATE_CLOSING = 4
function OnActorCreate(id, parameters)
doorId = id
local doorAlias = ActorGetAlias(doorId)
doorAnimationOpen = doorAlias .. ".Open"
doorAnimationClose = doorAlias .. ".Close"
doorWorld = parameters.world
doorSpawn = parameters.spawn
doorMaxOpenTime = parameters.openTime
doorState = DOOR_STATE_CLOSED
doorOpenTime = 0
end
function OnActorUpdate(elapsed)
local doorIds = nil
if doorState == DOOR_STATE_CLOSED or doorState == DOOR_STATE_CLOSING then
doorIds = ActorPhysicsQueryShapeCollisions(doorId, ACTOR_SHAPE_TYPE_COLLISION_SOLID)
elseif doorState == DOOR_STATE_OPEN or doorState == DOOR_STATE_OPENING then
doorIds = ActorPhysicsQueryShapeCollisions(doorId, ACTOR_SHAPE_TYPE_COLLISION_INTERACT)
end
assert(doorIds ~= nil)
for index, value in ipairs(doorIds) do
if ActorGetName(value) == "player" then
if doorState == DOOR_STATE_CLOSED or doorState == DOOR_STATE_CLOSING then
OpenDoor()
elseif doorState == DOOR_STATE_OPEN or doorState == DOOR_STATE_OPENING then
WorldLoad(doorWorld, { spawn = doorSpawn })
end
end
end
if not ActorAnimationIsPlaying(doorId) then
if doorState == DOOR_STATE_OPENING then
doorState = DOOR_STATE_OPEN
elseif doorState == DOOR_STATE_CLOSING then
doorState = DOOR_STATE_CLOSED
end
end
if doorState == DOOR_STATE_OPEN then
doorOpenTime = doorOpenTime + elapsed
if doorOpenTime > doorMaxOpenTime then
CloseDoor()
end
end
end
function OpenDoor()
ActorAnimationSet(doorId, doorAnimationOpen)
ActorAnimationPlay(doorId, false)
doorState = DOOR_STATE_OPENING
doorOpenTime = 0
end
function CloseDoor()
ActorAnimationSet(doorId, doorAnimationClose)
ActorAnimationPlay(doorId, false)
doorState = DOOR_STATE_CLOSING
end