3 releases (breaking)
new 0.3.0 | Apr 26, 2025 |
---|---|
0.2.0 | Aug 7, 2024 |
0.1.1 | Aug 1, 2024 |
0.1.0 |
|
#310 in Game dev
113 downloads per month
20KB
210 lines
🏰 posturn 🎮
Build turn-based games with async
Rust
This crate offers a simple way to model turn-based games. Instead of writing a monolithic state
machine, why not a Coroutine
instead?
posturn
allows you to write your turn-based game logic as an async
function that emits events back to calling code.
When an event is emitted, the game enters a wait-for-input state using await
, pausing and returning control to the UI
layer. The UI can handle the event and re-render itself however it wishes. When ready to continue, the UI resumes the
game. This calls back into the coroutine, providing all player input necessary to take the next turn.
This approach has the advantage of maintaining a clean separation between turn-based game logic and the UI layer. A game written in this manner can be used with any frontend capable of processing events emitted by the game. This makes it possible to write, for instance, two game clients in entirely different game engines with no changes to the underlying game logic.
For a very simple example, see RoShamBo
in the tests
module.
For a complete game built with posturn
, see examples/tui
.
📃 Usage
To use posturn
, simply add this to your Cargo.toml
:
[dependencies]
posturn = "0.3.0"
Alternatively, run the following from your crate root:
cargo add posturn@0.3.0
⚠️ Compatibility
This crate currently depends on genawaiter
to provide a stable
implementation of Rust coroutines. Once the Coroutine
trait
has been stabilized (RFC 2033), future versions of posturn
may move
in the direction of using the std
implementation, gated by a feature
flag.
For now, the dependency on genawaiter
is required. If you need std
support for a nightly
project, please see
this issue or open a PR on GitHub.
⚖️ License
All Rust code is licensed under the MIT license.
Various other files (e.g. this README
) are licensed under one of the following:
posturn
aims to be REUSE compliant. The SPDX-License-Identifier
at the top of each file shows which license is associated with it.
Dependencies
~100KB