spriteforge 0.1.1__py3-none-any.whl
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.
- spriteforge/__init__.py +1 -0
- spriteforge/__main__.py +3 -0
- spriteforge/agents/__init__.py +0 -0
- spriteforge/agents/assets.py +109 -0
- spriteforge/agents/cancellation.py +12 -0
- spriteforge/agents/director.py +50 -0
- spriteforge/agents/models.py +63 -0
- spriteforge/agents/roles/art-director.md +15 -0
- spriteforge/agents/roles/art-reviewer.md +14 -0
- spriteforge/agents/roles/director.md +14 -0
- spriteforge/agents/roles/game-designer.md +15 -0
- spriteforge/agents/roles/level-tile-designer.md +16 -0
- spriteforge/agents/roles/librarian.md +13 -0
- spriteforge/agents/roles/menu-designer.md +15 -0
- spriteforge/agents/roles/pixel-artist.md +14 -0
- spriteforge/agents/roles/programmer.md +14 -0
- spriteforge/agents/roles/qa-playtester.md +13 -0
- spriteforge/agents/roles/sound-director.md +14 -0
- spriteforge/agents/roles.py +39 -0
- spriteforge/agents/router.py +233 -0
- spriteforge/agents/router_eval.py +145 -0
- spriteforge/agents/routing_state.py +133 -0
- spriteforge/agents/runtime.py +430 -0
- spriteforge/agents/workflow.py +389 -0
- spriteforge/app/__init__.py +0 -0
- spriteforge/app/agents_view.py +248 -0
- spriteforge/app/chat.py +114 -0
- spriteforge/app/extensions.py +115 -0
- spriteforge/app/index.html +279 -0
- spriteforge/app/local_only.py +49 -0
- spriteforge/app/server.py +358 -0
- spriteforge/app/static/assets/index-L2s1wlcp.css +1 -0
- spriteforge/app/static/assets/index-aBfzgLQl.js +71 -0
- spriteforge/app/static/assets/press-start-2p-latin-400-normal-BKfmdmKK.woff +0 -0
- spriteforge/app/static/assets/press-start-2p-latin-400-normal-xj9lRvVs.woff2 +0 -0
- spriteforge/app/static/index.html +13 -0
- spriteforge/app/static/press-start-2p-LICENSE.txt +93 -0
- spriteforge/app/studio.py +278 -0
- spriteforge/app/workers.py +73 -0
- spriteforge/cli.py +241 -0
- spriteforge/config.py +193 -0
- spriteforge/config.yaml +157 -0
- spriteforge/core/__init__.py +0 -0
- spriteforge/core/acting.py +16 -0
- spriteforge/core/cost.py +236 -0
- spriteforge/core/credentials.py +24 -0
- spriteforge/core/demo.py +79 -0
- spriteforge/core/forms.py +20 -0
- spriteforge/core/gates.py +175 -0
- spriteforge/core/security.py +42 -0
- spriteforge/core/state.py +222 -0
- spriteforge/core/team.py +15 -0
- spriteforge/core/usage.py +68 -0
- spriteforge/game/__init__.py +0 -0
- spriteforge/game/actors.py +377 -0
- spriteforge/game/agent_tools.py +178 -0
- spriteforge/game/art.py +2097 -0
- spriteforge/game/art_checks.py +190 -0
- spriteforge/game/art_review.py +518 -0
- spriteforge/game/build.py +134 -0
- spriteforge/game/bundle.py +1178 -0
- spriteforge/game/cli.py +119 -0
- spriteforge/game/codegen.py +433 -0
- spriteforge/game/codeinfo.py +154 -0
- spriteforge/game/dbsource.py +137 -0
- spriteforge/game/design.py +342 -0
- spriteforge/game/export.py +62 -0
- spriteforge/game/gamedb.py +191 -0
- spriteforge/game/image_cache.py +61 -0
- spriteforge/game/lessons.py +259 -0
- spriteforge/game/level_gen.py +118 -0
- spriteforge/game/level_preview.py +97 -0
- spriteforge/game/levels.py +934 -0
- spriteforge/game/loops.py +38 -0
- spriteforge/game/menus.py +712 -0
- spriteforge/game/mock_game.js +109 -0
- spriteforge/game/mock_platformer.js +58 -0
- spriteforge/game/motion.py +881 -0
- spriteforge/game/pipeline.py +1768 -0
- spriteforge/game/plan.py +502 -0
- spriteforge/game/playtest.py +318 -0
- spriteforge/game/qa.py +664 -0
- spriteforge/game/qa_checks.py +223 -0
- spriteforge/game/qa_runtime.py +565 -0
- spriteforge/game/reach.py +807 -0
- spriteforge/game/record.py +138 -0
- spriteforge/game/research.py +262 -0
- spriteforge/game/revision.py +225 -0
- spriteforge/game/sdk/API.md +104 -0
- spriteforge/game/sdk/FLOW.md +19 -0
- spriteforge/game/sdk/LEVELS.md +65 -0
- spriteforge/game/sdk/sf.js +418 -0
- spriteforge/game/sdk/sfflow.js +442 -0
- spriteforge/game/sdk/sflevel.js +683 -0
- spriteforge/game/sdk/sfsound-editor.js +225 -0
- spriteforge/game/sdk/sfsound.js +260 -0
- spriteforge/game/sdk/sounds.html +67 -0
- spriteforge/game/sounds.py +793 -0
- spriteforge/game/story.py +188 -0
- spriteforge/game/structure.py +98 -0
- spriteforge/game/team_reports.py +394 -0
- spriteforge/game/tilesets.py +70 -0
- spriteforge/game/title_art.py +186 -0
- spriteforge/genres/__init__.py +0 -0
- spriteforge/library/__init__.py +15 -0
- spriteforge/library/cli.py +126 -0
- spriteforge/library/describe.py +242 -0
- spriteforge/library/looks.py +154 -0
- spriteforge/library/models.py +79 -0
- spriteforge/library/store.py +422 -0
- spriteforge/library/tilesets/README.md +32 -0
- spriteforge/library/tilesets/gandalf-seasons.json +111 -0
- spriteforge/library/tilesets/pixel-crawler-dungeon.json +66 -0
- spriteforge/mcp/__init__.py +0 -0
- spriteforge/mcp/cli.py +58 -0
- spriteforge/mcp/client.py +57 -0
- spriteforge/mcp/filesystem_read.py +32 -0
- spriteforge/mcp/gamedb.py +56 -0
- spriteforge/mcp/library.py +179 -0
- spriteforge/mcp/memory.py +37 -0
- spriteforge/mcp/pixel_tools.py +145 -0
- spriteforge/mcp/registry.py +145 -0
- spriteforge/mcp/service.py +224 -0
- spriteforge/mcp/templates/context7.json +6 -0
- spriteforge/mcp/templates/fetch.json +6 -0
- spriteforge/mcp/templates/filesystem-read.json +6 -0
- spriteforge/mcp/templates/pixel-tools.json +6 -0
- spriteforge/memory/README.md +10 -0
- spriteforge/memory/__init__.py +0 -0
- spriteforge/memory/cli.py +131 -0
- spriteforge/memory/okf/__init__.py +1 -0
- spriteforge/memory/okf/catalog.py +331 -0
- spriteforge/memory/okf/codec.py +63 -0
- spriteforge/memory/okf/git.py +104 -0
- spriteforge/memory/okf/indexes.py +50 -0
- spriteforge/memory/okf/models.py +114 -0
- spriteforge/memory/okf/search.py +53 -0
- spriteforge/memory/okf/seed.py +81 -0
- spriteforge/memory/okf/seeds/genres.yaml +121 -0
- spriteforge/memory/okf/seeds/other.yaml +150 -0
- spriteforge/memory/okf/store.py +402 -0
- spriteforge/memory/okf/validate.py +115 -0
- spriteforge/pixel/__init__.py +17 -0
- spriteforge/pixel/atlas.py +110 -0
- spriteforge/pixel/grid.py +174 -0
- spriteforge/pixel/palette.py +156 -0
- spriteforge/pixel/palettes/dungeon.json +9 -0
- spriteforge/pixel/postprocess.py +170 -0
- spriteforge/pixel/preview.py +40 -0
- spriteforge/pixel/schemas.py +139 -0
- spriteforge/pixel/source.py +237 -0
- spriteforge/pixel/terrain.py +48 -0
- spriteforge/pixel/validate.py +138 -0
- spriteforge/prompts/anim_frame.txt +1 -0
- spriteforge/prompts/character.txt +1 -0
- spriteforge/prompts/item.txt +1 -0
- spriteforge/prompts/tile.txt +1 -0
- spriteforge/prompts/ui.txt +1 -0
- spriteforge/providers/__init__.py +0 -0
- spriteforge/providers/base.py +97 -0
- spriteforge/providers/http.py +38 -0
- spriteforge/providers/mock.py +111 -0
- spriteforge/providers/muse_image.py +60 -0
- spriteforge/providers/muse_search.py +91 -0
- spriteforge/providers/muse_spark.py +66 -0
- spriteforge/skills/__init__.py +0 -0
- spriteforge/skills/builtin/LICENSE-awesome-gamedev-agent-skills.txt +201 -0
- spriteforge/skills/builtin/NOTICE-awesome-gamedev-agent-skills.txt +15 -0
- spriteforge/skills/builtin/THIRD_PARTY.md +21 -0
- spriteforge/skills/builtin/audio-design/SKILL.md +190 -0
- spriteforge/skills/builtin/game-feel/SKILL.md +174 -0
- spriteforge/skills/builtin/game-ui-ux/SKILL.md +167 -0
- spriteforge/skills/builtin/level-design/SKILL.md +169 -0
- spriteforge/skills/builtin/phaser-arcade-physics/SKILL.md +17 -0
- spriteforge/skills/builtin/physics-tuning/SKILL.md +164 -0
- spriteforge/skills/builtin/pixel-art-prompting/SKILL.md +12 -0
- spriteforge/skills/builtin/platformer/SKILL.md +153 -0
- spriteforge/skills/builtin/puzzle/SKILL.md +143 -0
- spriteforge/skills/builtin/sprite-animation-frames/SKILL.md +11 -0
- spriteforge/skills/builtin/tileset-design/SKILL.md +10 -0
- spriteforge/skills/catalog.py +200 -0
- spriteforge/skills/cli.py +41 -0
- spriteforge/stages/__init__.py +0 -0
- spriteforge/stages/asset_context.py +301 -0
- spriteforge/stages/asset_models.py +192 -0
- spriteforge/stages/asset_render.py +366 -0
- spriteforge/stages/asset_review.py +140 -0
- spriteforge/stages/asset_store.py +94 -0
- spriteforge/stages/chat_changes.py +236 -0
- spriteforge/stages/concept.py +42 -0
- spriteforge/stages/game.py +1699 -0
- spriteforge/stages/game_confirm.py +112 -0
- spriteforge/stages/game_final.py +220 -0
- spriteforge/stages/game_record.py +246 -0
- spriteforge/stages/gameplay.py +218 -0
- spriteforge/stages/intake.py +372 -0
- spriteforge/stages/preview_assets.py +212 -0
- spriteforge/stages/preview_models.py +167 -0
- spriteforge/stages/preview_render.py +169 -0
- spriteforge/stages/preview_repair.py +61 -0
- spriteforge/stages/preview_review.py +169 -0
- spriteforge/stages/production.py +170 -0
- spriteforge/stages/references.py +105 -0
- spriteforge/stages/rewind.py +128 -0
- spriteforge/stages/workflow.py +440 -0
- spriteforge/templates/phaser/audit.js +45 -0
- spriteforge/templates/phaser/font.png +0 -0
- spriteforge/templates/phaser/font.xml +1 -0
- spriteforge/templates/phaser/preview.html +9 -0
- spriteforge/templates/phaser/room.js +49 -0
- spriteforge/templates/phaser/vendor/LICENSE.md +20 -0
- spriteforge/templates/phaser/vendor/phaser.min.js +1 -0
- spriteforge-0.1.1.dist-info/METADATA +364 -0
- spriteforge-0.1.1.dist-info/RECORD +218 -0
- spriteforge-0.1.1.dist-info/WHEEL +5 -0
- spriteforge-0.1.1.dist-info/entry_points.txt +2 -0
- spriteforge-0.1.1.dist-info/licenses/LICENSE +27 -0
- spriteforge-0.1.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""In-memory BM25: no embeddings, model calls, or persistent search database."""
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
import re
|
|
5
|
+
from collections import Counter
|
|
6
|
+
|
|
7
|
+
from .models import Entry
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def terms(text: str) -> list[str]:
|
|
11
|
+
return re.findall(r"\w+", text.casefold())
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def rank(query: str, entries: list[Entry]) -> list[tuple[Entry, float]]:
|
|
15
|
+
documents = [
|
|
16
|
+
Counter(terms(" ".join([e.title] * 3 + e.metadata.tags * 2 + [e.body]))) for e in entries
|
|
17
|
+
]
|
|
18
|
+
lengths = [sum(d.values()) for d in documents]
|
|
19
|
+
average = sum(lengths) / max(len(entries), 1) or 1
|
|
20
|
+
scores = [0.0] * len(entries)
|
|
21
|
+
for term in set(terms(query)):
|
|
22
|
+
df = sum(term in document for document in documents)
|
|
23
|
+
idf = math.log(1 + (len(entries) - df + 0.5) / (df + 0.5))
|
|
24
|
+
for i, document in enumerate(documents):
|
|
25
|
+
freq = document[term]
|
|
26
|
+
scores[i] += idf * freq * 2.5 / (freq + 1.5 * (0.25 + 0.75 * lengths[i] / average))
|
|
27
|
+
return sorted(
|
|
28
|
+
[(entry, score) for entry, score in zip(entries, scores, strict=True) if score > 0],
|
|
29
|
+
key=lambda row: (-row[1], row[0].id),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def token_cost(text: str) -> int:
|
|
34
|
+
# Conservative tokenizer-independent ceiling: at most one token per UTF-8 byte.
|
|
35
|
+
# Budgets are strict for this accounting, rather than pretending to know a model tokenizer.
|
|
36
|
+
return len(text.encode("utf-8"))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def sentence_excerpt(text: str, allowance: int) -> str:
|
|
40
|
+
"""Keep complete sentences; reserve an explicit marker when anything is omitted."""
|
|
41
|
+
if token_cost(text) <= allowance:
|
|
42
|
+
return text
|
|
43
|
+
marker = "..."
|
|
44
|
+
if allowance < token_cost(marker):
|
|
45
|
+
return ""
|
|
46
|
+
parts = re.split(r"(?<=[.!?])\s+", text.strip())
|
|
47
|
+
kept = []
|
|
48
|
+
for part in parts:
|
|
49
|
+
candidate = "\n".join([*kept, part, marker])
|
|
50
|
+
if token_cost(candidate) > allowance:
|
|
51
|
+
break
|
|
52
|
+
kept.append(part)
|
|
53
|
+
return "\n".join([*kept, marker])
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
import yaml
|
|
4
|
+
|
|
5
|
+
from .models import Entry, GenreSeed, Metadata
|
|
6
|
+
from .store import KnowledgeStore
|
|
7
|
+
|
|
8
|
+
BOOTSTRAP_SOURCE = {
|
|
9
|
+
"resource": "Project owner Milestone 3 bootstrap instructions, 2026-10-28",
|
|
10
|
+
"title": "Owner-authorized seed library and trust designation",
|
|
11
|
+
"author": "human:project-owner",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def seed_entries() -> list[Entry]:
|
|
16
|
+
directory = Path(__file__).with_name("seeds")
|
|
17
|
+
entries = []
|
|
18
|
+
for values in yaml.safe_load((directory / "genres.yaml").read_text(encoding="utf-8")):
|
|
19
|
+
genre = GenreSeed.model_validate(values)
|
|
20
|
+
body = (
|
|
21
|
+
f"# Perspective and camera\n{genre.perspective}\n\n# Controls\n{genre.controls}\n\n"
|
|
22
|
+
f"# Core mechanics template\n{genre.mechanics}\n\n# Typical entities\n"
|
|
23
|
+
+ ", ".join(genre.entities)
|
|
24
|
+
+ "\n\n# Recommended sizes\n"
|
|
25
|
+
"16x16 tiles; 48x48 character canvases; subjects fit within about 40x40 logical pixels.\n\n"
|
|
26
|
+
f"# Palette suggestions\n{genre.palette}\n\n# Asset checklist\n\n| Asset | Count |\n|---|---:|\n"
|
|
27
|
+
+ "".join(f"| {asset} | {count} |\n" for asset, count in genre.assets.items())
|
|
28
|
+
+ f"\n# Animation needs\n{genre.animations}\n\n# Common pitfalls\n"
|
|
29
|
+
+ "".join(f"* {pitfall}\n" for pitfall in genre.pitfalls)
|
|
30
|
+
+ "\n# Adaptive questions\n"
|
|
31
|
+
+ "".join(f"{i}. {question}\n" for i, question in enumerate(genre.questions, 1))
|
|
32
|
+
)
|
|
33
|
+
entries.append(
|
|
34
|
+
Entry(
|
|
35
|
+
id="genres/" + genre.id,
|
|
36
|
+
metadata=Metadata(
|
|
37
|
+
type="Genre Template",
|
|
38
|
+
title=genre.title,
|
|
39
|
+
description=genre.mechanics,
|
|
40
|
+
tags=[genre.id, "genre", "game-design"],
|
|
41
|
+
sources=[BOOTSTRAP_SOURCE],
|
|
42
|
+
),
|
|
43
|
+
body=body,
|
|
44
|
+
)
|
|
45
|
+
)
|
|
46
|
+
for values in yaml.safe_load((directory / "other.yaml").read_text(encoding="utf-8")):
|
|
47
|
+
values["metadata"].setdefault("sources", []).append(BOOTSTRAP_SOURCE)
|
|
48
|
+
entries.append(Entry.model_validate(values))
|
|
49
|
+
for entry in entries:
|
|
50
|
+
entry.metadata.model_extra["x-spriteforge-review"] = "unreviewed"
|
|
51
|
+
return entries
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def seed(store: KnowledgeStore) -> int:
|
|
55
|
+
present, _ = store.scan()
|
|
56
|
+
existing = {entry.id for entry in present}
|
|
57
|
+
missing = [entry for entry in seed_entries() if entry.id not in existing]
|
|
58
|
+
legacy = [
|
|
59
|
+
entry
|
|
60
|
+
for entry in present
|
|
61
|
+
if entry.id in {e.id for e in seed_entries()}
|
|
62
|
+
and BOOTSTRAP_SOURCE in [s.model_dump(exclude_none=True) for s in entry.metadata.sources]
|
|
63
|
+
and "x-spriteforge-review" not in entry.metadata.model_extra
|
|
64
|
+
]
|
|
65
|
+
for entry in legacy:
|
|
66
|
+
entry.metadata.model_extra["x-spriteforge-review"] = "unreviewed"
|
|
67
|
+
if legacy:
|
|
68
|
+
store.write_batch(
|
|
69
|
+
legacy,
|
|
70
|
+
"Clarify bootstrap review designation",
|
|
71
|
+
verified_by="human:project-owner",
|
|
72
|
+
preserve_generation=True,
|
|
73
|
+
)
|
|
74
|
+
if missing:
|
|
75
|
+
store.write_batch(
|
|
76
|
+
missing,
|
|
77
|
+
f"Seed {sum(e.id.startswith('genres/') for e in seed_entries())} genres, "
|
|
78
|
+
"4 art styles, 4 Phaser patterns and Muse prompt pattern",
|
|
79
|
+
verified_by="human:project-owner",
|
|
80
|
+
)
|
|
81
|
+
return len(missing)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
- id: top-down-dungeon-crawler
|
|
2
|
+
title: Top-down dungeon crawler
|
|
3
|
+
perspective: Three-quarter top-down, room camera with restrained follow and visible exits.
|
|
4
|
+
controls: WASD or arrows to move; Space to attack; E to interact; Escape to pause.
|
|
5
|
+
mechanics: Enter a room, read enemy telegraphs, fight, collect a key or reward, unlock the exit, and defeat a compact boss.
|
|
6
|
+
entities: [hero, melee slime, ranged enemy, boss, key, chest, door, breakable pot]
|
|
7
|
+
palette: Dungeon neutrals with green enemies and amber rewards; reserve red for danger.
|
|
8
|
+
assets: {hero: 1, enemies: 3, boss: 1, floor-tiles: 4, wall-tiles: 6, props: 4, items: 4, ui: 6}
|
|
9
|
+
animations: Hero idle/walk/attack/hurt/death; enemy idle/move/attack/hurt; door open and item pickup.
|
|
10
|
+
pitfalls: [Occluded exits, Inconsistent collision feet, Unreadable attacks, Keys behind their own locked door]
|
|
11
|
+
questions: ["If combat is central, melee or ranged?", "If exploration matters, fixed rooms or a connected maze?", "Should failure restart the room or the whole run?", "If loot is included, what changes the player's choices?", "How long should one dungeon take?", "Which input devices must work?"]
|
|
12
|
+
- id: side-scrolling-platformer
|
|
13
|
+
title: Side-scrolling platformer
|
|
14
|
+
perspective: Side-on orthographic camera with forward lookahead and a stable vertical dead zone.
|
|
15
|
+
controls: Left/right or A/D to move; Space to jump; optional Shift to dash; Escape to pause.
|
|
16
|
+
mechanics: Traverse platforms, learn one movement ability, avoid hazards, collect optional rewards, reach a clear exit.
|
|
17
|
+
entities: [runner, patrolling enemy, moving platform, spikes, checkpoint, collectible, exit]
|
|
18
|
+
palette: Separate foreground collision surfaces from a lower-contrast background; warm collectibles.
|
|
19
|
+
assets: {hero: 1, enemies: 2, terrain-tiles: 10, platforms: 3, hazards: 3, props: 4, items: 3, ui: 5}
|
|
20
|
+
animations: Idle/run/jump/fall/land/hurt; enemy walk; checkpoint activate; collectible loop.
|
|
21
|
+
pitfalls: [Hidden landing zones, Slippery movement, Camera-induced jumps, Missing coyote time, Unclear one-way platforms]
|
|
22
|
+
questions: ["If jumping is the focus, precision or forgiving movement?", "Should held jump change height?", "If a dash exists, where is it first taught safely?", "Do checkpoints reset enemies?", "If secrets matter, how are they signposted?", "Should the camera scroll vertically too?"]
|
|
23
|
+
- id: shmup
|
|
24
|
+
title: Scrolling shmup
|
|
25
|
+
perspective: Vertical top-down scrolling with fixed player bounds and telegraphed incoming waves.
|
|
26
|
+
controls: WASD or arrows to fly; hold Space to shoot; optional slow-focus and bomb buttons.
|
|
27
|
+
mechanics: Dodge readable projectile patterns, clear waves, collect upgrades, survive a short boss phase.
|
|
28
|
+
entities: [player ship, scout, turret ship, boss, player bullet, enemy bullet, powerup, explosion]
|
|
29
|
+
palette: Dark low-detail field; distinct player shots, enemy shots, and pickups with strong luminance contrast.
|
|
30
|
+
assets: {player: 1, enemies: 3, boss: 1, backgrounds: 3, projectiles: 5, pickups: 3, effects: 4, ui: 6}
|
|
31
|
+
animations: Ship thrust; enemy damage flash; explosion frames; boss phase transitions; pickup pulse.
|
|
32
|
+
pitfalls: [Bullets hidden by effects, Ambiguous hitbox, Unbounded projectile growth, Spawn-on-player attacks]
|
|
33
|
+
questions: ["If bullet density is high, should a focus key slow movement?", "Vertical or horizontal scrolling?", "If upgrades are lost on death, how can the player recover?", "How many lives or continues?", "Should shooting be automatic?", "If a boss is present, what pattern teaches its rules?"]
|
|
34
|
+
- id: roguelike
|
|
35
|
+
title: Turn-based roguelike
|
|
36
|
+
perspective: Top-down grid camera with visible explored tiles and explicit turn state.
|
|
37
|
+
controls: Arrows or WASD move one cell; Space waits; E interacts; number keys choose items.
|
|
38
|
+
mechanics: Move or act once per turn, reveal rooms, manage resources, choose upgrades, and reach a deeper-floor exit.
|
|
39
|
+
entities: [adventurer, melee monster, ranged monster, stairs, potion, trap, chest, locked door]
|
|
40
|
+
palette: Muted stone with strong actor contrast; distinguish explored, unseen, and visible areas.
|
|
41
|
+
assets: {hero: 1, enemies: 4, terrain-tiles: 8, props: 4, items: 6, effects: 2, ui: 6}
|
|
42
|
+
animations: Short idle/move/attack/hit frames; turn indicator; reveal and death effects; no timing-based input required.
|
|
43
|
+
pitfalls: [Inconsistent turn costs, Unavoidable damage, Unexplained procedural failures, Item overload]
|
|
44
|
+
questions: ["Is each action strictly turn-based?", "If maps are random, which reachability guarantees must hold?", "Does death erase the run or retain progress?", "If hunger exists, what decision does it improve?", "How much information about enemies is visible?", "Should generated floors be reproducible independently of image generation?"]
|
|
45
|
+
- id: farming-life-sim
|
|
46
|
+
title: Farming and life sim
|
|
47
|
+
perspective: Three-quarter top-down camera over a small homestead with readable interaction tiles.
|
|
48
|
+
controls: WASD or arrows to move; E to interact; number keys select tools; optional mouse targeting.
|
|
49
|
+
mechanics: Prepare soil, plant, water, advance a day, harvest, sell, and choose a modest farm upgrade.
|
|
50
|
+
entities: [farmer, shopkeeper, crop, soil plot, water source, shipping box, fence, bed]
|
|
51
|
+
palette: Earthy browns and greens with distinct crop stages; daylight changes must preserve UI contrast.
|
|
52
|
+
assets: {farmer: 1, npc: 2, soil-tiles: 4, crop-stages: 8, tools: 4, props: 6, ui: 6}
|
|
53
|
+
animations: Farmer idle/walk/tool use; crop growth stages; watering effect; NPC idle/walk; day transition.
|
|
54
|
+
pitfalls: [Chores without choices, Invisible tool range, Unclear day rollover, Excessive waiting]
|
|
55
|
+
questions: ["If time advances, real-time or sleeping to the next day?", "Is the focus crops, relationships, or decorating?", "If energy is limited, what makes spending it interesting?", "How many crop types fit the first build?", "Should missed watering destroy a crop or delay it?", "If NPC schedules exist, must they be simulated or scripted?"]
|
|
56
|
+
- id: world-building
|
|
57
|
+
title: World building and sandbox
|
|
58
|
+
perspective: Three-quarter top-down camera over an open map where the player gathers resources and places structures on a readable grid.
|
|
59
|
+
controls: WASD or arrows to move; Space uses the tool on the tile in front; X places the selected structure.
|
|
60
|
+
mechanics: Gather wood and stone from the world, place huts, fences and paths on free tiles, grow a small settlement, and meet a building goal.
|
|
61
|
+
entities: [builder, tree, rock, resource pile, hut, fence, path, villager, animal]
|
|
62
|
+
palette: Natural greens and earth tones; placed structures must contrast with terrain and show where they can go.
|
|
63
|
+
assets: {builder: 1, villager: 2, terrain-tiles: 6, resources: 4, structures: 6, props: 6, ui: 6}
|
|
64
|
+
animations: Builder idle/walk/tool swing; tree and rock hit shake; structure placement pop; villager idle/walk.
|
|
65
|
+
pitfalls: [Placement without feedback, Resource grind without goals, Unreadable occupied tiles, Too many structure types at once]
|
|
66
|
+
questions: ["What does the player build first, and what does it unlock?", "Which resources exist, and where do they come from?", "Is there a goal (population, buildings, coins) or is it pure sandbox?", "Can structures be removed or moved once placed?", "Are there villagers or animals living in the world?", "How large should the first map be?"]
|
|
67
|
+
- id: puzzle
|
|
68
|
+
title: Grid puzzle
|
|
69
|
+
perspective: Fixed top-down board with all relevant state visible and no camera movement.
|
|
70
|
+
controls: Arrows or WASD select/move; Space confirms; Z undoes; R restarts.
|
|
71
|
+
mechanics: Teach one rule, combine it in a small board, provide reversible experimentation, and detect a clear solved state.
|
|
72
|
+
entities: [cursor or avatar, movable block, goal, wall, switch, gate]
|
|
73
|
+
palette: Few high-contrast role colors; duplicate color meaning with shapes for accessibility.
|
|
74
|
+
assets: {avatar: 1, blocks: 4, board-tiles: 6, goals: 3, switches: 3, gates: 3, effects: 2, ui: 6}
|
|
75
|
+
animations: Move/slide; switch on/off; gate open; success feedback; animations never determine puzzle correctness.
|
|
76
|
+
pitfalls: [Unrecoverable softlocks, Hidden rules, Color-only clues, Undo losing state]
|
|
77
|
+
questions: ["What single rule should the first puzzle teach?", "If blocks can be pushed, can they also be pulled?", "Must every move be undoable?", "If there are multiple solutions, does move count matter?", "How are locked or invalid moves communicated?", "Should puzzles be authored or generated and solver-checked?"]
|
|
78
|
+
- id: metroidvania
|
|
79
|
+
title: Metroidvania exploration map
|
|
80
|
+
perspective: Side-scrolling room camera with a persistent connected map and marked room transitions.
|
|
81
|
+
controls: A/D or arrows move; Space jumps; attack button; E interacts; M opens the map.
|
|
82
|
+
mechanics: Explore a connected map, discover an ability gate, gain the matching traversal power, backtrack through a shortcut, and unlock a new region.
|
|
83
|
+
entities: [explorer, patrol enemy, flying enemy, ability pickup, locked gate, save station, map marker, boss]
|
|
84
|
+
palette: Region-specific hue accents within one global palette; ability gates need consistent visual coding.
|
|
85
|
+
assets: {hero: 1, enemies: 3, terrain-tiles: 10, gates: 3, map-icons: 4, pickups: 3, props: 3, ui: 5}
|
|
86
|
+
animations: Idle/run/jump/fall/attack/hurt; ability-specific dash or climb; gate activation; save station.
|
|
87
|
+
pitfalls: [Ability-gate softlocks, Backtracking without shortcuts, Unreadable map connections, Required paths mistaken for secrets]
|
|
88
|
+
questions: ["If the map branches, which branch is initially reachable?", "What first traversal ability changes the map?", "If backtracking is required, which shortcut rewards it?", "Should the map reveal rooms, exits, or item hints?", "Can any gate be crossed in an unintended order?", "If bosses lock progression, where is the nearby save point?", "How many interconnected rooms fit this build?"]
|
|
89
|
+
- id: tower-defense
|
|
90
|
+
title: Tower defense
|
|
91
|
+
perspective: Fixed top-down map with a clear enemy path, buildable cells, and visible ranges.
|
|
92
|
+
controls: Mouse selects and places towers; keyboard shortcuts choose tower type; Space starts a wave.
|
|
93
|
+
mechanics: Inspect a path, place a small tower roster, start a wave, earn currency, upgrade, and protect a base.
|
|
94
|
+
entities: [basic tower, splash tower, slow tower, runner, armored enemy, base, projectile]
|
|
95
|
+
palette: Neutral build terrain, clear path edges, distinct enemy silhouettes and projectile roles.
|
|
96
|
+
assets: {towers: 3, enemies: 4, terrain-tiles: 8, projectiles: 4, base: 1, effects: 4, ui: 7}
|
|
97
|
+
animations: Tower fire/reload; enemy walk/hit/death; range preview; placement valid/invalid; base damage.
|
|
98
|
+
pitfalls: [Blocking all paths, Invisible tower range, Economy snowball, Too many simultaneous effects]
|
|
99
|
+
questions: ["Is the path fixed or shaped by placement?", "If towers can block paths, how will path validity be enforced?", "What makes each tower useful?", "Can towers be sold between waves?", "If waves are timed, can the user pause planning?", "How many waves form a complete short game?"]
|
|
100
|
+
- id: beat-em-up
|
|
101
|
+
title: Side-scrolling beat-em-up
|
|
102
|
+
perspective: Side-facing art on a shallow top-down movement plane; camera advances after each arena clears.
|
|
103
|
+
controls: Left/right and up/down move on the ground plane; attack, jump, and optional special buttons.
|
|
104
|
+
mechanics: Enter an arena, manage spacing, read enemy windups, use a short combo, collect recovery, and clear the arena gate.
|
|
105
|
+
entities: [fighter, grunt, ranged foe, heavy foe, boss, pickup, crate, exit barrier]
|
|
106
|
+
palette: Strong character/background separation; consistent shadows anchor feet to the ground plane.
|
|
107
|
+
assets: {fighter: 1, enemies: 3, boss: 1, ground-tiles: 5, backdrop-tiles: 4, props: 5, items: 3, ui: 6}
|
|
108
|
+
animations: Idle/walk/jab/combo finisher/hurt/knockdown; enemy windup; impact effects; boss attack states.
|
|
109
|
+
pitfalls: [Wrong depth sorting, Unclear attack lane, Stunlock loops, Attacks without readable anticipation]
|
|
110
|
+
questions: ["If there is lane movement, how wide is an attack's depth range?", "One attack button or separate light/heavy attacks?", "Can the player escape repeated hits?", "If jumping exists, is it movement or attack timing?", "How many enemies should attack at once?", "Should the first build support local co-op or stay single-player?"]
|
|
111
|
+
- id: top-down-racer
|
|
112
|
+
title: Top-down racer
|
|
113
|
+
perspective: Top-down follow camera with lookahead along velocity and visible upcoming turns.
|
|
114
|
+
controls: Arrows or WASD steer, accelerate, and brake; optional handbrake; R resets to track.
|
|
115
|
+
mechanics: Learn steering, follow checkpoints in order, complete a lap, compare time, and restart quickly.
|
|
116
|
+
entities: [player car, rival car, track, checkpoint, barrier, boost pickup, finish line]
|
|
117
|
+
palette: Asphalt and grass separate from cars; checkpoints and hazards remain readable at speed.
|
|
118
|
+
assets: {cars: 3, track-tiles: 12, barriers: 4, props: 4, pickups: 2, effects: 3, ui: 5}
|
|
119
|
+
animations: Car directions or rotation policy; tire smoke; boost and skid effects; countdown; finish feedback.
|
|
120
|
+
pitfalls: [Skipping checkpoints, Invisible collision edges, Camera lag at turns, Drift without recovery]
|
|
121
|
+
questions: ["Arcade steering or momentum-heavy drifting?", "If pixel cars rotate, are rotations discrete or continuous?", "Time trial or opponents?", "Should going off-track slow the car or reset it?", "How many checkpoints prevent shortcut exploits?", "If tracks are generated, how is a driveable loop guaranteed?"]
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
- id: art-styles/dungeon-muted
|
|
2
|
+
metadata:
|
|
3
|
+
type: Art Style
|
|
4
|
+
title: Muted dungeon pixel art
|
|
5
|
+
description: Restrained stone colors with readable green actors and amber loot.
|
|
6
|
+
tags: [pixel-art, dungeon, palette, contrast]
|
|
7
|
+
body: |
|
|
8
|
+
# Rules
|
|
9
|
+
Use one 16-color palette: near-black outline, four stone shades, greens for monsters,
|
|
10
|
+
amber for items, red for damage, and one cool magical accent. Keep lighting at top-left.
|
|
11
|
+
Use 16x16 tiles and 48x48 character canvases; silhouettes should fit within about
|
|
12
|
+
40x40 logical pixels. Use 3/4 top-down perspective and nearest-neighbor previews.
|
|
13
|
+
No anti-aliasing, gradients, text, watermark, or background texture in raw sprite prompts.
|
|
14
|
+
# Validation
|
|
15
|
+
Palette compliance and binary alpha are hard checks. Dark silhouette boundaries
|
|
16
|
+
should not receive a doubled outline. Preserve native source-grid proportions.
|
|
17
|
+
- id: art-styles/bright-adventure
|
|
18
|
+
metadata:
|
|
19
|
+
type: Art Style
|
|
20
|
+
title: Bright adventure pixel art
|
|
21
|
+
description: Cheerful colors with separate terrain, actor, reward, and danger roles.
|
|
22
|
+
tags: [pixel-art, adventure, platformer, farming]
|
|
23
|
+
body: |
|
|
24
|
+
# Rules
|
|
25
|
+
Start with 16 colors: navy outline, three warm earth shades, three leaf greens,
|
|
26
|
+
sky blues, cream highlights, orange rewards, and a reserved red danger accent.
|
|
27
|
+
Flat shading should use two or three value steps per material. Avoid color-only
|
|
28
|
+
puzzle clues. Use 16x16 tiles and 48x48 characters containing at most about 40x40 art.
|
|
29
|
+
# Validation
|
|
30
|
+
Check silhouettes at native resolution, uniform top-left light, no gradients,
|
|
31
|
+
and a stable background-free palette across every animation state.
|
|
32
|
+
- id: art-styles/limited-monochrome
|
|
33
|
+
metadata:
|
|
34
|
+
type: Art Style
|
|
35
|
+
title: Limited monochrome pixel art
|
|
36
|
+
description: Four distinct luminance steps with shape-led gameplay readability.
|
|
37
|
+
tags: [pixel-art, monochrome, readability, puzzle]
|
|
38
|
+
body: |
|
|
39
|
+
# Rules
|
|
40
|
+
Use #101820, #486858, #90A880, and #E0E8B0 as a four-color starting palette.
|
|
41
|
+
Assign the darkest color to outline and collision edges. Prefer solid clusters
|
|
42
|
+
over dithering so small animations remain stable. Tiles are 16x16; character
|
|
43
|
+
canvases are 48x48 with about 40x40 logical artwork.
|
|
44
|
+
# Validation
|
|
45
|
+
Require at most four visible colors and binary alpha. Convey hazards with
|
|
46
|
+
silhouette, motion, and placement as well as value. Reject one-pixel clutter.
|
|
47
|
+
- id: art-styles/night-neon
|
|
48
|
+
metadata:
|
|
49
|
+
type: Art Style
|
|
50
|
+
title: Night neon pixel art
|
|
51
|
+
description: Dark readable geometry with sparse cyan and amber gameplay accents.
|
|
52
|
+
tags: [pixel-art, neon, shmup, racer]
|
|
53
|
+
body: |
|
|
54
|
+
# Rules
|
|
55
|
+
Use a 16-color palette with dark blue-gray surfaces, cyan player accents, amber
|
|
56
|
+
pickups, and red threats. Keep luminous effects as discrete palette bands;
|
|
57
|
+
never request blurred glows on sprites. Default to 16x16 tiles and 48x48 actor
|
|
58
|
+
canvases with logical subjects bounded near 40x40.
|
|
59
|
+
# Validation
|
|
60
|
+
Keep backgrounds lower contrast than projectiles. Review dark-color tint warnings
|
|
61
|
+
before accepting a palette: a deliberate blue outline is different from key spill.
|
|
62
|
+
- id: engine-patterns/phaser-scenes
|
|
63
|
+
metadata:
|
|
64
|
+
type: Engine Pattern
|
|
65
|
+
title: Phaser boot, play, and UI scenes
|
|
66
|
+
description: Separate asset loading, gameplay state, and HUD lifetime in a small fixed scaffold.
|
|
67
|
+
tags: [phaser, scenes, lifecycle, input]
|
|
68
|
+
sources:
|
|
69
|
+
- resource: https://docs.phaser.io/phaser/concepts/scenes
|
|
70
|
+
title: Phaser scene lifecycle
|
|
71
|
+
body: |
|
|
72
|
+
# Pattern
|
|
73
|
+
Load the atlas in a boot scene, create game state and actors in a play scene,
|
|
74
|
+
and keep HUD rendering in a lightweight UI scene. Register scene-specific
|
|
75
|
+
input and event listeners once, and remove them on shutdown or restart.
|
|
76
|
+
# Checks
|
|
77
|
+
Restart twice and check for duplicate listeners, timers, and actors. Avoid
|
|
78
|
+
sharing mutable level state across scene restarts unless explicitly intended.
|
|
79
|
+
Phaser scaffolding stays fixed; future code generation fills game-logic hooks.
|
|
80
|
+
- id: engine-patterns/phaser-actor-collisions
|
|
81
|
+
metadata:
|
|
82
|
+
type: Engine Pattern
|
|
83
|
+
title: Phaser actor collision feet and depth
|
|
84
|
+
description: Use small ground-footprint colliders independently of tall visual sprites.
|
|
85
|
+
tags: [phaser, collisions, top-down, depth, hitbox]
|
|
86
|
+
body: |
|
|
87
|
+
# Pattern
|
|
88
|
+
Represent each top-down actor with a small collision footprint at its feet,
|
|
89
|
+
independently of its 48x48 image canvas. Sort visible actors by ground Y.
|
|
90
|
+
Use 16x16 wall tiles as collision geometry. Keep damage hitboxes separate from
|
|
91
|
+
movement collision and disable repeated damage during a short invulnerability state.
|
|
92
|
+
# Checks
|
|
93
|
+
Test walking past a chest, behind a tall prop, and through a doorway. A sprite
|
|
94
|
+
outline or transparent image margin must not expand its physical footprint.
|
|
95
|
+
- id: engine-patterns/phaser-atlas-animations
|
|
96
|
+
metadata:
|
|
97
|
+
type: Engine Pattern
|
|
98
|
+
title: Phaser atlas animation frame keys
|
|
99
|
+
description: Build animation sequences from actual packed atlas keys rather than guessed filenames.
|
|
100
|
+
tags: [phaser, atlas, animation, frames]
|
|
101
|
+
sources:
|
|
102
|
+
- resource: https://docs.phaser.io/phaser/concepts/animations
|
|
103
|
+
title: Phaser animation frame sequences
|
|
104
|
+
body: |
|
|
105
|
+
# Pattern
|
|
106
|
+
Keep frame keys such as hero/idle/0 and hero/walk/1 unchanged in atlas.json.
|
|
107
|
+
Read sequence order from the packer's meta.animations map and create animation
|
|
108
|
+
definitions in scene logic using those actual keys. Metadata alone does not
|
|
109
|
+
start a Phaser animation. Use the same canvas and palette across frames.
|
|
110
|
+
# Checks
|
|
111
|
+
Validate every referenced frame key before starting the scene. Exercise idle,
|
|
112
|
+
movement, attack, and restart; fail headless tests on missing textures.
|
|
113
|
+
- id: engine-patterns/phaser-room-map
|
|
114
|
+
metadata:
|
|
115
|
+
type: Engine Pattern
|
|
116
|
+
title: Phaser room map and ability gates
|
|
117
|
+
description: Model interconnected rooms as a graph and keep traversal gates deterministic.
|
|
118
|
+
tags: [phaser, map, metroidvania, gates, reachability]
|
|
119
|
+
body: |
|
|
120
|
+
# Pattern
|
|
121
|
+
Store room IDs and exits as data, and track visited rooms and acquired abilities
|
|
122
|
+
separately from rendered tile layers. Before generating a connected exploration
|
|
123
|
+
map, verify that the starting room reaches an ability pickup without that same
|
|
124
|
+
ability. Unlock a gate by updating state, not by modifying collision in several places.
|
|
125
|
+
# Checks
|
|
126
|
+
Test reachability before and after each ability, reciprocal room transitions,
|
|
127
|
+
map marker persistence, and a route back to a checkpoint after an upgrade.
|
|
128
|
+
- id: prompt-patterns/muse-pixel-sprite
|
|
129
|
+
metadata:
|
|
130
|
+
type: Prompt Pattern
|
|
131
|
+
title: Pixel sprite prompting for Muse Image
|
|
132
|
+
description: Constrain one centered subject and a flat key background before deterministic processing.
|
|
133
|
+
tags: [muse-image, prompt, sprite, pixel-art, magenta]
|
|
134
|
+
x-spriteforge-scores:
|
|
135
|
+
status: unmeasured
|
|
136
|
+
style_match: null
|
|
137
|
+
readability: null
|
|
138
|
+
note: No scored asset-production run has occurred; connectivity success is not an art score.
|
|
139
|
+
body: |
|
|
140
|
+
# Template
|
|
141
|
+
One single centered full-body SUBJECT. Chunky pixel art on a flat solid magenta
|
|
142
|
+
background. The subject fits within approximately 40x40 logical pixels on a
|
|
143
|
+
48x48 character canvas. Consistent top-left light and one dark silhouette outline.
|
|
144
|
+
Match the approved palette and anchor. No text, watermark, border, extra subjects,
|
|
145
|
+
detached decoration, anti-aliasing, gradients, or background texture.
|
|
146
|
+
# Evidence and limits
|
|
147
|
+
The 2026-10-28 live smoke check confirmed generation and editing connectivity;
|
|
148
|
+
its vision result named the edited slime a jellyfish. This prompt remains a
|
|
149
|
+
bootstrap pattern, not a claim of proven semantic consistency. Store measured
|
|
150
|
+
critic scores in x-spriteforge-scores after asset production, not fabricated scores.
|