Skip to main content

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

Crafty.teams.create("red", {"color": Color.RED, "max_size": 4})
Crafty.teams.create("blue", {"color": Color.BLUE, "max_size": 4})
Crafty.teams.assign(player, "red")
var team = Crafty.teams.get_team(player)
var members = Crafty.teams.get_members("red")
Crafty.teams.auto_balance()
Methods:
  • create(team_id: String, config: Dictionary) -> void
  • assign(player, team_id: String) -> bool
  • remove_player(player) -> void
  • get_team(player) -> String
  • get_members(team_id: String) -> Array
  • auto_balance() -> void

Score

Crafty.score.add(player, 1)
Crafty.score.set_score(player, 12)
var score = Crafty.score.get_score(player)
var leaderboard = Crafty.score.get_leaderboard()
Crafty.score.add_team("red", 2)
var team_score = Crafty.score.get_team("red")
Methods:
  • add(player, points: int) -> void
  • set_score(player, points: int) -> void
  • get_score(player) -> int
  • get_leaderboard() -> Array
  • add_team(team_id: String, points: int) -> void
  • get_team(team_id: String) -> int

Data

Persistent player data:
Crafty.data.save(player, "level", 5)
var level = Crafty.data.load(player, "level")
var all_data = Crafty.data.load_all(player)
Crafty.data.delete(player, "legacy_key")
Methods:
  • save(player, key: String, value: Variant) -> void
  • load(player, key: String) -> Variant
  • load_all(player) -> Dictionary
  • delete(player, key: String) -> void

Economy

var awarded = await Crafty.economy.award(player, 5, "match_win")
var spent = await Crafty.economy.spend(player, 3, "buy_hint")
var balance = await Crafty.economy.get_balance(player)
var can_pay = await Crafty.economy.has_balance(player, 10)
Methods:
  • get_balance(player) -> int
  • award(player, amount: int, reason: String) -> bool
  • spend(player, amount: int, reason: String) -> bool
  • has_balance(player, amount: int) -> bool

UI

Crafty.ui.show_scoreboard()
Crafty.ui.hide_scoreboard()
Crafty.ui.show_timer(60)
Crafty.ui.show_announcement("Final minute!", 3.0)
Crafty.ui.show_kill_feed(killer, victim)
Optional helper UI. Creators can still build fully custom UI.

Audio

Crafty.audio.play_at(sound, Vector3(0, 1, 0))
Crafty.audio.play_global(sound)
Crafty.audio.play_for(player, sound)

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:
Crafty.player_killed.connect(_on_player_killed)
Crafty.player_damaged.connect(_on_player_damaged)
Crafty.player_respawned.connect(_on_player_respawned)
Crafty.timer_expired.connect(_on_timer_expired)
Crafty.object_collected.connect(_on_object_collected)
Crafty.npc_killed.connect(_on_npc_killed)
Crafty.return_to_hub_requested.connect(_on_return_to_hub_requested)
Crafty.play_again_requested.connect(_on_play_again_requested)
Available signals:
  • player_killed
  • player_damaged
  • player_respawned
  • timer_expired
  • object_collected
  • npc_killed
  • return_to_hub_requested
  • play_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.