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,315 @@
|
|
|
1
|
+
# beat-em-up: a side-on street brawler starter
|
|
2
|
+
|
|
3
|
+
A small game that plays: a street 128 characters long scrolls right in
|
|
4
|
+
three stages, and each stage locks the camera until its two waves of
|
|
5
|
+
enemies are beaten. The hero and the thugs are two multicolour sprites
|
|
6
|
+
each; the brute is drawn in character cells, and a fighter farther away
|
|
7
|
+
than he is goes behind him. Everyone walks on a depth plane and the nearer
|
|
8
|
+
fighter is drawn in front. Punch, kick and jump kick land only on their
|
|
9
|
+
attack frames and only on a fighter within 6 ground lines. Enemies come
|
|
10
|
+
in, line up in the hero's lane, attack and back off; a kick, a jump kick or
|
|
11
|
+
a third punch in a row knocks a fighter down and he gets up again. Health
|
|
12
|
+
bars and faces in a HUD, an original two-voice tune, hit effects on the
|
|
13
|
+
third voice. Title, fire to start, game over back to the title. PAL and
|
|
14
|
+
NTSC, Oscar64 C with a KickAssembler part.
|
|
15
|
+
|
|
16
|
+
Start a game from it in c64-kb:
|
|
17
|
+
`npm run new-project -- beat-em-up ~/c64/mygame`.
|
|
18
|
+
|
|
19
|
+
## Playing
|
|
20
|
+
|
|
21
|
+
Joystick in port 2. Left and right walk, up and down change lane. Fire
|
|
22
|
+
alone punches; fire with left or right kicks that way; fire with up jumps
|
|
23
|
+
(forward with left or right); fire in the air kicks. A punch is 10 points,
|
|
24
|
+
a kick 20, a jump kick 30; a thug beaten is 100, a brute 200. Three lives.
|
|
25
|
+
The GO sign blinks when a stage is clear: walk right.
|
|
26
|
+
|
|
27
|
+
## Files
|
|
28
|
+
|
|
29
|
+
| File | Holds |
|
|
30
|
+
|---|---|
|
|
31
|
+
| `src/main.c` | The frame loop, the states (title, play, game over, street clear), lives, the meter |
|
|
32
|
+
| `src/game.h` | Every shared constant, variable and function, in one place |
|
|
33
|
+
| `src/street.c` | The street as ten lines of text, the 2 x 2 metatiles, the three stage locks |
|
|
34
|
+
| `src/art.c` | Every picture as text (street glyphs, bar glyphs, sprite blocks, the brute), the pose table, hurt and hit boxes |
|
|
35
|
+
| `src/anim.c` | Moves as (pose, frames, hit box) tables: only attack frames carry a box |
|
|
36
|
+
| `src/fighter.c` | What every fighter shares: walk, attack, jump, hurt, knock-down, get-up, KO; the depth-gated hit test; the joystick |
|
|
37
|
+
| `src/enemy.c` | The enemy state machine (one enemy thinks a frame) and the waves (three enemy slots, one brute a wave) |
|
|
38
|
+
| `src/brute.c` | The brute in character cells: pre-shifted pictures, two character sets, his cells in both scroll pages |
|
|
39
|
+
| `src/view.c` | VIC-II: bank 3, the camera and its locks, the scroll, the depth sort, the three sprite bands, `$D01B` |
|
|
40
|
+
| `src/hud.c`, `src/sound.c` | Bars, score and text, redrawn only where they changed; the effects on SID voice 3 |
|
|
41
|
+
| `src/engine.asm` | KickAssembler: the IRQ chain that writes the sprite bands, the scroll's slice copy, the brute's glyph builder, the tune |
|
|
42
|
+
| `src/autopilot.h`, `src/verdict.h` | AUTOPILOT builds only: the bot, the photo stops, the self-checks |
|
|
43
|
+
| `tools/flickercheck.py` | Renders the fighters and the brute from `src/` and proves every pixel is on the screen in the crowded moments (`make flickercheck`) |
|
|
44
|
+
| `tools/drive.py` | Plays the `make joy` build headless over VICE's monitor |
|
|
45
|
+
| `expect.json`, `expect-gameover.json`, `PLAN.md` | The screenshot checks; the plan with the c64-kb tool output |
|
|
46
|
+
|
|
47
|
+
## How a frame runs
|
|
48
|
+
|
|
49
|
+
The IRQ at line 251 starts the frame. The main loop moves the brute's cells
|
|
50
|
+
if he stepped a whole cell (in the vertical blank, before the beam reaches
|
|
51
|
+
him), reads the joystick, runs the hero, the enemies' AI, every fighter's
|
|
52
|
+
move, the hits, the waves and the camera, plays the tune and the effects,
|
|
53
|
+
builds a row of the brute's next picture, redraws what changed on the HUD,
|
|
54
|
+
builds the sprite tables and publishes the next picture's `$D016`, `$D018`
|
|
55
|
+
and sprite set as one.
|
|
56
|
+
|
|
57
|
+
Sprites come in three bands a frame (c64-kb `sprite_multiplex_game`'s
|
|
58
|
+
double-buffered table, with bands instead of a Y-sorted list). The IRQ at
|
|
59
|
+
line 251 writes band 0, the GO sign (lines 53-73). The IRQ at line 76
|
|
60
|
+
writes band 1, the fighters. The IRQ at line 212 switches the HUD to 40
|
|
61
|
+
columns, hires and its own page, and writes band 2, the faces (lines
|
|
62
|
+
219-239). All eight sprites are reused three times a frame; between bands
|
|
63
|
+
every sprite's last line has passed before it is rewritten.
|
|
64
|
+
|
|
65
|
+
Band 1 is where a brawler's multiplexer usually flickers: the fighters
|
|
66
|
+
stand on the same lines, so no sprite can be reused inside the band. Here
|
|
67
|
+
a sprite fighter is two parts, a top and legs, at per-pose offsets from his
|
|
68
|
+
feet (c64-kb `multi_sprite_object`); three fighters and the hero are eight
|
|
69
|
+
parts, and the band never has to drop one. The depth sort (c64-kb
|
|
70
|
+
`lane_depth_engine`) gives the nearest fighter sprites 0 and 1, the next 2
|
|
71
|
+
and 3, and so on: the VIC-II draws a lower sprite over a higher one, so its
|
|
72
|
+
own priority is the depth order.
|
|
73
|
+
|
|
74
|
+
The brute is not a sprite (c64-kb `mixed_sprite_char_actors`, ported from
|
|
75
|
+
the other #39 draft): 16 multicolour pixels by 48 lines, stored at the four
|
|
76
|
+
2-pixel shifts, shown as a block of 5 x 6 cells with codes of their own.
|
|
77
|
+
Two character sets, alike but for his 30 glyphs, sit at `$E000` and
|
|
78
|
+
`$E800`; his next picture is built into the one not shown, a row of the
|
|
79
|
+
block a frame (KickAssembler, about 1,300 cycles), then `$D018` switches
|
|
80
|
+
sets. His cells are rewritten only when he moves a whole cell, in both
|
|
81
|
+
street pages. On street rows 2-19 the street uses bit pairs 00 and 01
|
|
82
|
+
only, which the VIC counts as background; his pairs 10 and 11 are
|
|
83
|
+
foreground, so a sprite with its `$D01B` bit set (every fighter farther
|
|
84
|
+
away than he is) goes behind him and behind nothing else (c64-kb
|
|
85
|
+
`mob_priority`).
|
|
86
|
+
|
|
87
|
+
The scroll is the platformer starter's, for a camera that only moves right,
|
|
88
|
+
a pixel a frame: XSCROLL moves the picture a pixel; a column crossing is a
|
|
89
|
+
`$D018` flip to the other page, which was prepared four rows a frame by a
|
|
90
|
+
KickAssembler copy one column over. The page on display is never written,
|
|
91
|
+
but for the brute's cells.
|
|
92
|
+
|
|
93
|
+
Memory: VIC bank 3. Street pages at `$C000` and `$C400`, the HUD page at
|
|
94
|
+
`$C800`, the two character sets at `$E000` and `$E800` (the ROM's glyphs
|
|
95
|
+
0-63 copied in), 63 sprite blocks from `$F000`. BASIC and KERNAL are banked
|
|
96
|
+
out (`$01` = `$35`). The KickAssembler blob is `$0880`-`$0FFF`, the C
|
|
97
|
+
program from `$1000`.
|
|
98
|
+
|
|
99
|
+
## The measured frame
|
|
100
|
+
|
|
101
|
+
The harness meter (CIA2 timer A) over 255 play frames of the autopilot
|
|
102
|
+
run, VICE x64sc 3.10, `make shot check`, the local Oscar64 build. Each
|
|
103
|
+
window starts where the run reaches a point (`-dMETER_WINDOW=n`); the
|
|
104
|
+
default is the run's worst:
|
|
105
|
+
|
|
106
|
+
| n | Window (255 play frames from) | PAL worst / typical | NTSC worst / typical |
|
|
107
|
+
|---|---|---|---|
|
|
108
|
+
| 0 (default) | the second stage's lock: the brute, two thugs, the hero's KO | 14,946 / 9,342 | 16,439 / 9,900 |
|
|
109
|
+
| 1 | the third stage's lock: three thugs, eight sprites in the band | 12,255 / 7,317 | 13,254 / 7,990 |
|
|
110
|
+
| 2 | the first stage clear: the walk, every frame scrolls | 7,343 / 6,979 | 8,215 / 7,304 |
|
|
111
|
+
| 3 | the first stage's lock: two thugs, then the brute | 10,930 / 6,132 | 10,744 / 6,421 |
|
|
112
|
+
| 4 | every play frame of the run (the verdict prints `RUN`, the worst) | 15,246 | 16,593 |
|
|
113
|
+
|
|
114
|
+
Window 0 is the worst of the 255-frame windows, but not the worst frame of
|
|
115
|
+
the run: with every play frame metered (`-dMETER_WINDOW=4`), the worst is
|
|
116
|
+
15,246 cycles on PAL and 16,593 on NTSC. NTSC then has 502 cycles spare,
|
|
117
|
+
about 250 once the IRQs' uncounted entry and exit are taken off (97% of
|
|
118
|
+
the frame used). One more feature on the fighters (a weapon, a fifth
|
|
119
|
+
fighter, a heavier AI) will drop frames on NTSC: meter it with
|
|
120
|
+
`-dMETER_WINDOW=4` before and after. (Rows 1-3 were measured on the build
|
|
121
|
+
before the brute's row check, which only adds bookkeeping outside the
|
|
122
|
+
bracket; the review's comparator measured the run's worst as 15,257 /
|
|
123
|
+
16,624 on its own copy.)
|
|
124
|
+
|
|
125
|
+
The frame is 19,656 cycles on PAL and 17,095 on NTSC. The IRQs are in the
|
|
126
|
+
figure: one that lands inside the main loop's bracket is in its wall time;
|
|
127
|
+
one that lands outside times itself on CIA2 timer B and is added
|
|
128
|
+
(`engine.asm`, `IrqIn` and `IrqOut`). About 123 cycles an IRQ, its entry
|
|
129
|
+
and exit around the timer, are not counted (arithmetic from the listing,
|
|
130
|
+
the #39 review; an earlier version of this page said 40): a typical frame,
|
|
131
|
+
all three IRQs outside the bracket, reads about 370 low, a worst frame
|
|
132
|
+
about 250. The run's NTSC worst plus that is about 16,850 of 17,095. No play
|
|
133
|
+
frame's work ran past the next blank in the whole run, on either model
|
|
134
|
+
(the verdict's `late`, 0). The autopilot's own checks (the bot, the VIC
|
|
135
|
+
read-back) run after the work, outside the bracket; with them the loop ran
|
|
136
|
+
past a blank 98 times on PAL and 631 on NTSC (the `slow` count, printed on
|
|
137
|
+
a failed verdict, not graded). So the AUTOPILOT run, on NTSC above all, is
|
|
138
|
+
not a real-time image of the release build: its game logic is the same
|
|
139
|
+
frame by frame, but about one loop in seven on NTSC takes two frames. The
|
|
140
|
+
release build has none of that bookkeeping; its frames are the metered
|
|
141
|
+
ones.
|
|
142
|
+
|
|
143
|
+
Per subsystem in window 0, built with `-dPROF=n` (worst / typical):
|
|
144
|
+
|
|
145
|
+
| n | Subsystem | PAL | NTSC |
|
|
146
|
+
|---|---|---|---|
|
|
147
|
+
| 1 | hero, AI, moves, hits, waves | 3,629 / 2,110 | 3,672 / 2,110 |
|
|
148
|
+
| 2 | camera and scroll | 3,031 / 192 | 3,074 / 192 |
|
|
149
|
+
| 3 | depth sort, sprite bands, publish | 4,333 / 4,027 | 4,409 / 4,161 |
|
|
150
|
+
| 4 | tune, effects, HUD | 846 / 105 | 1,006 / 121 |
|
|
151
|
+
| 5 | the three IRQs alone | 1,961 / 993 | 2,102 / 993 |
|
|
152
|
+
| 6 | the brute's cell moves (`brute_draw`) | 6,735 / 30 | 7,712 / 30 |
|
|
153
|
+
| 7 | the brute's picture, a row a frame (`brute_prepare`) | 6,312 / 2,385 | 6,846 / 2,514 |
|
|
154
|
+
|
|
155
|
+
Every figure is wall time: badline and sprite DMA, and an IRQ that lands
|
|
156
|
+
inside a section, are in it. The parts' worst frames do not fall together
|
|
157
|
+
(`brute_prepare` starts no new picture in a frame that moved his cells).
|
|
158
|
+
PROF 5's worst is a loop that ran over a blank, so two frames' IRQs.
|
|
159
|
+
PROF 7 was 18,000 cycles a frame when the glyphs were built in C; the frame
|
|
160
|
+
also got a round-robin AI, a HUD that redraws only what changed, and a
|
|
161
|
+
camera at a pixel a frame, all to fit the brute and the VIC read-back.
|
|
162
|
+
|
|
163
|
+
Against `plan-budget` (PLAN.md): 43,027 to 49,976 cycles plus 1,873
|
|
164
|
+
fixed, over two frames, verdict undetermined. The measured worst is a third
|
|
165
|
+
of that. The budget adds up other programs' worst cases:
|
|
166
|
+
`sprite_multiplex_game`'s 16,600 is 24 actors in a reversed sort (here the
|
|
167
|
+
bands need no sort across sprites: 4,333 for the band build and about
|
|
168
|
+
1,000 a frame for the IRQs); `lane_pursuit_ai`'s 9,871 to 14,204 is four
|
|
169
|
+
cars probing a tile map (here the enemies' AI is inside PROF 1's 3,629);
|
|
170
|
+
`mixed_sprite_char_actors`' 6,108 is a whole character actor updated in
|
|
171
|
+
one tick (here a row a frame, 2,385 typical); `per_frame_hitbox`'s 3,693 is
|
|
172
|
+
28 box pairs (here at most three targets an attacker). It leaves the
|
|
173
|
+
scroll out at 74,041, an old in-place shift (issue #18); the two-page
|
|
174
|
+
scroll here costs 3,031 at most.
|
|
175
|
+
|
|
176
|
+
## Proving it
|
|
177
|
+
|
|
178
|
+
| Command | What it proves | Last result |
|
|
179
|
+
|---|---|---|
|
|
180
|
+
| `make shot check` | 29 checks: the verdict, the HUD text and bar, the hero's face in band 2, the hero's two parts in band 1 where the run leaves him, the scrolled street at camera 704 (an alley and its lamp), the kerb, the blank row 20, PAL and NTSC identical, the meter | 29 of 29 passed |
|
|
181
|
+
| `make selftest` | FORCE_FAULT makes a punch worth 20: the verdict fails, the HUD score differs | check.py rejected the build |
|
|
182
|
+
| `make flickercheck` | Two shots inside each of three photo stops, PAL and NTSC: every pixel of the sprite fighters and the brute's cells matches a render built from `src/`, `$D01B` priority included; then the FLICKER_DEMO build, which drops one sprite part, must fail | 12 of 12 whole; photo 1 has 162 of the brute's pixels over a fighter behind him, photo 2 98 of a fighter over him; the demo: 2 of 6 with a part missing |
|
|
183
|
+
| `make gameover` | The AP_GIVE_UP build loses three lives; GAME OVER must be whole with LIVES 0 (it once read GAME OVETHUG) | 8 of 8 passed |
|
|
184
|
+
| `make claims` | Every store the run makes, title to verdict, against CLAIMS_ARGS | 0 violations |
|
|
185
|
+
| `make disk` | `build/beat-em-up.d64`; it boots to the title (90M cycles, true drive) | |
|
|
186
|
+
|
|
187
|
+
`npm run verify:templates -- --only beat-em-up --selftest` runs all of
|
|
188
|
+
these (`VERIFY_TARGETS` in the Makefile).
|
|
189
|
+
|
|
190
|
+
The self-check (`src/verdict.h`) grades the game's own state after stage
|
|
191
|
+
3's first wave, the whole run behind it:
|
|
192
|
+
|
|
193
|
+
- every event seen (punch, kick and jump-kick hits, a knock-down and a
|
|
194
|
+
get-up, a KO, the hero hit and down, a life lost, the locks, a stage
|
|
195
|
+
clear, a scroll, a lane change, a cross-lane miss);
|
|
196
|
+
- the score equal to the hits and KOs counted; one life lost;
|
|
197
|
+
- no play frame late; the fighter band's IRQ never late; no part dropped;
|
|
198
|
+
- both pages equal to the street and the brute's cells at their columns;
|
|
199
|
+
his cell moves always before his top row; two brutes beaten; every
|
|
200
|
+
frame he is drawn, the last line of his block on his ground line or up
|
|
201
|
+
to 7 lines above it (a picture a row low passes every other check);
|
|
202
|
+
- every hit recomputed on its own: the lane difference and the box
|
|
203
|
+
overlap (`check_hit`). The bot throws one punch at an enemy a lane away,
|
|
204
|
+
which must count as a miss;
|
|
205
|
+
- the fighter band read back from the VIC every frame (the IRQ at line 76
|
|
206
|
+
copies `$D000`-`$D010`, `$D015` and `$D01B`) against an independent
|
|
207
|
+
sort: 4,112 frames compared on PAL, 4,066 on NTSC, none wrong
|
|
208
|
+
(56 hits recomputed, none wrong);
|
|
209
|
+
- the hero's parts in the table the IRQ shows; the camera at the last
|
|
210
|
+
lock; three photo stops.
|
|
211
|
+
|
|
212
|
+
Mutations, each run through `make shot check` (and `make gameover` for the
|
|
213
|
+
last): the lane gate widened to 60 lines (fails: a cross-lane hit, no
|
|
214
|
+
cross-lane miss); the band filled far to near (fails: the VIC read-back,
|
|
215
|
+
1,669 frames); the `$D010` bit dropped (fails: the VIC read-back and the
|
|
216
|
+
hero's parts); `$D01B` never set (fails: the VIC read-back, 495 frames);
|
|
217
|
+
the HUD redraw put back after GAME OVER, as the first draft had it (fails:
|
|
218
|
+
GAME OVE); the brute drawn a row low (fails: the brute row check alone,
|
|
219
|
+
fail bits 2000). The figures are from those runs. The FLICKER_DEMO
|
|
220
|
+
build is the flicker check's own mutation.
|
|
221
|
+
|
|
222
|
+
## Extending it
|
|
223
|
+
|
|
224
|
+
1. **More fighters on the screen, or a big boss.** Band 1 holds eight
|
|
225
|
+
sprites: the hero and three thugs, or fewer with the brute. A fifth
|
|
226
|
+
sprite fighter on the same lines has no sprite. Draw him in characters
|
|
227
|
+
like the brute (`src/brute.c`; c64-kb `mixed_sprite_char_actors`,
|
|
228
|
+
`docs/recipes/oscar64/mixed-fighters.md`), with his own 30 codes, or
|
|
229
|
+
keep the crowd rule in `enemy.c` and add a Y-sorted multiplexer for
|
|
230
|
+
fighters who stand clear of the band's lines
|
|
231
|
+
(`sprite_multiplex_game`, `docs/recipes/kickassembler/sprite-multiplex-game.md`).
|
|
232
|
+
Beware its slot order: it gives the upper (farther) actor the lower
|
|
233
|
+
sprite, so where two overlap the farther one is drawn in front. The #39
|
|
234
|
+
review measured it in VICE with the recipe's own listing, both ways
|
|
235
|
+
round (`/tmp/c64kb-write/BEU/depth/`, not in this repository). Depth
|
|
236
|
+
needs the slots reversed inside each zone. Run `make flickercheck`
|
|
237
|
+
after, with new pins.
|
|
238
|
+
2. **Weapons and pickups.** A knife or a crate on the street is a few
|
|
239
|
+
character cells in both pages (the brute's `block_put`); a thrown knife
|
|
240
|
+
is a new hit box on a new pose. Groups and masks for who can hurt whom:
|
|
241
|
+
`per_frame_hitbox`, `docs/recipes/oscar64/per-frame-hitbox.md`.
|
|
242
|
+
3. **Grabs, throws and more moves.** A move is a table in `anim.c` and a
|
|
243
|
+
pose in `art.c`; the hit box on its frames does the rest. Events on
|
|
244
|
+
entries (a sound, a throw) and priorities between requests:
|
|
245
|
+
`sprite_animation_table`, `docs/recipes/oscar64/sprite-animation-table.md`.
|
|
246
|
+
|
|
247
|
+
Smaller steps: a second player (`two_player_state_swap`,
|
|
248
|
+
`docs/recipes/oscar64/two-player.md`); the high score on disk
|
|
249
|
+
(`docs/recipes/oscar64/high-score-persist.md`; the harness's `SHOT_DISK=1`
|
|
250
|
+
attaches the image during `make shot`); harder waves by stage
|
|
251
|
+
(`difficulty_ramp_tables`, `docs/recipes/oscar64/difficulty-tables.md`).
|
|
252
|
+
A changed wave, AI or art moves the photo stops: re-scan the run and
|
|
253
|
+
re-pin `FLICKER_PAL` and `FLICKER_NTSC` in the Makefile.
|
|
254
|
+
|
|
255
|
+
## Driving it headless
|
|
256
|
+
|
|
257
|
+
`make joy` builds the normal game with its port byte read from `$02FE`
|
|
258
|
+
instead of `$DC00`; `tools/drive.py` plays it over VICE's binary monitor
|
|
259
|
+
and reads the HUD. Measured: title, fire, LIVES 3, the hero standing still
|
|
260
|
+
loses all three lives, the title again, fire, a new game at LIVES 3. Set
|
|
261
|
+
`DRIVE_PORT` if another VICE holds port 6581.
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
make joy
|
|
265
|
+
DRIVE_PORT=6811 python3 tools/drive.py build/beat-em-up-joy.prg "until:PRESS FIRE" tap:fire \
|
|
266
|
+
"until:LIVES 3" "until:LIVES 1" "until:PRESS FIRE" tap:fire "until:LIVES 3" print
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Which Oscar64
|
|
270
|
+
|
|
271
|
+
Built and checked with the build named in c64-kb's CLAUDE.md (1.32.271
|
|
272
|
+
plus the local fix c1270bc) and with the released v1.32.273: on both,
|
|
273
|
+
`make shot check` 29 of 29, `make selftest`, `make flickercheck` 12 of 12
|
|
274
|
+
and the demo caught, `make gameover` 8 of 8, `make claims` 0 violations.
|
|
275
|
+
The meter reads a little lower on v1.32.273 (window 0: 14,773 / 9,131 PAL,
|
|
276
|
+
16,297 / 9,598 NTSC). Two faults shape the code:
|
|
277
|
+
|
|
278
|
+
- c64-kb #30 fault 8, on both compilers at every level: an `int` loaded
|
|
279
|
+
from an `unsigned` of 32,768 or more is compared as if it were not
|
|
280
|
+
negative, when the other side is another non-constant `int`. Against a
|
|
281
|
+
constant, or against the result of arithmetic, it is right. An enemy
|
|
282
|
+
spawned at world x -24 (65,512) walked the wrong way. World x is never
|
|
283
|
+
below 0 (`enemy.c`, `spawn_wave`), and `think` compares the unsigned
|
|
284
|
+
positions as they are. Keep positions under 32,768.
|
|
285
|
+
- v1.32.273 only: `page_d018[shown_page] | (b_cs ? D018_CS1 : 0)` in one
|
|
286
|
+
expression indexed `page_d018` with X before loading X (its `.asm`), so
|
|
287
|
+
`$D018` pointed the street at the sprite data. Two statements
|
|
288
|
+
(`view_publish`) are right on both.
|
|
289
|
+
|
|
290
|
+
## Left out on purpose
|
|
291
|
+
|
|
292
|
+
- No more than four fighters at once, one brute a wave, two sprite parts
|
|
293
|
+
a fighter (see "More fighters" above).
|
|
294
|
+
- No grabs, throws, weapons or pickups.
|
|
295
|
+
- The camera only moves right, and the street ends at the third lock.
|
|
296
|
+
- The high score is not saved: it lives until power-off.
|
|
297
|
+
- The street on rows 2-19 has two colours (bit pairs 00 and 01), so the
|
|
298
|
+
brute's `$D01B` rule holds.
|
|
299
|
+
- NTSC runs the same per-frame steps at 60 Hz: the game and the tune are
|
|
300
|
+
6/5 as fast (c64-kb `pal_ntsc_tempo_mismatch`), and the tune's pitches,
|
|
301
|
+
tabled for the PAL clock, about 4% sharp (arithmetic).
|
|
302
|
+
- One effect at a time on voice 3; a new one cuts the last.
|
|
303
|
+
|
|
304
|
+
## Not established
|
|
305
|
+
|
|
306
|
+
- A real `$DC00` joystick: the normal game was played through `make joy`
|
|
307
|
+
(a RAM port byte), not through the CIA.
|
|
308
|
+
- Real hardware: everything was measured in VICE x64sc 3.10.
|
|
309
|
+
- The tune was never listened to; its note table is arithmetic.
|
|
310
|
+
- The flicker check covers the three photo stops, six moments a model; the
|
|
311
|
+
VIC read-back covers every frame but reads the registers, not the
|
|
312
|
+
picture.
|
|
313
|
+
- The four meter windows are 1,020 play frames of the run; the rest were
|
|
314
|
+
not metered (the verdict's `late` covers every play frame, but only
|
|
315
|
+
whether it fitted).
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"checks": [
|
|
3
|
+
{ "name": "own verdict: GAME OVER on the HUD, LIVES 0 (verdict.h, grade_gameover)", "type": "verdict" },
|
|
4
|
+
{ "name": "GAME OVER whole, and nothing written after it where the enemy's name goes (it once read GAME OVETHUG)", "type": "text", "row": 21, "col": 15, "text": "GAME OVER " },
|
|
5
|
+
{ "name": "the HUD drawn before the message: LIVES 0", "type": "text", "row": 23, "col": 32, "text": "LIVES 0" },
|
|
6
|
+
{ "name": "the verdict line on row 24", "type": "text", "row": 24, "col": 0, "text": "RESULT 01 PASS" }
|
|
7
|
+
]
|
|
8
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"checks": [
|
|
3
|
+
{ "name": "own verdict (border)", "type": "verdict" },
|
|
4
|
+
{ "name": "verdict line, where the enemy's name goes", "type": "text", "row": 21, "col": 23, "text": "RESULT 01 PASS" },
|
|
5
|
+
{ "name": "HUD: the hero's name (40 columns, XSCROLL 0 after the split)", "type": "text", "row": 21, "col": 3, "text": "PLAYER" },
|
|
6
|
+
{ "name": "HUD: score (hits and KOs, pinned from the run; the program checks the sum)", "type": "text", "row": 23, "col": 3, "text": "SCORE 001940" },
|
|
7
|
+
{ "name": "HUD: stage 3 reached, one life lost", "type": "text", "row": 23, "col": 23, "text": "STAGE 3 LIVES 2" },
|
|
8
|
+
{ "name": "HUD: the first cell of the hero's bar is full (yellow, 7 x 6)", "type": "rect", "colour": 7, "vic_x": 48, "line": 228, "width": 7, "height": 6 },
|
|
9
|
+
{
|
|
10
|
+
"name": "face band: the hero's face, sprite 0 of band 2 at VIC X 24, Y 218 (shirt-white headband and collar, rows 4-19)",
|
|
11
|
+
"type": "sprite", "colour": 1, "vic_x": 24, "line": 223, "width": 24, "height": 16,
|
|
12
|
+
"search": { "vic_x": 24, "line": 219, "width": 24, "height": 21 }
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"name": "fighter band: the hero's top part, facing left (white shirt; pinned from the run, the program checks its sprite table)",
|
|
16
|
+
"type": "sprite", "colour": 1, "vic_x": 274, "line": 160, "width": 14, "height": 12
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "fighter band: the hero's legs, feet on ground line 194 (blue trousers)",
|
|
20
|
+
"type": "sprite", "colour": 6, "vic_x": 270, "line": 174, "width": 18, "height": 19
|
|
21
|
+
},
|
|
22
|
+
{ "name": "scrolled street at camera 704: the alley at world column 119 is plain (VIC X 279, rows 2-9)", "type": "rect", "colour": 11, "vic_x": 279, "line": 67, "width": 8, "height": 64 },
|
|
23
|
+
{ "name": "scrolled street at camera 704: the alley lamp at world column 118 (VIC X 271, lines 85-86)", "type": "rect", "colour": 9, "vic_x": 271, "line": 85, "width": 8, "height": 2 },
|
|
24
|
+
{ "name": "the kerb's brown edge, lines 174-175, left of the hero", "type": "rect", "colour": 9, "vic_x": 32, "line": 174, "width": 228, "height": 2 },
|
|
25
|
+
{ "name": "row 20, between street and HUD, is blank", "type": "rect", "colour": 11, "vic_x": 31, "line": 211, "width": 304, "height": 8 },
|
|
26
|
+
{ "name": "display the same on both models", "type": "same", "cells": [0, 0, 23, 39] },
|
|
27
|
+
{ "name": "frame meter, 255 play frames from the second stage's lock (the brute; METER_WINDOW 0, the run's worst)", "type": "meter", "row": 24, "col": 20, "frames": 255 }
|
|
28
|
+
]
|
|
29
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// anim.c: fighter moves as tables (c64-kb sprite_animation_table). A
|
|
2
|
+
// sequence is (pose, frames, hit box) triples, then AN_LOOP n (go to
|
|
3
|
+
// triple n), AN_HOLD (stay on the last triple) or AN_END (the move is
|
|
4
|
+
// over: anim_done). A hit box other than HB_NONE marks an attack frame;
|
|
5
|
+
// only those frames can land (c64-kb per_frame_hitbox, lane_depth_engine's
|
|
6
|
+
// active-frame table). Facing is not in the tables: view.c mirrors.
|
|
7
|
+
#include "game.h"
|
|
8
|
+
|
|
9
|
+
#define AN_LOOP 0xff
|
|
10
|
+
#define AN_HOLD 0xfe
|
|
11
|
+
#define AN_END 0xfd
|
|
12
|
+
|
|
13
|
+
const char an_stand[] = { P_STAND, 1, HB_NONE, AN_HOLD };
|
|
14
|
+
const char an_walk[] = { P_WALK1, 8, HB_NONE, P_STAND, 4, HB_NONE, P_WALK2, 8, HB_NONE,
|
|
15
|
+
P_STAND, 4, HB_NONE, AN_LOOP, 0 };
|
|
16
|
+
// Punch: 4 frames wind-up, 6 with the fist out (active), 4 back: 14.
|
|
17
|
+
const char an_punch[] = { P_WIND, 4, HB_NONE, P_PUNCH, 6, HB_PUNCH, P_WIND, 4, HB_NONE, AN_END };
|
|
18
|
+
// Kick: 5 frames chamber, 8 with the leg out (active), 5 back: 18.
|
|
19
|
+
const char an_kick[] = { P_CHAMBER, 5, HB_NONE, P_KICK, 8, HB_KICK, P_CHAMBER, 5, HB_NONE, AN_END };
|
|
20
|
+
const char an_jump[] = { P_JUMP, 1, HB_NONE, AN_HOLD };
|
|
21
|
+
const char an_jkick[] = { P_JKICK, 1, HB_JKICK, AN_HOLD }; // active until landing
|
|
22
|
+
const char an_hurt[] = { P_HURT, 12, HB_NONE, AN_END };
|
|
23
|
+
const char an_fly[] = { P_HURT, 1, HB_NONE, AN_HOLD }; // knocked off the feet
|
|
24
|
+
const char an_down[] = { P_DOWN, 1, HB_NONE, AN_HOLD };
|
|
25
|
+
const char an_kneel[] = { P_KNEEL, 16, HB_NONE, AN_END };
|
|
26
|
+
|
|
27
|
+
void anim_start(struct Anim *a, const char *seq)
|
|
28
|
+
{
|
|
29
|
+
a->seq = seq;
|
|
30
|
+
a->pos = 0;
|
|
31
|
+
a->count = seq[1];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
void anim_set(struct Anim *a, const char *seq)
|
|
35
|
+
{
|
|
36
|
+
if (a->seq != seq)
|
|
37
|
+
anim_start(a, seq);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
void anim_step(struct Anim *a)
|
|
41
|
+
{
|
|
42
|
+
if (a->count == 0 || --a->count)
|
|
43
|
+
return; // held or done (0), or the triple is not over
|
|
44
|
+
char p = a->pos + 3;
|
|
45
|
+
char op = a->seq[p];
|
|
46
|
+
if (op == AN_LOOP)
|
|
47
|
+
p = a->seq[p + 1] * 3;
|
|
48
|
+
else if (op == AN_HOLD || op == AN_END)
|
|
49
|
+
{
|
|
50
|
+
a->count = 0; // stays on the last triple
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
a->pos = p;
|
|
54
|
+
a->count = a->seq[p + 1];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
char anim_pose(const struct Anim *a)
|
|
58
|
+
{
|
|
59
|
+
return a->seq[a->pos];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
char anim_hit(const struct Anim *a)
|
|
63
|
+
{
|
|
64
|
+
return a->seq[a->pos + 2];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
bool anim_done(const struct Anim *a)
|
|
68
|
+
{
|
|
69
|
+
return a->count == 0 && a->seq[a->pos + 3] == AN_END;
|
|
70
|
+
}
|