> ## 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.

# Subsystems and Signals

> Optional platform modules (teams, score, data, economy, UI, audio, input) and runtime signals.

## 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

```gdscript theme={null}
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

```gdscript theme={null}
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:

```gdscript theme={null}
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

```gdscript theme={null}
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

```gdscript theme={null}
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

```gdscript theme={null}
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:

```gdscript theme={null}
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.
