@ericrisco/rsc 0.1.35 → 0.1.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/manifest.json +241 -2
- package/package.json +1 -1
- package/scripts/lib/domains.js +1 -0
- package/scripts/lib/recommend.js +4 -0
- package/skills/game-design/SKILL.md +170 -0
- package/skills/game-design/evals/README.md +13 -0
- package/skills/game-design/evals/cases.yaml +47 -0
- package/skills/game-design/references/mechanics-and-loops.md +78 -0
- package/skills/game-design/references/playtesting-and-scope.md +58 -0
- package/skills/game-design/references/progression-and-economy.md +70 -0
- package/skills/game-storytelling/SKILL.md +159 -0
- package/skills/game-storytelling/evals/README.md +28 -0
- package/skills/game-storytelling/evals/cases.yaml +51 -0
- package/skills/game-storytelling/references/branching-and-state.md +134 -0
- package/skills/game-storytelling/references/dialogue-tools.md +117 -0
- package/skills/game-storytelling/references/environmental-storytelling.md +71 -0
- package/skills/gamedev-multiplayer/SKILL.md +250 -0
- package/skills/gamedev-multiplayer/evals/README.md +12 -0
- package/skills/gamedev-multiplayer/evals/cases.yaml +44 -0
- package/skills/gamedev-multiplayer/references/godot-high-level-multiplayer.md +133 -0
- package/skills/gamedev-multiplayer/references/prediction-and-latency.md +104 -0
- package/skills/gamedev-multiplayer/references/unity-and-unreal-netcode.md +166 -0
- package/skills/gamedev-pathing/SKILL.md +242 -0
- package/skills/gamedev-pathing/evals/README.md +14 -0
- package/skills/gamedev-pathing/evals/cases.yaml +49 -0
- package/skills/gamedev-pathing/references/navmesh-workflow.md +110 -0
- package/skills/gamedev-pathing/references/search-algorithms.md +135 -0
- package/skills/gamedev-pathing/references/steering-and-avoidance.md +120 -0
- package/skills/gamedev-physics/SKILL.md +225 -0
- package/skills/gamedev-physics/evals/README.md +12 -0
- package/skills/gamedev-physics/evals/cases.yaml +54 -0
- package/skills/gamedev-physics/references/character-controllers.md +120 -0
- package/skills/gamedev-physics/references/determinism-and-queries.md +124 -0
- package/skills/gamedev-physics/references/layers-and-masks.md +115 -0
- package/skills/gamedev-shaders/SKILL.md +252 -0
- package/skills/gamedev-shaders/evals/README.md +14 -0
- package/skills/gamedev-shaders/evals/cases.yaml +45 -0
- package/skills/gamedev-shaders/references/effect-recipes.md +205 -0
- package/skills/gamedev-shaders/references/godot-shading-language.md +133 -0
- package/skills/gamedev-shaders/references/unity-and-unreal-shaders.md +169 -0
- package/skills/gamedev-shipping/SKILL.md +236 -0
- package/skills/gamedev-shipping/evals/README.md +9 -0
- package/skills/gamedev-shipping/evals/cases.yaml +55 -0
- package/skills/gamedev-shipping/references/mobile-and-desktop.md +127 -0
- package/skills/gamedev-shipping/references/stores-and-ci.md +162 -0
- package/skills/gamedev-shipping/references/web-export-headers.md +140 -0
- package/skills/godot/SKILL.md +319 -0
- package/skills/godot/evals/README.md +13 -0
- package/skills/godot/evals/cases.yaml +50 -0
- package/skills/godot/references/export-and-testing.md +102 -0
- package/skills/godot/references/gdscript-style.md +84 -0
- package/skills/godot/references/godot3-to-4-traps.md +89 -0
- package/skills/godot/references/nodes-scenes-resources.md +109 -0
- package/skills/level-design/SKILL.md +175 -0
- package/skills/level-design/evals/README.md +35 -0
- package/skills/level-design/evals/cases.yaml +58 -0
- package/skills/level-design/references/blockout-to-art.md +118 -0
- package/skills/level-design/references/guidance-and-readability.md +152 -0
- package/skills/level-design/references/pacing-and-encounters.md +142 -0
- package/skills/roast-me/tools/adapters/__pycache__/__init__.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/base.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/claude.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/codex.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/gemini.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/registry.cpython-312.pyc +0 -0
- package/skills/unity/SKILL.md +282 -0
- package/skills/unity/evals/README.md +8 -0
- package/skills/unity/evals/cases.yaml +43 -0
- package/skills/unity/references/build-and-platforms.md +65 -0
- package/skills/unity/references/input-system.md +102 -0
- package/skills/unity/references/lifecycle-deep-dive.md +75 -0
- package/skills/unreal/SKILL.md +270 -0
- package/skills/unreal/evals/README.md +12 -0
- package/skills/unreal/evals/cases.yaml +45 -0
- package/skills/unreal/references/blueprint-cpp-parity.md +109 -0
- package/skills/unreal/references/gameplay-framework.md +95 -0
- package/skills/unreal/references/packaging.md +83 -0
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
██ ██ ███████ ███████
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
# `rsc` —
|
|
15
|
+
# `rsc` — 242 agent skills, one CLI, zero bloat
|
|
16
16
|
|
|
17
17
|
**A self-recommending skill catalog for 17 coding assistants** — Claude Code,
|
|
18
18
|
Codex, GitHub Copilot, Cursor, Gemini, Windsurf, Cline, Antigravity, Zed and more.
|
|
@@ -243,7 +243,7 @@ just asks in plain language.
|
|
|
243
243
|
|
|
244
244
|
## The catalog
|
|
245
245
|
|
|
246
|
-
|
|
246
|
+
243 skills, grouped by what you're trying to do. Click any skill to read its
|
|
247
247
|
`SKILL.md`. It fires on its own when a task matches.
|
|
248
248
|
|
|
249
249
|
### 🧭 Core & control plane
|
|
@@ -326,6 +326,12 @@ Each with a `02-DOCS` feedback loop that learns from your own results. `remotion
|
|
|
326
326
|
|
|
327
327
|
[fastapi](skills/fastapi/) · [nextjs](skills/nextjs/) · [react](skills/react/) · [react-native](skills/react-native/) · [vue-nuxt](skills/vue-nuxt/) · [angular](skills/angular/) · [svelte](skills/svelte/) · [astro](skills/astro/) · [solid-js](skills/solid-js/) · [htmx](skills/htmx/) · [nodejs](skills/nodejs/) · [nestjs](skills/nestjs/) · [django](skills/django/) · [laravel](skills/laravel/) · [rails](skills/rails/) · [spring-boot](skills/spring-boot/) · [phoenix](skills/phoenix/) · [flutter](skills/flutter/) · [swift-ios](skills/swift-ios/) · [kotlin-android](skills/kotlin-android/) · [compose-multiplatform](skills/compose-multiplatform/) · [expo](skills/expo/) · [tauri](skills/tauri/) · [electron](skills/electron/) · [rust](skills/rust/) · [wordpress](skills/wordpress/) · [shopify](skills/shopify/) · [no-code-app](skills/no-code-app/) · [chrome-extension](skills/chrome-extension/) · [api-design](skills/api-design/)
|
|
328
328
|
|
|
329
|
+
### 🎮 Game development
|
|
330
|
+
|
|
331
|
+
Three engines + engine-agnostic disciplines. Every engine skill pins the current version and bans deprecated APIs, so the agent stops emitting stale Godot-3 / legacy-Unity code.
|
|
332
|
+
|
|
333
|
+
[godot](skills/godot/) · [unity](skills/unity/) · [unreal](skills/unreal/) · [game-design](skills/game-design/) · [game-storytelling](skills/game-storytelling/) · [level-design](skills/level-design/) · [gamedev-shaders](skills/gamedev-shaders/) · [gamedev-multiplayer](skills/gamedev-multiplayer/) · [gamedev-physics](skills/gamedev-physics/) · [gamedev-pathing](skills/gamedev-pathing/) · [gamedev-shipping](skills/gamedev-shipping/)
|
|
334
|
+
|
|
329
335
|
### 🗄️ Databases & data layer
|
|
330
336
|
|
|
331
337
|
[postgresdb](skills/postgresdb/) · [mysql](skills/mysql/) · [mongodb](skills/mongodb/) · [redis](skills/redis/) · [supabase](skills/supabase/) · [neon](skills/neon/) · [planetscale](skills/planetscale/) · [sqlite-turso](skills/sqlite-turso/) · [prisma-orm](skills/prisma-orm/) · [drizzle-orm](skills/drizzle-orm/) · [firebase](skills/firebase/) · [dynamodb](skills/dynamodb/) · [vector-db](skills/vector-db/) · [clickhouse-analytics](skills/clickhouse-analytics/) · [duckdb](skills/duckdb/) · [db-migrations](skills/db-migrations/) · [backups](skills/backups/)
|
package/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.
|
|
2
|
+
"version": "0.1.36",
|
|
3
3
|
"counts": {
|
|
4
|
-
"skills":
|
|
4
|
+
"skills": 243
|
|
5
5
|
},
|
|
6
6
|
"skills": [
|
|
7
7
|
{
|
|
@@ -1737,6 +1737,156 @@
|
|
|
1737
1737
|
],
|
|
1738
1738
|
"profiles": []
|
|
1739
1739
|
},
|
|
1740
|
+
{
|
|
1741
|
+
"id": "game-design",
|
|
1742
|
+
"description": "Use when designing or repairing the design of a game — inventing mechanics and systems, shaping the core loop, layering moment-to-moment / session / meta loops, planning progression, economy, currencies and sinks/faucets, tuning difficulty curves and balance, killing dominant strategies, adding 'juice'/game feel as design intent, prototyping and playtesting, or controlling scope, and especially when the ask is 'why isn't my game fun'. Triggers: 'design the core loop', 'my game isn't fun / doesn't hook', 'balance the economy', 'the difficulty curve feels off', 'players found a dominant strategy', 'how do I scope this', 'reward / progression loop', 'diseñar la mecánica', 'el juego no engancha', 'com equilibro l'economia'. NOT writing engine code, scripts or shaders (route to godot/unity/unreal), NOT narrative, dialogue or story beats (route to game-storytelling), NOT level layout or encounter placement (route to level-design).",
|
|
1743
|
+
"tags": [
|
|
1744
|
+
"game-design",
|
|
1745
|
+
"mechanics",
|
|
1746
|
+
"core-loop",
|
|
1747
|
+
"balancing",
|
|
1748
|
+
"progression",
|
|
1749
|
+
"playtesting",
|
|
1750
|
+
"scope",
|
|
1751
|
+
"fun"
|
|
1752
|
+
],
|
|
1753
|
+
"recommends": [
|
|
1754
|
+
"level-design",
|
|
1755
|
+
"game-storytelling",
|
|
1756
|
+
"godot",
|
|
1757
|
+
"unity",
|
|
1758
|
+
"unreal"
|
|
1759
|
+
],
|
|
1760
|
+
"profiles": [
|
|
1761
|
+
"full"
|
|
1762
|
+
]
|
|
1763
|
+
},
|
|
1764
|
+
{
|
|
1765
|
+
"id": "game-storytelling",
|
|
1766
|
+
"description": "Use when designing a game's STORY as an interactive system: premise, theme and narrative pillars; branching narrative and meaningful choice; dialogue trees with state and flags; quests, objectives and fail states; worldbuilding; environmental and systemic storytelling; and keeping story in harmony with play (avoiding ludonarrative dissonance). Engine-agnostic — it designs the narrative graph, variables and beats, then hands the wiring to the engine skill. Triggers: 'write my game's story/premise', 'branching narrative', 'dialogue system/tree', 'quest structure', 'worldbuilding', 'meaningful choices', 'illusion of choice', 'Ink/Yarn Spinner/Twine/articy narrative', 'story keeps fighting the gameplay'. NOT core mechanics, systems or balance (that's game-design); NOT spatial/level layout or encounter placement (that's level-design); NOT the actual dialogue-node code, save format or plugin wiring inside an engine (that's godot/unity/unreal).",
|
|
1767
|
+
"tags": [
|
|
1768
|
+
"game",
|
|
1769
|
+
"narrative",
|
|
1770
|
+
"story",
|
|
1771
|
+
"dialogue",
|
|
1772
|
+
"quest",
|
|
1773
|
+
"branching",
|
|
1774
|
+
"worldbuilding"
|
|
1775
|
+
],
|
|
1776
|
+
"recommends": [
|
|
1777
|
+
"game-design",
|
|
1778
|
+
"level-design"
|
|
1779
|
+
],
|
|
1780
|
+
"profiles": [
|
|
1781
|
+
"full"
|
|
1782
|
+
]
|
|
1783
|
+
},
|
|
1784
|
+
{
|
|
1785
|
+
"id": "gamedev-multiplayer",
|
|
1786
|
+
"description": "Use when adding multiplayer, netcode, or replication to a game — syncing players/state across a network, online co-op or PvP, client-server vs peer-to-peer, server-authoritative design, client-side prediction + server reconciliation, snapshot interpolation, lag compensation, tick/netrate, and per-engine wiring: Godot 4.x MultiplayerSpawner/MultiplayerSynchronizer/@rpc/ENetMultiplayerPeer/set_multiplayer_authority, Unity Netcode for GameObjects (NetworkObject/NetworkBehaviour/NetworkVariable/[Rpc]/ServerRpc/ClientRpc), Unreal Actor replication (Replicated/ReplicatedUsing, Server/Client/NetMulticast RPCs, relevancy). Triggers: 'how do I sync players', 'client and server desync', 'players rubber-band or teleport', 'who has authority', 'laggy movement', 'cheater set their own health'. NOT single-player gameplay, AI, or input (route to engine skill godot/unity/unreal), and NOT matchmaking, dedicated-server hosting, or backend infra (route to deployment).",
|
|
1787
|
+
"tags": [
|
|
1788
|
+
"multiplayer",
|
|
1789
|
+
"netcode",
|
|
1790
|
+
"replication",
|
|
1791
|
+
"networking",
|
|
1792
|
+
"prediction",
|
|
1793
|
+
"authority"
|
|
1794
|
+
],
|
|
1795
|
+
"recommends": [
|
|
1796
|
+
"godot",
|
|
1797
|
+
"unity",
|
|
1798
|
+
"unreal",
|
|
1799
|
+
"gamedev-physics"
|
|
1800
|
+
],
|
|
1801
|
+
"profiles": [
|
|
1802
|
+
"full"
|
|
1803
|
+
]
|
|
1804
|
+
},
|
|
1805
|
+
{
|
|
1806
|
+
"id": "gamedev-pathing",
|
|
1807
|
+
"description": "Use when implementing AI navigation or pathfinding in a game - moving enemies/NPCs/units toward goals, \\\"how do enemies navigate the level\\\", A*/Dijkstra/JPS/HPA* search, choosing grid vs waypoint-graph vs navmesh, baking a navmesh and tuning agent radius/height, off-mesh/nav links, dynamic obstacles and re-baking, steering (seek/flee/arrive/pursue/wander/path-following/flocking), local avoidance (RVO/ORCA, crowds), and flow fields for many agents to one goal. Per-engine: Godot 4.x (NavigationServer2D/3D, NavigationRegion, NavigationAgent, get_next_path_position), Unity (NavMeshAgent + NavMeshObstacle + AI Navigation baking), Unreal (RecastNavMesh + AIController + Behavior Trees/EQS). Triggers: \\\"my enemies get stuck\\\", \\\"units clump together\\\", \\\"navmesh not updating\\\", \\\"agentes se atascan\\\". NOT physics/rigidbody collision response or character-controller tuning (gamedev-physics), and NOT high-level enemy AI behaviour design like aggro/states/difficulty (game-design).",
|
|
1808
|
+
"tags": [
|
|
1809
|
+
"pathfinding",
|
|
1810
|
+
"navmesh",
|
|
1811
|
+
"navigation",
|
|
1812
|
+
"steering",
|
|
1813
|
+
"a-star"
|
|
1814
|
+
],
|
|
1815
|
+
"recommends": [
|
|
1816
|
+
"godot",
|
|
1817
|
+
"unity",
|
|
1818
|
+
"unreal",
|
|
1819
|
+
"gamedev-physics"
|
|
1820
|
+
],
|
|
1821
|
+
"profiles": [
|
|
1822
|
+
"full"
|
|
1823
|
+
]
|
|
1824
|
+
},
|
|
1825
|
+
{
|
|
1826
|
+
"id": "gamedev-physics",
|
|
1827
|
+
"description": "Use when working with a game engine's physics — rigid bodies, colliders, collision layers/masks, character controllers, joints, forces vs impulses, raycasts/shapecasts, or when physics is unstable. Triggers: \\\"my character falls through the floor\\\", \\\"bullet tunnels through walls at high speed\\\", \\\"rigidbody jitters / vibrates / explodes\\\", \\\"objects that should collide pass through each other\\\", \\\"which collision layer and mask do I set\\\", \\\"kinematic vs dynamic body\\\", \\\"move_and_slide / CharacterBody\\\", \\\"AddForce vs impulse vs setting velocity\\\", \\\"physics in FixedUpdate or _physics_process\\\", \\\"slope and step detection\\\", \\\"trigger / Area overlap not firing\\\", Godot RigidBody/StaticBody/CharacterBody/Area, Unity Rigidbody/Collider/CharacterController, Unreal Chaos/collision presets. NOT rendering, materials, or visual jitter from shaders (use gamedev-shaders); NOT AI navigation, pathfinding, or navmesh (use gamedev-pathing).",
|
|
1828
|
+
"tags": [
|
|
1829
|
+
"physics",
|
|
1830
|
+
"collision",
|
|
1831
|
+
"rigidbody",
|
|
1832
|
+
"character-controller",
|
|
1833
|
+
"colliders"
|
|
1834
|
+
],
|
|
1835
|
+
"recommends": [
|
|
1836
|
+
"godot",
|
|
1837
|
+
"unity",
|
|
1838
|
+
"unreal",
|
|
1839
|
+
"gamedev-pathing"
|
|
1840
|
+
],
|
|
1841
|
+
"profiles": [
|
|
1842
|
+
"full"
|
|
1843
|
+
]
|
|
1844
|
+
},
|
|
1845
|
+
{
|
|
1846
|
+
"id": "gamedev-shaders",
|
|
1847
|
+
"description": "Use when writing shaders, materials, VFX, or post-processing for a game engine, or asking \\\"how do I make this effect\\\" — covers the vertex→fragment pipeline, UVs / normals / coordinate spaces, and per-engine authoring in Godot 4.x (shader_type spatial/canvas_item/particles, source_color, hint_screen_texture, ShaderMaterial), Unity 6 (Shader Graph vs HLSL, URP/HDRP, ShaderLab), and Unreal 5.x (Material graph, material domains, Custom HLSL node). Includes recipes for dissolve, rim/outline, toon/cel, water/flow, force field, hologram; full-screen post-process; and shader performance (overdraw, texture-sample cost, branching, mobile). Triggers: \\\"write a dissolve shader\\\", \\\"rim light\\\", \\\"toon shading\\\", \\\"screen-space effect\\\", \\\"my shader is slow on mobile\\\", \\\"cómo hago un shader de agua\\\". NOT gameplay or engine-API code (→ godot / unity / unreal) and NOT physics simulation, collision, or rigid bodies (→ gamedev-physics).",
|
|
1848
|
+
"tags": [
|
|
1849
|
+
"shaders",
|
|
1850
|
+
"vfx",
|
|
1851
|
+
"materials",
|
|
1852
|
+
"post-processing",
|
|
1853
|
+
"shadergraph"
|
|
1854
|
+
],
|
|
1855
|
+
"recommends": [
|
|
1856
|
+
"godot",
|
|
1857
|
+
"unity",
|
|
1858
|
+
"unreal",
|
|
1859
|
+
"gamedev-shipping"
|
|
1860
|
+
],
|
|
1861
|
+
"profiles": [
|
|
1862
|
+
"full"
|
|
1863
|
+
]
|
|
1864
|
+
},
|
|
1865
|
+
{
|
|
1866
|
+
"id": "gamedev-shipping",
|
|
1867
|
+
"description": "Use when exporting, building, packaging, or publishing a game — per engine (Godot export templates, Unity Build Profiles, Unreal Shipping vs Development) and per platform: desktop (Windows/macOS/Linux; macOS codesign + notarytool notarization), web (the COOP same-origin + COEP require-corp headers threaded SharedArrayBuffer WebAssembly builds need, and that Godot's C#/.NET edition can't export to web), mobile (Android JDK 17 build template, AAB vs APK, release keystore; iOS provisioning). Also store prep (icons/splash, metadata, age ratings, AAB for Play, Mac App Store, Steamworks/SteamPipe, itch.io butler), headless-export CI/CD, build/version numbers, and ship-time size/startup optimization. Triggers: 'export my game', 'build for Steam', 'ship to web/mobile', 'publish to the Play Store', 'notarize my Mac build', 'itch.io upload', 'SharedArrayBuffer is not defined'. NOT for writing gameplay/runtime code (that's the engine skill — godot/unity/unreal) or hosting a normal web app/API/container (→ deployment).",
|
|
1868
|
+
"tags": [
|
|
1869
|
+
"export",
|
|
1870
|
+
"build",
|
|
1871
|
+
"release",
|
|
1872
|
+
"packaging",
|
|
1873
|
+
"store",
|
|
1874
|
+
"steam",
|
|
1875
|
+
"itch",
|
|
1876
|
+
"notarization",
|
|
1877
|
+
"webassembly",
|
|
1878
|
+
"aab"
|
|
1879
|
+
],
|
|
1880
|
+
"recommends": [
|
|
1881
|
+
"godot",
|
|
1882
|
+
"unity",
|
|
1883
|
+
"unreal",
|
|
1884
|
+
"deployment"
|
|
1885
|
+
],
|
|
1886
|
+
"profiles": [
|
|
1887
|
+
"full"
|
|
1888
|
+
]
|
|
1889
|
+
},
|
|
1740
1890
|
{
|
|
1741
1891
|
"id": "gcp-essentials",
|
|
1742
1892
|
"description": "Use when running a small product on the core of Google Cloud with the gcloud CLI: creating a project, deploying a container to Cloud Run, standing up a Cloud Storage bucket, a managed Cloud SQL Postgres/MySQL, and wiring them together with least-privilege IAM. Triggers: 'deploy to Cloud Run', 'gcloud run deploy', 'set up a GCP project', 'crear bucket en GCP', 'desplegar a Cloud Run', 'service account sin claves JSON', 'why is my Cloud Run running as the default service account', 'connect Cloud Run to Cloud SQL', 'turn off the bucket public access'. NOT AWS (that is aws-essentials).",
|
|
@@ -1845,6 +1995,29 @@
|
|
|
1845
1995
|
],
|
|
1846
1996
|
"profiles": []
|
|
1847
1997
|
},
|
|
1998
|
+
{
|
|
1999
|
+
"id": "godot",
|
|
2000
|
+
"description": "Use when writing, reviewing, or debugging Godot 4.x games in GDScript (typed) or C# — nodes/scenes/custom Resources, autoload singletons and an EventBus, signals via Callable, @onready/@export/@tool, static typing, CharacterBody2D/3D + velocity + move_and_slide(), _process vs _physics_process, .tscn/.tres text formats, and headless GUT/gdUnit4 tests. Enforces Godot 4 APIs and rejects Godot 3 leftovers: yield→await, onready→@onready, .instance()→.instantiate(), KinematicBody→CharacterBody, Spatial→Node3D, string connect(\\\"sig\\\",obj,\\\"m\\\")→Callable. Triggers: 'write a Godot player controller', 'my move_and_slide does nothing', 'port this Godot 3 script to 4', 'connect a signal in Godot', 'GDScript won't type-check', 'CharacterBody2D won't move', 'add an autoload', 'escribe un script de Godot', 'por qué no se mueve mi personaje'. NOT Unity MonoBehaviour or Unreal (route to unity/unreal); NOT pure C++/CMake tooling unrelated to GDExtension (that is cpp); NOT shader code in .gdshader (that is gamedev-shaders).",
|
|
2001
|
+
"tags": [
|
|
2002
|
+
"godot",
|
|
2003
|
+
"gdscript",
|
|
2004
|
+
"game-dev",
|
|
2005
|
+
"csharp",
|
|
2006
|
+
"godot4"
|
|
2007
|
+
],
|
|
2008
|
+
"recommends": [
|
|
2009
|
+
"gamedev-shaders",
|
|
2010
|
+
"gamedev-multiplayer",
|
|
2011
|
+
"gamedev-physics",
|
|
2012
|
+
"gamedev-pathing",
|
|
2013
|
+
"gamedev-shipping",
|
|
2014
|
+
"game-design",
|
|
2015
|
+
"cpp"
|
|
2016
|
+
],
|
|
2017
|
+
"profiles": [
|
|
2018
|
+
"full"
|
|
2019
|
+
]
|
|
2020
|
+
},
|
|
1848
2021
|
{
|
|
1849
2022
|
"id": "google-workspace",
|
|
1850
2023
|
"description": "Use when building server-side automation that reads or writes Gmail, Drive, Calendar, or Sheets against a real Google Workspace account via the official client libraries and a GCP service account — picking the auth mode, scoping OAuth scopes, building the authed client, and debugging 403/429/unauthorized_client errors. Triggers: 'send mail from a service account in a cron', 'unauthorized_client when impersonating a user', 'which Drive scope to upload to a shared drive', 'set up domain-wide delegation client ID', 'getting 403 insufficient permissions from the Sheets API', 'automatizar Gmail con cuenta de servicio sin login del usuario', 'enviar correos desde un script sense login d'usuari'. NOT generic SMTP/marketing/deliverability email (that is email-connector).",
|
|
@@ -2289,6 +2462,26 @@
|
|
|
2289
2462
|
],
|
|
2290
2463
|
"profiles": []
|
|
2291
2464
|
},
|
|
2465
|
+
{
|
|
2466
|
+
"id": "level-design",
|
|
2467
|
+
"description": "Use when designing a game level, map, arena, or encounter — laying out a blockout/greybox, fixing pacing that drags or spikes, guiding players without hand-holding, placing secrets and rewards, or diagnosing a level that plays as boring, confusing, or where players get lost or stuck. Engine-agnostic craft: the blockout->greybox->playtest->art pipeline, sightlines and landmarks, tension/release rhythm, the introduce->develop->twist->combine encounter progression, readability via light/color/composition, and traversal heatmaps. Triggers: 'design this level', 'my level is boring/confusing', 'players keep getting lost', 'how do I pace this', 'blockout', 'greybox', 'encounter design', 'where do I put the secret'. NOT systemic mechanics or economy tuning (that's game-design), NOT narrative or story beats (that's game-storytelling), and NOT engine-specific level tooling — nav meshes, occlusion, tilemap editors, lightmap baking (that's the godot/unity/unreal skill).",
|
|
2468
|
+
"tags": [
|
|
2469
|
+
"level-design",
|
|
2470
|
+
"blockout",
|
|
2471
|
+
"pacing",
|
|
2472
|
+
"encounter",
|
|
2473
|
+
"playtest"
|
|
2474
|
+
],
|
|
2475
|
+
"recommends": [
|
|
2476
|
+
"game-design",
|
|
2477
|
+
"godot",
|
|
2478
|
+
"unity",
|
|
2479
|
+
"unreal"
|
|
2480
|
+
],
|
|
2481
|
+
"profiles": [
|
|
2482
|
+
"full"
|
|
2483
|
+
]
|
|
2484
|
+
},
|
|
2292
2485
|
{
|
|
2293
2486
|
"id": "linkedin-api",
|
|
2294
2487
|
"description": "Use when wiring an app to LinkedIn's organic Posts / Community Management API — completing 3-legged OAuth, publishing text/article/document posts to a member profile or company page, or pulling impressions/engagement/follower stats and logging them as a durable feedback record. Triggers: 'connect our app to the LinkedIn Posts API', 'publish to our company page programmatically', 'pull last month's impressions for our org posts', 'my /v2/ugcPosts call returns 403', 'unauthorized scope w_organization_social at consent', 'log post performance into the wiki', 'publica a la pàgina de LinkedIn per API', 'conectar la API de LinkedIn y traer las impresiones'. NOT writing the post copy (that is linkedin-content), planning cadence (that is linkedin-strategy), or DM sequences (that is linkedin-outreach).",
|
|
@@ -4474,6 +4667,52 @@
|
|
|
4474
4667
|
],
|
|
4475
4668
|
"profiles": []
|
|
4476
4669
|
},
|
|
4670
|
+
{
|
|
4671
|
+
"id": "unity",
|
|
4672
|
+
"description": "Use when writing, reviewing, or structuring Unity game code in C# for current Unity 6 LTS (6000.x) — GameObjects and Transform hierarchy, MonoBehaviour lifecycle, prefabs and prefab variants, ScriptableObjects for data, scenes and additive loading, the new Input System, coroutines vs async/await/Awaitable, Addressables, and build/player settings for 2D and 3D. Triggers: 'my Unity script', 'Awake vs Start', 'why is my physics jittery', MonoBehaviour .cs files, 'set up the new Input System', 'ScriptableObject config', 'load a scene additively', 'Instantiate a prefab', 'convert Input.GetAxis to the new system', 'build for Android/WebGL', 'por qué no se llama mi Start', 'com carrego una escena en additiu'. NOT Godot/GDScript (that is godot); NOT Unreal/Blueprint/C++ engine work (that is unreal); NOT the netcode wire protocol itself (that is gamedev-multiplayer).",
|
|
4673
|
+
"tags": [
|
|
4674
|
+
"unity",
|
|
4675
|
+
"csharp",
|
|
4676
|
+
"game-dev",
|
|
4677
|
+
"monobehaviour",
|
|
4678
|
+
"input-system"
|
|
4679
|
+
],
|
|
4680
|
+
"recommends": [
|
|
4681
|
+
"gamedev-multiplayer",
|
|
4682
|
+
"gamedev-physics",
|
|
4683
|
+
"gamedev-shaders",
|
|
4684
|
+
"gamedev-pathing",
|
|
4685
|
+
"gamedev-shipping",
|
|
4686
|
+
"godot",
|
|
4687
|
+
"unreal"
|
|
4688
|
+
],
|
|
4689
|
+
"profiles": [
|
|
4690
|
+
"full"
|
|
4691
|
+
]
|
|
4692
|
+
},
|
|
4693
|
+
{
|
|
4694
|
+
"id": "unreal",
|
|
4695
|
+
"description": "Use when building, scripting, or debugging a game in Unreal Engine 5 (UE5) with Blueprint and/or C++ — gameplay framework (Actor/Pawn/Character/GameMode/PlayerController), Actor lifecycle and tick, UPROPERTY/UFUNCTION/UCLASS reflection and garbage collection, Enhanced Input, dynamic multicast delegates, UMG widgets, Paper2D sprites/flipbooks, and Blueprint↔C++ parity (exposing C++ to Blueprint, calling Blueprint from C++). Triggers: \\\"UE5\\\", \\\"Unreal\\\", \\\"Blueprint\\\", \\\"make a Character in C++\\\", \\\"expose this to Blueprint\\\", \\\"BlueprintCallable\\\", \\\"why is my UObject garbage collected\\\", \\\"Enhanced Input mapping context\\\", \\\"UMG widget\\\", \\\"Paper2D flipbook\\\", \\\".uproject\\\", \\\"GameMode vs GameState\\\". NOT for Godot (→ godot), NOT for Unity/C#/MonoBehaviour (→ unity), NOT for language-only C++ memory/RAII questions with no Unreal types (→ cpp).",
|
|
4696
|
+
"tags": [
|
|
4697
|
+
"unreal",
|
|
4698
|
+
"ue5",
|
|
4699
|
+
"blueprint",
|
|
4700
|
+
"unreal-engine",
|
|
4701
|
+
"gamedev"
|
|
4702
|
+
],
|
|
4703
|
+
"recommends": [
|
|
4704
|
+
"cpp",
|
|
4705
|
+
"gamedev-shipping",
|
|
4706
|
+
"gamedev-multiplayer",
|
|
4707
|
+
"game-design",
|
|
4708
|
+
"gamedev-physics",
|
|
4709
|
+
"godot",
|
|
4710
|
+
"unity"
|
|
4711
|
+
],
|
|
4712
|
+
"profiles": [
|
|
4713
|
+
"full"
|
|
4714
|
+
]
|
|
4715
|
+
},
|
|
4477
4716
|
{
|
|
4478
4717
|
"id": "vector-db",
|
|
4479
4718
|
"description": "Use when operating a vector store as a data layer — choosing or migrating between Pinecone, Qdrant, Weaviate, or pgvector; designing a collection/index (distance metric, dimensions, HNSW m/ef_construction, named vectors); filtering on metadata/payload; running hybrid dense+sparse search; or picking quantization to cut RAM and cost. Symptoms: search returns garbage, filters get silently ignored, recall is low, queries are slow, the bill is too high, a filtered query returns fewer than k rows. Triggers: 'set up a vector database', 'my similarity search ignores the metadata filter', 'ef_search vs recall', 'move off Pinecone to pgvector to cut cost', 'hybrid search with RRF', 'why does my filtered query return fewer than k results', 'crear una colección en Qdrant con cuantización binaria', 'la cerca vectorial retorna resultats dolents'. NOT how to produce, chunk, or judge embeddings (that is embeddings-search).",
|
package/package.json
CHANGED
package/scripts/lib/domains.js
CHANGED
|
@@ -17,6 +17,7 @@ export const DOMAINS = [
|
|
|
17
17
|
{ title: 'AI — run it on', ids: ['replicate', 'runpod', 'modal', 'huggingface', 'ollama', 'together-fireworks', 'fal'] },
|
|
18
18
|
{ title: 'Languages', ids: ['typescript', 'python', 'java', 'csharp-dotnet', 'php', 'ruby', 'cpp', 'elixir', 'bash-scripting', 'sql', 'go'] },
|
|
19
19
|
{ title: 'Frameworks & app stacks', ids: ['fastapi', 'nextjs', 'react', 'react-native', 'vue-nuxt', 'angular', 'svelte', 'astro', 'solid-js', 'htmx', 'nodejs', 'nestjs', 'django', 'laravel', 'rails', 'spring-boot', 'phoenix', 'flutter', 'swift-ios', 'kotlin-android', 'compose-multiplatform', 'expo', 'tauri', 'electron', 'rust', 'wordpress', 'shopify', 'no-code-app', 'chrome-extension', 'api-design'] },
|
|
20
|
+
{ title: 'Game development', ids: ['godot', 'unity', 'unreal', 'game-design', 'game-storytelling', 'level-design', 'gamedev-shaders', 'gamedev-multiplayer', 'gamedev-physics', 'gamedev-pathing', 'gamedev-shipping'] },
|
|
20
21
|
{ title: 'Databases & data layer', ids: ['postgresdb', 'mysql', 'mongodb', 'redis', 'supabase', 'neon', 'planetscale', 'sqlite-turso', 'prisma-orm', 'drizzle-orm', 'firebase', 'dynamodb', 'vector-db', 'clickhouse-analytics', 'duckdb', 'db-migrations', 'backups'] },
|
|
21
22
|
{ title: 'Ship & operate — platforms', ids: ['vercel', 'netlify', 'cloudflare', 'railway', 'render', 'fly-io', 'coolify', 'hetzner', 'digitalocean', 'aws-essentials', 'gcp-essentials'] },
|
|
22
23
|
{ title: 'Ship & operate — devops', ids: ['docker', 'github-actions', 'git-workflow', 'domains-dns', 'monitoring', 'email-deliverability', 'scaling', 'deployment'] },
|
package/scripts/lib/recommend.js
CHANGED
|
@@ -16,6 +16,10 @@ const OUTCOMES = {
|
|
|
16
16
|
'building-agents': 'Your own AI agent',
|
|
17
17
|
'secure-coding': 'Make it secure',
|
|
18
18
|
deployment: 'Put it online',
|
|
19
|
+
godot: 'Your game (Godot)',
|
|
20
|
+
unity: 'Your game (Unity)',
|
|
21
|
+
unreal: 'Your game (Unreal)',
|
|
22
|
+
'game-design': "Design a game that's fun",
|
|
19
23
|
};
|
|
20
24
|
|
|
21
25
|
export function hasOutcome(id) {
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: game-design
|
|
3
|
+
description: "Use when designing or repairing the design of a game — inventing mechanics and systems, shaping the core loop, layering moment-to-moment / session / meta loops, planning progression, economy, currencies and sinks/faucets, tuning difficulty curves and balance, killing dominant strategies, adding 'juice'/game feel as design intent, prototyping and playtesting, or controlling scope, and especially when the ask is 'why isn't my game fun'. Triggers: 'design the core loop', 'my game isn't fun / doesn't hook', 'balance the economy', 'the difficulty curve feels off', 'players found a dominant strategy', 'how do I scope this', 'reward / progression loop', 'diseñar la mecánica', 'el juego no engancha', 'com equilibro l'economia'. NOT writing engine code, scripts or shaders (route to godot/unity/unreal), NOT narrative, dialogue or story beats (route to game-storytelling), NOT level layout or encounter placement (route to level-design)."
|
|
4
|
+
tags: [game-design, mechanics, core-loop, balancing, progression, playtesting, scope, fun]
|
|
5
|
+
recommends: [level-design, game-storytelling, godot, unity, unreal]
|
|
6
|
+
profiles: [full]
|
|
7
|
+
origin: risco
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Design games that are fun on purpose
|
|
11
|
+
|
|
12
|
+
Engine-agnostic game design: mechanics, loops, progression, economy, balance, feel, and the discipline of prototyping and scope. No engine APIs live here — when the design is settled, the implementation belongs to `godot`, `unity`, or `unreal`.
|
|
13
|
+
|
|
14
|
+
## The one rule
|
|
15
|
+
|
|
16
|
+
> Fun is discovered, not designed. You cannot reason your way to a fun game on paper; you find it by building the smallest playable version and playing it. Every hour spent planning a mechanic you have not prototyped is an hour spent guessing. Prototype the riskiest assumption first, play it, then decide.
|
|
17
|
+
|
|
18
|
+
> The design of a game is the set of **verbs** it gives the player plus the **loops** those verbs live in. Everything else — art, story, levels — dresses that skeleton. If the skeleton is not fun in greybox, nothing dresses it into fun.
|
|
19
|
+
|
|
20
|
+
## When to use / When NOT
|
|
21
|
+
|
|
22
|
+
**Use when:**
|
|
23
|
+
- Inventing or reworking mechanics and systems, or defining the player's verb set.
|
|
24
|
+
- Shaping the core loop, or layering moment-to-moment → session → meta.
|
|
25
|
+
- Planning progression, unlocks, pacing, or an in-game economy.
|
|
26
|
+
- Tuning a difficulty curve, hunting a dominant strategy, or setting up data-driven balance.
|
|
27
|
+
- Adding "juice" / game feel **as a design concept** (what feedback, why).
|
|
28
|
+
- Prototyping, planning a playtest, deciding what to measure, or cutting scope.
|
|
29
|
+
- The vague-but-critical ask: "why isn't my game fun / why doesn't it hook?"
|
|
30
|
+
|
|
31
|
+
**Do NOT use — route instead:**
|
|
32
|
+
|
|
33
|
+
| The ask | Route to | Why not here |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| Write the movement/AI/shader/save code | `godot` / `unity` / `unreal` | This skill decides *what* to build; the engine skill builds it. |
|
|
36
|
+
| Author the story, dialogue, characters, lore | `game-storytelling` | Narrative design is its own craft; this skill owns systems and verbs. |
|
|
37
|
+
| Lay out a level, encounter, or world map | `level-design` | Spatial/encounter design applies the mechanics this skill defines. |
|
|
38
|
+
| Netcode, prediction, lag compensation | `gamedev-multiplayer` | A technical domain, not core design intent. |
|
|
39
|
+
| Ship / store page / build pipeline | `gamedev-shipping` | Release logistics, not design. |
|
|
40
|
+
|
|
41
|
+
(`godot`, `unity`, `unreal`, `game-storytelling`, `level-design` are linkable siblings; the rest are known ids you name but cannot link yet.)
|
|
42
|
+
|
|
43
|
+
## Loops: moment-to-moment → session → meta
|
|
44
|
+
|
|
45
|
+
A game is loops nested inside loops. Each layer must reward on its own **and** feed motivation to the layer above it.
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
moment-to-moment (seconds) the primary verb: aim+fire, jump, place, click, parry
|
|
49
|
+
│ feeds
|
|
50
|
+
session loop (minutes) a run / match / mission: setup → tension → resolution
|
|
51
|
+
│ feeds
|
|
52
|
+
meta loop (sessions) mastery, unlocks, collection, rank — why you return tomorrow
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
- **Moment-to-moment first.** The thing the player does constantly must feel good with *no* goal attached — jumping in Mario is fun in an empty room. If this layer is flat, no progression system rescues it. (Bungie's "30 seconds of fun" rule: perfect the small loop, then repeat it.)
|
|
56
|
+
- **Session loop** gives a run shape — a beginning, a rising middle, a payoff. It should end on a hook (almost-had-it, one-more-run).
|
|
57
|
+
- **Meta loop** is the reason-to-return: it spends the currency and mastery earned in sessions on lasting change (new verbs, new options, status).
|
|
58
|
+
- **Reward funding.** A reward at one layer should fund desire at the next. Misfunded loops fail predictably: fun moment-to-moment + empty meta = "great but I bounced"; rich meta + flat moment-to-moment = "I grind and I don't know why."
|
|
59
|
+
|
|
60
|
+
Depth vs breadth of loops, feedback-loop math, and worked loop teardowns: **[references/mechanics-and-loops.md](references/mechanics-and-loops.md)**.
|
|
61
|
+
|
|
62
|
+
## MDA: the working lens
|
|
63
|
+
|
|
64
|
+
Mechanics → Dynamics → Aesthetics. The designer authors **Mechanics** (rules, entities, numbers). At runtime those produce **Dynamics** (emergent behavior as players interact). Players only ever feel the **Aesthetics** (the emotional response). You design left-to-right; the player experiences right-to-left — so you must reason backward from the feeling you want to the rule that causes it.
|
|
65
|
+
|
|
66
|
+
- **"Fun" is not a design target — name the aesthetic.** MDA's vocabulary: sensation, fantasy, narrative, challenge, fellowship, discovery, expression, submission (relaxation). "Make it more fun" is unactionable; "raise the *challenge* and *discovery*, drop the *submission*" is a to-do list.
|
|
67
|
+
- **Design the verbs, not the features.** The verb set *is* the game. A tight set of verbs with deep interaction (chess, Tetris) beats a wide set of shallow ones. Before adding a feature, ask: does it add a verb, deepen an existing verb, or just add a number?
|
|
68
|
+
- **Second-order design.** Ask what the rule makes players *do*, not what it literally says. Every incentive is also a de-incentive for everything else — rewarding kills steals attention from exploring.
|
|
69
|
+
|
|
70
|
+
The eight aesthetics with examples, emergence vs scripted content, and interaction-depth heuristics: **[references/mechanics-and-loops.md](references/mechanics-and-loops.md)**.
|
|
71
|
+
|
|
72
|
+
## Progression & economy
|
|
73
|
+
|
|
74
|
+
Progression controls the rate at which the game reveals its depth; economy is the currency plumbing underneath it.
|
|
75
|
+
|
|
76
|
+
- **Pacing.** Interleave tension and release; teach → test → twist. Run difficulty and novelty as two curves so a lull in one is covered by the other.
|
|
77
|
+
- **Unlocks earn their keep.** Each unlock should add a verb or a *meaningful choice*, not just +10%. Gate content to pace the complexity the player must hold at once.
|
|
78
|
+
- **Currencies need distinct jobs.** Soft (earned, spent freely) vs hard/premium (scarce). Never add a currency without a distinct **sink** it exists to feed — currencies without sinks are clutter.
|
|
79
|
+
- **Sinks and faucets.** Faucets create currency; sinks destroy it. Balance the two or the economy drifts.
|
|
80
|
+
|
|
81
|
+
Model the drift with the core identity — no engine needed, a spreadsheet does it:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
net_income_rate = faucet_rate − sink_rate
|
|
85
|
+
time_to_afford = cost / net_income_rate # tune this against desired pacing
|
|
86
|
+
cost(n) = base × growth^n # escalating sink; growth ≈ 1.07–1.15
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- **Avoiding runaway.** If `net_income_rate` rises over time, costs must rise at least as fast or currency becomes meaningless (hyperinflation, trivialized late game). Fixes: escalating/exponential sinks, consumable sinks, caps, prestige resets.
|
|
90
|
+
- **Kill snowballs.** Positive feedback loops (rich-get-richer) let a leader accelerate out of reach and end matches early. Counter with negative feedback / catch-up (rubber-banding, comeback mechanics, escalating cost of dominance) — tuned so it aids without feeling like punishment for winning.
|
|
91
|
+
|
|
92
|
+
Currency taxonomies, inflation math, prestige/reset design, and a balancing-spreadsheet layout: **[references/progression-and-economy.md](references/progression-and-economy.md)**.
|
|
93
|
+
|
|
94
|
+
## Difficulty & balancing
|
|
95
|
+
|
|
96
|
+
- **The curve is a sawtooth, not a ramp.** Rising baseline with peaks (bosses, gauntlets) and valleys (recovery, reward). Aim for the *flow channel*: challenge tracking skill, between boredom (too easy) and anxiety (too hard).
|
|
97
|
+
- **Few high-leverage knobs.** Most balance lives in a handful of variables (damage, health, spawn rate, cost, cooldown). Identify them, tune **one at a time**, and never chase a symptom by touching five knobs at once.
|
|
98
|
+
- **Data-driven balance.** Externalize tunables into data (tables/config), not hard-coded constants, so designers iterate without a rebuild and you can diff and A/B numbers. (The engine skill wires the loader; this skill decides *which* numbers are tunable.)
|
|
99
|
+
- **Dominant strategies kill choice.** When one option strictly beats the rest, all other choices die. Hunt them in playtest data and telemetry; fix by nerfing the outlier or buffing counters toward **intransitive** balance (rock-paper-scissors: every option beaten by another).
|
|
100
|
+
- **Perceived ≠ actual difficulty**, and difficulty options/accessibility widen the audience — decouple challenge from exclusion.
|
|
101
|
+
|
|
102
|
+
Flow-channel tuning, dominant-strategy detection, symmetry vs asymmetry, and difficulty-option patterns: **[references/progression-and-economy.md](references/progression-and-economy.md)**.
|
|
103
|
+
|
|
104
|
+
## Feel / "juice" (as design intent)
|
|
105
|
+
|
|
106
|
+
Game feel is the tactile sensation of control — the moment-to-moment made physical. It is a **design** concern here; the engine skills implement the effects.
|
|
107
|
+
|
|
108
|
+
- **Every input needs an immediate, legible reaction** — visual, audio, and/or haptic. Perceived latency is the enemy; responsiveness beats fidelity.
|
|
109
|
+
- **Juice vocabulary** (specify the intent, let the engine do it): hit-stop / hit-pause (freeze a few frames on impact to sell weight), screenshake (scaled to significance, never gratuitous), anticipation & follow-through and squash-and-stretch (animation principles that read intent), particles, easing/tweening curves, and layered sound.
|
|
110
|
+
- **Feel is often hidden generosity.** Coyote time, input buffering, and forgiveness windows make a game feel *fair* and responsive without the player ever knowing why.
|
|
111
|
+
- **Design-level, not code-level here.** Decide *what* should feel weighty and *why*; specify the effect and its trigger. The keyframes, curves, and shaders belong to `godot` / `unity` / `unreal`.
|
|
112
|
+
|
|
113
|
+
## Prototyping & playtesting
|
|
114
|
+
|
|
115
|
+
- **Prototype the riskiest assumption first.** Whatever most determines whether the game works — prove or kill it before building anything else.
|
|
116
|
+
- **Paper → greybox → vertical slice.** Test rules and economies on paper/cards; test mechanics in an untextured blockout; only then build a polished slice. Find the fun before you buy the art.
|
|
117
|
+
- **Watch, don't coach.** In a playtest, shut up and observe. Note confusion, boredom, and quit points. The first-time experience is gold and you get it exactly once per tester.
|
|
118
|
+
- **Behavior over opinion.** Players are unreliable at saying *what* is wrong but reliable at signaling *that* something is. Weight what they do over what they say. Measure both: qualitative (struggle/quit points, think-aloud) and quantitative (completion rate, time-per-section, death heatmaps, D1/D7 retention).
|
|
119
|
+
- **Kill your darlings.** Cut any mechanic that does not serve the core loop, however clever. A pile of clever unrelated mechanics is not a game.
|
|
120
|
+
- **Scope is the #1 reason indie games die** — not talent, not tools. Cut *features*, not *quality*. A finished small game beats an unfinished ambitious one. Define the "one thing" the game is about and protect it ruthlessly; build a vertical slice, not a broad shallow map of half-features.
|
|
121
|
+
|
|
122
|
+
Playtest protocols, metrics/retention definitions, the prototyping ladder, and concrete scope-cutting tactics: **[references/playtesting-and-scope.md](references/playtesting-and-scope.md)**.
|
|
123
|
+
|
|
124
|
+
## Documenting design
|
|
125
|
+
|
|
126
|
+
- **One page that lives beats a 100-page bible that dies.** Nobody reads the bible; it is stale the day after it is written. Write a living one-pager and let it grow only where a real decision needs recording.
|
|
127
|
+
- **The one-pager holds:** the hook / fantasy, the core loop, the verb set, the target aesthetic (named MDA emotion), the MVP scope, and — explicitly — what is *out*.
|
|
128
|
+
- **Design pillars** (2–4 words each, e.g. "tense stealth", "readable chaos") are decision filters: every feature must serve a pillar or it is cut. Pillars end arguments faster than any spec.
|
|
129
|
+
- **Keep it a communication tool, not an archive.** A wiki page beats a locked document; version it, link it, prune it.
|
|
130
|
+
|
|
131
|
+
## Anti-patterns
|
|
132
|
+
|
|
133
|
+
| Anti-pattern | Why it bites | Do instead |
|
|
134
|
+
| --- | --- | --- |
|
|
135
|
+
| Designing on paper for months before building | Fun is only found by playing | Prototype the riskiest assumption first |
|
|
136
|
+
| "Make it more fun" as a task | Unactionable | Name the target MDA aesthetic and the mechanic behind it |
|
|
137
|
+
| Adding features instead of deepening verbs | Wide-and-shallow, no mastery | Deepen verb interaction before adding verbs |
|
|
138
|
+
| Currency with no sink | Meaningless clutter, inflation | Give every currency a distinct sink or cut it |
|
|
139
|
+
| Faucets outpacing sinks | Hyperinflation, trivial late game | Escalating/consumable sinks, caps, prestige |
|
|
140
|
+
| Unchecked positive feedback loop | Leader snowballs, match ends early | Add negative feedback / catch-up, tuned gently |
|
|
141
|
+
| One dominant strategy left standing | Choice dies, meta collapses | Nerf outlier / buff counters toward intransitive balance |
|
|
142
|
+
| Tuning five knobs at once | Can't attribute cause | Change one high-leverage variable at a time |
|
|
143
|
+
| Hard-coded balance constants | No iteration, no A/B, needs rebuild | Externalize tunables into data |
|
|
144
|
+
| Guiding testers during playtests | Contaminates the first-time signal | Watch silently; weight behavior over opinion |
|
|
145
|
+
| Scope creep / feature list as ambition | #1 indie killer | Cut features not quality; ship a vertical slice |
|
|
146
|
+
| 100-page design bible | Nobody reads it; goes stale | Living one-pager + pillars |
|
|
147
|
+
|
|
148
|
+
## Project grounding
|
|
149
|
+
|
|
150
|
+
If the workspace has a `02-DOCS/` harness, record the design in `02-DOCS/wiki/design/` — a `game-design.md` one-pager (hook, core loop, verbs, pillars, MVP scope, what's out) plus an `economy.md` if there is a currency system. Write each as an OKF v0.1 wiki article per the harness [`wiki-article-template.md`](../harness/references/wiki-article-template.md): YAML frontmatter with a non-empty `type:` (use `type: design`), a `timestamp` in ISO 8601, and standard markdown links — never wikilinks. Index it in `02-DOCS/wiki/index.md`. This is **recorded, not gated** — skip silently if there is no harness.
|
|
151
|
+
|
|
152
|
+
## Related skills
|
|
153
|
+
|
|
154
|
+
- `../level-design/SKILL.md` — applies these mechanics in space: layout, pacing beats, encounter design.
|
|
155
|
+
- `../game-storytelling/SKILL.md` — narrative, dialogue, and how story wraps the systems you define here.
|
|
156
|
+
- `../godot/SKILL.md`, `../unity/SKILL.md`, `../unreal/SKILL.md` — implement the settled design; all engine APIs, feel/juice code, and data-driven tuning loaders live there.
|
|
157
|
+
- Known siblings to name but not yet link: `gamedev-multiplayer`, `gamedev-physics`, `gamedev-pathing`, `gamedev-shaders`, `gamedev-shipping`.
|
|
158
|
+
|
|
159
|
+
## Checklist
|
|
160
|
+
|
|
161
|
+
- [ ] The **core verb** is named and is fun in greybox with no goal attached.
|
|
162
|
+
- [ ] The three loops (moment-to-moment / session / meta) are identified and each is reward-funded by the layer below.
|
|
163
|
+
- [ ] The target **aesthetic** is named (MDA vocabulary), not "fun".
|
|
164
|
+
- [ ] Every currency has a distinct sink; faucets vs sinks are modeled and do not run away.
|
|
165
|
+
- [ ] Difficulty follows a sawtooth in the flow channel; high-leverage knobs are identified and data-driven.
|
|
166
|
+
- [ ] No dominant strategy survives; options are intransitively balanced.
|
|
167
|
+
- [ ] Feel/juice intent is specified (what + why), deferred to the engine skill for how.
|
|
168
|
+
- [ ] The riskiest assumption was prototyped and playtested; behavior (not just opinion) was observed.
|
|
169
|
+
- [ ] Scope is cut to a vertical slice; a one-page living doc + pillars exist, not a bible.
|
|
170
|
+
- [ ] Engine specifics were deferred to `godot`/`unity`/`unreal`; narrative to `game-storytelling`; layout to `level-design`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Evals for game-design
|
|
2
|
+
|
|
3
|
+
`cases.yaml` is the trigger and capability spec for this skill, read by the catalog's
|
|
4
|
+
skill-eval harness. `should_trigger` asserts the skill fires on design-intent asks — core
|
|
5
|
+
loops, economy/inflation, balance, difficulty curves, feel, scope, and the vague "why isn't my
|
|
6
|
+
game fun" — including a Spanish phrasing. `should_not_trigger` asserts near-misses route to the
|
|
7
|
+
right sibling: engine code to `unity`/`godot`/`unreal`, story to `game-storytelling`, layout to
|
|
8
|
+
`level-design`, netcode to `gamedev-multiplayer`, release to `gamedev-shipping`.
|
|
9
|
+
|
|
10
|
+
The `capability` case checks that an economy/loop-repair answer stays engine-agnostic: it
|
|
11
|
+
diagnoses loop funding, models faucets vs sinks with the pseudo-formula, stops runaway inflation
|
|
12
|
+
with escalating sinks/prestige, names the MDA aesthetic, and defers implementation to the engine
|
|
13
|
+
skills.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
skill: game-design
|
|
2
|
+
|
|
3
|
+
should_trigger:
|
|
4
|
+
- prompt: "I've been building my game for months and it just isn't fun to play. What's wrong?"
|
|
5
|
+
why: "The signature 'why isn't my game fun' trigger; answer diagnoses which loop is starved and pushes prototype-the-core-verb-in-greybox."
|
|
6
|
+
- prompt: "Help me design the core gameplay loop for a roguelike deckbuilder."
|
|
7
|
+
why: "Core-loop design plus moment-to-moment → session → meta layering is the central job."
|
|
8
|
+
- prompt: "My in-game gold keeps inflating so late-game upgrades feel free. How do I fix the economy?"
|
|
9
|
+
why: "Economy/faucets-vs-sinks and runaway-inflation fixes (escalating sinks, caps, prestige); the pseudo-formula applies."
|
|
10
|
+
- prompt: "Everyone in my card game just plays the same one deck because it beats everything. How do I rebalance?"
|
|
11
|
+
why: "Dominant-strategy detection and pushing toward intransitive (rock-paper-scissors) balance."
|
|
12
|
+
- prompt: "The difficulty in my platformer spikes weirdly — some levels are trivial, then a wall. How should the curve work?"
|
|
13
|
+
why: "Difficulty curve as a sawtooth in the flow channel, high-leverage knobs, one-at-a-time tuning."
|
|
14
|
+
- prompt: "I keep adding features and never finishing. How do I decide what to cut?"
|
|
15
|
+
why: "Scope control (the #1 indie killer): cut features not quality, define the one thing, vertical slice, cut list, kill your darlings."
|
|
16
|
+
- prompt: "El juego no engancha después de la primera partida, ¿cómo lo arreglo?"
|
|
17
|
+
why: "Spanish — starved meta loop / return-reason; diagnoses reward funding across loop layers."
|
|
18
|
+
- prompt: "How do I make combat feel punchier and more satisfying without touching the story or the netcode?"
|
|
19
|
+
why: "Game feel / juice as design intent (hit-stop, screenshake, feedback); explicitly excludes story and netcode."
|
|
20
|
+
|
|
21
|
+
should_not_trigger:
|
|
22
|
+
- prompt: "Write the C# script that moves my player character and handles jumping in Unity."
|
|
23
|
+
route_to: unity
|
|
24
|
+
why: "Engine implementation code; this skill decides what to build, the engine skill writes it."
|
|
25
|
+
- prompt: "Write the dialogue tree and backstory for my game's main antagonist."
|
|
26
|
+
route_to: game-storytelling
|
|
27
|
+
why: "Narrative and character writing, not systems/mechanics design."
|
|
28
|
+
- prompt: "Lay out the rooms and enemy placement for level 3 of my metroidvania."
|
|
29
|
+
route_to: level-design
|
|
30
|
+
why: "Spatial and encounter layout applies mechanics; it is not core mechanic/economy design."
|
|
31
|
+
- prompt: "Implement client-side prediction and lag compensation for my multiplayer shooter."
|
|
32
|
+
route_to: gamedev-multiplayer
|
|
33
|
+
why: "Netcode is a technical domain, not moment-to-moment or economy design intent."
|
|
34
|
+
- prompt: "Set up my Steam store page and build the release pipeline for launch."
|
|
35
|
+
route_to: gamedev-shipping
|
|
36
|
+
why: "Release logistics, not design."
|
|
37
|
+
|
|
38
|
+
capability:
|
|
39
|
+
- scenario: "A solo dev's incremental/idle game feels grindy and the currency inflates until upgrades are free; they ask how to fix the design."
|
|
40
|
+
must_include:
|
|
41
|
+
- "Diagnoses which loop is starved (moment-to-moment / session / meta) and checks that each layer's reward funds the next"
|
|
42
|
+
- "Models the economy with net_income_rate = faucet_rate − sink_rate and time_to_afford = cost / net_income_rate"
|
|
43
|
+
- "Prescribes escalating/exponential sinks (cost(n) = base × growth^n), consumable sinks, caps, or prestige resets to stop runaway inflation"
|
|
44
|
+
- "Requires each currency to have a distinct sink, and tunables to be data-driven rather than hard-coded"
|
|
45
|
+
- "Names the target MDA aesthetic instead of 'more fun', and frames unlocks as new verbs/choices not just +N%"
|
|
46
|
+
- "Recommends prototyping the fix and playtesting for behavior (retention, time-per-tier), not just opinion"
|
|
47
|
+
- "Defers engine implementation to godot/unity/unreal and records the design in 02-DOCS/wiki/design/ only if a harness exists"
|