Documentation Index
Fetch the complete documentation index at: https://docs.summerengine.com/llms.txt
Use this file to discover all available pages before exploring further.
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
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)
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.