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,384 @@
|
|
|
1
|
+
// fighter.c: what every fighter shares, player or enemy. A fighter is an
|
|
2
|
+
// origin (foot column fx, ground line fy, height fh), a mode, and an
|
|
3
|
+
// animation; view.c turns the pose into two sprites. Hits follow c64-kb
|
|
4
|
+
// lane_depth_engine: the ground lines within WIN first (one byte compare,
|
|
5
|
+
// fails for most pairs), then the attack frame's hit box against the
|
|
6
|
+
// target's hurt box (per_frame_hitbox), with x mirrored by facing.
|
|
7
|
+
#include "game.h"
|
|
8
|
+
|
|
9
|
+
char fmode[NFIGHT], fkind[NFIGHT], fface[NFIGHT], fhp[NFIGHT], ftimer[NFIGHT];
|
|
10
|
+
unsigned fx[NFIGHT];
|
|
11
|
+
char fy[NFIGHT], fh[NFIGHT], farc[NFIGHT];
|
|
12
|
+
signed char fvx[NFIGHT];
|
|
13
|
+
char fcombo[NFIGHT];
|
|
14
|
+
bool flanded[NFIGHT];
|
|
15
|
+
struct Anim fanim[NFIGHT];
|
|
16
|
+
char finvuln[NFIGHT];
|
|
17
|
+
static char fstep[NFIGHT]; // walk frames, for the half-speed depth move
|
|
18
|
+
static bool fjkicked[NFIGHT]; // this jump has already kicked
|
|
19
|
+
|
|
20
|
+
// Heights by frame (jump_arc_table): a jump from ARC_JUMP, 24 frames, 18
|
|
21
|
+
// pixels at the top; a knock-down flight from ARC_FLY, 12 frames. $FF ends
|
|
22
|
+
// an arc: the fighter is on the ground again. 18 is the most a top part
|
|
23
|
+
// may rise: from ground line 150 its first line is 91, after the fighter
|
|
24
|
+
// band's IRQ at line 76 has finished (engine.asm).
|
|
25
|
+
const char arc[] = {
|
|
26
|
+
0, 3, 6, 8, 10, 12, 14, 15, 16, 17, 18, 18, 18, 18, 17, 16, 15, 14, 12, 10, 8, 6, 3, 0xff,
|
|
27
|
+
0, 0,
|
|
28
|
+
0, 3, 5, 7, 8, 9, 9, 8, 7, 5, 3, 0xff,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Damage by hit box, and the knock-down rule: a kick, a jump kick, the third
|
|
32
|
+
// punch in a row, or the last hit point.
|
|
33
|
+
static const char damage[HB_COUNT] = { 0, 2, 3, 4 };
|
|
34
|
+
|
|
35
|
+
void fighter_spawn(char f, char kind, unsigned x, char y, char face)
|
|
36
|
+
{
|
|
37
|
+
fkind[f] = kind;
|
|
38
|
+
fx[f] = x;
|
|
39
|
+
fy[f] = y;
|
|
40
|
+
fh[f] = 0;
|
|
41
|
+
fface[f] = face;
|
|
42
|
+
fmode[f] = M_FREE;
|
|
43
|
+
fhp[f] = kind == K_HERO ? HP_HERO : kind == K_THUG ? HP_THUG : HP_BRUTE;
|
|
44
|
+
fcombo[f] = 0;
|
|
45
|
+
finvuln[f] = 0;
|
|
46
|
+
flanded[f] = false;
|
|
47
|
+
anim_start(&fanim[f], an_stand);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
bool fighter_can_act(char f)
|
|
51
|
+
{
|
|
52
|
+
return fmode[f] == M_FREE;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// A step in x (a pixel) and in depth (a line every other step): the depth
|
|
56
|
+
// move is slower, as a street seen from the side is foreshortened.
|
|
57
|
+
void fighter_walk(char f, signed char dx, signed char dy)
|
|
58
|
+
{
|
|
59
|
+
if (fmode[f] != M_FREE)
|
|
60
|
+
return;
|
|
61
|
+
if (dx || dy)
|
|
62
|
+
{
|
|
63
|
+
fx[f] += dx;
|
|
64
|
+
if (dx)
|
|
65
|
+
fface[f] = dx < 0 ? FACE_LEFT : FACE_RIGHT;
|
|
66
|
+
if (dy && (++fstep[f] & 1))
|
|
67
|
+
{
|
|
68
|
+
char y = fy[f] + dy;
|
|
69
|
+
if (y >= PLANE_TOP && y <= PLANE_BOT)
|
|
70
|
+
{
|
|
71
|
+
fy[f] = y;
|
|
72
|
+
events |= EV_DEPTH;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
anim_set(&fanim[f], an_walk);
|
|
76
|
+
}
|
|
77
|
+
else
|
|
78
|
+
anim_set(&fanim[f], an_stand);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
void fighter_attack(char f, char move)
|
|
82
|
+
{
|
|
83
|
+
if (fmode[f] == M_JUMP)
|
|
84
|
+
{
|
|
85
|
+
if (!fjkicked[f]) // one kick a jump
|
|
86
|
+
{
|
|
87
|
+
fjkicked[f] = true;
|
|
88
|
+
flanded[f] = false;
|
|
89
|
+
anim_start(&fanim[f], an_jkick);
|
|
90
|
+
sfx_play(SFX_SWING);
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (fmode[f] != M_FREE)
|
|
95
|
+
return;
|
|
96
|
+
flanded[f] = false;
|
|
97
|
+
if (move == A_JUMP)
|
|
98
|
+
{
|
|
99
|
+
fmode[f] = M_JUMP;
|
|
100
|
+
farc[f] = ARC_JUMP;
|
|
101
|
+
fjkicked[f] = false;
|
|
102
|
+
anim_start(&fanim[f], an_jump);
|
|
103
|
+
sfx_play(SFX_JUMP);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
fmode[f] = M_ATTACK;
|
|
107
|
+
anim_start(&fanim[f], move == A_PUNCH ? an_punch : an_kick);
|
|
108
|
+
sfx_play(SFX_SWING);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Keep a fighter on the screen while he flies or is pushed.
|
|
112
|
+
static void keep_on_screen(char f)
|
|
113
|
+
{
|
|
114
|
+
if (fx[f] < camx + 12)
|
|
115
|
+
fx[f] = camx + 12;
|
|
116
|
+
else if (fx[f] > camx + 300)
|
|
117
|
+
fx[f] = camx + 300;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// One step along an arc; true when it has landed.
|
|
121
|
+
static bool arc_step(char f)
|
|
122
|
+
{
|
|
123
|
+
char h = arc[++farc[f]];
|
|
124
|
+
if (h == 0xff)
|
|
125
|
+
{
|
|
126
|
+
fh[f] = 0;
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
fh[f] = h;
|
|
130
|
+
fx[f] += fvx[f];
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
static void step_one(char f)
|
|
135
|
+
{
|
|
136
|
+
anim_step(&fanim[f]);
|
|
137
|
+
if (finvuln[f])
|
|
138
|
+
finvuln[f]--;
|
|
139
|
+
switch (fmode[f])
|
|
140
|
+
{
|
|
141
|
+
case M_ATTACK:
|
|
142
|
+
if (anim_done(&fanim[f]))
|
|
143
|
+
{
|
|
144
|
+
fmode[f] = M_FREE;
|
|
145
|
+
anim_start(&fanim[f], an_stand);
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
case M_JUMP:
|
|
149
|
+
if (arc_step(f))
|
|
150
|
+
{
|
|
151
|
+
fmode[f] = M_FREE;
|
|
152
|
+
anim_start(&fanim[f], an_stand);
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
case M_HURT:
|
|
156
|
+
if (ftimer[f])
|
|
157
|
+
{
|
|
158
|
+
ftimer[f]--;
|
|
159
|
+
fx[f] += fvx[f];
|
|
160
|
+
keep_on_screen(f);
|
|
161
|
+
}
|
|
162
|
+
if (anim_done(&fanim[f]))
|
|
163
|
+
{
|
|
164
|
+
fmode[f] = M_FREE;
|
|
165
|
+
anim_start(&fanim[f], an_stand);
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
case M_FLY:
|
|
169
|
+
if (arc_step(f))
|
|
170
|
+
{
|
|
171
|
+
anim_start(&fanim[f], an_down);
|
|
172
|
+
if (fhp[f] == 0)
|
|
173
|
+
{
|
|
174
|
+
fmode[f] = M_KO;
|
|
175
|
+
ftimer[f] = 60;
|
|
176
|
+
sfx_play(SFX_KO);
|
|
177
|
+
}
|
|
178
|
+
else
|
|
179
|
+
{
|
|
180
|
+
fmode[f] = M_DOWN;
|
|
181
|
+
ftimer[f] = 40;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
keep_on_screen(f);
|
|
185
|
+
break;
|
|
186
|
+
case M_DOWN:
|
|
187
|
+
if (--ftimer[f] == 0)
|
|
188
|
+
{
|
|
189
|
+
fmode[f] = M_KNEEL;
|
|
190
|
+
anim_start(&fanim[f], an_kneel);
|
|
191
|
+
}
|
|
192
|
+
break;
|
|
193
|
+
case M_KNEEL:
|
|
194
|
+
if (anim_done(&fanim[f]))
|
|
195
|
+
{
|
|
196
|
+
fmode[f] = M_FREE;
|
|
197
|
+
anim_start(&fanim[f], an_stand);
|
|
198
|
+
if (f)
|
|
199
|
+
events |= EV_GETUP;
|
|
200
|
+
}
|
|
201
|
+
break;
|
|
202
|
+
case M_KO:
|
|
203
|
+
if (--ftimer[f] == 0)
|
|
204
|
+
{
|
|
205
|
+
if (f)
|
|
206
|
+
enemy_ko(f);
|
|
207
|
+
else
|
|
208
|
+
hero_hurt();
|
|
209
|
+
}
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
void fighters_step(void)
|
|
215
|
+
{
|
|
216
|
+
for (char f = 0; f < NFIGHT; f++)
|
|
217
|
+
if (fmode[f] != M_OFF)
|
|
218
|
+
step_one(f);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// A box in world x for fighter f facing his way: [*l, *r].
|
|
222
|
+
static void box_x(char f, const struct Box *b, int *l, int *r)
|
|
223
|
+
{
|
|
224
|
+
int x = fx[f];
|
|
225
|
+
if (fface[f] == FACE_RIGHT)
|
|
226
|
+
{
|
|
227
|
+
*l = x + b->x0;
|
|
228
|
+
*r = x + b->x1;
|
|
229
|
+
}
|
|
230
|
+
else
|
|
231
|
+
{
|
|
232
|
+
*l = x - b->x1;
|
|
233
|
+
*r = x - b->x0;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
static bool can_be_hit(char t)
|
|
238
|
+
{
|
|
239
|
+
char m = fmode[t];
|
|
240
|
+
return (m == M_FREE || m == M_ATTACK || m == M_JUMP || m == M_HURT) && !finvuln[t];
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
static void land_hit(char a, char t, char hb)
|
|
244
|
+
{
|
|
245
|
+
char d = damage[hb];
|
|
246
|
+
fhp[t] = fhp[t] > d ? fhp[t] - d : 0;
|
|
247
|
+
bool knock = hb != HB_PUNCH || ++fcombo[t] >= 3 || fhp[t] == 0 || fh[t] > 0;
|
|
248
|
+
fface[t] = fx[a] < fx[t] ? FACE_LEFT : FACE_RIGHT; // turn to the blow
|
|
249
|
+
signed char away = fx[a] < fx[t] ? 1 : -1;
|
|
250
|
+
if (a == 0)
|
|
251
|
+
{
|
|
252
|
+
if (hb == HB_PUNCH)
|
|
253
|
+
{
|
|
254
|
+
hits_punch++;
|
|
255
|
+
events |= EV_PUNCH_HIT;
|
|
256
|
+
score_add(0, FORCE_FAULT ? 2 : 1); // FORCE_FAULT: a punch scores 20
|
|
257
|
+
}
|
|
258
|
+
else if (hb == HB_KICK)
|
|
259
|
+
{
|
|
260
|
+
hits_kick++;
|
|
261
|
+
events |= EV_KICK_HIT;
|
|
262
|
+
score_add(0, 2);
|
|
263
|
+
}
|
|
264
|
+
else
|
|
265
|
+
{
|
|
266
|
+
hits_jkick++;
|
|
267
|
+
events |= EV_JKICK_HIT;
|
|
268
|
+
score_add(0, 3);
|
|
269
|
+
}
|
|
270
|
+
face_enemy = t;
|
|
271
|
+
ai_state[t] = AI_RETREAT; // a hit enemy backs off once he is up
|
|
272
|
+
ai_timer[t] = 20;
|
|
273
|
+
}
|
|
274
|
+
else
|
|
275
|
+
events |= EV_HERO_HIT;
|
|
276
|
+
hud_dirty = true;
|
|
277
|
+
if (knock)
|
|
278
|
+
{
|
|
279
|
+
fcombo[t] = 0;
|
|
280
|
+
fmode[t] = M_FLY;
|
|
281
|
+
farc[t] = ARC_FLY;
|
|
282
|
+
fvx[t] = away * 2;
|
|
283
|
+
anim_start(&fanim[t], an_fly);
|
|
284
|
+
sfx_play(SFX_DOWN);
|
|
285
|
+
events |= t ? EV_KNOCKDOWN : EV_HERO_DOWN;
|
|
286
|
+
}
|
|
287
|
+
else
|
|
288
|
+
{
|
|
289
|
+
fmode[t] = M_HURT;
|
|
290
|
+
ftimer[t] = 4; // pushed a pixel a frame for 4 frames
|
|
291
|
+
fvx[t] = away;
|
|
292
|
+
anim_start(&fanim[t], an_hurt);
|
|
293
|
+
sfx_play(SFX_HIT);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Every attacker on an active frame against the other side: the hero
|
|
298
|
+
// against the enemies, an enemy against the hero. One hit an attack. A
|
|
299
|
+
// target more than three windows away is skipped on one byte compare
|
|
300
|
+
// (lane_depth_engine's order); nearer, the boxes, then the lane window:
|
|
301
|
+
// two fighters a lane apart can overlap on the screen, and that is a miss,
|
|
302
|
+
// counted as EV_LANE_MISS so the verdict sees the gate work.
|
|
303
|
+
void hits_resolve(void)
|
|
304
|
+
{
|
|
305
|
+
for (char a = 0; a < NFIGHT; a++)
|
|
306
|
+
{
|
|
307
|
+
char m = fmode[a];
|
|
308
|
+
if ((m != M_ATTACK && m != M_JUMP) || flanded[a])
|
|
309
|
+
continue;
|
|
310
|
+
char hb = anim_hit(&fanim[a]);
|
|
311
|
+
if (hb == HB_NONE)
|
|
312
|
+
continue;
|
|
313
|
+
const struct Box *h = &hit_box[hb];
|
|
314
|
+
int hl, hr;
|
|
315
|
+
box_x(a, h, &hl, &hr);
|
|
316
|
+
char hy0 = fh[a] + h->y0, hy1 = fh[a] + h->y1;
|
|
317
|
+
char t0 = a ? 0 : 1, t1 = a ? 1 : NFIGHT;
|
|
318
|
+
for (char t = t0; t < t1; t++)
|
|
319
|
+
{
|
|
320
|
+
if (!can_be_hit(t))
|
|
321
|
+
continue;
|
|
322
|
+
char dy = fy[a] > fy[t] ? fy[a] - fy[t] : fy[t] - fy[a];
|
|
323
|
+
if (dy > 3 * WIN)
|
|
324
|
+
continue; // far off the lane: not even a near miss
|
|
325
|
+
const struct Box *u = &hurt_box[anim_pose(&fanim[t])];
|
|
326
|
+
if (u->y1 == 0)
|
|
327
|
+
continue;
|
|
328
|
+
int ul, ur;
|
|
329
|
+
box_x(t, u, &ul, &ur);
|
|
330
|
+
char uy0 = fh[t] + u->y0, uy1 = fh[t] + u->y1;
|
|
331
|
+
if (!(hl <= ur && ul <= hr && hy0 <= uy1 && uy0 <= hy1))
|
|
332
|
+
continue; // the boxes do not touch
|
|
333
|
+
if (dy > WIN)
|
|
334
|
+
{
|
|
335
|
+
events |= EV_LANE_MISS; // they touch on the screen, a lane apart: no hit
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
{
|
|
339
|
+
#if AUTOPILOT
|
|
340
|
+
check_hit(a, t, hb); // verdict.h: the same hit, recomputed its own way
|
|
341
|
+
#endif
|
|
342
|
+
land_hit(a, t, hb);
|
|
343
|
+
flanded[a] = true;
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// The joystick: left and right walk, up and down change lane. Fire alone
|
|
351
|
+
// punches; fire with left or right kicks that way; fire with up jumps
|
|
352
|
+
// (with left or right, forward); fire in the air kicks.
|
|
353
|
+
void player_control(char joy, char pressed)
|
|
354
|
+
{
|
|
355
|
+
signed char dx = !(joy & JOY_RIGHT) ? 1 : !(joy & JOY_LEFT) ? -1 : 0;
|
|
356
|
+
signed char dy = !(joy & JOY_DOWN) ? 1 : !(joy & JOY_UP) ? -1 : 0;
|
|
357
|
+
if (pressed & JOY_FIRE)
|
|
358
|
+
{
|
|
359
|
+
if (fmode[0] == M_JUMP)
|
|
360
|
+
fighter_attack(0, A_KICK);
|
|
361
|
+
else if (fmode[0] == M_FREE)
|
|
362
|
+
{
|
|
363
|
+
fcombo[0] = 0;
|
|
364
|
+
if (dy < 0)
|
|
365
|
+
{
|
|
366
|
+
fvx[0] = dx;
|
|
367
|
+
fighter_attack(0, A_JUMP);
|
|
368
|
+
}
|
|
369
|
+
else if (dx)
|
|
370
|
+
{
|
|
371
|
+
fface[0] = dx < 0 ? FACE_LEFT : FACE_RIGHT;
|
|
372
|
+
fighter_attack(0, A_KICK);
|
|
373
|
+
}
|
|
374
|
+
else
|
|
375
|
+
fighter_attack(0, A_PUNCH);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
else
|
|
379
|
+
fighter_walk(0, dx, dy);
|
|
380
|
+
if (fx[0] < camx + 16) // the hero stays on the screen
|
|
381
|
+
fx[0] = camx + 16;
|
|
382
|
+
else if (fx[0] > camx + 296)
|
|
383
|
+
fx[0] = camx + 296;
|
|
384
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
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 FLICKER_DEMO
|
|
17
|
+
#define FLICKER_DEMO 0 // 1: the fighter band drops its last part (tools/flickercheck.py must see it)
|
|
18
|
+
#endif
|
|
19
|
+
|
|
20
|
+
// ---- memory: VIC bank 3 ($C000-$FFFF) -----------------------------------
|
|
21
|
+
#define PAGE0 ((char *)0xc000) // street pages (rows 0-19 used, 20 blank)
|
|
22
|
+
#define PAGE1 ((char *)0xc400)
|
|
23
|
+
#define HUDPAGE ((char *)0xc800) // the HUD rows 21-24 are read from here
|
|
24
|
+
#define CHARSET ((char *)0xe000) // RAM under the KERNAL, which is banked out
|
|
25
|
+
#define CHARSET2 ((char *)0xe800) // the same set but for the brute's glyphs (brute.c)
|
|
26
|
+
#define SPRMEM ((char *)0xf000) // sprite blocks 192-254
|
|
27
|
+
#define COLOUR ((char *)0xd800)
|
|
28
|
+
#define SPR_BLOCK 192 // block number of SPRMEM in bank 3
|
|
29
|
+
#define D018_PAGE0 0x08 // screen $C000, characters $E000
|
|
30
|
+
#define D018_PAGE1 0x18 // screen $C400
|
|
31
|
+
#define D018_CS1 0x02 // | this: characters $E800 instead
|
|
32
|
+
#define D016_PLAY 0x10 // multicolour, 38 columns; | XSCROLL
|
|
33
|
+
#define RESULT (*(volatile char *)0x02ff) // $01 pass, $02 fail
|
|
34
|
+
|
|
35
|
+
#define PF_ROWS 20 // street character rows
|
|
36
|
+
#define HUD_ROW 21 // first HUD row
|
|
37
|
+
|
|
38
|
+
// ---- colours ------------------------------------------------------------------
|
|
39
|
+
// On street rows 2-19 the street uses bit pairs 00 and 01 only: the VIC
|
|
40
|
+
// counts both as background, so a sprite with its $D01B bit set goes behind
|
|
41
|
+
// the brute's 10 and 11 pixels and nothing else. Pairs 10 and 11 belong to
|
|
42
|
+
// the brute there (colour RAM holds his body colour); rows 0-1, above every
|
|
43
|
+
// fighter, use 11 for the sky.
|
|
44
|
+
#define COL_ROAD VCOL_DARK_GREY // $D021: pavement, road, window glass
|
|
45
|
+
#define COL_BRICK VCOL_BROWN // $D022: bricks, kerb, road marks; the brute's belt
|
|
46
|
+
#define COL_BSKIN VCOL_LT_RED // $D023: the brute's skin
|
|
47
|
+
#define COL_BBODY VCOL_PURPLE // colour RAM, rows 2-20: the brute's body (0-7 only)
|
|
48
|
+
#define COL_SKIN VCOL_LT_RED // $D025: sprite pixels 01
|
|
49
|
+
#define COL_INK VCOL_BLACK // $D026: sprite pixels 11 (hair, outline, shoes)
|
|
50
|
+
|
|
51
|
+
// ---- joystick (active low, as $DC00 reads it) --------------------------------
|
|
52
|
+
#define JOY_UP 0x01
|
|
53
|
+
#define JOY_DOWN 0x02
|
|
54
|
+
#define JOY_LEFT 0x04
|
|
55
|
+
#define JOY_RIGHT 0x08
|
|
56
|
+
#define JOY_FIRE 0x10
|
|
57
|
+
|
|
58
|
+
// ---- the street (street.c) ----------------------------------------------------
|
|
59
|
+
#define LEVEL_TW 64 // tiles across; a tile is 2 x 2 characters
|
|
60
|
+
#define LEVEL_TH 10 // tiles down: the 20 street rows
|
|
61
|
+
#define LEVEL_CW (LEVEL_TW * 2) // characters across
|
|
62
|
+
#define CAM_MAX ((LEVEL_CW - 40) * 8)
|
|
63
|
+
#define NSTAGE 3
|
|
64
|
+
extern const unsigned stage_lock[NSTAGE]; // the camera stops here until the stage is clear
|
|
65
|
+
void street_init(void); // decode the text into tile indices, once
|
|
66
|
+
char cell_char(unsigned col, char row); // glyph at a world character cell
|
|
67
|
+
void level_column(char *dst, unsigned col); // 20 glyphs down one page column
|
|
68
|
+
void street_block(char *dst, char wcol, char row); // 30 glyphs under a 5 x 6 block
|
|
69
|
+
|
|
70
|
+
// Glyphs. 0-63 are the ROM's upper-case set (text, digits, the meter);
|
|
71
|
+
// the street's own glyphs start at CH_FIRST. The HUD's bar glyphs follow.
|
|
72
|
+
#define CH_SPACE 32
|
|
73
|
+
#define CH_FIRST 64
|
|
74
|
+
#define CH_SKY 64
|
|
75
|
+
#define CH_ROOF 65
|
|
76
|
+
#define CH_BRICK 66
|
|
77
|
+
#define CH_WIN_T 67
|
|
78
|
+
#define CH_WIN_B 68
|
|
79
|
+
#define CH_DOOR 69
|
|
80
|
+
#define CH_SIGN 70
|
|
81
|
+
#define CH_PAVE 71
|
|
82
|
+
#define CH_KERB 72
|
|
83
|
+
#define CH_ROAD 73
|
|
84
|
+
#define CH_DASH 74
|
|
85
|
+
#define CH_LAMP 75
|
|
86
|
+
#define CH_POLE 76
|
|
87
|
+
#define CH_BAR_FULL 77 // hires, HUD only
|
|
88
|
+
#define CH_BAR_HALF 78
|
|
89
|
+
#define CH_BAR_EMPTY 79
|
|
90
|
+
#define CH_ALLEY 80 // the dark gap between buildings, rows 2-9
|
|
91
|
+
#define CH_COUNT 17
|
|
92
|
+
#define CH_BRUTE 128 // the brute's 30 glyphs, 128-157, in each set (brute.c)
|
|
93
|
+
|
|
94
|
+
// ---- art (art.c) ----------------------------------------------------------------
|
|
95
|
+
// Sprite blocks, facing right; each fighter block has a mirrored twin at
|
|
96
|
+
// + B_MIRROR (built at start-up). B_GO and the faces are not mirrored.
|
|
97
|
+
enum Block {
|
|
98
|
+
B_T_STAND, B_T_WIND, B_T_PUNCH, B_T_LEAN, B_T_HURT, B_T_JUMP,
|
|
99
|
+
B_L_STAND, B_L_WALK1, B_L_WALK2, B_L_CHAMBER, B_L_KICK, B_L_TUCK, B_L_KNEEL,
|
|
100
|
+
B_D_HEAD, B_D_FEET,
|
|
101
|
+
B_FIGHTER_COUNT,
|
|
102
|
+
B_MIRROR = B_FIGHTER_COUNT,
|
|
103
|
+
B_GO = 2 * B_FIGHTER_COUNT, B_FACE_HERO, B_FACE_THUG, B_FACE_BRUTE,
|
|
104
|
+
B_COUNT
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// A pose: two parts, each a block and an offset from the fighter's origin
|
|
108
|
+
// (his foot column, the ground line under him). dx is the part's left edge
|
|
109
|
+
// from the origin facing right; dy is its Y register from the ground line.
|
|
110
|
+
enum Pose {
|
|
111
|
+
P_STAND, P_WALK1, P_WALK2, P_WIND, P_PUNCH, P_CHAMBER, P_KICK,
|
|
112
|
+
P_JUMP, P_JKICK, P_HURT, P_DOWN, P_KNEEL,
|
|
113
|
+
P_COUNT
|
|
114
|
+
};
|
|
115
|
+
struct Part { char block; signed char dx, dy; };
|
|
116
|
+
extern const struct Part pose_part[P_COUNT][2];
|
|
117
|
+
|
|
118
|
+
// Boxes in pixels from the origin, facing right; y is height above the
|
|
119
|
+
// ground line (0 at the feet). A hurt box per pose; a hit box per attack.
|
|
120
|
+
struct Box { signed char x0, x1; char y0, y1; };
|
|
121
|
+
extern const struct Box hurt_box[P_COUNT]; // y1 = 0: none (cannot be hit)
|
|
122
|
+
enum HitBox { HB_NONE, HB_PUNCH, HB_KICK, HB_JKICK, HB_COUNT };
|
|
123
|
+
extern const struct Box hit_box[HB_COUNT];
|
|
124
|
+
void art_build(void); // charset and sprite blocks into bank 3
|
|
125
|
+
extern const char brute_art[3][48][17]; // the brute: stand, slam, down; 16 x 48
|
|
126
|
+
|
|
127
|
+
// ---- the brute in character cells (brute.c) --------------------------------------
|
|
128
|
+
extern char b_wcol, b_row, b_fy; // the picture on screen: world column, top row, ground line
|
|
129
|
+
extern bool b_drawn;
|
|
130
|
+
extern char b_cs; // the character set on screen: 0 $E000, 1 $E800
|
|
131
|
+
extern unsigned brute_late; // switches that finished after his top row began
|
|
132
|
+
void brute_build(void); // the pre-shifted pictures, once
|
|
133
|
+
void brute_reset(void); // the pages were redrawn: nothing of him is on them
|
|
134
|
+
void brute_prepare(void); // end of a frame: build the next picture, half a frame at a time
|
|
135
|
+
void brute_draw(void); // start of a frame: move his cells to match the set just switched
|
|
136
|
+
void brute_patch(char p, char row0, char n); // after a scroll slice wrote column 39
|
|
137
|
+
char brute_code_at(unsigned wcol, char row); // his code at a world cell, or 0
|
|
138
|
+
|
|
139
|
+
// ---- animation (anim.c) ----------------------------------------------------------
|
|
140
|
+
// A sequence is (pose, frames, hit box) triples ending in AN_LOOP n (go to
|
|
141
|
+
// triple n), AN_HOLD (stay on the last) or AN_END (done: the fighter's
|
|
142
|
+
// move is over). Only the attack frames carry a hit box.
|
|
143
|
+
struct Anim { const char *seq; char pos, count; };
|
|
144
|
+
extern const char an_stand[], an_walk[], an_punch[], an_kick[], an_jump[], an_jkick[];
|
|
145
|
+
extern const char an_hurt[], an_fly[], an_down[], an_kneel[];
|
|
146
|
+
void anim_set(struct Anim *a, const char *seq); // restarts only if it is a new sequence
|
|
147
|
+
void anim_start(struct Anim *a, const char *seq); // always restarts
|
|
148
|
+
void anim_step(struct Anim *a);
|
|
149
|
+
char anim_pose(const struct Anim *a);
|
|
150
|
+
char anim_hit(const struct Anim *a); // the hit box of this frame, HB_NONE mostly
|
|
151
|
+
bool anim_done(const struct Anim *a); // an AN_END sequence has finished
|
|
152
|
+
|
|
153
|
+
// ---- fighters (fighter.c) -----------------------------------------------------------
|
|
154
|
+
// Slot 0 is the player, 1-3 the enemies (an object pool of three).
|
|
155
|
+
#define NFIGHT 4
|
|
156
|
+
#define NENEMY 3
|
|
157
|
+
#define PLANE_TOP 150 // ground lines a fighter may stand on
|
|
158
|
+
#define PLANE_BOT 204
|
|
159
|
+
#define WIN 6 // a hit needs the ground lines within 6 (lane_depth_engine)
|
|
160
|
+
enum Kind { K_HERO, K_THUG, K_BRUTE }; // the brute is drawn in characters (brute.c)
|
|
161
|
+
#define HP_HERO 24 // hit points; a HUD bar cell is two
|
|
162
|
+
#define HP_THUG 8
|
|
163
|
+
#define HP_BRUTE 12
|
|
164
|
+
enum Mode { M_OFF, M_FREE, M_ATTACK, M_JUMP, M_HURT, M_FLY, M_DOWN, M_KNEEL, M_KO };
|
|
165
|
+
extern char fmode[NFIGHT], fkind[NFIGHT], fface[NFIGHT], fhp[NFIGHT], ftimer[NFIGHT];
|
|
166
|
+
extern unsigned fx[NFIGHT]; // foot column, world pixels, below 32,768 (enemy.c: #30 fault 8)
|
|
167
|
+
extern char fy[NFIGHT]; // ground line (raster line of the feet)
|
|
168
|
+
extern char fh[NFIGHT]; // height above the ground, pixels
|
|
169
|
+
extern char farc[NFIGHT]; // index into the arc table while airborne
|
|
170
|
+
extern signed char fvx[NFIGHT]; // pixels a frame while airborne or pushed
|
|
171
|
+
extern char fcombo[NFIGHT]; // punches landed in a row
|
|
172
|
+
extern bool flanded[NFIGHT]; // this attack has already hit
|
|
173
|
+
extern struct Anim fanim[NFIGHT];
|
|
174
|
+
extern char finvuln[NFIGHT]; // frames of blinking after a respawn
|
|
175
|
+
#define FACE_RIGHT 0
|
|
176
|
+
#define FACE_LEFT 1
|
|
177
|
+
void fighter_spawn(char f, char kind, unsigned x, char y, char face);
|
|
178
|
+
void fighter_walk(char f, signed char dx, signed char dy);
|
|
179
|
+
void fighter_attack(char f, char move); // A_PUNCH, A_KICK, A_JUMP
|
|
180
|
+
enum Move { A_PUNCH, A_KICK, A_JUMP };
|
|
181
|
+
void fighters_step(void); // animation, flight, timers
|
|
182
|
+
void hits_resolve(void); // attacks against the other side
|
|
183
|
+
bool fighter_can_act(char f);
|
|
184
|
+
extern const char arc[]; // height by frame of a jump or a fall
|
|
185
|
+
#define ARC_JUMP 0 // arc start indices
|
|
186
|
+
#define ARC_FLY 26
|
|
187
|
+
void player_control(char joy, char pressed);
|
|
188
|
+
|
|
189
|
+
// ---- enemies (enemy.c) --------------------------------------------------------------
|
|
190
|
+
enum AiState { AI_ENTER, AI_APPROACH, AI_WAIT, AI_ATTACK, AI_RETREAT };
|
|
191
|
+
extern char ai_state[NFIGHT], ai_timer[NFIGHT];
|
|
192
|
+
extern char stage; // 0-2
|
|
193
|
+
extern char wave; // the stage's next wave
|
|
194
|
+
extern bool stage_clear; // every wave of this stage beaten
|
|
195
|
+
void waves_reset(void);
|
|
196
|
+
void waves_update(void); // the wave director: spawns at the lock
|
|
197
|
+
void enemies_update(void); // the AI
|
|
198
|
+
|
|
199
|
+
// ---- view (view.c) ------------------------------------------------------------------
|
|
200
|
+
#define NPAGES 2
|
|
201
|
+
extern unsigned camx; // world pixel at the window's left edge (XSCROLL 7)
|
|
202
|
+
extern unsigned shown_col; // first world column on the page on display
|
|
203
|
+
extern char shown_page;
|
|
204
|
+
extern int page_col[NPAGES];
|
|
205
|
+
extern char page_rows[NPAGES];
|
|
206
|
+
extern char order[NFIGHT]; // fighters far to near (the depth sort)
|
|
207
|
+
extern char parts_dropped; // fighter parts that found no sprite (never, by design)
|
|
208
|
+
extern char sprites_half; // the table half view_sprites last filled (0 or 1)
|
|
209
|
+
extern bool sprites_fresh; // view_sprites filled it this frame (it skips a frame the IRQ has not swapped)
|
|
210
|
+
extern bool go_sign; // blink the GO sign
|
|
211
|
+
extern bool faces_off; // AUTOPILOT photo stops: no faces over the HUD text
|
|
212
|
+
extern char face_enemy; // the enemy whose face and bar the HUD shows, or 0xff
|
|
213
|
+
void view_init(void); // VIC, bank, colours, IRQ chain
|
|
214
|
+
void view_cut(void); // draw both pages at camx; no scrolling
|
|
215
|
+
void view_follow(void); // move the camera after the player; prepare the hidden page
|
|
216
|
+
void view_sprites(void); // the three bands' back tables from the model
|
|
217
|
+
void view_publish(void); // the next picture's page and XSCROLL, for the IRQ at 251
|
|
218
|
+
int part_vic_x(char f, char k); // sprite X of fighter f's part k, as the band tables hold it
|
|
219
|
+
char *page_ptr(char page);
|
|
220
|
+
|
|
221
|
+
// ---- HUD, score, sound (hud.c, sound.c) -----------------------------------------------
|
|
222
|
+
extern char score[6], hiscore[6]; // decimal digits, most significant first
|
|
223
|
+
extern char lives;
|
|
224
|
+
extern bool hud_dirty;
|
|
225
|
+
void put_text(char row, char col, const char *s);
|
|
226
|
+
void hud_clear(void);
|
|
227
|
+
void hud_draw(void);
|
|
228
|
+
void hud_hiscore(void);
|
|
229
|
+
void score_add(char hundreds, char tens);
|
|
230
|
+
|
|
231
|
+
enum Sfx { SFX_SWING, SFX_HIT, SFX_DOWN, SFX_JUMP, SFX_KO };
|
|
232
|
+
void sfx_play(char id);
|
|
233
|
+
void sfx_update(void);
|
|
234
|
+
|
|
235
|
+
// ---- events and counts the verdict checks (main.c) -----------------------------------
|
|
236
|
+
#define EV_PUNCH_HIT 0x0001
|
|
237
|
+
#define EV_KICK_HIT 0x0002
|
|
238
|
+
#define EV_JKICK_HIT 0x0004
|
|
239
|
+
#define EV_KNOCKDOWN 0x0008 // an enemy went down
|
|
240
|
+
#define EV_GETUP 0x0010 // and got up again
|
|
241
|
+
#define EV_KO 0x0020
|
|
242
|
+
#define EV_HERO_HIT 0x0040
|
|
243
|
+
#define EV_HERO_DOWN 0x0080
|
|
244
|
+
#define EV_LIFE_LOST 0x0100
|
|
245
|
+
#define EV_LOCK 0x0200 // the camera stopped at a stage lock
|
|
246
|
+
#define EV_UNLOCK 0x0400 // a stage was cleared
|
|
247
|
+
#define EV_SCROLL 0x0800 // the camera crossed a column
|
|
248
|
+
#define EV_DEPTH 0x1000 // a fighter changed ground line
|
|
249
|
+
#define EV_LANE_MISS 0x2000 // an attack's boxes touched a fighter a lane away: no hit
|
|
250
|
+
#define EV_ALL 0x3fff
|
|
251
|
+
extern unsigned events;
|
|
252
|
+
extern char hits_punch, hits_kick, hits_jkick, kos_thug, kos_brute, locks;
|
|
253
|
+
void hero_hurt(void); // main.c owns lives and the state machine
|
|
254
|
+
void enemy_ko(char f);
|
|
255
|
+
#if AUTOPILOT
|
|
256
|
+
void check_hit(char a, char t, char hb); // verdict.h: each hit recomputed on its own
|
|
257
|
+
#endif
|
|
258
|
+
|
|
259
|
+
#pragma compile("street.c")
|
|
260
|
+
#pragma compile("art.c")
|
|
261
|
+
#pragma compile("brute.c")
|
|
262
|
+
#pragma compile("anim.c")
|
|
263
|
+
#pragma compile("fighter.c")
|
|
264
|
+
#pragma compile("enemy.c")
|
|
265
|
+
#pragma compile("view.c")
|
|
266
|
+
#pragma compile("hud.c")
|
|
267
|
+
#pragma compile("sound.c")
|
|
268
|
+
|
|
269
|
+
#endif
|