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,248 @@
|
|
|
1
|
+
// game.h: what the modules share. One header, so an agent sees the whole
|
|
2
|
+
// game's state in one place. Each module's .c is pulled in by the
|
|
3
|
+
// #pragma compile lines at the end (Oscar64 has no object linker).
|
|
4
|
+
#ifndef GAME_H
|
|
5
|
+
#define GAME_H
|
|
6
|
+
|
|
7
|
+
#include <c64/vic.h>
|
|
8
|
+
#include <c64/cia.h>
|
|
9
|
+
|
|
10
|
+
#ifndef AUTOPILOT
|
|
11
|
+
#define AUTOPILOT 0
|
|
12
|
+
#endif
|
|
13
|
+
#ifndef FORCE_FAULT
|
|
14
|
+
#define FORCE_FAULT 0
|
|
15
|
+
#endif
|
|
16
|
+
#ifndef STAGE_CROWD
|
|
17
|
+
#define STAGE_CROWD 0 // 1: the crowded first view of make stage
|
|
18
|
+
#endif
|
|
19
|
+
#ifndef TEAR_DEMO
|
|
20
|
+
#define TEAR_DEMO 0 // 1: shift the page on display in place (the old, torn way)
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
// ---- memory: VIC bank 3 ($C000-$FFFF) -----------------------------------
|
|
24
|
+
#define PAGE0 ((char *)0xc000) // playfield pages (rows 0-19 used, 20 blank)
|
|
25
|
+
#define PAGE1 ((char *)0xc400)
|
|
26
|
+
#define PAGE2 ((char *)0xe800) // RAM under the KERNAL, which is banked out
|
|
27
|
+
#define HUDPAGE ((char *)0xc800) // the HUD rows 21-24 are read from here
|
|
28
|
+
#define SPRMEM ((char *)0xcc00) // sprite blocks 48-63
|
|
29
|
+
#define CHARSET ((char *)0xe000) // RAM under the KERNAL
|
|
30
|
+
#define COLOUR ((char *)0xd800)
|
|
31
|
+
#define SPR_BLOCK 48 // block number of SPRMEM in bank 3
|
|
32
|
+
#define D018_PAGE0 0x08 // screen $C000, characters $E000
|
|
33
|
+
#define D018_PAGE1 0x18 // screen $C400
|
|
34
|
+
#define D018_PAGE2 0xa8 // screen $E800
|
|
35
|
+
#define D018_HUD 0x28 // screen $C800
|
|
36
|
+
#define D016_PLAY 0x10 // multicolour, 38 columns; | XSCROLL
|
|
37
|
+
#define RESULT (*(volatile char *)0x02ff) // $01 pass, $02 fail
|
|
38
|
+
|
|
39
|
+
#define PF_ROWS 20 // playfield character rows
|
|
40
|
+
#define HUD_ROW 21 // first HUD row
|
|
41
|
+
#define SYNC_LINE 251 // the frame starts here (engine.asm's irq_blank)
|
|
42
|
+
#define SPLIT_LINE 212 // the HUD split, inside the blank row 20
|
|
43
|
+
|
|
44
|
+
// ---- colours ----------------------------------------------------------------
|
|
45
|
+
#define COL_SKY VCOL_BLUE // $D021, also the border in play
|
|
46
|
+
#define COL_EARTH VCOL_BROWN // $D022, multicolour 01
|
|
47
|
+
#define COL_GOLD VCOL_YELLOW // $D023, multicolour 10
|
|
48
|
+
#define COL_GRASS VCOL_GREEN // colour RAM low bits, multicolour 11
|
|
49
|
+
#define COL_PLAYER VCOL_WHITE
|
|
50
|
+
#define COL_WALKER VCOL_LT_RED
|
|
51
|
+
#define COL_HOPPER VCOL_CYAN
|
|
52
|
+
|
|
53
|
+
// ---- joystick (active low, as $DC00 reads it) --------------------------------
|
|
54
|
+
#define JOY_UP 0x01
|
|
55
|
+
#define JOY_DOWN 0x02
|
|
56
|
+
#define JOY_LEFT 0x04
|
|
57
|
+
#define JOY_RIGHT 0x08
|
|
58
|
+
#define JOY_FIRE 0x10
|
|
59
|
+
|
|
60
|
+
// ---- level (level.c) ----------------------------------------------------------
|
|
61
|
+
#define LEVEL_TW 128 // tiles across; a tile is 2 x 2 characters
|
|
62
|
+
#define LEVEL_TH 10 // tiles down: the 20 playfield rows
|
|
63
|
+
#define LEVEL_CW (LEVEL_TW * 2) // characters across
|
|
64
|
+
#define CAM_MAX ((LEVEL_CW - 40) * 8)
|
|
65
|
+
|
|
66
|
+
// Cell attribute bits (the slope-collision recipe's byte, plus coin and goal).
|
|
67
|
+
#define A_GROUND 0x01 // has a ground surface
|
|
68
|
+
#define A_WALL 0x02 // blocks a sideways move and a rising head
|
|
69
|
+
#define A_DROP 0x04 // one-way: landed on from above only
|
|
70
|
+
#define A_COIN 0x08
|
|
71
|
+
#define A_SLOPE 0x70 // slope type 0-7 in bits 4-6
|
|
72
|
+
#define A_GOAL 0x80
|
|
73
|
+
|
|
74
|
+
// Glyphs. 0-63 are the ROM's upper-case set (text, digits, the meter);
|
|
75
|
+
// the playfield's own glyphs start at CH_FIRST. The sky is the ROM space.
|
|
76
|
+
// GLYPHS-BEGIN
|
|
77
|
+
#define CH_SKY 32
|
|
78
|
+
#define CH_FIRST 64
|
|
79
|
+
#define CH_DIRT 64
|
|
80
|
+
#define CH_GRASS 65
|
|
81
|
+
#define CH_BRICK 66
|
|
82
|
+
#define CH_LEDGE 67
|
|
83
|
+
#define CH_SLOPE1 68 // slope type n is glyph 67 + n
|
|
84
|
+
#define CH_SLOPE2 69
|
|
85
|
+
#define CH_SLOPE3 70
|
|
86
|
+
#define CH_SLOPE4 71
|
|
87
|
+
#define CH_SLOPE5 72
|
|
88
|
+
#define CH_SLOPE6 73
|
|
89
|
+
#define CH_COIN_TL 74
|
|
90
|
+
#define CH_COIN_TR 75
|
|
91
|
+
#define CH_COIN_BL 76
|
|
92
|
+
#define CH_COIN_BR 77
|
|
93
|
+
#define CH_FLAG 78
|
|
94
|
+
#define CH_POLE 79
|
|
95
|
+
#define CH_COUNT 16
|
|
96
|
+
// GLYPHS-END
|
|
97
|
+
|
|
98
|
+
extern char level[LEVEL_TH][LEVEL_TW]; // tile per cell; coins are taken out
|
|
99
|
+
extern const char heights[64]; // ground row in a cell per slope type and column
|
|
100
|
+
extern unsigned start_x; // the player's start, from the level text
|
|
101
|
+
extern char start_y;
|
|
102
|
+
|
|
103
|
+
void level_reset(void); // decode the text; fill the actor table
|
|
104
|
+
char cell_char(unsigned col, char row); // glyph at a world character cell
|
|
105
|
+
char cell_attr(unsigned col, char row);
|
|
106
|
+
char surface_at(unsigned x, char row, char a); // ground row of cell (row, a) at world x
|
|
107
|
+
void level_column(char *dst, unsigned col); // 20 glyphs down one page column
|
|
108
|
+
bool take_coin(unsigned col, char row); // remove the coin tile over this cell
|
|
109
|
+
|
|
110
|
+
// ---- art (art.c) ----------------------------------------------------------------
|
|
111
|
+
// Sprite shapes, one per block from SPR_BLOCK: all sixteen are used.
|
|
112
|
+
// Player shapes 0-4 face right and 5-9 are the same five mirrored at
|
|
113
|
+
// start-up. SH_FALL is the only frame with a stomp box.
|
|
114
|
+
enum Shape {
|
|
115
|
+
SH_STAND, SH_RUN1, SH_RUN2, SH_JUMP, SH_FALL,
|
|
116
|
+
SH_MIRROR = 5,
|
|
117
|
+
SH_HURT = 10, SH_WALK1, SH_WALK2, SH_SQUASH, SH_HOP_SIT, SH_HOP_UP,
|
|
118
|
+
SH_COUNT
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// Hit boxes per animation frame (c64-kb per_frame_hitbox): a frame owns
|
|
122
|
+
// hb_count[shape] boxes from hb_first[shape]. A box has a group, and a mask
|
|
123
|
+
// of the groups it can hit; only pairs whose mask and group meet are tested.
|
|
124
|
+
#define G_PLAYER 0x01 // the player's body
|
|
125
|
+
#define G_STOMP 0x02 // the player's feet, on the falling frame only
|
|
126
|
+
#define G_ENEMY 0x04
|
|
127
|
+
struct HBox { char x0, y0, x1, y1, group, mask; }; // inclusive, from the art's top-left
|
|
128
|
+
extern struct HBox hbox[];
|
|
129
|
+
extern const char hb_first[SH_COUNT], hb_count[SH_COUNT];
|
|
130
|
+
void art_build(void); // charset and sprite shapes into bank 3
|
|
131
|
+
|
|
132
|
+
// ---- animation (anim.c) ----------------------------------------------------------
|
|
133
|
+
struct Anim { const char *seq; char pos, count, shape; };
|
|
134
|
+
extern const char an_stand[], an_run[], an_jump[], an_fall[], an_hurt[];
|
|
135
|
+
extern const char an_walk[], an_squash[], an_hop_sit[], an_hop_up[];
|
|
136
|
+
void anim_set(struct Anim *a, const char *seq); // restarts only if it is a new sequence
|
|
137
|
+
void anim_step(struct Anim *a);
|
|
138
|
+
bool anim_done(struct Anim *a); // a held sequence has reached its last frame
|
|
139
|
+
|
|
140
|
+
// ---- physics (player.c) -------------------------------------------------------------
|
|
141
|
+
#define BODY_H 20 // feet to head, pixels
|
|
142
|
+
#define BODY_HALF 3 // foot column to body edge
|
|
143
|
+
#define JUMP_LEN 44
|
|
144
|
+
#define JUMP_APEX 24 // first entry with vy >= 0: walking off a ledge starts here
|
|
145
|
+
#define JUMP_BOUNCE 10 // after a stomp
|
|
146
|
+
extern const int vy_tab[JUMP_LEN];
|
|
147
|
+
#define MAX_RISE 2 // a step up steeper than this is a wall
|
|
148
|
+
#define MAX_SNAP 2 // a step down deeper than this is a fall
|
|
149
|
+
char surface_walk(unsigned x, char fy); // the ground under feet at fy moved to x; 0xff none
|
|
150
|
+
bool wall_at(unsigned x, char fy, char height); // a wall cell beside the body
|
|
151
|
+
char ground_step(unsigned *x, unsigned *y, signed char dx, char height); // 0 moved, 1 blocked, 2 off an edge
|
|
152
|
+
bool air_step(unsigned x, unsigned *y, char *jump, char height, bool drop); // true: landed
|
|
153
|
+
|
|
154
|
+
extern unsigned px; // foot column, world pixels
|
|
155
|
+
extern unsigned py; // ground row under the feet, world pixels, 8.8
|
|
156
|
+
extern char pjump; // vy_tab index while airborne
|
|
157
|
+
extern bool pground, pleft;
|
|
158
|
+
extern char pinvuln; // frames of blinking after a respawn
|
|
159
|
+
extern struct Anim panim;
|
|
160
|
+
extern unsigned safe_x; // the last flat ground stood on: the respawn point
|
|
161
|
+
extern char safe_y;
|
|
162
|
+
void player_reset(unsigned x, char y);
|
|
163
|
+
void player_update(char joy, char pressed);
|
|
164
|
+
|
|
165
|
+
// ---- actors (actors.c) --------------------------------------------------------------------
|
|
166
|
+
#define NLVL 32 // actors placed in a level, at most
|
|
167
|
+
#define NSLOT 5 // live at once: sprites 1-5; six overran NTSC (README, "Enemies on screen")
|
|
168
|
+
#define T_WALKER 0
|
|
169
|
+
#define T_HOPPER 1
|
|
170
|
+
extern char lvl_count;
|
|
171
|
+
extern char lvl_col[NLVL], lvl_ty[NLVL], lvl_type[NLVL], lvl_flags[NLVL];
|
|
172
|
+
#define LF_LEFT 0x01
|
|
173
|
+
#define LF_LIVE 0x40
|
|
174
|
+
#define LF_DEAD 0x80
|
|
175
|
+
extern char slot_lvl[NSLOT]; // level index, or NO_SLOT
|
|
176
|
+
extern char drop_lo, drop_top; // the drop window actors_update used this frame
|
|
177
|
+
extern unsigned slot_x[NSLOT]; // foot column, world pixels
|
|
178
|
+
extern unsigned slot_y[NSLOT]; // feet row, 8.8
|
|
179
|
+
extern char slot_type[NSLOT];
|
|
180
|
+
extern bool slot_squashed[NSLOT]; // stomped: shows its squash, then frees the slot
|
|
181
|
+
extern struct Anim slot_anim[NSLOT];
|
|
182
|
+
#define NO_SLOT 0xff
|
|
183
|
+
void actors_reset(void);
|
|
184
|
+
void actors_update(void); // window, wake, move, drop
|
|
185
|
+
void actors_collide(void); // player against every live box
|
|
186
|
+
bool enemy_near(unsigned x, char dist); // a live enemy within dist pixels of x
|
|
187
|
+
|
|
188
|
+
// ---- view (view.c) -----------------------------------------------------------------------------
|
|
189
|
+
#define NPAGES 3
|
|
190
|
+
extern unsigned camx; // world pixel at the window's left edge (XSCROLL 7)
|
|
191
|
+
extern unsigned shown_col; // first world column on the page on display
|
|
192
|
+
extern unsigned pub_camx; // the camera of the pair last published
|
|
193
|
+
extern char shown_page; // 0-2: on display from the next vertical blank
|
|
194
|
+
extern int page_col[NPAGES]; // the column each page holds (or is being prepared for)
|
|
195
|
+
extern char page_rows[NPAGES]; // rows of it that are done: PF_ROWS is ready
|
|
196
|
+
void view_init(void); // VIC, bank, colours, IRQ
|
|
197
|
+
void view_cut(void); // draw both pages at camx; no scrolling
|
|
198
|
+
void view_follow(void); // move the camera after the player; shift the hidden page
|
|
199
|
+
void view_sprites(void); // sprite shadows from the model
|
|
200
|
+
void view_publish(void); // the next picture's page and XSCROLL, for the IRQ at 251
|
|
201
|
+
void view_apply(void); // the vertical blank: sprites
|
|
202
|
+
void view_erase_tile(unsigned col, char row); // a taken coin, on the page on display
|
|
203
|
+
char *page_ptr(char page);
|
|
204
|
+
|
|
205
|
+
// ---- HUD, score, sound (hud.c, sound.c) --------------------------------------------------------------
|
|
206
|
+
extern char score[6], hiscore[6]; // decimal digits, most significant first
|
|
207
|
+
extern char lives, coins;
|
|
208
|
+
extern bool hud_dirty;
|
|
209
|
+
void put_text(char row, char col, const char *s);
|
|
210
|
+
void hud_clear(void);
|
|
211
|
+
void hud_labels(void); // once per level: the words around the figures
|
|
212
|
+
void hud_draw(void);
|
|
213
|
+
void hud_hiscore(void);
|
|
214
|
+
void score_add(char hundreds, char tens);
|
|
215
|
+
|
|
216
|
+
enum Sfx { SFX_JUMP, SFX_COIN, SFX_STOMP, SFX_HURT };
|
|
217
|
+
void sfx_play(char id);
|
|
218
|
+
void sfx_update(void);
|
|
219
|
+
|
|
220
|
+
// ---- events the verdict checks (main.c) ------------------------------------------------------
|
|
221
|
+
#define EV_JUMP 0x0001
|
|
222
|
+
#define EV_LAND 0x0002
|
|
223
|
+
#define EV_SLOPE 0x0004 // stood on a slope cell
|
|
224
|
+
#define EV_LEDGE 0x0008 // landed on a one-way ledge
|
|
225
|
+
#define EV_COIN 0x0010
|
|
226
|
+
#define EV_STOMP 0x0020
|
|
227
|
+
#define EV_HURT 0x0040
|
|
228
|
+
#define EV_RESPAWN 0x0080
|
|
229
|
+
#define EV_WAKE 0x0100
|
|
230
|
+
#define EV_SLEEP 0x0200 // a live actor went back to the level table
|
|
231
|
+
#define EV_SHIFT_L 0x0400 // the camera crossed a column going right
|
|
232
|
+
#define EV_SHIFT_R 0x0800 // and going left
|
|
233
|
+
#define EV_BLOCKED 0x1000 // a wall stopped the player
|
|
234
|
+
extern unsigned events;
|
|
235
|
+
extern char stomps;
|
|
236
|
+
extern bool goal_reached; // the player touched the flag
|
|
237
|
+
void player_hurt(void); // main.c owns lives and the state machine
|
|
238
|
+
|
|
239
|
+
#pragma compile("level.c")
|
|
240
|
+
#pragma compile("art.c")
|
|
241
|
+
#pragma compile("anim.c")
|
|
242
|
+
#pragma compile("player.c")
|
|
243
|
+
#pragma compile("actors.c")
|
|
244
|
+
#pragma compile("view.c")
|
|
245
|
+
#pragma compile("hud.c")
|
|
246
|
+
#pragma compile("sound.c")
|
|
247
|
+
|
|
248
|
+
#endif
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// hud.c: the HUD page (rows 21-24 on screen) and the score. The score is
|
|
2
|
+
// six decimal digits added digit by digit, so printing it is six stores
|
|
3
|
+
// and no division (c64-kb decimal_print). Text is screen codes, not
|
|
4
|
+
// PETSCII (petscii_written_to_screen_ram).
|
|
5
|
+
#include "game.h"
|
|
6
|
+
|
|
7
|
+
char score[6], hiscore[6];
|
|
8
|
+
char lives, coins;
|
|
9
|
+
bool hud_dirty; // set by whatever changes a figure the HUD shows
|
|
10
|
+
|
|
11
|
+
// Lower-case letters in the source become the ROM's upper-case glyphs.
|
|
12
|
+
void put_text(char row, char col, const char *s)
|
|
13
|
+
{
|
|
14
|
+
char *p = HUDPAGE + row * 40 + col;
|
|
15
|
+
while (*s)
|
|
16
|
+
{
|
|
17
|
+
char c = *s++;
|
|
18
|
+
*p++ = (c >= 'a' && c <= 'z') ? c - 'a' + 1 : c;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
void hud_clear(void)
|
|
23
|
+
{
|
|
24
|
+
for (unsigned i = HUD_ROW * 40; i < 1000; i++)
|
|
25
|
+
HUDPAGE[i] = CH_SKY;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
static void put_digits(char row, char col, const char *d, char n)
|
|
29
|
+
{
|
|
30
|
+
char *p = HUDPAGE + row * 40 + col;
|
|
31
|
+
for (char i = 0; i < n; i++)
|
|
32
|
+
p[i] = '0' + d[i];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Row 22: "SCORE 000000 COINS 00 LIVES 3". Row 23: "HI 000000".
|
|
36
|
+
// The labels once per level (hud_labels); the figures only when one
|
|
37
|
+
// changed, at fixed cells, with no division: a dirty frame costs a few
|
|
38
|
+
// hundred cycles (an earlier version redrew the labels and divided, and
|
|
39
|
+
// its dirty frame was the HUD's 2,000-cycle worst).
|
|
40
|
+
#define HUD22 (HUDPAGE + 22 * 40)
|
|
41
|
+
|
|
42
|
+
void hud_labels(void)
|
|
43
|
+
{
|
|
44
|
+
put_text(22, 0, "score");
|
|
45
|
+
put_text(22, 14, "coins");
|
|
46
|
+
put_text(22, 24, "lives");
|
|
47
|
+
hud_hiscore();
|
|
48
|
+
hud_dirty = true;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
void hud_draw(void)
|
|
52
|
+
{
|
|
53
|
+
if (!hud_dirty)
|
|
54
|
+
return;
|
|
55
|
+
hud_dirty = false;
|
|
56
|
+
put_digits(22, 6, score, 6); // a loop storing to HUD22[6 + i] kept only the first digit on Oscar64 v1.32.273
|
|
57
|
+
char c = coins, t = '0';
|
|
58
|
+
while (c >= 10)
|
|
59
|
+
{
|
|
60
|
+
c -= 10;
|
|
61
|
+
t++;
|
|
62
|
+
}
|
|
63
|
+
HUD22[20] = t;
|
|
64
|
+
HUD22[21] = '0' + c;
|
|
65
|
+
HUD22[30] = '0' + lives;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void hud_hiscore(void)
|
|
69
|
+
{
|
|
70
|
+
put_text(23, 0, "hi");
|
|
71
|
+
put_digits(23, 3, hiscore, 6);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// score += hundreds * 100 + tens * 10, carried up the digits.
|
|
75
|
+
void score_add(char hundreds, char tens)
|
|
76
|
+
{
|
|
77
|
+
char carry = 0;
|
|
78
|
+
for (signed char i = 5; i >= 0; i--)
|
|
79
|
+
{
|
|
80
|
+
char d = score[i] + carry + (i == 4 ? tens : i == 3 ? hundreds : 0);
|
|
81
|
+
carry = 0;
|
|
82
|
+
while (d >= 10)
|
|
83
|
+
{
|
|
84
|
+
d -= 10;
|
|
85
|
+
carry++;
|
|
86
|
+
}
|
|
87
|
+
score[i] = d;
|
|
88
|
+
}
|
|
89
|
+
hud_dirty = true;
|
|
90
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// level.c: the level as text, its 2 x 2 metatiles, and the cell lookups
|
|
2
|
+
// every other module asks. After c64-kb tile_map_render (metatiles) and
|
|
3
|
+
// slope_collision (one attribute byte per glyph, a height table per slope).
|
|
4
|
+
#include "game.h"
|
|
5
|
+
|
|
6
|
+
// One character per metatile, ten rows of 128. The keys are in tile_key
|
|
7
|
+
// below; P, w and h are an empty tile plus the player's start, a walker or
|
|
8
|
+
// a hopper standing on the tile below. Edit freely: the program decodes
|
|
9
|
+
// this at every start, and tools/tearcheck.py renders the same text.
|
|
10
|
+
// LEVEL-BEGIN
|
|
11
|
+
static const char level_text[LEVEL_TH][LEVEL_TW + 1] = {
|
|
12
|
+
"................................................................................................................................",
|
|
13
|
+
"................................................................................................................................",
|
|
14
|
+
"..w.............................................................................................................................",
|
|
15
|
+
".BBB............................................................................................................................",
|
|
16
|
+
"................................................................................................................................",
|
|
17
|
+
"..............................oo.......................o..............oo......................oo................................",
|
|
18
|
+
"........o....................---..............B......./=\\........--..........................----...............................",
|
|
19
|
+
".P..oo./=\\......w......ab=cd........h........BB...w../###=\\..w..........h...abcd....w.B...........h..../=\\..w.......oo.w....F...",
|
|
20
|
+
"=======###========..===#####=============..==========######=====....========####========...============###=====..===============",
|
|
21
|
+
"##################..#####################..#####################....####################...####################..###############",
|
|
22
|
+
};
|
|
23
|
+
// LEVEL-END
|
|
24
|
+
|
|
25
|
+
#if STAGE_CROWD
|
|
26
|
+
// make stage: row 7 with ten enemies in the first view, so every live slot
|
|
27
|
+
// is full from the first frame. It measures the worst frame; it is not a
|
|
28
|
+
// level to play (the comparator's staging, 2026-09-23).
|
|
29
|
+
static const char stage_row7[LEVEL_TW + 1] =
|
|
30
|
+
".Phwhwh/=\\hwhwhww......ab=cd........h........BB...w../###=\\..w..........h...abcd....w.B...........h..../=\\..w.......oo.w....F...";
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
// Metatiles: key, then the glyphs top-left, top-right, bottom-left,
|
|
34
|
+
// bottom-right. A tile sits on character rows 2ty and 2ty + 1.
|
|
35
|
+
// TILES-BEGIN
|
|
36
|
+
static const char tile_key[] = ".#=B-/\\abcdoF";
|
|
37
|
+
static const char tile_glyph[][4] = {
|
|
38
|
+
{ CH_SKY, CH_SKY, CH_SKY, CH_SKY }, // . air
|
|
39
|
+
{ CH_DIRT, CH_DIRT, CH_DIRT, CH_DIRT }, // # earth
|
|
40
|
+
{ CH_GRASS, CH_GRASS, CH_DIRT, CH_DIRT }, // = ground with grass
|
|
41
|
+
{ CH_BRICK, CH_BRICK, CH_BRICK, CH_BRICK }, // B block: a wall you can stand on
|
|
42
|
+
{ CH_LEDGE, CH_LEDGE, CH_SKY, CH_SKY }, // - one-way ledge
|
|
43
|
+
{ CH_SKY, CH_SLOPE1, CH_SLOPE1, CH_DIRT }, // / 45 degrees up, one tile high
|
|
44
|
+
{ CH_SLOPE2, CH_SKY, CH_DIRT, CH_SLOPE2 }, // \ 45 degrees down
|
|
45
|
+
{ CH_SKY, CH_SKY, CH_SLOPE3, CH_SLOPE4 }, // a 1-in-2 up, lower tile
|
|
46
|
+
{ CH_SLOPE3, CH_SLOPE4, CH_DIRT, CH_DIRT }, // b 1-in-2 up, upper tile
|
|
47
|
+
{ CH_SLOPE5, CH_SLOPE6, CH_DIRT, CH_DIRT }, // c 1-in-2 down, upper tile
|
|
48
|
+
{ CH_SKY, CH_SKY, CH_SLOPE5, CH_SLOPE6 }, // d 1-in-2 down, lower tile
|
|
49
|
+
{ CH_COIN_TL, CH_COIN_TR, CH_COIN_BL, CH_COIN_BR }, // o coin
|
|
50
|
+
{ CH_FLAG, CH_SKY, CH_POLE, CH_SKY }, // F goal
|
|
51
|
+
};
|
|
52
|
+
// TILES-END
|
|
53
|
+
#define T_AIR 0
|
|
54
|
+
#define T_COIN 11
|
|
55
|
+
|
|
56
|
+
// Attribute per glyph from CH_FIRST (the sky, a ROM space, is 0).
|
|
57
|
+
static const char glyph_attr[CH_COUNT] = {
|
|
58
|
+
A_GROUND | A_WALL, // dirt
|
|
59
|
+
A_GROUND | A_WALL, // grass
|
|
60
|
+
A_GROUND | A_WALL, // brick
|
|
61
|
+
A_GROUND | A_DROP, // ledge
|
|
62
|
+
A_GROUND | 0x10, A_GROUND | 0x20, A_GROUND | 0x30, // slopes 1-6
|
|
63
|
+
A_GROUND | 0x40, A_GROUND | 0x50, A_GROUND | 0x60,
|
|
64
|
+
A_COIN, A_COIN, A_COIN, A_COIN,
|
|
65
|
+
A_GOAL, A_GOAL,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// The same per tile quarter, built once, so a lookup is two indexings:
|
|
69
|
+
// the physics asks a dozen times a frame per body.
|
|
70
|
+
static char tile_attr[sizeof(tile_key) - 1][4];
|
|
71
|
+
static char *const level_row[LEVEL_TH] = {
|
|
72
|
+
level[0], level[1], level[2], level[3], level[4],
|
|
73
|
+
level[5], level[6], level[7], level[8], level[9]
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// Ground row inside a cell for pixel column 0-7, per slope type; 0 is the
|
|
77
|
+
// cell's top row. From the slope-collision recipe. Types 3 and 4 are the
|
|
78
|
+
// lower and upper halves of one 1-in-2 rise, 5 and 6 of a fall. The slope
|
|
79
|
+
// glyphs are drawn from this table (art.c), so picture and collision agree.
|
|
80
|
+
const char heights[64] = {
|
|
81
|
+
0, 0, 0, 0, 0, 0, 0, 0, // 0 flat
|
|
82
|
+
7, 6, 5, 4, 3, 2, 1, 0, // 1 up 45
|
|
83
|
+
0, 1, 2, 3, 4, 5, 6, 7, // 2 down 45
|
|
84
|
+
7, 7, 6, 6, 5, 5, 4, 4, // 3 up 1-in-2, first half
|
|
85
|
+
3, 3, 2, 2, 1, 1, 0, 0, // 4 up 1-in-2, second half
|
|
86
|
+
0, 0, 1, 1, 2, 2, 3, 3, // 5 down 1-in-2, first half
|
|
87
|
+
4, 4, 5, 5, 6, 6, 7, 7, // 6 down 1-in-2, second half
|
|
88
|
+
0, 0, 0, 0, 0, 0, 0, 0 // 7 unused
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
char level[LEVEL_TH][LEVEL_TW];
|
|
92
|
+
unsigned start_x;
|
|
93
|
+
char start_y;
|
|
94
|
+
|
|
95
|
+
// Text to tiles, and the actor letters into the actor table (actors.c).
|
|
96
|
+
void level_reset(void)
|
|
97
|
+
{
|
|
98
|
+
for (char t = 0; t < sizeof(tile_key) - 1; t++)
|
|
99
|
+
{
|
|
100
|
+
for (char q = 0; q < 4; q++)
|
|
101
|
+
{
|
|
102
|
+
char g = tile_glyph[t][q];
|
|
103
|
+
tile_attr[t][q] = g >= CH_FIRST ? glyph_attr[g - CH_FIRST] : 0;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
lvl_count = 0;
|
|
107
|
+
for (char ty = 0; ty < LEVEL_TH; ty++)
|
|
108
|
+
{
|
|
109
|
+
for (char tx = 0; tx < LEVEL_TW; tx++)
|
|
110
|
+
{
|
|
111
|
+
char k = level_text[ty][tx], t = T_AIR;
|
|
112
|
+
#if STAGE_CROWD
|
|
113
|
+
if (ty == 7)
|
|
114
|
+
k = stage_row7[tx];
|
|
115
|
+
#endif
|
|
116
|
+
for (char i = 0; i < sizeof(tile_key) - 1; i++)
|
|
117
|
+
if (tile_key[i] == k)
|
|
118
|
+
t = i;
|
|
119
|
+
level[ty][tx] = t;
|
|
120
|
+
if (k == 'P')
|
|
121
|
+
{
|
|
122
|
+
start_x = tx * 16 + 8; // foot column: the tile's middle
|
|
123
|
+
start_y = (ty + 1) * 16; // on the tile below
|
|
124
|
+
}
|
|
125
|
+
else if ((k == 'w' || k == 'h') && lvl_count < NLVL)
|
|
126
|
+
{
|
|
127
|
+
char i = lvl_count++;
|
|
128
|
+
lvl_col[i] = tx * 2;
|
|
129
|
+
lvl_ty[i] = ty;
|
|
130
|
+
lvl_type[i] = k == 'w' ? T_WALKER : T_HOPPER;
|
|
131
|
+
lvl_flags[i] = LF_LEFT;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
char cell_char(unsigned col, char row)
|
|
138
|
+
{
|
|
139
|
+
if (col >= LEVEL_CW || row >= PF_ROWS)
|
|
140
|
+
return CH_SKY;
|
|
141
|
+
char t = level_row[row >> 1][(char)col >> 1];
|
|
142
|
+
return tile_glyph[t][((row & 1) << 1) | (col & 1)];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
char cell_attr(unsigned col, char row)
|
|
146
|
+
{
|
|
147
|
+
if (col >= LEVEL_CW || row >= PF_ROWS)
|
|
148
|
+
return 0;
|
|
149
|
+
char t = level_row[row >> 1][(char)col >> 1];
|
|
150
|
+
return tile_attr[t][((row & 1) << 1) | (col & 1)];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// The ground row at world column x inside the cell on `row` whose attribute is a.
|
|
154
|
+
// __noinline: inlined into surface_walk, Oscar64 v1.32.273 and upstream
|
|
155
|
+
// 9a902f6 emit `ORA heights,x` with X as cell_attr left it and never compute
|
|
156
|
+
// the index (issue #30); the local build is right either way.
|
|
157
|
+
__noinline char surface_at(unsigned x, char row, char a)
|
|
158
|
+
{
|
|
159
|
+
return (row << 3) + heights[((a & A_SLOPE) >> 1) | (x & 7)];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Twenty glyphs down one column of a page (stride 40): a new column after a
|
|
163
|
+
// coarse shift, or one of forty at a cut.
|
|
164
|
+
void level_column(char *dst, unsigned col)
|
|
165
|
+
{
|
|
166
|
+
char tx = col >> 1, half = col & 1;
|
|
167
|
+
for (char ty = 0; ty < LEVEL_TH; ty++)
|
|
168
|
+
{
|
|
169
|
+
const char *g = tile_glyph[level_row[ty][tx]];
|
|
170
|
+
dst[0] = g[half];
|
|
171
|
+
dst[40] = g[2 + half];
|
|
172
|
+
dst += 80;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// A coin tile covers four cells; taking any of them removes the tile.
|
|
177
|
+
bool take_coin(unsigned col, char row)
|
|
178
|
+
{
|
|
179
|
+
char *t = &level[row >> 1][col >> 1];
|
|
180
|
+
if (*t != T_COIN)
|
|
181
|
+
return false;
|
|
182
|
+
*t = T_AIR;
|
|
183
|
+
return true;
|
|
184
|
+
}
|