diff --git a/URL-POLICY.md b/URL-POLICY.md
index 36207a8..8863ad3 100644
--- a/URL-POLICY.md
+++ b/URL-POLICY.md
@@ -86,7 +86,7 @@ These top-level paths are canonical. They do not move.
| `/migration/*` | Coming from another engine |
| `/desktop/*` | Desktop application specifics |
| `/mcp/*` | MCP server, CLI, per-harness setup |
-| `/api-reference/*` | Crafty SDK and public APIs |
+| `/api-reference/*` | Summer SDK and public APIs |
| `/guides/*` | Task-oriented how-to |
| `/publishing/*` | Export and ship |
| `/knowledge-base/*` | Question-shaped pages, answered directly |
diff --git a/api-reference/crafty-sdk/crafty.mdx b/api-reference/crafty-sdk/crafty.mdx
deleted file mode 100644
index ff01328..0000000
--- a/api-reference/crafty-sdk/crafty.mdx
+++ /dev/null
@@ -1,89 +0,0 @@
----
-title: "Crafty Singleton"
-description: "Platform entrypoint for multiplayer runtime features: lifecycle helpers, players, spawning, context checks, and subsystems."
-icon: "box"
----
-
-## What Is `Crafty`?
-
-`Crafty` is the autoload singleton exposed by the SDK.
-
-Use it for platform-level operations that are not tied to one player object.
-
-## `Crafty` vs Player Object
-
-- Use `Crafty` for match-wide actions (timer, announcements, spawning, subsystem access).
-- Use the player object (`CraftyPlayer` or `CraftyCharacter3D`) for per-player synced state and input.
-
-## Core Methods (Signatures)
-
-```gdscript
-end_game() -> void
-set_time_limit(seconds: float) -> void
-get_time_remaining() -> float
-get_players() -> Array
-get_player_count() -> int
-get_max_players() -> int
-send_announcement(text: String) -> void
-spawn_npc(scene: PackedScene, position: Vector3) -> CraftyNPC
-spawn_object(scene: PackedScene, position: Vector3) -> CraftyObject
-spawn_projectile(scene: PackedScene, origin: Vector3, direction: Vector3, speed: float) -> CraftyObject
-is_server() -> bool
-is_client() -> bool
-```
-
-## Match Flow
-
-```gdscript
-Crafty.set_time_limit(300)
-Crafty.send_announcement("Round started")
-
-if Crafty.get_time_remaining() <= 0.0:
- Crafty.end_game()
-```
-
-## Players
-
-```gdscript
-var players = Crafty.get_players()
-var current = Crafty.get_player_count()
-var max_players = Crafty.get_max_players()
-```
-
-## Announcements
-
-```gdscript
-Crafty.send_announcement("Sudden death starts now!")
-```
-
-## Spawning
-
-```gdscript
-var npc = Crafty.spawn_npc(npc_scene, Vector3(0, 0, 0))
-var pickup = Crafty.spawn_object(pickup_scene, Vector3(2, 0, 2))
-var projectile = Crafty.spawn_projectile(bullet_scene, origin, direction, 30.0)
-```
-
-## Runtime Context
-
-```gdscript
-if Crafty.is_server():
- # scoring, persistence, win conditions
- update_game_state()
-```
-
-Use `is_server()` and `is_client()` to keep gameplay authority on the server.
-
-## Subsystems
-
-`Crafty` exposes optional subsystem handles:
-
-- `Crafty.teams`
-- `Crafty.score`
-- `Crafty.data`
-- `Crafty.economy`
-- `Crafty.ui`
-- `Crafty.audio`
-- `Crafty.input`
-
-See `/api-reference/crafty-sdk/subsystems-signals` for subsystem APIs.
diff --git a/api-reference/crafty-sdk.mdx b/api-reference/summer-sdk.mdx
similarity index 58%
rename from api-reference/crafty-sdk.mdx
rename to api-reference/summer-sdk.mdx
index 57d3759..2f17c1a 100644
--- a/api-reference/crafty-sdk.mdx
+++ b/api-reference/summer-sdk.mdx
@@ -1,18 +1,18 @@
---
-title: "Creating Games on Crafty"
-description: "Crafty is a powerful platform layer that provides multiplayer, persistence, and economy features. You bring the game, we bring the infrastructure."
+title: "Creating Games on Summercraft"
+description: "Summercraft is a powerful platform layer that provides multiplayer, persistence, and economy features. You bring the game, we bring the infrastructure."
icon: "gamepad-2"
---
-## Introduction to Crafty
+## Introduction to Summercraft
-Crafty is a place where you can play games made by the community in Summer Engine. It's a platform made to make it easy for developers to make and share their games without having to go through store experiences made +20 years ago. The Crafty SDK works similar to Steams steamworks, and aims to make it more easy to build and share your games. Rather than forcing you into a rigid template or specific game type, Crafty seamlessly integrates with your project to provide robust multiplayer infrastructure and backend services.
+Summercraft is a place where you can play games made by the community in Summer Engine. It's a platform made to make it easy for developers to make and share their games without having to go through store experiences made +20 years ago. The Summer SDK works similar to Steams steamworks, and aims to make it more easy to build and share your games. Rather than forcing you into a rigid template or specific game type, Summercraft seamlessly integrates with your project to provide robust multiplayer infrastructure and backend services.
-The mental model is simple: you build your game's unique design and systems, and plug in the Crafty SDK to handle all the complex platform features.
+The mental model is simple: you build your game's unique design and systems, and plug in the Summer SDK to handle all the complex platform features.
-## What Crafty Handles
+## What Summercraft Handles
-The Crafty SDK provides out-of-the-box support for:
+The Summer SDK provides out-of-the-box support for:
- **Multiplayer Runtime:** Server-authoritative networking and matchmaking infrastructure.
- **Player Management:** Unified player identity and session handling.
@@ -22,7 +22,7 @@ The Crafty SDK provides out-of-the-box support for:
## What You Build
-Because Crafty manages the heavy lifting on the backend, you're free to focus purely on making a great game:
+Because Summercraft manages the heavy lifting on the backend, you're free to focus purely on making a great game:
- **Core Gameplay:** Your unique mechanics, controls, and game loops.
- **Worlds & Scenes:** Environments, levels, and visual rendering.
@@ -33,23 +33,23 @@ Because Crafty manages the heavy lifting on the backend, you're free to focus pu
The minimum integration contract:
-1. `extends CraftyGame`
+1. `extends SummerGame`
2. implement lifecycle hooks (`_game_init`, `_game_start`, `_game_end`, `_player_joined`, `_player_left`)
3. use player synced state (`set_synced` / `get_synced`)
-4. keep authority on server paths (`Crafty.is_server()`)
+4. keep authority on server paths (`Summer.is_server()`)
5. provide valid `manifest.json` and export/upload flow.
## Templates Are Optional
Templates are examples, not requirements.
-- `CraftyCharacter3D` is the optional 3D character template path.
-- For 2D/RTS/card/turn-based games, extend `CraftyPlayer` directly and sync your own game model.
+- `SummerCharacter3D` is the optional 3D character template path.
+- For 2D/RTS/card/turn-based games, extend `SummerPlayer` directly and sync your own game model.
## Recommended Reading Order (Fresh AI / Fresh Dev)
-1. `CraftyGame` and `Crafty` basics
-2. `CraftyPlayer` contract and `set_synced`
+1. `SummerGame` and `Summer` basics
+2. `SummerPlayer` contract and `set_synced`
3. subsystem modules you need (`data`, `economy`, `teams`, `score`)
4. local test runner flow
5. export/upload and banned API constraints.
@@ -57,59 +57,62 @@ Templates are examples, not requirements.
## API Sections
-
+
+ Migrating from Crafty: every renamed class, autoload, manifest key, and path
+
+
Match control, player queries, spawning, server/client checks, subsystem access
-
+
Required base class, lifecycle hooks, and practical game structure
-
+
Minimal player contract: identity, synced vars, input, and optional 3D template path
-
+
Optional platform modules: teams, score, data, economy, UI, audio, and signals
-
+
Golden-path tutorial from blank project to .pck submission
-
+
Full Coin Collector-style example with timer, collectibles, and scoring
-
+
RPG/quest example with player saves, progression, and economy
-
+
Teams, auto-balance, team spawns, and team scoring
-
- Extend CraftyPlayer for 2D state sync and server-authoritative logic
+
+ Extend SummerPlayer for 2D state sync and server-authoritative logic
-
+
Sync turn order, hand/board state, and validate all actions on server
-
+
Every field, required keys, and validated examples
-
+
One linear path for fresh AI/dev sessions: integrate, test, export, submit
-
+
Export .pck, scanner rules, upload flow, review lifecycle, and updates
-
+
Two-process local workflow, multiplayer testing, and production-like validation loop
-
+
Game-only PCK export preset, upload pipeline, and update workflow
-
+
Complete blocked pattern list, rationale, and safe alternatives
-
+
Required file contract, banned API rules, and acceptance checklist for AI-generated games
## Versioning
-Games declare a `crafty_sdk` version in `manifest.json`. SDK changes are intended to be additive and backward-compatible.
+Games declare a `summer_sdk` version in `manifest.json`. SDK changes are intended to be additive and backward-compatible.
diff --git a/api-reference/crafty-sdk/ai-agent-playbook.mdx b/api-reference/summer-sdk/ai-agent-playbook.mdx
similarity index 71%
rename from api-reference/crafty-sdk/ai-agent-playbook.mdx
rename to api-reference/summer-sdk/ai-agent-playbook.mdx
index 40b6787..24468f4 100644
--- a/api-reference/crafty-sdk/ai-agent-playbook.mdx
+++ b/api-reference/summer-sdk/ai-agent-playbook.mdx
@@ -1,6 +1,6 @@
---
title: "AI Agent Playbook"
-description: "Production contract for AI-generated Crafty integrations: platform-first framing, required outputs, and acceptance checks."
+description: "Production contract for AI-generated Summercraft integrations: platform-first framing, required outputs, and acceptance checks."
icon: "bot"
---
@@ -8,7 +8,7 @@ icon: "bot"
Fresh AI sessions must be able to generate code that:
-- runs in Crafty runtime,
+- runs in Summercraft runtime,
- passes static analysis + submission checks,
- stays server-authoritative,
- does not assume 3D template-only architecture.
@@ -17,10 +17,10 @@ This page is the strict contract for that.
## Platform-First Rule
-Treat Crafty as a platform layer:
+Treat Summercraft as a platform layer:
- Build game logic in Summer/Godot.
-- Integrate `CraftyGame` lifecycle + player synced state.
+- Integrate `SummerGame` lifecycle + player synced state.
- Use templates only when they fit the genre.
Never frame the SDK as “3D framework required.”
@@ -30,7 +30,7 @@ Never frame the SDK as “3D framework required.”
Generate these files:
- `manifest.json`
-- `main.gd` (`extends CraftyGame`)
+- `main.gd` (`extends SummerGame`)
- `main.tscn` (`entry_scene`)
- `player.tscn` (player root script)
@@ -40,8 +40,8 @@ If any file is missing, output is invalid.
Pick one path explicitly:
-1. **3D template path**: player root script is `CraftyCharacter3D`
-2. **Custom path**: player root script extends `CraftyPlayer` and defines custom synced game model
+1. **3D template path**: player root script is `SummerCharacter3D`
+2. **Custom path**: player root script extends `SummerPlayer` and defines custom synced game model
Do not mix assumptions from both paths.
@@ -52,7 +52,7 @@ Do not mix assumptions from both paths.
- `id` (string)
- `name` (string)
- `version` (string)
-- `crafty_sdk` (string, for now `"1.0"`)
+- `summer_sdk` (string, for now `"1.0"`)
- `entry_scene` (string, for example `"main.tscn"`)
- `min_players` (number)
- `max_players` (number)
@@ -67,14 +67,14 @@ If `player_scene` is present, it must point to a real scene in the project.
`main.gd` must:
-- extend `CraftyGame`
+- extend `SummerGame`
- implement:
- `_game_init()`
- `_game_start()`
- `_game_end()`
- `_player_joined(player)`
- `_player_left(player)`
-- run authority logic server-side (`if not Crafty.is_server(): return` in `_process` when needed)
+- run authority logic server-side (`if not Summer.is_server(): return` in `_process` when needed)
`main.tscn` should include:
@@ -84,15 +84,15 @@ If `player_scene` is present, it must point to a real scene in the project.
`player.tscn` should:
- use either:
- - `res://sdk/crafty_character_3d.gd`, or
- - your own script that extends `CraftyPlayer`
+ - `res://sdk/summer_character_3d.gd`, or
+ - your own script that extends `SummerPlayer`
- include collision + visible mesh so test runs are obvious
## Allowed vs Blocked APIs
### Allowed (use these)
-- Crafty SDK systems (`Crafty`, `CraftyGame`, `CraftyPlayer`, score/teams/data/economy APIs)
+- Summer SDK systems (`Summer`, `SummerGame`, `SummerPlayer`, score/teams/data/economy APIs)
- normal gameplay node logic (`Node`, `Node3D`, movement, physics, animation, signals)
### Blocked (never generate these in game scripts)
@@ -112,7 +112,7 @@ Reason: submission scanner blocks these patterns and upload fails.
For the complete and current blocked-pattern set, see:
-- [Banned APIs Reference](/api-reference/crafty-sdk/banned-apis-reference)
+- [Banned APIs Reference](/api-reference/summer-sdk/banned-apis-reference)
## Definition Of Done (AI Output)
@@ -121,29 +121,29 @@ An AI-generated game is "done" only if all checks pass:
1. `manifest.json` has all required fields and valid types.
2. `entry_scene` exists and loads.
3. `player_scene` exists (if present) and loads.
-4. Main script extends `CraftyGame`.
-5. Player path chosen explicitly (3D template or custom `CraftyPlayer` subclass).
+4. Main script extends `SummerGame`.
+5. Player path chosen explicitly (3D template or custom `SummerPlayer` subclass).
6. No blocked APIs appear in any `.gd` file.
7. Server-authoritative gameplay logic is on server paths.
8. Game can be exported to `.pck` and submitted.
## Safe Starter Prompt (for AI systems)
-Use this prompt when generating a new Crafty game:
+Use this prompt when generating a new Summercraft game:
```text
-Create a minimal multiplayer Crafty game with these files only:
+Create a minimal multiplayer Summer game with these files only:
manifest.json, main.gd, main.tscn, player.tscn.
Rules:
-- main.gd must extend CraftyGame and implement all lifecycle hooks.
+- main.gd must extend SummerGame and implement all lifecycle hooks.
- Include at least 4 spawn points in main.tscn.
- Keep authoritative gameplay state on server paths only.
- Include player_scene in manifest.json and make sure it matches player.tscn.
- Choose one player model:
- - 3D template: use CraftyCharacter3D in player.tscn
- - custom model: extend CraftyPlayer and sync game-specific state with set_synced/get_synced
+ - 3D template: use SummerCharacter3D in player.tscn
+ - custom model: extend SummerPlayer and sync game-specific state with set_synced/get_synced
- DO NOT use blocked APIs: OS.execute, OS.shell_open, OS.create_process, FileAccess, DirAccess, HTTPRequest, HTTPClient, JavaScriptBridge, ClassDB.instantiate, Thread.new.
-- Target crafty_sdk "1.0".
+- Target summer_sdk "1.0".
```
diff --git a/api-reference/crafty-sdk/banned-apis-reference.mdx b/api-reference/summer-sdk/banned-apis-reference.mdx
similarity index 82%
rename from api-reference/crafty-sdk/banned-apis-reference.mdx
rename to api-reference/summer-sdk/banned-apis-reference.mdx
index a6b29e2..149d011 100644
--- a/api-reference/crafty-sdk/banned-apis-reference.mdx
+++ b/api-reference/summer-sdk/banned-apis-reference.mdx
@@ -1,12 +1,12 @@
---
title: "Banned APIs Reference"
-description: "Complete list of blocked APIs/patterns during Crafty submission, with rationale and safer alternatives."
+description: "Complete list of blocked APIs/patterns during Summercraft submission, with rationale and safer alternatives."
icon: "shield-alert"
---
## Why These APIs Are Blocked
-Crafty runs creator-submitted code on shared infrastructure.
+Summercraft runs creator-submitted code on shared infrastructure.
To protect platform security and stability, submission blocks patterns that enable:
@@ -27,34 +27,34 @@ If a blocked pattern appears in submitted source, upload fails, even when:
| Pattern | Why it is blocked | Use instead |
|------|------|------|
-| `OS.execute` | Executes arbitrary system commands on server hosts. | Use Crafty SDK gameplay/data APIs. |
+| `OS.execute` | Executes arbitrary system commands on server hosts. | Use Summer SDK gameplay/data APIs. |
| `OS.shell_open` | Opens external shells/URLs and escapes runtime boundaries. | Use in-game UI flow; no direct OS shell access. |
| `OS.create_process` | Spawns unmanaged processes from game code. | Keep process control in platform runtime, not game scripts. |
| `OS.create_instance` | Creates new runtime instances outside allowed flow. | Use standard scene instantiation and SDK systems. |
| `OS.kill` | Can terminate infrastructure or peer processes. | Use gameplay lifecycle APIs only. |
-| `FileAccess` | Unrestricted read/write to filesystem. | Use `Crafty.data` for persistence. |
-| `DirAccess` | Directory traversal/manipulation on host filesystem. | Use SDK-managed storage paths via `Crafty.data`. |
-| `HTTPRequest` | Arbitrary outbound HTTP from game logic. | Use `Crafty.data` / `Crafty.economy` platform APIs. |
+| `FileAccess` | Unrestricted read/write to filesystem. | Use `Summer.data` for persistence. |
+| `DirAccess` | Directory traversal/manipulation on host filesystem. | Use SDK-managed storage paths via `Summer.data`. |
+| `HTTPRequest` | Arbitrary outbound HTTP from game logic. | Use `Summer.data` / `Summer.economy` platform APIs. |
| `HTTPClient` | Low-level custom network egress from untrusted scripts. | Use SDK networking and platform endpoints only. |
| `JavaScriptBridge` | Bridge escape to browser/JS runtime. | Keep logic in GDScript + SDK only. |
| `ClassDB.instantiate` | Dynamic class loading can bypass allowed surfaces. | Instantiate explicit scene/resources you control. |
| `Thread.new` | Unmanaged concurrency can impact determinism/stability. | Use deterministic main-loop gameplay logic. |
| `Mutex.new` | Same as above, often paired with unsafe concurrency patterns. | Keep gameplay state updates on main thread. |
| `Semaphore.new` | Same as above; can hide blocking/synchronization hazards. | Use frame/tick-driven state machines. |
-| `StreamPeerTCP` | Raw socket networking bypasses platform control. | Use built-in Crafty networking flow. |
-| `PacketPeerUDP` | Raw UDP bypasses platform-level auth/routing. | Use Crafty transport and replication APIs. |
+| `StreamPeerTCP` | Raw socket networking bypasses platform control. | Use built-in Summercraft networking flow. |
+| `PacketPeerUDP` | Raw UDP bypasses platform-level auth/routing. | Use Summercraft transport and replication APIs. |
| `TCPServer` | Opens custom server sockets inside creator game scripts. | Use platform-managed game servers only. |
| `UDPServer` | Same as above for UDP. | Use platform-managed networking only. |
-| `WebSocketPeer` | Arbitrary socket communication channel. | Use Crafty-managed networking. |
+| `WebSocketPeer` | Arbitrary socket communication channel. | Use Summercraft-managed networking. |
| `.call(` | Reflection can be used to bypass direct API checks. | Explicit method calls on known safe objects. |
| `.callv(` | Same reflection bypass risk. | Explicit typed calls. |
| `.call_deferred(` | Reflection/deferred execution can hide unsafe paths. | Use explicit logic flow and signals. |
| `Callable(` | Dynamic invocation surface for bypass patterns. | Direct signal/method wiring with known methods. |
-| `Engine.get_singleton` | Accesses internal engine singletons outside approved API. | Use Crafty SDK abstractions. |
+| `Engine.get_singleton` | Accesses internal engine singletons outside approved API. | Use Summer SDK abstractions. |
| `Expression.new` | Runtime expression eval can execute dynamic untrusted code. | Static, explicit gameplay logic. |
| `Expression(` | Same runtime eval surface. | Static logic and pre-defined scripts. |
| `Marshalls.base64_to_variant` | Unsafe/deserialization abuse vector for crafted payloads. | Use validated JSON and typed schema checks. |
-| `ResourceSaver` | Writes resource files at runtime; persistence boundary risk. | Use `Crafty.data` for persisted state. |
+| `ResourceSaver` | Writes resource files at runtime; persistence boundary risk. | Use `Summer.data` for persisted state. |
| `ProjectSettings.load_resource_pack` | Runtime pack loading from game scripts is not allowed. | Let platform runtime load approved game packs. |
| `get_node("/root` | Root traversal can reach infrastructure internals. | Use scoped scene tree access in your game subtree. |
| `get_node(\"/root` | Same root traversal risk (escaped quote variant). | Use local node paths. |
@@ -71,7 +71,7 @@ Packs are rejected if they include infrastructure paths, including:
- `res://official_games/`
- `res://bootstrap.gd`, `res://bootstrap.tscn`
- `res://project.godot`
-- `res://crafty.cfg`
+- `res://summer.cfg`
- `res://export_presets.cfg`
- `res://test_runner.gd`, `res://test_runner.tscn`
@@ -91,12 +91,12 @@ Packs are also rejected if they include:
When generating code from prompts:
1. Never generate “debug fallback” branches with blocked APIs.
-2. Prefer SDK primitives (`Crafty.data`, `Crafty.economy`, score/teams/sync helpers).
+2. Prefer SDK primitives (`Summer.data`, `Summer.economy`, score/teams/sync helpers).
3. Keep all file/network/process interactions out of creator game scripts.
4. Use explicit method calls instead of reflective invocation helpers.
## Related Docs
-- [Exporting and Uploading Your Game](/api-reference/crafty-sdk/exporting-and-uploading-your-game)
-- [Submission Guide](/api-reference/crafty-sdk/submission-guide)
-- [AI Agent Playbook](/api-reference/crafty-sdk/ai-agent-playbook)
+- [Exporting and Uploading Your Game](/api-reference/summer-sdk/exporting-and-uploading-your-game)
+- [Submission Guide](/api-reference/summer-sdk/submission-guide)
+- [AI Agent Playbook](/api-reference/summer-sdk/ai-agent-playbook)
diff --git a/api-reference/crafty-sdk/build-your-first-crafty-game.mdx b/api-reference/summer-sdk/build-your-first-summer-game.mdx
similarity index 68%
rename from api-reference/crafty-sdk/build-your-first-crafty-game.mdx
rename to api-reference/summer-sdk/build-your-first-summer-game.mdx
index 9427515..394d197 100644
--- a/api-reference/crafty-sdk/build-your-first-crafty-game.mdx
+++ b/api-reference/summer-sdk/build-your-first-summer-game.mdx
@@ -1,6 +1,6 @@
---
-title: "Build Your First Crafty Game"
-description: "Golden path: integrate Crafty platform APIs into a simple game, then test, export, and submit."
+title: "Build Your First Summercraft Game"
+description: "Golden path: integrate Summercraft platform APIs into a simple game, then test, export, and submit."
icon: "rocket"
---
@@ -8,7 +8,7 @@ icon: "rocket"
A minimal multiplayer integration that:
-- extends `CraftyGame`,
+- extends `SummerGame`,
- uses server-authoritative gameplay updates,
- syncs player-visible state with `set_synced`,
- passes local testing and submission pipeline.
@@ -17,10 +17,10 @@ A minimal multiplayer integration that:
```json
{
- "id": "first-crafty-game",
- "name": "First Crafty Game",
+ "id": "first-summer-game",
+ "name": "First Summer Game",
"version": "1.0.0",
- "crafty_sdk": "1.0",
+ "summer_sdk": "1.0",
"entry_scene": "main.tscn",
"player_scene": "player.tscn",
"min_players": 1,
@@ -32,18 +32,18 @@ A minimal multiplayer integration that:
### 3D Action Template (fastest start)
-- set `player.tscn` root script to `res://sdk/crafty_character_3d.gd`
-- use `apply_default_movement(...)` from `CraftyGame`.
+- set `player.tscn` root script to `res://sdk/summer_character_3d.gd`
+- use `apply_default_movement(...)` from `SummerGame`.
### Custom Genre Path (2D/card/RTS/puzzle)
-- make your own script extending `CraftyPlayer`
+- make your own script extending `SummerPlayer`
- sync your own state model (`set_synced("hand_count", ...)`, etc.).
## Step 3: Build `main.gd`
```gdscript
-extends CraftyGame
+extends SummerGame
const ROUND_SECONDS := 120.0
const MOVE_SPEED := 7.0
@@ -60,11 +60,11 @@ func _game_init() -> void:
spawn_points.append(child.global_position)
func _game_start() -> void:
- Crafty.set_time_limit(ROUND_SECONDS)
- Crafty.send_announcement("Round started")
+ Summer.set_time_limit(ROUND_SECONDS)
+ Summer.send_announcement("Round started")
func _game_end() -> void:
- Crafty.send_announcement("Game over")
+ Summer.send_announcement("Game over")
func _player_joined(player) -> void:
if player.has_method("respawn"):
@@ -76,7 +76,7 @@ func _player_left(_player) -> void:
func _process(delta: float) -> void:
super._process(delta)
- if not Crafty.is_server():
+ if not Summer.is_server():
return
for p in get_players():
if p.has_method("respawn"):
@@ -92,7 +92,7 @@ func score_point(player) -> void:
var current := int(player.get_synced("score") if player.get_synced("score") != null else 0)
current += 1
player.set_synced("score", current)
- Crafty.send_announcement("%s scored (%d)" % [str(player.get("display_name")), current])
+ Summer.send_announcement("%s scored (%d)" % [str(player.get("display_name")), current])
```
## Step 5: Local Test
@@ -105,7 +105,7 @@ Use the two-process test runner flow:
Guide:
-- [/api-reference/crafty-sdk/testing-your-game-locally](/api-reference/crafty-sdk/testing-your-game-locally)
+- [/api-reference/summer-sdk/testing-your-game-locally](/api-reference/summer-sdk/testing-your-game-locally)
## Step 6: Export and Upload
@@ -113,13 +113,13 @@ Export a game-only `.pck`, then upload with `manifest.json`.
Guides:
-- [/api-reference/crafty-sdk/exporting-and-uploading-your-game](/api-reference/crafty-sdk/exporting-and-uploading-your-game)
-- [/api-reference/crafty-sdk/submission-guide](/api-reference/crafty-sdk/submission-guide)
+- [/api-reference/summer-sdk/exporting-and-uploading-your-game](/api-reference/summer-sdk/exporting-and-uploading-your-game)
+- [/api-reference/summer-sdk/submission-guide](/api-reference/summer-sdk/submission-guide)
## What “Done” Looks Like
- [ ] All lifecycle hooks implemented.
-- [ ] Server authority enforced (`Crafty.is_server()`).
+- [ ] Server authority enforced (`Summer.is_server()`).
- [ ] Player-visible state comes from `set_synced`.
- [ ] Local test runner path passes.
- [ ] Upload passes scanner + enters review.
diff --git a/api-reference/crafty-sdk/exporting-and-uploading-your-game.mdx b/api-reference/summer-sdk/exporting-and-uploading-your-game.mdx
similarity index 89%
rename from api-reference/crafty-sdk/exporting-and-uploading-your-game.mdx
rename to api-reference/summer-sdk/exporting-and-uploading-your-game.mdx
index e675479..b1a62b4 100644
--- a/api-reference/crafty-sdk/exporting-and-uploading-your-game.mdx
+++ b/api-reference/summer-sdk/exporting-and-uploading-your-game.mdx
@@ -10,7 +10,7 @@ Produce a `.pck` that contains only your game content, then submit it for review
The safest flow is:
-1. Export with the `Crafty Game PCK` preset.
+1. Export with the `Summer Game PCK` preset.
2. Upload `.pck` + `manifest.json` at `/submit`.
3. Fix any validation findings.
4. Re-submit with bumped `manifest.version`.
@@ -19,7 +19,7 @@ The safest flow is:
Use the starter template preset:
-- name: `Crafty Game PCK`
+- name: `Summer Game PCK`
- export filter: `resources`
- include filter: `my_game/*,manifest.json`
- exclude filter: infrastructure directories (`sdk/*`, `core/*`, `server/*`, etc.)
@@ -35,7 +35,7 @@ You must update `include_filter` to your actual game folder name.
In Summer/Godot:
1. Open **Project -> Export**.
-2. Select `Crafty Game PCK`.
+2. Select `Summer Game PCK`.
3. Verify include/exclude filters.
4. Export to a file like `my_game.pck`.
@@ -45,9 +45,9 @@ Quick checks after export:
- `manifest.json` exists and is current,
- entry/player scenes referenced by manifest are present in the exported game scope.
-## 3) Upload On playcrafty.games
+## 3) Upload On summercraft.ai
-Go to `/submit` on the Crafty web app and upload:
+Go to `/submit` on the Summercraft web app and upload:
- `.pck` file (required)
- `manifest.json` file (required)
@@ -125,6 +125,6 @@ Each update goes through review again.
## Related Docs
-- [Testing Your Game Locally](/api-reference/crafty-sdk/testing-your-game-locally)
-- [manifest.json Reference](/api-reference/crafty-sdk/manifest-json-reference)
-- [Banned APIs Reference](/api-reference/crafty-sdk/banned-apis-reference)
+- [Testing Your Game Locally](/api-reference/summer-sdk/testing-your-game-locally)
+- [manifest.json Reference](/api-reference/summer-sdk/manifest-json-reference)
+- [Banned APIs Reference](/api-reference/summer-sdk/banned-apis-reference)
diff --git a/api-reference/crafty-sdk/guides/making-a-2d-game-multiplayer.mdx b/api-reference/summer-sdk/guides/making-a-2d-game-multiplayer.mdx
similarity index 75%
rename from api-reference/crafty-sdk/guides/making-a-2d-game-multiplayer.mdx
rename to api-reference/summer-sdk/guides/making-a-2d-game-multiplayer.mdx
index 7742d1a..e9ef021 100644
--- a/api-reference/crafty-sdk/guides/making-a-2d-game-multiplayer.mdx
+++ b/api-reference/summer-sdk/guides/making-a-2d-game-multiplayer.mdx
@@ -1,13 +1,13 @@
---
title: "Guide: Making A 2D Game Multiplayer"
-description: "Integrate Crafty into a 2D game by extending CraftyPlayer and syncing your own state."
+description: "Integrate Summercraft into a 2D game by extending SummerPlayer and syncing your own state."
icon: "square"
---
## Platform Framing
-You are not building a “Crafty game type.”
-You are building a 2D game in Summer/Godot and integrating the Crafty platform layer:
+You are not building a “Summercraft game type.”
+You are building a 2D game in Summer/Godot and integrating the Summercraft platform layer:
- multiplayer runtime,
- server authority,
@@ -15,10 +15,10 @@ You are building a 2D game in Summer/Godot and integrating the Crafty platform l
## Recommended Player Model
-For 2D games, create your own 2D player class that extends `CraftyPlayer`.
+For 2D games, create your own 2D player class that extends `SummerPlayer`.
```gdscript
-extends CraftyPlayer
+extends SummerPlayer
@export var speed := 220.0
var local_position := Vector2.ZERO
@@ -33,11 +33,11 @@ func _ready() -> void:
## Server Authority Loop
```gdscript
-extends CraftyGame
+extends SummerGame
func _process(delta: float) -> void:
super._process(delta)
- if not Crafty.is_server():
+ if not Summer.is_server():
return
for p in get_players():
@@ -80,10 +80,10 @@ func _player_left(player) -> void:
Use only what you need:
-- `Crafty.score` for score/rank,
-- `Crafty.teams` for team modes,
-- `Crafty.data` for persistent inventory/progress,
-- `Crafty.economy` for currency.
+- `Summer.score` for score/rank,
+- `Summer.teams` for team modes,
+- `Summer.data` for persistent inventory/progress,
+- `Summer.economy` for currency.
## Common Mistakes
@@ -93,7 +93,7 @@ Use only what you need:
## Production Checklist (2D)
-- [ ] `Crafty.is_server()` gates all authoritative state updates.
+- [ ] `Summer.is_server()` gates all authoritative state updates.
- [ ] 2D state is synced via `set_synced`.
- [ ] Client only renders synced values.
- [ ] Required manifest fields valid.
diff --git a/api-reference/crafty-sdk/guides/making-a-turn-based-or-card-game-multiplayer.mdx b/api-reference/summer-sdk/guides/making-a-turn-based-or-card-game-multiplayer.mdx
similarity index 84%
rename from api-reference/crafty-sdk/guides/making-a-turn-based-or-card-game-multiplayer.mdx
rename to api-reference/summer-sdk/guides/making-a-turn-based-or-card-game-multiplayer.mdx
index 3fbce2c..a72e2e4 100644
--- a/api-reference/crafty-sdk/guides/making-a-turn-based-or-card-game-multiplayer.mdx
+++ b/api-reference/summer-sdk/guides/making-a-turn-based-or-card-game-multiplayer.mdx
@@ -1,17 +1,17 @@
---
title: "Guide: Making A Turn-Based Or Card Game Multiplayer"
-description: "Use CraftyPlayer synced state for turn order, hand data, board state, and authoritative turn actions."
+description: "Use SummerPlayer synced state for turn order, hand data, board state, and authoritative turn actions."
icon: "layout-grid"
---
## Platform Framing
-Turn-based and card games are first-class on Crafty.
+Turn-based and card games are first-class on Summercraft.
Use:
-- `CraftyGame` for match lifecycle,
-- `CraftyPlayer` for connected player identity + synced state,
+- `SummerGame` for match lifecycle,
+- `SummerPlayer` for connected player identity + synced state,
- `set_synced` for turn/board/hand summaries.
No 3D character system is required.
@@ -19,7 +19,7 @@ No 3D character system is required.
## Minimal Player Setup
```gdscript
-extends CraftyPlayer
+extends SummerPlayer
func _ready() -> void:
set_synced("hand_count", 0)
@@ -32,7 +32,7 @@ func _ready() -> void:
Store canonical game state on server:
```gdscript
-extends CraftyGame
+extends SummerGame
var _turn_order: Array = []
var _active_turn_index := 0
@@ -57,7 +57,7 @@ func _player_left(player) -> void:
```gdscript
func end_turn(player) -> void:
- if not Crafty.is_server():
+ if not Summer.is_server():
return
if _turn_order.is_empty():
return
@@ -83,7 +83,7 @@ Every turn action should be server-validated:
```gdscript
func play_card(player, card_id: String, target_id: String) -> void:
- if not Crafty.is_server():
+ if not Summer.is_server():
return
if _turn_order[_active_turn_index] != player:
return
@@ -108,9 +108,9 @@ Keep hidden/private data server-side unless intentionally exposed.
## Optional Platform Modules
-- `Crafty.data`: persistent deck/profile/MMR.
-- `Crafty.economy`: card packs, tournament entry, rewards.
-- `Crafty.score`: ranked points or win tally.
+- `Summer.data`: persistent deck/profile/MMR.
+- `Summer.economy`: card packs, tournament entry, rewards.
+- `Summer.score`: ranked points or win tally.
## Production Checklist (Turn-Based/Card)
diff --git a/api-reference/crafty-sdk/guides/multiplayer-ffa-coin-collector.mdx b/api-reference/summer-sdk/guides/multiplayer-ffa-coin-collector.mdx
similarity index 74%
rename from api-reference/crafty-sdk/guides/multiplayer-ffa-coin-collector.mdx
rename to api-reference/summer-sdk/guides/multiplayer-ffa-coin-collector.mdx
index a7b83e0..e32ffcb 100644
--- a/api-reference/crafty-sdk/guides/multiplayer-ffa-coin-collector.mdx
+++ b/api-reference/summer-sdk/guides/multiplayer-ffa-coin-collector.mdx
@@ -1,20 +1,20 @@
---
title: "Game Guide: Multiplayer FFA (Coin Collector)"
-description: "How to make a 3D action game multiplayer on Crafty using the optional CraftyCharacter3D template."
+description: "How to make a 3D action game multiplayer on Summercraft using the optional SummerCharacter3D template."
icon: "swords"
---
## What This Guide Covers
-This is a full `CraftyGame` example for a multiplayer free-for-all:
+This is a full `SummerGame` example for a multiplayer free-for-all:
- Round timer
-- Collectible objects via `Crafty.spawn_object`
-- Scoring via `Crafty.score`
-- Announcements via `Crafty.send_announcement`
+- Collectible objects via `Summer.spawn_object`
+- Scoring via `Summer.score`
+- Announcements via `Summer.send_announcement`
- End-of-round winner announcement
-This guide uses the optional 3D template path (`player.tscn` rooted with `CraftyCharacter3D`).
+This guide uses the optional 3D template path (`player.tscn` rooted with `SummerCharacter3D`).
## Scene Setup
@@ -23,12 +23,12 @@ Create `coin_collector.tscn` with:
- Root: `Node3D` (`CoinCollector`)
- Child: `Node3D` (`SpawnPoints`) with multiple spawn transforms
-Create collectible scene `coin.tscn` (root script should extend `CraftyObject`).
+Create collectible scene `coin.tscn` (root script should extend `SummerObject`).
## Complete Game Script (`coin_collector.gd`)
```gdscript
-extends CraftyGame
+extends SummerGame
const MOVE_SPEED := 15.0
const GRAVITY := 20.0
@@ -63,28 +63,28 @@ func _game_init() -> void:
]
func _game_start() -> void:
- Crafty.set_time_limit(ROUND_SECONDS)
- Crafty.object_collected.connect(_on_coin_collected)
- Crafty.send_announcement("Collect %d coins to win" % COINS_TO_WIN)
+ Summer.set_time_limit(ROUND_SECONDS)
+ Summer.object_collected.connect(_on_coin_collected)
+ Summer.send_announcement("Collect %d coins to win" % COINS_TO_WIN)
_spawn_initial_coins()
func _game_end() -> void:
- if Crafty.object_collected.is_connected(_on_coin_collected):
- Crafty.object_collected.disconnect(_on_coin_collected)
+ if Summer.object_collected.is_connected(_on_coin_collected):
+ Summer.object_collected.disconnect(_on_coin_collected)
- var leaderboard := Crafty.score.get_leaderboard()
+ var leaderboard := Summer.score.get_leaderboard()
if leaderboard.is_empty():
- Crafty.send_announcement("Round over: no winner")
+ Summer.send_announcement("Round over: no winner")
return
var winner = leaderboard[0].player
var score := int(leaderboard[0].score)
- Crafty.send_announcement("%s wins with %d coins!" % [str(winner.get("display_name")), score])
+ Summer.send_announcement("%s wins with %d coins!" % [str(winner.get("display_name")), score])
func _player_joined(player) -> void:
if player.has_method("respawn"):
player.respawn(get_random_spawn_point())
- Crafty.score.set_score(player, 0)
+ Summer.score.set_score(player, 0)
player.set_synced("score", 0)
func _player_left(_player) -> void:
@@ -92,7 +92,7 @@ func _player_left(_player) -> void:
func _process(delta: float) -> void:
super._process(delta)
- if not Crafty.is_server():
+ if not Summer.is_server():
return
for p in get_players():
@@ -107,7 +107,7 @@ func _spawn_initial_coins() -> void:
func _spawn_coin_at(pos: Vector3) -> void:
if not _coin_scene:
return
- var coin := Crafty.spawn_object(_coin_scene, pos)
+ var coin := Summer.spawn_object(_coin_scene, pos)
if coin:
coin.set_synced("active", true)
@@ -128,9 +128,9 @@ func _tick_coin_respawns(delta: float) -> void:
else:
i += 1
-func _on_coin_collected(player, _obj: CraftyObject) -> void:
- Crafty.score.add(player, 1)
- var score := Crafty.score.get_score(player)
+func _on_coin_collected(player, _obj: SummerObject) -> void:
+ Summer.score.add(player, 1)
+ var score := Summer.score.get_score(player)
player.set_synced("score", score)
if score >= COINS_TO_WIN:
@@ -145,7 +145,7 @@ func _on_coin_collected(player, _obj: CraftyObject) -> void:
## If You Are Not Building A 3D Action Game
-Do not use this movement pattern. Use `CraftyPlayer` directly and sync your own state model (for example turn state, board state, inventory, cursor targets).
+Do not use this movement pattern. Use `SummerPlayer` directly and sync your own state model (for example turn state, board state, inventory, cursor targets).
## Suggested `manifest.json`
@@ -154,7 +154,7 @@ Do not use this movement pattern. Use `CraftyPlayer` directly and sync your own
"id": "coin-collector",
"name": "Coin Collector",
"version": "1.0.0",
- "crafty_sdk": "1.0",
+ "summer_sdk": "1.0",
"entry_scene": "coin_collector.tscn",
"player_scene": "player.tscn",
"min_players": 1,
diff --git a/api-reference/crafty-sdk/guides/multiplayer-persistence-rpg.mdx b/api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx
similarity index 63%
rename from api-reference/crafty-sdk/guides/multiplayer-persistence-rpg.mdx
rename to api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx
index 4c84cb1..182b526 100644
--- a/api-reference/crafty-sdk/guides/multiplayer-persistence-rpg.mdx
+++ b/api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx
@@ -1,6 +1,6 @@
---
title: "Game Guide: Multiplayer with Persistence (RPG/Quest)"
-description: "How to add persistence and economy to a multiplayer game using Crafty.data and Crafty.economy."
+description: "How to add persistence and economy to a multiplayer game using Summer.data and Summer.economy."
icon: "database"
---
@@ -11,7 +11,7 @@ This guide shows a persistent multiplayer game loop:
- Load player save data on join
- Keep inventory, quest progress, and level in persistent storage
- Auto-save while players are connected
-- Award and spend credits with `Crafty.economy`
+- Award and spend crafties with `Summer.economy`
## Input Actions Used
@@ -23,13 +23,13 @@ Configure actions in your project/manifest:
## Complete Game Script (`quest_arena.gd`)
```gdscript
-extends CraftyGame
+extends SummerGame
const MOVE_SPEED := 7.0
const GRAVITY := 20.0
const AUTO_SAVE_INTERVAL := 15.0
const QUEST_XP_REWARD := 25
-const QUEST_CREDIT_REWARD := 10
+const QUEST_CRAFTIES_REWARD := 10
const POTION_COST := 8
var _auto_save_accum := 0.0
@@ -53,13 +53,13 @@ func _game_init() -> void:
]
func _game_start() -> void:
- Crafty.set_time_limit(1800.0)
- Crafty.send_announcement("Quest Arena started")
+ Summer.set_time_limit(1800.0)
+ Summer.send_announcement("Quest Arena started")
func _game_end() -> void:
for p in get_players():
_save_player_snapshot(p)
- Crafty.send_announcement("Quest Arena session saved")
+ Summer.send_announcement("Quest Arena session saved")
func _player_joined(player) -> void:
if player.has_method("respawn"):
@@ -72,7 +72,7 @@ func _player_left(player) -> void:
func _process(delta: float) -> void:
super._process(delta)
- if not Crafty.is_server():
+ if not Summer.is_server():
return
for p in get_players():
@@ -93,86 +93,86 @@ func _handle_player_actions(player) -> void:
_buy_potion(player)
func _complete_quest(player) -> void:
- var progress := Crafty.data.load(player, "quest_progress")
+ var progress := Summer.data.load(player, "quest_progress")
if progress == null:
progress = {"main": 0}
progress["main"] = int(progress.get("main", 0)) + 1
- Crafty.data.save(player, "quest_progress", progress)
+ Summer.data.save(player, "quest_progress", progress)
- var xp := int(Crafty.data.load(player, "xp") if Crafty.data.load(player, "xp") != null else 0)
+ var xp := int(Summer.data.load(player, "xp") if Summer.data.load(player, "xp") != null else 0)
xp += QUEST_XP_REWARD
- Crafty.data.save(player, "xp", xp)
+ Summer.data.save(player, "xp", xp)
var level := 1 + int(xp / 100)
- Crafty.data.save(player, "level", level)
+ Summer.data.save(player, "level", level)
- var awarded := await Crafty.economy.award(player, QUEST_CREDIT_REWARD, "quest_complete")
+ var awarded := await Summer.economy.award(player, QUEST_CRAFTIES_REWARD, "quest_complete")
if awarded:
- Crafty.send_announcement("%s completed a quest (+%d credits)" % [str(player.get("display_name")), QUEST_CREDIT_REWARD])
+ Summer.send_announcement("%s completed a quest (+%d crafties)" % [str(player.get("display_name")), QUEST_CRAFTIES_REWARD])
_sync_player_hud_fields(player)
func _buy_potion(player) -> void:
- var purchased := await Crafty.economy.spend(player, POTION_COST, "potion_purchase")
+ var purchased := await Summer.economy.spend(player, POTION_COST, "potion_purchase")
if not purchased:
- Crafty.send_announcement("%s cannot afford a potion" % str(player.get("display_name")))
+ Summer.send_announcement("%s cannot afford a potion" % str(player.get("display_name")))
return
- var inventory := Crafty.data.load(player, "inventory")
+ var inventory := Summer.data.load(player, "inventory")
if inventory == null:
inventory = {"potions": 0}
inventory["potions"] = int(inventory.get("potions", 0)) + 1
- Crafty.data.save(player, "inventory", inventory)
- Crafty.send_announcement("%s bought a potion" % str(player.get("display_name")))
+ Summer.data.save(player, "inventory", inventory)
+ Summer.send_announcement("%s bought a potion" % str(player.get("display_name")))
_sync_player_hud_fields(player)
func _load_player_snapshot(player) -> void:
- var level = Crafty.data.load(player, "level")
+ var level = Summer.data.load(player, "level")
if level == null:
level = 1
- var xp = Crafty.data.load(player, "xp")
+ var xp = Summer.data.load(player, "xp")
if xp == null:
xp = 0
- var inventory = Crafty.data.load(player, "inventory")
+ var inventory = Summer.data.load(player, "inventory")
if inventory == null:
inventory = {"potions": 0}
- var quest_progress = Crafty.data.load(player, "quest_progress")
+ var quest_progress = Summer.data.load(player, "quest_progress")
if quest_progress == null:
quest_progress = {"main": 0}
- Crafty.data.save(player, "level", level)
- Crafty.data.save(player, "xp", xp)
- Crafty.data.save(player, "inventory", inventory)
- Crafty.data.save(player, "quest_progress", quest_progress)
+ Summer.data.save(player, "level", level)
+ Summer.data.save(player, "xp", xp)
+ Summer.data.save(player, "inventory", inventory)
+ Summer.data.save(player, "quest_progress", quest_progress)
func _save_player_snapshot(player) -> void:
# Data API is write-through to in-memory cache; backend flush is handled by SDK.
- var level = Crafty.data.load(player, "level")
- var xp = Crafty.data.load(player, "xp")
- var inventory = Crafty.data.load(player, "inventory")
- var quest_progress = Crafty.data.load(player, "quest_progress")
+ var level = Summer.data.load(player, "level")
+ var xp = Summer.data.load(player, "xp")
+ var inventory = Summer.data.load(player, "inventory")
+ var quest_progress = Summer.data.load(player, "quest_progress")
- Crafty.data.save(player, "level", 1 if level == null else level)
- Crafty.data.save(player, "xp", 0 if xp == null else xp)
- Crafty.data.save(player, "inventory", {"potions": 0} if inventory == null else inventory)
- Crafty.data.save(player, "quest_progress", {"main": 0} if quest_progress == null else quest_progress)
+ Summer.data.save(player, "level", 1 if level == null else level)
+ Summer.data.save(player, "xp", 0 if xp == null else xp)
+ Summer.data.save(player, "inventory", {"potions": 0} if inventory == null else inventory)
+ Summer.data.save(player, "quest_progress", {"main": 0} if quest_progress == null else quest_progress)
func _sync_player_hud_fields(player) -> void:
- var level := int(Crafty.data.load(player, "level"))
- var xp := int(Crafty.data.load(player, "xp"))
- var inventory := Crafty.data.load(player, "inventory")
- var quest_progress := Crafty.data.load(player, "quest_progress")
- var balance := await Crafty.economy.get_balance(player)
+ var level := int(Summer.data.load(player, "level"))
+ var xp := int(Summer.data.load(player, "xp"))
+ var inventory := Summer.data.load(player, "inventory")
+ var quest_progress := Summer.data.load(player, "quest_progress")
+ var balance := await Summer.economy.get_balance(player)
player.set_synced("level", level)
player.set_synced("xp", xp)
player.set_synced("potions", int(inventory.get("potions", 0)))
player.set_synced("quest_main", int(quest_progress.get("main", 0)))
- player.set_synced("credits", balance)
+ player.set_synced("crafties", balance)
```
## Suggested `manifest.json`
@@ -182,7 +182,7 @@ func _sync_player_hud_fields(player) -> void:
"id": "quest-arena",
"name": "Quest Arena",
"version": "1.0.0",
- "crafty_sdk": "1.0",
+ "summer_sdk": "1.0",
"entry_scene": "quest_arena.tscn",
"player_scene": "player.tscn",
"min_players": 1,
diff --git a/api-reference/crafty-sdk/guides/team-based-game.mdx b/api-reference/summer-sdk/guides/team-based-game.mdx
similarity index 72%
rename from api-reference/crafty-sdk/guides/team-based-game.mdx
rename to api-reference/summer-sdk/guides/team-based-game.mdx
index fba1126..3fbab6d 100644
--- a/api-reference/crafty-sdk/guides/team-based-game.mdx
+++ b/api-reference/summer-sdk/guides/team-based-game.mdx
@@ -1,6 +1,6 @@
---
title: "Game Guide: Team-Based Multiplayer"
-description: "How to build team modes with Crafty.teams and Crafty.score, independent of genre."
+description: "How to build team modes with Summer.teams and Summer.score, independent of genre."
icon: "users"
---
@@ -8,10 +8,10 @@ icon: "users"
This guide implements a red-vs-blue team mode:
-- Team creation with `Crafty.teams.create`
+- Team creation with `Summer.teams.create`
- Team assignment and auto-balance
- Team-specific spawn points
-- Team score via `Crafty.score.add_team`
+- Team score via `Summer.score.add_team`
## Scene Setup
@@ -24,7 +24,7 @@ Create `team_arena.tscn`:
## Complete Game Script (`team_arena.gd`)
```gdscript
-extends CraftyGame
+extends SummerGame
const MOVE_SPEED := 8.0
const GRAVITY := 20.0
@@ -41,8 +41,8 @@ func get_prediction_params() -> Dictionary:
return {"move_speed": MOVE_SPEED, "gravity": GRAVITY}
func _game_init() -> void:
- Crafty.teams.create("red", {"color": Color.RED, "max_size": 16})
- Crafty.teams.create("blue", {"color": Color.BLUE, "max_size": 16})
+ Summer.teams.create("red", {"color": Color.RED, "max_size": 16})
+ Summer.teams.create("blue", {"color": Color.BLUE, "max_size": 16})
var red_root := get_node_or_null("SpawnPointsRed")
if red_root:
@@ -62,19 +62,19 @@ func _game_init() -> void:
_blue_spawns = [Vector3(15, 1, -8), Vector3(15, 1, 8)]
func _game_start() -> void:
- Crafty.teams.auto_balance()
- Crafty.set_time_limit(ROUND_SECONDS)
- Crafty.send_announcement("Red vs Blue started")
+ Summer.teams.auto_balance()
+ Summer.set_time_limit(ROUND_SECONDS)
+ Summer.send_announcement("Red vs Blue started")
func _game_end() -> void:
- var red_score := Crafty.score.get_team("red")
- var blue_score := Crafty.score.get_team("blue")
+ var red_score := Summer.score.get_team("red")
+ var blue_score := Summer.score.get_team("blue")
if red_score > blue_score:
- Crafty.send_announcement("Red wins %d - %d" % [red_score, blue_score])
+ Summer.send_announcement("Red wins %d - %d" % [red_score, blue_score])
elif blue_score > red_score:
- Crafty.send_announcement("Blue wins %d - %d" % [blue_score, red_score])
+ Summer.send_announcement("Blue wins %d - %d" % [blue_score, red_score])
else:
- Crafty.send_announcement("Draw %d - %d" % [red_score, blue_score])
+ Summer.send_announcement("Draw %d - %d" % [red_score, blue_score])
func _player_joined(player) -> void:
var assigned := _assign_team(player)
@@ -84,11 +84,11 @@ func _player_joined(player) -> void:
player.set_synced("team", assigned)
func _player_left(player) -> void:
- Crafty.teams.remove_player(player)
+ Summer.teams.remove_player(player)
func _process(delta: float) -> void:
super._process(delta)
- if not Crafty.is_server():
+ if not Summer.is_server():
return
for p in get_players():
@@ -96,12 +96,12 @@ func _process(delta: float) -> void:
_check_goal_score(p)
func _assign_team(player) -> String:
- var red_count := Crafty.teams.get_members("red").size()
- var blue_count := Crafty.teams.get_members("blue").size()
+ var red_count := Summer.teams.get_members("red").size()
+ var blue_count := Summer.teams.get_members("blue").size()
var target := "red" if red_count <= blue_count else "blue"
- if not Crafty.teams.assign(player, target):
+ if not Summer.teams.assign(player, target):
target = "blue" if target == "red" else "red"
- Crafty.teams.assign(player, target)
+ Summer.teams.assign(player, target)
return target
func _team_spawn_for(team_id: String) -> Vector3:
@@ -110,7 +110,7 @@ func _team_spawn_for(team_id: String) -> Vector3:
return _blue_spawns.pick_random()
func _check_goal_score(player) -> void:
- var team_id := Crafty.teams.get_team(player)
+ var team_id := Summer.teams.get_team(player)
if team_id == "":
return
@@ -120,11 +120,11 @@ func _check_goal_score(player) -> void:
_award_team_score("blue", player)
func _award_team_score(team_id: String, scorer) -> void:
- Crafty.score.add_team(team_id, 1)
- var score := Crafty.score.get_team(team_id)
- Crafty.send_announcement("%s team scored (%d/%d) by %s" % [team_id.capitalize(), score, TEAM_SCORE_TO_WIN, str(scorer.get("display_name"))])
+ Summer.score.add_team(team_id, 1)
+ var score := Summer.score.get_team(team_id)
+ Summer.send_announcement("%s team scored (%d/%d) by %s" % [team_id.capitalize(), score, TEAM_SCORE_TO_WIN, str(scorer.get("display_name"))])
- var current_team := Crafty.teams.get_team(scorer)
+ var current_team := Summer.teams.get_team(scorer)
scorer.teleport(_team_spawn_for(current_team))
if score >= TEAM_SCORE_TO_WIN:
@@ -147,7 +147,7 @@ This team logic works for:
"id": "team-arena",
"name": "Team Arena",
"version": "1.0.0",
- "crafty_sdk": "1.0",
+ "summer_sdk": "1.0",
"entry_scene": "team_arena.tscn",
"player_scene": "player.tscn",
"min_players": 2,
diff --git a/api-reference/crafty-sdk/manifest-json-reference.mdx b/api-reference/summer-sdk/manifest-json-reference.mdx
similarity index 88%
rename from api-reference/crafty-sdk/manifest-json-reference.mdx
rename to api-reference/summer-sdk/manifest-json-reference.mdx
index 4d78e8a..0cc03fd 100644
--- a/api-reference/crafty-sdk/manifest-json-reference.mdx
+++ b/api-reference/summer-sdk/manifest-json-reference.mdx
@@ -1,12 +1,12 @@
---
title: "manifest.json Reference"
-description: "Complete manifest.json field reference for Crafty games: required keys, optional keys, and validated examples."
+description: "Complete manifest.json field reference for Summercraft games: required keys, optional keys, and validated examples."
icon: "file-json"
---
## Overview
-Every Crafty game must include a `manifest.json` file in the game pack.
+Every Summercraft game must include a `manifest.json` file in the game pack.
The submission API validates required keys and types before a game can enter review.
@@ -19,7 +19,7 @@ These fields are required by submission validation:
| `id` | string | Yes | Stable game identifier. Used for slug generation and updates. |
| `name` | string | Yes | Display name shown in platform surfaces. |
| `version` | string | Yes | Semantic or creator-defined version string (for example `1.0.0`). |
-| `crafty_sdk` | string | Yes | SDK version your game targets (for example `1.0`). |
+| `summer_sdk` | string | Yes | SDK version your game targets (for example `1.0`). |
| `entry_scene` | string | Yes | Main scene path/name loaded by the runtime. |
| `min_players` | number | Yes | Minimum players required before start flow. |
| `max_players` | number | Yes | Maximum concurrent players for a match. |
@@ -43,7 +43,7 @@ These fields are required by submission validation:
"id": "coin-collector",
"name": "Coin Collector",
"version": "1.0.0",
- "crafty_sdk": "1.0",
+ "summer_sdk": "1.0",
"entry_scene": "coin_collector.tscn",
"min_players": 1,
"max_players": 8
@@ -57,7 +57,7 @@ These fields are required by submission validation:
"id": "quest-arena",
"name": "Quest Arena",
"version": "1.2.0",
- "crafty_sdk": "1.0",
+ "summer_sdk": "1.0",
"entry_scene": "quest_arena.tscn",
"player_scene": "player.tscn",
"min_players": 1,
diff --git a/api-reference/summer-sdk/naming.mdx b/api-reference/summer-sdk/naming.mdx
new file mode 100644
index 0000000..0cc513b
--- /dev/null
+++ b/api-reference/summer-sdk/naming.mdx
@@ -0,0 +1,144 @@
+---
+title: "Summer SDK Naming"
+description: "The Crafty to Summer symbol map: every renamed class, autoload, manifest key, and path, plus the identifiers that deliberately did not move."
+icon: "arrow-right-left"
+---
+
+## Why This Page Exists
+
+The platform used to be called Crafty. It is now **Summercraft**, and the thing you
+build against is the **Summer SDK**. The rename reached the code, not just the copy, so
+games written against the old names need a mechanical pass.
+
+This page is the single authority for what each old identifier became. If another
+document, comment, or older repository disagrees with the table below, the table wins.
+
+
+ Renaming is mechanical but not free. `summer_sdk` is a **required** manifest key and
+ `SummerGame` is a **required** base class. A game that still declares `crafty_sdk` or
+ extends `CraftyGame` fails submission validation rather than degrading quietly.
+
+
+## Autoload Singleton
+
+| Old | New | Where |
+|---|---|---|
+| `Crafty` | `Summer` | Autoload registered at `/root/Summer` |
+| `res://sdk/crafty.gd` | `res://sdk/summer.gd` | Autoload script path |
+
+`Summer` is the Summercraft platform singleton available inside a published game. It is
+unrelated to **Summer Engine**, the editor you build in — the two never appear in the
+same script.
+
+## Classes
+
+Every SDK class drops the `Crafty` prefix for `Summer`.
+
+| Old | New | Documented in |
+|---|---|---|
+| `CraftyGame` | `SummerGame` | [SummerGame](/api-reference/summer-sdk/summer-game) |
+| `CraftyPlayer` | `SummerPlayer` | [SummerPlayer](/api-reference/summer-sdk/summer-player) |
+| `CraftyCharacter3D` | `SummerCharacter3D` | [SummerPlayer](/api-reference/summer-sdk/summer-player), [Multiplayer FFA guide](/api-reference/summer-sdk/guides/multiplayer-ffa-coin-collector) |
+| `CraftyObject` | `SummerObject` | [Summer Singleton](/api-reference/summer-sdk/summer), [Multiplayer FFA guide](/api-reference/summer-sdk/guides/multiplayer-ffa-coin-collector) |
+| `CraftyNPC` | `SummerNPC` | [Summer Singleton](/api-reference/summer-sdk/summer) |
+| `CraftyTeams` | `SummerTeams` | [Subsystems and Signals](/api-reference/summer-sdk/subsystems-signals) |
+| `CraftyScore` | `SummerScore` | [Subsystems and Signals](/api-reference/summer-sdk/subsystems-signals) |
+| `CraftyData` | `SummerData` | [Subsystems and Signals](/api-reference/summer-sdk/subsystems-signals) |
+| `CraftyEconomy` | `SummerEconomy` | [Subsystems and Signals](/api-reference/summer-sdk/subsystems-signals) |
+| `CraftyUI` | `SummerUI` | [Subsystems and Signals](/api-reference/summer-sdk/subsystems-signals) |
+| `CraftyAudio` | `SummerAudio` | [Subsystems and Signals](/api-reference/summer-sdk/subsystems-signals) |
+| `CraftyInput` | `SummerInput` | [Subsystems and Signals](/api-reference/summer-sdk/subsystems-signals) |
+| `CraftyMCP` | `SummerMCP` | Not documented publicly |
+
+Subsystems are reached through the singleton (`Summer.teams`, `Summer.score`,
+`Summer.data`, `Summer.economy`, `Summer.ui`, `Summer.audio`, `Summer.input`). The
+handle names did not change — only the singleton in front of them.
+
+**Method names, signal names, and signatures are unchanged.** `set_synced`,
+`is_server()`, `player_killed`, and the rest all keep their names.
+
+## Manifest, Config, and Paths
+
+| Old | New | Documented in |
+|---|---|---|
+| `crafty_sdk` | `summer_sdk` | [manifest.json Reference](/api-reference/summer-sdk/manifest-json-reference) |
+| `res://crafty.cfg` | `res://summer.cfg` | [Banned APIs Reference](/api-reference/summer-sdk/banned-apis-reference) |
+| `res://sdk/crafty_character_3d.gd` | `res://sdk/summer_character_3d.gd` | [Build Your First Summercraft Game](/api-reference/summer-sdk/build-your-first-summer-game), [AI Agent Playbook](/api-reference/summer-sdk/ai-agent-playbook) |
+| `sdk/crafty_*.gd` | `sdk/summer_*.gd` | SDK source layout |
+
+## Web Runtime
+
+The browser-side surface of the Summer SDK renames alongside a protocol version bump.
+The old names are removed rather than aliased.
+
+| Old | New |
+|---|---|
+| `crafty.webview.v1` | `summer.webview.v2` |
+| `playcrafty.preview` | `summer.preview.v2` |
+| `CraftyRuntime` | `SummerRuntime` |
+| `crafty-runtime.js` | `summer-runtime.js` |
+| `@playcrafty/game-kit` | `@summercraft/game-kit` |
+| `https://playcrafty.games/contracts/*.schema.json` | `https://summercraft.ai/contracts/*.schema.json` |
+
+
+ There is no `v1` compatibility shim and no `CraftyRuntime` alias. A page still speaking
+ `crafty.webview.v1` after the cutover is not talking to anything.
+
+
+**`v2` is a rename and a version bump, not a protocol redesign.** Message shapes are
+unchanged from `v1`, including the legacy normalization that still accepts a bare event
+name — `{type: "game_over"}` remains equivalent to
+`{type: "summer:event", event: "game_over"}`. If your game already spoke `v1` correctly,
+the only edit it needs is the protocol string and the runtime global. Nothing about how
+you construct or handle messages changes.
+
+## Player Currency
+
+The in-game currency is **Crafties** (display name), `crafties` on the wire and in code.
+
+| Concept | Name |
+|---|---|
+| Player currency, display | Crafties |
+| Player currency, wire and code | `crafties` |
+
+
+ **"Credits" is not the player currency.** In Summer Engine, credits are the compute
+ billing unit you spend on AI generation. The two never mix, and no balance is ever
+ converted between them. If you are writing about something a *player* earns or spends
+ inside a game, the word is crafties.
+
+
+Amounts passed to and returned from `Summer.economy` are crafties.
+
+Note that "credits" also appears in the docs in its ordinary English sense — crediting an
+asset's creator, and the in-game credits roll. Neither is a currency.
+
+## Domains
+
+| Old | New |
+|---|---|
+| `playcrafty.games` | `summercraft.ai` |
+
+`summercraft.ai` is the canonical domain. `playcrafty.games` survives only as a legacy
+redirect, not as a second address for the same content.
+
+## What Deliberately Did Not Move
+
+Not every `crafty` string is a branding leftover. These are load-bearing and stay as they
+are:
+
+- **`crafty-production-5a7c.up.railway.app`** — the deployed platform-api host that serves
+ `POST /games/submit`. It is a Railway-generated hostname, it is what actually answers,
+ and rewriting it in documentation would publish a submission endpoint that does not
+ exist. It changes only if the service is redeployed under a new name.
+- **`crafty-game-server`** — the live Fly.io application name, which is also the base for
+ the game-server image tag and its `.fly.dev` hostname. Same reasoning: an app name is a
+ deployed identity, not a label.
+- **`c`-prefixed database tables** (`cFeedItems`, `cGamePublicStats`, and siblings) —
+ internal, invisible to creators, and renaming them would churn every policy, view, and
+ foreign key for no user-visible gain.
+- **The `games.playcrafty.mobile` bundle id** — app-store identity cannot be renamed in
+ place on an existing listing.
+
+The rule these share: a name that some live system resolves is not copy, and it moves only
+when that system moves.
diff --git a/api-reference/crafty-sdk/production-launch-runbook.mdx b/api-reference/summer-sdk/production-launch-runbook.mdx
similarity index 80%
rename from api-reference/crafty-sdk/production-launch-runbook.mdx
rename to api-reference/summer-sdk/production-launch-runbook.mdx
index 5dbe365..cf40100 100644
--- a/api-reference/crafty-sdk/production-launch-runbook.mdx
+++ b/api-reference/summer-sdk/production-launch-runbook.mdx
@@ -10,24 +10,24 @@ This page is the shortest safe route from “new game” to “submitted for rev
## Current Publishing Checklist (Most Important)
-- Build your creator gameplay scripts in `GDScript` for the current Crafty publishing flow.
+- Build your creator gameplay scripts in `GDScript` for the current Summercraft publishing flow.
- Submit one exportable `.pck` package plus `manifest.json`.
- Keep total `.pck` package size at or under **2 GB**.
- If your build is larger than 2 GB, email [founders@summerengine.com](mailto:founders@summerengine.com) for large-upload onboarding.
## Step 1: Validate Project Contract
-- `main.gd` extends `CraftyGame`.
+- `main.gd` extends `SummerGame`.
- `manifest.json` includes required keys.
- `player_scene` points to a valid scene.
- gameplay scripts are authored in `GDScript`.
- choose player model:
- - `CraftyCharacter3D` (3D template), or
- - custom script extending `CraftyPlayer`.
+ - `SummerCharacter3D` (3D template), or
+ - custom script extending `SummerPlayer`.
## Step 2: Validate Authority Boundaries
-- gameplay outcomes run under `if not Crafty.is_server(): return`.
+- gameplay outcomes run under `if not Summer.is_server(): return`.
- clients render synced state (`get_synced`) only.
- no score/economy/data writes on client paths.
@@ -39,7 +39,7 @@ This page is the shortest safe route from “new game” to “submitted for rev
Reference:
-- [/api-reference/crafty-sdk/banned-apis-reference](/api-reference/crafty-sdk/banned-apis-reference)
+- [/api-reference/summer-sdk/banned-apis-reference](/api-reference/summer-sdk/banned-apis-reference)
## Step 4: Local Runtime Validation
@@ -52,7 +52,7 @@ Run through test-runner flow and confirm:
Reference:
-- [/api-reference/crafty-sdk/testing-your-game-locally](/api-reference/crafty-sdk/testing-your-game-locally)
+- [/api-reference/summer-sdk/testing-your-game-locally](/api-reference/summer-sdk/testing-your-game-locally)
## Step 5: Export Validation
@@ -64,7 +64,7 @@ Reference:
Reference:
-- [/api-reference/crafty-sdk/exporting-and-uploading-your-game](/api-reference/crafty-sdk/exporting-and-uploading-your-game)
+- [/api-reference/summer-sdk/exporting-and-uploading-your-game](/api-reference/summer-sdk/exporting-and-uploading-your-game)
## Step 6: Submission Validation
@@ -81,7 +81,7 @@ Expect:
Reference:
-- [/api-reference/crafty-sdk/submission-guide](/api-reference/crafty-sdk/submission-guide)
+- [/api-reference/summer-sdk/submission-guide](/api-reference/summer-sdk/submission-guide)
## Top 10 Failure Modes (And Fixes)
@@ -102,7 +102,7 @@ Reference:
8. **Manifest type mismatch**
- Enforce required key types.
9. **Template mismatch**
- - 3D helper methods used without `CraftyCharacter3D`.
+ - 3D helper methods used without `SummerCharacter3D`.
10. **Reconnect instability**
- Reinitialize player synced state on join.
diff --git a/api-reference/crafty-sdk/submission-guide.mdx b/api-reference/summer-sdk/submission-guide.mdx
similarity index 87%
rename from api-reference/crafty-sdk/submission-guide.mdx
rename to api-reference/summer-sdk/submission-guide.mdx
index 97503df..1f3bce8 100644
--- a/api-reference/crafty-sdk/submission-guide.mdx
+++ b/api-reference/summer-sdk/submission-guide.mdx
@@ -1,6 +1,6 @@
---
title: "Submission Guide"
-description: "How to export .pck, pass static analysis, upload to playcrafty.games, and understand review/update flow."
+description: "How to export .pck, pass static analysis, upload to summercraft.ai, and understand review/update flow."
icon: "upload"
---
@@ -42,7 +42,7 @@ If scanner violations are found, submission fails with:
See the complete up-to-date list here:
-- [Banned APIs Reference](/api-reference/crafty-sdk/banned-apis-reference)
+- [Banned APIs Reference](/api-reference/summer-sdk/banned-apis-reference)
### Important For AI Code Generation
@@ -57,7 +57,7 @@ if OS.has_feature("editor"):
The scanner is pattern-based and blocks usage regardless of runtime branch.
-## 3) Upload on playcrafty.games
+## 3) Upload on summercraft.ai
V1 submission requires two files:
@@ -110,13 +110,13 @@ The platform:
## Related Docs
-- [Testing Your Game Locally](/api-reference/crafty-sdk/testing-your-game-locally)
-- [Exporting and Uploading Your Game](/api-reference/crafty-sdk/exporting-and-uploading-your-game)
-- [Banned APIs Reference](/api-reference/crafty-sdk/banned-apis-reference)
+- [Testing Your Game Locally](/api-reference/summer-sdk/testing-your-game-locally)
+- [Exporting and Uploading Your Game](/api-reference/summer-sdk/exporting-and-uploading-your-game)
+- [Banned APIs Reference](/api-reference/summer-sdk/banned-apis-reference)
## Common Upload Errors
- `Missing .pck file (multipart field: pck)`
- `Uploaded file must be a .pck`
-- `Invalid manifest. Required: id, name, version, crafty_sdk, entry_scene, min_players, max_players`
+- `Invalid manifest. Required: id, name, version, summer_sdk, entry_scene, min_players, max_players`
- `Static analysis failed` (with violations list)
diff --git a/api-reference/crafty-sdk/subsystems-signals.mdx b/api-reference/summer-sdk/subsystems-signals.mdx
similarity index 53%
rename from api-reference/crafty-sdk/subsystems-signals.mdx
rename to api-reference/summer-sdk/subsystems-signals.mdx
index 603d7b8..e07e537 100644
--- a/api-reference/crafty-sdk/subsystems-signals.mdx
+++ b/api-reference/summer-sdk/subsystems-signals.mdx
@@ -11,17 +11,17 @@ 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.
+- Summer SDK subsystems provide multiplayer/platform primitives.
## Teams
```gdscript
-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()
+Summer.teams.create("red", {"color": Color.RED, "max_size": 4})
+Summer.teams.create("blue", {"color": Color.BLUE, "max_size": 4})
+Summer.teams.assign(player, "red")
+var team = Summer.teams.get_team(player)
+var members = Summer.teams.get_members("red")
+Summer.teams.auto_balance()
```
Methods:
@@ -36,12 +36,12 @@ Methods:
## Score
```gdscript
-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")
+Summer.score.add(player, 1)
+Summer.score.set_score(player, 12)
+var score = Summer.score.get_score(player)
+var leaderboard = Summer.score.get_leaderboard()
+Summer.score.add_team("red", 2)
+var team_score = Summer.score.get_team("red")
```
Methods:
@@ -58,10 +58,10 @@ Methods:
Persistent player data:
```gdscript
-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")
+Summer.data.save(player, "level", 5)
+var level = Summer.data.load(player, "level")
+var all_data = Summer.data.load_all(player)
+Summer.data.delete(player, "legacy_key")
```
Methods:
@@ -74,10 +74,10 @@ Methods:
## Economy
```gdscript
-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)
+var awarded = await Summer.economy.award(player, 5, "match_win")
+var spent = await Summer.economy.spend(player, 3, "buy_hint")
+var balance = await Summer.economy.get_balance(player)
+var can_pay = await Summer.economy.has_balance(player, 10)
```
Methods:
@@ -90,11 +90,11 @@ Methods:
## UI
```gdscript
-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)
+Summer.ui.show_scoreboard()
+Summer.ui.hide_scoreboard()
+Summer.ui.show_timer(60)
+Summer.ui.show_announcement("Final minute!", 3.0)
+Summer.ui.show_kill_feed(killer, victim)
```
Optional helper UI. Creators can still build fully custom UI.
@@ -102,14 +102,14 @@ Optional helper UI. Creators can still build fully custom UI.
## Audio
```gdscript
-Crafty.audio.play_at(sound, Vector3(0, 1, 0))
-Crafty.audio.play_global(sound)
-Crafty.audio.play_for(player, sound)
+Summer.audio.play_at(sound, Vector3(0, 1, 0))
+Summer.audio.play_global(sound)
+Summer.audio.play_for(player, sound)
```
## Input
-`Crafty.input` and per-player `player.input` provide server-readable control state.
+`Summer.input` and per-player `player.input` provide server-readable control state.
Use server-authoritative checks for outcomes.
@@ -118,14 +118,14 @@ Use server-authoritative checks for outcomes.
Connect game logic to platform gameplay signals:
```gdscript
-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)
+Summer.player_killed.connect(_on_player_killed)
+Summer.player_damaged.connect(_on_player_damaged)
+Summer.player_respawned.connect(_on_player_respawned)
+Summer.timer_expired.connect(_on_timer_expired)
+Summer.object_collected.connect(_on_object_collected)
+Summer.npc_killed.connect(_on_npc_killed)
+Summer.return_to_hub_requested.connect(_on_return_to_hub_requested)
+Summer.play_again_requested.connect(_on_play_again_requested)
```
Available signals:
diff --git a/api-reference/crafty-sdk/crafty-game.mdx b/api-reference/summer-sdk/summer-game.mdx
similarity index 76%
rename from api-reference/crafty-sdk/crafty-game.mdx
rename to api-reference/summer-sdk/summer-game.mdx
index 4cc22ae..abb984d 100644
--- a/api-reference/crafty-sdk/crafty-game.mdx
+++ b/api-reference/summer-sdk/summer-game.mdx
@@ -1,14 +1,14 @@
---
-title: "CraftyGame"
-description: "Required base class that connects your game to the Crafty platform lifecycle."
+title: "SummerGame"
+description: "Required base class that connects your game to the Summercraft platform lifecycle."
icon: "workflow"
---
-## What Is `CraftyGame`?
+## What Is `SummerGame`?
-Every game published on Crafty must extend `CraftyGame`.
+Every game published on Summercraft must extend `SummerGame`.
-`CraftyGame` is the contract between your game and the platform:
+`SummerGame` is the contract between your game and the platform:
- game lifecycle,
- player join/leave callbacks,
@@ -16,7 +16,7 @@ Every game published on Crafty must extend `CraftyGame`.
- server-authoritative movement helper for 3D templates.
```gdscript
-extends CraftyGame
+extends SummerGame
```
## Required Lifecycle Hooks
@@ -42,10 +42,10 @@ func _player_left(player) -> void:
Use untyped `player` for maximum compatibility across:
-- `CraftyCharacter3D` players (3D action template),
-- custom `CraftyPlayer` subclasses (2D/RTS/card/turn-based).
+- `SummerCharacter3D` players (3D action template),
+- custom `SummerPlayer` subclasses (2D/RTS/card/turn-based).
-## Common Platform Methods On `CraftyGame`
+## Common Platform Methods On `SummerGame`
```gdscript
end_game(from_timer: bool = false) -> void
@@ -71,14 +71,14 @@ apply_default_movement(player, delta, move_speed := 7.0, gravity := 20.0) -> voi
```gdscript
func _process(delta: float) -> void:
super._process(delta)
- if not Crafty.is_server():
+ if not Summer.is_server():
return
# authoritative gameplay logic here
```
## 3D Template Pattern (Optional)
-If your player scene uses `CraftyCharacter3D`, you can use the built-in movement helper:
+If your player scene uses `SummerCharacter3D`, you can use the built-in movement helper:
```gdscript
const MOVE_SPEED := 8.0
@@ -86,7 +86,7 @@ const GRAVITY := 20.0
func _process(delta: float) -> void:
super._process(delta)
- if not Crafty.is_server():
+ if not Summer.is_server():
return
for p in get_players():
apply_default_movement(p, delta, MOVE_SPEED, GRAVITY)
@@ -97,11 +97,11 @@ For non-3D games, ignore `apply_default_movement` and implement your own state m
## Minimal Example
```gdscript
-extends CraftyGame
+extends SummerGame
func _game_start() -> void:
- Crafty.set_time_limit(180.0)
- Crafty.send_announcement("Match started")
+ Summer.set_time_limit(180.0)
+ Summer.send_announcement("Match started")
func _player_joined(player) -> void:
player.set_synced("score", 0)
diff --git a/api-reference/crafty-sdk/crafty-player.mdx b/api-reference/summer-sdk/summer-player.mdx
similarity index 83%
rename from api-reference/crafty-sdk/crafty-player.mdx
rename to api-reference/summer-sdk/summer-player.mdx
index fe092d0..eb12f4d 100644
--- a/api-reference/crafty-sdk/crafty-player.mdx
+++ b/api-reference/summer-sdk/summer-player.mdx
@@ -1,12 +1,12 @@
---
-title: "CraftyPlayer"
-description: "Game-agnostic player contract: peer identity, synced state, and server-read input. Use CraftyCharacter3D for built-in 3D character behavior."
+title: "SummerPlayer"
+description: "Game-agnostic player contract: peer identity, synced state, and server-read input. Use SummerCharacter3D for built-in 3D character behavior."
icon: "user"
---
-## What Is `CraftyPlayer`?
+## What Is `SummerPlayer`?
-`CraftyPlayer` is the minimal platform contract for a connected player.
+`SummerPlayer` is the minimal platform contract for a connected player.
It is intentionally game-agnostic:
@@ -70,7 +70,7 @@ var score = player.get_synced("score") # client or server
- `get_synced(key: String) -> Variant`
- Keep authoritative game logic on server paths (`Crafty.is_server()`). Clients should render synced state, not decide outcomes.
+ Keep authoritative game logic on server paths (`Summer.is_server()`). Clients should render synced state, not decide outcomes.
## Input (Read On Server)
@@ -89,9 +89,9 @@ if player.input.is_action_just_pressed("interact"):
- `player.input.is_action_pressed(action: String) -> bool`
- `player.input.is_action_just_pressed(action: String) -> bool`
-## `CraftyCharacter3D` (Optional 3D Template)
+## `SummerCharacter3D` (Optional 3D Template)
-For 3D action games, use `CraftyCharacter3D` in your `player.tscn`.
+For 3D action games, use `SummerCharacter3D` in your `player.tscn`.
It includes:
@@ -110,6 +110,6 @@ func _player_joined(player) -> void:
## Practical Rule
-If your game needs built-in 3D character behavior, use `CraftyCharacter3D`.
+If your game needs built-in 3D character behavior, use `SummerCharacter3D`.
-If your game is not a 3D character game, extend `CraftyPlayer` directly and sync your own state model.
+If your game is not a 3D character game, extend `SummerPlayer` directly and sync your own state model.
diff --git a/api-reference/summer-sdk/summer.mdx b/api-reference/summer-sdk/summer.mdx
new file mode 100644
index 0000000..1d629e6
--- /dev/null
+++ b/api-reference/summer-sdk/summer.mdx
@@ -0,0 +1,89 @@
+---
+title: "Summer Singleton"
+description: "Platform entrypoint for multiplayer runtime features: lifecycle helpers, players, spawning, context checks, and subsystems."
+icon: "box"
+---
+
+## What Is `Summer`?
+
+`Summer` is the autoload singleton exposed by the SDK.
+
+Use it for platform-level operations that are not tied to one player object.
+
+## `Summer` vs Player Object
+
+- Use `Summer` for match-wide actions (timer, announcements, spawning, subsystem access).
+- Use the player object (`SummerPlayer` or `SummerCharacter3D`) for per-player synced state and input.
+
+## Core Methods (Signatures)
+
+```gdscript
+end_game() -> void
+set_time_limit(seconds: float) -> void
+get_time_remaining() -> float
+get_players() -> Array
+get_player_count() -> int
+get_max_players() -> int
+send_announcement(text: String) -> void
+spawn_npc(scene: PackedScene, position: Vector3) -> SummerNPC
+spawn_object(scene: PackedScene, position: Vector3) -> SummerObject
+spawn_projectile(scene: PackedScene, origin: Vector3, direction: Vector3, speed: float) -> SummerObject
+is_server() -> bool
+is_client() -> bool
+```
+
+## Match Flow
+
+```gdscript
+Summer.set_time_limit(300)
+Summer.send_announcement("Round started")
+
+if Summer.get_time_remaining() <= 0.0:
+ Summer.end_game()
+```
+
+## Players
+
+```gdscript
+var players = Summer.get_players()
+var current = Summer.get_player_count()
+var max_players = Summer.get_max_players()
+```
+
+## Announcements
+
+```gdscript
+Summer.send_announcement("Sudden death starts now!")
+```
+
+## Spawning
+
+```gdscript
+var npc = Summer.spawn_npc(npc_scene, Vector3(0, 0, 0))
+var pickup = Summer.spawn_object(pickup_scene, Vector3(2, 0, 2))
+var projectile = Summer.spawn_projectile(bullet_scene, origin, direction, 30.0)
+```
+
+## Runtime Context
+
+```gdscript
+if Summer.is_server():
+ # scoring, persistence, win conditions
+ update_game_state()
+```
+
+Use `is_server()` and `is_client()` to keep gameplay authority on the server.
+
+## Subsystems
+
+`Summer` exposes optional subsystem handles:
+
+- `Summer.teams`
+- `Summer.score`
+- `Summer.data`
+- `Summer.economy`
+- `Summer.ui`
+- `Summer.audio`
+- `Summer.input`
+
+See `/api-reference/summer-sdk/subsystems-signals` for subsystem APIs.
diff --git a/api-reference/crafty-sdk/testing-your-game-locally.mdx b/api-reference/summer-sdk/testing-your-game-locally.mdx
similarity index 85%
rename from api-reference/crafty-sdk/testing-your-game-locally.mdx
rename to api-reference/summer-sdk/testing-your-game-locally.mdx
index 1e6c510..3ea8acb 100644
--- a/api-reference/crafty-sdk/testing-your-game-locally.mdx
+++ b/api-reference/summer-sdk/testing-your-game-locally.mdx
@@ -1,6 +1,6 @@
---
title: "Testing Your Game Locally"
-description: "Press play, launch server+client automatically, and test your Crafty game with production-like runtime behavior."
+description: "Press play, launch server+client automatically, and test your Summercraft game with production-like runtime behavior."
icon: "flask-conical"
---
@@ -8,10 +8,10 @@ icon: "flask-conical"
Local testing should match production behavior as closely as possible.
-In Crafty, a published game runs on:
+In Summercraft, a published game runs on:
- the same Summer/Godot runtime,
-- the same Crafty SDK APIs,
+- the same Summer SDK APIs,
- server-authoritative networking.
That is why the recommended workflow launches a local headless server and a client, instead of testing gameplay logic in a client-only setup.
@@ -49,8 +49,8 @@ To make local testing reliable:
- Keep `manifest.json` valid and present.
- Ensure `entry_scene` points to a real scene.
-- Set `player_scene` and keep it in sync with your player scene path (`CraftyCharacter3D` for 3D templates, or your own `CraftyPlayer` subclass for other genres).
-- Keep server-authoritative logic in server paths (`Crafty.is_server()` checks where needed).
+- Set `player_scene` and keep it in sync with your player scene path (`SummerCharacter3D` for 3D templates, or your own `SummerPlayer` subclass for other genres).
+- Keep server-authoritative logic in server paths (`Summer.is_server()` checks where needed).
## Multiplayer Testing (2+ Players)
@@ -91,14 +91,14 @@ Usually one of:
- `manifest.json` missing or invalid.
- `entry_scene` path wrong.
-- scene root does not extend `CraftyGame`.
+- scene root does not extend `SummerGame`.
### Player spawns fail
Usually one of:
- `player_scene` path wrong.
-- player scene does not use `CraftyPlayer`.
+- player scene does not use `SummerPlayer`.
- game scene missing expected spawn/player nodes.
### Local behavior differs from expected production behavior
@@ -111,6 +111,6 @@ Check:
## Related Docs
-- [manifest.json Reference](/api-reference/crafty-sdk/manifest-json-reference)
-- [Exporting and Uploading Your Game](/api-reference/crafty-sdk/exporting-and-uploading-your-game)
-- [Banned APIs Reference](/api-reference/crafty-sdk/banned-apis-reference)
+- [manifest.json Reference](/api-reference/summer-sdk/manifest-json-reference)
+- [Exporting and Uploading Your Game](/api-reference/summer-sdk/exporting-and-uploading-your-game)
+- [Banned APIs Reference](/api-reference/summer-sdk/banned-apis-reference)
diff --git a/changelog/overview.mdx b/changelog/overview.mdx
index a31fd03..05784fa 100644
--- a/changelog/overview.mdx
+++ b/changelog/overview.mdx
@@ -4,6 +4,21 @@ description: "What's new in Summer Engine. Release notes and updates."
icon: "history"
---
+
+
+## Crafty is now Summercraft, and the Crafty SDK is now the Summer SDK
+
+The publishing platform is called **Summercraft** and the SDK you build games against
+is the **Summer SDK**. Code symbols moved with the copy: the `Crafty` autoload is now
+`Summer`, `CraftyGame` is now `SummerGame`, and the `crafty_sdk` manifest key is now
+`summer_sdk`. Existing games need a mechanical rename — the
+[Summer SDK Naming](/api-reference/summer-sdk/naming) page maps every old identifier to
+its replacement. Every previously published SDK URL redirects to its new address.
+
+This is a naming change, not an engine release. No Summer Engine behavior changed.
+
+
+
## The right edit, even with a team at work
diff --git a/docs.json b/docs.json
index 301632d..31c3d1e 100644
--- a/docs.json
+++ b/docs.json
@@ -183,30 +183,31 @@
]
},
{
- "tab": "Crafty SDK",
+ "tab": "Summer SDK",
"icon": "code",
"groups": [
{
- "group": "Creating Games on Crafty",
+ "group": "Creating Games on Summercraft",
"pages": [
- "api-reference/crafty-sdk",
- "api-reference/crafty-sdk/crafty",
- "api-reference/crafty-sdk/crafty-game",
- "api-reference/crafty-sdk/crafty-player",
- "api-reference/crafty-sdk/subsystems-signals",
- "api-reference/crafty-sdk/build-your-first-crafty-game",
- "api-reference/crafty-sdk/guides/multiplayer-ffa-coin-collector",
- "api-reference/crafty-sdk/guides/multiplayer-persistence-rpg",
- "api-reference/crafty-sdk/guides/team-based-game",
- "api-reference/crafty-sdk/guides/making-a-2d-game-multiplayer",
- "api-reference/crafty-sdk/guides/making-a-turn-based-or-card-game-multiplayer",
- "api-reference/crafty-sdk/manifest-json-reference",
- "api-reference/crafty-sdk/production-launch-runbook",
- "api-reference/crafty-sdk/submission-guide",
- "api-reference/crafty-sdk/testing-your-game-locally",
- "api-reference/crafty-sdk/exporting-and-uploading-your-game",
- "api-reference/crafty-sdk/banned-apis-reference",
- "api-reference/crafty-sdk/ai-agent-playbook"
+ "api-reference/summer-sdk",
+ "api-reference/summer-sdk/naming",
+ "api-reference/summer-sdk/summer",
+ "api-reference/summer-sdk/summer-game",
+ "api-reference/summer-sdk/summer-player",
+ "api-reference/summer-sdk/subsystems-signals",
+ "api-reference/summer-sdk/build-your-first-summer-game",
+ "api-reference/summer-sdk/guides/multiplayer-ffa-coin-collector",
+ "api-reference/summer-sdk/guides/multiplayer-persistence-rpg",
+ "api-reference/summer-sdk/guides/team-based-game",
+ "api-reference/summer-sdk/guides/making-a-2d-game-multiplayer",
+ "api-reference/summer-sdk/guides/making-a-turn-based-or-card-game-multiplayer",
+ "api-reference/summer-sdk/manifest-json-reference",
+ "api-reference/summer-sdk/production-launch-runbook",
+ "api-reference/summer-sdk/submission-guide",
+ "api-reference/summer-sdk/testing-your-game-locally",
+ "api-reference/summer-sdk/exporting-and-uploading-your-game",
+ "api-reference/summer-sdk/banned-apis-reference",
+ "api-reference/summer-sdk/ai-agent-playbook"
]
},
{
@@ -432,6 +433,78 @@
{
"source": "/knowledge-base/whats-next",
"destination": "/knowledge-base/what-is-summer"
+ },
+ {
+ "source": "/api-reference/crafty-sdk",
+ "destination": "/api-reference/summer-sdk"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/crafty",
+ "destination": "/api-reference/summer-sdk/summer"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/crafty-game",
+ "destination": "/api-reference/summer-sdk/summer-game"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/crafty-player",
+ "destination": "/api-reference/summer-sdk/summer-player"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/build-your-first-crafty-game",
+ "destination": "/api-reference/summer-sdk/build-your-first-summer-game"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/subsystems-signals",
+ "destination": "/api-reference/summer-sdk/subsystems-signals"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/manifest-json-reference",
+ "destination": "/api-reference/summer-sdk/manifest-json-reference"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/production-launch-runbook",
+ "destination": "/api-reference/summer-sdk/production-launch-runbook"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/submission-guide",
+ "destination": "/api-reference/summer-sdk/submission-guide"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/testing-your-game-locally",
+ "destination": "/api-reference/summer-sdk/testing-your-game-locally"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/exporting-and-uploading-your-game",
+ "destination": "/api-reference/summer-sdk/exporting-and-uploading-your-game"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/banned-apis-reference",
+ "destination": "/api-reference/summer-sdk/banned-apis-reference"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/ai-agent-playbook",
+ "destination": "/api-reference/summer-sdk/ai-agent-playbook"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/guides/multiplayer-ffa-coin-collector",
+ "destination": "/api-reference/summer-sdk/guides/multiplayer-ffa-coin-collector"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/guides/multiplayer-persistence-rpg",
+ "destination": "/api-reference/summer-sdk/guides/multiplayer-persistence-rpg"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/guides/team-based-game",
+ "destination": "/api-reference/summer-sdk/guides/team-based-game"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/guides/making-a-2d-game-multiplayer",
+ "destination": "/api-reference/summer-sdk/guides/making-a-2d-game-multiplayer"
+ },
+ {
+ "source": "/api-reference/crafty-sdk/guides/making-a-turn-based-or-card-game-multiplayer",
+ "destination": "/api-reference/summer-sdk/guides/making-a-turn-based-or-card-game-multiplayer"
}
]
-}
\ No newline at end of file
+}
diff --git a/knowledge-base/multiplayer.mdx b/knowledge-base/multiplayer.mdx
index 09811ea..a80f454 100644
--- a/knowledge-base/multiplayer.mdx
+++ b/knowledge-base/multiplayer.mdx
@@ -19,10 +19,10 @@ The AI assistant can generate multiplayer boilerplate, set up lobby systems, con
## Current Limitations
-- **No built-in matchmaking or relay servers**: Summer does not yet provide hosted multiplayer infrastructure. You need to bring your own server or use a service like [Crafty](/api-reference/crafty-sdk) for web-based multiplayer games.
+- **No built-in matchmaking or relay servers**: Summer does not yet provide hosted multiplayer infrastructure. You need to bring your own server or use a service like [Summercraft](/api-reference/summer-sdk) for web-based multiplayer games.
- **Complex netcode patterns**: Advanced techniques like client-side prediction, rollback, and lag compensation require manual implementation. The AI can assist but these are inherently complex.
- **Testing**: Multiplayer testing requires running multiple instances manually.
-## Crafty SDK for Web Multiplayer
+## Summer SDK for Web Multiplayer
-If you are building a web-based multiplayer game, the [Crafty SDK](/api-reference/crafty-sdk) provides a managed multiplayer backend with automatic matchmaking, persistence, and server hosting. This is the easiest path to online multiplayer in Summer.
+If you are building a web-based multiplayer game, the [Summer SDK](/api-reference/summer-sdk) provides a managed multiplayer backend with automatic matchmaking, persistence, and server hosting. This is the easiest path to online multiplayer in Summer.