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 prism.turn()
. 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.