@jgengine/shell 0.10.0 → 0.12.0
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/CHANGELOG.md +39 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/CombatPresentation.d.ts +5 -0
- package/dist/CombatPresentation.js +8 -0
- package/dist/GameHost.d.ts +25 -1
- package/dist/GameHost.js +60 -4
- package/dist/GamePhaseStamp.d.ts +1 -0
- package/dist/GamePhaseStamp.js +9 -0
- package/dist/GamePlayer.d.ts +5 -0
- package/dist/GamePlayer.js +5 -0
- package/dist/GamePlayerShell.d.ts +5 -12
- package/dist/GamePlayerShell.js +67 -1332
- package/dist/GameUiPreview.js +3 -2
- package/dist/Shell3dPresentation.d.ts +63 -0
- package/dist/Shell3dPresentation.js +302 -0
- package/dist/ShellChrome.d.ts +51 -0
- package/dist/ShellChrome.js +51 -0
- package/dist/ShellHudPresentation.d.ts +41 -0
- package/dist/ShellHudPresentation.js +22 -0
- package/dist/audio/audioEngine.d.ts +4 -0
- package/dist/audio/audioEngine.js +128 -21
- package/dist/audio/audioWire.d.ts +40 -0
- package/dist/audio/audioWire.js +62 -0
- package/dist/audio/loopParams.d.ts +20 -0
- package/dist/audio/loopParams.js +28 -0
- package/dist/behaviour.d.ts +2 -1
- package/dist/behaviour.js +2 -1
- package/dist/behaviourAttach.d.ts +1 -0
- package/dist/behaviourAttach.js +1 -0
- package/dist/behaviourDriver.d.ts +1 -0
- package/dist/behaviourDriver.js +1 -0
- package/dist/boundActionDispatch.d.ts +13 -0
- package/dist/boundActionDispatch.js +37 -0
- package/dist/camera/GameCameraRig.d.ts +5 -2
- package/dist/camera/GameCameraRig.js +8 -3
- package/dist/camera/GameFirstPersonCamera.d.ts +9 -2
- package/dist/camera/GameFirstPersonCamera.js +8 -3
- package/dist/camera/GameInspectionCamera.d.ts +1 -1
- package/dist/camera/GameInspectionCamera.js +2 -2
- package/dist/camera/GameOrbitCamera.js +24 -9
- package/dist/camera/cameraBlendMath.d.ts +3 -0
- package/dist/camera/cameraBlendMath.js +3 -0
- package/dist/camera/cameraRigs.d.ts +3 -1
- package/dist/camera/cameraRigs.js +21 -3
- package/dist/camera/fovPreference.d.ts +6 -1
- package/dist/camera/fovPreference.js +6 -1
- package/dist/camera/index.d.ts +4 -7
- package/dist/camera/index.js +4 -7
- package/dist/camera/inspectionCameraMath.d.ts +7 -2
- package/dist/camera/inspectionCameraMath.js +7 -2
- package/dist/camera/orbitCameraMath.d.ts +36 -6
- package/dist/camera/orbitCameraMath.js +56 -6
- package/dist/camera/rigMath.d.ts +114 -24
- package/dist/camera/rigMath.js +129 -24
- package/dist/camera/rigResolve.d.ts +4 -2
- package/dist/camera/rigResolve.js +4 -2
- package/dist/camera/shakeChannel.d.ts +6 -2
- package/dist/camera/shakeChannel.js +6 -2
- package/dist/camera/shakeChannelMath.d.ts +1 -0
- package/dist/camera/shakeChannelMath.js +1 -0
- package/dist/commandSink.d.ts +8 -3
- package/dist/commandSink.js +8 -3
- package/dist/defineGame.d.ts +15 -1
- package/dist/defineGame.js +50 -9
- package/dist/devtools/ColPanel.d.ts +1 -0
- package/dist/devtools/ColPanel.js +14 -0
- package/dist/devtools/DevtoolsOverlay.d.ts +11 -7
- package/dist/devtools/DevtoolsOverlay.js +47 -462
- package/dist/devtools/KeysPanel.d.ts +4 -0
- package/dist/devtools/KeysPanel.js +31 -0
- package/dist/devtools/LogsPanel.d.ts +1 -0
- package/dist/devtools/LogsPanel.js +12 -0
- package/dist/devtools/NetPanel.d.ts +4 -0
- package/dist/devtools/NetPanel.js +10 -0
- package/dist/devtools/PerfPanel.d.ts +4 -0
- package/dist/devtools/PerfPanel.js +53 -0
- package/dist/devtools/TunePanel.d.ts +3 -0
- package/dist/devtools/TunePanel.js +309 -0
- package/dist/devtools/agentBridge.d.ts +41 -0
- package/dist/devtools/agentBridge.js +266 -0
- package/dist/devtools/collisionDebug.d.ts +6 -0
- package/dist/devtools/collisionDebug.js +6 -0
- package/dist/devtools/collisionDebugMath.d.ts +8 -2
- package/dist/devtools/collisionDebugMath.js +24 -5
- package/dist/devtools/devtoolsOverrides.d.ts +6 -0
- package/dist/devtools/devtoolsOverrides.js +48 -0
- package/dist/devtools/panelAtoms.d.ts +9 -0
- package/dist/devtools/panelAtoms.js +10 -0
- package/dist/devtools/perfDiagnose.d.ts +2 -0
- package/dist/devtools/perfDiagnose.js +43 -0
- package/dist/diagnostics/RuntimeDiagnostics.d.ts +36 -0
- package/dist/diagnostics/RuntimeDiagnostics.js +80 -0
- package/dist/drivers/FrameDriver.d.ts +37 -0
- package/dist/drivers/FrameDriver.js +232 -0
- package/dist/drivers/HudOnlyDriver.d.ts +16 -0
- package/dist/drivers/HudOnlyDriver.js +60 -0
- package/dist/environment/Daylight.d.ts +23 -7
- package/dist/environment/Daylight.js +106 -13
- package/dist/environment/EnvironmentScene.js +44 -9
- package/dist/environment/VolumetricClouds.d.ts +17 -0
- package/dist/environment/VolumetricClouds.js +202 -0
- package/dist/environment/daylightCycle.d.ts +3 -1
- package/dist/environment/daylightCycle.js +3 -1
- package/dist/environment/groundPadMath.d.ts +3 -0
- package/dist/environment/groundPadMath.js +3 -0
- package/dist/environment/index.d.ts +1 -0
- package/dist/environment/index.js +1 -0
- package/dist/environment/skyLightingPolicy.d.ts +2 -0
- package/dist/environment/skyLightingPolicy.js +2 -0
- package/dist/environment/terrainGroundColor.d.ts +9 -0
- package/dist/environment/terrainGroundColor.js +22 -0
- package/dist/gameKit.d.ts +27 -0
- package/dist/gameKit.js +29 -0
- package/dist/hotbarActions.d.ts +26 -0
- package/dist/hotbarActions.js +27 -0
- package/dist/inputSink.d.ts +16 -4
- package/dist/inputSink.js +57 -7
- package/dist/map/MapMarkerBeacons.d.ts +3 -2
- package/dist/materialOverride.d.ts +10 -0
- package/dist/materialOverride.js +15 -3
- package/dist/multiplayer.js +8 -2
- package/dist/postfx/PostProcessing.d.ts +9 -1
- package/dist/postfx/PostProcessing.js +56 -11
- package/dist/postfx/gradeShader.js +9 -1
- package/dist/presentationResolve.d.ts +35 -0
- package/dist/presentationResolve.js +51 -0
- package/dist/registry.d.ts +4 -2
- package/dist/render/EnvironmentLighting.d.ts +10 -0
- package/dist/render/EnvironmentLighting.js +34 -0
- package/dist/render/SceneLighting.d.ts +7 -0
- package/dist/render/SceneLighting.js +18 -0
- package/dist/render/SceneModels.d.ts +14 -0
- package/dist/render/SceneModels.js +337 -0
- package/dist/render/assetBase.d.ts +17 -0
- package/dist/render/assetBase.js +35 -0
- package/dist/render/defaultSurface.d.ts +29 -0
- package/dist/render/defaultSurface.js +101 -0
- package/dist/render/modelLoad.d.ts +24 -0
- package/dist/render/modelLoad.js +76 -0
- package/dist/render/modelRender.d.ts +11 -0
- package/dist/render/modelRender.js +15 -0
- package/dist/render/resolveModel.d.ts +54 -3
- package/dist/render/resolveModel.js +116 -4
- package/dist/render/useEntityRenderCues.d.ts +13 -0
- package/dist/render/useEntityRenderCues.js +62 -0
- package/dist/scatter/InstancedScatter.d.ts +24 -0
- package/dist/scatter/InstancedScatter.js +135 -0
- package/dist/scatter/scatterModels.d.ts +25 -0
- package/dist/scatter/scatterModels.js +61 -0
- package/dist/scatter/scatterProxies.d.ts +6 -0
- package/dist/scatter/scatterProxies.js +118 -0
- package/dist/scatter.d.ts +1 -0
- package/dist/scatter.js +1 -0
- package/dist/scene/AuthoredScene.d.ts +84 -0
- package/dist/scene/AuthoredScene.js +178 -0
- package/dist/scene/CityRenderer.d.ts +2 -0
- package/dist/scene/CityRenderer.js +1031 -0
- package/dist/scene/GeneratedAssetRenderer.d.ts +14 -0
- package/dist/scene/GeneratedAssetRenderer.js +59 -0
- package/dist/scene/GrassFieldRenderer.d.ts +2 -0
- package/dist/scene/GrassFieldRenderer.js +73 -0
- package/dist/scene/PoleLineRenderer.d.ts +2 -0
- package/dist/scene/PoleLineRenderer.js +287 -0
- package/dist/scene/SoilPatchRenderer.d.ts +2 -0
- package/dist/scene/SoilPatchRenderer.js +84 -0
- package/dist/scene/StudioStage.d.ts +37 -0
- package/dist/scene/StudioStage.js +42 -0
- package/dist/scene/WaterRenderer.d.ts +2 -0
- package/dist/scene/WaterRenderer.js +61 -0
- package/dist/scene/builtinSceneKindRenderers.d.ts +2 -0
- package/dist/scene/builtinSceneKindRenderers.js +26 -0
- package/dist/scene/cityWindowMaterial.d.ts +16 -0
- package/dist/scene/cityWindowMaterial.js +81 -0
- package/dist/scene/sceneKindRenderers.d.ts +30 -0
- package/dist/scene/sceneKindRenderers.js +17 -0
- package/dist/scene.d.ts +1 -0
- package/dist/scene.js +1 -0
- package/dist/settings/appliedSettings.d.ts +7 -1
- package/dist/settings/appliedSettings.js +13 -2
- package/dist/settings/settingsController.d.ts +2 -0
- package/dist/settings/settingsController.js +22 -1
- package/dist/shellConstants.d.ts +4 -0
- package/dist/shellConstants.js +4 -0
- package/dist/shellMovement.d.ts +8 -0
- package/dist/shellMovement.js +11 -0
- package/dist/shellPointer.d.ts +20 -0
- package/dist/shellPointer.js +28 -0
- package/dist/structures/PlacementGhost.d.ts +4 -0
- package/dist/structures/PlacementGhost.js +4 -0
- package/dist/structures/TransformGizmo.d.ts +53 -0
- package/dist/structures/TransformGizmo.js +59 -0
- package/dist/structures/index.d.ts +1 -0
- package/dist/structures/index.js +1 -0
- package/dist/terrain/GrassField.d.ts +11 -3
- package/dist/terrain/GrassField.js +16 -6
- package/dist/terrain/TerraformBrushCursor.js +3 -0
- package/dist/terrain/grassBudget.d.ts +11 -2
- package/dist/terrain/grassBudget.js +20 -4
- package/dist/terrain/grassGeometry.d.ts +35 -0
- package/dist/terrain/grassGeometry.js +85 -20
- package/dist/terrain/grassMaterial.d.ts +20 -0
- package/dist/terrain/grassMaterial.js +68 -13
- package/dist/terrain/heightfieldGeometry.d.ts +34 -0
- package/dist/terrain/heightfieldGeometry.js +109 -0
- package/dist/terrain/index.d.ts +1 -0
- package/dist/terrain/index.js +1 -0
- package/dist/terrain/random.d.ts +3 -0
- package/dist/terrain/random.js +3 -0
- package/dist/terrain/soilPatchMaterial.d.ts +23 -0
- package/dist/terrain/soilPatchMaterial.js +147 -0
- package/dist/terrain/terrainDetailMaterial.d.ts +19 -2
- package/dist/terrain/terrainDetailMaterial.js +87 -7
- package/dist/terrain/terrainMath.d.ts +8 -1
- package/dist/terrain/terrainMath.js +8 -1
- package/dist/touch/TouchControlsOverlay.d.ts +9 -5
- package/dist/touch/TouchControlsOverlay.js +201 -22
- package/dist/useShellMultiplayerSync.d.ts +9 -0
- package/dist/useShellMultiplayerSync.js +98 -0
- package/dist/visibility/CullingProvider.js +1 -1
- package/dist/water/Ocean.d.ts +7 -1
- package/dist/water/Ocean.js +16 -3
- package/dist/water/OceanConfig.d.ts +11 -0
- package/dist/water/OceanConfig.js +8 -0
- package/dist/water/OceanMaterial.d.ts +12 -0
- package/dist/water/OceanMaterial.js +9 -0
- package/dist/water/OceanShader.d.ts +2 -2
- package/dist/water/OceanShader.js +78 -10
- package/dist/weather/fireSpreadPose.d.ts +1 -0
- package/dist/weather/fireSpreadPose.js +1 -0
- package/dist/weather/weatherGeometry.d.ts +1 -0
- package/dist/weather/weatherGeometry.js +1 -0
- package/dist/weather/weatherMath.d.ts +3 -0
- package/dist/weather/weatherMath.js +3 -0
- package/dist/weather/weatherUniforms.d.ts +3 -0
- package/dist/weather/weatherUniforms.js +3 -0
- package/dist/world/PlaceScene.d.ts +11 -0
- package/dist/world/PlaceScene.js +27 -0
- package/dist/world/RetainedVfx.d.ts +10 -0
- package/dist/world/RetainedVfx.js +136 -0
- package/dist/world/WorldHud.d.ts +49 -2
- package/dist/world/WorldHud.js +87 -2
- package/dist/world/WorldScene.d.ts +21 -0
- package/dist/world/WorldScene.js +186 -0
- package/dist/world/WorldVfx.d.ts +9 -0
- package/dist/world/WorldVfx.js +184 -0
- package/dist/world/entityPose.d.ts +2 -0
- package/dist/world/entityPose.js +2 -0
- package/dist/world/floatTextStyle.d.ts +1 -0
- package/dist/world/floatTextStyle.js +1 -0
- package/dist/world/telegraphPulse.d.ts +1 -0
- package/dist/world/telegraphPulse.js +1 -0
- package/dist/world/worldBarSamples.d.ts +25 -0
- package/dist/world/worldBarSamples.js +38 -0
- package/dist/worldSky.d.ts +11 -0
- package/dist/worldSky.js +21 -0
- package/dist/worldSync.d.ts +2 -1
- package/dist/worldSync.js +2 -1
- package/package.json +6 -6
- package/skills/game-design/SKILL.md +28 -0
- package/skills/game-design/agents/openai.yaml +4 -0
- package/skills/game-design/references/application-playbook.md +170 -0
- package/skills/game-design/references/field-guide.md +288 -0
- package/skills/jgengine/SKILL.md +54 -0
- package/skills/jgengine/api.md +527 -0
- package/skills/jgengine/capabilities.md +131 -0
- package/skills/jgengine/recipes/minimal-game.md +88 -0
- package/skills/jgengine-ui/SKILL.md +41 -0
- package/skills/jgengine-ui/api.md +2007 -0
- package/skills/jgengine-ui/capabilities.md +211 -0
- package/skills/jgengine-ui/recipes/portable-minimap.md +150 -0
- package/skills/jgengine-ui/reference.md +513 -0
- package/skills/jgengine-ui/references/visual-scorecard.md +73 -0
- package/skills/jgengine-world/SKILL.md +51 -0
- package/skills/jgengine-world/api.md +3056 -0
- package/skills/jgengine-world/capabilities.md +476 -0
- package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
- package/skills/jgengine-world/reference.md +261 -0
- package/skills/level-design/SKILL.md +54 -0
- package/skills/level-design/agents/openai.yaml +4 -0
- package/skills/level-design/references/application-playbook.md +192 -0
- package/skills/level-design/references/field-guide.md +337 -0
- package/skills/level-design/references/live-editor-loop.md +179 -0
- package/dist/cartridge.d.ts +0 -145
- package/dist/cartridge.js +0 -246
- package/llms.txt +0 -2761
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SkyEnvironmentDescriptor, WorldFeature } from "@jgengine/core/world/features";
|
|
2
|
+
/**
|
|
3
|
+
* The sky in effect for a world feature (#196.1). Environments answer their declared sky; place
|
|
4
|
+
* worlds (`world()` — substrate + laws, no sky fields) get the engine default sky for 3D grounds,
|
|
5
|
+
* while `board` grounds get none (the game owns the 2D face it draws). An authored scene document's
|
|
6
|
+
* sky arrives through `backdrop`/`lighting`, which wins over this at the presentation layer.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveWorldSky(world: WorldFeature | undefined): SkyEnvironmentDescriptor | undefined;
|
|
10
|
+
/** Deterministic HSL color from a stable instance id (default entity/object tint). @internal */
|
|
11
|
+
export declare function colorFromId(id: string): string;
|
package/dist/worldSky.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** The engine default sky a 3D place world renders when no sky is authored in its scene document. */
|
|
2
|
+
const PLACE_DEFAULT_SKY = { kind: "sky", preset: "day", timeOfDay: false };
|
|
3
|
+
/**
|
|
4
|
+
* The sky in effect for a world feature (#196.1). Environments answer their declared sky; place
|
|
5
|
+
* worlds (`world()` — substrate + laws, no sky fields) get the engine default sky for 3D grounds,
|
|
6
|
+
* while `board` grounds get none (the game owns the 2D face it draws). An authored scene document's
|
|
7
|
+
* sky arrives through `backdrop`/`lighting`, which wins over this at the presentation layer.
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export function resolveWorldSky(world) {
|
|
11
|
+
if (world?.kind === "place")
|
|
12
|
+
return world.ground.mode === "board" ? undefined : PLACE_DEFAULT_SKY;
|
|
13
|
+
return world?.kind === "environment" ? world.sky : undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Deterministic HSL color from a stable instance id (default entity/object tint). @internal */
|
|
16
|
+
export function colorFromId(id) {
|
|
17
|
+
let hash = 0;
|
|
18
|
+
for (let index = 0; index < id.length; index += 1)
|
|
19
|
+
hash = (hash * 31 + id.charCodeAt(index)) >>> 0;
|
|
20
|
+
return `hsl(${hash % 360}, 65%, 55%)`;
|
|
21
|
+
}
|
package/dist/worldSync.d.ts
CHANGED
|
@@ -6,5 +6,6 @@ import type { GameRuntimeFeeds } from "@jgengine/core/runtime/transport";
|
|
|
6
6
|
* of a locally-simulated one. Pure and transport-agnostic — the backend's `feeds.subscribeServer` is the only
|
|
7
7
|
* dependency; returns the unsubscribe. The shell attaches this (and gates its local sim) when the game's adapter
|
|
8
8
|
* opts into `authority: "server"`.
|
|
9
|
-
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
10
11
|
export declare function attachWorldSync(feeds: Pick<GameRuntimeFeeds, "subscribeServer">, serverId: string, ctx: Pick<GameContext, "hydrate">): () => void;
|
package/dist/worldSync.js
CHANGED
|
@@ -5,7 +5,8 @@ import { createWorldMirror } from "@jgengine/core/runtime/worldMirror";
|
|
|
5
5
|
* of a locally-simulated one. Pure and transport-agnostic — the backend's `feeds.subscribeServer` is the only
|
|
6
6
|
* dependency; returns the unsubscribe. The shell attaches this (and gates its local sim) when the game's adapter
|
|
7
7
|
* opts into `authority: "server"`.
|
|
8
|
-
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
9
10
|
export function attachWorldSync(feeds, serverId, ctx) {
|
|
10
11
|
const mirror = createWorldMirror(ctx);
|
|
11
12
|
return feeds.subscribeServer(serverId, (view) => {
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jgengine/shell",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Game player shell for JGengine: React Three Fiber canvas, orbit camera, input tracking, HUD mounting, GameUiPreview, and a demo game. Consumers supply a GameRegistry.",
|
|
5
|
-
"license": "
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"sideEffects": false,
|
|
8
8
|
"repository": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"files": [
|
|
14
14
|
"dist",
|
|
15
15
|
"CHANGELOG.md",
|
|
16
|
-
"
|
|
16
|
+
"skills"
|
|
17
17
|
],
|
|
18
18
|
"exports": {
|
|
19
19
|
"./weather": {
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
"test": "bun test src"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@jgengine/core": "^0.
|
|
39
|
-
"@jgengine/react": "^0.
|
|
40
|
-
"@jgengine/ws": "^0.
|
|
38
|
+
"@jgengine/core": "^0.12.0",
|
|
39
|
+
"@jgengine/react": "^0.12.0",
|
|
40
|
+
"@jgengine/ws": "^0.12.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"@react-three/drei": "^10.0.0",
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: game-design
|
|
3
|
+
description: Design, audit, implement, and validate player experience, loops, systems, progression, and balance.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Game design
|
|
7
|
+
|
|
8
|
+
## Ownership
|
|
9
|
+
|
|
10
|
+
Own the intended player experience and the rules that produce it: fantasy, pillars, verbs, decisions, feedback, loops, resources, progression, challenge, failure, onboarding, and social dynamics. Treat design claims as hypotheses proved by play, not a feature inventory or genre imitation — no genre kits, presets, or archetypes; every game is a custom composition of needs (see [AGENTS.md](../../../AGENTS.md)).
|
|
11
|
+
|
|
12
|
+
Use `level-design` for spatial realization; route implementation to `jgengine-gameplay`, `jgengine-world`, `jgengine-combat`, `jgengine-ui`, `jgengine-multiplayer` once intent is coherent.
|
|
13
|
+
|
|
14
|
+
Read [references/application-playbook.md](references/application-playbook.md) only when the task explicitly calls for design depth — a design brief, a redesign, or "make this fun/better" work; it is not a mandatory step of creating a game. Read [references/field-guide.md](references/field-guide.md) when the task needs deeper loop, economy, progression, genre, accessibility, or research guidance.
|
|
15
|
+
|
|
16
|
+
## Choose the mode
|
|
17
|
+
|
|
18
|
+
Greenfield: produce a vertical-slice contract (promise, pillars, core decision, loops, progression, failure/recovery) and build the smallest slice testing the riskiest assumption — see playbook §1. Existing game: reconstruct what it actually does from code and play, rank root problems by impact/confidence/reach/effort — see playbook §2.
|
|
19
|
+
|
|
20
|
+
“Improve with game design” is an implementation request, not just an audit: select the highest-leverage intervention, implement it through shared engine seams, and prove the changed player behavior.
|
|
21
|
+
|
|
22
|
+
## Required output contract
|
|
23
|
+
|
|
24
|
+
Every design pass yields an observed journey, a north star (promise, pillars, anti-pillars, core decision), a loop/flow model, a ranked bottleneck list with cited evidence, an intervention stack, a chosen design slice, and acceptance evidence. See [references/application-playbook.md](references/application-playbook.md) for the full contract and execution rules (verb->feedback->consequence chains, loop/progression/challenge discipline, upstream ownership).
|
|
25
|
+
|
|
26
|
+
## Completion
|
|
27
|
+
|
|
28
|
+
An audit is not completion for a build/improve request. Finish when the slice is playable, a fresh player can state goal/choice/consequence, failure/recovery behave as intended, and evidence supports the pillars. Use `jgengine-verify` and `workflow` to ship.
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Applying game design
|
|
2
|
+
|
|
3
|
+
Use this playbook to turn a pitch or an existing game into implemented, testable change. Its purpose is to prevent “design work” from ending as generic advice.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
1. Greenfield procedure
|
|
8
|
+
2. Existing-game audit
|
|
9
|
+
3. Mandatory models
|
|
10
|
+
4. Ranking interventions
|
|
11
|
+
5. Design-slice specification
|
|
12
|
+
6. Implementation and proof
|
|
13
|
+
7. Failure modes
|
|
14
|
+
|
|
15
|
+
## 1. Greenfield procedure
|
|
16
|
+
|
|
17
|
+
### Frame the bet
|
|
18
|
+
|
|
19
|
+
Write a compact contract before broad code or content:
|
|
20
|
+
|
|
21
|
+
| Field | Required form |
|
|
22
|
+
| --- | --- |
|
|
23
|
+
| audience/context | prior skills, player count, platform/input, session length, accessibility assumptions |
|
|
24
|
+
| player promise | “The player repeatedly [verb/decision] so they feel [specific experience]” |
|
|
25
|
+
| pillars | two or three observable behaviors or feelings |
|
|
26
|
+
| anti-pillars | experiences the game must not drift toward |
|
|
27
|
+
| core decision | situation, known information, viable options, tradeoff, consequence, recurrence |
|
|
28
|
+
| completion proof | one end-to-end scenario a target player can perform and explain |
|
|
29
|
+
| falsifier | observation that would show the design does not work |
|
|
30
|
+
|
|
31
|
+
### Build the minimum design
|
|
32
|
+
|
|
33
|
+
1. Model each core verb from cue through future consequence.
|
|
34
|
+
2. Draw moment, encounter, session, and meta loops.
|
|
35
|
+
3. Draw resources and feedback structures.
|
|
36
|
+
4. Map player skills and progression channels.
|
|
37
|
+
5. Define failure, recovery, stopping, and replay.
|
|
38
|
+
6. Create a content grammar: a small set of mechanics crossed with contexts and constraints.
|
|
39
|
+
7. Select the riskiest assumption and build one vertical design slice around it.
|
|
40
|
+
|
|
41
|
+
Do not build the entire feature list first. A vertical slice contains real input, meaningful state, feedback, one decision that recurs, failure/recovery, and a downstream consequence.
|
|
42
|
+
|
|
43
|
+
## 2. Existing-game audit
|
|
44
|
+
|
|
45
|
+
### Reconstruct reality
|
|
46
|
+
|
|
47
|
+
Inspect actual code, catalogs, scene documents, UI, tests, captures, and live play. Do not infer the game from its title or README.
|
|
48
|
+
|
|
49
|
+
Trace four journeys when applicable:
|
|
50
|
+
|
|
51
|
+
- **first minute:** first input, goal, threat, reward, confusion, and reason to continue
|
|
52
|
+
- **first objective:** learning sequence, decisions, failure, recovery, payoff, and next goal
|
|
53
|
+
- **representative session:** loop renewal, variety, resource pressure, build choices, pacing, and stopping point
|
|
54
|
+
- **campaign/meta:** unlock cadence, content reuse, escalation, economy stability, mastery, and ending/replay
|
|
55
|
+
|
|
56
|
+
For each journey, record timestamps or event order:
|
|
57
|
+
|
|
58
|
+
`cue -> player belief -> action -> system response -> feedback -> state change -> next choice`
|
|
59
|
+
|
|
60
|
+
Mark dead time, repeated decisions, forced actions, hidden consequences, false affordances, unexplained failure, and rewards that do not alter later play.
|
|
61
|
+
|
|
62
|
+
### Build a system-coupling map
|
|
63
|
+
|
|
64
|
+
Inventory verbs, enemies/problems, items/tools, progression, economy, quests/objectives, world states, social systems, and failure. For each system ask:
|
|
65
|
+
|
|
66
|
+
- Which pillar does it serve?
|
|
67
|
+
- Which loop consumes its output?
|
|
68
|
+
- What player decision does it create or transform?
|
|
69
|
+
- Where is it taught, tested, combined, and mastered?
|
|
70
|
+
- What happens if it is removed?
|
|
71
|
+
|
|
72
|
+
Flag systems that are present but disconnected, content whose only variation is numbers or nouns, and rewards that bypass the core play.
|
|
73
|
+
|
|
74
|
+
### Diagnose decision density
|
|
75
|
+
|
|
76
|
+
Do not maximize decisions per second. Find long spans where the player executes an already-solved action without new information, tradeoffs, expression, pressure, or mastery. Measure:
|
|
77
|
+
|
|
78
|
+
- time to first meaningful decision
|
|
79
|
+
- meaningful decisions per encounter/objective
|
|
80
|
+
- time between new information and commitment
|
|
81
|
+
- percentage of objectives using each verb or decision type
|
|
82
|
+
- repeated content before context changes
|
|
83
|
+
- time from failure to a useful retry
|
|
84
|
+
|
|
85
|
+
## 3. Mandatory models
|
|
86
|
+
|
|
87
|
+
### Loop table
|
|
88
|
+
|
|
89
|
+
| Horizon | Cue/goal | Decision/action | Feedback | State changed | Why repeat? | Failure risk |
|
|
90
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
91
|
+
|
|
92
|
+
Reject any row whose “state changed” or “why repeat” is empty.
|
|
93
|
+
|
|
94
|
+
### Resource-flow table
|
|
95
|
+
|
|
96
|
+
| Resource | Source | Store/cap | Spend/convert | Sink | Player decision | Feedback/runaway risk |
|
|
97
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
98
|
+
|
|
99
|
+
Include time, health, space, information, attention, action opportunities, and social trust when relevant.
|
|
100
|
+
|
|
101
|
+
### Progression table
|
|
102
|
+
|
|
103
|
+
| Unlock/reward | Channel | New decision or capability | Content it recontextualizes | Risk of invalidation/grind | Proof |
|
|
104
|
+
| --- | --- | --- | --- | --- | --- |
|
|
105
|
+
|
|
106
|
+
Channels are mastery, access, breadth, power, and expression/status. Passive percentages without a changed decision must justify their place.
|
|
107
|
+
|
|
108
|
+
### Objective/encounter variety matrix
|
|
109
|
+
|
|
110
|
+
Cross objective verbs with information state, constraints, enemy/problem behavior, topology, resource pressure, failure condition, and consequence. This exposes campaigns where every mission is the same verb with different nouns.
|
|
111
|
+
|
|
112
|
+
## 4. Ranking interventions
|
|
113
|
+
|
|
114
|
+
Separate symptoms from root causes. “Quests are boring” is a symptom. “Every quest uses the same kill-count transition and no objective changes space, resources, or strategy” is a testable cause.
|
|
115
|
+
|
|
116
|
+
Rank each candidate:
|
|
117
|
+
|
|
118
|
+
| Candidate | Player behavior changed | Pillar impact | Reach | Evidence/confidence | Effort/risk | Dependencies | Shared owner |
|
|
119
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
120
|
+
|
|
121
|
+
Use three horizons:
|
|
122
|
+
|
|
123
|
+
- **Minimum correction:** remove the largest contradiction or unblock the loop.
|
|
124
|
+
- **Strong target:** make one representative slice deliver the promise end to end.
|
|
125
|
+
- **Multiplier:** expand the proven grammar across content, progression, social play, or replay.
|
|
126
|
+
|
|
127
|
+
Choose by leverage, not novelty. Prefer a change that improves many encounters or future games over bespoke content with the same underlying decision.
|
|
128
|
+
|
|
129
|
+
## 5. Design-slice specification
|
|
130
|
+
|
|
131
|
+
The selected slice must state:
|
|
132
|
+
|
|
133
|
+
- before behavior and evidence
|
|
134
|
+
- target behavior and player belief
|
|
135
|
+
- mechanics/dynamics expected to cause the change
|
|
136
|
+
- objective/encounter sequence and pacing beats
|
|
137
|
+
- resources, rewards, failure, recovery, and downstream consequence
|
|
138
|
+
- affected catalogs/config, shared package seams, scene semantics, UI feedback, and tests
|
|
139
|
+
- tuning variables with starting hypotheses and safe bounds
|
|
140
|
+
- explicit non-goals and content held constant
|
|
141
|
+
- acceptance scenario and falsifiers
|
|
142
|
+
|
|
143
|
+
If another game could use the mechanic, define the package primitive first and adopt it here. Keep game-local code for content and feel.
|
|
144
|
+
|
|
145
|
+
## 6. Implementation and proof
|
|
146
|
+
|
|
147
|
+
When the user asks to build or improve:
|
|
148
|
+
|
|
149
|
+
1. Implement the shared primitive or use an existing capability.
|
|
150
|
+
2. Adopt it in one complete game slice.
|
|
151
|
+
3. Author spatial content through `level-design` and the editor.
|
|
152
|
+
4. Add deterministic tests for transitions, resources, failure, and progression.
|
|
153
|
+
5. Exercise the observable scenario with representative input.
|
|
154
|
+
6. Capture before/after evidence for behavior, not only appearance.
|
|
155
|
+
7. Evaluate the falsifier honestly; revise or remove a failed intervention.
|
|
156
|
+
|
|
157
|
+
Useful evidence includes time to first decision, objective completion, route choice, build choice, resource state, failure cause, retry time, objective-verb distribution, and a player’s ability to explain goal/action/consequence. Metrics need a named hypothesis; do not optimize them in isolation.
|
|
158
|
+
|
|
159
|
+
## 7. Failure modes
|
|
160
|
+
|
|
161
|
+
- producing a long GDD instead of a playable slice
|
|
162
|
+
- listing features without naming changed decisions
|
|
163
|
+
- adding content to a shallow objective grammar
|
|
164
|
+
- using passive progression to disguise unchanged play
|
|
165
|
+
- copying a genre’s surface without its causal dynamics
|
|
166
|
+
- treating more rewards as more motivation
|
|
167
|
+
- fixing comprehension only with text or HUD
|
|
168
|
+
- reporting a diagnosis after the user asked for improvement
|
|
169
|
+
- calling deterministic tests proof that the experience works
|
|
170
|
+
- calling a prettier screenshot proof that the loop works
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
# Game design field guide
|
|
2
|
+
|
|
3
|
+
Use this reference when a task needs more than the canonical workflow in [`SKILL.md`](../SKILL.md). It is a synthesis of research and shipped-game practice, not a universal formula. Select the tools that expose the current design risk and validate them with players.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
1. Experience hypotheses
|
|
8
|
+
2. Actions, feedback, and decisions
|
|
9
|
+
3. Nested loops
|
|
10
|
+
4. Systems and economies
|
|
11
|
+
5. Progression and challenge
|
|
12
|
+
6. Onboarding and accessibility
|
|
13
|
+
7. Multiplayer and social play
|
|
14
|
+
8. Content structure and genre lenses
|
|
15
|
+
9. Prototyping and playtesting
|
|
16
|
+
10. JGengine translation
|
|
17
|
+
11. Diagnostic questions
|
|
18
|
+
12. Research basis
|
|
19
|
+
|
|
20
|
+
## 1. Experience hypotheses
|
|
21
|
+
|
|
22
|
+
### Write a working contract
|
|
23
|
+
|
|
24
|
+
Use a compact table in the issue, task, or conversation. Do not preserve speculative prose as a large design document.
|
|
25
|
+
|
|
26
|
+
| Question | Useful answer | Weak answer |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| Who plays, where, and for how long? | “Two friends, 20-minute online co-op runs” | “Everyone” |
|
|
29
|
+
| What do they repeatedly do? | “Scout, plan a breach, improvise when it fails” | “Experience action” |
|
|
30
|
+
| What should dominate the experience? | “Tense coordination, expressive tools, recoverable chaos” | “Fun and immersive” |
|
|
31
|
+
| What must it not become? | “Inventory chores, solved loadouts, long spectator time” | “Not boring” |
|
|
32
|
+
| What proves the loop? | “A new pair completes one objective, explains its failure, and chooses a different second approach” | “Players like it” |
|
|
33
|
+
|
|
34
|
+
Treat pillars as prioritization constraints. Make each pillar observable and give it an anti-pillar. When two features conflict, the pillar decides which survives.
|
|
35
|
+
|
|
36
|
+
### Trace experience in both directions
|
|
37
|
+
|
|
38
|
+
Use the Mechanics-Dynamics-Aesthetics separation as a causal check:
|
|
39
|
+
|
|
40
|
+
- **Experience:** the intended emotional or social response.
|
|
41
|
+
- **Dynamics:** the behavior that should emerge during play.
|
|
42
|
+
- **Mechanics:** the rules, data, controls, and feedback likely to produce that behavior.
|
|
43
|
+
|
|
44
|
+
Design backward from experience, then simulate forward from mechanics. A stealth meter does not guarantee tension; examine whether information, enemy response, recovery, and level geometry actually produce cautious planning.
|
|
45
|
+
|
|
46
|
+
Use autonomy, competence, and relatedness as diagnostics, not mandatory quotas:
|
|
47
|
+
|
|
48
|
+
- **Autonomy:** choices allow ownership and expression rather than cosmetic branching.
|
|
49
|
+
- **Competence:** players can understand improvement and attribute outcomes to actions.
|
|
50
|
+
- **Relatedness:** players can contribute, recognize others, and form meaningful social context.
|
|
51
|
+
|
|
52
|
+
## 2. Actions, feedback, and decisions
|
|
53
|
+
|
|
54
|
+
### Model a playable verb
|
|
55
|
+
|
|
56
|
+
For every core verb, specify:
|
|
57
|
+
|
|
58
|
+
1. cue and available information
|
|
59
|
+
2. player intention and input
|
|
60
|
+
3. target and eligibility rules
|
|
61
|
+
4. simulation/state transition
|
|
62
|
+
5. immediate visual, audio, haptic, and systemic feedback
|
|
63
|
+
6. consequence that affects a later choice
|
|
64
|
+
7. skill the player is expected to learn
|
|
65
|
+
8. counterplay, cost, risk, or limitation
|
|
66
|
+
|
|
67
|
+
An animation without a state consequence is presentation. A state change the player cannot perceive cannot reliably teach. Good moment-to-moment feel combines predictable physical response, amplified event importance, and assistance that honors player intention.
|
|
68
|
+
|
|
69
|
+
### Test whether a choice is meaningful
|
|
70
|
+
|
|
71
|
+
A decision usually needs:
|
|
72
|
+
|
|
73
|
+
- at least two viable options the player can distinguish
|
|
74
|
+
- enough information to form a plan, with uncertainty appropriate to the fantasy
|
|
75
|
+
- a tradeoff rather than a universally dominant answer
|
|
76
|
+
- a perceivable consequence at the promised time scale
|
|
77
|
+
- an effect on future state, knowledge, position, relationships, or opportunity
|
|
78
|
+
|
|
79
|
+
Not every input needs strategic depth. Execution, expression, discovery, role-play, and timing can carry play. Be precise about which kind of agency the design promises.
|
|
80
|
+
|
|
81
|
+
Audit common choice failures:
|
|
82
|
+
|
|
83
|
+
- **blind:** relevant information arrives only after commitment
|
|
84
|
+
- **fake:** outcomes converge without expressive or narrative value
|
|
85
|
+
- **solved:** one option dominates across contexts
|
|
86
|
+
- **noisy:** feedback cannot be attributed to the choice
|
|
87
|
+
- **overloaded:** too many new variables must be evaluated at once
|
|
88
|
+
- **inert:** consequence does not alter anything the player values
|
|
89
|
+
|
|
90
|
+
## 3. Nested loops
|
|
91
|
+
|
|
92
|
+
### Loop anatomy
|
|
93
|
+
|
|
94
|
+
Write each loop as:
|
|
95
|
+
|
|
96
|
+
`state/cue -> goal -> informed action -> simulation -> feedback -> changed state -> next decision`
|
|
97
|
+
|
|
98
|
+
The return state must differ in a useful way: new information, depleted or gained resources, changed position, higher mastery, altered relationships, new capability, or escalated world state. “Fight enemies, get loot, repeat” is incomplete until the design explains how loot changes subsequent fights and why choices remain interesting.
|
|
99
|
+
|
|
100
|
+
### Time horizons
|
|
101
|
+
|
|
102
|
+
| Horizon | Typical concern | Validation |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| moment-to-moment | control, targeting, timing, feedback | Can players predict and correct an action? |
|
|
105
|
+
| encounter/task | tactics, puzzle, risk, recovery | Do multiple verbs and resources create decisions? |
|
|
106
|
+
| session/run | pacing, goals, build arc, stopping | Does the session reach a satisfying change or climax? |
|
|
107
|
+
| campaign/meta | progression, variety, mastery, expression | Do unlocks create new play instead of only larger numbers? |
|
|
108
|
+
| community | cooperation, competition, identity, shared stories | Can players contribute and recover from social friction? |
|
|
109
|
+
|
|
110
|
+
Check coupling. The short loop must feed the long loop, and long-loop rewards must renew rather than trivialize the short loop.
|
|
111
|
+
|
|
112
|
+
## 4. Systems and economies
|
|
113
|
+
|
|
114
|
+
### Map flows before tuning
|
|
115
|
+
|
|
116
|
+
For every tangible or abstract resource, record:
|
|
117
|
+
|
|
118
|
+
- **source:** creates it
|
|
119
|
+
- **pool/store:** holds it and defines capacity or decay
|
|
120
|
+
- **converter:** changes it into another resource or state
|
|
121
|
+
- **trade:** exchanges resources between owners
|
|
122
|
+
- **gate:** requires a threshold or condition
|
|
123
|
+
- **sink:** removes it from circulation
|
|
124
|
+
|
|
125
|
+
Include time, attention, space, health, information, social trust, action opportunities, and risk when they behave like resources. Draw connections and simulate several player strategies before choosing numbers.
|
|
126
|
+
|
|
127
|
+
### Audit feedback structures
|
|
128
|
+
|
|
129
|
+
- Positive feedback amplifies an advantage; it can make growth satisfying but also cause runaway leaders.
|
|
130
|
+
- Negative feedback resists deviation; it can stabilize play but feel punitive when it erases earned advantage.
|
|
131
|
+
- A loop’s speed, delay, visibility, durability, and cap matter as much as its sign.
|
|
132
|
+
- Randomness changes distribution, not only average outcome. Examine worst cases, streaks, and player control.
|
|
133
|
+
|
|
134
|
+
Give resources clear jobs. A currency with no recurring sink accumulates into irrelevance; a sink without valued outcomes becomes tax. Use opportunity costs to create decisions, and cap or decay stockpiles only when that behavior supports the experience.
|
|
135
|
+
|
|
136
|
+
### Balance relationships, not isolated values
|
|
137
|
+
|
|
138
|
+
Maintain a tuning table with units, baseline, min/max, dependency, player-facing purpose, and test evidence. Derive related values from a small set of legible baselines. Inspect:
|
|
139
|
+
|
|
140
|
+
- time-to-effect and time-to-recover
|
|
141
|
+
- expected value and variance
|
|
142
|
+
- throughput, capacity, scarcity, and replacement rate
|
|
143
|
+
- breakpoints where an option changes from viable to dominant
|
|
144
|
+
- compounding across upgrades and feedback loops
|
|
145
|
+
- edge cases at zero, maximum, and repeated use
|
|
146
|
+
|
|
147
|
+
## 5. Progression and challenge
|
|
148
|
+
|
|
149
|
+
### Separate progression channels
|
|
150
|
+
|
|
151
|
+
- **Mastery:** the player learns execution, planning, recognition, or social coordination.
|
|
152
|
+
- **Content:** new spaces, problems, opponents, or stories become available.
|
|
153
|
+
- **Breadth:** new tools or combinations expand the possibility space.
|
|
154
|
+
- **Power:** existing actions become numerically stronger.
|
|
155
|
+
- **Expression/status:** appearance, identity, collection, or public accomplishment changes.
|
|
156
|
+
|
|
157
|
+
Prefer unlocks that create new decisions or recontextualize mastered skills. Numerical power is useful when it makes growth legible, but unchecked vertical scaling invalidates content and narrows viable options.
|
|
158
|
+
|
|
159
|
+
Build a skill graph: assumed prior skills -> introduced skill -> safe practice -> independent test -> combination -> transformed use -> mastery proof. Provide fast paths or optional refreshers for players who arrive with different prior knowledge.
|
|
160
|
+
|
|
161
|
+
### Treat difficulty as a vector
|
|
162
|
+
|
|
163
|
+
Tune cognitive load, precision, timing, planning depth, memory, sensory discrimination, resource pressure, punishment, uncertainty, coordination, and persistence separately. A single easy/normal/hard multiplier cannot serve every barrier.
|
|
164
|
+
|
|
165
|
+
Failure should answer:
|
|
166
|
+
|
|
167
|
+
- What happened and why?
|
|
168
|
+
- What can the player try differently?
|
|
169
|
+
- How much meaningful progress is lost?
|
|
170
|
+
- How quickly can the player act again?
|
|
171
|
+
- Does recovery preserve tension without demanding repetition already mastered?
|
|
172
|
+
|
|
173
|
+
Dynamic adjustment can change pressure frequency, assistance, resource supply, or challenge amplitude, but it must remain predictable enough for players to learn and must not counterfeit achievement.
|
|
174
|
+
|
|
175
|
+
## 6. Onboarding and accessibility
|
|
176
|
+
|
|
177
|
+
Teach inside representative play:
|
|
178
|
+
|
|
179
|
+
1. prime attention before the mechanic matters
|
|
180
|
+
2. invite the action with low failure cost
|
|
181
|
+
3. give immediate, redundant feedback
|
|
182
|
+
4. allow repetition or experimentation
|
|
183
|
+
5. test without step-by-step prompting
|
|
184
|
+
6. combine with one known mechanic
|
|
185
|
+
7. make help recallable and skippable where appropriate
|
|
186
|
+
|
|
187
|
+
Do not assume genre literacy, dual-stick control, rapid reading, color discrimination, precise timing, hearing, or uninterrupted attention. Preserve the intended experience through remapping, simplified input, adjustable timing, pause, granular challenge assists, redundant cues, readable objectives, and reduced repetition.
|
|
188
|
+
|
|
189
|
+
## 7. Multiplayer and social play
|
|
190
|
+
|
|
191
|
+
Design the social system before selecting transport:
|
|
192
|
+
|
|
193
|
+
- define cooperative and competitive relationships, team sizes, and information boundaries
|
|
194
|
+
- ensure every role has understandable contribution and moments of agency
|
|
195
|
+
- limit involuntary downtime and give eliminated players meaningful next actions
|
|
196
|
+
- specify join, leave, disconnect, reconnect, and uneven-player behavior
|
|
197
|
+
- distinguish team comeback from hidden punishment of skilled play
|
|
198
|
+
- bound griefing, collusion, kingmaking, smurfing, spawn abuse, and reward farming
|
|
199
|
+
- test communication-light play and accessibility of coordination signals
|
|
200
|
+
|
|
201
|
+
For persistent systems, model inflation, hoarding, market manipulation, time-zone advantage, seasonal resets, and what happens when population is sparse.
|
|
202
|
+
|
|
203
|
+
## 8. Content structure and genre lenses
|
|
204
|
+
|
|
205
|
+
Create a content matrix from mechanics and contexts rather than brainstorming isolated features. Useful axes include verb, target, constraint, topology, information state, resource state, opponent behavior, time pressure, social relationship, and consequence. Combine a few axes at a time and reserve unexplored combinations for progression.
|
|
206
|
+
|
|
207
|
+
Apply genre lenses without treating them as templates:
|
|
208
|
+
|
|
209
|
+
- **action/combat:** readability, positioning, threat priority, counterplay, recovery, expressive kit
|
|
210
|
+
- **platforming/racing:** movement mastery, line choice, anticipation, risk, restart cost, readable boundaries
|
|
211
|
+
- **puzzle:** information sufficiency, hypothesis formation, state legibility, undo/reset, insight rather than busywork
|
|
212
|
+
- **strategy/management:** forecasts, opportunity cost, feedback loops, viable plans, recovery from early errors
|
|
213
|
+
- **survival/crafting:** scarcity rhythms, transformation chains, expedition risk, homeward payoff, anti-grind
|
|
214
|
+
- **narrative/social:** role expression, relationship consequences, authored versus emergent story, respectful irreversibility
|
|
215
|
+
- **sandbox/open world:** self-directed goals, systemic interaction, discovery density, world response, return value
|
|
216
|
+
|
|
217
|
+
## 9. Prototyping and playtesting
|
|
218
|
+
|
|
219
|
+
### Prototype risk, not polish
|
|
220
|
+
|
|
221
|
+
Name the riskiest assumption: control feel, decision depth, loop renewal, economy stability, social coordination, or content feasibility. Build the smallest slice that can disprove it with real input, real state transitions, and representative feedback.
|
|
222
|
+
|
|
223
|
+
### Use a test protocol
|
|
224
|
+
|
|
225
|
+
Record:
|
|
226
|
+
|
|
227
|
+
- hypothesis and decision the test will inform
|
|
228
|
+
- participant profile and prior skills
|
|
229
|
+
- build/version, scenario, starting state, and task
|
|
230
|
+
- observable success/failure thresholds
|
|
231
|
+
- events and metrics to capture
|
|
232
|
+
- moderator script that avoids teaching or defending the design
|
|
233
|
+
- findings separated into behavior, interpretation, severity, confidence, and proposed cause
|
|
234
|
+
|
|
235
|
+
Observe before interviewing. Ask players what they thought was happening, what they planned, and what evidence shaped the plan. Preferences are valuable but do not replace behavior. Telemetry describes what happened at scale; it rarely explains why.
|
|
236
|
+
|
|
237
|
+
Use rapid iterative testing for obvious, high-confidence usability defects: make a small fix, test it with the next appropriate participant, and verify that it solves the problem without creating another. Do not churn balance or appeal based on one participant.
|
|
238
|
+
|
|
239
|
+
Classify findings:
|
|
240
|
+
|
|
241
|
+
- **comprehension:** goal, rule, state, or feedback misunderstood
|
|
242
|
+
- **execution:** intention clear but control/precision/timing blocks action
|
|
243
|
+
- **balance:** options or outcomes violate intended tradeoffs
|
|
244
|
+
- **pacing:** pressure, rest, novelty, or payoff arrives at the wrong rate
|
|
245
|
+
- **motivation:** player sees no valued reason to continue
|
|
246
|
+
- **accessibility:** an avoidable barrier excludes a player
|
|
247
|
+
- **technical:** implementation differs from the design contract
|
|
248
|
+
|
|
249
|
+
## 10. JGengine translation
|
|
250
|
+
|
|
251
|
+
- Keep the design contract and acceptance criteria in the tracked issue/PR, not a speculative document tree.
|
|
252
|
+
- Put definitions, costs, rewards, tiers, recipes, and formulas in typed catalogs or config.
|
|
253
|
+
- Put mutable state in serializable shared primitives and transitions in systems/commands.
|
|
254
|
+
- Put placement, routes, terrain, markers, zones, foliage, and asset instances in `editor.scene.json` via `jgengine-editor`.
|
|
255
|
+
- Query authored ids and semantics through `jgengine-world`; never copy coordinates into rules.
|
|
256
|
+
- Use deterministic injected randomness and headless tests for loops, economies, and failure states.
|
|
257
|
+
- Add telemetry only for a named design question and avoid collecting unnecessary player data.
|
|
258
|
+
- If a reusable rule is missing, implement the narrow package primitive with the game as first adopter.
|
|
259
|
+
|
|
260
|
+
## 11. Diagnostic questions
|
|
261
|
+
|
|
262
|
+
Before calling a design coherent, ask:
|
|
263
|
+
|
|
264
|
+
- Can a player state the immediate goal, available verbs, and likely consequences?
|
|
265
|
+
- What interesting decision repeats, and how does context stop it becoming solved?
|
|
266
|
+
- What does the player learn in the first minute, first session, and tenth session?
|
|
267
|
+
- Which state changes make each loop worth repeating?
|
|
268
|
+
- What behavior does each reward actually incentivize?
|
|
269
|
+
- Where can positive feedback create a runaway result?
|
|
270
|
+
- Which barriers are intentional challenge and which are accidental exclusion?
|
|
271
|
+
- What happens after failure, success, mastery, interruption, and return?
|
|
272
|
+
- What breaks with one player, the maximum player count, or a disconnect?
|
|
273
|
+
- What evidence would cause the team to remove or redesign the feature?
|
|
274
|
+
|
|
275
|
+
## 12. Research basis
|
|
276
|
+
|
|
277
|
+
These sources provide lenses and evidence, not commandments:
|
|
278
|
+
|
|
279
|
+
- Robin Hunicke, Marc LeBlanc, and Robert Zubek, [“MDA: A Formal Approach to Game Design and Game Research”](https://users.cs.northwestern.edu/~hunicke/MDA.pdf): trace mechanics, runtime dynamics, and intended experience causally and avoid using “fun” as the whole vocabulary.
|
|
280
|
+
- Richard Ryan and collaborators, [Player Experience of Needs Satisfaction](https://selfdeterminationtheory.org/player-experience-of-needs-satisfaction-pens/): empirical motivation lens around autonomy, competence, and relatedness.
|
|
281
|
+
- Joris Dormans, [“Simulating Mechanics to Study Emergence in Games”](https://ojs.aaai.org/index.php/AIIDE/article/view/12477): model resource flows, internal economies, and emergent feedback before implementation.
|
|
282
|
+
- Daniel Cook, [“The Chemistry of Game Design”](https://www.gamedeveloper.com/design/the-chemistry-of-game-design): action/simulation/feedback/learning atoms and skill-chain analysis.
|
|
283
|
+
- Robin Hunicke and Vernell Chapman, [“AI for Dynamic Difficulty Adjustment in Games”](https://users.cs.northwestern.edu/~hunicke/pubs/Hamlet.pdf): difficulty, resource supply, uncertainty, and the limitations of adjustment systems.
|
|
284
|
+
- Christiane Birk and colleagues, [“Designing Game Feel: A Survey”](https://arxiv.org/abs/2011.09201): physical tuning, feedback amplification, and intent-supporting streamlining.
|
|
285
|
+
- GDC, [“Prime, Teach, Observe”](https://gdcvault.com/play/1021120/Prime-Teach-Observe-Tutorializing-Innovative): teach mechanics through player modeling and iterative observation.
|
|
286
|
+
- Microsoft Games Studios, [“Using the RITE Method to Improve Products”](https://jpattonassociates.com/wp-content/uploads/2015/04/rite_method.pdf): rapidly fix and empirically verify high-confidence usability problems.
|
|
287
|
+
- Microsoft, [Xbox Accessibility Guidelines](https://learn.microsoft.com/en-us/xbox/accessibility/guidelines): player-informed guidance for input, objectives, feedback, difficulty, timing, sensory access, and communication.
|
|
288
|
+
- Matthias Worch, [“Decisions That Matter”](https://gdcvault.com/play/1020570/): connect informed choice, agency, consequence, and level context.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jgengine
|
|
3
|
+
description: Route game work to the smallest useful JGengine guidance set.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# JGengine intake and router
|
|
7
|
+
|
|
8
|
+
Read the repository [README](../../../README.md) for package truth, commands, layering, and license. This skill decides what to load; it is not an engine manual.
|
|
9
|
+
|
|
10
|
+
## 1. Establish the target
|
|
11
|
+
|
|
12
|
+
Treat the pitch as a unique composition of needs, not a genre to fill in — never reach for a genre kit, preset, archetype, or class template ("default sports car", "default RPG", "default FPS") in the SDK or skills (see [AGENTS.md](../../../AGENTS.md)). Use `game-design` to turn the pitch into a testable player promise, verbs, loops, progression, failure, and completion scenario. Use `level-design` when play depends on authored spaces, routes, encounters, exploration, or spatial pacing. Capture only decisions that change architecture:
|
|
13
|
+
|
|
14
|
+
- player point of view and controls
|
|
15
|
+
- world shape and authored content
|
|
16
|
+
- core loop, interaction, combat, and progression
|
|
17
|
+
- solo, local, hosted, or persistent multiplayer
|
|
18
|
+
- HUD/menu states and **custom** UI art direction (every game owns its presentation — no stock drop-in face)
|
|
19
|
+
- one observable completion scenario
|
|
20
|
+
|
|
21
|
+
For a new in-repo game, scaffold with `bun run new:game "<id-or-title>"` (thin script alias for `jgengine create`, auto-detects the in-repo variant). Outside this monorepo, start with `npx jgengine create`; never copy `Games/*`.
|
|
22
|
+
|
|
23
|
+
## 2. Select domains
|
|
24
|
+
|
|
25
|
+
Load only rows the target needs. Do not preload every domain.
|
|
26
|
+
|
|
27
|
+
| Need | Skill | Owner |
|
|
28
|
+
| --- | --- | --- |
|
|
29
|
+
| player promise, pillars, verbs, loops, economy, progression, balance | `game-design` | experience and rule intent |
|
|
30
|
+
| metrics, topology, encounters, navigation, spatial pacing | `level-design` | playable space intent |
|
|
31
|
+
| scene placement, terrain painting, paths, asset authoring | `jgengine-editor` | editor document and authoring tools |
|
|
32
|
+
| runtime world, movement, input, interaction, AI, navigation, audio | `jgengine-world` | spatial simulation and world runtime |
|
|
33
|
+
| game state, systems, inventory, crafting, quests, economy, turns | `jgengine-gameplay` | non-combat rules and state |
|
|
34
|
+
| targeting, stats, damage, effects, abilities, projectiles, loot | `jgengine-combat` | combat resolution |
|
|
35
|
+
| HUD, menus, layout, accessibility, touch presentation | `jgengine-ui` | player-facing interface |
|
|
36
|
+
| models, sprites, materials, audio files, source licensing | `jgengine-assets` | asset discovery and catalogs |
|
|
37
|
+
| authority, transport, replication, sessions, host persistence | `jgengine-multiplayer` | network topology and persistence adapters |
|
|
38
|
+
|
|
39
|
+
World content routes editor-first: any request that adds, moves, restyles, or removes something visible in the world — however phrased ("design this world", "place the enemies", "make it look better") — starts in `jgengine-editor`; the other domains consume the authored document. Scenes normally require both `jgengine-editor` for authoring and `jgengine-world` for runtime consumption. Combat and multiplayer are opt-in, not default intake.
|
|
40
|
+
|
|
41
|
+
## 3. Discover before designing
|
|
42
|
+
|
|
43
|
+
Within each selected domain:
|
|
44
|
+
|
|
45
|
+
1. Search `capabilities.md` by intent; it maps needs to imports.
|
|
46
|
+
2. Open `api.md` only when exact signatures or export inventory are needed.
|
|
47
|
+
3. Open the linked reference only for a deeper recipe or trap.
|
|
48
|
+
4. For how several primitives wire into a running loop, read the domain's `recipes/` — connected, genre-free walkthroughs organized by composition seam; this skill's own [recipes/minimal-game.md](recipes/minimal-game.md) is the default whole-game walkthrough. Prefer a recipe over reading a game's source; the games under `Games/*` are not templates or references, and a hybrid game is just a different composition of the same primitives.
|
|
49
|
+
|
|
50
|
+
If no capability fits, identify the upstream package seam before writing game-local code. In this repository, implement a reusable primitive with its first adopter; if editor-owned content cannot be expressed, file the editor gap first.
|
|
51
|
+
|
|
52
|
+
## 4. Build and finish
|
|
53
|
+
|
|
54
|
+
Keep scene coordinates in the editor document, state serializable, randomness injected, and hot-path work bounded. Use `jgengine-verify` for evidence appropriate to the change. Inside this monorepo, `workflow` owns issue/PR completion. Visual polish work also uses the `jgengine-ui` quality reference.
|