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