SpeakerType = { NONE = 0, MAN = 1, WOMAN = 2, BOY = 3, GIRL = 4, NONHUMAN = 5 } Direction = { UP = 0, UP_RIGHT = 1, RIGHT = 2, DOWN_RIGHT = 3, DOWN = 4, DOWN_LEFT = 5, LEFT = 6, UP_LEFT = 7 } CharacterState = { STILL = 0, WALKING = 1, CROUCHING = 2, RUNNING = 3 } SpriteLayer = { NORMAL = 0, ABOVE = 1 } gamestate = {} function Delay(time) while time > 0 do time = time - coroutine.yield() end end function StartCutscene() local playerId = getPlayerSprite() local playerSprite = getSprite(playerId) playerSprite.controllable = false character():halt(playerId) message():displayCutsceneBars() end function DisplayMessage(msg, name, type) message():displayMessage(msg, name, type) end function ShowChoice(one, two) message():showChoice(one, two) end function GetChoiceSelection() return message():getChoiceSelection() end function WaitForEndOfMessage() while (message().isMessageActive) do coroutine.yield() end end function HideCutsceneBars() WaitForEndOfMessage() message():hideCutsceneBars() local playerId = getPlayerSprite() local playerSprite = getSprite(playerId) playerSprite.controllable = true end function GetPosition(spriteName) local spriteId = getSpriteByAlias(spriteName) local sprite = getSprite(spriteId) return sprite.loc end function SetDirection(spriteName, dir) local spriteId = getSpriteByAlias(spriteName) animation():setSpriteDirection(spriteId, dir) end function SetAnimation(spriteName, animName) local spriteId = getSpriteByAlias(spriteName) animation():setSpriteAnimation(spriteId, animName) end function WaitForAnimation(spriteName) local spriteId = getSpriteByAlias(spriteName) local sprite = getSprite(spriteId) repeat coroutine.yield() until sprite.animFinished end function PlaySound(filename) mixer():playSound("../res/sfx/" .. filename) end function LoopSound(filename) return mixer():loopSound("../res/sfx/" .. filename) end function StopSound(soundId) mixer():stopChannel(soundId) end function FadeToBlack(length) effect():fadeScreen(length, 1.0) repeat coroutine.yield() until effect():isScreenFadeComplete() end function RemoveFadeout(length) effect():fadeScreen(length, 0.0) repeat coroutine.yield() until effect():isScreenFadeComplete() end function FadeMap(length, amount) effect():fadeMap(length, amount) end function WaitForMapFade() while not effect():isMapFadeComplete() do coroutine.yield() end end function ShakeCamera(period) effect():shakeCamera(period) end function StopShakingCamera() effect():stopShakingCamera() end function PanToSprite(spriteName, length) local spriteId = getSpriteByAlias(spriteName) camera():panToSprite(spriteId, length) end function WaitForPan() while camera():isPanning() do coroutine.yield() end end function ReturnCamera(length) local playerId = getPlayerSprite() camera():panToSprite(playerId, length) while camera():isPanning() do coroutine.yield() end camera():setFollowingSprite(playerId) camera():unlockCamera() end function SetPartyDirection(spriteId, direction) animation():setSpriteDirection(spriteId, direction) local sprite = getSprite(spriteId) for i=1,#sprite.followers do animation():setSpriteDirection(sprite.followers[i], direction) end end function ChangeMap(map, warp) local playerId = getPlayerSprite() local playerSprite = getSprite(playerId) local direction = playerSprite.dir local oldState = playerSprite.characterState playerSprite.controllable = false FadeToBlack(150) loadMap(map, warp, direction) local newPlayerId = getPlayerSprite() local newPlayerSprite = getSprite(newPlayerId) if oldState == CharacterState.RUNNING then character():startRunning(newPlayerId) end coroutine.yield() RemoveFadeout(150) newPlayerSprite.controllable = true end function CreateAnimatedSpriteAtPosition(alias, character, x, y, animName, direction, layer) local spriteId = emplaceSprite(alias) transform():initSprite(spriteId, x, y, layer) animation():initSprite(spriteId, "../res/sprites/" .. character .. "_anim.txt") animation():setSpriteDirection(spriteId, direction) animation():setSpriteAnimation(spriteId, animName) end function DestroyNamedSprite(alias) local spriteId = getSpriteByAlias(alias) destroySprite(spriteId) end function AliasForSpriteExpression(spriteName) return "expression (" .. spriteName .. ")" end function ShowExpression(spriteName, expression) local spriteId = getSpriteByAlias(spriteName) local sprite = getSprite(spriteId) local animFrame = sprite:getCurrentFrame() local x = sprite.loc:x() local y = sprite.loc:y() - animFrame.center:y() CreateAnimatedSpriteAtPosition(AliasForSpriteExpression(spriteName), "expression", x, y, expression, Direction.DOWN, SpriteLayer.ABOVE) end function RemoveExpression(spriteName) DestroyNamedSprite(AliasForSpriteExpression(spriteName)) end