The game loop¶
Game loops are the kernels of games that drive the whole thing. LÖVE defines the low-level loop of updating the state, rendering, processing input, etc., but a roguelike engine needs a turn-based loop that waits for the player to do something.
In prism, we’ve implemented the game loop as a Lua coroutine. The following diagram describes the main loop.
The core game loop
Level defines the loop, and LevelState holds the coroutine and determines
when to continue it. If no Controller yields a Decision the loop will run
indefinitely, forcing you to catch when there are no player controlled actors left in the level.
What actually happens on an actor’s turn is defined in the TurnHandler
passed to LevelBuilder:addTurnHandler(). By default, it calls
the Controller and performs the action returned:
local action = controller:act(level, actor)
-- we make sure we got an action back from the controller for sanity's sake
assert(action, "Actor " .. actor:getName() .. " returned nil from act()")
level:perform(action)
If actors can perform multiple actions, you would need to override this.