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 = {} --- Yields until the specified amount of time has passed. -- @param time in milliseconds function Delay(time) while time > 0 do time = time - coroutine.yield() end end --- Starts a cutscene. -- This takes care of showing the cutscene bars, as well as halting character -- movement. It does not block. function StartCutscene() local playerId = getPlayerSprite() local playerSprite = getSprite(playerId) playerSprite.controllable = false character():halt(playerId) message():displayCutsceneBars() end --- Queues a message for display. -- Non-blocking! If you want to block until the message has been fully -- revealed, use WaitForEndOfMessage(). -- @param msg the text of the message -- @param name the name of the character speaking (leave blank to not show a character name) -- @param type the SpeakerType for the character, which determines which beep sound is played, if any function DisplayMessage(msg, name, type) message():displayMessage(msg, name, type) end --- Queues a choice prompt for the player. -- This should be called after DisplayMessage(), as it is not valid for a choice -- prompt to be the first line of the text box. This also does not block. You -- should use WaitForEndOfMessage() after this. -- @param one the text of the first option -- @param two the text of the second option function ShowChoice(one, two) message():showChoice(one, two) end --- Gets the result of the last choice prompt. -- @return 0 for the left choice, 1 for the right choice function GetChoiceSelection() return message():getChoiceSelection() end --- Yields until all queued messages / choice prompts have been dismissed. -- This does not hide the cutscene bars, nor does it wait for them to hide. function WaitForEndOfMessage() while (message().isMessageActive) do coroutine.yield() end end --- Hides the cutscene bars. -- This also re-enables player movement. 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 playerSprite.controllable = false FadeToBlack(150) loadMap(map) character():transplantParty(playerId, getWarpPoint(warp), direction) coroutine.yield() RemoveFadeout(150) playerSprite.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