c64-kb 0.17.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 +2082 -0
- package/LICENSE +29 -0
- package/README.md +559 -0
- package/VERSION +25 -0
- package/dist/cli/setup.js +66 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli-memorize-audit.js +97 -0
- package/dist/cli-memorize-audit.js.map +1 -0
- package/dist/cli.js +335 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +83 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +53 -0
- package/dist/context.js.map +1 -0
- package/dist/domain/budget-notes.js +104 -0
- package/dist/domain/budget-notes.js.map +1 -0
- package/dist/domain/budget.js +417 -0
- package/dist/domain/budget.js.map +1 -0
- package/dist/domain/game-design.js +77 -0
- package/dist/domain/game-design.js.map +1 -0
- package/dist/domain/timing.js +39 -0
- package/dist/domain/timing.js.map +1 -0
- package/dist/graph/apply.js +132 -0
- package/dist/graph/apply.js.map +1 -0
- package/dist/graph/claims.js +231 -0
- package/dist/graph/claims.js.map +1 -0
- package/dist/graph/extract/archetype.js +118 -0
- package/dist/graph/extract/archetype.js.map +1 -0
- package/dist/graph/extract/common.js +69 -0
- package/dist/graph/extract/common.js.map +1 -0
- package/dist/graph/extract/failure.js +37 -0
- package/dist/graph/extract/failure.js.map +1 -0
- package/dist/graph/extract/game-design.js +189 -0
- package/dist/graph/extract/game-design.js.map +1 -0
- package/dist/graph/extract/hardware.js +124 -0
- package/dist/graph/extract/hardware.js.map +1 -0
- package/dist/graph/extract/pitfall.js +62 -0
- package/dist/graph/extract/pitfall.js.map +1 -0
- package/dist/graph/extract/raster-band.js +56 -0
- package/dist/graph/extract/raster-band.js.map +1 -0
- package/dist/graph/extract/recipe.js +71 -0
- package/dist/graph/extract/recipe.js.map +1 -0
- package/dist/graph/extract/technique-entities.js +180 -0
- package/dist/graph/extract/technique-entities.js.map +1 -0
- package/dist/graph/extract/technique.js +179 -0
- package/dist/graph/extract/technique.js.map +1 -0
- package/dist/graph/extract/toolchain.js +67 -0
- package/dist/graph/extract/toolchain.js.map +1 -0
- package/dist/graph/extract/types.js +3 -0
- package/dist/graph/extract/types.js.map +1 -0
- package/dist/graph/extract/vocabulary.js +65 -0
- package/dist/graph/extract/vocabulary.js.map +1 -0
- package/dist/graph/extract.js +43 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/kernal-clobbers.js +64 -0
- package/dist/graph/kernal-clobbers.js.map +1 -0
- package/dist/graph/machine-variants.js +208 -0
- package/dist/graph/machine-variants.js.map +1 -0
- package/dist/ingest/files.js +99 -0
- package/dist/ingest/files.js.map +1 -0
- package/dist/ingest/passes.js +104 -0
- package/dist/ingest/passes.js.map +1 -0
- package/dist/ingest/points.js +50 -0
- package/dist/ingest/points.js.map +1 -0
- package/dist/ingest/report.js +140 -0
- package/dist/ingest/report.js.map +1 -0
- package/dist/ingest/tally.js +81 -0
- package/dist/ingest/tally.js.map +1 -0
- package/dist/ingest/verified-on.js +43 -0
- package/dist/ingest/verified-on.js.map +1 -0
- package/dist/ingest.js +135 -0
- package/dist/ingest.js.map +1 -0
- package/dist/schemas/cost-basis.js +5 -0
- package/dist/schemas/cost-basis.js.map +1 -0
- package/dist/schemas/machine-variant.js +25 -0
- package/dist/schemas/machine-variant.js.map +1 -0
- package/dist/schemas/plan-budget.js +121 -0
- package/dist/schemas/plan-budget.js.map +1 -0
- package/dist/schemas/tool-outputs.js +526 -0
- package/dist/schemas/tool-outputs.js.map +1 -0
- package/dist/server/define-tool.js +52 -0
- package/dist/server/define-tool.js.map +1 -0
- package/dist/server/defined-only.js +9 -0
- package/dist/server/defined-only.js.map +1 -0
- package/dist/server/tools-briefings.js +70 -0
- package/dist/server/tools-briefings.js.map +1 -0
- package/dist/server/tools-lookup.js +180 -0
- package/dist/server/tools-lookup.js.map +1 -0
- package/dist/server/tools-maintenance.js +116 -0
- package/dist/server/tools-maintenance.js.map +1 -0
- package/dist/server/tools-pitfalls.js +89 -0
- package/dist/server/tools-pitfalls.js.map +1 -0
- package/dist/server/tools-recipes.js +296 -0
- package/dist/server/tools-recipes.js.map +1 -0
- package/dist/server/tools-runtime.js +48 -0
- package/dist/server/tools-runtime.js.map +1 -0
- package/dist/server/tools.js +43 -0
- package/dist/server/tools.js.map +1 -0
- package/dist/server.js +95 -0
- package/dist/server.js.map +1 -0
- package/dist/services/analytics/schema.js +78 -0
- package/dist/services/analytics/schema.js.map +1 -0
- package/dist/services/analytics/statements.js +99 -0
- package/dist/services/analytics/statements.js.map +1 -0
- package/dist/services/analytics.js +195 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/bm25.js +158 -0
- package/dist/services/bm25.js.map +1 -0
- package/dist/services/chunker.js +81 -0
- package/dist/services/chunker.js.map +1 -0
- package/dist/services/embeddings.js +58 -0
- package/dist/services/embeddings.js.map +1 -0
- package/dist/services/falkor/base.js +85 -0
- package/dist/services/falkor/base.js.map +1 -0
- package/dist/services/falkor/links.js +361 -0
- package/dist/services/falkor/links.js.map +1 -0
- package/dist/services/falkor/nodes.js +183 -0
- package/dist/services/falkor/nodes.js.map +1 -0
- package/dist/services/falkor/params.js +45 -0
- package/dist/services/falkor/params.js.map +1 -0
- package/dist/services/falkor/schema.js +77 -0
- package/dist/services/falkor/schema.js.map +1 -0
- package/dist/services/falkor.js +100 -0
- package/dist/services/falkor.js.map +1 -0
- package/dist/services/qdrant.js +238 -0
- package/dist/services/qdrant.js.map +1 -0
- package/dist/services/versions.js +73 -0
- package/dist/services/versions.js.map +1 -0
- package/dist/services/vice-bin.js +51 -0
- package/dist/services/vice-bin.js.map +1 -0
- package/dist/tools/briefings/archetype.js +174 -0
- package/dist/tools/briefings/archetype.js.map +1 -0
- package/dist/tools/briefings/budget.js +177 -0
- package/dist/tools/briefings/budget.js.map +1 -0
- package/dist/tools/briefings/build-order.js +135 -0
- package/dist/tools/briefings/build-order.js.map +1 -0
- package/dist/tools/briefings/build.js +185 -0
- package/dist/tools/briefings/build.js.map +1 -0
- package/dist/tools/briefings/discovery.js +290 -0
- package/dist/tools/briefings/discovery.js.map +1 -0
- package/dist/tools/briefings/plan-pitfalls.js +69 -0
- package/dist/tools/briefings/plan-pitfalls.js.map +1 -0
- package/dist/tools/briefings/render.js +151 -0
- package/dist/tools/briefings/render.js.map +1 -0
- package/dist/tools/briefings/rows.js +41 -0
- package/dist/tools/briefings/rows.js.map +1 -0
- package/dist/tools/briefings/toolchain.js +63 -0
- package/dist/tools/briefings/toolchain.js.map +1 -0
- package/dist/tools/briefings/why-proposed.js +69 -0
- package/dist/tools/briefings/why-proposed.js.map +1 -0
- package/dist/tools/briefings.js +44 -0
- package/dist/tools/briefings.js.map +1 -0
- package/dist/tools/feedback.js +97 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/hydrate.js +75 -0
- package/dist/tools/hydrate.js.map +1 -0
- package/dist/tools/intelligence.js +67 -0
- package/dist/tools/intelligence.js.map +1 -0
- package/dist/tools/lint/asm-decimal.js +86 -0
- package/dist/tools/lint/asm-decimal.js.map +1 -0
- package/dist/tools/lint/asm-rules.js +221 -0
- package/dist/tools/lint/asm-rules.js.map +1 -0
- package/dist/tools/lint/asm-shared.js +3 -0
- package/dist/tools/lint/asm-shared.js.map +1 -0
- package/dist/tools/lint/c-rules.js +215 -0
- package/dist/tools/lint/c-rules.js.map +1 -0
- package/dist/tools/lint/text.js +122 -0
- package/dist/tools/lint/text.js.map +1 -0
- package/dist/tools/lint/types.js +40 -0
- package/dist/tools/lint/types.js.map +1 -0
- package/dist/tools/lint.js +76 -0
- package/dist/tools/lint.js.map +1 -0
- package/dist/tools/memorization-mcp.js +111 -0
- package/dist/tools/memorization-mcp.js.map +1 -0
- package/dist/tools/pitfalls/bm25.js +53 -0
- package/dist/tools/pitfalls/bm25.js.map +1 -0
- package/dist/tools/pitfalls/format.js +58 -0
- package/dist/tools/pitfalls/format.js.map +1 -0
- package/dist/tools/pitfalls/graph.js +124 -0
- package/dist/tools/pitfalls/graph.js.map +1 -0
- package/dist/tools/pitfalls.js +134 -0
- package/dist/tools/pitfalls.js.map +1 -0
- package/dist/tools/prompts.js +81 -0
- package/dist/tools/prompts.js.map +1 -0
- package/dist/tools/query/compatibility/closure.js +62 -0
- package/dist/tools/query/compatibility/closure.js.map +1 -0
- package/dist/tools/query/compatibility/facts.js +28 -0
- package/dist/tools/query/compatibility/facts.js.map +1 -0
- package/dist/tools/query/compatibility/fetch.js +164 -0
- package/dist/tools/query/compatibility/fetch.js.map +1 -0
- package/dist/tools/query/compatibility/hard-rules.js +159 -0
- package/dist/tools/query/compatibility/hard-rules.js.map +1 -0
- package/dist/tools/query/compatibility/index.js +27 -0
- package/dist/tools/query/compatibility/index.js.map +1 -0
- package/dist/tools/query/compatibility/kernal-zp-rule.js +90 -0
- package/dist/tools/query/compatibility/kernal-zp-rule.js.map +1 -0
- package/dist/tools/query/compatibility/render.js +106 -0
- package/dist/tools/query/compatibility/render.js.map +1 -0
- package/dist/tools/query/compatibility/rules.js +337 -0
- package/dist/tools/query/compatibility/rules.js.map +1 -0
- package/dist/tools/query/compatibility/unit-rules.js +253 -0
- package/dist/tools/query/compatibility/unit-rules.js.map +1 -0
- package/dist/tools/query/game-design.js +83 -0
- package/dist/tools/query/game-design.js.map +1 -0
- package/dist/tools/query/lookups.js +220 -0
- package/dist/tools/query/lookups.js.map +1 -0
- package/dist/tools/query/plan-budget.js +266 -0
- package/dist/tools/query/plan-budget.js.map +1 -0
- package/dist/tools/query/recipes.js +214 -0
- package/dist/tools/query/recipes.js.map +1 -0
- package/dist/tools/query/retrieval.js +128 -0
- package/dist/tools/query/retrieval.js.map +1 -0
- package/dist/tools/query/shared.js +121 -0
- package/dist/tools/query/shared.js.map +1 -0
- package/dist/tools/query/techniques.js +331 -0
- package/dist/tools/query/techniques.js.map +1 -0
- package/dist/tools/query/timing.js +106 -0
- package/dist/tools/query/timing.js.map +1 -0
- package/dist/tools/query/types.js +11 -0
- package/dist/tools/query/types.js.map +1 -0
- package/dist/tools/query.js +21 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/tools/resources.js +186 -0
- package/dist/tools/resources.js.map +1 -0
- package/dist/tools/run-game.js +249 -0
- package/dist/tools/run-game.js.map +1 -0
- package/dist/tools/selfimprovement.js +367 -0
- package/dist/tools/selfimprovement.js.map +1 -0
- package/docker-compose.yml +35 -0
- package/docs/ARCHITECTURE.md +164 -0
- package/docs/CONVENTIONS-archetypes.md +158 -0
- package/docs/CONVENTIONS-failures.md +46 -0
- package/docs/CONVENTIONS-game-designs.md +75 -0
- package/docs/CONVENTIONS-hardware-reference.md +184 -0
- package/docs/CONVENTIONS-pitfalls.md +91 -0
- package/docs/CONVENTIONS-recipes.md +106 -0
- package/docs/CONVENTIONS-techniques.md +309 -0
- package/docs/CONVENTIONS-toolchain-reference.md +89 -0
- package/docs/ONTOLOGY.md +655 -0
- package/docs/art/art-production-reference.md +157 -0
- package/docs/art/asset-pipelines.md +586 -0
- package/docs/c64-failure-patterns.md +693 -0
- package/docs/demo-design/demo-composition.md +349 -0
- package/docs/demo-design/demo-design-philosophy.md +320 -0
- package/docs/demo-design/intro-cracktro-patterns.md +435 -0
- package/docs/figures/ctm-spd-embed-probe.png +0 -0
- package/docs/figures/dot-flag-mid-5000000.png +0 -0
- package/docs/figures/dot-flag-no-erase-12000000.png +0 -0
- package/docs/figures/edges.json +1 -0
- package/docs/figures/fig6-architecture.png +0 -0
- package/docs/figures/fig7-ontology.png +0 -0
- package/docs/figures/screen-dissolve-mid-frame25.png +0 -0
- package/docs/figures/screen-dissolve-wipe-frame25.png +0 -0
- package/docs/figures/spindle-two-parts-part1.png +0 -0
- package/docs/figures/spindle-two-parts-part2.png +0 -0
- package/docs/figures/starters/action-puzzle.png +0 -0
- package/docs/figures/starters/adventure.png +0 -0
- package/docs/figures/starters/beat-em-up.png +0 -0
- package/docs/figures/starters/demo.png +0 -0
- package/docs/figures/starters/platformer.png +0 -0
- package/docs/figures/starters/shmup-vertical.png +0 -0
- package/docs/figures/tape-kernal-master-ntsc.png +0 -0
- package/docs/figures/tape-kernal-master-pal.png +0 -0
- package/docs/figures/tape-turbo-loader-ntsc.png +0 -0
- package/docs/figures/tape-turbo-loader-pal.png +0 -0
- package/docs/figures/tape-turbo-master-ntsc.png +0 -0
- package/docs/figures/tape-turbo-master-pal.png +0 -0
- package/docs/figures/tech-tech-pad2-12000000.png +0 -0
- package/docs/figures/tech-tech-pad4-12000000.png +0 -0
- package/docs/figures/tech-tech-seven-12000000.png +0 -0
- package/docs/figures/twister-mid-5000000.png +0 -0
- package/docs/figures/twister-straight-12000000.png +0 -0
- package/docs/figures/vector-balls-nosort-ntsc.png +0 -0
- package/docs/figures/vector-balls-nosort.png +0 -0
- package/docs/formats/c64-file-formats.md +1212 -0
- package/docs/formats/iec-disk-reference.md +754 -0
- package/docs/game-design/c64-game-archetypes.md +273 -0
- package/docs/game-design/designs/falling-blocks.md +54 -0
- package/docs/game-design/designs/platformer-scaffold.md +48 -0
- package/docs/game-design/designs/simple-shmup.md +27 -0
- package/docs/game-design/enemy-behaviour-and-difficulty.md +349 -0
- package/docs/game-design/game-design-patterns.md +1189 -0
- package/docs/game-design/game-structure.md +354 -0
- package/docs/game-design/production-planning.md +349 -0
- package/docs/game-design/reference-game-sources.md +90 -0
- package/docs/hardware/6502-illegal-opcodes.md +1353 -0
- package/docs/hardware/6510-cpu-reference.md +2112 -0
- package/docs/hardware/c64-memory-map.md +3184 -0
- package/docs/hardware/c64-registers-reference.md +996 -0
- package/docs/hardware/cia-reference.md +1281 -0
- package/docs/hardware/kernal-routines-reference.md +1836 -0
- package/docs/hardware/pal-ntsc-reference.md +813 -0
- package/docs/hardware/sid-reference.md +1137 -0
- package/docs/hardware/vic-ii-reference.md +1714 -0
- package/docs/music/music-production-reference.md +403 -0
- package/docs/pitfalls/banking.md +1067 -0
- package/docs/pitfalls/cia.md +1147 -0
- package/docs/pitfalls/cpu.md +874 -0
- package/docs/pitfalls/input.md +282 -0
- package/docs/pitfalls/kernal-and-io.md +1615 -0
- package/docs/pitfalls/loader.md +1191 -0
- package/docs/pitfalls/logic.md +94 -0
- package/docs/pitfalls/maths.md +187 -0
- package/docs/pitfalls/raster-and-badline.md +721 -0
- package/docs/pitfalls/region-timing.md +660 -0
- package/docs/pitfalls/scroll.md +207 -0
- package/docs/pitfalls/sid.md +738 -0
- package/docs/pitfalls/sprite.md +979 -0
- package/docs/pitfalls/text-mode-render.md +1172 -0
- package/docs/recipes/cc65/cartridge-8k.md +398 -0
- package/docs/recipes/cc65/hello-world-conio.md +76 -0
- package/docs/recipes/cc65/memory-layout.md +312 -0
- package/docs/recipes/cc65/screenshots/README.md +14 -0
- package/docs/recipes/cc65/screenshots/cartridge-8k-ntsc.png +0 -0
- package/docs/recipes/cc65/screenshots/cartridge-8k.png +0 -0
- package/docs/recipes/cc65/screenshots/hello-world-conio.png +0 -0
- package/docs/recipes/cc65/screenshots/memory-layout-ntsc.png +0 -0
- package/docs/recipes/cc65/screenshots/memory-layout.png +0 -0
- package/docs/recipes/kickassembler/basic-float-calls.md +578 -0
- package/docs/recipes/kickassembler/basic-wedge.md +398 -0
- package/docs/recipes/kickassembler/big-font-scroller.md +620 -0
- package/docs/recipes/kickassembler/charset-copy-rom-to-ram.md +623 -0
- package/docs/recipes/kickassembler/cia-revision-detect.md +366 -0
- package/docs/recipes/kickassembler/colour-cycling.md +343 -0
- package/docs/recipes/kickassembler/colour-fade.md +303 -0
- package/docs/recipes/kickassembler/compare-16bit-signed.md +1007 -0
- package/docs/recipes/kickassembler/cracktro-template.md +526 -0
- package/docs/recipes/kickassembler/crt-banked.md +276 -0
- package/docs/recipes/kickassembler/dos-error-codes.md +466 -0
- package/docs/recipes/kickassembler/dot-flag.md +576 -0
- package/docs/recipes/kickassembler/drive-job-queue.md +667 -0
- package/docs/recipes/kickassembler/drive-via-probe.md +690 -0
- package/docs/recipes/kickassembler/dycp-scroller.md +568 -0
- package/docs/recipes/kickassembler/dypp-sprite-scroller.md +681 -0
- package/docs/recipes/kickassembler/dysp.md +670 -0
- package/docs/recipes/kickassembler/easyflash-save.md +800 -0
- package/docs/recipes/kickassembler/eight-way-scroll.md +1484 -0
- package/docs/recipes/kickassembler/file-io-roundtrip.md +546 -0
- package/docs/recipes/kickassembler/fire-effect.md +420 -0
- package/docs/recipes/kickassembler/fld.md +414 -0
- package/docs/recipes/kickassembler/fli-image.md +336 -0
- package/docs/recipes/kickassembler/four-player-read.md +672 -0
- package/docs/recipes/kickassembler/headless-verify.md +228 -0
- package/docs/recipes/kickassembler/hello-world.md +98 -0
- package/docs/recipes/kickassembler/high-score-insert.md +660 -0
- package/docs/recipes/kickassembler/hires-plot-line.md +723 -0
- package/docs/recipes/kickassembler/irq-chain.md +316 -0
- package/docs/recipes/kickassembler/irq-owns-port.md +668 -0
- package/docs/recipes/kickassembler/isometric-room.md +1145 -0
- package/docs/recipes/kickassembler/light-pen-read.md +926 -0
- package/docs/recipes/kickassembler/logic-rate-decoupling.md +670 -0
- package/docs/recipes/kickassembler/mci-interlace.md +543 -0
- package/docs/recipes/kickassembler/memory-layout.md +277 -0
- package/docs/recipes/kickassembler/mouse-1351-read.md +801 -0
- package/docs/recipes/kickassembler/nmi-timer-tick.md +562 -0
- package/docs/recipes/kickassembler/own-keyscan.md +881 -0
- package/docs/recipes/kickassembler/paddle-read.md +751 -0
- package/docs/recipes/kickassembler/palette-cells.md +219 -0
- package/docs/recipes/kickassembler/pseudo-3d-road.md +930 -0
- package/docs/recipes/kickassembler/pwm-digi.md +463 -0
- package/docs/recipes/kickassembler/raster-bars.md +264 -0
- package/docs/recipes/kickassembler/reu-dma.md +1019 -0
- package/docs/recipes/kickassembler/runtime-relocation.md +743 -0
- package/docs/recipes/kickassembler/screen-dissolve.md +545 -0
- package/docs/recipes/kickassembler/screen-wipe.md +408 -0
- package/docs/recipes/kickassembler/screenshots/README.md +72 -0
- package/docs/recipes/kickassembler/screenshots/basic-float-calls-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/basic-float-calls.png +0 -0
- package/docs/recipes/kickassembler/screenshots/basic-wedge-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/basic-wedge.png +0 -0
- package/docs/recipes/kickassembler/screenshots/big-font-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/big-font-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/charset-copy-rom-to-ram-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/charset-copy-rom-to-ram.png +0 -0
- package/docs/recipes/kickassembler/screenshots/cia-revision-detect-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/cia-revision-detect.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-cycling-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-cycling.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-fade-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-fade.png +0 -0
- package/docs/recipes/kickassembler/screenshots/compare-16bit-signed-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/compare-16bit-signed.png +0 -0
- package/docs/recipes/kickassembler/screenshots/cracktro-template.png +0 -0
- package/docs/recipes/kickassembler/screenshots/crt-banked-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/crt-banked.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dos-error-codes-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dos-error-codes.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dot-flag-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dot-flag.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-job-queue-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-job-queue.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-via-probe-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-via-probe.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dycp-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dycp-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dypp-sprite-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dypp-sprite-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dysp-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dysp.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save-ntsc-run2.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save-run2.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save.png +0 -0
- package/docs/recipes/kickassembler/screenshots/eight-way-scroll-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/eight-way-scroll.png +0 -0
- package/docs/recipes/kickassembler/screenshots/file-io-roundtrip-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/file-io-roundtrip.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fire-effect-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fire-effect.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fld-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fld.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fli-image.png +0 -0
- package/docs/recipes/kickassembler/screenshots/four-player-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/four-player-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/headless-verify-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/headless-verify.png +0 -0
- package/docs/recipes/kickassembler/screenshots/hello-world.png +0 -0
- package/docs/recipes/kickassembler/screenshots/high-score-insert-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/high-score-insert.png +0 -0
- package/docs/recipes/kickassembler/screenshots/hires-plot-line-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/hires-plot-line.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-chain-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-chain.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-owns-port-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-owns-port.png +0 -0
- package/docs/recipes/kickassembler/screenshots/isometric-room-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/isometric-room.png +0 -0
- package/docs/recipes/kickassembler/screenshots/light-pen-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/light-pen-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/logic-rate-decoupling-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/logic-rate-decoupling.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace-average.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace-frame-b.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace.png +0 -0
- package/docs/recipes/kickassembler/screenshots/memory-layout-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/memory-layout.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mouse-1351-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mouse-1351-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/nmi-timer-tick-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/nmi-timer-tick.png +0 -0
- package/docs/recipes/kickassembler/screenshots/own-keyscan-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/own-keyscan.png +0 -0
- package/docs/recipes/kickassembler/screenshots/paddle-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/paddle-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/palette-cells-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/palette-cells.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pseudo-3d-road-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pseudo-3d-road.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pwm-digi-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pwm-digi.png +0 -0
- package/docs/recipes/kickassembler/screenshots/raster-bars.png +0 -0
- package/docs/recipes/kickassembler/screenshots/reu-dma-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/reu-dma.png +0 -0
- package/docs/recipes/kickassembler/screenshots/runtime-relocation-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/runtime-relocation.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-dissolve-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-dissolve.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-wipe-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-wipe.png +0 -0
- package/docs/recipes/kickassembler/screenshots/scroll-panel-split-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/scroll-panel-split.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sfx-in-player-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sfx-in-player.png +0 -0
- package/docs/recipes/kickassembler/screenshots/shadebobs-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/shadebobs.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sideborder-open.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sine-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sine-table-runtime-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sine-table-runtime.png +0 -0
- package/docs/recipes/kickassembler/screenshots/software-sprite-preshifted-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/software-sprite-preshifted.png +0 -0
- package/docs/recipes/kickassembler/screenshots/speedcode-generator-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/speedcode-generator.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-border-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-border-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-cache-flip-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-cache-flip.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-multiplex-24.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-multiplex-game-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-multiplex-game.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-priority-classes-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-priority-classes.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-sine-chain-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-sine-chain.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-stretcher-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-stretcher.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprites-only-screen-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprites-only-screen.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sqrt-atan2-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sqrt-atan2.png +0 -0
- package/docs/recipes/kickassembler/screenshots/stable-raster-irq-control.png +0 -0
- package/docs/recipes/kickassembler/screenshots/stable-raster-irq.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tech-tech-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tech-tech.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tod-alarm-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tod-alarm.png +0 -0
- package/docs/recipes/kickassembler/screenshots/topbottom-border-open.png +0 -0
- package/docs/recipes/kickassembler/screenshots/twister-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/twister.png +0 -0
- package/docs/recipes/kickassembler/screenshots/unit-test-driver-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/unit-test-driver.png +0 -0
- package/docs/recipes/kickassembler/screenshots/vector-balls-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/vector-balls.png +0 -0
- package/docs/recipes/kickassembler/screenshots/wireframe-ships-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/wireframe-ships.png +0 -0
- package/docs/recipes/kickassembler/scroll-panel-split.md +381 -0
- package/docs/recipes/kickassembler/sfx-in-player.md +907 -0
- package/docs/recipes/kickassembler/shadebobs.md +522 -0
- package/docs/recipes/kickassembler/sideborder-open.md +338 -0
- package/docs/recipes/kickassembler/sine-scroller.md +321 -0
- package/docs/recipes/kickassembler/sine-table-runtime.md +815 -0
- package/docs/recipes/kickassembler/software-sprite-preshifted.md +725 -0
- package/docs/recipes/kickassembler/speedcode-generator.md +606 -0
- package/docs/recipes/kickassembler/sprite-border-scroller.md +696 -0
- package/docs/recipes/kickassembler/sprite-cache-flip.md +1071 -0
- package/docs/recipes/kickassembler/sprite-multiplex-24.md +326 -0
- package/docs/recipes/kickassembler/sprite-multiplex-game.md +986 -0
- package/docs/recipes/kickassembler/sprite-priority-classes.md +463 -0
- package/docs/recipes/kickassembler/sprite-sine-chain.md +338 -0
- package/docs/recipes/kickassembler/sprite-stretcher.md +501 -0
- package/docs/recipes/kickassembler/sprites-only-screen.md +550 -0
- package/docs/recipes/kickassembler/sqrt-atan2.md +1014 -0
- package/docs/recipes/kickassembler/stable-raster-irq.md +360 -0
- package/docs/recipes/kickassembler/tape-turbo-loader.md +875 -0
- package/docs/recipes/kickassembler/tech-tech.md +679 -0
- package/docs/recipes/kickassembler/tod-alarm.md +754 -0
- package/docs/recipes/kickassembler/topbottom-border-open.md +407 -0
- package/docs/recipes/kickassembler/twister.md +518 -0
- package/docs/recipes/kickassembler/unit-test-driver.md +314 -0
- package/docs/recipes/kickassembler/vector-balls.md +545 -0
- package/docs/recipes/kickassembler/wireframe-ships.md +2324 -0
- package/docs/recipes/oscar64/actor-activation-window.md +807 -0
- package/docs/recipes/oscar64/adventure-engine.md +1094 -0
- package/docs/recipes/oscar64/attract-replay.md +465 -0
- package/docs/recipes/oscar64/beat-em-up-lanes.md +563 -0
- package/docs/recipes/oscar64/bfs-distance-map.md +723 -0
- package/docs/recipes/oscar64/bitmap-koala-viewer.md +355 -0
- package/docs/recipes/oscar64/car-contact.md +950 -0
- package/docs/recipes/oscar64/cave-scan.md +609 -0
- package/docs/recipes/oscar64/char-bullets.md +477 -0
- package/docs/recipes/oscar64/charset-animation.md +383 -0
- package/docs/recipes/oscar64/charset-parallax.md +401 -0
- package/docs/recipes/oscar64/destructible-terrain.md +1099 -0
- package/docs/recipes/oscar64/difficulty-tables.md +654 -0
- package/docs/recipes/oscar64/dig-and-guards.md +975 -0
- package/docs/recipes/oscar64/directory-reader.md +535 -0
- package/docs/recipes/oscar64/divide-check.md +581 -0
- package/docs/recipes/oscar64/double-buffer-nomirror.md +205 -0
- package/docs/recipes/oscar64/double-buffer.md +255 -0
- package/docs/recipes/oscar64/falling-blocks.md +874 -0
- package/docs/recipes/oscar64/fixed-point-jump-velocity.md +289 -0
- package/docs/recipes/oscar64/fixed-point-jump.md +210 -0
- package/docs/recipes/oscar64/flip-screen-rooms.md +793 -0
- package/docs/recipes/oscar64/frame-sync-loop-overrun.md +214 -0
- package/docs/recipes/oscar64/frame-sync-loop.md +254 -0
- package/docs/recipes/oscar64/game-tree-search.md +743 -0
- package/docs/recipes/oscar64/ghost-targeting.md +867 -0
- package/docs/recipes/oscar64/headless-verify.md +345 -0
- package/docs/recipes/oscar64/hello-world.md +83 -0
- package/docs/recipes/oscar64/high-score-persist.md +772 -0
- package/docs/recipes/oscar64/iffl-kernal-skip.md +421 -0
- package/docs/recipes/oscar64/joystick-input.md +358 -0
- package/docs/recipes/oscar64/lane-pursuit.md +1028 -0
- package/docs/recipes/oscar64/level-rle-decoder.md +620 -0
- package/docs/recipes/oscar64/lfsr-random-seed2.md +338 -0
- package/docs/recipes/oscar64/lfsr-random.md +403 -0
- package/docs/recipes/oscar64/load-asset-runtime.md +492 -0
- package/docs/recipes/oscar64/memory-layout.md +232 -0
- package/docs/recipes/oscar64/mixed-fighters.md +781 -0
- package/docs/recipes/oscar64/multi-sprite-object.md +533 -0
- package/docs/recipes/oscar64/nav-area-pathfinding.md +881 -0
- package/docs/recipes/oscar64/object-pool.md +572 -0
- package/docs/recipes/oscar64/pal-ntsc-detect.md +257 -0
- package/docs/recipes/oscar64/password-state.md +532 -0
- package/docs/recipes/oscar64/per-frame-hitbox.md +651 -0
- package/docs/recipes/oscar64/petscii-screen-codes.md +428 -0
- package/docs/recipes/oscar64/platformer-scaffold.md +1467 -0
- package/docs/recipes/oscar64/print-number.md +367 -0
- package/docs/recipes/oscar64/raster-bars.md +239 -0
- package/docs/recipes/oscar64/raster-profile-bars.md +404 -0
- package/docs/recipes/oscar64/rel-side-sectors.md +391 -0
- package/docs/recipes/oscar64/relative-file-records.md +378 -0
- package/docs/recipes/oscar64/save-load-seq-file.md +365 -0
- package/docs/recipes/oscar64/screenshots/README.md +99 -0
- package/docs/recipes/oscar64/screenshots/actor-activation-window-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/actor-activation-window.png +0 -0
- package/docs/recipes/oscar64/screenshots/adventure-engine-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/adventure-engine.png +0 -0
- package/docs/recipes/oscar64/screenshots/attract-replay-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/attract-replay.png +0 -0
- package/docs/recipes/oscar64/screenshots/beat-em-up-lanes-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/beat-em-up-lanes.png +0 -0
- package/docs/recipes/oscar64/screenshots/bfs-distance-map-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/bfs-distance-map.png +0 -0
- package/docs/recipes/oscar64/screenshots/bitmap-koala-viewer.png +0 -0
- package/docs/recipes/oscar64/screenshots/car-contact-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/car-contact.png +0 -0
- package/docs/recipes/oscar64/screenshots/cave-scan-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/cave-scan.png +0 -0
- package/docs/recipes/oscar64/screenshots/char-bullets-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/char-bullets.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-animation-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-animation.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-parallax-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-parallax.png +0 -0
- package/docs/recipes/oscar64/screenshots/destructible-terrain-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/destructible-terrain.png +0 -0
- package/docs/recipes/oscar64/screenshots/difficulty-tables-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/difficulty-tables.png +0 -0
- package/docs/recipes/oscar64/screenshots/dig-and-guards-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/dig-and-guards.png +0 -0
- package/docs/recipes/oscar64/screenshots/directory-reader-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/directory-reader.png +0 -0
- package/docs/recipes/oscar64/screenshots/divide-check-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/divide-check.png +0 -0
- package/docs/recipes/oscar64/screenshots/double-buffer-nomirror.png +0 -0
- package/docs/recipes/oscar64/screenshots/double-buffer-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/double-buffer.png +0 -0
- package/docs/recipes/oscar64/screenshots/falling-blocks-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/falling-blocks.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump-velocity-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump-velocity.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump.png +0 -0
- package/docs/recipes/oscar64/screenshots/flip-screen-rooms-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/flip-screen-rooms.png +0 -0
- package/docs/recipes/oscar64/screenshots/frame-sync-loop-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/frame-sync-loop-overrun.png +0 -0
- package/docs/recipes/oscar64/screenshots/frame-sync-loop.png +0 -0
- package/docs/recipes/oscar64/screenshots/game-tree-search-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/game-tree-search.png +0 -0
- package/docs/recipes/oscar64/screenshots/ghost-targeting-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/ghost-targeting.png +0 -0
- package/docs/recipes/oscar64/screenshots/headless-verify-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/headless-verify.png +0 -0
- package/docs/recipes/oscar64/screenshots/hello-world.png +0 -0
- package/docs/recipes/oscar64/screenshots/high-score-persist-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/high-score-persist.png +0 -0
- package/docs/recipes/oscar64/screenshots/iffl-kernal-skip-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/iffl-kernal-skip.png +0 -0
- package/docs/recipes/oscar64/screenshots/joystick-input-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/joystick-input.png +0 -0
- package/docs/recipes/oscar64/screenshots/lane-pursuit-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/lane-pursuit.png +0 -0
- package/docs/recipes/oscar64/screenshots/level-rle-decoder-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/level-rle-decoder.png +0 -0
- package/docs/recipes/oscar64/screenshots/lfsr-random-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/lfsr-random-seed2.png +0 -0
- package/docs/recipes/oscar64/screenshots/lfsr-random.png +0 -0
- package/docs/recipes/oscar64/screenshots/load-asset-runtime-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/load-asset-runtime.png +0 -0
- package/docs/recipes/oscar64/screenshots/memory-layout-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/memory-layout.png +0 -0
- package/docs/recipes/oscar64/screenshots/mixed-fighters-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/mixed-fighters.png +0 -0
- package/docs/recipes/oscar64/screenshots/multi-sprite-object-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/multi-sprite-object.png +0 -0
- package/docs/recipes/oscar64/screenshots/nav-area-pathfinding-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/nav-area-pathfinding.png +0 -0
- package/docs/recipes/oscar64/screenshots/object-pool-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/object-pool.png +0 -0
- package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-oldntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-pal.png +0 -0
- package/docs/recipes/oscar64/screenshots/password-state-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/password-state.png +0 -0
- package/docs/recipes/oscar64/screenshots/per-frame-hitbox-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/per-frame-hitbox.png +0 -0
- package/docs/recipes/oscar64/screenshots/petscii-screen-codes-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/petscii-screen-codes.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold-d64-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold-d64.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold.png +0 -0
- package/docs/recipes/oscar64/screenshots/print-number-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/print-number.png +0 -0
- package/docs/recipes/oscar64/screenshots/raster-bars.png +0 -0
- package/docs/recipes/oscar64/screenshots/raster-profile-bars-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/raster-profile-bars.png +0 -0
- package/docs/recipes/oscar64/screenshots/rel-side-sectors-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/rel-side-sectors.png +0 -0
- package/docs/recipes/oscar64/screenshots/relative-file-records-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/relative-file-records.png +0 -0
- package/docs/recipes/oscar64/screenshots/save-load-seq-file-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/save-load-seq-file.png +0 -0
- package/docs/recipes/oscar64/screenshots/seeded-level-fill-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/seeded-level-fill.png +0 -0
- package/docs/recipes/oscar64/screenshots/sfx-engine-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/sfx-engine.png +0 -0
- package/docs/recipes/oscar64/screenshots/sid-music-player.png +0 -0
- package/docs/recipes/oscar64/screenshots/simple-shmup.png +0 -0
- package/docs/recipes/oscar64/screenshots/slope-collision-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/slope-collision.png +0 -0
- package/docs/recipes/oscar64/screenshots/soft-scroll-h.png +0 -0
- package/docs/recipes/oscar64/screenshots/sprite-animation-table-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/sprite-animation-table.png +0 -0
- package/docs/recipes/oscar64/screenshots/sprite-multiplex-8.png +0 -0
- package/docs/recipes/oscar64/screenshots/stable-raster-irq.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-input-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-input.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-gameover.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-notrail-control.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-ungated-control.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-window-menu-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-window-menu.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-grid-collision-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-grid-collision.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-map-render-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-map-render.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-player-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-player.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-word-parser-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-word-parser.png +0 -0
- package/docs/recipes/oscar64/screenshots/vehicle-control-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/vehicle-control.png +0 -0
- package/docs/recipes/oscar64/screenshots/wave-director-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/wave-director.png +0 -0
- package/docs/recipes/oscar64/seeded-level-fill.md +364 -0
- package/docs/recipes/oscar64/sfx-engine.md +514 -0
- package/docs/recipes/oscar64/sid-music-player.md +441 -0
- package/docs/recipes/oscar64/simple-shmup.md +1000 -0
- package/docs/recipes/oscar64/slope-collision.md +610 -0
- package/docs/recipes/oscar64/soft-scroll-h.md +261 -0
- package/docs/recipes/oscar64/sprite-animation-table.md +671 -0
- package/docs/recipes/oscar64/sprite-multiplex-8.md +314 -0
- package/docs/recipes/oscar64/stable-raster-irq.md +236 -0
- package/docs/recipes/oscar64/text-input.md +274 -0
- package/docs/recipes/oscar64/text-overlay-playfield.md +617 -0
- package/docs/recipes/oscar64/text-window-menu.md +551 -0
- package/docs/recipes/oscar64/tile-grid-collision.md +563 -0
- package/docs/recipes/oscar64/tile-map-render.md +395 -0
- package/docs/recipes/oscar64/two-player.md +528 -0
- package/docs/recipes/oscar64/two-word-parser.md +510 -0
- package/docs/recipes/oscar64/vehicle-control.md +771 -0
- package/docs/recipes/oscar64/wave-director.md +787 -0
- package/docs/recipes/runs.json +1606 -0
- package/docs/runtime/sim6502-reference.md +466 -0
- package/docs/runtime/vice-mcp-reference.md +351 -0
- package/docs/runtime/vice-reference.md +1393 -0
- package/docs/techniques/bitmap-modes.md +685 -0
- package/docs/techniques/cpu-cycle-tricks.md +1570 -0
- package/docs/techniques/effects-vector-3d.md +1431 -0
- package/docs/techniques/file-io.md +1427 -0
- package/docs/techniques/input.md +1072 -0
- package/docs/techniques/loaders-packers.md +768 -0
- package/docs/techniques/logic.md +3091 -0
- package/docs/techniques/maths.md +1524 -0
- package/docs/techniques/memory-banking.md +1686 -0
- package/docs/techniques/music-sid.md +1144 -0
- package/docs/techniques/raster.md +1543 -0
- package/docs/techniques/scroll.md +1292 -0
- package/docs/techniques/sprite.md +2566 -0
- package/docs/techniques/text-mode-render.md +717 -0
- package/docs/techniques/text.md +1095 -0
- package/docs/techniques/transitions.md +405 -0
- package/docs/toolchains/cartconv-reference.md +262 -0
- package/docs/toolchains/cc1541-reference.md +316 -0
- package/docs/toolchains/cc65-reference.md +667 -0
- package/docs/toolchains/error-sources/cc65/README.md +1 -0
- package/docs/toolchains/error-sources/cc65/missing-setcpu.s +4 -0
- package/docs/toolchains/error-sources/cc65/range-error.s +4 -0
- package/docs/toolchains/error-sources/cc65/segment-overflow.c +6 -0
- package/docs/toolchains/error-sources/cc65/unresolved-external.c +6 -0
- package/docs/toolchains/error-sources/kickassembler/README.md +1 -0
- package/docs/toolchains/error-sources/kickassembler/branch-out-of-range.asm +4 -0
- package/docs/toolchains/error-sources/kickassembler/failed-assert.asm +3 -0
- package/docs/toolchains/error-sources/kickassembler/flat-lib.asm +4 -0
- package/docs/toolchains/error-sources/kickassembler/import-source-no-namespace.asm +5 -0
- package/docs/toolchains/error-sources/kickassembler/macro-without-parentheses.asm +6 -0
- package/docs/toolchains/error-sources/kickassembler/memory-block-overlap.asm +4 -0
- package/docs/toolchains/error-sources/kickassembler/symbol-clash-lib.asm +5 -0
- package/docs/toolchains/error-sources/kickassembler/symbol-clash-main.asm +6 -0
- package/docs/toolchains/error-sources/kickassembler/unknown-symbol.asm +4 -0
- package/docs/toolchains/error-sources/oscar64/README.md +1 -0
- package/docs/toolchains/error-sources/oscar64/asm-addressing-mode.c +7 -0
- package/docs/toolchains/error-sources/oscar64/region-overflow.c +6 -0
- package/docs/toolchains/error-sources/oscar64/undefined-extern-var.c +5 -0
- package/docs/toolchains/error-sources/oscar64/undefined-extern.c +6 -0
- package/docs/toolchains/error-sources/oscar64/unknown-vic-field.c +6 -0
- package/docs/toolchains/error-sources/oscar64/void-main.c +3 -0
- package/docs/toolchains/kickassembler-reference.md +1020 -0
- package/docs/toolchains/memory-layout-planning.md +362 -0
- package/docs/toolchains/oscar64-headers-reference.md +583 -0
- package/docs/toolchains/oscar64-reference.md +892 -0
- package/docs/toolchains/petcat-reference.md +290 -0
- package/docs/toolchains/png2prg.md +188 -0
- package/docs/toolchains/release-disk.md +314 -0
- package/docs/toolchains/sidreloc.md +236 -0
- package/docs/toolchains/spindle-reference.md +487 -0
- package/docs/toolchains/tape-mastering.md +592 -0
- package/docs/toolchains/unit-testing-6502.md +281 -0
- package/docs/workflow/agent-harness.md +478 -0
- package/package.json +105 -0
- package/templates/_harness/CLAUDE.md.template +91 -0
- package/templates/_harness/PLAN.md.template +72 -0
- package/templates/_harness/check.py +442 -0
- package/templates/_harness/claude/settings.json +17 -0
- package/templates/_harness/gen-asm-header.py +96 -0
- package/templates/_harness/harness.mk +273 -0
- package/templates/_harness/hooks/plan-gate.py +185 -0
- package/templates/_harness/meter/frame_meter.asm +311 -0
- package/templates/_harness/meter/frame_meter.c +155 -0
- package/templates/_harness/meter/frame_meter.h +80 -0
- package/templates/_harness/zp-used.py +104 -0
- package/templates/action-puzzle/.claude/settings.json +17 -0
- package/templates/action-puzzle/.mcp.json +10 -0
- package/templates/action-puzzle/CLAUDE.md +120 -0
- package/templates/action-puzzle/Makefile +125 -0
- package/templates/action-puzzle/PLAN.md +388 -0
- package/templates/action-puzzle/README.md +240 -0
- package/templates/action-puzzle/expect.json +25 -0
- package/templates/action-puzzle/src/cave.c +280 -0
- package/templates/action-puzzle/src/cave.h +80 -0
- package/templates/action-puzzle/src/gen_autopilot.h +20 -0
- package/templates/action-puzzle/src/gen_caves.h +59 -0
- package/templates/action-puzzle/src/gen_notes.h +16 -0
- package/templates/action-puzzle/src/hiscore.c +152 -0
- package/templates/action-puzzle/src/hiscore.h +41 -0
- package/templates/action-puzzle/src/level.c +64 -0
- package/templates/action-puzzle/src/level.h +24 -0
- package/templates/action-puzzle/src/main.c +599 -0
- package/templates/action-puzzle/src/render.c +239 -0
- package/templates/action-puzzle/src/render.h +31 -0
- package/templates/action-puzzle/src/sound.c +158 -0
- package/templates/action-puzzle/src/sound.h +22 -0
- package/templates/action-puzzle/tools/disk_check.py +77 -0
- package/templates/action-puzzle/tools/drive.py +106 -0
- package/templates/action-puzzle/tools/gen.py +454 -0
- package/templates/action-puzzle/tools/model_check.py +49 -0
- package/templates/action-puzzle/tools/verdict_codes.py +24 -0
- package/templates/adventure/.claude/settings.json +17 -0
- package/templates/adventure/.mcp.json +10 -0
- package/templates/adventure/CLAUDE.md +118 -0
- package/templates/adventure/Makefile +113 -0
- package/templates/adventure/PLAN.md +396 -0
- package/templates/adventure/README.md +277 -0
- package/templates/adventure/expect.json +25 -0
- package/templates/adventure/src/engine.c +543 -0
- package/templates/adventure/src/engine.h +48 -0
- package/templates/adventure/src/gen_script.h +141 -0
- package/templates/adventure/src/gen_world.h +511 -0
- package/templates/adventure/src/main.c +439 -0
- package/templates/adventure/src/picture.c +83 -0
- package/templates/adventure/src/picture.h +16 -0
- package/templates/adventure/src/save.c +159 -0
- package/templates/adventure/src/save.h +25 -0
- package/templates/adventure/src/sound.c +71 -0
- package/templates/adventure/src/sound.h +16 -0
- package/templates/adventure/src/text.c +349 -0
- package/templates/adventure/src/text.h +40 -0
- package/templates/adventure/tools/disk_check.py +128 -0
- package/templates/adventure/tools/drive.py +119 -0
- package/templates/adventure/tools/gen.py +1033 -0
- package/templates/adventure/tools/world.py +356 -0
- package/templates/beat-em-up/.claude/settings.json +17 -0
- package/templates/beat-em-up/.mcp.json +10 -0
- package/templates/beat-em-up/CLAUDE.md +136 -0
- package/templates/beat-em-up/Makefile +96 -0
- package/templates/beat-em-up/PLAN.md +502 -0
- package/templates/beat-em-up/README.md +315 -0
- package/templates/beat-em-up/expect-gameover.json +8 -0
- package/templates/beat-em-up/expect.json +29 -0
- package/templates/beat-em-up/src/anim.c +70 -0
- package/templates/beat-em-up/src/art.c +344 -0
- package/templates/beat-em-up/src/autopilot.h +154 -0
- package/templates/beat-em-up/src/brute.c +273 -0
- package/templates/beat-em-up/src/enemy.c +281 -0
- package/templates/beat-em-up/src/engine.asm +512 -0
- package/templates/beat-em-up/src/fighter.c +384 -0
- package/templates/beat-em-up/src/game.h +269 -0
- package/templates/beat-em-up/src/hud.c +135 -0
- package/templates/beat-em-up/src/main.c +341 -0
- package/templates/beat-em-up/src/sound.c +44 -0
- package/templates/beat-em-up/src/street.c +93 -0
- package/templates/beat-em-up/src/verdict.h +523 -0
- package/templates/beat-em-up/src/view.c +362 -0
- package/templates/beat-em-up/tools/drive.py +105 -0
- package/templates/beat-em-up/tools/flickercheck.py +273 -0
- package/templates/demo/.claude/settings.json +17 -0
- package/templates/demo/.mcp.json +10 -0
- package/templates/demo/CLAUDE.md +129 -0
- package/templates/demo/Makefile +66 -0
- package/templates/demo/PLAN.md +401 -0
- package/templates/demo/README.md +322 -0
- package/templates/demo/expect.json +945 -0
- package/templates/demo/src/config.asm +80 -0
- package/templates/demo/src/framework.asm +390 -0
- package/templates/demo/src/main.asm +139 -0
- package/templates/demo/src/music.asm +197 -0
- package/templates/demo/src/part_main.asm +279 -0
- package/templates/demo/src/part_title.asm +79 -0
- package/templates/demo/src/parts.asm +43 -0
- package/templates/demo/src/tables.asm +73 -0
- package/templates/demo/src/verdict.asm +179 -0
- package/templates/demo/tools/audio.py +80 -0
- package/templates/demo/tools/gen_expect.py +167 -0
- package/templates/demo/tools/probe.py +95 -0
- package/templates/hello/.claude/settings.json +17 -0
- package/templates/hello/.mcp.json +10 -0
- package/templates/hello/CLAUDE.md +100 -0
- package/templates/hello/Makefile +38 -0
- package/templates/hello/PLAN.md +200 -0
- package/templates/hello/expect.json +20 -0
- package/templates/hello/src/main.c +161 -0
- package/templates/hello/src/sprite.asm +27 -0
- package/templates/hello-kick/.claude/settings.json +17 -0
- package/templates/hello-kick/.mcp.json +10 -0
- package/templates/hello-kick/CLAUDE.md +100 -0
- package/templates/hello-kick/Makefile +17 -0
- package/templates/hello-kick/PLAN.md +199 -0
- package/templates/hello-kick/expect.json +20 -0
- package/templates/hello-kick/src/main.asm +233 -0
- package/templates/platformer/.claude/settings.json +17 -0
- package/templates/platformer/.mcp.json +10 -0
- package/templates/platformer/CLAUDE.md +125 -0
- package/templates/platformer/Makefile +86 -0
- package/templates/platformer/PLAN.md +360 -0
- package/templates/platformer/README.md +277 -0
- package/templates/platformer/expect.json +32 -0
- package/templates/platformer/src/actors.c +289 -0
- package/templates/platformer/src/anim.c +51 -0
- package/templates/platformer/src/art.c +212 -0
- package/templates/platformer/src/autopilot.h +30 -0
- package/templates/platformer/src/engine.asm +253 -0
- package/templates/platformer/src/game.h +248 -0
- package/templates/platformer/src/hud.c +90 -0
- package/templates/platformer/src/level.c +184 -0
- package/templates/platformer/src/main.c +306 -0
- package/templates/platformer/src/player.c +268 -0
- package/templates/platformer/src/sound.c +42 -0
- package/templates/platformer/src/verdict.h +206 -0
- package/templates/platformer/src/view.c +331 -0
- package/templates/platformer/stage-expect.json +6 -0
- package/templates/platformer/tools/drive.py +112 -0
- package/templates/platformer/tools/tearcheck.py +229 -0
- package/templates/shmup-vertical/.claude/settings.json +17 -0
- package/templates/shmup-vertical/.mcp.json +10 -0
- package/templates/shmup-vertical/CLAUDE.md +137 -0
- package/templates/shmup-vertical/Makefile +131 -0
- package/templates/shmup-vertical/PLAN.md +569 -0
- package/templates/shmup-vertical/README.md +189 -0
- package/templates/shmup-vertical/expect.json +38 -0
- package/templates/shmup-vertical/src/bullets.c +158 -0
- package/templates/shmup-vertical/src/bullets.h +35 -0
- package/templates/shmup-vertical/src/display.c +239 -0
- package/templates/shmup-vertical/src/display.h +40 -0
- package/templates/shmup-vertical/src/game.h +85 -0
- package/templates/shmup-vertical/src/glyph.asm +358 -0
- package/templates/shmup-vertical/src/hiscore.c +141 -0
- package/templates/shmup-vertical/src/hiscore.h +16 -0
- package/templates/shmup-vertical/src/hit.asm +180 -0
- package/templates/shmup-vertical/src/hitbox.c +59 -0
- package/templates/shmup-vertical/src/hitbox.h +25 -0
- package/templates/shmup-vertical/src/kernel.asm +330 -0
- package/templates/shmup-vertical/src/level.c +174 -0
- package/templates/shmup-vertical/src/level.h +27 -0
- package/templates/shmup-vertical/src/main.c +824 -0
- package/templates/shmup-vertical/src/mux.asm +321 -0
- package/templates/shmup-vertical/src/sound.asm +255 -0
- package/templates/shmup-vertical/src/step.asm +169 -0
- package/templates/shmup-vertical/src/waves.c +195 -0
- package/templates/shmup-vertical/src/waves.h +33 -0
- package/templates/shmup-vertical/stage-expect.json +6 -0
- package/templates/shmup-vertical/tools/drive.py +152 -0
- package/templates/shmup-vertical/tools/joytest.py +159 -0
- package/templates/shmup-vertical/tools/meter.py +15 -0
- package/templates/shmup-vertical/tools/phases.py +73 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"""world.py: STARWATCH, the game's world. Edit this file, then `make gen`.
|
|
2
|
+
|
|
3
|
+
Everything the game knows is here: rooms, items, words, the action table,
|
|
4
|
+
the messages the engine itself prints, the pictures and the autopilot
|
|
5
|
+
script. tools/gen.py packs it into src/gen_world.h and src/gen_script.h and
|
|
6
|
+
plays the script through its model of the engine.
|
|
7
|
+
|
|
8
|
+
Text is upper case. Letters, digits, space and . , ' ! ? : - ( ) only.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# ---- rooms --------------------------------------------------------------------
|
|
12
|
+
# key: (status-bar name, description, exits {dir: room}, dark, picture)
|
|
13
|
+
ROOMS = {
|
|
14
|
+
"LANE": ("LANE", "YOU STAND ON A MUDDY LANE BESIDE A HIGH STONE WALL. AN IRON GATE "
|
|
15
|
+
"IN THE WALL STANDS OPEN TO THE NORTH.", {"N": "GARDEN"}, False, "lane"),
|
|
16
|
+
"GARDEN": ("GARDEN", "AN OVERGROWN GARDEN UNDER THE STARS. THE HOUSE IS NORTH, A SHED "
|
|
17
|
+
"EAST AND A POND WEST.", {"S": "LANE", "N": "PORCH", "E": "SHED", "W": "POND"},
|
|
18
|
+
False, "garden"),
|
|
19
|
+
"SHED": ("SHED", "A DUSTY SHED THAT SMELLS OF TAR.", {"W": "GARDEN"}, False, "shed"),
|
|
20
|
+
"POND": ("POND", "A STILL POND UNDER A WILLOW. THE MOON LIES ON THE WATER.",
|
|
21
|
+
{"E": "GARDEN"}, False, "pond"),
|
|
22
|
+
"PORCH": ("PORCH", "A CREAKING PORCH. THE FRONT DOOR IS NORTH.",
|
|
23
|
+
{"S": "GARDEN", "N": "HALL"}, False, "porch"),
|
|
24
|
+
"HALL": ("HALL", "A TALL HALL WITH A GRANDFATHER CLOCK. DOORS LEAD EAST AND WEST, "
|
|
25
|
+
"STAIRS GO UP AND A STEP LEADS DOWN.",
|
|
26
|
+
{"S": "PORCH", "E": "KITCHEN", "W": "LIBRARY", "U": "LANDING", "D": "CELLAR"},
|
|
27
|
+
False, "hall"),
|
|
28
|
+
"KITCHEN": ("KITCHEN", "A COLD KITCHEN. POTS HANG OVER AN IRON STOVE.", {"W": "HALL"},
|
|
29
|
+
False, "kitchen"),
|
|
30
|
+
"LIBRARY": ("LIBRARY", "BOOKS RISE TO THE CEILING ON EVERY WALL.", {"E": "HALL"},
|
|
31
|
+
False, "library"),
|
|
32
|
+
"CELLAR": ("CELLAR", "A DAMP CELLAR OF BARE STONE.", {"U": "HALL"}, True, "cellar"),
|
|
33
|
+
"LANDING": ("LANDING", "A NARROW LANDING. A DOOR LEADS NORTH AND A HATCH IS SET IN THE "
|
|
34
|
+
"CEILING.", {"D": "HALL", "N": "STUDY", "U": "TOWER"}, False, "landing"),
|
|
35
|
+
"STUDY": ("STUDY", "THE ASTRONOMER'S STUDY. CHARTS OF THE SKY COVER THE WALLS.",
|
|
36
|
+
{"S": "LANDING"}, False, "study"),
|
|
37
|
+
"TOWER": ("TOWER", "THE DOME OF THE TOWER. A SLIT OPENS ON THE NIGHT, AND A GREAT "
|
|
38
|
+
"TELESCOPE POINTS AT IT.", {"D": "LANDING"}, False, "tower"),
|
|
39
|
+
}
|
|
40
|
+
START = "LANE"
|
|
41
|
+
|
|
42
|
+
# ---- items --------------------------------------------------------------------
|
|
43
|
+
# key: (description, noun, start, flags, examine text or None)
|
|
44
|
+
# start: a room key, "CARRIED", "IN:<container>" or None (not in play yet).
|
|
45
|
+
# flags: P portable, C container, O container starts open, S scenery (not
|
|
46
|
+
# listed in LOOK; the room text mentions it).
|
|
47
|
+
ITEMS = {
|
|
48
|
+
"NET": ("A FISHING NET", "NET", "SHED", "P", "A LONG-HANDLED NET, STIFF WITH MUD."),
|
|
49
|
+
"LAMP": ("A BRASS LAMP", "LAMP", "IN:CHEST", "P", "IT HOLDS OIL BUT IT IS NOT LIT."),
|
|
50
|
+
"LITLAMP": ("A LIT LAMP", "LAMP", None, "P", "IT BURNS WITH A STEADY FLAME."),
|
|
51
|
+
"KEY": ("AN IRON KEY", "KEY", None, "P", None),
|
|
52
|
+
"MATCHES": ("A BOX OF MATCHES", "MATCHES", "IN:DRAWER", "P", None),
|
|
53
|
+
"LENS": ("A GLASS LENS", "LENS", "IN:CRATE", "P", "A HEAVY LENS, WRAPPED IN FELT."),
|
|
54
|
+
"WINDER": ("A CLOCK WINDER", "WINDER", "IN:DESK", "P", None),
|
|
55
|
+
"BOOK": ("A STAR ATLAS", "BOOK", "LIBRARY", "P",
|
|
56
|
+
"A NOTE IN THE MARGIN SAYS: THE CLOCK KEEPS THE HATCH."),
|
|
57
|
+
"CHEST": ("A WOODEN CHEST", "CHEST", "SHED", "C", None),
|
|
58
|
+
"DRAWER": ("A KITCHEN DRAWER", "DRAWER", "KITCHEN", "C", None),
|
|
59
|
+
"CRATE": ("A PACKING CRATE", "CRATE", "CELLAR", "C", None),
|
|
60
|
+
"DESK": ("A WRITING DESK", "DESK", "STUDY", "C", None),
|
|
61
|
+
"DOOR": ("A LOCKED DOOR", "DOOR", "PORCH", "", "IT IS STOUT OAK WITH AN IRON LOCK."),
|
|
62
|
+
"OPENDOOR": ("AN OPEN DOOR", "DOOR", None, "", None),
|
|
63
|
+
"POND": ("THE POND", "POND", "POND", "S", None),
|
|
64
|
+
"CLOCK": ("THE CLOCK", "CLOCK", "HALL", "S",
|
|
65
|
+
"ITS HANDS ARE STILL. THERE IS A SOCKET FOR A WINDER."),
|
|
66
|
+
"SCOPE": ("THE TELESCOPE", "TELESCOPE", "TOWER", "S", None),
|
|
67
|
+
}
|
|
68
|
+
# How a container's contents are introduced, e.g. "IN THE CHEST: A BRASS LAMP."
|
|
69
|
+
INSIDE = {"CHEST": "IN THE CHEST", "DRAWER": "IN THE DRAWER", "CRATE": "IN THE CRATE",
|
|
70
|
+
"DESK": "IN THE DESK"}
|
|
71
|
+
LIGHT_ITEM = "LITLAMP" # a dark room is lit while this item is in reach
|
|
72
|
+
MAXLOAD = 5 # items carried at once
|
|
73
|
+
MAXSCORE = 100
|
|
74
|
+
|
|
75
|
+
# ---- vocabulary -----------------------------------------------------------------
|
|
76
|
+
# Words match on their first four letters; a shorter word must match whole.
|
|
77
|
+
# Synonyms share an id. Directions are nouns 1 to 6, in this order.
|
|
78
|
+
DIRECTIONS = ["N", "S", "E", "W", "U", "D"]
|
|
79
|
+
VERBS = {
|
|
80
|
+
"GO": ["GO", "WALK", "RUN", "CLIMB"],
|
|
81
|
+
"GET": ["GET", "TAKE", "GRAB", "PICK"],
|
|
82
|
+
"DROP": ["DROP", "DISCARD"],
|
|
83
|
+
"LOOK": ["LOOK", "L", "EXAMINE", "X", "READ", "SEARCH", "INSPECT"],
|
|
84
|
+
"INV": ["INVENTORY", "INV", "I"],
|
|
85
|
+
"OPEN": ["OPEN"],
|
|
86
|
+
"CLOSE": ["CLOSE", "SHUT"],
|
|
87
|
+
"UNLOCK": ["UNLOCK"],
|
|
88
|
+
"LIGHT": ["LIGHT", "IGNITE", "BURN"],
|
|
89
|
+
"WIND": ["WIND", "TURN", "CRANK"],
|
|
90
|
+
"PUT": ["PUT", "FIT", "INSERT", "PLACE"],
|
|
91
|
+
"SCORE": ["SCORE"],
|
|
92
|
+
"SAVE": ["SAVE"],
|
|
93
|
+
"LOAD": ["LOAD", "RESTORE"],
|
|
94
|
+
"QUIT": ["QUIT"],
|
|
95
|
+
"HELP": ["HELP", "HINT"],
|
|
96
|
+
}
|
|
97
|
+
NOUNS = {
|
|
98
|
+
"N": ["N", "NORTH"], "S": ["S", "SOUTH"], "E": ["E", "EAST"], "W": ["W", "WEST"],
|
|
99
|
+
"U": ["U", "UP"], "D": ["D", "DOWN"],
|
|
100
|
+
"NET": ["NET"], "LAMP": ["LAMP", "LANTERN"], "KEY": ["KEY"],
|
|
101
|
+
"MATCHES": ["MATCHES", "MATCH"], "LENS": ["LENS", "GLASS"],
|
|
102
|
+
"WINDER": ["WINDER", "CRANK"], "BOOK": ["BOOK", "ATLAS", "NOTE"],
|
|
103
|
+
"CHEST": ["CHEST", "BOX"], "DRAWER": ["DRAWER"], "CRATE": ["CRATE"], "DESK": ["DESK"],
|
|
104
|
+
"DOOR": ["DOOR"], "POND": ["POND", "WATER", "MUD"], "CLOCK": ["CLOCK"],
|
|
105
|
+
"TELESCOPE": ["TELESCOPE", "SCOPE"], "HATCH": ["HATCH"],
|
|
106
|
+
}
|
|
107
|
+
NOISE = ["THE", "A", "AN", "AT", "TO", "IN", "INTO", "ON", "WITH"] # skipped by the parser
|
|
108
|
+
|
|
109
|
+
# ---- the action table -------------------------------------------------------------
|
|
110
|
+
# Scanned top to bottom before the built-in verbs; the first row whose verb,
|
|
111
|
+
# noun and conditions all hold runs its commands and ends the turn. Verb None:
|
|
112
|
+
# an occurrence, run after every turn. At most four conditions and four commands.
|
|
113
|
+
# Conditions: AT room, CARRIED item, HERE item, REACH item (carried, here or
|
|
114
|
+
# in an open container here), FLAG f, NOTFLAG f, DARK.
|
|
115
|
+
# Commands: MSG text, GOTO room, LOOK, SETF f, SWAP item (item and the next
|
|
116
|
+
# item in ITEMS trade places), CARRY item, DESTROY item, SCORE n, WIN.
|
|
117
|
+
FLAGS = ["GOTKEY", "DOOROPEN", "HATCHOPEN", "LENSIN"]
|
|
118
|
+
ACTIONS = [
|
|
119
|
+
("GO", "N", ["AT PORCH", "NOTFLAG DOOROPEN"], ["MSG THE DOOR IS LOCKED."]),
|
|
120
|
+
("GO", "U", ["AT LANDING", "NOTFLAG HATCHOPEN"], ["MSG THE HATCH IS SHUT FAST."]),
|
|
121
|
+
("LOOK", "POND", ["AT POND", "NOTFLAG GOTKEY"],
|
|
122
|
+
["MSG SOMETHING GLINTS IN THE MUD, JUST OUT OF REACH."]),
|
|
123
|
+
("GET", "KEY", ["AT POND", "NOTFLAG GOTKEY", "CARRIED NET"],
|
|
124
|
+
["SETF GOTKEY", "CARRY KEY", "SCORE 10",
|
|
125
|
+
"MSG YOU SWEEP THE NET THROUGH THE MUD AND LIFT OUT AN IRON KEY."]),
|
|
126
|
+
("GET", "KEY", ["AT POND", "NOTFLAG GOTKEY"], ["MSG IT IS OUT OF REACH."]),
|
|
127
|
+
("UNLOCK", "DOOR", ["AT PORCH", "NOTFLAG DOOROPEN", "CARRIED KEY"],
|
|
128
|
+
["SETF DOOROPEN", "SWAP DOOR", "SCORE 10", "MSG THE KEY TURNS AND THE DOOR SWINGS OPEN."]),
|
|
129
|
+
("UNLOCK", "DOOR", ["AT PORCH", "NOTFLAG DOOROPEN"], ["MSG YOU HAVE NO KEY."]),
|
|
130
|
+
("OPEN", "DOOR", ["AT PORCH", "NOTFLAG DOOROPEN"], ["MSG IT IS LOCKED."]),
|
|
131
|
+
("LIGHT", "LAMP", ["REACH LAMP", "CARRIED MATCHES"],
|
|
132
|
+
["SWAP LAMP", "SCORE 10", "MSG YOU STRIKE A MATCH. THE LAMP GLOWS."]),
|
|
133
|
+
("LIGHT", "LAMP", ["REACH LAMP"], ["MSG YOU HAVE NOTHING TO LIGHT IT WITH."]),
|
|
134
|
+
("LIGHT", "LAMP", ["REACH LITLAMP"], ["MSG IT IS ALREADY LIT."]),
|
|
135
|
+
("WIND", "CLOCK", ["AT HALL", "NOTFLAG HATCHOPEN", "CARRIED WINDER"],
|
|
136
|
+
["SETF HATCHOPEN", "SCORE 15",
|
|
137
|
+
"MSG YOU WIND THE CLOCK. GEARS WHIRR, AND FAR ABOVE A HATCH GRINDS OPEN."]),
|
|
138
|
+
("WIND", "CLOCK", ["AT HALL", "NOTFLAG HATCHOPEN"], ["MSG YOU NEED A WINDER."]),
|
|
139
|
+
("WIND", "CLOCK", ["AT HALL"], ["MSG IT IS FULLY WOUND."]),
|
|
140
|
+
("PUT", "LENS", ["AT TOWER", "CARRIED LENS"],
|
|
141
|
+
["DESTROY LENS", "SETF LENSIN", "SCORE 15", "MSG THE LENS CLICKS INTO THE TELESCOPE."]),
|
|
142
|
+
("LOOK", "TELESCOPE", ["AT TOWER", "FLAG LENSIN"],
|
|
143
|
+
["SCORE 40", "MSG THROUGH THE GLASS THE COMET BLAZES, ITS TAIL ACROSS HALF THE SKY.",
|
|
144
|
+
"WIN"]),
|
|
145
|
+
("LOOK", "TELESCOPE", ["AT TOWER"], ["MSG THE EYEPIECE IS EMPTY. IT NEEDS A LENS."]),
|
|
146
|
+
("LOOK", "HATCH", ["AT LANDING", "FLAG HATCHOPEN"], ["MSG IT STANDS OPEN."]),
|
|
147
|
+
("LOOK", "HATCH", ["AT LANDING"], ["MSG IT IS BOLTED FROM ABOVE BY SOME MECHANISM."]),
|
|
148
|
+
(None, None, ["AT CELLAR", "DARK"], ["MSG SOMETHING SCUTTLES IN THE DARK."]),
|
|
149
|
+
]
|
|
150
|
+
|
|
151
|
+
# ---- what the engine itself prints --------------------------------------------------
|
|
152
|
+
MESSAGES = {
|
|
153
|
+
"DARK": "IT IS TOO DARK TO SEE.",
|
|
154
|
+
"DARKNAME": "DARKNESS",
|
|
155
|
+
"SEE": "YOU CAN SEE ",
|
|
156
|
+
"EXITS": "EXITS:",
|
|
157
|
+
"NOEXITS": "NO EXITS.",
|
|
158
|
+
"CARRYING": "YOU ARE CARRYING ",
|
|
159
|
+
"NOTHING": "NOTHING",
|
|
160
|
+
"EMPTY": "IT IS EMPTY.",
|
|
161
|
+
"CLOSED": "IT IS CLOSED.",
|
|
162
|
+
"UNKNOWN": "I DON'T KNOW THE WORD ",
|
|
163
|
+
"PARDON": "PARDON?",
|
|
164
|
+
"NOWAY": "YOU CAN'T GO THAT WAY.",
|
|
165
|
+
"WHICHWAY": "WHICH WAY?",
|
|
166
|
+
"TAKEN": "TAKEN.",
|
|
167
|
+
"DROPPED": "DROPPED.",
|
|
168
|
+
"HAVEIT": "YOU ALREADY HAVE IT.",
|
|
169
|
+
"NOTHERE": "YOU SEE NO SUCH THING HERE.",
|
|
170
|
+
"NOTHAVE": "YOU ARE NOT CARRYING IT.",
|
|
171
|
+
"FULL": "YOUR HANDS ARE FULL.",
|
|
172
|
+
"FIXED": "IT WON'T BUDGE.",
|
|
173
|
+
"OPENED": "OPENED.",
|
|
174
|
+
"CLOSEDOK": "CLOSED.",
|
|
175
|
+
"ISOPEN": "IT IS ALREADY OPEN.",
|
|
176
|
+
"ISSHUT": "IT IS ALREADY CLOSED.",
|
|
177
|
+
"NOTOPEN": "YOU CAN'T OPEN THAT.",
|
|
178
|
+
"NOTHINGSPECIAL": "YOU SEE NOTHING SPECIAL.",
|
|
179
|
+
"CANT": "YOU CAN'T DO THAT.",
|
|
180
|
+
"WHAT": "WHAT?",
|
|
181
|
+
"SCORED": "YOU HAVE SCORED ",
|
|
182
|
+
"OUTOF": " OUT OF ",
|
|
183
|
+
"IN": " IN ",
|
|
184
|
+
"TURNS": " TURNS.",
|
|
185
|
+
"TURN": " TURN.",
|
|
186
|
+
"WITHIT": "WHAT DO YOU WANT TO DO WITH IT?",
|
|
187
|
+
"WON": "YOU HAVE SEEN THE COMET. THE NIGHT IS YOURS!",
|
|
188
|
+
"QUITS": "YOU LEAVE THE HOUSE TO ITS DREAMS.",
|
|
189
|
+
"RANK0": "RANK: STARGAZER.",
|
|
190
|
+
"RANK1": "RANK: CLOUD WATCHER.",
|
|
191
|
+
"AGAIN": "PRESS RETURN TO PLAY AGAIN.",
|
|
192
|
+
"HELP": "TRY VERBS LIKE GO, GET, DROP, OPEN, LOOK, LIGHT, INVENTORY, SCORE, SAVE AND LOAD.",
|
|
193
|
+
"SAVED": "GAME SAVED ",
|
|
194
|
+
"LOADED": "GAME LOADED ",
|
|
195
|
+
"NOSAVE": "NO SAVED GAME ",
|
|
196
|
+
"BADSAVE": "THE SAVED GAME IS DAMAGED ",
|
|
197
|
+
"DISKFAIL": "DISK ERROR: ",
|
|
198
|
+
"NODRIVE": "NO DRIVE ANSWERS AS DEVICE 8.",
|
|
199
|
+
"OLDSAVE": "THE SAVE IS FROM ANOTHER VERSION ",
|
|
200
|
+
"INTRO": "STARWATCH. TONIGHT THE COMET PASSES, AND THE OLD ASTRONOMER'S TOWER "
|
|
201
|
+
"HAS THE ONLY TELESCOPE FOR MILES.",
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
# ---- pictures --------------------------------------------------------------------------
|
|
205
|
+
# The strip is 40 x 7 cells of multicolour characters. A tile is a glyph of
|
|
206
|
+
# 4 x 8 double-wide pixels: '.' $D021 (black), 'a' $D022 (grey), 'b' $D023
|
|
207
|
+
# (brown), 'c' the cell's own colour (0-7), given with the tile where it is used.
|
|
208
|
+
GLYPHS = {
|
|
209
|
+
"sky": ["...."] * 8,
|
|
210
|
+
"star": ["....", "..c.", "....", "....", "....", "....", "....", "...."],
|
|
211
|
+
"star2": ["....", "....", "....", "....", "....", ".c..", "....", "...."],
|
|
212
|
+
"solid": ["cccc"] * 8,
|
|
213
|
+
"stone": ["aaa.", "aaa.", "aaa.", "....", "a.aa", "a.aa", "a.aa", "...."],
|
|
214
|
+
"plank": ["bbbb", "bbbb", "bbbb", "....", "bbbb", "bbbb", "bbbb", "...."],
|
|
215
|
+
"wood": ["bbb."] * 8,
|
|
216
|
+
"earth": ["bbab", "bbbb", "abbb", "bbbb", "bbba", "bbbb", "babb", "bbbb"],
|
|
217
|
+
"grass": ["..c.", ".c.c", "cccc", "cccc", "cbcc", "cccc", "ccbc", "cccc"],
|
|
218
|
+
"water": ["cccc", "acca", "cccc", "cc.c", "cccc", "accc", "cccc", "c.cc"],
|
|
219
|
+
"leaves": [".cc.", "cccc", "cc.c", "cccc", ".ccc", "cccc", "c.cc", ".cc."],
|
|
220
|
+
"window": ["bbbb", "bccc", "bccc", "bbbb", "bccc", "bccc", "bccc", "bbbb"],
|
|
221
|
+
"bars": ["c.c.", "c.c.", "c.c.", "c.c.", "c.c.", "c.c.", "c.c.", "c.c."],
|
|
222
|
+
"knob": ["bbbb", "bbbb", "bbbb", "bbcb", "bbbb", "bbbb", "bbbb", "bbbb"],
|
|
223
|
+
"books": ["cacb", "cacb", "cacb", "cacb", "cacb", "cacb", "cacb", "bbbb"],
|
|
224
|
+
"slopel": ["...a", "...a", "..aa", "..aa", ".aaa", ".aaa", "aaaa", "aaaa"],
|
|
225
|
+
"sloper": ["a...", "a...", "aa..", "aa..", "aaa.", "aaa.", "aaaa", "aaaa"],
|
|
226
|
+
"net": ["a.a.", ".a.a", "a.a.", ".a.a", "a.a.", ".a.a", "a.a.", ".a.a"],
|
|
227
|
+
"face": [".cc.", "cccc", "cbcc", "cbbc", "cccc", ".cc.", "..b.", "..b."],
|
|
228
|
+
"eyes": ["....", "....", "c.c.", "....", "....", "....", "....", "...."],
|
|
229
|
+
"tube": ["...c", "..cc", ".cc.", "cc..", "c...", "....", "....", "...."],
|
|
230
|
+
"box": ["bbbb", "b..b", "bbbb", "bcbb", "bbbb", "bbbb", "bbbb", "...."],
|
|
231
|
+
}
|
|
232
|
+
BLACK, WHITE, RED, CYAN, PURPLE, GREEN, BLUE, YELLOW = range(8)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def sky(p):
|
|
236
|
+
"""Night sky with a fixed star field."""
|
|
237
|
+
p.fill(0, 0, 39, 6, "sky")
|
|
238
|
+
for i, (x, y) in enumerate([(3, 0), (11, 1), (17, 0), (24, 2), (30, 0), (36, 1),
|
|
239
|
+
(7, 2), (20, 1), (33, 3), (1, 3), (27, 1), (14, 3)]):
|
|
240
|
+
p.put(x, y, "star" if i % 2 else "star2", WHITE)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def inside(p, wall="stone", floor="plank"):
|
|
244
|
+
p.fill(0, 0, 39, 5, wall)
|
|
245
|
+
p.fill(0, 6, 39, 6, floor)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def pic_lane(p):
|
|
249
|
+
sky(p); p.put(4, 1, "solid", WHITE)
|
|
250
|
+
p.fill(8, 2, 39, 5, "stone"); p.fill(20, 2, 23, 5, "bars", BLUE)
|
|
251
|
+
p.fill(0, 6, 39, 6, "earth")
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def pic_garden(p):
|
|
255
|
+
sky(p); p.fill(0, 5, 39, 6, "grass", GREEN)
|
|
256
|
+
p.fill(2, 1, 7, 3, "leaves", GREEN); p.fill(4, 4, 5, 5, "wood")
|
|
257
|
+
p.fill(15, 2, 27, 4, "stone"); p.put(14, 2, "slopel"); p.put(28, 2, "sloper")
|
|
258
|
+
p.put(18, 3, "window", YELLOW); p.put(24, 3, "window", YELLOW)
|
|
259
|
+
p.fill(33, 3, 37, 4, "plank"); p.put(35, 3, "window", YELLOW)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def pic_shed(p):
|
|
263
|
+
inside(p, "wood", "earth")
|
|
264
|
+
p.fill(15, 4, 23, 5, "box"); p.put(19, 4, "knob", YELLOW)
|
|
265
|
+
p.fill(30, 1, 33, 3, "net")
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def pic_pond(p):
|
|
269
|
+
sky(p); p.put(30, 1, "solid", WHITE)
|
|
270
|
+
p.fill(0, 4, 39, 6, "water", BLUE); p.put(30, 5, "solid", WHITE)
|
|
271
|
+
p.fill(1, 0, 8, 3, "leaves", GREEN); p.fill(4, 3, 5, 3, "wood")
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def pic_porch(p):
|
|
275
|
+
inside(p, "stone", "plank")
|
|
276
|
+
p.fill(16, 1, 22, 5, "wood"); p.put(21, 3, "knob", YELLOW)
|
|
277
|
+
p.put(8, 2, "window", YELLOW); p.put(30, 2, "window", YELLOW)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def pic_hall(p):
|
|
281
|
+
inside(p)
|
|
282
|
+
p.fill(6, 0, 9, 5, "wood"); p.fill(7, 1, 8, 1, "face", WHITE)
|
|
283
|
+
for i in range(5):
|
|
284
|
+
p.fill(26 + 2 * i, 5 - i, 39, 5 - i, "plank")
|
|
285
|
+
p.fill(15, 2, 18, 5, "wood")
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def pic_kitchen(p):
|
|
289
|
+
inside(p, "stone", "earth")
|
|
290
|
+
p.fill(4, 3, 12, 5, "solid", RED); p.fill(5, 1, 6, 2, "solid", BLACK)
|
|
291
|
+
p.fill(22, 3, 33, 5, "wood"); p.put(27, 4, "knob", YELLOW)
|
|
292
|
+
p.put(16, 0, "bars", WHITE); p.put(18, 0, "bars", WHITE)
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def pic_library(p):
|
|
296
|
+
inside(p, "wood", "plank")
|
|
297
|
+
colours = [RED, GREEN, YELLOW, BLUE, PURPLE, CYAN]
|
|
298
|
+
for y in (0, 2, 4):
|
|
299
|
+
for x in range(1, 39):
|
|
300
|
+
if x % 7:
|
|
301
|
+
p.put(x, y, "books", colours[(x + y) % 6])
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def pic_cellar(p):
|
|
305
|
+
inside(p, "stone", "earth")
|
|
306
|
+
p.fill(18, 3, 25, 5, "box"); p.put(21, 4, "knob", YELLOW)
|
|
307
|
+
p.fill(0, 0, 3, 5, "slopel")
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def pic_dark(p):
|
|
311
|
+
p.fill(0, 0, 39, 6, "sky")
|
|
312
|
+
p.put(12, 3, "eyes", YELLOW); p.put(29, 4, "eyes", YELLOW)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def pic_landing(p):
|
|
316
|
+
inside(p, "wood", "plank")
|
|
317
|
+
p.fill(0, 4, 39, 4, "bars", WHITE)
|
|
318
|
+
p.fill(17, 0, 22, 0, "box"); p.fill(30, 1, 34, 5, "wood")
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def pic_study(p):
|
|
322
|
+
inside(p, "wood", "plank")
|
|
323
|
+
p.fill(4, 1, 11, 3, "sky"); p.put(6, 2, "star", WHITE); p.put(9, 1, "star2", WHITE)
|
|
324
|
+
p.fill(20, 4, 33, 5, "box"); p.put(26, 4, "knob", YELLOW)
|
|
325
|
+
p.put(22, 3, "solid", YELLOW)
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
def pic_tower(p):
|
|
329
|
+
p.fill(0, 0, 39, 6, "stone")
|
|
330
|
+
p.fill(14, 0, 25, 4, "sky")
|
|
331
|
+
p.put(16, 1, "star", WHITE); p.put(22, 0, "star2", WHITE); p.put(19, 3, "star", WHITE)
|
|
332
|
+
for i in range(4):
|
|
333
|
+
p.put(18 + i, 5 - i, "tube", WHITE)
|
|
334
|
+
p.fill(0, 6, 39, 6, "plank")
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
PICTURES = {"lane": pic_lane, "garden": pic_garden, "shed": pic_shed, "pond": pic_pond,
|
|
338
|
+
"porch": pic_porch, "hall": pic_hall, "kitchen": pic_kitchen,
|
|
339
|
+
"library": pic_library, "cellar": pic_cellar, "landing": pic_landing,
|
|
340
|
+
"study": pic_study, "tower": pic_tower, "dark": pic_dark}
|
|
341
|
+
DARK_PICTURE = "dark"
|
|
342
|
+
TITLE_PICTURE = "tower"
|
|
343
|
+
|
|
344
|
+
# ---- the autopilot ------------------------------------------------------------------------
|
|
345
|
+
# Typed through the KERNAL keyboard queue, up to ten bytes a frame. The shot
|
|
346
|
+
# plays all of it with a copy of the release disk in drive 8. make disktest
|
|
347
|
+
# splits it at the SAVE: part one ends with the SAVE; part two starts at the
|
|
348
|
+
# LOAD after a cold reset (DISK_SPLIT).
|
|
349
|
+
SCRIPT = [
|
|
350
|
+
"XYZZY", "N", "E", "OPEN CHEST", "PICK UP LANTERN", "GET NET", "W", "W",
|
|
351
|
+
"POND", "GET KEY", "DROP NET", "E", "N", "N", "UNLOCK DOOR", "N",
|
|
352
|
+
"SAVE", "E", "OPEN DRAWER", "GET MATCHES", "DROP LAMP", "LOAD",
|
|
353
|
+
"W", "E", "E", "OPEN DRAWER", "GET MATCHES", "W", "D", "LIGHT LAMP", "OPEN CRATE", "GET LENS", "U",
|
|
354
|
+
"U", "U", "N", "OPEN DESK", "GET WINDER", "S", "D", "WIND CLOCK", "U", "U",
|
|
355
|
+
"PUT LENS IN TELESCOPE", "LOOK AT TELESCOPE",
|
|
356
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"PreToolUse": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "Edit|MultiEdit|Write|NotebookEdit",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "h=\"$CLAUDE_PROJECT_DIR/harness/hooks/plan-gate.py\"; [ -f \"$h\" ] || h=\"$CLAUDE_PROJECT_DIR/../_harness/hooks/plan-gate.py\"; exec python3 \"$h\"",
|
|
11
|
+
"timeout": 10
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Rules for an agent working on this C64 program
|
|
2
|
+
|
|
3
|
+
This program runs on a stock Commodore 64, PAL and NTSC. It is built on the
|
|
4
|
+
c64-kb harness (`./harness`, vendored from c64-kb's `templates/_harness`).
|
|
5
|
+
c64-kb is the reference: its pages give the registers, timings, techniques,
|
|
6
|
+
pitfalls and recipes this program is built from. A wrong number becomes a torn
|
|
7
|
+
screen or a crash, so every claim here is measured or says it is not.
|
|
8
|
+
|
|
9
|
+
A new program starts in c64-kb with `npm run new-project -- <starter> <dir>`.
|
|
10
|
+
That copies the starter and the harness, points `.mcp.json` and `local.mk`
|
|
11
|
+
at the c64-kb checkout, proves the copy with `make shot check`, and leaves a
|
|
12
|
+
blank `PLAN.md`.
|
|
13
|
+
|
|
14
|
+
## This starter: beat-em-up
|
|
15
|
+
|
|
16
|
+
A side-on street brawler that plays: `README.md` has the file map, how a
|
|
17
|
+
frame runs, the measured frame and the three most likely next steps. Rules
|
|
18
|
+
this program depends on:
|
|
19
|
+
|
|
20
|
+
- The sprite registers belong to the IRQ chain in `src/engine.asm`: three
|
|
21
|
+
bands a frame (line 251 the GO sign, line 76 the fighters, line 212 the
|
|
22
|
+
HUD faces). C fills the back half of the tables and publishes it with
|
|
23
|
+
the next picture's `$D016` and `$D018` (`view_sprites`, `view_publish`).
|
|
24
|
+
- The fighter band holds eight sprites and never reuses one: four sprite
|
|
25
|
+
fighters of two parts, or three and the brute. A fifth sprite fighter, or
|
|
26
|
+
a third part, has no sprite on those lines. The nearest fighter takes
|
|
27
|
+
sprites 0 and 1: depth is the VIC-II's sprite priority. Keep a fighter's
|
|
28
|
+
highest line at 91 or below (ground line 150, jump 18) so the band's IRQ
|
|
29
|
+
at line 76 has finished.
|
|
30
|
+
- The brute is character cells (`src/brute.c`): two character sets at
|
|
31
|
+
`$E000` and `$E800`, one brute a wave, his cells in both street pages.
|
|
32
|
+
Street glyphs on rows 2-19 use bit pairs 00 and 01 only, or `$D01B`
|
|
33
|
+
hides fighters behind the street too. His cell moves must finish before
|
|
34
|
+
his top row: the verdict counts the ones that did not.
|
|
35
|
+
- `make flickercheck` after any change to the fighters, the art, the poses
|
|
36
|
+
or the IRQs: `tools/flickercheck.py` renders the fighters and the brute
|
|
37
|
+
from `src/` (the `SPRITE-ART`, `BRUTE-ART` and `POSES` blocks in `art.c`,
|
|
38
|
+
the enums and colours in `game.h`, the colours in `view.c`: keep their
|
|
39
|
+
markers and shapes) and matches shots inside the photo stops. A changed
|
|
40
|
+
wave, AI or art moves the stops: re-pin `FLICKER_PAL` and `FLICKER_NTSC`.
|
|
41
|
+
`make gameover` checks the GAME OVER screen.
|
|
42
|
+
- The scroll never writes the page on display but for the brute's cells:
|
|
43
|
+
it prepares the other page four rows a frame (`src/view.c`). Keep the
|
|
44
|
+
camera at a pixel a frame.
|
|
45
|
+
- The frame is nearly full on NTSC (16,593 of 17,095 at the run's worst, README):
|
|
46
|
+
meter anything you add, with `-dPROF=n` for one subsystem and
|
|
47
|
+
`-dMETER_WINDOW=n` for another part of the run.
|
|
48
|
+
- World x stays below 32,768 and is compared as unsigned: Oscar64 compares
|
|
49
|
+
an `int` loaded from a larger `unsigned` as not negative (c64-kb #30
|
|
50
|
+
fault 8; README, "Which Oscar64").
|
|
51
|
+
- The autopilot is a bot (`src/autopilot.h`), not a timeline: it reads the
|
|
52
|
+
game and plays on. `-dDEBUG_AT=n` freezes at frame n and prints the
|
|
53
|
+
state on the HUD. On a failed verdict, row 24 shows the failed checks as
|
|
54
|
+
bits and row 22 the counts behind them.
|
|
55
|
+
|
|
56
|
+
`PLAN.md` here is this starter's plan, filled from real tool output;
|
|
57
|
+
new-project keeps it as `PLAN-beat-em-up-example.md` and gives the new
|
|
58
|
+
program a blank one.
|
|
59
|
+
|
|
60
|
+
## Before any code
|
|
61
|
+
|
|
62
|
+
1. Brief: `npx tsx src/cli.ts game-briefing "<concept>" --archetype <name>`
|
|
63
|
+
(or `demo-briefing`), in the c64-kb checkout. Read what it proposes.
|
|
64
|
+
2. For each technique you keep: `technique-lookup <name>` and
|
|
65
|
+
`pitfalls-for <name>`. Start from the recipe it names (`recipe-lookup`).
|
|
66
|
+
3. Fill `PLAN.md`: paste the whole output of `check-compatibility` and of
|
|
67
|
+
`plan-budget` (same techniques) into their sections, list every technique
|
|
68
|
+
in its table, and replace every `FILL:` line.
|
|
69
|
+
|
|
70
|
+
Until `PLAN.md` passes, a hook blocks Edit and Write under `src/`, and every
|
|
71
|
+
make target that builds stops (`make plan-gate` says what is missing). With
|
|
72
|
+
C64KB set, `make` re-runs `check-compatibility` and wants the pasted Verdict.
|
|
73
|
+
The gate cannot see writes made through a shell command, or outputs edited
|
|
74
|
+
into shape by hand: do neither. `make PLAN_GATE=off` overrides it; say why in
|
|
75
|
+
`PLAN.md` if you do.
|
|
76
|
+
|
|
77
|
+
## The loop
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
make # build build/<name>.prg
|
|
81
|
+
make shot check # autopilot build, headless PAL and NTSC, graded by expect.json
|
|
82
|
+
make selftest # the FORCE_FAULT build must fail the same checks
|
|
83
|
+
make disk # build/<name>.d64
|
|
84
|
+
make claims # every store the program makes, against what it declares
|
|
85
|
+
make run # windowed VICE, for a human
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Rules
|
|
89
|
+
|
|
90
|
+
- Build before claiming. Code that has not built is not done.
|
|
91
|
+
- Measure screenshots with `check.py` through `expect.json`, never by eye.
|
|
92
|
+
Every visible claim gets a check. Add one before you trust a change.
|
|
93
|
+
- PAL and NTSC: both shots pass, or it is not done.
|
|
94
|
+
- Name the rung for every number: measured here (`make shot`, the meter, the
|
|
95
|
+
VICE monitor), taken from a c64-kb page (say which), arithmetic, or not
|
|
96
|
+
measured. Never call something verified that was not run.
|
|
97
|
+
- Frame cost comes from the meter: CIA2 timer A, printed as
|
|
98
|
+
`F<frames> W<worst> T<typical>` at row 24, columns 20 to 39, in AUTOPILOT
|
|
99
|
+
builds. It records the first `hold` frames: make that the autopilot
|
|
100
|
+
script's play frames. Typical is the median of those frames, the KB's
|
|
101
|
+
`cycles_per_frame_typical`. Keep grading, logging and printing outside the
|
|
102
|
+
bracket; work split between the main loop and IRQs is summed with
|
|
103
|
+
`METER_PAUSE` / `METER_START`.
|
|
104
|
+
- Do not invent a register, routine or address. Look it up:
|
|
105
|
+
`lookup-register`, `lookup-kernal`, `memory-map`.
|
|
106
|
+
- Lint every source you change: `npx tsx src/cli.ts lint <file>`.
|
|
107
|
+
- Commit named paths only. Never `git add -A` or `git add .`. `build/`,
|
|
108
|
+
`shots/` and `local.mk` are never committed.
|
|
109
|
+
|
|
110
|
+
## Harness facts you will need
|
|
111
|
+
|
|
112
|
+
- `AUTOPILOT=1` builds read a scripted joystick byte instead of `$DC00` and
|
|
113
|
+
grade themselves: `$02FF` = `$01` and a green border on pass, `$02` and red
|
|
114
|
+
on fail. `FORCE_FAULT=1` must turn the verdict red and move something a
|
|
115
|
+
screenshot check can see.
|
|
116
|
+
- Screenshot geometry (c64-kb `docs/runtime/vice-reference.md`): PAL 384 x 272,
|
|
117
|
+
row = raster line - 16; NTSC 384 x 247, row = line - 28; x = VIC X + 8. A
|
|
118
|
+
sprite at Y register y is drawn from line y + 1.
|
|
119
|
+
- `check.py` reads text in the ROM character set unless a check names a
|
|
120
|
+
`charset` file; the meter's cells need 0-9, F, W and T in the set on screen.
|
|
121
|
+
- A KickAssembler part called from C is a raw blob at its own `* =` address,
|
|
122
|
+
`$0880` or above; `build/asm.h` gives C its labels as `ASM_<LABEL>`
|
|
123
|
+
(`ASM_<SCOPE>_<LABEL>` inside a scope). Pass arguments through bytes in the
|
|
124
|
+
blob, not Oscar64's zero page (`$02` to `$52`).
|
|
125
|
+
- The meter takes CIA2 timer A. Do not open RS-232 (device 2) while it runs.
|
|
126
|
+
- The KERNAL serial routines end in `CLI` (ROM bytes `58 60` / `58 18` at
|
|
127
|
+
`$EDAB`, `$EDB5`, `$EDDB`, `$EE82`). After any disk call, `SEI` again if
|
|
128
|
+
the program runs with the KERNAL IRQ off: otherwise that IRQ lands inside
|
|
129
|
+
the meter's brackets and rewrites `$DC00`.
|
|
130
|
+
|
|
131
|
+
## Calling c64-kb
|
|
132
|
+
|
|
133
|
+
- CLI, from the c64-kb checkout (`C64KB` in `local.mk`):
|
|
134
|
+
`npx tsx src/cli.ts <command>`; `npx tsx src/cli.ts --help` lists them.
|
|
135
|
+
- MCP: `.mcp.json` starts `node <c64-kb>/dist/cli.js serve` (run
|
|
136
|
+
`npm run build` in c64-kb first).
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# beat-em-up: the side-on brawler starter. Every target but flickercheck
|
|
2
|
+
# and joy comes from the harness:
|
|
3
|
+
# make build build/beat-em-up.prg (after the PLAN.md gate)
|
|
4
|
+
# make run windowed VICE, joystick in port 2
|
|
5
|
+
# make shot headless PAL and NTSC exit screenshots of the autopilot build
|
|
6
|
+
# make check grade shots/pal.png and shots/ntsc.png against expect.json
|
|
7
|
+
# make selftest prove check fails on the FORCE_FAULT=1 build
|
|
8
|
+
# make flickercheck shoot the autopilot run inside its three photo stops and
|
|
9
|
+
# match the fighter band pixel for pixel against a render
|
|
10
|
+
# of the fighters the program printed (tools/flickercheck.py);
|
|
11
|
+
# then prove the check fails on the FLICKER_DEMO=1 build
|
|
12
|
+
# make gameover the AP_GIVE_UP=1 build: the bot never fights, three lives
|
|
13
|
+
# go, GAME OVER shows; graded by expect-gameover.json
|
|
14
|
+
# make joy the normal game reading its port byte from $02FE, for tools/drive.py
|
|
15
|
+
# make disk build/beat-em-up.d64
|
|
16
|
+
# make claims c64-kb's claims-watch over the autopilot build
|
|
17
|
+
# make clean
|
|
18
|
+
NAME := beat-em-up
|
|
19
|
+
C_MAIN := src/main.c
|
|
20
|
+
KICK_SRC := src/engine.asm
|
|
21
|
+
|
|
22
|
+
# Pinned after the verdict (graded before 100M cycles on both models), where
|
|
23
|
+
# nothing on the screen changes: 120M and 130M gave identical PAL pictures,
|
|
24
|
+
# 110M and 130M identical NTSC ones (VICE x64sc 3.10).
|
|
25
|
+
SHOT_CYCLES_PAL := 120000000
|
|
26
|
+
SHOT_CYCLES_NTSC := 110000000
|
|
27
|
+
|
|
28
|
+
# What the program may write, for make claims (claims-watch's own grammar).
|
|
29
|
+
# - Oscar64's registers start at $02 (BC_REG_WORK_Y). A function with more
|
|
30
|
+
# temporaries than BC_REG_TMP ($43) to BC_REG_TMP_SAVED ($53) spills
|
|
31
|
+
# past $53 (its InterCode.cpp, AddSpace). Measured by claims-watch:
|
|
32
|
+
# $54-$5F (view_sprites, vic_compare, vic_expect) and $60 (grade, in the
|
|
33
|
+
# AUTOPILOT build); the first draft used $54-$56. $61-$6F is headroom for
|
|
34
|
+
# the next such edit; nothing else lives there.
|
|
35
|
+
# - The KERNAL's IRQ runs until main's SEI, so IRQ is declared.
|
|
36
|
+
# - $DC0D (all CIA1 interrupts off) counts against the three CIA1 units.
|
|
37
|
+
# - CIA2 timer A is the harness meter's; timer B times the IRQs for the
|
|
38
|
+
# meter (engine.asm); the $DD0D stores count against all three CIA2
|
|
39
|
+
# units, so all three are declared as the harness's.
|
|
40
|
+
# - The whole run, title to verdict, is traced (--cycles, the PAL pin).
|
|
41
|
+
CLAIMS_ARGS := --claim 'sprite_0, sprite_1, sprite_2, sprite_3, sprite_4, sprite_5, sprite_6, sprite_7, vic_raster_irq, irq_vector_fffe, nmi_vector_fffa, cia2_vic_bank, cia1_port_a, cia1_timer_a, cia1_timer_b, cia1_tod, sid_voice_1, sid_voice_2, sid_voice_3, sid_filter_volume, zero_page $$02-$$6F' --range 'colour=$$D800-$$DBFF,result=$$02FF' --harness 'cia2_timer_a, cia2_timer_b, cia2_tod' --kernal IRQ --cycles 120000000
|
|
42
|
+
|
|
43
|
+
# This starter's own proofs, which npm run verify:templates runs too.
|
|
44
|
+
VERIFY_TARGETS := flickercheck gameover
|
|
45
|
+
|
|
46
|
+
# The harness sits beside the starter in c64-kb (../_harness) or is vendored
|
|
47
|
+
# into ./harness when the starter is copied out on its own.
|
|
48
|
+
HARNESS ?= $(firstword $(wildcard harness) ../_harness)
|
|
49
|
+
$(if $(wildcard $(HARNESS)/harness.mk),,$(error No harness at '$(HARNESS)'. Copy c64-kb's templates/_harness to ./harness, or make the project with npm run new-project in c64-kb))
|
|
50
|
+
include $(HARNESS)/harness.mk
|
|
51
|
+
|
|
52
|
+
# ---- flickercheck: every fighter part is on the screen in the crowded moments ----
|
|
53
|
+
# Two pins inside each of the three photo stops (src/verdict.h), found by
|
|
54
|
+
# scanning the run; a stop is 64 frames, about 1.26M cycles on PAL and
|
|
55
|
+
# 1.09M on NTSC. A changed AI, wave or art moves the stops: re-scan with
|
|
56
|
+
# `-dDEBUG_AT=n` builds or shots, and re-pin.
|
|
57
|
+
FLICKER_PAL := 34200000 34700000 44250000 44750000 80700000 81200000
|
|
58
|
+
FLICKER_NTSC := 30600000 31100000 42900000 43400000 78700000 78950000
|
|
59
|
+
PRG_FLICKER := build/$(NAME)-flicker.prg
|
|
60
|
+
$(PRG_FLICKER): $(C_DEPS) $(ASM_OUT) $(METER_DEPS) | plan-gate
|
|
61
|
+
@mkdir -p build
|
|
62
|
+
$(OSCAR64_BUILD) -d$(AUTOPILOT_DEFINE)=1 -dFLICKER_DEMO=1 -o=$@ $(C_MAIN)
|
|
63
|
+
|
|
64
|
+
FLICKER = $(PYTHON) tools/flickercheck.py --x64sc $(X64SC) --src src
|
|
65
|
+
.PHONY: flickercheck
|
|
66
|
+
flickercheck: $(PRG_AUTO) $(PRG_FLICKER)
|
|
67
|
+
$(FLICKER) --expect whole --model pal $(PRG_AUTO) $(FLICKER_PAL)
|
|
68
|
+
$(FLICKER) --expect whole --model ntsc $(PRG_AUTO) $(FLICKER_NTSC)
|
|
69
|
+
$(FLICKER) --expect dropped --model pal $(PRG_FLICKER) $(FLICKER_PAL)
|
|
70
|
+
|
|
71
|
+
# ---- gameover: the game reaches GAME OVER, and the message is whole -----------------
|
|
72
|
+
# The AP_GIVE_UP=1 build presses fire on the title and never fights; the
|
|
73
|
+
# program checks the HUD a second into GAME OVER and freezes (verdict.h,
|
|
74
|
+
# grade_gameover). The pins are past that point on each model.
|
|
75
|
+
PRG_OVER := build/$(NAME)-over.prg
|
|
76
|
+
GAMEOVER_PAL := 60000000
|
|
77
|
+
GAMEOVER_NTSC := 55000000
|
|
78
|
+
$(PRG_OVER): $(C_DEPS) $(ASM_OUT) $(METER_DEPS) | plan-gate
|
|
79
|
+
@mkdir -p build
|
|
80
|
+
$(OSCAR64_BUILD) -d$(AUTOPILOT_DEFINE)=1 -dAP_GIVE_UP=1 -o=$@ $(C_MAIN)
|
|
81
|
+
|
|
82
|
+
.PHONY: gameover
|
|
83
|
+
gameover: $(PRG_OVER)
|
|
84
|
+
$(call vice_shot,$(PRG_OVER),$(GAMEOVER_PAL),,shots/over-pal.png)
|
|
85
|
+
$(call vice_shot,$(PRG_OVER),$(GAMEOVER_NTSC),-model ntsc,shots/over-ntsc.png)
|
|
86
|
+
$(PYTHON) $(HARNESS_DIR)/check.py expect-gameover.json shots/over-pal.png shots/over-ntsc.png
|
|
87
|
+
|
|
88
|
+
# The normal game with its port byte read from $02FE instead of $DC00, so a
|
|
89
|
+
# VICE monitor can drive it headless (tools/drive.py).
|
|
90
|
+
PRG_JOY := build/$(NAME)-joy.prg
|
|
91
|
+
$(PRG_JOY): $(C_DEPS) $(ASM_OUT) $(METER_DEPS) | plan-gate
|
|
92
|
+
@mkdir -p build
|
|
93
|
+
$(OSCAR64_BUILD) -dJOY_SOURCE=0x02fe -o=$@ $(C_MAIN)
|
|
94
|
+
|
|
95
|
+
.PHONY: joy
|
|
96
|
+
joy: $(PRG_JOY)
|