What Are Subsystems?
Subsystems are optional tools. Use only what your game needs. This is the core platform framing:- your game logic stays yours,
- Crafty subsystems provide multiplayer/platform primitives.
Teams
create(team_id: String, config: Dictionary) -> voidassign(player, team_id: String) -> boolremove_player(player) -> voidget_team(player) -> Stringget_members(team_id: String) -> Arrayauto_balance() -> void
Score
add(player, points: int) -> voidset_score(player, points: int) -> voidget_score(player) -> intget_leaderboard() -> Arrayadd_team(team_id: String, points: int) -> voidget_team(team_id: String) -> int
Data
Persistent player data:save(player, key: String, value: Variant) -> voidload(player, key: String) -> Variantload_all(player) -> Dictionarydelete(player, key: String) -> void
Economy
get_balance(player) -> intaward(player, amount: int, reason: String) -> boolspend(player, amount: int, reason: String) -> boolhas_balance(player, amount: int) -> bool
UI
Audio
Input
Crafty.input and per-player player.input provide server-readable control state.
Use server-authoritative checks for outcomes.
Signals (Gameplay Events)
Connect game logic to platform gameplay signals:player_killedplayer_damagedplayer_respawnedtimer_expiredobject_collectednpc_killedreturn_to_hub_requestedplay_again_requested
Production Notes
- Connect/disconnect signals in predictable lifecycle points.
- Keep score/data/economy mutations on server paths.
- Treat UI/audio helpers as optional convenience, not hard dependencies.

