From 2d61c79e83142da190b861d3c1f19690224e303e Mon Sep 17 00:00:00 2001 From: mathias-heide Date: Tue, 28 Jul 2026 15:53:23 +0200 Subject: [PATCH 1/6] docs(sdk): rename Crafty SDK to Summer SDK Folder, page slugs, navigation, and copy move from Crafty to the current brand: the platform is Summercraft, the dev surface is Summer SDK. - api-reference/crafty-sdk/ -> api-reference/summer-sdk/ - crafty.mdx / crafty-game.mdx / crafty-player.mdx -> summer.mdx / summer-game.mdx / summer-player.mdx - build-your-first-crafty-game -> build-your-first-summer-game - GDScript symbols move to the Summer.* form (Crafty -> Summer, CraftyGame -> SummerGame, CraftyPlayer -> SummerPlayer, ...) - manifest key crafty_sdk -> summer_sdk; res://crafty.cfg -> res://summer.cfg - playcrafty.games -> summercraft.ai (summercraft.ai is canonical per the Summercraft DOMAINS.md) Per URL-POLICY.md every moved URL gets a permanent redirect: 18 added, so no previously published address 404s. The Railway platform-api host crafty-production-5a7c.up.railway.app is deliberately left alone. It is the live deployed submission endpoint and renaming it in docs would document an endpoint that does not exist. Co-Authored-By: Claude Fable 5 --- URL-POLICY.md | 2 +- api-reference/crafty-sdk/crafty.mdx | 89 -------------- .../{crafty-sdk.mdx => summer-sdk.mdx} | 66 +++++----- .../ai-agent-playbook.mdx | 44 +++---- .../banned-apis-reference.mdx | 32 ++--- .../build-your-first-summer-game.mdx} | 38 +++--- .../exporting-and-uploading-your-game.mdx | 16 +-- .../guides/making-a-2d-game-multiplayer.mdx | 24 ++-- ...-a-turn-based-or-card-game-multiplayer.mdx | 22 ++-- .../guides/multiplayer-ffa-coin-collector.mdx | 48 ++++---- .../guides/multiplayer-persistence-rpg.mdx | 82 ++++++------- .../guides/team-based-game.mdx | 52 ++++---- .../manifest-json-reference.mdx | 10 +- .../production-launch-runbook.mdx | 20 +-- .../submission-guide.mdx | 14 +-- .../subsystems-signals.mdx | 76 ++++++------ .../summer-game.mdx} | 30 ++--- .../summer-player.mdx} | 18 +-- api-reference/summer-sdk/summer.mdx | 89 ++++++++++++++ .../testing-your-game-locally.mdx | 20 +-- docs.json | 114 ++++++++++++++---- knowledge-base/multiplayer.mdx | 6 +- 22 files changed, 492 insertions(+), 420 deletions(-) delete mode 100644 api-reference/crafty-sdk/crafty.mdx rename api-reference/{crafty-sdk.mdx => summer-sdk.mdx} (60%) rename api-reference/{crafty-sdk => summer-sdk}/ai-agent-playbook.mdx (71%) rename api-reference/{crafty-sdk => summer-sdk}/banned-apis-reference.mdx (82%) rename api-reference/{crafty-sdk/build-your-first-crafty-game.mdx => summer-sdk/build-your-first-summer-game.mdx} (68%) rename api-reference/{crafty-sdk => summer-sdk}/exporting-and-uploading-your-game.mdx (89%) rename api-reference/{crafty-sdk => summer-sdk}/guides/making-a-2d-game-multiplayer.mdx (75%) rename api-reference/{crafty-sdk => summer-sdk}/guides/making-a-turn-based-or-card-game-multiplayer.mdx (84%) rename api-reference/{crafty-sdk => summer-sdk}/guides/multiplayer-ffa-coin-collector.mdx (74%) rename api-reference/{crafty-sdk => summer-sdk}/guides/multiplayer-persistence-rpg.mdx (65%) rename api-reference/{crafty-sdk => summer-sdk}/guides/team-based-game.mdx (72%) rename api-reference/{crafty-sdk => summer-sdk}/manifest-json-reference.mdx (88%) rename api-reference/{crafty-sdk => summer-sdk}/production-launch-runbook.mdx (80%) rename api-reference/{crafty-sdk => summer-sdk}/submission-guide.mdx (87%) rename api-reference/{crafty-sdk => summer-sdk}/subsystems-signals.mdx (53%) rename api-reference/{crafty-sdk/crafty-game.mdx => summer-sdk/summer-game.mdx} (76%) rename api-reference/{crafty-sdk/crafty-player.mdx => summer-sdk/summer-player.mdx} (83%) create mode 100644 api-reference/summer-sdk/summer.mdx rename api-reference/{crafty-sdk => summer-sdk}/testing-your-game-locally.mdx (85%) 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 60% rename from api-reference/crafty-sdk.mdx rename to api-reference/summer-sdk.mdx index 57d3759..d1db013 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,59 @@ Templates are examples, not requirements. ## API Sections - + 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 65% rename from api-reference/crafty-sdk/guides/multiplayer-persistence-rpg.mdx rename to api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx index 4c84cb1..ce3e926 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 Summercraft.data and Summercraft.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 credits with `Summer.economy` ## Input Actions Used @@ -23,7 +23,7 @@ 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 @@ -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,80 +93,80 @@ 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_CREDIT_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 credits)" % [str(player.get("display_name")), QUEST_CREDIT_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) @@ -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..2673652 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 Summercraft.teams and Summercraft.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/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/docs.json b/docs.json index 301632d..0a0d31d 100644 --- a/docs.json +++ b/docs.json @@ -183,30 +183,30 @@ ] }, { - "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/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 +432,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. From 11a8c8575b836ea4a76df8ae94c7b123d48befbd Mon Sep 17 00:00:00 2001 From: mathias-heide Date: Tue, 28 Jul 2026 15:56:28 +0200 Subject: [PATCH 2/6] docs(sdk): add Summer SDK naming page and changelog entry The Crafty to Summer rename touches required identifiers: a game still declaring crafty_sdk or extending CraftyGame fails submission validation rather than degrading quietly. That needs one authoritative map, not a paragraph buried in a guide. Adds /api-reference/summer-sdk/naming covering the autoload, every SDK class, manifest and config keys, script paths, the web runtime protocol bump, and the domain. It also records what deliberately did NOT move, which is the part future readers get wrong: the Railway platform-api host, the c-prefixed tables, and the mobile bundle id are resolved by live systems, not copy. Changelog gets a dated entry labelled "Summer SDK" rather than a version number, since no Summer Engine behavior changed. Older entries are left as they were shipped. Co-Authored-By: Claude Fable 5 --- api-reference/summer-sdk.mdx | 3 + .../guides/multiplayer-persistence-rpg.mdx | 2 +- .../summer-sdk/guides/team-based-game.mdx | 2 +- api-reference/summer-sdk/naming.mdx | 113 ++++++++++++++++++ changelog/overview.mdx | 15 +++ docs.json | 1 + 6 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 api-reference/summer-sdk/naming.mdx diff --git a/api-reference/summer-sdk.mdx b/api-reference/summer-sdk.mdx index d1db013..2f17c1a 100644 --- a/api-reference/summer-sdk.mdx +++ b/api-reference/summer-sdk.mdx @@ -57,6 +57,9 @@ 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 diff --git a/api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx b/api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx index ce3e926..b954401 100644 --- a/api-reference/summer-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 Summercraft.data and Summercraft.economy." +description: "How to add persistence and economy to a multiplayer game using Summer.data and Summer.economy." icon: "database" --- diff --git a/api-reference/summer-sdk/guides/team-based-game.mdx b/api-reference/summer-sdk/guides/team-based-game.mdx index 2673652..3fbab6d 100644 --- a/api-reference/summer-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 Summercraft.teams and Summercraft.score, independent of genre." +description: "How to build team modes with Summer.teams and Summer.score, independent of genre." icon: "users" --- diff --git a/api-reference/summer-sdk/naming.mdx b/api-reference/summer-sdk/naming.mdx new file mode 100644 index 0000000..6a3c101 --- /dev/null +++ b/api-reference/summer-sdk/naming.mdx @@ -0,0 +1,113 @@ +--- +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 protocol is 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. + + +## 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. +- **`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/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 0a0d31d..31c3d1e 100644 --- a/docs.json +++ b/docs.json @@ -190,6 +190,7 @@ "group": "Creating Games on Summercraft", "pages": [ "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", From d43fd7762f1fc0584fbbc53d6543adacce6a1995 Mon Sep 17 00:00:00 2001 From: mathias-heide Date: Tue, 28 Jul 2026 16:08:10 +0200 Subject: [PATCH 3/6] docs(sdk): record the Fly.io app name as a frozen identifier crafty-game-server is the live Fly.io application name, and it is also the base for the game-server image tag and the .fly.dev hostname. Same class as the Railway platform-api host already listed: a deployed identity rather than copy, so it does not move with the brand. Found by the desktop cutover; recording it here keeps the "did not move" list in one place instead of one per repo. Co-Authored-By: Claude Fable 5 --- api-reference/summer-sdk/naming.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api-reference/summer-sdk/naming.mdx b/api-reference/summer-sdk/naming.mdx index 6a3c101..a15e126 100644 --- a/api-reference/summer-sdk/naming.mdx +++ b/api-reference/summer-sdk/naming.mdx @@ -103,6 +103,9 @@ are: `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. From d1502bab8b38bc6068bf59df434d8b01be9fa46f Mon Sep 17 00:00:00 2001 From: mathias-heide Date: Tue, 28 Jul 2026 16:12:57 +0200 Subject: [PATCH 4/6] docs(economy): name the player currency Crafties, not credits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per the approved ECONOMY_PRD (summercraft/docs/ECONOMY_PRD.md, Mathias, 2026-07-28): display name "Crafties", wire name `crafties`, and "credits" stays reserved for Summer Engine compute billing. Two currencies forever; crafties never touch cProfiles.credits. The persistence guide was the only page using "credits" for game economy: QUEST_CREDIT_REWARD -> QUEST_CRAFTIES_REWARD and the synced key "credits" -> "crafties". The naming page gets a currency section stating the split, because the docs use "credits" for two other unrelated things already — the compute billing unit, and crediting an asset's creator / the in-game credits roll. Without saying so plainly, "in-game credits" is ambiguous in exactly the place both senses are live at once. Left alone: every attribution and billing use of the word. Co-Authored-By: Claude Fable 5 --- .../guides/multiplayer-persistence-rpg.mdx | 10 ++++----- api-reference/summer-sdk/naming.mdx | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx b/api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx index b954401..182b526 100644 --- a/api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx +++ b/api-reference/summer-sdk/guides/multiplayer-persistence-rpg.mdx @@ -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 `Summer.economy` +- Award and spend crafties with `Summer.economy` ## Input Actions Used @@ -29,7 +29,7 @@ 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 @@ -107,9 +107,9 @@ func _complete_quest(player) -> void: var level := 1 + int(xp / 100) Summer.data.save(player, "level", level) - var awarded := await Summer.economy.award(player, QUEST_CREDIT_REWARD, "quest_complete") + var awarded := await Summer.economy.award(player, QUEST_CRAFTIES_REWARD, "quest_complete") if awarded: - Summer.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) @@ -172,7 +172,7 @@ func _sync_player_hud_fields(player) -> void: 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` diff --git a/api-reference/summer-sdk/naming.mdx b/api-reference/summer-sdk/naming.mdx index a15e126..7bfced1 100644 --- a/api-reference/summer-sdk/naming.mdx +++ b/api-reference/summer-sdk/naming.mdx @@ -85,6 +85,28 @@ The old protocol is removed rather than aliased. `crafty.webview.v1` after the cutover is not talking to anything. +## 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. + + +The name kept its Crafty root deliberately — it is the one identifier where the old brand +survives as a product noun rather than a leftover. `Summer.economy` amounts 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 | From f514feddd712e86947fab33552b5ca2acee53f11 Mon Sep 17 00:00:00 2001 From: mathias-heide Date: Tue, 28 Jul 2026 16:13:27 +0200 Subject: [PATCH 5/6] docs(sdk): say that webview v2 keeps v1 message shapes The page described a version bump and said the old protocol was removed, which reads like v2 redesigned the wire format. It did not. v2 is a rename plus a version bump: message shapes carry over from v1, including the legacy normalization that still accepts a bare event name. Left as-is, a creator would reasonably conclude their message handling needed rewriting when only the protocol string and the runtime global change. Confirmed against the web cutover branch, where the qa-harness protocol suite passes against contracts/webview.v2.schema.json. Co-Authored-By: Claude Fable 5 --- api-reference/summer-sdk/naming.mdx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/api-reference/summer-sdk/naming.mdx b/api-reference/summer-sdk/naming.mdx index 7bfced1..e1dcd5c 100644 --- a/api-reference/summer-sdk/naming.mdx +++ b/api-reference/summer-sdk/naming.mdx @@ -69,7 +69,7 @@ handle names did not change — only the singleton in front of them. ## Web Runtime The browser-side surface of the Summer SDK renames alongside a protocol version bump. -The old protocol is removed rather than aliased. +The old names are removed rather than aliased. | Old | New | |---|---| @@ -85,6 +85,13 @@ The old protocol is removed rather than aliased. `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. From b5d7618365ac7f3f616c5e2e0988618e13f58cbc Mon Sep 17 00:00:00 2001 From: mathias-heide Date: Tue, 28 Jul 2026 16:20:59 +0200 Subject: [PATCH 6/6] docs(economy): drop the claim that Crafties is a settled choice MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The page asserted the currency "kept its Crafty root deliberately" and called it the one place the old brand survives as a product noun. That reads as a closed design decision. It is not one: the commit that aligned the spelling records that whether a Crafty-derived name survives the rebrand is still an open product call. The name itself stays, because it is current truth and creators need it to write against Summer.economy. Only the editorial claim about permanence goes. Nothing here hedges the name either — the PRD freezes the wire form on ship, and a public page is the wrong venue for pre-ship uncertainty. Co-Authored-By: Claude Fable 5 --- api-reference/summer-sdk/naming.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api-reference/summer-sdk/naming.mdx b/api-reference/summer-sdk/naming.mdx index e1dcd5c..0cc513b 100644 --- a/api-reference/summer-sdk/naming.mdx +++ b/api-reference/summer-sdk/naming.mdx @@ -108,8 +108,7 @@ The in-game currency is **Crafties** (display name), `crafties` on the wire and inside a game, the word is crafties. -The name kept its Crafty root deliberately — it is the one identifier where the old brand -survives as a product noun rather than a leftover. `Summer.economy` amounts are 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.