From 88ee89d1c6d05c8e1cc91b139e3e1faab55e08b2 Mon Sep 17 00:00:00 2001 From: na_th_an Date: Fri, 31 Aug 2018 14:31:24 +0200 Subject: [PATCH] Finished espitene (bar testing), propagated changes to everything, tested, fixed, got dizzy --- .../dev/assets/behs.h | 8 +- .../dev/assets/levelset.h | 1 + .../dev/assets/precalcs.h | 9 + .../07_cheril_perils_classic/dev/autodefs.h | 24 +- .../07_cheril_perils_classic/dev/cart.nes | Bin 40976 -> 40976 bytes .../07_cheril_perils_classic/dev/config.h | 99 ++- examples/07_cheril_perils_classic/dev/crt0.s | 4 +- .../dev/definitions.h | 7 + .../dev/engine/cocos.h | 13 +- .../dev/engine/enemmods/enem_boioiong.h | 78 ++ .../dev/engine/enemmods/enem_catacrock.h | 37 + .../dev/engine/enemmods/enem_chac_chac.h | 15 +- .../dev/engine/enemmods/enem_compiled.h | 58 +- .../dev/engine/enemmods/enem_fanty.h | 163 ++--- .../dev/engine/enemmods/enem_homing_fanty.h | 210 +++--- .../dev/engine/enemmods/enem_linear.h | 30 +- .../dev/engine/enemmods/enem_monococo.h | 12 +- .../dev/engine/enemmods/enem_pezon.h | 6 +- .../dev/engine/enemmods/enem_punchy.h | 8 +- .../dev/engine/enemmods/enem_pursuers.h | 8 +- .../dev/engine/enemmods/enem_saw.h | 14 +- .../dev/engine/enemmods/enem_timed_fanty.h | 109 +++ .../dev/engine/enengine.h | 216 ++++-- .../dev/engine/general.h | 29 +- .../dev/engine/mapmods/map_renderer_complex.h | 27 +- .../dev/engine/player.h | 411 +++++++---- .../dev/engine/prototypes.h | 2 + examples/07_cheril_perils_classic/dev/game.c | 12 +- .../07_cheril_perils_classic/dev/labels.txt | 509 ++++++------- .../07_cheril_perils_classic/dev/mainloop.h | 169 ++--- .../dev/mainloop/asset_setup.h | 4 + .../dev/mainloop/flickscreen.h | 19 +- .../dev/mainloop/hotspots.h | 1 + .../dev/mainloop/relocate_player.h | 19 + .../dev/mainloop/timer.h | 2 + .../dev/mainloop/win_level_condition.h | 26 + .../dev/my/custom_center_detections.h | 6 + .../07_cheril_perils_classic/dev/my/effects.h | 5 + .../dev/my/extra_hotspots.h | 17 + .../dev/my/extra_modules.h | 6 + .../dev/my/extra_routines.h | 6 + .../dev/my/on_player_coco.h | 11 + .../dev/my/on_player_hit.h | 13 + .../dev/my/on_player_spike.h | 11 + .../dev/my/on_tile_got.h | 7 + .../dev/my/on_timer_tick.h | 5 + .../07_cheril_perils_classic/dev/neslib.h | 5 +- .../07_cheril_perils_classic/dev/neslib.s | 36 +- .../07_cheril_perils_classic/dev/ram/bss.h | 31 +- .../07_cheril_perils_classic/dev/ram/zp.h | 33 +- .../08_cheril_the_writer/dev/assets/behs.h | 8 +- .../dev/assets/custom_texts.h | 15 +- .../dev/assets/levelset.h | 1 + .../dev/assets/precalcs.h | 9 + examples/08_cheril_the_writer/dev/autodefs.h | 24 +- examples/08_cheril_the_writer/dev/cart-sp.nes | Bin 65552 -> 65552 bytes examples/08_cheril_the_writer/dev/cart.nes | Bin 65552 -> 65552 bytes examples/08_cheril_the_writer/dev/config.h | 95 ++- examples/08_cheril_the_writer/dev/crt0.s | 4 +- .../08_cheril_the_writer/dev/definitions.h | 7 + .../08_cheril_the_writer/dev/engine/cocos.h | 13 +- .../dev/engine/enemmods/enem_boioiong.h | 78 ++ .../dev/engine/enemmods/enem_catacrock.h | 37 + .../dev/engine/enemmods/enem_chac_chac.h | 15 +- .../dev/engine/enemmods/enem_compiled.h | 58 +- .../dev/engine/enemmods/enem_fanty.h | 163 ++--- .../dev/engine/enemmods/enem_homing_fanty.h | 210 +++--- .../dev/engine/enemmods/enem_linear.h | 30 +- .../dev/engine/enemmods/enem_monococo.h | 12 +- .../dev/engine/enemmods/enem_pezon.h | 6 +- .../dev/engine/enemmods/enem_punchy.h | 8 +- .../dev/engine/enemmods/enem_pursuers.h | 8 +- .../dev/engine/enemmods/enem_saw.h | 14 +- .../dev/engine/enemmods/enem_timed_fanty.h | 109 +++ .../dev/engine/enengine.h | 216 ++++-- .../08_cheril_the_writer/dev/engine/general.h | 29 +- .../dev/engine/mapmods/map_renderer_complex.h | 27 +- .../08_cheril_the_writer/dev/engine/player.h | 411 +++++++---- .../dev/engine/prototypes.h | 2 + examples/08_cheril_the_writer/dev/game.c | 11 +- examples/08_cheril_the_writer/dev/labels.txt | 612 ++++++++-------- examples/08_cheril_the_writer/dev/mainloop.h | 169 ++--- .../dev/mainloop/asset_setup.h | 4 + .../dev/mainloop/flickscreen.h | 19 +- .../dev/mainloop/hotspots.h | 1 + .../dev/mainloop/relocate_player.h | 19 + .../08_cheril_the_writer/dev/mainloop/timer.h | 2 + .../dev/mainloop/win_level_condition.h | 26 + .../dev/my/custom_center_detections.h | 6 + .../08_cheril_the_writer/dev/my/effects.h | 5 + .../dev/my/extra_hotspots.h | 17 + .../dev/my/extra_modules.h | 6 + .../dev/my/extra_routines.h | 6 + .../dev/my/on_player_coco.h | 11 + .../dev/my/on_player_hit.h | 13 + .../dev/my/on_player_spike.h | 11 + .../08_cheril_the_writer/dev/my/on_tile_got.h | 7 + .../dev/my/on_timer_tick.h | 5 + examples/08_cheril_the_writer/dev/neslib.h | 5 +- examples/08_cheril_the_writer/dev/neslib.s | 36 +- examples/08_cheril_the_writer/dev/ram/bss.h | 31 +- examples/08_cheril_the_writer/dev/ram/zp.h | 33 +- .../dev/assets/behs.h" | 8 +- .../dev/assets/levelset.h" | 1 + .../dev/assets/precalcs.h" | 9 + .../dev/autodefs.h" | 24 +- .../09_cad\303\240veri\303\266n/dev/cart.nes" | Bin 40976 -> 40976 bytes .../09_cad\303\240veri\303\266n/dev/config.h" | 99 ++- .../09_cad\303\240veri\303\266n/dev/crt0.s" | 4 +- .../dev/definitions.h" | 7 + .../dev/engine/cocos.h" | 13 +- .../dev/engine/enemmods/enem_boioiong.h" | 78 ++ .../dev/engine/enemmods/enem_catacrock.h" | 37 + .../dev/engine/enemmods/enem_chac_chac.h" | 15 +- .../dev/engine/enemmods/enem_compiled.h" | 58 +- .../dev/engine/enemmods/enem_fanty.h" | 163 ++--- .../dev/engine/enemmods/enem_homing_fanty.h" | 210 +++--- .../dev/engine/enemmods/enem_linear.h" | 30 +- .../dev/engine/enemmods/enem_monococo.h" | 12 +- .../dev/engine/enemmods/enem_pezon.h" | 6 +- .../dev/engine/enemmods/enem_punchy.h" | 8 +- .../dev/engine/enemmods/enem_pursuers.h" | 8 +- .../dev/engine/enemmods/enem_saw.h" | 14 +- .../dev/engine/enemmods/enem_timed_fanty.h" | 109 +++ .../dev/engine/enengine.h" | 216 ++++-- .../dev/engine/general.h" | 29 +- .../engine/mapmods/map_renderer_complex.h" | 27 +- .../dev/engine/player.h" | 411 +++++++---- .../dev/engine/prototypes.h" | 2 + .../09_cad\303\240veri\303\266n/dev/game.c" | 11 +- .../dev/labels.txt" | 434 +++++------ .../dev/mainloop.h" | 169 ++--- .../dev/mainloop/asset_setup.h" | 4 + .../dev/mainloop/flickscreen.h" | 19 +- .../dev/mainloop/hotspots.h" | 3 +- .../dev/mainloop/relocate_player.h" | 19 + .../dev/mainloop/timer.h" | 2 + .../dev/mainloop/win_level_condition.h" | 26 + .../dev/my/custom_center_detections.h" | 6 + .../dev/my/effects.h" | 5 + .../dev/my/extra_hotspots.h" | 17 + .../dev/my/extra_modules.h" | 6 + .../dev/my/extra_routines.h" | 6 + .../dev/my/on_player_coco.h" | 11 + .../dev/my/on_player_hit.h" | 13 + .../dev/my/on_player_spike.h" | 11 + .../dev/my/on_tile_got.h" | 7 + .../dev/my/on_timer_tick.h" | 5 + .../09_cad\303\240veri\303\266n/dev/neslib.h" | 5 +- .../09_cad\303\240veri\303\266n/dev/neslib.s" | 36 +- .../dev/ram/bss.h" | 31 +- .../09_cad\303\240veri\303\266n/dev/ram/zp.h" | 33 +- examples/10_che_man/dev/autodefs.h | 7 +- examples/10_che_man/dev/cart.nes | Bin 40976 -> 40976 bytes examples/10_che_man/dev/config.h | 11 +- .../dev/engine/enemmods/enem_punchy.h | 8 +- examples/10_che_man/dev/engine/enengine.h | 7 +- .../dev/engine/mapmods/map_renderer_complex.h | 2 + examples/10_che_man/dev/engine/player.h | 60 +- examples/10_che_man/dev/labels.txt | 422 +++++------ examples/10_che_man/dev/mainloop.h | 44 +- .../dev/my/custom_center_detections.h | 6 + examples/10_che_man/dev/ram/bss.h | 2 + examples/10_che_man/dev/ram/zp.h | 3 +- "examples/11_boot\303\250e/dev/assets/behs.h" | 8 +- .../11_boot\303\250e/dev/assets/levelset.h" | 1 + .../11_boot\303\250e/dev/assets/precalcs.h" | 9 + "examples/11_boot\303\250e/dev/autodefs.h" | 24 +- "examples/11_boot\303\250e/dev/cart-omv.nes" | Bin 40976 -> 40976 bytes "examples/11_boot\303\250e/dev/cart.nes" | Bin 40976 -> 40976 bytes "examples/11_boot\303\250e/dev/config.h" | 109 ++- "examples/11_boot\303\250e/dev/crt0.s" | 4 +- "examples/11_boot\303\250e/dev/definitions.h" | 7 + .../11_boot\303\250e/dev/engine/cocos.h" | 13 +- .../dev/engine/enemmods/enem_boioiong.h" | 78 ++ .../dev/engine/enemmods/enem_catacrock.h" | 37 + .../dev/engine/enemmods/enem_chac_chac.h" | 15 +- .../dev/engine/enemmods/enem_compiled.h" | 58 +- .../dev/engine/enemmods/enem_fanty.h" | 163 ++--- .../dev/engine/enemmods/enem_homing_fanty.h" | 210 +++--- .../dev/engine/enemmods/enem_linear.h" | 30 +- .../dev/engine/enemmods/enem_monococo.h" | 12 +- .../dev/engine/enemmods/enem_pezon.h" | 6 +- .../dev/engine/enemmods/enem_punchy.h" | 8 +- .../dev/engine/enemmods/enem_pursuers.h" | 8 +- .../dev/engine/enemmods/enem_saw.h" | 14 +- .../dev/engine/enemmods/enem_timed_fanty.h" | 109 +++ .../11_boot\303\250e/dev/engine/enengine.h" | 216 ++++-- .../11_boot\303\250e/dev/engine/general.h" | 29 +- .../engine/mapmods/map_renderer_complex.h" | 27 +- .../11_boot\303\250e/dev/engine/player.h" | 411 +++++++---- .../11_boot\303\250e/dev/engine/prototypes.h" | 2 + "examples/11_boot\303\250e/dev/game.c" | 11 +- "examples/11_boot\303\250e/dev/labels.txt" | 491 ++++++------- "examples/11_boot\303\250e/dev/mainloop.h" | 169 ++--- .../dev/mainloop/asset_setup.h" | 4 + .../dev/mainloop/flickscreen.h" | 19 +- .../11_boot\303\250e/dev/mainloop/hotspots.h" | 1 + .../dev/mainloop/relocate_player.h" | 19 + .../11_boot\303\250e/dev/mainloop/timer.h" | 2 + .../dev/mainloop/win_level_condition.h" | 26 + .../dev/my/custom_center_detections.h" | 6 + "examples/11_boot\303\250e/dev/my/effects.h" | 5 + .../11_boot\303\250e/dev/my/extra_hotspots.h" | 17 + .../11_boot\303\250e/dev/my/extra_modules.h" | 6 + .../11_boot\303\250e/dev/my/extra_routines.h" | 6 + .../11_boot\303\250e/dev/my/on_player_coco.h" | 11 + .../11_boot\303\250e/dev/my/on_player_hit.h" | 13 + .../dev/my/on_player_spike.h" | 11 + .../11_boot\303\250e/dev/my/on_tile_got.h" | 7 + .../11_boot\303\250e/dev/my/on_timer_tick.h" | 5 + .../dev/my/player_frame_selector.h" | 2 +- "examples/11_boot\303\250e/dev/neslib.h" | 5 +- "examples/11_boot\303\250e/dev/neslib.s" | 36 +- "examples/11_boot\303\250e/dev/ram/bss.h" | 31 +- "examples/11_boot\303\250e/dev/ram/zp.h" | 33 +- examples/bootee.nes | Bin 40976 -> 40976 bytes examples/cadaverion.nes | Bin 40976 -> 40976 bytes examples/che-man.nes | Bin 40976 -> 40976 bytes examples/cheril_perils_classic.nes | Bin 40976 -> 40976 bytes examples/cheril_the_writer.nes | Bin 65552 -> 65552 bytes mk1_nes.sublime-workspace | 459 ++++++++++-- src/dev/autodefs.h | 5 + src/dev/config.h | 6 +- src/dev/engine/enengine.h | 2 +- src/dev/engine/player.h | 22 +- src/dev/mainloop.h | 30 +- src/dev/ram/bss.h | 2 + src/dev/ram/zp.h | 3 +- src/ogt/sounds.s | 15 + testers/00_tester_sideview/dev/cart.nes | Bin 40976 -> 40976 bytes testers/00_tester_sideview/dev/config.h | 6 +- .../00_tester_sideview/dev/engine/enengine.h | 7 +- .../00_tester_sideview/dev/engine/player.h | 22 +- testers/00_tester_sideview/dev/labels.txt | 482 ++++++------- testers/00_tester_sideview/dev/mainloop.h | 30 +- testers/00_tester_sideview/dev/ram/bss.h | 2 + testers/00_tester_sideview/dev/ram/zp.h | 3 +- testers/01_tester_top_down/dev/cart.nes | Bin 40976 -> 40976 bytes testers/01_tester_top_down/dev/config.h | 6 +- .../01_tester_top_down/dev/engine/enengine.h | 7 +- .../01_tester_top_down/dev/engine/player.h | 22 +- testers/01_tester_top_down/dev/labels.txt | 438 ++++++------ testers/01_tester_top_down/dev/mainloop.h | 30 +- .../01_tester_top_down/dev/my/game_frame.h | 2 +- .../dev/my/player_frame_selector.h | 2 + testers/01_tester_top_down/dev/ram/bss.h | 2 + testers/01_tester_top_down/dev/ram/zp.h | 3 +- testers/02_tester_punchy/dev/cart.nes | Bin 40976 -> 40976 bytes testers/02_tester_punchy/dev/config.h | 4 + .../02_tester_punchy/dev/engine/enengine.h | 7 +- testers/02_tester_punchy/dev/engine/player.h | 22 +- testers/02_tester_punchy/dev/labels.txt | 409 ++++++----- testers/02_tester_punchy/dev/mainloop.h | 30 +- testers/02_tester_punchy/dev/ram/bss.h | 2 + testers/02_tester_punchy/dev/ram/zp.h | 3 +- testers/03_tester_interactives/dev/cart.nes | Bin 40976 -> 40976 bytes testers/03_tester_interactives/dev/config.h | 6 +- .../dev/engine/enengine.h | 7 +- .../dev/engine/general.h | 2 +- .../dev/engine/player.h | 22 +- testers/03_tester_interactives/dev/labels.txt | 350 ++++----- testers/03_tester_interactives/dev/mainloop.h | 30 +- .../dev/mainloop/interactives.h | 1 - .../dev/mainloop/scripting.h | 2 +- testers/03_tester_interactives/dev/ram/bss.h | 2 + testers/03_tester_interactives/dev/ram/zp.h | 3 +- .../dev/assets/behs.h.bak | 36 - .../dev/assets/levelset.h.bak | 104 --- .../dev/assets/precalcs.h.bak | 42 -- testers/04_tester_warp_to_level/dev/cart.nes | Bin 40976 -> 40976 bytes testers/04_tester_warp_to_level/dev/config.h | 4 + .../04_tester_warp_to_level/dev/config.h.bak | 672 ------------------ .../dev/engine/enengine.h | 7 +- .../dev/engine/player.h | 22 +- .../04_tester_warp_to_level/dev/game.c.bak | 149 ---- .../04_tester_warp_to_level/dev/labels.txt | 361 +++++----- .../04_tester_warp_to_level/dev/mainloop.h | 30 +- testers/04_tester_warp_to_level/dev/ram/bss.h | 2 + testers/04_tester_warp_to_level/dev/ram/zp.h | 3 +- .../05_tester_tile_get/dev/assets/levelset.h | 4 +- testers/05_tester_tile_get/dev/cart.nes | Bin 65552 -> 65552 bytes testers/05_tester_tile_get/dev/config.h | 6 +- .../05_tester_tile_get/dev/engine/player.h | 56 +- testers/05_tester_tile_get/dev/game.c | 6 +- testers/05_tester_tile_get/dev/labels.txt | 340 ++++----- testers/05_tester_tile_get/dev/mainloop.h | 29 +- testers/05_tester_tile_get/dev/mainloop.h.bak | 475 ------------- testers/05_tester_tile_get/dev/music.s | 211 ++++-- testers/05_tester_tile_get/dev/my/pres.h | 4 +- testers/05_tester_tile_get/dev/ram/bss.h | 5 + testers/05_tester_tile_get/dev/ram/zp.h | 5 +- testers/05_tester_tile_get/map/level50.BAK | Bin 39978 -> 0 bytes testers/05_tester_tile_get/map/level51.BAK | Bin 40220 -> 0 bytes testers/05_tester_tile_get/ogt/music.s | 211 ++++-- testers/05_tester_tile_get/ogt/music.txt | 312 ++++++++ .../show/espitene--20180831a.nes | Bin 0 -> 65552 bytes testers/sgt_helmet_training_day_R1.0.nes | Bin 40976 -> 40976 bytes testers/tester_interactives.nes | Bin 40976 -> 40976 bytes testers/tester_punchy.nes | Bin 40976 -> 40976 bytes testers/tester_sideview.nes | Bin 40976 -> 40976 bytes testers/tester_warp_to_level.nes | Bin 40976 -> 40976 bytes wip/diario.md | 68 ++ 303 files changed, 9843 insertions(+), 6639 deletions(-) create mode 100644 examples/07_cheril_perils_classic/dev/engine/enemmods/enem_boioiong.h create mode 100644 examples/07_cheril_perils_classic/dev/engine/enemmods/enem_catacrock.h create mode 100644 examples/07_cheril_perils_classic/dev/engine/enemmods/enem_timed_fanty.h create mode 100644 examples/07_cheril_perils_classic/dev/mainloop/relocate_player.h create mode 100644 examples/07_cheril_perils_classic/dev/mainloop/win_level_condition.h create mode 100644 examples/07_cheril_perils_classic/dev/my/custom_center_detections.h create mode 100644 examples/07_cheril_perils_classic/dev/my/effects.h create mode 100644 examples/07_cheril_perils_classic/dev/my/extra_hotspots.h create mode 100644 examples/07_cheril_perils_classic/dev/my/extra_modules.h create mode 100644 examples/07_cheril_perils_classic/dev/my/extra_routines.h create mode 100644 examples/07_cheril_perils_classic/dev/my/on_player_coco.h create mode 100644 examples/07_cheril_perils_classic/dev/my/on_player_hit.h create mode 100644 examples/07_cheril_perils_classic/dev/my/on_player_spike.h create mode 100644 examples/07_cheril_perils_classic/dev/my/on_tile_got.h create mode 100644 examples/07_cheril_perils_classic/dev/my/on_timer_tick.h create mode 100644 examples/08_cheril_the_writer/dev/engine/enemmods/enem_boioiong.h create mode 100644 examples/08_cheril_the_writer/dev/engine/enemmods/enem_catacrock.h create mode 100644 examples/08_cheril_the_writer/dev/engine/enemmods/enem_timed_fanty.h create mode 100644 examples/08_cheril_the_writer/dev/mainloop/relocate_player.h create mode 100644 examples/08_cheril_the_writer/dev/mainloop/win_level_condition.h create mode 100644 examples/08_cheril_the_writer/dev/my/custom_center_detections.h create mode 100644 examples/08_cheril_the_writer/dev/my/effects.h create mode 100644 examples/08_cheril_the_writer/dev/my/extra_hotspots.h create mode 100644 examples/08_cheril_the_writer/dev/my/extra_modules.h create mode 100644 examples/08_cheril_the_writer/dev/my/extra_routines.h create mode 100644 examples/08_cheril_the_writer/dev/my/on_player_coco.h create mode 100644 examples/08_cheril_the_writer/dev/my/on_player_hit.h create mode 100644 examples/08_cheril_the_writer/dev/my/on_player_spike.h create mode 100644 examples/08_cheril_the_writer/dev/my/on_tile_got.h create mode 100644 examples/08_cheril_the_writer/dev/my/on_timer_tick.h create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_boioiong.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_catacrock.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_timed_fanty.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/mainloop/relocate_player.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/mainloop/win_level_condition.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/custom_center_detections.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/effects.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/extra_hotspots.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/extra_modules.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/extra_routines.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/on_player_coco.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/on_player_hit.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/on_player_spike.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/on_tile_got.h" create mode 100644 "examples/09_cad\303\240veri\303\266n/dev/my/on_timer_tick.h" create mode 100644 examples/10_che_man/dev/my/custom_center_detections.h create mode 100644 "examples/11_boot\303\250e/dev/engine/enemmods/enem_boioiong.h" create mode 100644 "examples/11_boot\303\250e/dev/engine/enemmods/enem_catacrock.h" create mode 100644 "examples/11_boot\303\250e/dev/engine/enemmods/enem_timed_fanty.h" create mode 100644 "examples/11_boot\303\250e/dev/mainloop/relocate_player.h" create mode 100644 "examples/11_boot\303\250e/dev/mainloop/win_level_condition.h" create mode 100644 "examples/11_boot\303\250e/dev/my/custom_center_detections.h" create mode 100644 "examples/11_boot\303\250e/dev/my/effects.h" create mode 100644 "examples/11_boot\303\250e/dev/my/extra_hotspots.h" create mode 100644 "examples/11_boot\303\250e/dev/my/extra_modules.h" create mode 100644 "examples/11_boot\303\250e/dev/my/extra_routines.h" create mode 100644 "examples/11_boot\303\250e/dev/my/on_player_coco.h" create mode 100644 "examples/11_boot\303\250e/dev/my/on_player_hit.h" create mode 100644 "examples/11_boot\303\250e/dev/my/on_player_spike.h" create mode 100644 "examples/11_boot\303\250e/dev/my/on_tile_got.h" create mode 100644 "examples/11_boot\303\250e/dev/my/on_timer_tick.h" delete mode 100644 testers/04_tester_warp_to_level/dev/assets/behs.h.bak delete mode 100644 testers/04_tester_warp_to_level/dev/assets/levelset.h.bak delete mode 100644 testers/04_tester_warp_to_level/dev/assets/precalcs.h.bak delete mode 100644 testers/04_tester_warp_to_level/dev/config.h.bak delete mode 100644 testers/04_tester_warp_to_level/dev/game.c.bak delete mode 100644 testers/05_tester_tile_get/dev/mainloop.h.bak delete mode 100644 testers/05_tester_tile_get/map/level50.BAK delete mode 100644 testers/05_tester_tile_get/map/level51.BAK create mode 100644 testers/05_tester_tile_get/show/espitene--20180831a.nes diff --git a/examples/07_cheril_perils_classic/dev/assets/behs.h b/examples/07_cheril_perils_classic/dev/assets/behs.h index 1f017ce..b350ab3 100644 --- a/examples/07_cheril_perils_classic/dev/assets/behs.h +++ b/examples/07_cheril_perils_classic/dev/assets/behs.h @@ -5,7 +5,6 @@ // Add these: // + 1 kills (useless if + 8 obstacle) -// + 2 quicksands ( " , needs ENABLE_QUICKSANDS) // + 4 platform (side view) // + 8 obstacle (nullifies + 1 & + 2, see bellow) // +16 breakable @@ -13,11 +12,14 @@ // +64 slippery // Special values (= nonsensical combinations): +// 2 quicksands ( " , needs ENABLE_QUICKSANDS) // 9 not safe block (safe spot not saved when jumping off this) // 10 lock // 11 pushable -// 32 ladder (== 32, no obstacle!) -// 64 float (== 64, no obstacle!) +// 32 ladder (== 32, no obstacle!) +// 34 tile_get (== 34, no obstacle!) +// 64 float (== 64, no obstacle!) +// 74 trampol. (== 74, obstacle!) const unsigned char behs0 [] = { 0, 0, 0, 0, 8, 8, 8, 8, 0, 8, 0, 0, 1, 8, 4,10, diff --git a/examples/07_cheril_perils_classic/dev/assets/levelset.h b/examples/07_cheril_perils_classic/dev/assets/levelset.h index 7aa9828..850aa08 100644 --- a/examples/07_cheril_perils_classic/dev/assets/levelset.h +++ b/examples/07_cheril_perils_classic/dev/assets/levelset.h @@ -5,6 +5,7 @@ const unsigned char l_scr_ini [] = { 20, 20, 8 }; const unsigned char l_ini_x [] = { 2, 2, 2 }; const unsigned char l_ini_y [] = { 7, 10, 3 }; const unsigned char l_map_w [] = { 4, 4, 8 }; +const unsigned char l_map_h [] = { 6, 6, 3 }; // Ending screen & position, per level (comment if N/A) diff --git a/examples/07_cheril_perils_classic/dev/assets/precalcs.h b/examples/07_cheril_perils_classic/dev/assets/precalcs.h index 7fd5156..6efc4c3 100644 --- a/examples/07_cheril_perils_classic/dev/assets/precalcs.h +++ b/examples/07_cheril_perils_classic/dev/assets/precalcs.h @@ -40,3 +40,12 @@ CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1, CHAC_CHAC_BASE_TILE + 3, CHAC_CHAC_BASE_TILE + 5, CHAC_CHAC_BASE_TILE + 3, CHAC_CHAC_BASE_TILE + 1 }; #endif + +const unsigned char bits [] = { + 1, 2, 4, 8, 16, 32, 64, 128 +}; + +#ifdef ENEMS_MAY_DIE + const unsigned char jitter [] = { 0,1,1,0,0,1,0,1,1,0,0,0,1,0,1,1 }; +#endif + diff --git a/examples/07_cheril_perils_classic/dev/autodefs.h b/examples/07_cheril_perils_classic/dev/autodefs.h index f13855d..a1a70d4 100644 --- a/examples/07_cheril_perils_classic/dev/autodefs.h +++ b/examples/07_cheril_perils_classic/dev/autodefs.h @@ -3,8 +3,7 @@ // Inner workings. Don't touch. -#define MONOCOCO_COUNTER _en_my -#define MONOCOCO_STATE _en_mx +#define CATACROCK_WAIT _en_mx #if defined (ENABLE_MONOCOCOS) || (defined (ENABLE_COMPILED_ENEMS) && defined (COMPILED_ENEMS_SHOOT)) #define ENABLE_COCOS @@ -25,11 +24,15 @@ #define PLAYER_CAN_FLOAT #endif -#if defined (ENABLE_LADDERS) || defined (ENABLE_PROPELLERS) || defined (ENABLE_SPRINGS) +#if defined (ENABLE_LADDERS) || defined (ENABLE_PROPELLERS) || defined (ENABLE_SPRINGS) /*|| defined (ENABLE_TRAMPOLINES)*/ #define NEEDS_INITIAL_DETECTION #endif -#if defined (PLAYER_STEPS_ON_ENEMS) || defined (PLAYER_CAN_FIRE) || defined (PLAYER_KICKS) || defined (PLAYER_PUNCHES) || defined (ENEMIES_SUFFER_ON_PLAYER_COLLISION) || defined (FANTY_KILLED_BY_TILE) +#if defined (ENABLE_TILE_GET) || defined (CUSTOM_CENTER_DETECTIONS) +#define NEEDS_CENTER_DETECTION +#endif + +#if defined (PLAYER_STEPS_ON_ENEMS) || defined (PLAYER_CAN_FIRE) || defined (PLAYER_KICKS) || defined (PLAYER_PUNCHES) || defined (ENEMIES_SUFFER_ON_PLAYER_COLLISION) || defined (FANTY_KILLED_BY_TILE) || defined (PLAYER_SPINS) #define ENEMS_MAY_DIE #endif @@ -75,6 +78,10 @@ #define MAP_RENDERER_COMPLEX #endif +#if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + #define MAP_RENDERER_COMPLEX +#endif + #if defined (ENABLE_BREAKABLE) && BREAKABLE_LIFE == 1 #define BREAKABLES_SOFT #endif @@ -95,3 +102,12 @@ #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) #define ENABLE_SHAKER #endif + +#if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_TIMED_FANTY) || defined (ENABLE_BOIOIONG) || defined (ENABLE_CATACROCKS) + #define ENEMS_NEED_FP +#endif + +#if defined (PLAYER_TOP_DOWN) && defined (NO_HORIZONTAL_EVIL_TILE) + #undef NO_HORIZONTAL_EVIL_TILE +#endif + diff --git a/examples/07_cheril_perils_classic/dev/cart.nes b/examples/07_cheril_perils_classic/dev/cart.nes index 721803127017f3da40ba22f53a589b74884f977f..8dcb317ecad862ef8f2b30bd85252d9149d3206a 100644 GIT binary patch delta 13128 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 delta 12656 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 PLAYER_VY_FALLING_MIN #define PLAYER_SAFE_LANDING // Step over vertical inverts direction //#define PLAYER_STEPS_MIN_KILLABLE 0xff // Only kill enemies with id >= PLAYER_STEPS_MIN_KILLABLE // 0xff = Nobody +//#define PLAYER_SPINS // Spins on DOWN and JUMP and kills baddies // ============================================================================ // III. Screen configuration @@ -524,6 +572,7 @@ #define PLAYER_G 8 // Gravity #define PLAYER_VY_JUMP_INITIAL 64 +#define PLAYER_VY_JUMP_INITIAL_TRAMPOLINE 128 #define PLAYER_VY_JUMP_MAX 160 // Max. velocity when jumping #define PLAYER_AY_JUMP 12 // Jumpin acceleration @@ -546,6 +595,8 @@ #define PLAYER_VY_MK2_JUMP_INITIAL 160 #define PLAYER_VY_MK2_JUMP_RELEASE 80 #define PLAYER_VY_MK2_JUMP_A_STEPS 16 +#define PLAYER_VY_MK2_JUMP_INITIAL_TRAMPOLINE 296 +#define PLAYER_VY_MK2_TRAMPOLINE_A_STEPS 32 // For trampolines // IV.2. Horizontal (side view) or general (top view) movement. @@ -588,6 +639,9 @@ #define CELL_WALK_INIT 1 #define CELL_WALK_CYCLE 1 #define CELL_AIRBORNE 5 + + #define CELL_SPIN_CYCLE 5 + #define CELL_ASCENDING 5 #define CELL_DESCENDING 6 @@ -598,6 +652,8 @@ #define CELL_PUNCHING 8 #define CELL_KICKING 9 + #define CELL_HIT 9 + #define CELL_CLIMB_CYCLE 20 #define CELL_CLIMB_HALF 29 #endif @@ -612,6 +668,7 @@ #define SFX_TILE 1 #define SFX_OBJECT 2 #define SFX_USE 3 +#define SFX_TRAMPOLINE 3 #define SFX_PHIT 4 #define SFX_DUMMY1 5 #define SFX_ENHIT 6 @@ -626,3 +683,5 @@ #define SFX_STEPON 15 #define SFX_FLOAT 16 #define SFX_BREAKB 17 +#define SFX_RING 18 +#define SFX_FANFARE 19 diff --git a/examples/07_cheril_perils_classic/dev/crt0.s b/examples/07_cheril_perils_classic/dev/crt0.s index 3151b83..dce496d 100644 --- a/examples/07_cheril_perils_classic/dev/crt0.s +++ b/examples/07_cheril_perils_classic/dev/crt0.s @@ -20,7 +20,7 @@ FT_SFX_STREAMS =4 ;number of sound effects played at once, can be 4 or less (f .define FT_DPCM_ENABLE 0 ;zero to exclude all the DMC code .define FT_SFX_ENABLE 1 ;zero to exclude all the sound effects code -.define SPEED_FIX 1 ;zero if you want to handle PAL/NTSC speed difference by yourself +.define SPEED_FIX 0 ;zero if you want to handle PAL/NTSC speed difference by yourself .export _exit,__STARTUP__:absolute=1 .import push0,popa,popax,_main,zerobss,copydata @@ -71,6 +71,8 @@ RAND_SEED =$1a ;word PALUPDATE =$1c TEMP =$1d +SCROLL_X1 =$1e ;Added by mojon twins +PPU_CTRL_VAR1=$1f ;Added by mojon twins PAD_BUF =TEMP+1 diff --git a/examples/07_cheril_perils_classic/dev/definitions.h b/examples/07_cheril_perils_classic/dev/definitions.h index fbf256b..9d02020 100644 --- a/examples/07_cheril_perils_classic/dev/definitions.h +++ b/examples/07_cheril_perils_classic/dev/definitions.h @@ -50,3 +50,10 @@ #define EN_STATE_DEAD 1 #define EN_STATE_SPAWNING 2 + +// Vertical engine type for side_view + +#define ENGINE_TYPE_JUMP 0 +#define ENGINE_TYPE_JET_PAC 1 +#define ENGINE_TYPE_SWIM 2 +#define ENGINE_TYPE_AUTO_JUMP 3 diff --git a/examples/07_cheril_perils_classic/dev/engine/cocos.h b/examples/07_cheril_perils_classic/dev/engine/cocos.h index 5547eed..f6fbfd8 100644 --- a/examples/07_cheril_perils_classic/dev/engine/cocos.h +++ b/examples/07_cheril_perils_classic/dev/engine/cocos.h @@ -17,7 +17,12 @@ void cocos_init (void) { void cocos_shoot_aimed (void) { rdct = distance (); - if (rdct > COCO_FAIR_D && coco_slots_i) { + #ifdef COCO_FAIR_D + if (rdct > COCO_FAIR_D && coco_slots_i) + #else + if (coco_slots_i) + #endif + { -- coco_slots_i; coco_it = coco_slots [coco_slots_i]; coco_x [coco_it] = rdx << 6; @@ -86,13 +91,15 @@ void cocos_do (void) { #endif // Collide w/player - if (pstate == EST_NORMAL && + if (pflickering == 0 && rdx + 7 >= prx && rdx <= prx + 7 && rdy + 7 + PLAYER_COLLISION_VSTRETCH_FG >= pry && rdy <= pry + 12 ) { - pkill = 1; + en_sg_2 = 1; + #include "my/on_player_coco.h" + pkill = !!en_sg_2; cocos_destroy (); } } diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_boioiong.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_boioiong.h new file mode 100644 index 0000000..dc438f6 --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_boioiong.h @@ -0,0 +1,78 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Boioiongs bounce around the screen until a timer exhausts. + +if (_en_ct) { + _en_ct --; + + // Vertical movement & collision + // ----------------------------- + + _enf_vy += BOIOIONG_G; if (_enf_vy > BOIOIONG_VY_MAX) _enf_vy = BOIOIONG_VY_MAX; + _enf_y += _enf_vy; + + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > (192 << FIXBITS)) _enf_y = (192 << FIXBITS); + + _en_y = _enf_y >> FIXBITS; _en_x = _enf_x >> FIXBITS; + + cx1 = _en_x >> 4; cx2 = (_en_x + 15) >> 4; rda = 0; + + if (_enf_vy > 0) { + cy1 = cy2 = (_en_y + 15) >> 4; + rda = 13; rds = -16; + } else if (_enf_vy < 0) { + cy1 = cy2 = _en_y >> 4; + rda = 9; rds = 16; + } + + if (rda) { + cm_two_points (); + if ((at1 & rda) || (at2 & rda)) { + _en_y = rds + (cy1 << 4); + _enf_vy = -_enf_vy; + } + } + + _enf_y = _en_y << FIXBITS; + + // Horizontal movement & collision + // ------------------------------- + + _enf_x += _enf_vx; + _en_x = _enf_x >> FIXBITS; + + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > (240 << FIXBITS)) _enf_x = (240 << FIXBITS); + + cy1 = _en_y >> 4; cy2 = (_en_y + 15) >> 4; rda = 0; + + if (_enf_vx) { + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 15) >> 4; rds = -16; + } else { + cx1 = cx2 = _en_x >> 4; rds = 16; + } + + cm_two_points (); + if ((at1 & 9) || (at2 & 9)) { + _en_x = rds + (cx1 << 4); + _enf_vx = -_enf_vx; + } + } + + _enf_x = _en_x << FIXBITS; + + // Sprite + + if (_en_ct > 50 || half_life) { + en_spr = _en_s + ((frame_counter >> 2) & 1); + } +} +#ifdef BOIOIONG_AUTO_RESPAWN +else { + _en_x = _en_x1; _en_y = _en_y1; + enems_boioiong_init (); +} +#endif diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_catacrock.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_catacrock.h new file mode 100644 index 0000000..701d9fd --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_catacrock.h @@ -0,0 +1,37 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Appear, fall, and catacrock. + +switch (_en_state) { + case 0: + // Idling. + if (_en_ct) _en_ct --; else { + _en_state = 1; + _enf_y = _en_y << FIXBITS; _enf_vy = 0; + } + break; + + case 1: + // Falling + _enf_vy += CATACROCK_G; if (_enf_vy > CATACROCK_MAX_V) _enf_vy = CATACROCK_MAX_V; + _enf_y += _enf_vy; _en_y = _enf_y >> FIXBITS; + + if (_en_y > _en_y2) { + _en_state = 2; + _en_ct = CATACROCK_CROCK_FRAMES; + _en_y = _en_y2; + } + break; + + case 2: + // Catacrock + if (_en_ct) _en_ct --; else { + _en_state = 0; + _en_ct = CATACROCK_WAIT; + _en_y = _en_y1; + } + +} + +en_spr = _en_state + CATACROCK_BASE_SPRID; diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_chac_chac.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_chac_chac.h index 769d8f8..a8f8cb2 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_chac_chac.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_chac_chac.h @@ -2,14 +2,15 @@ // Copyleft Mojon Twins 2013, 2015, 2017, 2018 // CHAC CHAC! +// DEPRECATED -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Wait for idle. if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1); _en_mx = CHAC_CHAC_IDLE_2; - en_alive [gpit] = 1; + _en_state = 1; } break; case 1: @@ -17,7 +18,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 3); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 2; + _en_state = 2; } break; case 2: @@ -25,7 +26,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 5, CHAC_CHAC_BASE_TILE + 4, CHAC_CHAC_BASE_TILE + 5); _en_mx = CHAC_CHAC_IDLE_4; - en_alive [gpit] = 3; + _en_state = 3; sfx_play (SFX_STEPON, 1); shaker_ct = 8; } @@ -35,7 +36,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 3); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 4; + _en_state = 4; } break; case 4: @@ -43,7 +44,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 5; + _en_state = 5; } break; case 5: @@ -51,7 +52,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6); _en_mx = _en_my; - en_alive [gpit] = 0; + _en_state = 0; } break; } diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_compiled.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_compiled.h index 050e80c..39cab39 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_compiled.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_compiled.h @@ -6,15 +6,9 @@ // needs endx [8], endy [8] from precalcs.h if (_en_ct) { - // Do - - switch (en_alive [gpit]) { + switch (_en_state) { case 0: // Idling - - // Idle animation, cells 2, 3. - en_spr = _en_s + _en_facing + 2 + - ((frame_counter >> 3) & 1); break; case 1: // Moving @@ -23,8 +17,6 @@ if (_en_ct) { rdx = _en_x; _en_x += _en_mx; rdy = _en_y; _en_y += _en_my; - // Moving animation, cells 0, 1. - en_spr = _en_s + _en_facing + en_fr; break; } @@ -35,42 +27,64 @@ if (_en_ct) { // the whole array and that a proper RETURN is issued! rda = *en_behptr [gpit] ++; - en_alive [gpit] = 0; - + _en_state = 0; + rdc = (rda & 0x38) >> 3; rdt = rda & 0x07; switch (rda & 0xc0) { // Command case 0x00: - // IDLE - rdb = 1; while (rdt --) rdb += 25; - _en_ct = rdb; + // IDLE / EXTERN + if (rdt == 0) { + // EXTERN + do_extern_action (*en_behptr [gpit] ++); + } else { + // IDLE + rdb = 0; while (rdt --) rdb += 25; + _en_ct = rdb; + en_rawv [gpit] = _en_s + 2 + _en_facing; + } break; case 0x40: // ADVANCE - _en_mx = endx [rdc]; _en_my = endy [rdc]; + _en_mx = endx [rdc] << _en_x1; _en_my = endy [rdc] << _en_x1; - rda = (_en_mx < 0); enems_facing (); - if (_en_mx < 0) _en_facing = 4; else if (_en_mx > 0) _en_facing = 0; // If _en_mx == 0, no change! + en_rawv [gpit] = _en_s + _en_facing; - _en_ct = rdt << 4; en_alive [gpit] = 1; + _en_ct = (rdt << 4) >> _en_x1; _en_state = 1; break; case 0x80: - // FIRE - rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); + // FIRE & SPEED + rdb = rda & 0x3f; + if (rdb > 0x3b) { + // SPEED + _en_x1 =0x3f - rda; // 0 for 1, 1 for 2, 2 for 4, 3 for 8 + } else { + // FIRE + rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); + } + break; case 0xC0: // RETURN en_behptr [gpit] -= ((rda & 0x3f) + 1); + break; } - - en_spr = _en_s + _en_facing; } +en_spr = en_rawv [gpit]; +switch (_en_state) { + case 0: + en_spr += ((frame_counter >> 3) & 1); + break; + case 1: + en_spr += en_fr; + break; +} diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_fanty.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_fanty.h index b835c1e..2e15f02 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_fanty.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_fanty.h @@ -1,101 +1,101 @@ // NES MK1 v1.0 // Copyleft Mojon Twins 2013, 2015, 2017, 2018 -// Fanties - -#ifdef FANTY_KILLED_BY_TILE - #define FANTY_OBSTACLE(a) ((a)>1) -#else - #define FANTY_OBSTACLE(a) (a) -#endif - -// Modify v - -if (px < _enf_x) { - _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; -} else { - _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; -} - -if (py < _enf_y) { - _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; -} else { - _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; -} - -// Horizontal - -_enf_x += _enf_vx; -if (_enf_x < 0) _enf_x = 0; -if (_enf_x > 15360) _enf_x = 15360; -_en_x = _enf_x >> 6; - -#ifdef FANTY_COLLIDES - - if (_enf_vx) { - cy1 = (_en_y + 4) >> 4; - cy2 = (_en_y + 11) >> 4; + // Fanties + + // Modify v - if (_enf_vx > 0) { - cx1 = cx2 = (_en_x + 11) >> 4; - rda = ((cx2 - 1) << 4) + 4; - } else { - cx1 = cx2 = (_en_x + 4) >> 4; - rda = ((cx1 + 1) << 4) - 4; - } - cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vx = -_enf_vx; - _en_x = rda; - _enf_x = rda << 6; - } + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; } -#endif + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } -// Vertical - -_enf_y += _enf_vy; -if (_enf_y < 0) _enf_y = 0; -if (_enf_y > 11264) _enf_y = 11264; -_en_y = _enf_y >> 6; + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } + } -#ifdef FANTY_COLLIDES + #endif - if (_enf_vy) { - cx1 = (_en_x + 4) >> 4; - cx2 = (_en_x + 11) >> 4; + // Vertical - if (_enf_vy > 0) { - cy1 = cy2 = (_en_y + 11) >> 4; - rda = ((cy2 - 1) << 4) + 4; - } else { - cy1 = cy2 = (_en_y + 4) >> 4; - rda = ((cy1 + 1) << 4) - 4; + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } } + #endif + + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vy = -_enf_vy; - _en_y = rda; - _enf_y = rda << 6; + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); } - } + #endif +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; #endif -#ifdef FANTY_KILLED_BY_TILE - cx1 = (_en_x + 8) >> 4; - cy1 = (_en_y + 8) >> 4; - cm_two_points (); - if (at1 & 1) { - en_cttouched [gpit] = 8; - enems_kill (); - } -#endif - -en_fr = (_en_x >> 3) & 1; - #ifdef FANTY_WITH_FACING //_en_facing = ((_en_x < prx) ? 0 : 4); rda = (prx < _en_x); enems_facing (); @@ -103,3 +103,4 @@ en_fr = (_en_x >> 3) & 1; #else en_spr = _en_s + en_fr; #endif + diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_homing_fanty.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_homing_fanty.h index cba1185..b45aab0 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_homing_fanty.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_homing_fanty.h @@ -3,125 +3,125 @@ // Fanties that have a home -#ifdef FANTY_KILLED_BY_TILE - #define FANTY_OBSTACLE(a) ((a)>1) -#else - #define FANTY_OBSTACLE(a) (a) -#endif - -// Precalc distance -rdx = _en_x; rdy = _en_y; rdt = distance (); - -// Modify v - always upon state - -switch (en_alive [gpit]) { - case 0: - // Retreating - _enf_vx = ADD_SIGN2 (_en_x1, _en_x, FANTY_V_RETREAT); - _enf_vy = ADD_SIGN2 (_en_y1, _en_y, FANTY_V_RETREAT); - if (rdt < FANTY_DISTANCE) en_alive [gpit] = 1; - break; - case 1: - // Pursuing - if (px < _enf_x) { - _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; - } else { - _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; - } + // Precalc distance + rdx = _en_x; rdy = _en_y; rdt = distance (); + + // Modify v + + switch (_en_state) { + case 0: + // Retreating + _enf_vx = ADD_SIGN2 (_en_x1, _en_x, FANTY_V_RETREAT); + _enf_vy = ADD_SIGN2 (_en_y1, _en_y, FANTY_V_RETREAT); + if (rdt < FANTY_DISTANCE) _en_state = 1; + break; + case 1: + // Pursuing + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; + } + + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } + + if (rdt > FANTY_DISTANCE) { + // Adjust to pixel + _enf_x = _en_x << FIXBITS; + _enf_y = _en_y << FIXBITS; + _en_state = 0; + } + break; + } - if (py < _enf_y) { - _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; - } else { - _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } } - if (rdt > FANTY_DISTANCE) { - // Adjust to pixel - _enf_x = _en_x << FIXBITS; - _enf_y = _en_y << FIXBITS; - en_alive [gpit] = 0; + #endif + + // Vertical + + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } } - break; -} - -// Horizontal -_enf_x += _enf_vx; -if (_enf_x < 0) _enf_x = 0; -if (_enf_x > 15360) _enf_x = 15360; -_en_x = _enf_x >> 6; + #endif -#ifdef FANTY_COLLIDES - - if (_enf_vx) { - cy1 = (_en_y + 4) >> 4; - cy2 = (_en_y + 11) >> 4; - - if (_enf_vx > 0) { - cx1 = cx2 = (_en_x + 11) >> 4; - rda = ((cx2 - 1) << 4) + 4; - } else { - cx1 = cx2 = (_en_x + 4) >> 4; - rda = ((cx1 + 1) << 4) - 4; - } + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vx = -_enf_vx; - _en_x = rda; - _enf_x = rda << FIXBITS; + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); } - } - -#endif - -// Vertical + #endif -_enf_y += _enf_vy; -if (_enf_y < 0) _enf_y = 0; -if (_enf_y > 11264) _enf_y = 11264; -_en_y = _enf_y >> 6; - -#ifdef FANTY_COLLIDES - - if (_enf_vy) { - cx1 = (_en_x + 4) >> 4; - cx2 = (_en_x + 11) >> 4; - - if (_enf_vy > 0) { - cy1 = cy2 = (_en_y + 11) >> 4; - rda = ((cy2 - 1) << 4) + 4; - } else { - cy1 = cy2 = (_en_y + 4) >> 4; - rda = ((cy1 + 1) << 4) - 4; - } - - cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vy = -_enf_vy; - _en_y = rda; - _enf_y = rda << FIXBITS; - } - } - -#endif - -#ifdef FANTY_KILLED_BY_TILE - cx1 = (_en_x + 8) >> 4; - cy1 = (_en_y + 8) >> 4; - cm_two_points (); - if (at1 & 1) { - en_cttouched [gpit] = 8; - enems_kill (); - } +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; #endif -en_fr = (_en_x >> 3) & 1; - #ifdef FANTY_WITH_FACING //_en_facing = ((_en_x < prx) ? 0 : 4); rda = (prx < _en_x); enems_facing (); - en_spr = FANTY_BASE_SPRID + en_fr + _en_facing; + en_spr = _en_s + en_fr + _en_facing; #else - en_spr = FANTY_BASE_SPRID + en_fr; + en_spr = _en_s + en_fr; #endif diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_linear.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_linear.h index b52a7f3..917a549 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_linear.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_linear.h @@ -46,13 +46,29 @@ if (!en_status [gpit] || half_life) { // Change direction ? - #ifdef WALLS_STOP_ENEMIES - if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; - if (_en_y == _en_y1 || _en_y == _en_y2 || en_colly) _en_my = -_en_my; - #else - if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; - if (_en_y == _en_y1 || _en_y == _en_y2) _en_my = -_en_my; - #endif + #ifdef PLAYER_SAFE_LANDING + #ifdef WALLS_STOP_ENEMIES + if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; + #else + if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; + #endif + #ifdef WALLS_STOP_ENEMIES + if (en_colly) _en_my = -_en_my; + else + #endif + { + if (_en_y <= _en_y1) { _en_y = _en_y1; _en_my = ABS (_en_my); } + else if (_en_y >= _en_y2) { _en_y = _en_y2; _en_my = -ABS (_en_my); } + } + #else + #ifdef WALLS_STOP_ENEMIES + if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; + if (_en_y == _en_y1 || _en_y == _en_y2 || en_colly) _en_my = -_en_my; + #else + if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; + if (_en_y == _en_y1 || _en_y == _en_y2) _en_my = -_en_my; + #endif + #endif } //_en_facing = (_en_mx > 0 || _en_my > 0) ? 0 : 4; diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_monococo.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_monococo.h index d2bd1f9..d457ba3 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_monococo.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_monococo.h @@ -4,12 +4,12 @@ // mx is state. my is counter. // Counter & state change --- MONOCOCO_COUNTER; if (!MONOCOCO_COUNTER) { - MONOCOCO_STATE = (MONOCOCO_STATE + 1) & 3; MONOCOCO_COUNTER = monococo_state_times [MONOCOCO_STATE] - (rand8 () & 0x15); +-- _en_ct; if (!_en_ct) { + _en_state = (_en_state + 1) & 3; _en_ct = monococo_state_times [_en_state] - (rand8 () & 0x15); } // Shoot -if (MONOCOCO_STATE == 2 && MONOCOCO_COUNTER == MONOCOCO_FIRE_COCO_AT) { +if (_en_state == 2 && _en_ct == MONOCOCO_FIRE_COCO_AT) { rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); } @@ -18,14 +18,14 @@ if (MONOCOCO_STATE == 2 && MONOCOCO_COUNTER == MONOCOCO_FIRE_COCO_AT) { rda = (prx < rdx); enems_facing (); #ifdef MONOCOCO_TYPE_A if ( - ((MONOCOCO_STATE == 1 || MONOCOCO_STATE == 3) && half_life) || - MONOCOCO_STATE == 2 + ((_en_state == 1 || _en_state == 3) && half_life) || + _en_state == 2 ) { en_spr = MONOCOCO_BASE_SPRID + _en_facing + ((frame_counter >> 5) & 1); } #else en_spr = MONOCOCO_BASE_SPRID + _en_facing; - switch (MONOCOCO_STATE) { + switch (_en_state) { case 0: en_spr += 9; break; diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_pezon.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_pezon.h index b739b68..9288bb2 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_pezon.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_pezon.h @@ -10,12 +10,12 @@ oam_index = oam_meta_spr ( spr_enems [ENEMS_OCCLUDING_CELL] ); -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Idling if (_en_mx) { -- _en_mx; } else { - en_alive [gpit] = 1; + _en_state = 1; _enf_y = _en_y1 << 6; _enf_vy = -PEZON_THRUST; sfx_play (SFX_FLOAT, 1); @@ -29,7 +29,7 @@ switch (en_alive [gpit]) { _en_y = _enf_y >> 6; if (_en_y >= _en_y1) { - en_alive [gpit] = 0; + _en_state = 0; _en_mx = _en_my; } else { diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_punchy.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_punchy.h index 2ac8139..3cdc71e 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_punchy.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_punchy.h @@ -23,7 +23,13 @@ if (_en_t & 0x40) { sfx_play (SFX_HITTER, 1); // Collide w/player - if (pstate == EST_NORMAL && + if ( + #ifdef PLAYER_FLICKERS + !pflickering && + #endif + #ifdef PLAYER_BOUNCES + !pbouncing && + #endif rdx + 7 >= prx && rdx <= prx + 7 && rdy + 7 + PLAYER_COLLISION_VSTRETCH_FG >= pry && rdy <= pry + 13 diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_pursuers.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_pursuers.h index 7ada650..fe6da73 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_pursuers.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_pursuers.h @@ -3,14 +3,14 @@ // Pursuing enemies -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // IDLE if (_en_ct) { -- _en_ct; _en_y = 240; } else { - en_alive [gpit] = 1; + _en_state = 1; _en_x = _en_x1; _en_y = _en_y1; en_rawv [gpit] = 1 << (rand8 () % 5); @@ -22,12 +22,12 @@ switch (en_alive [gpit]) { case 1: // Appearing en_spr = ENEMS_EXPLODING_CELL; - if (_en_ct) -- _en_ct; else en_alive [gpit] = 2; + if (_en_ct) -- _en_ct; else _en_state = 2; break; case 2: // Pursuing - if (pstate == EST_NORMAL && (!en_status [gpit] || half_life)) { + if (pflickering == 0 && pbouncing == 0 && (!en_status [gpit] || half_life)) { _en_mx = add_sign (((prx >> 2) << 2) - _en_x, en_rawv [gpit]); _en_my = add_sign (((pry >> 2) << 2) - _en_y, en_rawv [gpit]); diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_saw.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_saw.h index 241c928..dc1df35 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_saw.h +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_saw.h @@ -8,18 +8,18 @@ rda = (_en_x1 == _en_x2); -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Idling. Goes from 2->1 (backwards). if (rda) { _en_y -= _en_mx; if (_en_y == _en_y1) { - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; } } else { _en_x -= _en_mx; if (_en_x == _en_x1) { - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; } } @@ -34,7 +34,7 @@ switch (en_alive [gpit]) { _en_y += _en_my; } } else { - en_alive [gpit] = 2; + _en_state = 2; } } break; @@ -42,13 +42,13 @@ switch (en_alive [gpit]) { if (rda) { _en_y += _en_mx; if (_en_y == _en_y2) { - en_alive [gpit] = 3; + _en_state = 3; _en_ct = SAW_EMERGING_STEPS; } } else { _en_x += _en_mx; if (_en_x == _en_x2) { - en_alive [gpit] = 3; + _en_state = 3; _en_ct = SAW_EMERGING_STEPS; } } @@ -63,7 +63,7 @@ switch (en_alive [gpit]) { _en_y -= _en_my; } } else { - en_alive [gpit] = 0; + _en_state = 0; } } break; diff --git a/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_timed_fanty.h b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_timed_fanty.h new file mode 100644 index 0000000..4528fcf --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/engine/enemmods/enem_timed_fanty.h @@ -0,0 +1,109 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Timed fanties + +if (_en_ct) _en_ct --; else { + + // Modify v + + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; + } + + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } + + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } + } + + #endif + + // Vertical + + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } + } + + #endif + + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; + cm_two_points (); + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); + } + #endif +} + +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; +#endif + +#ifdef FANTY_WITH_FACING + //_en_facing = ((_en_x < prx) ? 0 : 4); + rda = (prx < _en_x); enems_facing (); + en_spr = _en_s + en_fr + _en_facing; +#else + en_spr = _en_s + en_fr; +#endif + diff --git a/examples/07_cheril_perils_classic/dev/engine/enengine.h b/examples/07_cheril_perils_classic/dev/engine/enengine.h index e8db546..6b60bae 100644 --- a/examples/07_cheril_perils_classic/dev/engine/enengine.h +++ b/examples/07_cheril_perils_classic/dev/engine/enengine.h @@ -138,12 +138,36 @@ void enems_update_unsigned_char_arrays (void) { __asm__ ("lda %v", _en_facing); __asm__ ("sta %v, y", en_facing); + + __asm__ ("lda %v", _en_state); + __asm__ ("sta %v, y", en_state); + + #ifdef ENEMS_NEED_FP + enf_x [gpit] = _enf_x; enf_vx [gpit] = _enf_vx; + enf_y [gpit] = _enf_y; enf_vy [gpit] = _enf_vy; + #endif } -void enems_facing () { +void enems_facing (void) { _en_facing = rda << 2; } +void enems_init_fp (void) { + _enf_x = _en_x << 6; + _enf_y = _en_y << 6; +} + +void enems_boioiong_init (void) { + enems_init_fp (); + _enf_vy = 0; + _enf_vx = ADD_SIGN2 (_en_x2, _en_x1, rdm << FIXBITS); + #ifdef BOIOIONG_ACTIVE_BY_DEFAULT + _en_ct = BOIOIONG_INITIAL_TIMER; + #else + _en_ct = 0; + #endif +} + void enems_load (void) { #ifdef ENEMS_IN_CHRROM @@ -180,7 +204,7 @@ void enems_load (void) { _en_t = VRAM_READ; // General... - en_alive [gpit] = 0; + _en_state = 0; // YX1 rda = VRAM_READ; @@ -200,7 +224,7 @@ void enems_load (void) { SET_FROM_PTR (_en_t, gp_gen); gp_gen ++; // General... - en_alive [gpit] = 0; + _en_state = 0; // YX1 // rda = *gp_gen ++; @@ -298,17 +322,20 @@ void enems_load (void) { break; #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) + #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_TIMED_FANTY) case 6: // Fantys - enf_x [gpit] = _en_x << 6; - enf_y [gpit] = _en_y << 6; - enf_vx [gpit] = enf_vy [gpit] = 0; + enems_init_fp (); + _enf_vx = _enf_vy = 0; + #ifdef ENABLE_TIMED_FANTY + _en_ct = FANTY_BASE_TIMER; + #endif + _en_s = FANTY_BASE_SPRID; break; #endif - #ifdef ENABLE_PURSUERS + #ifdef ENABLE_PURSUERS case 7: // Pursuers _en_ct = DEATH_COUNT_EXPRESSION; @@ -344,7 +371,7 @@ void enems_load (void) { _en_my = rda; // EMERGING SENSE _en_mx = rdb; // MOVING SENSE - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; break; @@ -377,10 +404,33 @@ void enems_load (void) { #ifdef ENABLE_MONOCOCOS case 11: // Monococos - _en_mx = 0; _en_my = MONOCOCO_BASE_TIME_HIDDEN - (rand8 () & 0x15); + _en_state = 0; _en_ct = MONOCOCO_BASE_TIME_HIDDEN - (rand8 () & 0x15); _en_s = MONOCOCO_BASE_SPRID; break; - #endif + #endif + + #ifdef ENABLE_CATACROCKS + case 12: + // Catacrocks + enems_init_fp (); + _en_state = 0; + CATACROCK_WAIT = _en_ct = rdm << 5; + break; + #endif + + #ifdef ENABLE_BOIOIONG + case 13: + // Boioiongs + #ifdef PERSISTENT_ENEMIES + // Initialize position from ROM + _en_x = _en_x1; + _en_y = _en_y1; + #endif + enems_boioiong_init (); + _en_mx = rdm; // Store + _en_s = BOIOIONG_BASE_SPRID; + break; + #endif #ifdef ENABLE_COMPILED_ENEMS case 20: @@ -390,8 +440,9 @@ void enems_load (void) { _en_y = _en_y1; #endif _en_ct = 0; - _en_s = COMPILED_ENEMS_BASE_SPRID; + en_rawv [gpit] = _en_s = COMPILED_ENEMS_BASE_SPRID; en_behptr [gpit] = en_behptrs [rda]; + _en_x1 = 1; // Repurpose for speed break; #endif @@ -457,7 +508,7 @@ void enems_load (void) { { #ifdef ENABLE_PURSUERS if (_en_t == 7) { - en_alive [gpit] = 0; + _en_state = 0; _en_ct = DEATH_COUNT_EXPRESSION; #ifdef NEEDS_LIFE_GAUGE_LOGIC en_life [gpit] = ENEMS_LIFE_GAUGE; @@ -523,21 +574,23 @@ void enems_move (void) { __asm__ ("lda %v, y", en_facing); __asm__ ("sta %v", _en_facing); - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) + __asm__ ("lda %v, y", en_state); + __asm__ ("sta %v", _en_state); + + #ifdef ENEMS_NEED_FP _enf_x = enf_x [gpit]; _enf_vx = enf_vx [gpit]; - #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_PEZONS) _enf_y = enf_y [gpit]; _enf_vy = enf_vy [gpit]; #endif if (_en_t == 0) continue; en_is_alive = !(en_flags [gpit] & EN_STATE_DEAD); - + // Clear selected sprite // Means don't render (can/will be overwritten): en_spr = 0xff; // "touched" state control + en_spr_x_mod = 0; #ifdef ENEMS_MAY_DIE if (en_cttouched [gpit]) { @@ -557,16 +610,22 @@ void enems_move (void) { en_spr = en_spr_id [gpit]; } #else + rda = frame_counter & 0xf; oam_index = oam_meta_spr ( - _en_x, _en_y + SPRITE_ADJUST, + _en_x + jitter [rda], + _en_y + jitter [15 - rda] + SPRITE_ADJUST, oam_index, spr_enems [ENEMS_EXPLODING_CELL] ); #ifndef ENEMS_EXPLODING_CELLS_HIDES - en_spr = en_spr_id [gpit]; + if (en_life [gpit]) en_spr = en_spr_id [gpit]; #endif #endif + #ifdef ENEMS_TREMBLE + en_spr_x_mod = half_life; + #endif + #ifdef ENEMS_RECOIL_ON_HIT #include "engine/enemmods/enems_recoiling.h" #endif @@ -635,6 +694,12 @@ void enems_move (void) { break; #endif + #ifdef ENABLE_TIMED_FANTY + case 6: + #include "engine/enemmods/enem_timed_fanty.h" + break; + #endif + #ifdef ENABLE_PURSUERS case 7: #include "engine/enemmods/enem_pursuers.h" @@ -665,6 +730,18 @@ void enems_move (void) { break; #endif + #ifdef ENABLE_CATACROCKS + case 12: + #include "engine/enemmods/enem_catacrock.h" + break; + #endif + + #ifdef ENABLE_BOIOIONG + case 13: + #include "engine/enemmods/enem_boioiong.h" + break; + #endif + #ifdef ENABLE_SIMPLE_WARPERS case 0x3f: en_spr = SIMPLE_WARPERS_BASE_SPRID; @@ -695,6 +772,7 @@ void enems_move (void) { n_pant = _en_mx; on_pant = 0xff; prx = _en_x2; px = prx << FIXBITS; pry = _en_y2; py = pry << FIXBITS; + player_stop (); #if defined (SIMPLE_WARPERS_FIRE_BUTTON) && (defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS)) phitteract = 0; @@ -740,23 +818,30 @@ void enems_move (void) { pvy = 0; } } + + #ifdef PLAYER_SPINS + if (pgotten) pspin = 0; + #endif #endif // Is enemy collidable? If not, exit if ( en_is_alive == 0 // General condition. + #ifdef ENEMS_MAY_DIE + || en_cttouched [gpit] + #endif #ifndef PLAYER_TOP_DOWN || _en_t == 4 #endif #ifdef ENABLE_PURSUERS - || (_en_t == 7 && en_alive [gpit] != 2) + || (_en_t == 7 && _en_state != 2) #endif #ifdef ENABLE_SAW - || (_en_t == 8 && en_alive [gpit] != 2) + || (_en_t == 8 && _en_state != 2) #endif #ifdef ENABLE_PEZONS - || (_en_t == 9 && en_alive [gpit] == 0) + || (_en_t == 9 && _en_state == 0) #endif #ifdef ENABLE_CHAC_CHAC || _en_t == 10 @@ -764,6 +849,12 @@ void enems_move (void) { #ifdef ENABLE_MONOCOCOS || (_en_t == 11 && _en_mx != 2) #endif + #ifdef ENABLE_CATACROCKS + || (_en_t == 12 && _en_state != 1) + #endif + #ifdef ENABLE_BOIOIONG + || (_en_t == 13 && _en_ct == 0) + #endif ) goto skipdo; // Collide with player (includes step over enemy) @@ -827,30 +918,68 @@ void enems_move (void) { _en_t != 5 && #endif touched == 0 && - pstate == EST_NORMAL && collide () ) { - #ifdef PLAYER_BOUNCES - pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); _en_mx = ADD_SIGN (_en_x - prx, ABS (_en_mx)); - pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); if (!_en_mx) _en_my = ADD_SIGN (_en_y - pry, ABS (_en_my)); - #endif - - #if defined ENEMIES_SUFFER_ON_PLAYER_COLLISION - enems_hit (); + // en_sg_1 => kill enemy + #ifdef ENEMIES_SUFFER_ON_PLAYER_COLLISION + en_sg_1 = 1; + #else + en_sg_1 = 0; #endif + + // en_sg_2 => kill player. + en_sg_2 = (pflickering == 0); #ifdef ENABLE_RESONATORS + // If resonators are on and not a saw, don't kill player if ( - res_on == 0 + res_on == 1 #ifdef ENABLE_SAW - || _en_t == 8 + && _en_t != 8 #endif - ) + ) en_sg_2 = 0; #endif - { - pkill = 1; - touched = 1; + + #ifdef PLAYER_SPINS + // If spinning and not a saw or a steady shooter + // kill enemy, don't kill player + if (pspin + #ifndef STEADY_SHOOTER_KILLABLE + && _en_t != 5 + #endif + #ifdef ENABLE_SAW + && _en_t != 8 + #endif + ) { + en_sg_2 = 0; + en_sg_1 = 1; + pvy = -pvy; + sfx_play (SFX_STEPON, 1); + } + #endif + + #include "my/on_player_hit.h" + + #ifdef ENEMS_MAY_DIE + if (en_sg_1) enems_hit (); + #endif + if (en_sg_2) { + pkill = 1; + #if defined (PLAYER_BOUNCES) && !defined (DIE_AND_RESPAWN) + pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); + pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); + + #ifdef ENABLE_COMPILED_ENEMS + if (_en_t != 20) + #endif + { + if (!_en_mx) _en_my = ADD_SIGN (_en_y - pry, ABS (_en_my)); + _en_mx = ADD_SIGN (_en_x - prx, ABS (_en_mx)); + } + + #endif } + touched = 1; } // Is enemy killable? If not, exit @@ -902,7 +1031,7 @@ void enems_move (void) { // Bullets bi = MAX_BULLETS; while (bi --) if (bst [bi]) { #ifdef ENABLE_PURSUERS - if (_en_t != 7 || en_alive [gpit] == 2) + if (_en_t != 7 || _en_state == 2) #endif if (collide_in (bx [bi] + 3, by [bi] + 3, _en_x, _en_y)) { @@ -950,8 +1079,7 @@ void enems_move (void) { _en_y = en_resy [gpit]; _en_my = en_resmy [gpit]; #if (defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY)) - _enf_x = _en_x << FIXBITS; - _enf_y = _en_y << FIXBITS; + enems_init_fp (); #ifdef NEEDS_LIFE_GAUGE_LOGIC en_life [gpit] = _en_t == 6 ? FANTY_LIFE_GAUGE : ENEMS_LIFE_GAUGE; #endif @@ -974,7 +1102,7 @@ void enems_move (void) { if (en_spr != 0xff) { oam_index = oam_meta_spr ( - _en_x, _en_y + SPRITE_ADJUST, + _en_x + en_spr_x_mod, _en_y + SPRITE_ADJUST, oam_index, spr_enems [en_spr] ); @@ -983,13 +1111,5 @@ void enems_move (void) { // Update arrays enems_update_unsigned_char_arrays (); - - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) - enf_x [gpit] = _enf_x; enf_vx [gpit] = _enf_vx; - #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_PEZONS) - enf_y [gpit] = _enf_y; enf_vy [gpit] = _enf_vy; - #endif - } } diff --git a/examples/07_cheril_perils_classic/dev/engine/general.h b/examples/07_cheril_perils_classic/dev/engine/general.h index 01c962c..1725196 100644 --- a/examples/07_cheril_perils_classic/dev/engine/general.h +++ b/examples/07_cheril_perils_classic/dev/engine/general.h @@ -88,12 +88,31 @@ void pad_read (void) { #ifndef PLAYER_TOP_DOWN void jump_start (void) { - sfx_play (SFX_JUMP, 0); pj = 1; pctj = 0; - #ifdef PLAYER_JUMP_TYPE_MK2 - pvy = -PLAYER_VY_MK2_JUMP_INITIAL; - #else - pvy = -PLAYER_VY_JUMP_INITIAL; + #ifdef ENABLE_TRAMPOLINES + if (ptrampoline) { + sfx_play (SFX_TRAMPOLINE, 0); + #ifdef PLAYER_JUMP_TYPE_MK2 + pvy = -PLAYER_VY_MK2_JUMP_INITIAL_TRAMPOLINE; + #else + pvy = -PLAYER_VY_JUMP_INITIAL_TRAMPOLINE; + #endif + } else #endif + { + sfx_play (SFX_JUMP, 0); + #ifdef PLAYER_JUMP_TYPE_MK2 + pvy = -PLAYER_VY_MK2_JUMP_INITIAL; + #else + pvy = -PLAYER_VY_JUMP_INITIAL; + #endif + } } #endif + +void update_cycle (void) { + oam_hide_rest (oam_index); + ppu_waitnmi (); + clear_update_list (); + oam_index = 4; +} diff --git a/examples/07_cheril_perils_classic/dev/engine/mapmods/map_renderer_complex.h b/examples/07_cheril_perils_classic/dev/engine/mapmods/map_renderer_complex.h index 6f0a96e..6e3bc07 100644 --- a/examples/07_cheril_perils_classic/dev/engine/mapmods/map_renderer_complex.h +++ b/examples/07_cheril_perils_classic/dev/engine/mapmods/map_renderer_complex.h @@ -11,15 +11,13 @@ void add_tile (void) { map_buff [rdm] = rda; ++ rdm; - // Need to do this to keep track of where I am - rdx = (rdx + 1) & 15; if (!rdx) ++ rdy; } void draw_scr (void) { // Draw Map - rdx = rdy = rdm = 0; + rdm = 0; #ifdef MAP_FORMAT_PACKED // Get pointer @@ -34,6 +32,8 @@ void draw_scr (void) { #endif #ifdef MAP_FORMAT_RLE16 + rdx = rdy = 0; + // Get pointer gp_gen = c_map [n_pant]; @@ -119,13 +119,13 @@ void draw_scr (void) { #ifdef MAP_FORMAT_RLE44_CHRROM bankswitch (c_map_chr_rom_bank); vram_adr (c_map [n_pant]); - rda = VRAM_READ; // Dummy read. + rdt = VRAM_READ; // Dummy read. // UNRLE into scr_buff while (rdm < 192) { rdt = VRAM_READ; rda = rdt & 0x0f; - + rdct = rdt; while (rdct >= 16) { add_tile (); rdct -= 16; @@ -200,11 +200,19 @@ void draw_scr (void) { // Now blit the buffer + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + rdd = 0; + #endif + _x = 0; _y = TOP_ADJUST; gp_ram = map_buff; - //rdx = 0; rdy = 0; gp_ram = map_buff; for (rdm = 0; rdm < 192; rdm ++) { - // rdt = *gp_ram ++; SET_FROM_PTR (rdt, gp_ram); gp_ram ++; + + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + if (tile_got [rdd] & bits [rdm & 7]) rdt = 0; + if ((rdm & 7) == 7) ++ rdd; + #endif + map_attr [rdm] = c_behs [rdt]; #if defined (ENABLE_BREAKABLE) && !defined (BREAKABLES_SOFT) @@ -213,11 +221,6 @@ void draw_scr (void) { #include "engine/mapmods/map_detectors.h" - /* - _x = rdx << 1; _y = (rdy << 1) + TOP_ADJUST; _t = rdt; - draw_tile (); - rdx = (rdx + 1) & 15; if (!rdx) ++ rdy; - */ _t = rdt; draw_tile (); _x = (_x + 2) & 0x1f; if (!_x) _y += 2; } diff --git a/examples/07_cheril_perils_classic/dev/engine/player.h b/examples/07_cheril_perils_classic/dev/engine/player.h index 0ebb092..8cd006d 100644 --- a/examples/07_cheril_perils_classic/dev/engine/player.h +++ b/examples/07_cheril_perils_classic/dev/engine/player.h @@ -59,7 +59,7 @@ void player_init (void) { #endif #endif - pstate = EST_NORMAL; + pflickering = pbouncing = 0; #ifdef DIE_AND_RESPAWN player_register_safe_spot (); @@ -68,10 +68,31 @@ void player_init (void) { #ifdef CARRY_ONE_HS_OBJECT pinv = HS_OBJ_EMPTY; #endif + + // Default engine type + #ifndef PLAYER_TOP_DOWN + #ifdef PLAYER_HAS_JUMP + vertical_engine_type = ENGINE_TYPE_JUMP; + #elif defined (PLAYER_HAS_JETPAC) + vertical_engine_type = ENGINE_TYPE_JET_PAC; + #elif defined (PLAYER_AUTO_JUMP) + vertical_engine_type = ENGINE_TYPE_AUTO_JUMP; + #elif defined (PLAYER_SWIMS) + vertical_engine_type = ENGINE_TYPE_SWIM; + #endif + #endif + + #ifdef ENABLE_TRAMPOLINES + ptrampoline = 0; + #endif + + #ifdef PLAYER_SPINS + pspin = 0; + #endif } void player_render (void) { - if (pstate == EST_NORMAL || half_life) + if (0 == pflickering || half_life) oam_index = oam_meta_spr ( prx, pry + SPRITE_ADJUST, oam_index, @@ -85,17 +106,21 @@ void player_to_pixels (void) { } void player_kill (void) { + oam_index = oam_index_player; + player_render (); + ppu_waitnmi (); + pkill = phit = 0; sfx_play (SFX_PHIT, 0); if (plife) -- plife; else game_over = 1; #ifdef PLAYER_FLICKERS - pstate = EST_PARP; - pctstate = 100; - #else - pstate = EST_REBOUND; - pctstate = 16; + pflickering = PLAYER_FLICKERS; + #endif + + #ifdef PLAYER_BOUNCES + pbouncing = PLAYER_BOUNCES; #endif #ifdef ENABLE_USE_ANIM @@ -103,14 +128,19 @@ void player_kill (void) { #endif #ifdef DIE_AND_RESPAWN - px = px_safe; - py = py_safe; - player_to_pixels (); - n_pant = n_pant_safe; music_pause (1); delay (60); - player_stop (); - music_pause (0); + + #ifdef DIE_AND_REINIT + level_reset = 1; + #else + px = px_safe; + py = py_safe; + player_to_pixels (); + n_pant = n_pant_safe; + player_stop (); + music_pause (0); + #endif // May be necessary to find a proper cell later on #if defined (ENABLE_BREAKABLE) @@ -132,10 +162,8 @@ void player_kill (void) { #endif void player_move (void) { - if (pstate) { - -- pctstate; - if (!pctstate) pstate = EST_NORMAL; - } + if (pflickering) -- pflickering; + if (pbouncing) -- pbouncing; #if defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS) if (pfrozen) { @@ -172,6 +200,7 @@ void player_move (void) { #endif hitv = hith = 0; + pcx = prx; pcy = pry; pnotsafe = 0; #ifdef ENABLE_SLIPPERY pice = 0; @@ -207,11 +236,12 @@ void player_move (void) { #endif { if (QTILE (cx1, cy1 + 1) == SPRING_TILE && QTILE (cx1, cy1) != SPRING_SPIKE_TILE) { _x = cx1; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} - if (QTILE (cx2, cy1 + 1) == SPRING_TILE && QTILE (cx1, cy1) != SPRING_SPIKE_TILE) { _x = cx2; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} + if (QTILE (cx2, cy1 + 1) == SPRING_TILE && QTILE (cx2, cy1) != SPRING_SPIKE_TILE) { _x = cx2; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} } } #endif + oppossee = ppossee; ppossee = 0; // ******** @@ -284,7 +314,7 @@ void player_move (void) { } else #endif - #ifndef PLAYER_SWIMS + if (vertical_engine_type != ENGINE_TYPE_SWIM) { #ifdef PLAYER_JUMP_TYPE_MK2 if ( !pgotten @@ -300,56 +330,57 @@ void player_move (void) { if (pvy > PLAYER_VY_FALLING_MAX) pvy = PLAYER_VY_FALLING_MAX; } #endif - #endif + } // Moving platforms invalidate pvy - #ifdef PLAYER_CUMULATIVE_JUMP - if (!pj) - #endif - if (pgotten) pvy = 0; + if (pgotten) pvy = 0; #endif - cx1 = prx >> 4; - cx2 = (prx + 7) >> 4; - #ifdef PLAYER_HAS_JETPAC // Controller - if (pad0 & PAD_A) { - pvy -= PLAYER_AY_JETPAC; - if (pvy < -PLAYER_VY_JETPAC_MAX) pvy = -PLAYER_VY_JETPAC_MAX; + if (vertical_engine_type == ENGINE_TYPE_JET_PAC) { + if (pad0 & PAD_A) { + pvy -= PLAYER_AY_JETPAC; + if (pvy < -PLAYER_VY_JETPAC_MAX) pvy = -PLAYER_VY_JETPAC_MAX; + } } #endif #ifdef PLAYER_SWIMS // Controller - if (!(pad0 & (PAD_DOWN|PAD_A))) { - pvy -= PLAYER_AY_SWIM >> 1; - } else { - if (pad0 & (PAD_DOWN|PAD_A)) { - pvy += PLAYER_AY_SWIM; + if (vertical_engine_type == ENGINE_TYPE_SWIM) { + if (!(pad0 & (PAD_DOWN|PAD_A))) { + pvy -= PLAYER_AY_SWIM >> 1; + } else { + if (pad0 & (PAD_DOWN|PAD_A)) { + pvy += PLAYER_AY_SWIM; + } + + // Limit + if (pvy > PLAYER_VY_SWIM_MAX) { + pvy = PLAYER_VY_SWIM_MAX; + } } - - // Limit - if (pvy > PLAYER_VY_SWIM_MAX) { - pvy = PLAYER_VY_SWIM_MAX; + if (pvy < -PLAYER_VY_SWIM_MAX) { + pvy = -PLAYER_VY_SWIM_MAX; } } - if (pvy < -PLAYER_VY_SWIM_MAX) { - pvy = -PLAYER_VY_SWIM_MAX; - } - #endif // Move py += pvy; if (py < 0) py = 0; - + pry = py >> FIXBITS; + // Collision player_to_pixels (); + cx1 = prx >> 4; + cx2 = (prx + 7) >> 4; + #ifdef PLAYER_TOP_DOWN if (pvy < 0) #else @@ -404,7 +435,7 @@ void player_move (void) { pgotten = 0; pfiring = 1; ppossee = 1; - + #if defined (PLAYER_TOP_DOWN) && (defined(PLAYER_PUSH_BOXES) || !defined(DEACTIVATE_KEYS)) if (at1 & 2) player_process_tile (at1, cx1, cy1, cx1, cy1 + 1); if (cx1 != cx2) if (at2 & 2) player_process_tile (at2, cx2, cy1, cx2, cy1 + 1); @@ -414,6 +445,18 @@ void player_move (void) { pice = (at1 & 64) || (at2 & 64); #endif + #if defined (ENABLE_TRAMPOLINES) + if (at1 == 74 || at2 == 74) { + a_button = 1; ptrampoline = 1; + #ifdef PLAYER_SPINS + pspin = 0; + #endif + #ifdef ENABLE_SLIPPERY + pice = 0; + #endif + } + #endif + #ifdef ENABLE_CONVEYORS cfx = 0; if ((at1 & 40) == 40) { if (at1 & 1) cfx = pgtmx = PLAYER_VX_CONVEYORS; else cfx = pgtmx = -PLAYER_VX_CONVEYORS; pgotten = 1; } @@ -427,7 +470,7 @@ void player_move (void) { if ((at1 & 1) || (at2 & 1)) pnotsafe = 1; } else if ((at1 & 1) || (at2 & 1)) { - hitv = 1; + if ((pry & 15) > 4) hitv = 1; } #ifdef ENABLE_QUICKSANDS else { @@ -444,40 +487,101 @@ void player_move (void) { // Jump: PAD_A, change when needed // ******************************* - #ifdef PLAYER_JUMP_TYPE_MK2 + if (vertical_engine_type == ENGINE_TYPE_JUMP) { + #ifdef PLAYER_JUMP_TYPE_MK2 - if ( - a_button - && !pj - && ( - pgotten || ppossee || hitv - #ifdef ENABLE_LADDERS - || ponladder - #endif - ) - ) { - jump_start (); - - #ifdef DIE_AND_RESPAWN - if (!(pgotten || hitv || pnotsafe)) { - player_register_safe_spot (); + if ( + a_button + && !pj + && ( + pgotten || ppossee || hitv + #ifdef ENABLE_LADDERS + || ponladder + #endif + ) + ) { + jump_start (); + + #ifdef DIE_AND_RESPAWN + if (!(pgotten || hitv || pnotsafe)) { + player_register_safe_spot (); + } + #endif + + #ifdef PLAYER_SPINS + #ifdef ENABLE_TRAMPOLINES + if (!ptrampoline) + #endif + pspin = 1; + #endif + } + + if (pj) { + #ifdef ENABLE_TRAMPOLINES + if (ptrampoline) { + ++ pctj; if (pctj == PLAYER_VY_MK2_TRAMPOLINE_A_STEPS) + { pj = 0; ptrampoline = 0; } + } else + #endif + if (pad0 & PAD_A) { + ++ pctj; if (pctj == PLAYER_VY_MK2_JUMP_A_STEPS) pj = 0; + } else { + pj = 0; if (pvy < -PLAYER_VY_MK2_JUMP_RELEASE) pvy = -PLAYER_VY_MK2_JUMP_RELEASE; } - #endif - } + } - if (pj) { + #else + + if ( + a_button + && !pj + && ( + pgotten || ppossee || hitv + #ifdef ENABLE_LADDERS + || ponladder + #endif + ) + ) { + jump_start (); + + #ifdef DIE_AND_RESPAWN + if (!(pgotten || hitv || pnotsafe)) { + player_register_safe_spot (); + } + #endif + + #ifdef PLAYER_SPINS + #ifdef ENABLE_TRAMPOLINES + if (!ptrampoline) + #endif + pspin = 1; + #endif + } + + #ifdef ENABLE_TRAMPOLINES + if (pj && ptrampoline) { + + ++ pctj; if (pctj == 32) pj = 0; + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + } else + #endif if (pad0 & PAD_A) { - ++ pctj; if (pctj == PLAYER_VY_MK2_JUMP_A_STEPS) pj = 0; + if (pj) { + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; + ++ pctj; if (pctj == 16) pj = 0; + } } else { - pj = 0; if (pvy < -PLAYER_VY_MK2_JUMP_RELEASE) pvy = -PLAYER_VY_MK2_JUMP_RELEASE; + pj = 0; } - } + #endif + } + #endif - #else - + #ifdef PLAYER_AUTO_JUMP + if (vertical_engine_type == ENGINE_TYPE_AUTO_JUMP) { if ( - a_button - && !pj + !pj && ( pgotten || ppossee || hitv #ifdef ENABLE_LADDERS @@ -486,53 +590,32 @@ void player_move (void) { ) ) { jump_start (); - + #ifdef DIE_AND_RESPAWN if (!(pgotten || hitv || pnotsafe)) { player_register_safe_spot (); } #endif } + + if (pj) { + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; + ++ pctj; if (pctj == 16) pj = 0; + } - if (pad0 & PAD_A) { - if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); - if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - ++ pctj; if (pctj == 16) pj = 0; - } - } else { - pj = 0; + if (pad0 & PAD_DOWN) { + if (pvy < 0) pvy += PLAYER_AY_UNTHRUST; } - #endif - #endif - - #ifdef PLAYER_AUTO_JUMP - if ( - !pj - && ( - pgotten || ppossee || hitv - #ifdef ENABLE_LADDERS - || ponladder - #endif - ) - ) { - jump_start (); - - #ifdef DIE_AND_RESPAWN - if (!(pgotten || hitv || pnotsafe)) { - player_register_safe_spot (); - } - #endif } + #endif - if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); - if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - ++ pctj; if (pctj == 16) pj = 0; - } - + #ifdef PLAYER_SPINS if (pad0 & PAD_DOWN) { - if (pvy < 0) pvy += PLAYER_AY_UNTHRUST; + if (ppossee && ABS (pvx) > PLAYER_VX_MIN) { + if (!pspin) sfx_play (SFX_DUMMY2, 0); + pspin = 1; + } } #endif @@ -545,25 +628,29 @@ void player_move (void) { #ifdef PLAYER_TOP_DOWN pfacingh = 0xff; #endif - - if (pvx > 0) { + #ifdef PLAYER_SPINS + if (!pspin) + #endif + { + if (pvx > 0) { - #ifdef ENABLE_SLIPPERY - pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx -= PLAYER_RX; - #endif - - if (pvx < 0) pvx = 0; - } else if (pvx < 0) { + #ifdef ENABLE_SLIPPERY + pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx -= PLAYER_RX; + #endif + + if (pvx < 0) pvx = 0; + } else if (pvx < 0) { - #ifdef ENABLE_SLIPPERY - pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx += PLAYER_RX; - #endif + #ifdef ENABLE_SLIPPERY + pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx += PLAYER_RX; + #endif - if (pvx > 0) pvx = 0; + if (pvx > 0) pvx = 0; + } } } @@ -607,8 +694,8 @@ void player_move (void) { if (pgotten) px += pgtmx; #endif - if (px < (4< (244< (244< 0) hith &= ((pry & 15) > 4); } // Facing @@ -675,27 +763,78 @@ void player_move (void) { #endif #endif + #ifdef PLAYER_SPINS + if ((!pvx && (ppossee || pgotten) && !pj) || (ppossee && !oppossee)) pspin = 0; + #endif + // ************* // Killing tiles // ************* phit = 0; - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; - #ifndef NO_HORIZONTAL_EVIL_TILE - pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); - #endif + if (pgotten == 0) { + #ifdef NO_HORIZONTAL_EVIL_TILE + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } + #else + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } + #endif + + #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) + cx1 = cx2 = (prx + 4) >> 4; + cy1 = pry >> 4; cy2 = (pry + 15) >> 4; + cm_two_points (); + if ((at1 & 1) || (at2 & 1)) phit = 1; + #endif + + if (!pflickering && !pbouncing) if (phit) { + player_to_pixels (); + en_sg_2 = 1; + + #include "my/on_player_spike.h" + + if (en_sg_2) + pkill = 1; + #ifdef PLAYER_SPINS + pspin = 0; + #endif + } } - #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) + // *********************** + // Center point detections + // *********************** + + #ifdef NEEDS_CENTER_DETECTION cx1 = cx2 = (prx + 4) >> 4; - cy1 = pry >> 4; cy2 = (pry + 15) >> 4; + cy1 = cy2 = (pry + 8) >> 4; cm_two_points (); - if ((at1 & 1) || (at2 & 1)) phit = 1; + + #include "my/custom_center_detections.h" #endif - if (pstate != EST_PARP) if (phit) { player_to_pixels (); pkill = 1; } + #ifdef ENABLE_TILE_GET + if (cy1 && at1 == 34) { + -- cy1; + + _x = cx1; _y = cy1; _t = 0; map_set (); + sfx_play (SFX_RING, 2); + + #include "my/on_tile_got.h" + + #ifdef PERSISTENT_TILE_GET + tile_got [(cy1 << 1) | (cx1 > 7)] |= bits [cx1 & 7]; + #endif + } + #endif // ************** // B Button stuff diff --git a/examples/07_cheril_perils_classic/dev/engine/prototypes.h b/examples/07_cheril_perils_classic/dev/engine/prototypes.h index 9bc892f..8507ada 100644 --- a/examples/07_cheril_perils_classic/dev/engine/prototypes.h +++ b/examples/07_cheril_perils_classic/dev/engine/prototypes.h @@ -6,3 +6,5 @@ void propellers_add (void); void shines_add (void); void chac_chacs_add (void); +void player_render (void); +void do_extern_action (unsigned char); diff --git a/examples/07_cheril_perils_classic/dev/game.c b/examples/07_cheril_perils_classic/dev/game.c index 74a3599..d94bc9a 100644 --- a/examples/07_cheril_perils_classic/dev/game.c +++ b/examples/07_cheril_perils_classic/dev/game.c @@ -68,11 +68,12 @@ extern const unsigned char m_ingame []; // ************* #include "engine/prototypes.h" -#include "engine/general.h" #include "engine/printer.h" +#include "engine/general.h" #ifdef ENABLE_TEXT_BOX #include "engine/textbox.h" #endif +#include "my/extra_modules.h" #ifdef ENABLE_BREAKABLE #include "engine/breakable.h" #endif @@ -94,14 +95,15 @@ extern const unsigned char m_ingame []; #endif #include "engine/player.h" #include "engine/enengine.h" +#if (defined (ACTIVATE_SCRIPTING) && defined (ENABLE_EXTERN_CODE)) || defined (ENABLE_COMPILED_ENEMS) + #include "my/extern.h" +#endif #include "engine/frame.h" #include "my/pres.h" #ifdef ACTIVATE_SCRIPTING - #ifdef ENABLE_EXTERN_CODE - #include "my/extern.h" - #endif #include "assets/mscnes.h" #endif +#include "mainloop/flickscreen.h" #include "mainloop.h" // ************* @@ -114,6 +116,8 @@ void main(void) { ppu_off (); first_game = 1; + ntsc = ppu_system (); + //game_mode = 0; mode_no_resonators = 0; // Main loop diff --git a/examples/07_cheril_perils_classic/dev/labels.txt b/examples/07_cheril_perils_classic/dev/labels.txt index 0c852eb..7016c3b 100644 --- a/examples/07_cheril_perils_classic/dev/labels.txt +++ b/examples/07_cheril_perils_classic/dev/labels.txt @@ -3,92 +3,90 @@ Modules list: crt0.o: RODATA Offs = 000000 Size = 0009D1 HEADER Offs = 000000 Size = 000010 - STARTUP Offs = 000000 Size = 000C7F + STARTUP Offs = 000000 Size = 000CB2 VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 002000 game.o: - CODE Offs = 000000 Size = 002930 - RODATA Offs = 0009D1 Size = 0024B0 - BSS Offs = 000000 Size = 00042F - ZEROPAGE Offs = 000000 Size = 0000AA + CODE Offs = 000000 Size = 002ABC + RODATA Offs = 0009D1 Size = 0024CB + BSS Offs = 000000 Size = 000437 + ZEROPAGE Offs = 000000 Size = 0000AF runtime.lib(addysp.o): - CODE Offs = 002930 Size = 00000E + CODE Offs = 002ABC Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 00293E Size = 00000B + CODE Offs = 002ACA Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 002949 Size = 00000E + CODE Offs = 002AD5 Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 002957 Size = 000011 + CODE Offs = 002AE3 Size = 000011 runtime.lib(asrax1.o): - CODE Offs = 002968 Size = 00000A + CODE Offs = 002AF4 Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 002972 Size = 00000F + CODE Offs = 002AFE Size = 00000F runtime.lib(asrax3.o): - CODE Offs = 002981 Size = 000014 + CODE Offs = 002B0D Size = 000014 runtime.lib(asrax4.o): - CODE Offs = 002995 Size = 000019 + CODE Offs = 002B21 Size = 000019 runtime.lib(bneg.o): - CODE Offs = 0029AE Size = 00000E + CODE Offs = 002B3A Size = 00000E runtime.lib(call.o): - CODE Offs = 0029BC Size = 000007 + CODE Offs = 002B48 Size = 000007 runtime.lib(copydata.o): - CODE Offs = 0029C3 Size = 00002D + CODE Offs = 002B4F Size = 00002D runtime.lib(decsp3.o): - CODE Offs = 0029F0 Size = 00000D + CODE Offs = 002B7C Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 0029FD Size = 00000D + CODE Offs = 002B89 Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 002A0A Size = 00000D + CODE Offs = 002B96 Size = 00000D runtime.lib(icmp.o): - CODE Offs = 002A17 Size = 00002E + CODE Offs = 002BA3 Size = 00002E runtime.lib(incsp2.o): - CODE Offs = 002A45 Size = 000016 + CODE Offs = 002BD1 Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 002A5B Size = 000005 + CODE Offs = 002BE7 Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 002A60 Size = 000005 + CODE Offs = 002BEC Size = 000005 runtime.lib(ldai.o): - CODE Offs = 002A65 Size = 00000C + CODE Offs = 002BF1 Size = 00000C runtime.lib(makebool.o): - CODE Offs = 002A71 Size = 000031 + CODE Offs = 002BFD Size = 000031 runtime.lib(neg.o): - CODE Offs = 002AA2 Size = 00000E + CODE Offs = 002C2E Size = 00000E runtime.lib(or.o): - CODE Offs = 002AB0 Size = 000012 + CODE Offs = 002C3C Size = 000012 runtime.lib(popa.o): - CODE Offs = 002AC2 Size = 00000C + CODE Offs = 002C4E Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 002ACE Size = 000010 + CODE Offs = 002C5A Size = 000010 runtime.lib(pusha.o): - CODE Offs = 002ADE Size = 000016 + CODE Offs = 002C6A Size = 000016 runtime.lib(pushax.o): - CODE Offs = 002AF4 Size = 00001A + CODE Offs = 002C80 Size = 00001A runtime.lib(shl.o): - CODE Offs = 002B0E Size = 00002B + CODE Offs = 002C9A Size = 00002B runtime.lib(shrax3.o): - CODE Offs = 002B39 Size = 00000E + CODE Offs = 002CC5 Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 002B47 Size = 000011 + CODE Offs = 002CD3 Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 002B58 Size = 000016 + CODE Offs = 002CE4 Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 002B6E Size = 00000B -runtime.lib(staxspi.o): - CODE Offs = 002B79 Size = 00001B + CODE Offs = 002CFA Size = 00000B runtime.lib(sub.o): - CODE Offs = 002B94 Size = 000015 + CODE Offs = 002D05 Size = 000015 runtime.lib(subeqsp.o): - CODE Offs = 002BA9 Size = 000015 + CODE Offs = 002D1A Size = 000015 runtime.lib(subysp.o): - CODE Offs = 002BBE Size = 00000D + CODE Offs = 002D2F Size = 00000D runtime.lib(udiv.o): - CODE Offs = 002BCB Size = 00004F + CODE Offs = 002D3C Size = 00004F runtime.lib(umod.o): - CODE Offs = 002C1A Size = 000011 + CODE Offs = 002D8B Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000AA Size = 00001A + ZEROPAGE Offs = 0000AF Size = 00001A Segment list: @@ -97,64 +95,64 @@ Name Start End Size -------------------------------------------- CHARS 000000 001FFF 002000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000EB 0000C4 -BSS 000300 00072E 00042F -STARTUP 008000 008C7E 000C7F -INIT 008C7F 008CA1 000023 -CODE 008CA2 00B8CC 002C2B -RODATA 00B8CD 00E74D 002E81 +ZEROPAGE 000028 0000F0 0000C9 +BSS 000300 000736 000437 +STARTUP 008000 008CB1 000CB2 +INIT 008CB2 008CD4 000023 +CODE 008CD5 00BA70 002D9C +RODATA 00BA71 00E90C 002E9C VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 00042F REA -__DATA_LOAD__ 00E74E RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 000437 REA +__DATA_LOAD__ 00E90D RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA -_bank_bg 0083E3 RLA _bank_spr 0083D3 RLA -_bankswitch 008590 RLA _delay 008588 RLA -_main 00B532 RLA _memfill 008559 RLA -_music_pause 00876E REA _music_play 008701 REA -_music_stop 0086C3 REA _oam_clear 0082A8 RLA -_oam_hide_rest 00833A RLA _oam_meta_spr 0082F2 RLA -_oam_spr 0082C8 RLA _pad_poll 008468 RLA -_pal_bg 008229 RLA _pal_bright 00825B RLA -_pal_spr 008233 RLA _ppu_off 008269 RLA -_ppu_on_all 00827C RLA _ppu_waitnmi 008347 RLA -_rand8 0084C7 RLA _scroll 0083A0 RLA -_set_rand 0084D8 RLA _set_vram_update 0084DD RLA -_sfx_play 008457 RLA _unrle_vram 008360 RLA -_vram_adr 0084E7 RLA _vram_fill 0084F2 RLA -_vram_put 0084EE RLA _vram_write 008427 RLA -addysp 00B5D3 RLA addysp1 00B5D2 RLA -aslax2 00B5E0 RLA aslax3 00B5EB RLA -aslax4 00B5F9 RLA asrax1 00B60A RLA -asrax2 00B614 RLA asrax3 00B623 RLA -asrax4 00B637 RLA bnega 00B654 RLA -booleq 00B719 RLA boolult 00B731 RLA -callax 00B65E RLA copydata 00B665 RLA -decsp3 00B692 RLA decsp4 00B69F RLA -decsp8 00B6AC RLA incsp2 00B6EF RLA -incsp4 00B6FD RLA incsp8 00B702 RLA -ldaidx 00B707 RLA negax 00B744 RLA -popa 00B764 RLA popax 00B6E7 RLA -popsreg 00B770 RLA ptr1 0000DA RLZ -ptr2 0000DC RLZ ptr4 0000E0 RLZ -push0 00B796 RLA pusha 00B784 RLA -pusha0 00B798 RLA pushax 00B79A RLA -regsave 0000D6 RLZ shlax2 00B5E0 RLA -shlax4 00B5F9 RLA shrax3 00B7DB RLA -shrax4 00B7E9 RLA sp 0000D2 RLZ -sreg 0000D4 RLZ staspidx 00B7FA RLA -stax0sp 00B810 RLA staxspidx 00B81B RLA -subeqysp 00B84D RLA subysp 00B860 RLA -tmp1 0000E2 RLZ tosaslax 00B7B0 RLA -tosicmp 00B6BB RLA tosicmp0 00B6B9 RLA -tosorax 00B754 RLA tossuba0 00B836 RLA -tossubax 00B838 RLA tosudiva0 00B86D RLA -tosumoda0 00B8BC RLA udiv16 00B87E RLA -zerobss 008C7F RLA +_bank_bg 008416 RLA _bank_spr 008406 RLA +_bankswitch 0085C3 RLA _delay 0085BB RLA +_main 00B6EB RLA _memfill 00858C RLA +_music_pause 0087A1 REA _music_play 008734 REA +_music_stop 0086F6 REA _oam_clear 0082AF RLA +_oam_hide_rest 008341 RLA _oam_meta_spr 0082F9 RLA +_oam_spr 0082CF RLA _pad_poll 00849B RLA +_pal_bg 00822D RLA _pal_bright 00825F RLA +_pal_spr 008237 RLA _ppu_off 00826D RLA +_ppu_on_all 008283 RLA _ppu_system 008280 RLA +_ppu_waitnmi 00834E RLA _rand8 0084FA RLA +_scroll 0083A7 RLA _set_rand 00850B RLA +_set_vram_update 008510 RLA _sfx_play 00848A RLA +_unrle_vram 008367 RLA _vram_adr 00851A RLA +_vram_fill 008525 RLA _vram_put 008521 RLA +_vram_write 00845A RLA addysp 00B792 RLA +addysp1 00B791 RLA aslax2 00B79F RLA +aslax3 00B7AA RLA aslax4 00B7B8 RLA +asrax1 00B7C9 RLA asrax2 00B7D3 RLA +asrax3 00B7E2 RLA asrax4 00B7F6 RLA +bnega 00B813 RLA booleq 00B8D8 RLA +boolult 00B8F0 RLA callax 00B81D RLA +copydata 00B824 RLA decsp3 00B851 RLA +decsp4 00B85E RLA decsp8 00B86B RLA +incsp2 00B8AE RLA incsp4 00B8BC RLA +incsp8 00B8C1 RLA ldaidx 00B8C6 RLA +negax 00B903 RLA popa 00B923 RLA +popax 00B8A6 RLA popsreg 00B92F RLA +ptr1 0000DF RLZ ptr2 0000E1 RLZ +ptr4 0000E5 RLZ push0 00B955 RLA +pusha 00B943 RLA pusha0 00B957 RLA +pushax 00B959 RLA regsave 0000DB RLZ +shlax2 00B79F RLA shlax4 00B7B8 RLA +shrax3 00B99A RLA shrax4 00B9A8 RLA +sp 0000D7 RLZ sreg 0000D9 RLZ +staspidx 00B9B9 RLA stax0sp 00B9CF RLA +subeqysp 00B9F1 RLA subysp 00BA04 RLA +tmp1 0000E7 RLZ tosaslax 00B96F RLA +tosicmp 00B87A RLA tosicmp0 00B878 RLA +tosorax 00B913 RLA tossuba0 00B9DA RLA +tossubax 00B9DC RLA tosudiva0 00BA11 RLA +tosumoda0 00BA60 RLA udiv16 00BA22 RLA +zerobss 008CB2 RLA Imports list: @@ -176,33 +174,33 @@ __RAM_START__ ([linker generated]): __STARTUP__ (crt0.o): game.o game.s(12) _bank_bg (crt0.o): - game.o game.s(30) + game.o game.s(31) _bank_spr (crt0.o): - game.o game.s(29) + game.o game.s(30) _bankswitch (crt0.o): - game.o game.s(41) + game.o game.s(42) _delay (crt0.o): - game.o game.s(40) + game.o game.s(41) _main (game.o): crt0.o crt0.s(26) _memfill (crt0.o): - game.o game.s(39) + game.o game.s(40) _music_pause (crt0.o): - game.o game.s(25) + game.o game.s(26) _music_play (crt0.o): - game.o game.s(23) -_music_stop (crt0.o): game.o game.s(24) +_music_stop (crt0.o): + game.o game.s(25) _oam_clear (crt0.o): - game.o game.s(18) + game.o game.s(19) _oam_hide_rest (crt0.o): - game.o game.s(21) + game.o game.s(22) _oam_meta_spr (crt0.o): - game.o game.s(20) + game.o game.s(21) _oam_spr (crt0.o): - game.o game.s(19) + game.o game.s(20) _pad_poll (crt0.o): - game.o game.s(27) + game.o game.s(28) _pal_bg (crt0.o): game.o game.s(13) _pal_bright (crt0.o): @@ -213,123 +211,130 @@ _ppu_off (crt0.o): game.o game.s(16) _ppu_on_all (crt0.o): game.o game.s(17) +_ppu_system (crt0.o): + game.o game.s(18) _ppu_waitnmi (crt0.o): - game.o game.s(22) + game.o game.s(23) _rand8 (crt0.o): - game.o game.s(31) + game.o game.s(32) _scroll (crt0.o): - game.o game.s(28) + game.o game.s(29) _set_rand (crt0.o): - game.o game.s(32) -_set_vram_update (crt0.o): game.o game.s(33) +_set_vram_update (crt0.o): + game.o game.s(34) _sfx_play (crt0.o): - game.o game.s(26) + game.o game.s(27) _unrle_vram (crt0.o): - game.o game.s(38) + game.o game.s(39) _vram_adr (crt0.o): - game.o game.s(34) + game.o game.s(35) _vram_fill (crt0.o): - game.o game.s(36) + game.o game.s(37) _vram_put (crt0.o): - game.o game.s(35) + game.o game.s(36) _vram_write (crt0.o): - game.o game.s(37) + game.o game.s(38) addysp (addysp.o): incsp8.o incsp8.s(8) incsp4.o incsp4.s(8) - game.o game.s(12791) + game.o game.s(12909) addysp1 (addysp.o): sub.o sub.s(8) or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(10926) - game.o game.s(11087) - game.o game.s(13128) - game.o game.s(14483) - game.o game.s(15655) - game.o game.s(17606) + game.o game.s(10562) + game.o game.s(10723) + game.o game.s(13260) + game.o game.s(14792) + game.o game.s(14847) + game.o game.s(14882) + game.o game.s(16053) + game.o game.s(18173) aslax3 (aslax3.o): - game.o game.s(10846) - game.o game.s(14492) + game.o game.s(10482) + game.o game.s(14891) aslax4 (aslax4.o): - game.o game.s(10786) - game.o game.s(10938) - game.o game.s(11099) - game.o game.s(11192) - game.o game.s(11823) - game.o game.s(12745) - game.o game.s(12907) - game.o game.s(14783) - game.o game.s(15654) - game.o game.s(16926) - game.o game.s(17600) + game.o game.s(10422) + game.o game.s(10574) + game.o game.s(10735) + game.o game.s(10828) + game.o game.s(11446) + game.o game.s(12863) + game.o game.s(13030) + game.o game.s(14791) + game.o game.s(14846) + game.o game.s(16052) + game.o game.s(17287) + game.o game.s(18167) asrax1 (asrax1.o): - game.o game.s(10477) - game.o game.s(10857) + game.o game.s(10493) + game.o game.s(11964) asrax2 (asrax2.o): - game.o game.s(10482) - game.o game.s(10840) - game.o game.s(12524) - game.o game.s(15712) - game.o game.s(17799) + game.o game.s(10476) + game.o game.s(11969) + game.o game.s(12634) + game.o game.s(13169) + game.o game.s(16109) + game.o game.s(18379) asrax3 (asrax3.o): - game.o game.s(13953) - game.o game.s(16054) + game.o game.s(14179) + game.o game.s(16465) asrax4 (asrax4.o): - game.o game.s(10488) - game.o game.s(12260) - game.o game.s(12523) - game.o game.s(12835) - game.o game.s(15711) - game.o game.s(17798) + game.o game.s(11975) + game.o game.s(12441) + game.o game.s(12633) + game.o game.s(12958) + game.o game.s(16108) + game.o game.s(18378) bnega (bneg.o): - game.o game.s(13343) - game.o game.s(15219) + game.o game.s(13491) + game.o game.s(15555) booleq (makebool.o): - game.o game.s(17682) + game.o game.s(16867) + game.o game.s(18249) boolult (makebool.o): - game.o game.s(16062) + game.o game.s(16473) callax (call.o): - game.o game.s(16815) + game.o game.s(17176) copydata (copydata.o): crt0.o crt0.s(26) decsp3 (decsp3.o): - game.o game.s(10639) - game.o game.s(11954) - game.o game.s(12448) - game.o game.s(14311) - game.o game.s(15251) - game.o game.s(16920) - game.o game.s(17067) - game.o game.s(17241) - game.o game.s(17570) - game.o game.s(18524) + game.o game.s(10117) + game.o game.s(10275) + game.o game.s(12135) + game.o game.s(14537) + game.o game.s(15598) + game.o game.s(17281) + game.o game.s(17428) + game.o game.s(17602) + game.o game.s(18137) + game.o game.s(18978) decsp4 (decsp4.o): - game.o game.s(11790) - game.o game.s(18420) - game.o game.s(18691) + game.o game.s(11413) + game.o game.s(18874) + game.o game.s(19150) decsp8 (decsp8.o): - game.o game.s(18248) + game.o game.s(18640) incsp2 (incsp2.o): popsreg.o popsreg.s(8) - staxspi.o staxspi.s(8) staspidx.o staspidx.s(8) - game.o game.s(11856) + game.o game.s(11479) incsp4 (incsp4.o): - game.o game.s(10293) - game.o game.s(10368) - game.o game.s(16842) + game.o game.s(11780) + game.o game.s(11855) + game.o game.s(17203) incsp8 (incsp8.o): - game.o game.s(10171) + game.o game.s(11658) ldaidx (ldai.o): - game.o game.s(14702) + game.o game.s(15098) negax (neg.o): - game.o game.s(10304) - game.o game.s(10359) - game.o game.s(13815) - game.o game.s(14164) - game.o game.s(15424) + game.o game.s(11791) + game.o game.s(11846) + game.o game.s(14007) + game.o game.s(14390) + game.o game.s(14852) + game.o game.s(15795) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -342,7 +347,6 @@ ptr1 (zeropage.o): zerobss.o zerobss.s(9) umod.o umod.s(9) udiv.o udiv.s(9) - staxspi.o staxspi.s(9) staspidx.o staspidx.s(9) ldai.o ldai.s(8) copydata.o copydata.s(9) @@ -354,63 +358,62 @@ ptr4 (zeropage.o): umod.o umod.s(9) udiv.o udiv.s(9) push0 (pushax.o): - game.o game.s(16859) - game.o game.s(17182) - game.o game.s(18125) - game.o game.s(18685) + game.o game.s(17220) + game.o game.s(17543) + game.o game.s(18570) + game.o game.s(19144) pusha (pusha.o): - game.o game.s(10517) - game.o game.s(10681) - game.o game.s(12249) - game.o game.s(12561) - game.o game.s(12776) - game.o game.s(12924) - game.o game.s(16400) - game.o game.s(16987) - game.o game.s(17877) + game.o game.s(10317) + game.o game.s(12011) + game.o game.s(12430) + game.o game.s(12684) + game.o game.s(12894) + game.o game.s(13047) + game.o game.s(16817) + game.o game.s(17348) + game.o game.s(18453) pusha0 (pushax.o): - game.o game.s(10208) - game.o game.s(10804) - game.o game.s(10881) - game.o game.s(13175) - game.o game.s(14154) - game.o game.s(15320) + game.o game.s(10440) + game.o game.s(10517) + game.o game.s(11695) + game.o game.s(13314) + game.o game.s(14380) + game.o game.s(15691) + game.o game.s(17819) pushax (pushax.o): - game.o game.s(10112) - game.o game.s(10338) - game.o game.s(10474) - game.o game.s(10731) - game.o game.s(11217) - game.o game.s(11663) - game.o game.s(14146) - game.o game.s(14828) - game.o game.s(16137) - game.o game.s(16629) - game.o game.s(16878) - game.o game.s(17039) - game.o game.s(17062) - game.o game.s(17113) - game.o game.s(17204) - game.o game.s(18111) + game.o game.s(10367) + game.o game.s(10853) + game.o game.s(11286) + game.o game.s(11599) + game.o game.s(11825) + game.o game.s(11961) + game.o game.s(14372) + game.o game.s(16548) + game.o game.s(16990) + game.o game.s(17239) + game.o game.s(17400) + game.o game.s(17423) + game.o game.s(17474) + game.o game.s(17565) + game.o game.s(18556) regsave (zeropage.o): game.o game.s(10) shlax2 (aslax2.o): - game.o game.s(16156) + game.o game.s(16567) shlax4 (aslax4.o): - game.o game.s(10054) - game.o game.s(12894) - game.o game.s(15773) + game.o game.s(11541) + game.o game.s(13017) + game.o game.s(16170) shrax3 (shrax3.o): - game.o game.s(15346) + game.o game.s(15717) shrax4 (shrax4.o): - game.o game.s(12843) - game.o game.s(15729) + game.o game.s(12966) + game.o game.s(16126) sp (zeropage.o): popsreg.o popsreg.s(9) subysp.o subysp.s(9) subeqsp.o subeqsp.s(8) sub.o sub.s(9) - staxspi.o staxspi.s(9) staxsp.o staxsp.s(8) staspidx.o staspidx.s(9) pushax.o pushax.s(8) @@ -431,21 +434,18 @@ sreg (zeropage.o): icmp.o icmp.s(9) game.o game.s(10) staspidx (staspidx.o): - game.o game.s(10743) - game.o game.s(11225) - game.o game.s(11671) - game.o game.s(14166) + game.o game.s(10379) + game.o game.s(10861) + game.o game.s(11294) + game.o game.s(14392) stax0sp (staxsp.o): - game.o game.s(11851) - game.o game.s(12657) -staxspidx (staxspi.o): - game.o game.s(14845) + game.o game.s(11474) + game.o game.s(12775) subeqysp (subeqsp.o): - game.o game.s(12648) + game.o game.s(12766) subysp (subysp.o): - game.o game.s(13709) + game.o game.s(13879) tmp1 (zeropage.o): - staxspi.o staxspi.s(9) staspidx.o staspidx.s(9) shrax4.o shrax4.s(8) shrax3.o shrax3.s(8) @@ -461,27 +461,28 @@ tmp1 (zeropage.o): aslax2.o aslax2.s(8) game.o game.s(10) tosaslax (shl.o): - game.o game.s(10891) - game.o game.s(16143) + game.o game.s(10527) + game.o game.s(16554) tosicmp (icmp.o): - game.o game.s(10118) - game.o game.s(10214) - game.o game.s(10344) - game.o game.s(13186) - game.o game.s(15326) + game.o game.s(11605) + game.o game.s(11701) + game.o game.s(11831) + game.o game.s(13325) + game.o game.s(15697) tosicmp0 (icmp.o): - game.o game.s(13747) - game.o game.s(14157) + game.o game.s(13917) + game.o game.s(14383) + game.o game.s(17823) tosorax (or.o): - game.o game.s(10892) + game.o game.s(10528) tossuba0 (sub.o): - game.o game.s(16142) + game.o game.s(16553) tossubax (sub.o): - game.o game.s(10478) + game.o game.s(11965) tosudiva0 (udiv.o): - game.o game.s(10806) + game.o game.s(10442) tosumoda0 (umod.o): - game.o game.s(10817) + game.o game.s(10453) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git a/examples/07_cheril_perils_classic/dev/mainloop.h b/examples/07_cheril_perils_classic/dev/mainloop.h index 70c962b..79c7b2f 100644 --- a/examples/07_cheril_perils_classic/dev/mainloop.h +++ b/examples/07_cheril_perils_classic/dev/mainloop.h @@ -95,6 +95,12 @@ void game_init (void) { #endif #endif + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Clear tile_got persistence + vram_adr (MAP_CLEAR_LIST_ADDRESS); + vram_fill (0, MAP_SIZE*24); + #endif + half_life = 0; frame_counter = 0; olife = oammo = oobjs = okeys = 0xff; @@ -108,9 +114,20 @@ void game_init (void) { } void prepare_scr (void) { - if (!ft) fade_out (); else ft = 0; + if (!ft) { + fade_out (); + ppu_off (); + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Update tile_got persistence + rda = on_pant << 3; + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); + #endif + } else { + ft = 0; + ppu_off (); + } - ppu_off (); + clear_update_list (); #ifdef ENABLE_PROPELLERS // Clear propellers @@ -144,6 +161,12 @@ void prepare_scr (void) { max_chac_chacs = 0; #endif + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Read tile_got persistence + rda = n_pant << 3; + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); + #endif + draw_scr (); #if defined (ENABLE_BREAKABLE) && defined (BREAKABLE_ANIM) @@ -200,7 +223,7 @@ void prepare_scr (void) { #include "my/on_entering_screen.h" gpit = 3; while (gpit --) en_spr_id [gpit] = en_s [gpit]; - + oam_index = 4; prx = px >> FIXBITS; pry = py >> FIXBITS; #if defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS) @@ -208,8 +231,8 @@ void prepare_scr (void) { #endif player_move (); - player_render (); enems_move (); + if (hrt) hotspots_paint (); #ifdef ENABLE_INTERACTIVES @@ -259,51 +282,42 @@ void game_loop (void) { run_script (2 * MAP_SIZE); #endif - warp_to_level = 0; oam_index = 0; ticker = 50; + ntsc_frame = level_reset = warp_to_level = 0; + oam_index = 4; ticker = 50; while (1) { + // Update hud + + #ifdef ACTIVATE_SCRIPTING + if (n_pant != 0xfe && on_pant != 0xfe) + #endif + hud_update (); + // Finish him if (pkill) player_kill (); - if (game_over) break; + if (game_over || level_reset) break; // Flick the screen flick_override = 0; #include "my/custom_flickscreen.h" - #include "mainloop/flickscreen.h" + if (flick_override == 0) { + flickscreen_do_horizontal (); + flickscreen_do_vertical (); + } // Change screen ? - if (on_pant != n_pant && !warp_to_level) { + if (on_pant != n_pant) { prepare_scr (); on_pant = n_pant; } // Relocate player if spawned on a broken tile - #if defined (ENABLE_BREAKABLE) - if (pmayneedrelocation) { - pmayneedrelocation = 0; - gpit = 16; - while (gpit --) { - cx1 = prx >> 4; cx2 = (prx + 7) >> 4; - cy1 = cy2 = (pry + 15) >> 4; - cm_two_points (); - if ((at1 & 8) == 0 && (at2 & 8) == 0) break; - prx += 16; // Try next cell - } - px = prx << FIXBITS; - } - #endif - - // Update hud - - #ifdef ACTIVATE_SCRIPTING - if (n_pant != 0xfe && on_pant != 0xfe) - #endif - hud_update (); + #include "mainloop/relocate_player.h" // Shake the screen ? @@ -311,12 +325,13 @@ void game_loop (void) { #include "mainloop/shaker.h" #endif + // Effects + + #include "my/effects.h" + // Finish frame and wait for NMI - oam_hide_rest (oam_index); - ppu_waitnmi (); - clear_update_list (); - oam_index = 4; + update_cycle (); // Poll pads @@ -326,77 +341,54 @@ void game_loop (void) { // Update actors if not paused... - if (paused == 0) { + ntsc_frame ++; if (ntsc_frame == 6) ntsc_frame = 0; + + if (paused == 0 && (ntsc == 0 || ntsc_frame)) { // Count frames if (ticker) -- ticker; else ticker = 50; half_life ^= 1; ++ frame_counter; - // Timer + // Detect interactions - #ifdef ENABLE_TIMER - #include "mainloop/timer.h" - #endif + #ifdef ENABLE_INTERACTIVES + #include "mainloop/interactives.h" + #endif - // Extra checks + // Update / collide hotspots - #include "my/extra_checks.h" + #include "mainloop/hotspots.h" - // Win level condition + // Automatic scripting calls (USE_ANIM & fire zone) - if ( - #if defined (WIN_LEVEL_CUSTOM) - win_level - #elif defined (ACTIVATE_SCRIPTING) - script_result == 1 - #elif defined (PLAYER_MAX_OBJECTS) - pobjs == PLAYER_MAX_OBJECTS - #elif defined (SCR_END) - ( - n_pant == SCR_END && - ((prx + 8) >> 4) == PLAYER_END_X && - ((pry + 8) >> 4) == PLAYER_END_Y - ) + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" #endif - ) { - music_stop (); - delay (50); - break; - } - - // Warp to level + + // Update player - if (warp_to_level) { - music_stop (); break; + if (!warp_to_level) { + player_move (); } - // Update propellers + // Timer - #ifdef ENABLE_PROPELLERS - if (propellers_on) propellers_do (); + #ifdef ENABLE_TIMER + #include "mainloop/timer.h" #endif - // Detect interactions - - #ifdef ENABLE_INTERACTIVES - #include "mainloop/interactives.h" - #endif - - // Update / collide hotspots + // Extra checks - #include "mainloop/hotspots.h" + #include "my/extra_checks.h" - // Update player + // Win level condition - if (!warp_to_level) { - player_move (); - player_render (); - } + #include "mainloop/win_level_condition.h" - // Automatic scripting calls (USE_ANIM & fire zone) + // Update propellers - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" + #ifdef ENABLE_PROPELLERS + if (propellers_on) propellers_do (); #endif // Update bullets @@ -411,10 +403,21 @@ void game_loop (void) { cocos_do (); #endif + // Paint player + + oam_index_player = oam_index; + if (!warp_to_level) player_render (); + // Update enemies enems_move (); + // Warp to level + + if (warp_to_level) { + update_cycle (); music_stop (); break; + } + // Do resonators #ifdef ENABLE_RESONATORS @@ -454,6 +457,8 @@ void game_loop (void) { #ifdef ENABLE_TILE_CHAC_CHAC chac_chacs_do (); #endif + + #include "my/extra_routines.h" } // Cheat to skip level diff --git a/examples/07_cheril_perils_classic/dev/mainloop/asset_setup.h b/examples/07_cheril_perils_classic/dev/mainloop/asset_setup.h index 53304f8..683f300 100644 --- a/examples/07_cheril_perils_classic/dev/mainloop/asset_setup.h +++ b/examples/07_cheril_perils_classic/dev/mainloop/asset_setup.h @@ -35,6 +35,7 @@ c_max_enems = l_player_max_enems [level]; c_map_w = l_map_w [level]; + c_map_h = l_map_h [level]; #if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) c_interactives = @@ -79,6 +80,7 @@ #endif c_map_w = MAP_W; + c_map_h = MAP_H; #if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) c_interactives = @@ -86,3 +88,5 @@ #endif #endif + +rda = c_map_h; c_map_size = 0; while (rda --) c_map_size += c_map_w; diff --git a/examples/07_cheril_perils_classic/dev/mainloop/flickscreen.h b/examples/07_cheril_perils_classic/dev/mainloop/flickscreen.h index b051cac..fa522be 100644 --- a/examples/07_cheril_perils_classic/dev/mainloop/flickscreen.h +++ b/examples/07_cheril_perils_classic/dev/mainloop/flickscreen.h @@ -4,8 +4,7 @@ // Change screen // Very basic. Extend when needed. -if (flick_override == 0 && warp_to_level == 0) { - +void flickscreen_do_horizontal (void) { if (prx == 4 && #if defined (PLAYER_TOP_DOWN) || !defined (ENABLE_CONVEYORS) pvx < 0 @@ -24,24 +23,30 @@ if (flick_override == 0 && warp_to_level == 0) { ) { ++ n_pant; px = 4 << FIXBITS; + } +} + +void flickscreen_do_vertical (void) { #ifdef PLAYER_TOP_DOWN - } else if (pry <= 16 && pvy < 0) { + if (pry <= 16 && pvy < 0) { n_pant -= c_map_w; py = 192 << FIXBITS; } else if (pry >= 192 && pvy > 0) { n_pant += c_map_w; py = 16 << FIXBITS; + } #else - } else if (pry == 0 && pvy < 0 && n_pant >= c_map_w) { + + if (pry == 0 && pvy < 0 && n_pant >= c_map_w) { n_pant -= c_map_w; py = 192 << FIXBITS; if (pvy > -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - } else if (pry >= 192 && pvy > 0) { + } else if (pry >= 192 && pvy > 0 && n_pant < c_map_size - c_map_w) { n_pant += c_map_w; py = 0; + } + #endif - } - } diff --git a/examples/07_cheril_perils_classic/dev/mainloop/hotspots.h b/examples/07_cheril_perils_classic/dev/mainloop/hotspots.h index c41ce24..a3f0550 100644 --- a/examples/07_cheril_perils_classic/dev/mainloop/hotspots.h +++ b/examples/07_cheril_perils_classic/dev/mainloop/hotspots.h @@ -187,6 +187,7 @@ if (hrt) { ++ pstars; rda = SFX_OBJECT; break; #endif + #include "my/extra_hotspots.h" } if (rda) { sfx_play (rda, 1); diff --git a/examples/07_cheril_perils_classic/dev/mainloop/relocate_player.h b/examples/07_cheril_perils_classic/dev/mainloop/relocate_player.h new file mode 100644 index 0000000..03d4d35 --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/mainloop/relocate_player.h @@ -0,0 +1,19 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Check if the player needs to be relocated after respawning. + + #if defined (DIE_AND_RESPAWN) && defined (ENABLE_BREAKABLE) + if (pmayneedrelocation) { + pmayneedrelocation = 0; + gpit = 16; + while (gpit --) { + cx1 = prx >> 4; cx2 = (prx + 7) >> 4; + cy1 = cy2 = (pry + 15) >> 4; + cm_two_points (); + if ((at1 & 8) == 0 && (at2 & 8) == 0) break; + prx += 16; // Try next cell + } + px = prx << FIXBITS; + } + #endif \ No newline at end of file diff --git a/examples/07_cheril_perils_classic/dev/mainloop/timer.h b/examples/07_cheril_perils_classic/dev/mainloop/timer.h index 57ef5d9..1347ba6 100644 --- a/examples/07_cheril_perils_classic/dev/mainloop/timer.h +++ b/examples/07_cheril_perils_classic/dev/mainloop/timer.h @@ -22,6 +22,8 @@ if (timer_on && timer) { run_script (2 * MAP_SIZE + 3); #endif } + + #include "my/on_timer_tick.h" } } #ifdef TIMER_TIME_FLAG diff --git a/examples/07_cheril_perils_classic/dev/mainloop/win_level_condition.h b/examples/07_cheril_perils_classic/dev/mainloop/win_level_condition.h new file mode 100644 index 0000000..2bc3e46 --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/mainloop/win_level_condition.h @@ -0,0 +1,26 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Win level condition. Note the precedence if severan items are +// #defined: first, WIN_LEVEL_CUSTOM, then ACTIVATE_SCRIPTING (by WIN LEVEL), +// then, ponjs == PLAYER_MAX_OBJECTS, then "ending location" + + if ( + #if defined (WIN_LEVEL_CUSTOM) + win_level + #elif defined (ACTIVATE_SCRIPTING) + script_result == 1 + #elif defined (PLAYER_MAX_OBJECTS) + pobjs == PLAYER_MAX_OBJECTS + #elif defined (SCR_END) + ( + n_pant == SCR_END && + ((prx + 8) >> 4) == PLAYER_END_X && + ((pry + 8) >> 4) == PLAYER_END_Y + ) + #endif + ) { + music_stop (); + delay (50); + break; + } diff --git a/examples/07_cheril_perils_classic/dev/my/custom_center_detections.h b/examples/07_cheril_perils_classic/dev/my/custom_center_detections.h new file mode 100644 index 0000000..963c83d --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/custom_center_detections.h @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// custom_center_detections.h +// at1 constains the tile beh at the center of the player sprite +// For this code to be included, enable CUSTOM_CENTER_DETECTIONS in config.h diff --git a/examples/07_cheril_perils_classic/dev/my/effects.h b/examples/07_cheril_perils_classic/dev/my/effects.h new file mode 100644 index 0000000..333066d --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/effects.h @@ -0,0 +1,5 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Effects - This code gets included right before waiting for next NMI +// Add here palette cycles/etc, splits... diff --git a/examples/07_cheril_perils_classic/dev/my/extra_hotspots.h b/examples/07_cheril_perils_classic/dev/my/extra_hotspots.h new file mode 100644 index 0000000..0ec35ab --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/extra_hotspots.h @@ -0,0 +1,17 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add support for custom hotspots types here. Support for each +// new type of hotspot should be coded in a 'case', like this: + +/* + case HOTSPOT_TYPE_MY_OWN: + rda = SFX_OBJECT; + // do stuff + break; +*/ + +// If rda != 0, the engine will play the sound in rda when getting +// the hotspot. + +// hrt contains the hotspot type, in case you need it. diff --git a/examples/07_cheril_perils_classic/dev/my/extra_modules.h b/examples/07_cheril_perils_classic/dev/my/extra_modules.h new file mode 100644 index 0000000..110e0e3 --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/extra_modules.h @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Extra modules. #include here custom code you write. + +// Ring implementation, Sonic SMS style: diff --git a/examples/07_cheril_perils_classic/dev/my/extra_routines.h b/examples/07_cheril_perils_classic/dev/my/extra_routines.h new file mode 100644 index 0000000..e93f807 --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/extra_routines.h @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Extra routines. +// Add here calls to routines which need to update sprites and/or bg. + \ No newline at end of file diff --git a/examples/07_cheril_perils_classic/dev/my/on_player_coco.h b/examples/07_cheril_perils_classic/dev/my/on_player_coco.h new file mode 100644 index 0000000..12c9eec --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/on_player_coco.h @@ -0,0 +1,11 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by a coco. + +// The default action can be overriden assigning values to flags: +// en_sg_2 controls if player suffers or not. + +// If +// - Player has rings (prings) +// Then create animated ring, but don't hurt the player! diff --git a/examples/07_cheril_perils_classic/dev/my/on_player_hit.h b/examples/07_cheril_perils_classic/dev/my/on_player_hit.h new file mode 100644 index 0000000..ba76abc --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/on_player_hit.h @@ -0,0 +1,13 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by an enemy. + +// The default action can be overriden assigning values to flags: +// en_sg_1 controls if enemy suffers or not. +// en_sg_2 controls if player suffers or not. + +// If: +// - Player will suffer (hit registered, not spinning): en_sg_2 +// - Player has rings (prings) +// Then create animated ring, and simulate hit but don't hurt player! diff --git a/examples/07_cheril_perils_classic/dev/my/on_player_spike.h b/examples/07_cheril_perils_classic/dev/my/on_player_spike.h new file mode 100644 index 0000000..fbb1bc6 --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/on_player_spike.h @@ -0,0 +1,11 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by a killing tile. + +// The default action can be overriden assigning values to flags: +// en_sg_2 controls if player suffers or not. + +// If +// - Player has rings (prings) +// Then create animated ring, but don't hurt the player! diff --git a/examples/07_cheril_perils_classic/dev/my/on_tile_got.h b/examples/07_cheril_perils_classic/dev/my/on_tile_got.h new file mode 100644 index 0000000..dc2066d --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/on_tile_got.h @@ -0,0 +1,7 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. An TILE_GET has just been got. +// You may add checks and set variables and stuff. + +// The value of the tile just got is QTILE (cx1, cy1) diff --git a/examples/07_cheril_perils_classic/dev/my/on_timer_tick.h b/examples/07_cheril_perils_classic/dev/my/on_timer_tick.h new file mode 100644 index 0000000..484f553 --- /dev/null +++ b/examples/07_cheril_perils_classic/dev/my/on_timer_tick.h @@ -0,0 +1,5 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Timer has ticked (a second passed) +// timer_zero equals 1 if timer == 0. diff --git a/examples/07_cheril_perils_classic/dev/neslib.h b/examples/07_cheril_perils_classic/dev/neslib.h index 46c73fb..f4ac0a8 100644 --- a/examples/07_cheril_perils_classic/dev/neslib.h +++ b/examples/07_cheril_perils_classic/dev/neslib.h @@ -47,9 +47,9 @@ void __fastcall__ ppu_on_spr(void); //set PPU_MASK directly -;void __fastcall__ ppu_mask(unsigned char mask); - +void __fastcall__ ppu_mask(unsigned char mask); +unsigned char __fastcall__ ppu_system(void); //clear OAM buffer, all the sprites are hidden @@ -121,6 +121,7 @@ unsigned char __fastcall__ pad_state(unsigned char pad); void __fastcall__ scroll(unsigned int x,unsigned int y); +void __fastcall__ split(unsigned int x,unsigned int y); //select current chr bank for sprites, 0..1 diff --git a/examples/07_cheril_perils_classic/dev/neslib.s b/examples/07_cheril_perils_classic/dev/neslib.s index 80898c2..dd0a181 100644 --- a/examples/07_cheril_perils_classic/dev/neslib.s +++ b/examples/07_cheril_perils_classic/dev/neslib.s @@ -4,11 +4,11 @@ .export _pal_all,_pal_bg,_pal_spr,_pal_col,_pal_clear,_pal_bright - .export _ppu_off,_ppu_on_all,_ppu_on_bg,_ppu_on_spr,_ppu_mask + .export _ppu_off,_ppu_on_all,_ppu_on_bg,_ppu_on_spr,_ppu_mask, _ppu_system .export _oam_clear,_oam_size,_oam_spr,_oam_meta_spr,_oam_hide_rest .export _ppu_waitnmi .export _unrle_vram - .export _scroll + .export _scroll, _split .export _bank_spr,_bank_bg .export _vram_read,_vram_write .export _music_play,_music_stop,_music_pause @@ -225,7 +225,11 @@ _ppu_off: sta PPU_MASK rts +;unsigned char __fastcall__ ppu_system(void); +_ppu_system: + lda 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 (;4hrNT9kIUQDb3p0$qr!`T`dh>`VFf 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 a?tgrMf9}`krV3wX8?x`(+AQ0c{eJ*<=O>Z? delta 18042 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 diff --git a/examples/08_cheril_the_writer/dev/cart.nes b/examples/08_cheril_the_writer/dev/cart.nes index c15c199ca29282db767f542c269c1960852f8238..c0df76e3a61e36e1fe673bfdd3af13db303156fd 100644 GIT binary patch delta 18670 zcmb_@349dAw)bqE2_Zlti^JZ?8Uzz%iwd$%7HC$%6?OEQD?xF2US$(H5Gs(!z{Ek4 z=mUp=igaWkfcgx$px$66Y=eLx$RZ{o(SUs+DyZD~{-=8;85V!{d*AO1Ojp;bQ>Us< zopb8cscKi2#fASbw0mN)IBBuCWwE$zxmaJJ7+94O&8qWRcWKsQZ;59QH;HR=ywg0# z#I<=SH7QqF2i8$BI0X^^rIuf%<)sy-@iqxI)ymC*DCyiH>CZ)8!wR#gn4E1!@J<1< zw0Eo8+h{Cz+e|}DcUQV6n>zL1%b4wxBaF3Yog7+ivp69eFXvbrr%`lp6QIp(T1K4U zE-=}Xt18x*Ok43ZYEJ{6Ys@BIWy`d%DwnCIIuCCS);Xt(2Sv-+ZS?5AwaVSb+$T0R zn^$F;bUb&OInlJ(@1ARZVEAG`i_c3i3Y}SJ-a6q=q^%tyfL#D=1a<9a5?}lSk4b;< zE*P~odfwG(5Z!0Zy<0B!uZR+zQKHW(qN@8=OV8$E5am-XJ)#Sil!$j%N~hf~TkOWS z-DQ@pch)Qs)g>7n9AXX1)FlqqA*Z8*wasY^V*JPa|E5wMURH3)DHiXVQ zYv{i_N-zbL0iV z&gYEYA>xm@uI65YFU2Sp&};qh0Ww7lVVtK*K+r((OrfD_Kygd^A)4dY;55$I$t*WMjO@JY_qJ! z7Ec>Xe9^{@3xGU30@)pi9u)U`p0|~VM;ChZ7k}U0wpmA`Xvo_d;~Z)SIo%P_q<+_6PpoRvNZ;>Yb=hH+P=QMP4k6D zxn41|^NL}k*P_Pc*H;Aos5xI5_;pvlDp2k>hi`y2&6a6&4zSL!We#NZiXqd=&hvDS zA-~??yVvTERy!flaPB3Xq1WMXu15KOv;>R}v6r8(_L%akc!4c5DY-7T)R-*S#o<|J zTn6Y=JRnYMVqB(LTjt%YJ}>hpcD`b3eaW(|_2QMqY^notRmJSme7|CG{>@yH)YkVm zv-ref-_vGsC&N1^Nwb^|CWyOd$j1Dt3dNjX1s3F2l_(Bz zIYVue+2MtXi5-v;AFlLTq@K)YGHatWnK4SUHcGILk04H5TecBQGM5yJFI4j3#UmI7 zV{{p7+3=hZyw+n7k5)FJ%h%BAt8tb0Wp?l(L7Y~R(-70Ep}4`8(MKZy>msrd+%C?l zRAR)jdu*9;tgm>|8HN<;5b2~7_4|l#SFrk=^BSqQE5y_aTSh%g&C4K2A2GiI)}>z7 zO6fhuWu)?y4XI_5t<1h5rEGYxC$+@)7a!PgJ5jcUNqV25OY_6 z%<{7J;ve4~5yMO+N1v z!}{<9;&)~gOOQTTxqA#BR6ID$5{z$9&S0-$U9Dq7IvCv3Qj_lJjdd@beYQ{Wa~ty^l{ZItVc4T)tvEt)(gCX=pKq6)2c=RG}vo+AFfB*CaYuhlBG zaJxE=Ud^RZ-0nB3_xWnvTUz&c7$8faJwRqP7S9-!iem#-CC-*%XLh}I3}Dd#i_%^L zsI5`ImEWXxLZv=_i#kNgc>@@215fc3e_M6B(oS0PhPz*zjy*KVL9mk^YvC#sYVOg?=H>$~V!f#^gE6EKa{g+WiJWn+Mt`3C=GpN?+%f7Ug#5 z*A}Ip^N@wQXbiL?j40HbgnCLl=gStQtutFIv;;&djK?rPg_iivS(58ar6zAsoaiqV zl=jYEmX`b^8^lks!I(=s|H0k1?GU-v68H)%o+Si!(Oh+Kvpx!hLg~rwRV-|19!vM{ za+#%et00^AveEqB;-Mkgyfsvm$T7+Ti_nwJyvy)cw{+G zXLdzk&{%(*s|Qa_1CLm$dr#Yza)vn&v%#*6D9SKPyWD)V|JHz6yttf?X19yKtl*Gl zQ$kmWY#&UR$(E785_mc~A-&)h2l$oAWYH@WD@^DvC;?u(lNnb=NRKRuGy<%i_YvyT zc!OpGpzM&^Dp>Za#3sQP&sSocwJfm&4qKj|C;EE^gqj3t@G6>9QS8Q~`&YRy#oi`w zSye(RI8l>Em|;%_q;Wi-qP9SrQ)vE$O6jnUH0c_o2@a1{Zx~GT2%*=B{-lR)0=H$h zBJNJ~tERZ*M&uVNWskY3q8L#ShBsDBidLh%hCFGFA3QN?315x%17yqRhh7L(R^fb^=j!KtNH5W>XFceg7Q%Sj!LdBkaAb^ zg5>H^EQQ<4Q%VJHmkL+&6p~w8MhXr2g-TG7Q?Y)DZTIN8RIGH!gciG0@l#sq(y-8# z%y1}1=7GMgQ=+ksqepp5yg_9bTb1*sgHIJlX2abSeNO1wRCo<+9MmtCobrLLT0`-e5MLL7mMJqoo+@r!?0WH?Uc|*o| zEOMivCsv{={a(OFLsLRtfw~66s~IJ|jW%VGrHg;A=4t9ca(()FOwib8;BqNvbiXT2 z_q(n_TQch-{VpY1N-Km_N*CP)#IE$!{Eh^(+5l35at1s^FNw6|bCO)KBy=+=*<<)u zl}k`bk2fTh?YJznG@hh4v7ef_e9f{WS_^p+8I>0cH`Q3mj$FY?$GFg%o2Gb ztgUQhi8D&n$*}eV;a_0cnK2$XyNVeQNd5tG zr>R8i-@bdTr76k?XNncw8;b5Fs4zELvDgMeAM(~iT!Y)`v|G7026Pol7{+vtu{wNN zLTJePi2n;D7YR(JiNGt<_(jsEWfIiusZ%ety#Ti-WT~z3lv#bDEmMHNEZABv9e9gc zzIL`CcTKwl>7}G+Sc zaWlRH7BW+3X%dg?CRE!VU#4X-G#gE9X{zuel<4{zHw-2ua}X>|1Ti)eZ-bx+;o)8@ ztdPSEIywLsS^aMDkdPfnZF{8gFRM`s4SH2ovCv22`Ei4JF0$f&W*gX|o z1V=-l3}CI^TzNrbjZsts?rUtQhUNyy_OlCB&f<<|naRh)aTNI)sud}n|XPZYeRJ{}962|2fmQ(WN*AG|1GnTq|m8YG5 zSUfROVg)3^w43u{Jd1soE$U$36^k0R|B6L=%8R_eMd_^fS}wZJ?Ob9k!NjV_W%ZR>4K**qg^S&hC1)0nM)G z^5(#3-akQ9`|C}`(fZ!h)Q!#bTCX+JKOqjTe2N+cDv(OPSse#5ahUC(;*lO)uhFEb zcOX+j8w;Jjwm)m4Ki-DkYhwVn4ANpEzC}8`o^N*#>)xSd5;hzA*K;QV9zD6o{Y3X3 zvbV9xRkjQlMDNXve3oCFkKG*g#l`X?MI1s&9K9K9IqH|N0jU38NzTACSy1a88?ei& z`!h{3)CEgsM6h9eLNsw2hCv%d$&`REKW{xj(e z=i?KMT74rnP)4>@17S?fFh?ecJ}}n#&FH`xC>irmet_S|2i6&0B+E+h@a)LfOpmtv zolN_B3aQXOEWH0UOIxVf*g#iwI~L)W&1gphi2?0pLW2Gh?m1D>T=ts`fvtz|jGcTd8Ln*{H|8inz}UQeQu#!+2O908VNPho%)bG%i7Uyd`4J7f3Dk-g zB((AiuFjDRi{jJ4u|SL$LYMOs8&s zp0^oG-M95hG`{7Y((5)nU+L8wGTDM}v}LS-K~yqU!X&Qn8~DmP<0M-1T6vA2wIXLF zoP^cVgYTlyh{9nswJ01GDs0dS$%tMjf|K>BZ?pmY4O_-W$gMj=VFUR9VPF6@bpOU; zh_H*oe44ONViO^w+I-siL=uqOrElM*Qd?$pNX3BzfL4foJPA)UYzNiDz7=MMgdP%# zr&(IRk>mtR45GStVlWBdNB98Z~kMIc^$tgO?2{$Dvva(N70{G5Spw-F3g4!tY4qMGb~n+}GuP95TqpN9$i0!{=7nsv zHmlm6gye|xz^%ME(3-!iwt~DUMwu<=%dx9BvJdqc4jWl=qYB7lLQHTZ{K7^bCm|L_ zw*WCzGP++WsA;FgEEW&=ClD8DQVG=Oc5V;!=37)j=}drC!kgHSl#+myf^sP~=Lu$8 zX8TsIu~bZI=Owjs$0c-^^)jO?MoKS1BX|gG4S&m)u?ER%_C7CQA2^zV8mEiTL&Iq+;^ zZUtYW9o>WqKMWTxrEM|Cqp9M@;WDO`<%G**a)Q4I7v^e(*mOIvTZ>_fDC{{Wq$Jrn z6cnEu%HcrUAwIu}EKV-V)96OV8HxcAL_74;L!n`*1DMX9X2I1?We?~x1R2D+-%n90ZdI^XHNm>> zA-T5@S{RUq@J%b04&r+RHU~-TC^nbB>fUnut@3S~ zah7719^LFG!~4Q!e;Xu8Tco91XmI>heVt~r6-~NRp%d67di`vnF0lllEQ}(KW)KOK z>U{_Y8j7AV@OjDAuen;{uxTC){cCICbXCla6lY3-NLZL$C+Ba9PKYBQUO@1s!8ISWrF>!bD?=Q~s1XZs7~c=gSx$y<@e; zmI2MAfU`!nSc%bw6&?c3g)+-)uw^6?!(XUWlGtoa#8KLchjive?A8rh=nJq=gaUU3 z@-nYn6QKb0dD;v;ZrG4mBtL1WNfo!fr)z(6pYmk55iM|F*jnGrs43V3)HG?>Ped{b z*A)QgulfbmRP(8W&naJxkr<>Z8p$Hik1l%LAbCiLO4xgBBSS!sJz6u3PxG5y% zB`Rk3TX*!3Ul-V`WyJ!UUA6-9S(Y!bxn-*aHm~e0fxT8%Ah7vmYXr8S%pik!%T_rDiu3hK&j~|7;nRE!E33!x6SBRG34B(B?2_ z!$yV5@~AAAzY6iar4+%_Ck+YY<+15XkUavwbqjQ$>~T8w$=a$semygxO;|F1vOpcR zNUXgq=7deom_rVQ(ki*yuAef{adOPodRxX^I-kBa?%NcZJ&ZuY5nw(T8Fn4ClTSzE zgLb0(p{<>M#MKtA8ay5xakUCZ1W26>()**fLM9&L3$ZNCkv`wb=c3oTXa7-Uf{{H) zLHtgbYKz)VoA5Y1qtzIUvqE5xNJl>knUa;;G*hx;n`TPn4>VJ9;6o|!5m28or~;z# z>V15nEn^N8Q^x2t-JApG;I;BOfmrl7q+Oaq&INoy`CJVi(kbW%^>U#!cN??~eiXR) z%qBkDmhqqq$8i~pr2QXpDR3LlLNp;u`d}M}b>K4e6T`N!k#uxtVWY&UYxrzJT~VIR zS5_~XM82`emnPR)*wRwd?qz(bKfssO1+{`caJK@IuwAj(GM2KXxCue!ccNT(%c9|y zC1Ev?mvL7)HHyo?-{Q=AhTBx5<8p=&vH{X&E6he2Yc=Bzj; zG{(6+SIEN{`+lJJNe*|4_8F1m0C$az+@+(%6d*)$L1T+{Ufnp*%kSg%V+b!y7x55O zY}$=Cjy0v{__P@TIhv>RoRBs{?aXtF^Ju^{hjs>aY8)^|pm#33E26%lE8(mbaKWyW zv`aIgqGtBdr9LF|SXE^4eU$LUYFociorry_S&IA6Z$>iaL+RxY zahTbeFH8?6Yic*Ye6DH+6q>KEH9*h`Nj2w{&$+&kE{_pD&(h9FvT#OX1H~9pV^pCM zS=VSHYLZ@}_H3lD7AQFo;8l4U|5*h$nVT)1P z3@aqmTFOEDbMQ7F+Kr>ekz`PB8mrY0wZf)zT7>CD(sbjquTdp-m0_MLV4ukHQ-pqKM*CP7o+`tApCe zZ~qV6iwHkL+uh8@%@V9K8H>mb2dZ+>d)$^0^6TJf@Oijt2B+lrFj({d8VfYXNKhWWc@(@HpxVAtC1 zU2g-1`eBwgdOVQ~C&G4Y=!a`osTOw<(BsRM8xrNRSqAn9=F|!WX@w~+!Ah)YmbB+1 z{-7=65%vi7IFA%n2-<3AmOAg?k6{jw&^{fBM^6^2&!86wl~VjtzZ>#^4u}OHxq2>Z zfHfByT&BQ%7@ZeoSlQ%CbWMq(-5jllV(UG`S;VqXJXgQh6|#$n=Y@=10eO`PI_>zz z#%wojY&?RZa%c*YsJl8A^^y4F#o-^Vqqgw1487yiZ%WG)7!&Haw)Ebl-z7P;2mQ-_ zLjovJtNS9FOGLqUcqi~9z*6mn0zQkikR-Ci=pVH%m(O+4Yd93Gb+c51&@7-}y`Dsd zR-V>8lgBmB1iXBd z%Z~kV02|xdM2BHy6;yDEbyn!UoA=}+^DfIIe{+3Rey?$3-%R!=e|o8wGH3t zykxVYF z^J5Tcw*=Rk6jS3s#b>gyQ|hC%W(mql#H4WvV(=>L3;HM>0QqkXf{SZPb3j_j0Bvss z(U@BS^63qb-C;twZ)nSmhv?zTTQ}O>hp%jA(;g^vWmB64o$b^c6Ug4eps|g}zY;QC zv>Ap?NeG*IX^{pl<*T6$9f3T~s%hpMc^PiHDHgrI*5Vx|$)5nBA<&5s+!yX^*Eh-N zxPX#Sh}Xdj0z-=51U}uREZ^hm%lBY?L{Pz5>rNcrP96q%*J9VeMEI@CHPOg8)S(^0 zzU1mX6j?Gl_#O&KIBUs#<75M~hqE~6c}q#-Smx7MLio_kWv^aw zp0g0KXRfe4ls;&v2jabX8_z#Gb<0d_w-rh}3KXe6Cix;nI=o^-qLR> zuG&er@AS)xuw&Grt5?K>>qGI-%#W<$?%~@xWVfHIw@0zTj^Jj}wwK$DtYFN38 zN#d%V{6n;G$>Y0V!Lrt{+o$TO^IsOjx0I3YV!Es9v7dL^~0+5zELQfzdPNT#%;kOQ>#RGl|LUt)?yx88)?OIeO1*@X? zT%jhZydq$hrAN!f5x8@#@etytolxazAJ`B(2|@=|fY9a0@Hy32q`eh%rX|*{qD$D1 zmTR{u(<04xk_Ij)|H?%#6r!ON15UFl&7A30WvL(=& zzoWK?E7cZtpvZJ>0DN1^-a-C%?Mi`85;qROT&Wz8-^6_Ak}=R37cTiGTm@wn zkaY^dqB`w5aF3x!xeS~rR|1|bOS{vh&?ao`i*;;MW4C(HC|j1ArBnaJOFI|6fOQBd zL?Zx!8xxO}Zwfq&rg68Fr6|Mbf?zG}&9&{tCOG4y)OttAHkbo)M_-EIZ-F0PgK^VU>#I4Ub?w##daX6y63;HB(P0=#6d)#S9iT~4YPD(BzEueH^i34}%>rF~_Y3}*z^%S?0dcZ8bZwGVdB3q+ z`dypuUife4EP;6bc%TJ;0)DasI&H*SOax7(_fZVd8W`f6V8vP5cq?qHPqMDvPIze1BNf*JG7JLDWAherW>90(17Ig^%nY$4bOE; zr753lzN+r1!h%0sSpvI`rApee7&0EU1h95X#Ahqf*>|%6$MjTN#H__mgBe}_k^u?j zGQQ5(q3iYu@L-m%+aE)>hkZ;FU~tyZ1?e4H75bE;qzUvJ~OH~zVc`sF!*qT19o#CiR zvlV7k;WJwq-{a13XrIt&U(q$b-jLG)h>SPjBh?KJYS&%SuGqr5=#6<^gWmx6IHy5+ zz2Z#P-y3Ewi@RLh07_b>>Fs7&`DQ>37A}BgiGr0?j5s39bC5B4uHK;FdORZf=b_LS zuxR`YM>@zFJce4e#n$@#3l)K1YtGmF98hZ-0zW%=6+Sb1{LFyY zR69HtTov;~IacBc>IRbrYJnlzR`^gtYd!=IVL>He^JF!bC7hN&7j2awBUSgMK z{Qc6*zh7Jys4w9c9Vo%KOf?$d7XsMQgPF#(JUk8fjKgd27~-o~Lq%SERS9p9?!bjn z>a~jgRXftCbL<>GCSo-+@WBCHv{&; zaqZN{muPb@t*wk%7WXF(^>xWv7WiG8@RWv`;S{eoNhmZK!}Ta zhV?a#nsqE`(7PQ*pljO8bS$qSIXxH>@AM!9e1|)L(FkF0e53eachXJE~PaJsPHL9l9xxT&5rgYn%1g@K}jFMmDo z5ak{`^y8tz!<~=pI6}E2N1l|wIrYseN3R^EZ2U3XvChXv9h-EFa!Hf+j^BH9uOaFF zz5m3Up>)#Tb)oz=$|pJSr1bv1N+{i_rMY|eQCgafCzY=brOWpor2H;};ef%gdw2Oi zzijqJwA(ax+rW!^AIhCRW#v=3j_KJ?{_XFJ9Jv#wI49hH|HF<6D}%AYy}=e2_co?2 zTkQ+RcHZZ%9XmsKZQs@Ez3yq_5>21&bLWifW%_BKd-J%vnpyV;+jiZ5b@M)V-MHbY z5AIL6bI6E$vWMK6(0{oW&7PPNPU}C><@PMX8+Yu``un?)Xew;!M45d`|Gr0bcgI_^oU**dhHk;y(rlH zi37prGjFJU^^g6ZMf|;kKgwQp9dJ(=pDgV>FnZ+O18z@991u#;x%iz2g7JGpzwePY z1?1e=`?xVKN}-n;X`U|i>eu2CP1V!>vKfnanpej@^n`DT-le>mX2I^mAC z4;&1($~YK|`p3ah&J<^wQ*vG{47f*3oYHb5sCVdkfpRE ze*gRY)uMy$4wFWWnvL28`2D}9?zNLTb&IV2+jZoA`}*q3U%S7b)WNMziZWjvc*yK`b_q~^runx z3*hNL!zWwDj2XkGPrv%uA$R`dHZd0t1w%jgmdS%}>u@-nZA{~%4+rA`kH1|@-PS3c zWyj%Qi{~}eyfL|B@)wWE%^Tx%jaYQ`!lA5wxp(C!2><)B?)?Y##_!(yAdxD16#AjI-rx{}^Qv@Z(&Nsm>Ip4S+nA$5wf4%zTH(74q)ZX|d+!A#(*!$X_yLRgB zF{i#E@YPe_yy5OPZK(UI%Es`WPOz zWA1-W>praWu~lMGH*t;jxH^hTCLMbi{}vo`9ou>A;IZUyr+z#0+n2vB{`T;iA3DCh#{XapH(9gVAU(z|iBVCEJyUy2i0D0h4)v2qe+MP~3-R|^` zQxBcVI|E{dm(Hx$(vQzv(9$Dktlty-`uu071E&cdPQO2Gmd_C2;^{V8+VjldGpT3R zoEE>Iq7k_J`)9Ru$@d>>>6-5k+%z917*0X>rgV*G2b`t$!fE;s^86nN@YD~hwAA;* zX)WFT!(}avuNqxN<$bHBYiYQFaQasbEvkN_dVTf#)#cSgYLuFe=l)&&V$Io_spnp) zdRL>fqH33xek)fsucihrR`t-*VbxD)>4fSRwKUvNIQ^>z4TiMS51*cSdj9FA*etc$j z^MS&JCob%{Q2BGBTB!c1KK8GQe{H;Y@5P}%ul>30r57(9yL4y6@`iH_kNxt_Fa3Vq z_UoYEe7_}KcIUr(m&J6Y(-rquuMT|5WR9{}g7jzX(4&3#drsVQV%~`kCmuO57XR{2 z^gS{2#80(9)xP;-huVs|PisG|eeTD9oqMP5#}hxE==)veiJ0&9{j~2VUjNEZgX+!n zcgx9z-<|qy?01{LqkgwMIqy67L$iCvBwrbRW%QM?S0-H9zI66b!Scb?U;cD|^;$}7 g%pWm-Ec(Oz=Y0Hgw_otA@L852>z3`UvW!{(2SH33u>b%7 delta 17940 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 diff --git a/examples/08_cheril_the_writer/dev/config.h b/examples/08_cheril_the_writer/dev/config.h index a9dcf7d..f2a88b7 100644 --- a/examples/08_cheril_the_writer/dev/config.h +++ b/examples/08_cheril_the_writer/dev/config.h @@ -6,6 +6,10 @@ //#define GAME_AREA_BOTTOM #define GAME_AREA_CUSTOM +#define MAP_CLEAR_LIST_ADDRESS 0x2c40 // To store map persistence in VRAM. + // Each screen takes 24 bytes. move it where + // It fits. Below 2c40 you may "see" the buffer + // ============================================================================ // I. General configuration // ============================================================================ @@ -123,17 +127,19 @@ //#define DEACTIVATE_KEYS // If defined, keys are not present. #define DEACTIVATE_OBJECTS // If defined, objects are not present. -//#define PLAYER_BOUNCES +//#define PLAYER_BOUNCES 16 //#define DOUBLE_BOUNCE -#define DIE_AND_RESPAWN // If defined, dying = respawn on latest safe. -//#define DIE_AND_REENTER // Reenter screen on death -#define PLAYER_FLICKERS // If defined, collisions make player flicker instead. -//#define WALLS_STOP_ENEMIES // If defined, enemies react to the scenary +#define DIE_AND_RESPAWN // If defined, dying = respawn on latest safe. + //#define DIE_AND_REENTER // ... also, reenter screen on death + //#define DIE_AND_REINIT // ... or start the level over! +#define PLAYER_FLICKERS 100 // If defined, collisions make player flicker for N frames +//#define WALLS_STOP_ENEMIES // If defined, enemies react to the scenary // Extra special tiles // ------------------- -#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically +//#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically +//#define CUSTOM_CENTER_DETECTIONS // Define this if you need custom tile behs // Quicksands, beh == 2. // For player movement values, see section 4 @@ -142,14 +148,14 @@ #define ENABLE_QUICKSANDS // Breakable, beh & 16 -//#define ENABLE_BREAKABLE // Breakable walls -#define BREAKABLE_LIFE 2 // Amount of hits to break wall -#define BREAKABLE_ANIM // Show explosion when breaking -#define BREAKABLE_MAX 4 // Max # of concurrent explosions -#define BREAKABLE_MAX_FRAMES 8 // Frames to show explosion -#define BREAKABLE_ERASE 0 // Tile to erase broken tiles -#define BREAKABLE_BREAKING 8 // Tile to display while breaking -//#define BREAKABLE_WALKABLE // If defined (side view), tiles break when stepped on +//#define ENABLE_BREAKABLE // Breakable walls +#define BREAKABLE_LIFE 2 // Amount of hits to break wall +#define BREAKABLE_ANIM // Show explosion when breaking +#define BREAKABLE_MAX 4 // Max # of concurrent explosions +#define BREAKABLE_MAX_FRAMES 8 // Frames to show explosion +#define BREAKABLE_ERASE 0 // Tile to erase broken tiles +#define BREAKABLE_BREAKING 8 // Tile to display while breaking +//#define BREAKABLE_WALKABLE // If defined (side view), tiles break when stepped on // Conveyors, beh & 32 [+1] (must be & 8!) // For player movement values, see section 4 @@ -167,6 +173,17 @@ #define ENABLE_LADDERS +// Special, "collectable" map tiles. +// beh == 34 + +//#define ENABLE_TILE_GET +//#define PERSISTENT_TILE_GET + +// Trampolines. Needs PLAYER_VY_TRAMPOLINE +// beh == 66 + +//#define ENABLE_TRAMPOLINES + // Extra special stuff // ------------------- @@ -252,10 +269,15 @@ #define ENEMS_IN_CHRROM // Enems are stored somewhere in CHR-ROM #define ENEMS_LIFE_GAUGE 1 // Amount of shots/punches/kicks needed to kill enemies. +//#define NEEDS_LIFE_GAUGE_LOGIC // This is activated automaticly when needed, but you can + // do it yourself if you need it to do customs... + //#define ENEMS_FLICKER // Ifdef: flicker, if not: explosion //#define ENEMS_FLICKER_ONLY_ON_DYING // Flicker, but only when life == 0 //#define ENEMS_CAN_RESPAWN // Read docs for this. +//#define ENEMS_TREMBLE // Make enemies tremble when hit + #define PERSISTENT_ENEMIES #define PERSISTENT_DEATHS @@ -273,10 +295,11 @@ // Beware: only activate this if enemies are killable by any means: //#define ENEMIES_SUFFER_ON_PLAYER_COLLISION -// Fanties / Homing fanties +// Fanties / Homing fanties / Timed fanties #define ENABLE_FANTY //#define ENABLE_HOMING_FANTY +//#define ENABLE_TIMED_FANTY #define FANTY_BASE_SPRID 32 #define FANTY_WITH_FACING @@ -286,10 +309,13 @@ #define FANTY_A 4 #define FANTY_MAXV 48 +//#define FANTY_FAST_ANIM // If defined, cells A/B are changed every frame (for transparency effects) #define FANTY_DISTANCE 80 #define FANTY_V_RETREAT 16 +#define FANTY_BASE_TIMER 120 // Timed fanties use this + // Pursuers (for top-down) //#define ENABLE_PURSUERS // If defined, type 7 enemies are active @@ -366,6 +392,24 @@ #define COMPILED_ENEMS_SHOOT #define COMPILED_ENEMS_BASE_SPRID 48 +// Boioiongs + +//#define ENABLE_BOIOIONG +#define BOIOIONG_G 16 +#define BOIOIONG_VY_MAX 256 +#define BOIOIONG_BASE_SPRID 54 +//#define BOIOIONG_ACTIVE_BY_DEFAULT // Define and they are active by default +//#define BOIOIONG_INITIAL_TIMER 200 // If active by default, time to be active in frames +//#define BOIOIONG_AUTO_RESPAWN + +// Catacrocks + +//#define ENABLE_CATACROCKS +#define CATACROCK_G 16 +#define CATACROCK_MAX_V 256 +#define CATACROCK_CROCK_FRAMES 50 +#define CATACROCK_BASE_SPRID 50 + // Cocos will get enabled automaticly on choosing monococos or shooties. //#define ENABLE_COCOS @@ -461,16 +505,23 @@ // Side view: // ---------- +// Choose ONE or SEVERAL of those. +// If you choose several, use the vertical_engine_type variable to select + #define PLAYER_HAS_JUMP // If defined, player is able to jump. -//#define PLAYER_JUMP_TYPE_MK2 // Use MK2 method for jump / gravity / release //#define PLAYER_AUTO_JUMP // Automatic jump when hitting the floor //#define PLAYER_SWIMS // If defined, player swims a la Ninjajar! //#define PLAYER_HAS_JETPAC // If defined, player can thrust a vertical jetpac + +// Extra configuration for side view: + +//#define PLAYER_JUMP_TYPE_MK2 // Use MK2 method for jump / gravity / release #define PLAYER_STEPS_ON_ENEMS // If defined, stepping on enemies kills them -//#define PLAYER_STEPS_STRICT // Only registers advantage hit when pvy > PLAYER_VY_FALLING_MIN -//#define PLAYER_SAFE_LANDING // Step over vertical inverts direction +//#define PLAYER_STEPS_STRICT // Only registers advantage hit when pvy > PLAYER_VY_FALLING_MIN +//#define PLAYER_SAFE_LANDING // Step over vertical inverts direction //#define PLAYER_STEPS_MIN_KILLABLE 0xff // Only kill enemies with id >= PLAYER_STEPS_MIN_KILLABLE // 0xff = Nobody +//#define PLAYER_SPINS // Spins on DOWN and JUMP and kills baddies // ============================================================================ // III. Screen configuration @@ -588,6 +639,9 @@ #define CELL_WALK_INIT 1 #define CELL_WALK_CYCLE 1 #define CELL_AIRBORNE 5 + + #define CELL_SPIN_CYCLE 5 + #define CELL_ASCENDING 5 #define CELL_DESCENDING 6 @@ -598,6 +652,8 @@ #define CELL_PUNCHING 8 #define CELL_KICKING 9 + #define CELL_HIT 9 + #define CELL_CLIMB_CYCLE 25 #define CELL_CLIMB_HALF 29 #endif @@ -613,6 +669,7 @@ #define SFX_TILE 1 #define SFX_OBJECT 2 #define SFX_USE 3 +#define SFX_TRAMPOLINE 3 #define SFX_PHIT 4 #define SFX_DUMMY1 5 #define SFX_ENHIT 6 @@ -627,3 +684,5 @@ #define SFX_STEPON 15 #define SFX_FLOAT 16 #define SFX_BREAKB 17 +#define SFX_RING 18 +#define SFX_FANFARE 19 diff --git a/examples/08_cheril_the_writer/dev/crt0.s b/examples/08_cheril_the_writer/dev/crt0.s index 3151b83..dce496d 100644 --- a/examples/08_cheril_the_writer/dev/crt0.s +++ b/examples/08_cheril_the_writer/dev/crt0.s @@ -20,7 +20,7 @@ FT_SFX_STREAMS =4 ;number of sound effects played at once, can be 4 or less (f .define FT_DPCM_ENABLE 0 ;zero to exclude all the DMC code .define FT_SFX_ENABLE 1 ;zero to exclude all the sound effects code -.define SPEED_FIX 1 ;zero if you want to handle PAL/NTSC speed difference by yourself +.define SPEED_FIX 0 ;zero if you want to handle PAL/NTSC speed difference by yourself .export _exit,__STARTUP__:absolute=1 .import push0,popa,popax,_main,zerobss,copydata @@ -71,6 +71,8 @@ RAND_SEED =$1a ;word PALUPDATE =$1c TEMP =$1d +SCROLL_X1 =$1e ;Added by mojon twins +PPU_CTRL_VAR1=$1f ;Added by mojon twins PAD_BUF =TEMP+1 diff --git a/examples/08_cheril_the_writer/dev/definitions.h b/examples/08_cheril_the_writer/dev/definitions.h index fbf256b..9d02020 100644 --- a/examples/08_cheril_the_writer/dev/definitions.h +++ b/examples/08_cheril_the_writer/dev/definitions.h @@ -50,3 +50,10 @@ #define EN_STATE_DEAD 1 #define EN_STATE_SPAWNING 2 + +// Vertical engine type for side_view + +#define ENGINE_TYPE_JUMP 0 +#define ENGINE_TYPE_JET_PAC 1 +#define ENGINE_TYPE_SWIM 2 +#define ENGINE_TYPE_AUTO_JUMP 3 diff --git a/examples/08_cheril_the_writer/dev/engine/cocos.h b/examples/08_cheril_the_writer/dev/engine/cocos.h index 5547eed..f6fbfd8 100644 --- a/examples/08_cheril_the_writer/dev/engine/cocos.h +++ b/examples/08_cheril_the_writer/dev/engine/cocos.h @@ -17,7 +17,12 @@ void cocos_init (void) { void cocos_shoot_aimed (void) { rdct = distance (); - if (rdct > COCO_FAIR_D && coco_slots_i) { + #ifdef COCO_FAIR_D + if (rdct > COCO_FAIR_D && coco_slots_i) + #else + if (coco_slots_i) + #endif + { -- coco_slots_i; coco_it = coco_slots [coco_slots_i]; coco_x [coco_it] = rdx << 6; @@ -86,13 +91,15 @@ void cocos_do (void) { #endif // Collide w/player - if (pstate == EST_NORMAL && + if (pflickering == 0 && rdx + 7 >= prx && rdx <= prx + 7 && rdy + 7 + PLAYER_COLLISION_VSTRETCH_FG >= pry && rdy <= pry + 12 ) { - pkill = 1; + en_sg_2 = 1; + #include "my/on_player_coco.h" + pkill = !!en_sg_2; cocos_destroy (); } } diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_boioiong.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_boioiong.h new file mode 100644 index 0000000..dc438f6 --- /dev/null +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_boioiong.h @@ -0,0 +1,78 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Boioiongs bounce around the screen until a timer exhausts. + +if (_en_ct) { + _en_ct --; + + // Vertical movement & collision + // ----------------------------- + + _enf_vy += BOIOIONG_G; if (_enf_vy > BOIOIONG_VY_MAX) _enf_vy = BOIOIONG_VY_MAX; + _enf_y += _enf_vy; + + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > (192 << FIXBITS)) _enf_y = (192 << FIXBITS); + + _en_y = _enf_y >> FIXBITS; _en_x = _enf_x >> FIXBITS; + + cx1 = _en_x >> 4; cx2 = (_en_x + 15) >> 4; rda = 0; + + if (_enf_vy > 0) { + cy1 = cy2 = (_en_y + 15) >> 4; + rda = 13; rds = -16; + } else if (_enf_vy < 0) { + cy1 = cy2 = _en_y >> 4; + rda = 9; rds = 16; + } + + if (rda) { + cm_two_points (); + if ((at1 & rda) || (at2 & rda)) { + _en_y = rds + (cy1 << 4); + _enf_vy = -_enf_vy; + } + } + + _enf_y = _en_y << FIXBITS; + + // Horizontal movement & collision + // ------------------------------- + + _enf_x += _enf_vx; + _en_x = _enf_x >> FIXBITS; + + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > (240 << FIXBITS)) _enf_x = (240 << FIXBITS); + + cy1 = _en_y >> 4; cy2 = (_en_y + 15) >> 4; rda = 0; + + if (_enf_vx) { + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 15) >> 4; rds = -16; + } else { + cx1 = cx2 = _en_x >> 4; rds = 16; + } + + cm_two_points (); + if ((at1 & 9) || (at2 & 9)) { + _en_x = rds + (cx1 << 4); + _enf_vx = -_enf_vx; + } + } + + _enf_x = _en_x << FIXBITS; + + // Sprite + + if (_en_ct > 50 || half_life) { + en_spr = _en_s + ((frame_counter >> 2) & 1); + } +} +#ifdef BOIOIONG_AUTO_RESPAWN +else { + _en_x = _en_x1; _en_y = _en_y1; + enems_boioiong_init (); +} +#endif diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_catacrock.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_catacrock.h new file mode 100644 index 0000000..701d9fd --- /dev/null +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_catacrock.h @@ -0,0 +1,37 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Appear, fall, and catacrock. + +switch (_en_state) { + case 0: + // Idling. + if (_en_ct) _en_ct --; else { + _en_state = 1; + _enf_y = _en_y << FIXBITS; _enf_vy = 0; + } + break; + + case 1: + // Falling + _enf_vy += CATACROCK_G; if (_enf_vy > CATACROCK_MAX_V) _enf_vy = CATACROCK_MAX_V; + _enf_y += _enf_vy; _en_y = _enf_y >> FIXBITS; + + if (_en_y > _en_y2) { + _en_state = 2; + _en_ct = CATACROCK_CROCK_FRAMES; + _en_y = _en_y2; + } + break; + + case 2: + // Catacrock + if (_en_ct) _en_ct --; else { + _en_state = 0; + _en_ct = CATACROCK_WAIT; + _en_y = _en_y1; + } + +} + +en_spr = _en_state + CATACROCK_BASE_SPRID; diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_chac_chac.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_chac_chac.h index 769d8f8..a8f8cb2 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_chac_chac.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_chac_chac.h @@ -2,14 +2,15 @@ // Copyleft Mojon Twins 2013, 2015, 2017, 2018 // CHAC CHAC! +// DEPRECATED -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Wait for idle. if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1); _en_mx = CHAC_CHAC_IDLE_2; - en_alive [gpit] = 1; + _en_state = 1; } break; case 1: @@ -17,7 +18,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 3); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 2; + _en_state = 2; } break; case 2: @@ -25,7 +26,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 5, CHAC_CHAC_BASE_TILE + 4, CHAC_CHAC_BASE_TILE + 5); _en_mx = CHAC_CHAC_IDLE_4; - en_alive [gpit] = 3; + _en_state = 3; sfx_play (SFX_STEPON, 1); shaker_ct = 8; } @@ -35,7 +36,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 3); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 4; + _en_state = 4; } break; case 4: @@ -43,7 +44,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 5; + _en_state = 5; } break; case 5: @@ -51,7 +52,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6); _en_mx = _en_my; - en_alive [gpit] = 0; + _en_state = 0; } break; } diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_compiled.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_compiled.h index 050e80c..39cab39 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_compiled.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_compiled.h @@ -6,15 +6,9 @@ // needs endx [8], endy [8] from precalcs.h if (_en_ct) { - // Do - - switch (en_alive [gpit]) { + switch (_en_state) { case 0: // Idling - - // Idle animation, cells 2, 3. - en_spr = _en_s + _en_facing + 2 + - ((frame_counter >> 3) & 1); break; case 1: // Moving @@ -23,8 +17,6 @@ if (_en_ct) { rdx = _en_x; _en_x += _en_mx; rdy = _en_y; _en_y += _en_my; - // Moving animation, cells 0, 1. - en_spr = _en_s + _en_facing + en_fr; break; } @@ -35,42 +27,64 @@ if (_en_ct) { // the whole array and that a proper RETURN is issued! rda = *en_behptr [gpit] ++; - en_alive [gpit] = 0; - + _en_state = 0; + rdc = (rda & 0x38) >> 3; rdt = rda & 0x07; switch (rda & 0xc0) { // Command case 0x00: - // IDLE - rdb = 1; while (rdt --) rdb += 25; - _en_ct = rdb; + // IDLE / EXTERN + if (rdt == 0) { + // EXTERN + do_extern_action (*en_behptr [gpit] ++); + } else { + // IDLE + rdb = 0; while (rdt --) rdb += 25; + _en_ct = rdb; + en_rawv [gpit] = _en_s + 2 + _en_facing; + } break; case 0x40: // ADVANCE - _en_mx = endx [rdc]; _en_my = endy [rdc]; + _en_mx = endx [rdc] << _en_x1; _en_my = endy [rdc] << _en_x1; - rda = (_en_mx < 0); enems_facing (); - if (_en_mx < 0) _en_facing = 4; else if (_en_mx > 0) _en_facing = 0; // If _en_mx == 0, no change! + en_rawv [gpit] = _en_s + _en_facing; - _en_ct = rdt << 4; en_alive [gpit] = 1; + _en_ct = (rdt << 4) >> _en_x1; _en_state = 1; break; case 0x80: - // FIRE - rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); + // FIRE & SPEED + rdb = rda & 0x3f; + if (rdb > 0x3b) { + // SPEED + _en_x1 =0x3f - rda; // 0 for 1, 1 for 2, 2 for 4, 3 for 8 + } else { + // FIRE + rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); + } + break; case 0xC0: // RETURN en_behptr [gpit] -= ((rda & 0x3f) + 1); + break; } - - en_spr = _en_s + _en_facing; } +en_spr = en_rawv [gpit]; +switch (_en_state) { + case 0: + en_spr += ((frame_counter >> 3) & 1); + break; + case 1: + en_spr += en_fr; + break; +} diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_fanty.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_fanty.h index b835c1e..2e15f02 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_fanty.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_fanty.h @@ -1,101 +1,101 @@ // NES MK1 v1.0 // Copyleft Mojon Twins 2013, 2015, 2017, 2018 -// Fanties - -#ifdef FANTY_KILLED_BY_TILE - #define FANTY_OBSTACLE(a) ((a)>1) -#else - #define FANTY_OBSTACLE(a) (a) -#endif - -// Modify v - -if (px < _enf_x) { - _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; -} else { - _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; -} - -if (py < _enf_y) { - _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; -} else { - _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; -} - -// Horizontal - -_enf_x += _enf_vx; -if (_enf_x < 0) _enf_x = 0; -if (_enf_x > 15360) _enf_x = 15360; -_en_x = _enf_x >> 6; - -#ifdef FANTY_COLLIDES - - if (_enf_vx) { - cy1 = (_en_y + 4) >> 4; - cy2 = (_en_y + 11) >> 4; + // Fanties + + // Modify v - if (_enf_vx > 0) { - cx1 = cx2 = (_en_x + 11) >> 4; - rda = ((cx2 - 1) << 4) + 4; - } else { - cx1 = cx2 = (_en_x + 4) >> 4; - rda = ((cx1 + 1) << 4) - 4; - } - cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vx = -_enf_vx; - _en_x = rda; - _enf_x = rda << 6; - } + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; } -#endif + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } -// Vertical - -_enf_y += _enf_vy; -if (_enf_y < 0) _enf_y = 0; -if (_enf_y > 11264) _enf_y = 11264; -_en_y = _enf_y >> 6; + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } + } -#ifdef FANTY_COLLIDES + #endif - if (_enf_vy) { - cx1 = (_en_x + 4) >> 4; - cx2 = (_en_x + 11) >> 4; + // Vertical - if (_enf_vy > 0) { - cy1 = cy2 = (_en_y + 11) >> 4; - rda = ((cy2 - 1) << 4) + 4; - } else { - cy1 = cy2 = (_en_y + 4) >> 4; - rda = ((cy1 + 1) << 4) - 4; + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } } + #endif + + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vy = -_enf_vy; - _en_y = rda; - _enf_y = rda << 6; + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); } - } + #endif +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; #endif -#ifdef FANTY_KILLED_BY_TILE - cx1 = (_en_x + 8) >> 4; - cy1 = (_en_y + 8) >> 4; - cm_two_points (); - if (at1 & 1) { - en_cttouched [gpit] = 8; - enems_kill (); - } -#endif - -en_fr = (_en_x >> 3) & 1; - #ifdef FANTY_WITH_FACING //_en_facing = ((_en_x < prx) ? 0 : 4); rda = (prx < _en_x); enems_facing (); @@ -103,3 +103,4 @@ en_fr = (_en_x >> 3) & 1; #else en_spr = _en_s + en_fr; #endif + diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_homing_fanty.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_homing_fanty.h index cba1185..b45aab0 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_homing_fanty.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_homing_fanty.h @@ -3,125 +3,125 @@ // Fanties that have a home -#ifdef FANTY_KILLED_BY_TILE - #define FANTY_OBSTACLE(a) ((a)>1) -#else - #define FANTY_OBSTACLE(a) (a) -#endif - -// Precalc distance -rdx = _en_x; rdy = _en_y; rdt = distance (); - -// Modify v - always upon state - -switch (en_alive [gpit]) { - case 0: - // Retreating - _enf_vx = ADD_SIGN2 (_en_x1, _en_x, FANTY_V_RETREAT); - _enf_vy = ADD_SIGN2 (_en_y1, _en_y, FANTY_V_RETREAT); - if (rdt < FANTY_DISTANCE) en_alive [gpit] = 1; - break; - case 1: - // Pursuing - if (px < _enf_x) { - _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; - } else { - _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; - } + // Precalc distance + rdx = _en_x; rdy = _en_y; rdt = distance (); + + // Modify v + + switch (_en_state) { + case 0: + // Retreating + _enf_vx = ADD_SIGN2 (_en_x1, _en_x, FANTY_V_RETREAT); + _enf_vy = ADD_SIGN2 (_en_y1, _en_y, FANTY_V_RETREAT); + if (rdt < FANTY_DISTANCE) _en_state = 1; + break; + case 1: + // Pursuing + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; + } + + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } + + if (rdt > FANTY_DISTANCE) { + // Adjust to pixel + _enf_x = _en_x << FIXBITS; + _enf_y = _en_y << FIXBITS; + _en_state = 0; + } + break; + } - if (py < _enf_y) { - _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; - } else { - _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } } - if (rdt > FANTY_DISTANCE) { - // Adjust to pixel - _enf_x = _en_x << FIXBITS; - _enf_y = _en_y << FIXBITS; - en_alive [gpit] = 0; + #endif + + // Vertical + + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } } - break; -} - -// Horizontal -_enf_x += _enf_vx; -if (_enf_x < 0) _enf_x = 0; -if (_enf_x > 15360) _enf_x = 15360; -_en_x = _enf_x >> 6; + #endif -#ifdef FANTY_COLLIDES - - if (_enf_vx) { - cy1 = (_en_y + 4) >> 4; - cy2 = (_en_y + 11) >> 4; - - if (_enf_vx > 0) { - cx1 = cx2 = (_en_x + 11) >> 4; - rda = ((cx2 - 1) << 4) + 4; - } else { - cx1 = cx2 = (_en_x + 4) >> 4; - rda = ((cx1 + 1) << 4) - 4; - } + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vx = -_enf_vx; - _en_x = rda; - _enf_x = rda << FIXBITS; + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); } - } - -#endif - -// Vertical + #endif -_enf_y += _enf_vy; -if (_enf_y < 0) _enf_y = 0; -if (_enf_y > 11264) _enf_y = 11264; -_en_y = _enf_y >> 6; - -#ifdef FANTY_COLLIDES - - if (_enf_vy) { - cx1 = (_en_x + 4) >> 4; - cx2 = (_en_x + 11) >> 4; - - if (_enf_vy > 0) { - cy1 = cy2 = (_en_y + 11) >> 4; - rda = ((cy2 - 1) << 4) + 4; - } else { - cy1 = cy2 = (_en_y + 4) >> 4; - rda = ((cy1 + 1) << 4) - 4; - } - - cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vy = -_enf_vy; - _en_y = rda; - _enf_y = rda << FIXBITS; - } - } - -#endif - -#ifdef FANTY_KILLED_BY_TILE - cx1 = (_en_x + 8) >> 4; - cy1 = (_en_y + 8) >> 4; - cm_two_points (); - if (at1 & 1) { - en_cttouched [gpit] = 8; - enems_kill (); - } +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; #endif -en_fr = (_en_x >> 3) & 1; - #ifdef FANTY_WITH_FACING //_en_facing = ((_en_x < prx) ? 0 : 4); rda = (prx < _en_x); enems_facing (); - en_spr = FANTY_BASE_SPRID + en_fr + _en_facing; + en_spr = _en_s + en_fr + _en_facing; #else - en_spr = FANTY_BASE_SPRID + en_fr; + en_spr = _en_s + en_fr; #endif diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_linear.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_linear.h index b52a7f3..917a549 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_linear.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_linear.h @@ -46,13 +46,29 @@ if (!en_status [gpit] || half_life) { // Change direction ? - #ifdef WALLS_STOP_ENEMIES - if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; - if (_en_y == _en_y1 || _en_y == _en_y2 || en_colly) _en_my = -_en_my; - #else - if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; - if (_en_y == _en_y1 || _en_y == _en_y2) _en_my = -_en_my; - #endif + #ifdef PLAYER_SAFE_LANDING + #ifdef WALLS_STOP_ENEMIES + if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; + #else + if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; + #endif + #ifdef WALLS_STOP_ENEMIES + if (en_colly) _en_my = -_en_my; + else + #endif + { + if (_en_y <= _en_y1) { _en_y = _en_y1; _en_my = ABS (_en_my); } + else if (_en_y >= _en_y2) { _en_y = _en_y2; _en_my = -ABS (_en_my); } + } + #else + #ifdef WALLS_STOP_ENEMIES + if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; + if (_en_y == _en_y1 || _en_y == _en_y2 || en_colly) _en_my = -_en_my; + #else + if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; + if (_en_y == _en_y1 || _en_y == _en_y2) _en_my = -_en_my; + #endif + #endif } //_en_facing = (_en_mx > 0 || _en_my > 0) ? 0 : 4; diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_monococo.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_monococo.h index d2bd1f9..d457ba3 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_monococo.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_monococo.h @@ -4,12 +4,12 @@ // mx is state. my is counter. // Counter & state change --- MONOCOCO_COUNTER; if (!MONOCOCO_COUNTER) { - MONOCOCO_STATE = (MONOCOCO_STATE + 1) & 3; MONOCOCO_COUNTER = monococo_state_times [MONOCOCO_STATE] - (rand8 () & 0x15); +-- _en_ct; if (!_en_ct) { + _en_state = (_en_state + 1) & 3; _en_ct = monococo_state_times [_en_state] - (rand8 () & 0x15); } // Shoot -if (MONOCOCO_STATE == 2 && MONOCOCO_COUNTER == MONOCOCO_FIRE_COCO_AT) { +if (_en_state == 2 && _en_ct == MONOCOCO_FIRE_COCO_AT) { rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); } @@ -18,14 +18,14 @@ if (MONOCOCO_STATE == 2 && MONOCOCO_COUNTER == MONOCOCO_FIRE_COCO_AT) { rda = (prx < rdx); enems_facing (); #ifdef MONOCOCO_TYPE_A if ( - ((MONOCOCO_STATE == 1 || MONOCOCO_STATE == 3) && half_life) || - MONOCOCO_STATE == 2 + ((_en_state == 1 || _en_state == 3) && half_life) || + _en_state == 2 ) { en_spr = MONOCOCO_BASE_SPRID + _en_facing + ((frame_counter >> 5) & 1); } #else en_spr = MONOCOCO_BASE_SPRID + _en_facing; - switch (MONOCOCO_STATE) { + switch (_en_state) { case 0: en_spr += 9; break; diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_pezon.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_pezon.h index b739b68..9288bb2 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_pezon.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_pezon.h @@ -10,12 +10,12 @@ oam_index = oam_meta_spr ( spr_enems [ENEMS_OCCLUDING_CELL] ); -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Idling if (_en_mx) { -- _en_mx; } else { - en_alive [gpit] = 1; + _en_state = 1; _enf_y = _en_y1 << 6; _enf_vy = -PEZON_THRUST; sfx_play (SFX_FLOAT, 1); @@ -29,7 +29,7 @@ switch (en_alive [gpit]) { _en_y = _enf_y >> 6; if (_en_y >= _en_y1) { - en_alive [gpit] = 0; + _en_state = 0; _en_mx = _en_my; } else { diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_punchy.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_punchy.h index 2ac8139..3cdc71e 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_punchy.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_punchy.h @@ -23,7 +23,13 @@ if (_en_t & 0x40) { sfx_play (SFX_HITTER, 1); // Collide w/player - if (pstate == EST_NORMAL && + if ( + #ifdef PLAYER_FLICKERS + !pflickering && + #endif + #ifdef PLAYER_BOUNCES + !pbouncing && + #endif rdx + 7 >= prx && rdx <= prx + 7 && rdy + 7 + PLAYER_COLLISION_VSTRETCH_FG >= pry && rdy <= pry + 13 diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_pursuers.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_pursuers.h index 7ada650..fe6da73 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_pursuers.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_pursuers.h @@ -3,14 +3,14 @@ // Pursuing enemies -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // IDLE if (_en_ct) { -- _en_ct; _en_y = 240; } else { - en_alive [gpit] = 1; + _en_state = 1; _en_x = _en_x1; _en_y = _en_y1; en_rawv [gpit] = 1 << (rand8 () % 5); @@ -22,12 +22,12 @@ switch (en_alive [gpit]) { case 1: // Appearing en_spr = ENEMS_EXPLODING_CELL; - if (_en_ct) -- _en_ct; else en_alive [gpit] = 2; + if (_en_ct) -- _en_ct; else _en_state = 2; break; case 2: // Pursuing - if (pstate == EST_NORMAL && (!en_status [gpit] || half_life)) { + if (pflickering == 0 && pbouncing == 0 && (!en_status [gpit] || half_life)) { _en_mx = add_sign (((prx >> 2) << 2) - _en_x, en_rawv [gpit]); _en_my = add_sign (((pry >> 2) << 2) - _en_y, en_rawv [gpit]); diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_saw.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_saw.h index 241c928..dc1df35 100644 --- a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_saw.h +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_saw.h @@ -8,18 +8,18 @@ rda = (_en_x1 == _en_x2); -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Idling. Goes from 2->1 (backwards). if (rda) { _en_y -= _en_mx; if (_en_y == _en_y1) { - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; } } else { _en_x -= _en_mx; if (_en_x == _en_x1) { - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; } } @@ -34,7 +34,7 @@ switch (en_alive [gpit]) { _en_y += _en_my; } } else { - en_alive [gpit] = 2; + _en_state = 2; } } break; @@ -42,13 +42,13 @@ switch (en_alive [gpit]) { if (rda) { _en_y += _en_mx; if (_en_y == _en_y2) { - en_alive [gpit] = 3; + _en_state = 3; _en_ct = SAW_EMERGING_STEPS; } } else { _en_x += _en_mx; if (_en_x == _en_x2) { - en_alive [gpit] = 3; + _en_state = 3; _en_ct = SAW_EMERGING_STEPS; } } @@ -63,7 +63,7 @@ switch (en_alive [gpit]) { _en_y -= _en_my; } } else { - en_alive [gpit] = 0; + _en_state = 0; } } break; diff --git a/examples/08_cheril_the_writer/dev/engine/enemmods/enem_timed_fanty.h b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_timed_fanty.h new file mode 100644 index 0000000..4528fcf --- /dev/null +++ b/examples/08_cheril_the_writer/dev/engine/enemmods/enem_timed_fanty.h @@ -0,0 +1,109 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Timed fanties + +if (_en_ct) _en_ct --; else { + + // Modify v + + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; + } + + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } + + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } + } + + #endif + + // Vertical + + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } + } + + #endif + + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; + cm_two_points (); + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); + } + #endif +} + +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; +#endif + +#ifdef FANTY_WITH_FACING + //_en_facing = ((_en_x < prx) ? 0 : 4); + rda = (prx < _en_x); enems_facing (); + en_spr = _en_s + en_fr + _en_facing; +#else + en_spr = _en_s + en_fr; +#endif + diff --git a/examples/08_cheril_the_writer/dev/engine/enengine.h b/examples/08_cheril_the_writer/dev/engine/enengine.h index e8db546..6b60bae 100644 --- a/examples/08_cheril_the_writer/dev/engine/enengine.h +++ b/examples/08_cheril_the_writer/dev/engine/enengine.h @@ -138,12 +138,36 @@ void enems_update_unsigned_char_arrays (void) { __asm__ ("lda %v", _en_facing); __asm__ ("sta %v, y", en_facing); + + __asm__ ("lda %v", _en_state); + __asm__ ("sta %v, y", en_state); + + #ifdef ENEMS_NEED_FP + enf_x [gpit] = _enf_x; enf_vx [gpit] = _enf_vx; + enf_y [gpit] = _enf_y; enf_vy [gpit] = _enf_vy; + #endif } -void enems_facing () { +void enems_facing (void) { _en_facing = rda << 2; } +void enems_init_fp (void) { + _enf_x = _en_x << 6; + _enf_y = _en_y << 6; +} + +void enems_boioiong_init (void) { + enems_init_fp (); + _enf_vy = 0; + _enf_vx = ADD_SIGN2 (_en_x2, _en_x1, rdm << FIXBITS); + #ifdef BOIOIONG_ACTIVE_BY_DEFAULT + _en_ct = BOIOIONG_INITIAL_TIMER; + #else + _en_ct = 0; + #endif +} + void enems_load (void) { #ifdef ENEMS_IN_CHRROM @@ -180,7 +204,7 @@ void enems_load (void) { _en_t = VRAM_READ; // General... - en_alive [gpit] = 0; + _en_state = 0; // YX1 rda = VRAM_READ; @@ -200,7 +224,7 @@ void enems_load (void) { SET_FROM_PTR (_en_t, gp_gen); gp_gen ++; // General... - en_alive [gpit] = 0; + _en_state = 0; // YX1 // rda = *gp_gen ++; @@ -298,17 +322,20 @@ void enems_load (void) { break; #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) + #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_TIMED_FANTY) case 6: // Fantys - enf_x [gpit] = _en_x << 6; - enf_y [gpit] = _en_y << 6; - enf_vx [gpit] = enf_vy [gpit] = 0; + enems_init_fp (); + _enf_vx = _enf_vy = 0; + #ifdef ENABLE_TIMED_FANTY + _en_ct = FANTY_BASE_TIMER; + #endif + _en_s = FANTY_BASE_SPRID; break; #endif - #ifdef ENABLE_PURSUERS + #ifdef ENABLE_PURSUERS case 7: // Pursuers _en_ct = DEATH_COUNT_EXPRESSION; @@ -344,7 +371,7 @@ void enems_load (void) { _en_my = rda; // EMERGING SENSE _en_mx = rdb; // MOVING SENSE - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; break; @@ -377,10 +404,33 @@ void enems_load (void) { #ifdef ENABLE_MONOCOCOS case 11: // Monococos - _en_mx = 0; _en_my = MONOCOCO_BASE_TIME_HIDDEN - (rand8 () & 0x15); + _en_state = 0; _en_ct = MONOCOCO_BASE_TIME_HIDDEN - (rand8 () & 0x15); _en_s = MONOCOCO_BASE_SPRID; break; - #endif + #endif + + #ifdef ENABLE_CATACROCKS + case 12: + // Catacrocks + enems_init_fp (); + _en_state = 0; + CATACROCK_WAIT = _en_ct = rdm << 5; + break; + #endif + + #ifdef ENABLE_BOIOIONG + case 13: + // Boioiongs + #ifdef PERSISTENT_ENEMIES + // Initialize position from ROM + _en_x = _en_x1; + _en_y = _en_y1; + #endif + enems_boioiong_init (); + _en_mx = rdm; // Store + _en_s = BOIOIONG_BASE_SPRID; + break; + #endif #ifdef ENABLE_COMPILED_ENEMS case 20: @@ -390,8 +440,9 @@ void enems_load (void) { _en_y = _en_y1; #endif _en_ct = 0; - _en_s = COMPILED_ENEMS_BASE_SPRID; + en_rawv [gpit] = _en_s = COMPILED_ENEMS_BASE_SPRID; en_behptr [gpit] = en_behptrs [rda]; + _en_x1 = 1; // Repurpose for speed break; #endif @@ -457,7 +508,7 @@ void enems_load (void) { { #ifdef ENABLE_PURSUERS if (_en_t == 7) { - en_alive [gpit] = 0; + _en_state = 0; _en_ct = DEATH_COUNT_EXPRESSION; #ifdef NEEDS_LIFE_GAUGE_LOGIC en_life [gpit] = ENEMS_LIFE_GAUGE; @@ -523,21 +574,23 @@ void enems_move (void) { __asm__ ("lda %v, y", en_facing); __asm__ ("sta %v", _en_facing); - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) + __asm__ ("lda %v, y", en_state); + __asm__ ("sta %v", _en_state); + + #ifdef ENEMS_NEED_FP _enf_x = enf_x [gpit]; _enf_vx = enf_vx [gpit]; - #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_PEZONS) _enf_y = enf_y [gpit]; _enf_vy = enf_vy [gpit]; #endif if (_en_t == 0) continue; en_is_alive = !(en_flags [gpit] & EN_STATE_DEAD); - + // Clear selected sprite // Means don't render (can/will be overwritten): en_spr = 0xff; // "touched" state control + en_spr_x_mod = 0; #ifdef ENEMS_MAY_DIE if (en_cttouched [gpit]) { @@ -557,16 +610,22 @@ void enems_move (void) { en_spr = en_spr_id [gpit]; } #else + rda = frame_counter & 0xf; oam_index = oam_meta_spr ( - _en_x, _en_y + SPRITE_ADJUST, + _en_x + jitter [rda], + _en_y + jitter [15 - rda] + SPRITE_ADJUST, oam_index, spr_enems [ENEMS_EXPLODING_CELL] ); #ifndef ENEMS_EXPLODING_CELLS_HIDES - en_spr = en_spr_id [gpit]; + if (en_life [gpit]) en_spr = en_spr_id [gpit]; #endif #endif + #ifdef ENEMS_TREMBLE + en_spr_x_mod = half_life; + #endif + #ifdef ENEMS_RECOIL_ON_HIT #include "engine/enemmods/enems_recoiling.h" #endif @@ -635,6 +694,12 @@ void enems_move (void) { break; #endif + #ifdef ENABLE_TIMED_FANTY + case 6: + #include "engine/enemmods/enem_timed_fanty.h" + break; + #endif + #ifdef ENABLE_PURSUERS case 7: #include "engine/enemmods/enem_pursuers.h" @@ -665,6 +730,18 @@ void enems_move (void) { break; #endif + #ifdef ENABLE_CATACROCKS + case 12: + #include "engine/enemmods/enem_catacrock.h" + break; + #endif + + #ifdef ENABLE_BOIOIONG + case 13: + #include "engine/enemmods/enem_boioiong.h" + break; + #endif + #ifdef ENABLE_SIMPLE_WARPERS case 0x3f: en_spr = SIMPLE_WARPERS_BASE_SPRID; @@ -695,6 +772,7 @@ void enems_move (void) { n_pant = _en_mx; on_pant = 0xff; prx = _en_x2; px = prx << FIXBITS; pry = _en_y2; py = pry << FIXBITS; + player_stop (); #if defined (SIMPLE_WARPERS_FIRE_BUTTON) && (defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS)) phitteract = 0; @@ -740,23 +818,30 @@ void enems_move (void) { pvy = 0; } } + + #ifdef PLAYER_SPINS + if (pgotten) pspin = 0; + #endif #endif // Is enemy collidable? If not, exit if ( en_is_alive == 0 // General condition. + #ifdef ENEMS_MAY_DIE + || en_cttouched [gpit] + #endif #ifndef PLAYER_TOP_DOWN || _en_t == 4 #endif #ifdef ENABLE_PURSUERS - || (_en_t == 7 && en_alive [gpit] != 2) + || (_en_t == 7 && _en_state != 2) #endif #ifdef ENABLE_SAW - || (_en_t == 8 && en_alive [gpit] != 2) + || (_en_t == 8 && _en_state != 2) #endif #ifdef ENABLE_PEZONS - || (_en_t == 9 && en_alive [gpit] == 0) + || (_en_t == 9 && _en_state == 0) #endif #ifdef ENABLE_CHAC_CHAC || _en_t == 10 @@ -764,6 +849,12 @@ void enems_move (void) { #ifdef ENABLE_MONOCOCOS || (_en_t == 11 && _en_mx != 2) #endif + #ifdef ENABLE_CATACROCKS + || (_en_t == 12 && _en_state != 1) + #endif + #ifdef ENABLE_BOIOIONG + || (_en_t == 13 && _en_ct == 0) + #endif ) goto skipdo; // Collide with player (includes step over enemy) @@ -827,30 +918,68 @@ void enems_move (void) { _en_t != 5 && #endif touched == 0 && - pstate == EST_NORMAL && collide () ) { - #ifdef PLAYER_BOUNCES - pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); _en_mx = ADD_SIGN (_en_x - prx, ABS (_en_mx)); - pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); if (!_en_mx) _en_my = ADD_SIGN (_en_y - pry, ABS (_en_my)); - #endif - - #if defined ENEMIES_SUFFER_ON_PLAYER_COLLISION - enems_hit (); + // en_sg_1 => kill enemy + #ifdef ENEMIES_SUFFER_ON_PLAYER_COLLISION + en_sg_1 = 1; + #else + en_sg_1 = 0; #endif + + // en_sg_2 => kill player. + en_sg_2 = (pflickering == 0); #ifdef ENABLE_RESONATORS + // If resonators are on and not a saw, don't kill player if ( - res_on == 0 + res_on == 1 #ifdef ENABLE_SAW - || _en_t == 8 + && _en_t != 8 #endif - ) + ) en_sg_2 = 0; #endif - { - pkill = 1; - touched = 1; + + #ifdef PLAYER_SPINS + // If spinning and not a saw or a steady shooter + // kill enemy, don't kill player + if (pspin + #ifndef STEADY_SHOOTER_KILLABLE + && _en_t != 5 + #endif + #ifdef ENABLE_SAW + && _en_t != 8 + #endif + ) { + en_sg_2 = 0; + en_sg_1 = 1; + pvy = -pvy; + sfx_play (SFX_STEPON, 1); + } + #endif + + #include "my/on_player_hit.h" + + #ifdef ENEMS_MAY_DIE + if (en_sg_1) enems_hit (); + #endif + if (en_sg_2) { + pkill = 1; + #if defined (PLAYER_BOUNCES) && !defined (DIE_AND_RESPAWN) + pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); + pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); + + #ifdef ENABLE_COMPILED_ENEMS + if (_en_t != 20) + #endif + { + if (!_en_mx) _en_my = ADD_SIGN (_en_y - pry, ABS (_en_my)); + _en_mx = ADD_SIGN (_en_x - prx, ABS (_en_mx)); + } + + #endif } + touched = 1; } // Is enemy killable? If not, exit @@ -902,7 +1031,7 @@ void enems_move (void) { // Bullets bi = MAX_BULLETS; while (bi --) if (bst [bi]) { #ifdef ENABLE_PURSUERS - if (_en_t != 7 || en_alive [gpit] == 2) + if (_en_t != 7 || _en_state == 2) #endif if (collide_in (bx [bi] + 3, by [bi] + 3, _en_x, _en_y)) { @@ -950,8 +1079,7 @@ void enems_move (void) { _en_y = en_resy [gpit]; _en_my = en_resmy [gpit]; #if (defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY)) - _enf_x = _en_x << FIXBITS; - _enf_y = _en_y << FIXBITS; + enems_init_fp (); #ifdef NEEDS_LIFE_GAUGE_LOGIC en_life [gpit] = _en_t == 6 ? FANTY_LIFE_GAUGE : ENEMS_LIFE_GAUGE; #endif @@ -974,7 +1102,7 @@ void enems_move (void) { if (en_spr != 0xff) { oam_index = oam_meta_spr ( - _en_x, _en_y + SPRITE_ADJUST, + _en_x + en_spr_x_mod, _en_y + SPRITE_ADJUST, oam_index, spr_enems [en_spr] ); @@ -983,13 +1111,5 @@ void enems_move (void) { // Update arrays enems_update_unsigned_char_arrays (); - - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) - enf_x [gpit] = _enf_x; enf_vx [gpit] = _enf_vx; - #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_PEZONS) - enf_y [gpit] = _enf_y; enf_vy [gpit] = _enf_vy; - #endif - } } diff --git a/examples/08_cheril_the_writer/dev/engine/general.h b/examples/08_cheril_the_writer/dev/engine/general.h index 01c962c..1725196 100644 --- a/examples/08_cheril_the_writer/dev/engine/general.h +++ b/examples/08_cheril_the_writer/dev/engine/general.h @@ -88,12 +88,31 @@ void pad_read (void) { #ifndef PLAYER_TOP_DOWN void jump_start (void) { - sfx_play (SFX_JUMP, 0); pj = 1; pctj = 0; - #ifdef PLAYER_JUMP_TYPE_MK2 - pvy = -PLAYER_VY_MK2_JUMP_INITIAL; - #else - pvy = -PLAYER_VY_JUMP_INITIAL; + #ifdef ENABLE_TRAMPOLINES + if (ptrampoline) { + sfx_play (SFX_TRAMPOLINE, 0); + #ifdef PLAYER_JUMP_TYPE_MK2 + pvy = -PLAYER_VY_MK2_JUMP_INITIAL_TRAMPOLINE; + #else + pvy = -PLAYER_VY_JUMP_INITIAL_TRAMPOLINE; + #endif + } else #endif + { + sfx_play (SFX_JUMP, 0); + #ifdef PLAYER_JUMP_TYPE_MK2 + pvy = -PLAYER_VY_MK2_JUMP_INITIAL; + #else + pvy = -PLAYER_VY_JUMP_INITIAL; + #endif + } } #endif + +void update_cycle (void) { + oam_hide_rest (oam_index); + ppu_waitnmi (); + clear_update_list (); + oam_index = 4; +} diff --git a/examples/08_cheril_the_writer/dev/engine/mapmods/map_renderer_complex.h b/examples/08_cheril_the_writer/dev/engine/mapmods/map_renderer_complex.h index 6f0a96e..6e3bc07 100644 --- a/examples/08_cheril_the_writer/dev/engine/mapmods/map_renderer_complex.h +++ b/examples/08_cheril_the_writer/dev/engine/mapmods/map_renderer_complex.h @@ -11,15 +11,13 @@ void add_tile (void) { map_buff [rdm] = rda; ++ rdm; - // Need to do this to keep track of where I am - rdx = (rdx + 1) & 15; if (!rdx) ++ rdy; } void draw_scr (void) { // Draw Map - rdx = rdy = rdm = 0; + rdm = 0; #ifdef MAP_FORMAT_PACKED // Get pointer @@ -34,6 +32,8 @@ void draw_scr (void) { #endif #ifdef MAP_FORMAT_RLE16 + rdx = rdy = 0; + // Get pointer gp_gen = c_map [n_pant]; @@ -119,13 +119,13 @@ void draw_scr (void) { #ifdef MAP_FORMAT_RLE44_CHRROM bankswitch (c_map_chr_rom_bank); vram_adr (c_map [n_pant]); - rda = VRAM_READ; // Dummy read. + rdt = VRAM_READ; // Dummy read. // UNRLE into scr_buff while (rdm < 192) { rdt = VRAM_READ; rda = rdt & 0x0f; - + rdct = rdt; while (rdct >= 16) { add_tile (); rdct -= 16; @@ -200,11 +200,19 @@ void draw_scr (void) { // Now blit the buffer + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + rdd = 0; + #endif + _x = 0; _y = TOP_ADJUST; gp_ram = map_buff; - //rdx = 0; rdy = 0; gp_ram = map_buff; for (rdm = 0; rdm < 192; rdm ++) { - // rdt = *gp_ram ++; SET_FROM_PTR (rdt, gp_ram); gp_ram ++; + + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + if (tile_got [rdd] & bits [rdm & 7]) rdt = 0; + if ((rdm & 7) == 7) ++ rdd; + #endif + map_attr [rdm] = c_behs [rdt]; #if defined (ENABLE_BREAKABLE) && !defined (BREAKABLES_SOFT) @@ -213,11 +221,6 @@ void draw_scr (void) { #include "engine/mapmods/map_detectors.h" - /* - _x = rdx << 1; _y = (rdy << 1) + TOP_ADJUST; _t = rdt; - draw_tile (); - rdx = (rdx + 1) & 15; if (!rdx) ++ rdy; - */ _t = rdt; draw_tile (); _x = (_x + 2) & 0x1f; if (!_x) _y += 2; } diff --git a/examples/08_cheril_the_writer/dev/engine/player.h b/examples/08_cheril_the_writer/dev/engine/player.h index 0ebb092..8cd006d 100644 --- a/examples/08_cheril_the_writer/dev/engine/player.h +++ b/examples/08_cheril_the_writer/dev/engine/player.h @@ -59,7 +59,7 @@ void player_init (void) { #endif #endif - pstate = EST_NORMAL; + pflickering = pbouncing = 0; #ifdef DIE_AND_RESPAWN player_register_safe_spot (); @@ -68,10 +68,31 @@ void player_init (void) { #ifdef CARRY_ONE_HS_OBJECT pinv = HS_OBJ_EMPTY; #endif + + // Default engine type + #ifndef PLAYER_TOP_DOWN + #ifdef PLAYER_HAS_JUMP + vertical_engine_type = ENGINE_TYPE_JUMP; + #elif defined (PLAYER_HAS_JETPAC) + vertical_engine_type = ENGINE_TYPE_JET_PAC; + #elif defined (PLAYER_AUTO_JUMP) + vertical_engine_type = ENGINE_TYPE_AUTO_JUMP; + #elif defined (PLAYER_SWIMS) + vertical_engine_type = ENGINE_TYPE_SWIM; + #endif + #endif + + #ifdef ENABLE_TRAMPOLINES + ptrampoline = 0; + #endif + + #ifdef PLAYER_SPINS + pspin = 0; + #endif } void player_render (void) { - if (pstate == EST_NORMAL || half_life) + if (0 == pflickering || half_life) oam_index = oam_meta_spr ( prx, pry + SPRITE_ADJUST, oam_index, @@ -85,17 +106,21 @@ void player_to_pixels (void) { } void player_kill (void) { + oam_index = oam_index_player; + player_render (); + ppu_waitnmi (); + pkill = phit = 0; sfx_play (SFX_PHIT, 0); if (plife) -- plife; else game_over = 1; #ifdef PLAYER_FLICKERS - pstate = EST_PARP; - pctstate = 100; - #else - pstate = EST_REBOUND; - pctstate = 16; + pflickering = PLAYER_FLICKERS; + #endif + + #ifdef PLAYER_BOUNCES + pbouncing = PLAYER_BOUNCES; #endif #ifdef ENABLE_USE_ANIM @@ -103,14 +128,19 @@ void player_kill (void) { #endif #ifdef DIE_AND_RESPAWN - px = px_safe; - py = py_safe; - player_to_pixels (); - n_pant = n_pant_safe; music_pause (1); delay (60); - player_stop (); - music_pause (0); + + #ifdef DIE_AND_REINIT + level_reset = 1; + #else + px = px_safe; + py = py_safe; + player_to_pixels (); + n_pant = n_pant_safe; + player_stop (); + music_pause (0); + #endif // May be necessary to find a proper cell later on #if defined (ENABLE_BREAKABLE) @@ -132,10 +162,8 @@ void player_kill (void) { #endif void player_move (void) { - if (pstate) { - -- pctstate; - if (!pctstate) pstate = EST_NORMAL; - } + if (pflickering) -- pflickering; + if (pbouncing) -- pbouncing; #if defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS) if (pfrozen) { @@ -172,6 +200,7 @@ void player_move (void) { #endif hitv = hith = 0; + pcx = prx; pcy = pry; pnotsafe = 0; #ifdef ENABLE_SLIPPERY pice = 0; @@ -207,11 +236,12 @@ void player_move (void) { #endif { if (QTILE (cx1, cy1 + 1) == SPRING_TILE && QTILE (cx1, cy1) != SPRING_SPIKE_TILE) { _x = cx1; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} - if (QTILE (cx2, cy1 + 1) == SPRING_TILE && QTILE (cx1, cy1) != SPRING_SPIKE_TILE) { _x = cx2; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} + if (QTILE (cx2, cy1 + 1) == SPRING_TILE && QTILE (cx2, cy1) != SPRING_SPIKE_TILE) { _x = cx2; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} } } #endif + oppossee = ppossee; ppossee = 0; // ******** @@ -284,7 +314,7 @@ void player_move (void) { } else #endif - #ifndef PLAYER_SWIMS + if (vertical_engine_type != ENGINE_TYPE_SWIM) { #ifdef PLAYER_JUMP_TYPE_MK2 if ( !pgotten @@ -300,56 +330,57 @@ void player_move (void) { if (pvy > PLAYER_VY_FALLING_MAX) pvy = PLAYER_VY_FALLING_MAX; } #endif - #endif + } // Moving platforms invalidate pvy - #ifdef PLAYER_CUMULATIVE_JUMP - if (!pj) - #endif - if (pgotten) pvy = 0; + if (pgotten) pvy = 0; #endif - cx1 = prx >> 4; - cx2 = (prx + 7) >> 4; - #ifdef PLAYER_HAS_JETPAC // Controller - if (pad0 & PAD_A) { - pvy -= PLAYER_AY_JETPAC; - if (pvy < -PLAYER_VY_JETPAC_MAX) pvy = -PLAYER_VY_JETPAC_MAX; + if (vertical_engine_type == ENGINE_TYPE_JET_PAC) { + if (pad0 & PAD_A) { + pvy -= PLAYER_AY_JETPAC; + if (pvy < -PLAYER_VY_JETPAC_MAX) pvy = -PLAYER_VY_JETPAC_MAX; + } } #endif #ifdef PLAYER_SWIMS // Controller - if (!(pad0 & (PAD_DOWN|PAD_A))) { - pvy -= PLAYER_AY_SWIM >> 1; - } else { - if (pad0 & (PAD_DOWN|PAD_A)) { - pvy += PLAYER_AY_SWIM; + if (vertical_engine_type == ENGINE_TYPE_SWIM) { + if (!(pad0 & (PAD_DOWN|PAD_A))) { + pvy -= PLAYER_AY_SWIM >> 1; + } else { + if (pad0 & (PAD_DOWN|PAD_A)) { + pvy += PLAYER_AY_SWIM; + } + + // Limit + if (pvy > PLAYER_VY_SWIM_MAX) { + pvy = PLAYER_VY_SWIM_MAX; + } } - - // Limit - if (pvy > PLAYER_VY_SWIM_MAX) { - pvy = PLAYER_VY_SWIM_MAX; + if (pvy < -PLAYER_VY_SWIM_MAX) { + pvy = -PLAYER_VY_SWIM_MAX; } } - if (pvy < -PLAYER_VY_SWIM_MAX) { - pvy = -PLAYER_VY_SWIM_MAX; - } - #endif // Move py += pvy; if (py < 0) py = 0; - + pry = py >> FIXBITS; + // Collision player_to_pixels (); + cx1 = prx >> 4; + cx2 = (prx + 7) >> 4; + #ifdef PLAYER_TOP_DOWN if (pvy < 0) #else @@ -404,7 +435,7 @@ void player_move (void) { pgotten = 0; pfiring = 1; ppossee = 1; - + #if defined (PLAYER_TOP_DOWN) && (defined(PLAYER_PUSH_BOXES) || !defined(DEACTIVATE_KEYS)) if (at1 & 2) player_process_tile (at1, cx1, cy1, cx1, cy1 + 1); if (cx1 != cx2) if (at2 & 2) player_process_tile (at2, cx2, cy1, cx2, cy1 + 1); @@ -414,6 +445,18 @@ void player_move (void) { pice = (at1 & 64) || (at2 & 64); #endif + #if defined (ENABLE_TRAMPOLINES) + if (at1 == 74 || at2 == 74) { + a_button = 1; ptrampoline = 1; + #ifdef PLAYER_SPINS + pspin = 0; + #endif + #ifdef ENABLE_SLIPPERY + pice = 0; + #endif + } + #endif + #ifdef ENABLE_CONVEYORS cfx = 0; if ((at1 & 40) == 40) { if (at1 & 1) cfx = pgtmx = PLAYER_VX_CONVEYORS; else cfx = pgtmx = -PLAYER_VX_CONVEYORS; pgotten = 1; } @@ -427,7 +470,7 @@ void player_move (void) { if ((at1 & 1) || (at2 & 1)) pnotsafe = 1; } else if ((at1 & 1) || (at2 & 1)) { - hitv = 1; + if ((pry & 15) > 4) hitv = 1; } #ifdef ENABLE_QUICKSANDS else { @@ -444,40 +487,101 @@ void player_move (void) { // Jump: PAD_A, change when needed // ******************************* - #ifdef PLAYER_JUMP_TYPE_MK2 + if (vertical_engine_type == ENGINE_TYPE_JUMP) { + #ifdef PLAYER_JUMP_TYPE_MK2 - if ( - a_button - && !pj - && ( - pgotten || ppossee || hitv - #ifdef ENABLE_LADDERS - || ponladder - #endif - ) - ) { - jump_start (); - - #ifdef DIE_AND_RESPAWN - if (!(pgotten || hitv || pnotsafe)) { - player_register_safe_spot (); + if ( + a_button + && !pj + && ( + pgotten || ppossee || hitv + #ifdef ENABLE_LADDERS + || ponladder + #endif + ) + ) { + jump_start (); + + #ifdef DIE_AND_RESPAWN + if (!(pgotten || hitv || pnotsafe)) { + player_register_safe_spot (); + } + #endif + + #ifdef PLAYER_SPINS + #ifdef ENABLE_TRAMPOLINES + if (!ptrampoline) + #endif + pspin = 1; + #endif + } + + if (pj) { + #ifdef ENABLE_TRAMPOLINES + if (ptrampoline) { + ++ pctj; if (pctj == PLAYER_VY_MK2_TRAMPOLINE_A_STEPS) + { pj = 0; ptrampoline = 0; } + } else + #endif + if (pad0 & PAD_A) { + ++ pctj; if (pctj == PLAYER_VY_MK2_JUMP_A_STEPS) pj = 0; + } else { + pj = 0; if (pvy < -PLAYER_VY_MK2_JUMP_RELEASE) pvy = -PLAYER_VY_MK2_JUMP_RELEASE; } - #endif - } + } - if (pj) { + #else + + if ( + a_button + && !pj + && ( + pgotten || ppossee || hitv + #ifdef ENABLE_LADDERS + || ponladder + #endif + ) + ) { + jump_start (); + + #ifdef DIE_AND_RESPAWN + if (!(pgotten || hitv || pnotsafe)) { + player_register_safe_spot (); + } + #endif + + #ifdef PLAYER_SPINS + #ifdef ENABLE_TRAMPOLINES + if (!ptrampoline) + #endif + pspin = 1; + #endif + } + + #ifdef ENABLE_TRAMPOLINES + if (pj && ptrampoline) { + + ++ pctj; if (pctj == 32) pj = 0; + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + } else + #endif if (pad0 & PAD_A) { - ++ pctj; if (pctj == PLAYER_VY_MK2_JUMP_A_STEPS) pj = 0; + if (pj) { + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; + ++ pctj; if (pctj == 16) pj = 0; + } } else { - pj = 0; if (pvy < -PLAYER_VY_MK2_JUMP_RELEASE) pvy = -PLAYER_VY_MK2_JUMP_RELEASE; + pj = 0; } - } + #endif + } + #endif - #else - + #ifdef PLAYER_AUTO_JUMP + if (vertical_engine_type == ENGINE_TYPE_AUTO_JUMP) { if ( - a_button - && !pj + !pj && ( pgotten || ppossee || hitv #ifdef ENABLE_LADDERS @@ -486,53 +590,32 @@ void player_move (void) { ) ) { jump_start (); - + #ifdef DIE_AND_RESPAWN if (!(pgotten || hitv || pnotsafe)) { player_register_safe_spot (); } #endif } + + if (pj) { + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; + ++ pctj; if (pctj == 16) pj = 0; + } - if (pad0 & PAD_A) { - if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); - if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - ++ pctj; if (pctj == 16) pj = 0; - } - } else { - pj = 0; + if (pad0 & PAD_DOWN) { + if (pvy < 0) pvy += PLAYER_AY_UNTHRUST; } - #endif - #endif - - #ifdef PLAYER_AUTO_JUMP - if ( - !pj - && ( - pgotten || ppossee || hitv - #ifdef ENABLE_LADDERS - || ponladder - #endif - ) - ) { - jump_start (); - - #ifdef DIE_AND_RESPAWN - if (!(pgotten || hitv || pnotsafe)) { - player_register_safe_spot (); - } - #endif } + #endif - if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); - if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - ++ pctj; if (pctj == 16) pj = 0; - } - + #ifdef PLAYER_SPINS if (pad0 & PAD_DOWN) { - if (pvy < 0) pvy += PLAYER_AY_UNTHRUST; + if (ppossee && ABS (pvx) > PLAYER_VX_MIN) { + if (!pspin) sfx_play (SFX_DUMMY2, 0); + pspin = 1; + } } #endif @@ -545,25 +628,29 @@ void player_move (void) { #ifdef PLAYER_TOP_DOWN pfacingh = 0xff; #endif - - if (pvx > 0) { + #ifdef PLAYER_SPINS + if (!pspin) + #endif + { + if (pvx > 0) { - #ifdef ENABLE_SLIPPERY - pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx -= PLAYER_RX; - #endif - - if (pvx < 0) pvx = 0; - } else if (pvx < 0) { + #ifdef ENABLE_SLIPPERY + pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx -= PLAYER_RX; + #endif + + if (pvx < 0) pvx = 0; + } else if (pvx < 0) { - #ifdef ENABLE_SLIPPERY - pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx += PLAYER_RX; - #endif + #ifdef ENABLE_SLIPPERY + pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx += PLAYER_RX; + #endif - if (pvx > 0) pvx = 0; + if (pvx > 0) pvx = 0; + } } } @@ -607,8 +694,8 @@ void player_move (void) { if (pgotten) px += pgtmx; #endif - if (px < (4< (244< (244< 0) hith &= ((pry & 15) > 4); } // Facing @@ -675,27 +763,78 @@ void player_move (void) { #endif #endif + #ifdef PLAYER_SPINS + if ((!pvx && (ppossee || pgotten) && !pj) || (ppossee && !oppossee)) pspin = 0; + #endif + // ************* // Killing tiles // ************* phit = 0; - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; - #ifndef NO_HORIZONTAL_EVIL_TILE - pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); - #endif + if (pgotten == 0) { + #ifdef NO_HORIZONTAL_EVIL_TILE + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } + #else + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } + #endif + + #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) + cx1 = cx2 = (prx + 4) >> 4; + cy1 = pry >> 4; cy2 = (pry + 15) >> 4; + cm_two_points (); + if ((at1 & 1) || (at2 & 1)) phit = 1; + #endif + + if (!pflickering && !pbouncing) if (phit) { + player_to_pixels (); + en_sg_2 = 1; + + #include "my/on_player_spike.h" + + if (en_sg_2) + pkill = 1; + #ifdef PLAYER_SPINS + pspin = 0; + #endif + } } - #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) + // *********************** + // Center point detections + // *********************** + + #ifdef NEEDS_CENTER_DETECTION cx1 = cx2 = (prx + 4) >> 4; - cy1 = pry >> 4; cy2 = (pry + 15) >> 4; + cy1 = cy2 = (pry + 8) >> 4; cm_two_points (); - if ((at1 & 1) || (at2 & 1)) phit = 1; + + #include "my/custom_center_detections.h" #endif - if (pstate != EST_PARP) if (phit) { player_to_pixels (); pkill = 1; } + #ifdef ENABLE_TILE_GET + if (cy1 && at1 == 34) { + -- cy1; + + _x = cx1; _y = cy1; _t = 0; map_set (); + sfx_play (SFX_RING, 2); + + #include "my/on_tile_got.h" + + #ifdef PERSISTENT_TILE_GET + tile_got [(cy1 << 1) | (cx1 > 7)] |= bits [cx1 & 7]; + #endif + } + #endif // ************** // B Button stuff diff --git a/examples/08_cheril_the_writer/dev/engine/prototypes.h b/examples/08_cheril_the_writer/dev/engine/prototypes.h index 9bc892f..8507ada 100644 --- a/examples/08_cheril_the_writer/dev/engine/prototypes.h +++ b/examples/08_cheril_the_writer/dev/engine/prototypes.h @@ -6,3 +6,5 @@ void propellers_add (void); void shines_add (void); void chac_chacs_add (void); +void player_render (void); +void do_extern_action (unsigned char); diff --git a/examples/08_cheril_the_writer/dev/game.c b/examples/08_cheril_the_writer/dev/game.c index f542f3c..a6a6a18 100644 --- a/examples/08_cheril_the_writer/dev/game.c +++ b/examples/08_cheril_the_writer/dev/game.c @@ -83,11 +83,12 @@ extern const unsigned char m_ingame []; // ************* #include "engine/prototypes.h" -#include "engine/general.h" #include "engine/printer.h" +#include "engine/general.h" #ifdef ENABLE_TEXT_BOX #include "engine/textbox.h" #endif +#include "my/extra_modules.h" #ifdef ENABLE_BREAKABLE #include "engine/breakable.h" #endif @@ -109,14 +110,15 @@ extern const unsigned char m_ingame []; #endif #include "engine/player.h" #include "engine/enengine.h" +#if (defined (ACTIVATE_SCRIPTING) && defined (ENABLE_EXTERN_CODE)) || defined (ENABLE_COMPILED_ENEMS) + #include "my/extern.h" +#endif #include "engine/frame.h" #include "my/pres.h" #ifdef ACTIVATE_SCRIPTING - #ifdef ENABLE_EXTERN_CODE - #include "my/extern.h" - #endif #include "assets/mscnes.h" #endif +#include "mainloop/flickscreen.h" #include "mainloop.h" // ************* @@ -130,6 +132,7 @@ void main(void) { ppu_off (); first_game = 1; + ntsc = ppu_system (); // Main loop diff --git a/examples/08_cheril_the_writer/dev/labels.txt b/examples/08_cheril_the_writer/dev/labels.txt index 40a5e24..b0b9f90 100644 --- a/examples/08_cheril_the_writer/dev/labels.txt +++ b/examples/08_cheril_the_writer/dev/labels.txt @@ -3,100 +3,104 @@ Modules list: crt0.o: RODATA Offs = 000000 Size = 000F38 HEADER Offs = 000000 Size = 000010 - STARTUP Offs = 000000 Size = 000C7F + STARTUP Offs = 000000 Size = 000CB2 VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 008000 game.o: - CODE Offs = 000000 Size = 00393B - RODATA Offs = 000F38 Size = 00252B - BSS Offs = 000000 Size = 000489 - ZEROPAGE Offs = 000000 Size = 0000B7 + CODE Offs = 000000 Size = 003B3F + RODATA Offs = 000F38 Size = 002510 + BSS Offs = 000000 Size = 000491 + ZEROPAGE Offs = 000000 Size = 0000BC runtime.lib(add.o): - CODE Offs = 00393B Size = 00001A + CODE Offs = 003B3F Size = 00001A runtime.lib(addysp.o): - CODE Offs = 003955 Size = 00000E + CODE Offs = 003B59 Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 003963 Size = 00000B + CODE Offs = 003B67 Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 00396E Size = 00000E + CODE Offs = 003B72 Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 00397C Size = 000011 + CODE Offs = 003B80 Size = 000011 +runtime.lib(asr.o): + CODE Offs = 003B91 Size = 00002B runtime.lib(asrax1.o): - CODE Offs = 00398D Size = 00000A + CODE Offs = 003BBC Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 003997 Size = 00000F + CODE Offs = 003BC6 Size = 00000F runtime.lib(asrax3.o): - CODE Offs = 0039A6 Size = 000014 + CODE Offs = 003BD5 Size = 000014 runtime.lib(asrax4.o): - CODE Offs = 0039BA Size = 000019 + CODE Offs = 003BE9 Size = 000019 runtime.lib(bneg.o): - CODE Offs = 0039D3 Size = 00000E + CODE Offs = 003C02 Size = 00000E runtime.lib(call.o): - CODE Offs = 0039E1 Size = 000007 + CODE Offs = 003C10 Size = 000007 runtime.lib(copydata.o): - CODE Offs = 0039E8 Size = 00002D + CODE Offs = 003C17 Size = 00002D runtime.lib(decsp2.o): - CODE Offs = 003A15 Size = 00000D + CODE Offs = 003C44 Size = 00000D runtime.lib(decsp3.o): - CODE Offs = 003A22 Size = 00000D + CODE Offs = 003C51 Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 003A2F Size = 00000D + CODE Offs = 003C5E Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 003A3C Size = 00000D + CODE Offs = 003C6B Size = 00000D runtime.lib(icmp.o): - CODE Offs = 003A49 Size = 00002E + CODE Offs = 003C78 Size = 00002E +runtime.lib(incsp1.o): + CODE Offs = 003CA6 Size = 000007 runtime.lib(incsp2.o): - CODE Offs = 003A77 Size = 000016 + CODE Offs = 003CAD Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 003A8D Size = 000005 + CODE Offs = 003CC3 Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 003A92 Size = 000005 + CODE Offs = 003CC8 Size = 000005 runtime.lib(ldai.o): - CODE Offs = 003A97 Size = 00000C + CODE Offs = 003CCD Size = 00000C runtime.lib(makebool.o): - CODE Offs = 003AA3 Size = 000031 + CODE Offs = 003CD9 Size = 000031 runtime.lib(mul8.o): - CODE Offs = 003AD4 Size = 00003A + CODE Offs = 003D0A Size = 00003A runtime.lib(neg.o): - CODE Offs = 003B0E Size = 00000E + CODE Offs = 003D44 Size = 00000E runtime.lib(or.o): - CODE Offs = 003B1C Size = 000012 + CODE Offs = 003D52 Size = 000012 runtime.lib(popa.o): - CODE Offs = 003B2E Size = 00000C + CODE Offs = 003D64 Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 003B3A Size = 000010 + CODE Offs = 003D70 Size = 000010 runtime.lib(pusha.o): - CODE Offs = 003B4A Size = 000016 + CODE Offs = 003D80 Size = 000016 runtime.lib(pushax.o): - CODE Offs = 003B60 Size = 00001A + CODE Offs = 003D96 Size = 00001A runtime.lib(shl.o): - CODE Offs = 003B7A Size = 00002B + CODE Offs = 003DB0 Size = 00002B runtime.lib(shrax1.o): - CODE Offs = 003BA5 Size = 000008 + CODE Offs = 003DDB Size = 000008 runtime.lib(shrax3.o): - CODE Offs = 003BAD Size = 00000E + CODE Offs = 003DE3 Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 003BBB Size = 000011 + CODE Offs = 003DF1 Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 003BCC Size = 000016 + CODE Offs = 003E02 Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 003BE2 Size = 00000B + CODE Offs = 003E18 Size = 00000B runtime.lib(staxspi.o): - CODE Offs = 003BED Size = 00001B + CODE Offs = 003E23 Size = 00001B runtime.lib(sub.o): - CODE Offs = 003C08 Size = 000015 + CODE Offs = 003E3E Size = 000015 runtime.lib(subeqsp.o): - CODE Offs = 003C1D Size = 000015 + CODE Offs = 003E53 Size = 000015 runtime.lib(subysp.o): - CODE Offs = 003C32 Size = 00000D + CODE Offs = 003E68 Size = 00000D runtime.lib(udiv.o): - CODE Offs = 003C3F Size = 00004F + CODE Offs = 003E75 Size = 00004F runtime.lib(umod.o): - CODE Offs = 003C8E Size = 000011 + CODE Offs = 003EC4 Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000B7 Size = 00001A + ZEROPAGE Offs = 0000BC Size = 00001A Segment list: @@ -105,67 +109,69 @@ Name Start End Size -------------------------------------------- CHARS 000000 007FFF 008000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000F8 0000D1 -BSS 000300 000788 000489 -STARTUP 008000 008C7E 000C7F -INIT 008C7F 008CA1 000023 -CODE 008CA2 00C940 003C9F -RODATA 00C941 00FDA3 003463 +ZEROPAGE 000028 0000FD 0000D6 +BSS 000300 000790 000491 +STARTUP 008000 008CB1 000CB2 +INIT 008CB2 008CD4 000023 +CODE 008CD5 00CBA9 003ED5 +RODATA 00CBAA 00FFF1 003448 VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 000489 REA -__DATA_LOAD__ 00FDA4 RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 000491 REA +__DATA_LOAD__ 00FFF2 RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA -_bank_bg 0083E3 RLA _bank_spr 0083D3 RLA -_bankswitch 008590 RLA _delay 008588 RLA -_main 00C4E0 RLA _memfill 008559 RLA -_music_pause 00876E REA _music_play 008701 REA -_music_stop 0086C3 REA _oam_clear 0082A8 RLA -_oam_hide_rest 00833A RLA _oam_meta_spr 0082F2 RLA -_oam_spr 0082C8 RLA _pad_poll 008468 RLA -_pal_bg 008229 RLA _pal_bright 00825B RLA -_pal_col 00823C RLA _pal_spr 008233 RLA -_ppu_off 008269 RLA _ppu_on_all 00827C RLA -_ppu_waitnmi 008347 RLA _rand8 0084C7 RLA -_scroll 0083A0 RLA _set_rand 0084D8 RLA -_set_vram_update 0084DD RLA _sfx_play 008457 RLA -_unrle_vram 008360 RLA _vram_adr 0084E7 RLA -_vram_fill 0084F2 RLA _vram_put 0084EE RLA -_vram_write 008427 RLA addysp 00C5F8 RLA -addysp1 00C5F7 RLA aslax2 00C605 RLA -aslax3 00C610 RLA aslax4 00C61E RLA -asrax1 00C62F RLA asrax2 00C639 RLA -asrax3 00C648 RLA asrax4 00C65C RLA -bnega 00C679 RLA booleq 00C74B RLA -boolult 00C763 RLA callax 00C683 RLA -copydata 00C68A RLA decsp2 00C6B7 RLA -decsp3 00C6C4 RLA decsp4 00C6D1 RLA -decsp8 00C6DE RLA incsp2 00C721 RLA -incsp4 00C72F RLA incsp8 00C734 RLA -ldaidx 00C739 RLA negax 00C7B0 RLA -popa 00C7D0 RLA popax 00C719 RLA -popsreg 00C7DC RLA ptr1 0000E7 RLZ -ptr2 0000E9 RLZ ptr4 0000ED RLZ -push0 00C802 RLA pusha 00C7F0 RLA -pusha0 00C804 RLA pushax 00C806 RLA -regsave 0000E3 RLZ shlax2 00C605 RLA -shlax4 00C61E RLA shrax1 00C847 RLA -shrax3 00C84F RLA shrax4 00C85D RLA -sp 0000DF RLZ sreg 0000E1 RLZ -staspidx 00C86E RLA stax0sp 00C884 RLA -staxspidx 00C88F RLA subeqysp 00C8C1 RLA -subysp 00C8D4 RLA tmp1 0000EF RLZ -tosadda0 00C5DD RLA tosaddax 00C5DF RLA -tosaslax 00C81C RLA tosicmp 00C6ED RLA -tosicmp0 00C6EB RLA tosorax 00C7C0 RLA -tossuba0 00C8AA RLA tossubax 00C8AC RLA -tosudiva0 00C8E1 RLA tosumoda0 00C930 RLA -tosumula0 00C776 RLA udiv16 00C8F2 RLA -zerobss 008C7F RLA +_bank_bg 008416 RLA _bank_spr 008406 RLA +_bankswitch 0085C3 RLA _delay 0085BB RLA +_main 00C70E RLA _memfill 00858C RLA +_music_pause 0087A1 REA _music_play 008734 REA +_music_stop 0086F6 REA _oam_clear 0082AF RLA +_oam_hide_rest 008341 RLA _oam_meta_spr 0082F9 RLA +_oam_spr 0082CF RLA _pad_poll 00849B RLA +_pal_bg 00822D RLA _pal_bright 00825F RLA +_pal_col 008240 RLA _pal_spr 008237 RLA +_ppu_off 00826D RLA _ppu_on_all 008283 RLA +_ppu_system 008280 RLA _ppu_waitnmi 00834E RLA +_rand8 0084FA RLA _scroll 0083A7 RLA +_set_rand 00850B RLA _set_vram_update 008510 RLA +_sfx_play 00848A RLA _unrle_vram 008367 RLA +_vram_adr 00851A RLA _vram_fill 008525 RLA +_vram_put 008521 RLA _vram_write 00845A RLA +addysp 00C82F RLA addysp1 00C82E RLA +aslax2 00C83C RLA aslax3 00C847 RLA +aslax4 00C855 RLA asrax1 00C891 RLA +asrax2 00C89B RLA asrax3 00C8AA RLA +asrax4 00C8BE RLA bnega 00C8DB RLA +booleq 00C9B4 RLA boolult 00C9CC RLA +callax 00C8E5 RLA copydata 00C8EC RLA +decsp2 00C919 RLA decsp3 00C926 RLA +decsp4 00C933 RLA decsp8 00C940 RLA +incsp1 00C97B RLA incsp2 00C98A RLA +incsp4 00C998 RLA incsp8 00C99D RLA +ldaidx 00C9A2 RLA negax 00CA19 RLA +popa 00CA39 RLA popax 00C982 RLA +popsreg 00CA45 RLA ptr1 0000EC RLZ +ptr2 0000EE RLZ ptr4 0000F2 RLZ +push0 00CA6B RLA pusha 00CA59 RLA +pusha0 00CA6D RLA pushax 00CA6F RLA +regsave 0000E8 RLZ shlax2 00C83C RLA +shlax4 00C855 RLA shrax1 00CAB0 RLA +shrax3 00CAB8 RLA shrax4 00CAC6 RLA +sp 0000E4 RLZ sreg 0000E6 RLZ +staspidx 00CAD7 RLA stax0sp 00CAED RLA +staxspidx 00CAF8 RLA subeqysp 00CB2A RLA +subysp 00CB3D RLA tmp1 0000F4 RLZ +tosadda0 00C814 RLA tosaddax 00C816 RLA +tosaslax 00CA85 RLA tosasrax 00C866 RLA +tosicmp 00C94F RLA tosicmp0 00C94D RLA +tosorax 00CA29 RLA tossuba0 00CB13 RLA +tossubax 00CB15 RLA tosudiva0 00CB4A RLA +tosumoda0 00CB99 RLA tosumula0 00C9DF RLA +udiv16 00CB5B RLA zerobss 008CB2 RLA + Imports list: @@ -187,33 +193,33 @@ __RAM_START__ ([linker generated]): __STARTUP__ (crt0.o): game.o game.s(12) _bank_bg (crt0.o): - game.o game.s(31) + game.o game.s(32) _bank_spr (crt0.o): - game.o game.s(30) + game.o game.s(31) _bankswitch (crt0.o): - game.o game.s(42) + game.o game.s(43) _delay (crt0.o): - game.o game.s(41) + game.o game.s(42) _main (game.o): crt0.o crt0.s(26) _memfill (crt0.o): - game.o game.s(40) + game.o game.s(41) _music_pause (crt0.o): - game.o game.s(26) + game.o game.s(27) _music_play (crt0.o): - game.o game.s(24) -_music_stop (crt0.o): game.o game.s(25) +_music_stop (crt0.o): + game.o game.s(26) _oam_clear (crt0.o): - game.o game.s(19) + game.o game.s(20) _oam_hide_rest (crt0.o): - game.o game.s(22) + game.o game.s(23) _oam_meta_spr (crt0.o): - game.o game.s(21) + game.o game.s(22) _oam_spr (crt0.o): - game.o game.s(20) + game.o game.s(21) _pad_poll (crt0.o): - game.o game.s(28) + game.o game.s(29) _pal_bg (crt0.o): game.o game.s(13) _pal_bright (crt0.o): @@ -226,142 +232,153 @@ _ppu_off (crt0.o): game.o game.s(17) _ppu_on_all (crt0.o): game.o game.s(18) +_ppu_system (crt0.o): + game.o game.s(19) _ppu_waitnmi (crt0.o): - game.o game.s(23) + game.o game.s(24) _rand8 (crt0.o): - game.o game.s(32) + game.o game.s(33) _scroll (crt0.o): - game.o game.s(29) + game.o game.s(30) _set_rand (crt0.o): - game.o game.s(33) -_set_vram_update (crt0.o): game.o game.s(34) +_set_vram_update (crt0.o): + game.o game.s(35) _sfx_play (crt0.o): - game.o game.s(27) + game.o game.s(28) _unrle_vram (crt0.o): - game.o game.s(39) + game.o game.s(40) _vram_adr (crt0.o): - game.o game.s(35) + game.o game.s(36) _vram_fill (crt0.o): - game.o game.s(37) + game.o game.s(38) _vram_put (crt0.o): - game.o game.s(36) + game.o game.s(37) _vram_write (crt0.o): - game.o game.s(38) + game.o game.s(39) addysp (addysp.o): incsp8.o incsp8.s(8) incsp4.o incsp4.s(8) - game.o game.s(11943) + game.o game.s(12086) addysp1 (addysp.o): sub.o sub.s(8) or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(8337) - game.o game.s(8498) - game.o game.s(10648) - game.o game.s(10894) - game.o game.s(12403) - game.o game.s(13847) - game.o game.s(15398) - game.o game.s(17626) + game.o game.s(8006) + game.o game.s(8167) + game.o game.s(10852) + game.o game.s(11098) + game.o game.s(12570) + game.o game.s(14191) + game.o game.s(14246) + game.o game.s(14287) + game.o game.s(15827) + game.o game.s(18311) aslax3 (aslax3.o): - game.o game.s(8257) - game.o game.s(13856) + game.o game.s(7926) + game.o game.s(14296) aslax4 (aslax4.o): - game.o game.s(8197) - game.o game.s(8349) - game.o game.s(8510) - game.o game.s(8603) - game.o game.s(9410) - game.o game.s(9653) - game.o game.s(10125) - game.o game.s(10647) - game.o game.s(10893) - game.o game.s(11897) - game.o game.s(12402) - game.o game.s(14183) - game.o game.s(15397) - game.o game.s(17620) + game.o game.s(7866) + game.o game.s(8018) + game.o game.s(8179) + game.o game.s(8272) + game.o game.s(9066) + game.o game.s(9857) + game.o game.s(10329) + game.o game.s(10851) + game.o game.s(11097) + game.o game.s(12040) + game.o game.s(12569) + game.o game.s(14190) + game.o game.s(14245) + game.o game.s(15826) + game.o game.s(18305) asrax1 (asrax1.o): - game.o game.s(7888) - game.o game.s(8268) + game.o game.s(7937) + game.o game.s(9574) asrax2 (asrax2.o): - game.o game.s(7893) - game.o game.s(8251) - game.o game.s(11272) - game.o game.s(11671) - game.o game.s(15273) - game.o game.s(17864) + game.o game.s(7920) + game.o game.s(9579) + game.o game.s(11476) + game.o game.s(11806) + game.o game.s(12479) + game.o game.s(15702) + game.o game.s(18562) asrax3 (asrax3.o): - game.o game.s(10118) - game.o game.s(13292) - game.o game.s(15615) + game.o game.s(10322) + game.o game.s(13559) + game.o game.s(16058) asrax4 (asrax4.o): - game.o game.s(7899) - game.o game.s(11271) - game.o game.s(11670) - game.o game.s(12031) - game.o game.s(15272) - game.o game.s(17863) + game.o game.s(9585) + game.o game.s(11475) + game.o game.s(11805) + game.o game.s(12179) + game.o game.s(15701) + game.o game.s(18561) bnega (bneg.o): - game.o game.s(12685) - game.o game.s(14818) + game.o game.s(11638) + game.o game.s(12861) + game.o game.s(15210) booleq (makebool.o): - game.o game.s(15642) + game.o game.s(16087) boolult (makebool.o): - game.o game.s(15623) + game.o game.s(16066) callax (call.o): - game.o game.s(17085) + game.o game.s(17563) copydata (copydata.o): crt0.o crt0.s(26) decsp2 (decsp2.o): - game.o game.s(18580) + game.o game.s(19034) decsp3 (decsp3.o): - game.o game.s(8050) - game.o game.s(9719) - game.o game.s(9953) - game.o game.s(10337) - game.o game.s(11595) - game.o game.s(13669) - game.o game.s(14850) - game.o game.s(16937) - game.o game.s(17590) - game.o game.s(19192) + game.o game.s(7538) + game.o game.s(7719) + game.o game.s(9923) + game.o game.s(10157) + game.o game.s(10541) + game.o game.s(13936) + game.o game.s(15253) + game.o game.s(17415) + game.o game.s(18275) + game.o game.s(19764) decsp4 (decsp4.o): - game.o game.s(9376) - game.o game.s(10207) - game.o game.s(11299) - game.o game.s(19071) - game.o game.s(19339) + game.o game.s(9032) + game.o game.s(10411) + game.o game.s(11503) + game.o game.s(19643) + game.o game.s(19916) decsp8 (decsp8.o): - game.o game.s(18601) + game.o game.s(19055) +incsp1 (incsp1.o): + game.o game.s(7617) incsp2 (incsp2.o): staxspi.o staxspi.s(8) staspidx.o staspidx.s(8) popsreg.o popsreg.s(8) - game.o game.s(9443) - game.o game.s(9819) + game.o game.s(9099) + game.o game.s(10023) incsp4 (incsp4.o): - game.o game.s(7704) - game.o game.s(7779) - game.o game.s(17112) + game.o game.s(9390) + game.o game.s(9465) + game.o game.s(17590) incsp8 (incsp8.o): - game.o game.s(7592) + game.o game.s(9278) ldaidx (ldai.o): - game.o game.s(14053) - game.o game.s(16160) + game.o game.s(14492) + game.o game.s(16625) negax (neg.o): - game.o game.s(7715) - game.o game.s(7770) - game.o game.s(10753) - game.o game.s(13171) - game.o game.s(13522) - game.o game.s(14283) - game.o game.s(15041) + game.o game.s(9401) + game.o game.s(9456) + game.o game.s(10957) + game.o game.s(13377) + game.o game.s(13789) + game.o game.s(14251) + game.o game.s(14654) + game.o game.s(15468) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): shl.o shl.s(15) + asr.o asr.s(15) crt0.o crt0.s(26) popsreg (popsreg.o): umod.o umod.s(8) @@ -384,69 +401,70 @@ ptr4 (zeropage.o): udiv.o udiv.s(9) mul8.o mul8.s(10) push0 (pushax.o): - game.o game.s(19317) + game.o game.s(19889) pusha (pusha.o): - game.o game.s(7928) - game.o game.s(8092) - game.o game.s(10845) - game.o game.s(10999) - game.o game.s(11035) - game.o game.s(11708) - game.o game.s(11928) - game.o game.s(12101) - game.o game.s(16596) - game.o game.s(17946) + game.o game.s(7761) + game.o game.s(9621) + game.o game.s(11049) + game.o game.s(11203) + game.o game.s(11239) + game.o game.s(11856) + game.o game.s(12071) + game.o game.s(12249) + game.o game.s(16565) + game.o game.s(18640) pusha0 (pushax.o): - game.o game.s(7629) - game.o game.s(8215) - game.o game.s(8292) - game.o game.s(9155) - game.o game.s(10269) - game.o game.s(10681) - game.o game.s(11384) - game.o game.s(12480) - game.o game.s(13512) - game.o game.s(14919) - game.o game.s(18386) + game.o game.s(7884) + game.o game.s(7961) + game.o game.s(8811) + game.o game.s(9315) + game.o game.s(10473) + game.o game.s(10885) + game.o game.s(11588) + game.o game.s(12647) + game.o game.s(13779) + game.o game.s(15346) + game.o game.s(17936) + game.o game.s(18840) pushax (pushax.o): - game.o game.s(7533) - game.o game.s(7749) - game.o game.s(7885) - game.o game.s(8142) - game.o game.s(8628) - game.o game.s(9274) - game.o game.s(10293) - game.o game.s(10487) - game.o game.s(10684) - game.o game.s(10938) - game.o game.s(11089) - game.o game.s(13504) - game.o game.s(14228) - game.o game.s(16245) - game.o game.s(16853) - game.o game.s(17131) - game.o game.s(17179) - game.o game.s(17203) - game.o game.s(17227) - game.o game.s(17266) + game.o game.s(7811) + game.o game.s(8297) + game.o game.s(8930) + game.o game.s(9219) + game.o game.s(9435) + game.o game.s(9571) + game.o game.s(10497) + game.o game.s(10691) + game.o game.s(10888) + game.o game.s(11142) + game.o game.s(11293) + game.o game.s(13771) + game.o game.s(14786) + game.o game.s(16626) + game.o game.s(17331) + game.o game.s(17609) + game.o game.s(17657) + game.o game.s(17681) + game.o game.s(17705) + game.o game.s(17744) regsave (zeropage.o): game.o game.s(10) shlax2 (aslax2.o): - game.o game.s(16352) + game.o game.s(16881) shlax4 (aslax4.o): - game.o game.s(7475) - game.o game.s(9502) - game.o game.s(10292) - game.o game.s(12388) - game.o game.s(15334) + game.o game.s(9161) + game.o game.s(9706) + game.o game.s(10496) + game.o game.s(12555) + game.o game.s(15763) shrax1 (shrax1.o): - game.o game.s(9501) + game.o game.s(9705) shrax3 (shrax3.o): - game.o game.s(14945) + game.o game.s(15372) shrax4 (shrax4.o): - game.o game.s(11334) - game.o game.s(12039) - game.o game.s(15290) + game.o game.s(11538) + game.o game.s(12187) + game.o game.s(15719) sp (zeropage.o): subysp.o subysp.s(9) subeqsp.o subeqsp.s(8) @@ -460,6 +478,7 @@ sp (zeropage.o): popa.o popa.s(8) or.o or.s(9) incsp2.o incsp2.s(8) + incsp1.o incsp1.s(8) icmp.o icmp.s(9) decsp8.o decsp8.s(8) decsp4.o decsp4.s(8) @@ -476,24 +495,25 @@ sreg (zeropage.o): icmp.o icmp.s(9) game.o game.s(10) staspidx (staspidx.o): - game.o game.s(8154) - game.o game.s(8636) - game.o game.s(9282) - game.o game.s(10502) - game.o game.s(13524) + game.o game.s(7823) + game.o game.s(8305) + game.o game.s(8938) + game.o game.s(10706) + game.o game.s(13791) + game.o game.s(14790) stax0sp (staxsp.o): - game.o game.s(9438) - game.o game.s(11809) + game.o game.s(9094) + game.o game.s(11952) staxspidx (staxspi.o): - game.o game.s(10755) - game.o game.s(10955) - game.o game.s(11116) - game.o game.s(14245) - game.o game.s(16263) + game.o game.s(10959) + game.o game.s(11159) + game.o game.s(11320) + game.o game.s(14823) + game.o game.s(16764) subeqysp (subeqsp.o): - game.o game.s(11800) + game.o game.s(11943) subysp (subysp.o): - game.o game.s(13065) + game.o game.s(13249) tmp1 (zeropage.o): staxspi.o staxspi.s(9) staspidx.o staspidx.s(9) @@ -507,44 +527,48 @@ tmp1 (zeropage.o): asrax3.o asrax3.s(9) asrax2.o asrax2.s(8) asrax1.o asrax1.s(8) + asr.o asr.s(16) aslax4.o aslax4.s(8) aslax3.o aslax3.s(8) aslax2.o aslax2.s(8) game.o game.s(10) tosadda0 (add.o): - game.o game.s(10272) + game.o game.s(10476) tosaddax (add.o): - game.o game.s(11114) + game.o game.s(11318) tosaslax (shl.o): - game.o game.s(8302) - game.o game.s(16339) + game.o game.s(7971) + game.o game.s(16628) +tosasrax (asr.o): + game.o game.s(16685) tosicmp (icmp.o): - game.o game.s(7539) - game.o game.s(7635) - game.o game.s(7755) - game.o game.s(9161) - game.o game.s(10721) - game.o game.s(11390) - game.o game.s(12491) - game.o game.s(14925) - game.o game.s(18392) + game.o game.s(8817) + game.o game.s(9225) + game.o game.s(9321) + game.o game.s(9441) + game.o game.s(10925) + game.o game.s(11594) + game.o game.s(12658) + game.o game.s(15352) + game.o game.s(18846) tosicmp0 (icmp.o): - game.o game.s(13103) - game.o game.s(13515) + game.o game.s(13287) + game.o game.s(13782) + game.o game.s(17940) tosorax (or.o): - game.o game.s(8303) + game.o game.s(7972) tossuba0 (sub.o): - game.o game.s(16338) + game.o game.s(16867) tossubax (sub.o): - game.o game.s(7889) - game.o game.s(16261) + game.o game.s(9575) + game.o game.s(16762) tosudiva0 (udiv.o): - game.o game.s(8217) - game.o game.s(10686) + game.o game.s(7886) + game.o game.s(10890) tosumoda0 (umod.o): - game.o game.s(8228) + game.o game.s(7897) tosumula0 (mul8.o): - game.o game.s(10683) + game.o game.s(10887) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git a/examples/08_cheril_the_writer/dev/mainloop.h b/examples/08_cheril_the_writer/dev/mainloop.h index 70c962b..79c7b2f 100644 --- a/examples/08_cheril_the_writer/dev/mainloop.h +++ b/examples/08_cheril_the_writer/dev/mainloop.h @@ -95,6 +95,12 @@ void game_init (void) { #endif #endif + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Clear tile_got persistence + vram_adr (MAP_CLEAR_LIST_ADDRESS); + vram_fill (0, MAP_SIZE*24); + #endif + half_life = 0; frame_counter = 0; olife = oammo = oobjs = okeys = 0xff; @@ -108,9 +114,20 @@ void game_init (void) { } void prepare_scr (void) { - if (!ft) fade_out (); else ft = 0; + if (!ft) { + fade_out (); + ppu_off (); + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Update tile_got persistence + rda = on_pant << 3; + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); + #endif + } else { + ft = 0; + ppu_off (); + } - ppu_off (); + clear_update_list (); #ifdef ENABLE_PROPELLERS // Clear propellers @@ -144,6 +161,12 @@ void prepare_scr (void) { max_chac_chacs = 0; #endif + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Read tile_got persistence + rda = n_pant << 3; + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); + #endif + draw_scr (); #if defined (ENABLE_BREAKABLE) && defined (BREAKABLE_ANIM) @@ -200,7 +223,7 @@ void prepare_scr (void) { #include "my/on_entering_screen.h" gpit = 3; while (gpit --) en_spr_id [gpit] = en_s [gpit]; - + oam_index = 4; prx = px >> FIXBITS; pry = py >> FIXBITS; #if defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS) @@ -208,8 +231,8 @@ void prepare_scr (void) { #endif player_move (); - player_render (); enems_move (); + if (hrt) hotspots_paint (); #ifdef ENABLE_INTERACTIVES @@ -259,51 +282,42 @@ void game_loop (void) { run_script (2 * MAP_SIZE); #endif - warp_to_level = 0; oam_index = 0; ticker = 50; + ntsc_frame = level_reset = warp_to_level = 0; + oam_index = 4; ticker = 50; while (1) { + // Update hud + + #ifdef ACTIVATE_SCRIPTING + if (n_pant != 0xfe && on_pant != 0xfe) + #endif + hud_update (); + // Finish him if (pkill) player_kill (); - if (game_over) break; + if (game_over || level_reset) break; // Flick the screen flick_override = 0; #include "my/custom_flickscreen.h" - #include "mainloop/flickscreen.h" + if (flick_override == 0) { + flickscreen_do_horizontal (); + flickscreen_do_vertical (); + } // Change screen ? - if (on_pant != n_pant && !warp_to_level) { + if (on_pant != n_pant) { prepare_scr (); on_pant = n_pant; } // Relocate player if spawned on a broken tile - #if defined (ENABLE_BREAKABLE) - if (pmayneedrelocation) { - pmayneedrelocation = 0; - gpit = 16; - while (gpit --) { - cx1 = prx >> 4; cx2 = (prx + 7) >> 4; - cy1 = cy2 = (pry + 15) >> 4; - cm_two_points (); - if ((at1 & 8) == 0 && (at2 & 8) == 0) break; - prx += 16; // Try next cell - } - px = prx << FIXBITS; - } - #endif - - // Update hud - - #ifdef ACTIVATE_SCRIPTING - if (n_pant != 0xfe && on_pant != 0xfe) - #endif - hud_update (); + #include "mainloop/relocate_player.h" // Shake the screen ? @@ -311,12 +325,13 @@ void game_loop (void) { #include "mainloop/shaker.h" #endif + // Effects + + #include "my/effects.h" + // Finish frame and wait for NMI - oam_hide_rest (oam_index); - ppu_waitnmi (); - clear_update_list (); - oam_index = 4; + update_cycle (); // Poll pads @@ -326,77 +341,54 @@ void game_loop (void) { // Update actors if not paused... - if (paused == 0) { + ntsc_frame ++; if (ntsc_frame == 6) ntsc_frame = 0; + + if (paused == 0 && (ntsc == 0 || ntsc_frame)) { // Count frames if (ticker) -- ticker; else ticker = 50; half_life ^= 1; ++ frame_counter; - // Timer + // Detect interactions - #ifdef ENABLE_TIMER - #include "mainloop/timer.h" - #endif + #ifdef ENABLE_INTERACTIVES + #include "mainloop/interactives.h" + #endif - // Extra checks + // Update / collide hotspots - #include "my/extra_checks.h" + #include "mainloop/hotspots.h" - // Win level condition + // Automatic scripting calls (USE_ANIM & fire zone) - if ( - #if defined (WIN_LEVEL_CUSTOM) - win_level - #elif defined (ACTIVATE_SCRIPTING) - script_result == 1 - #elif defined (PLAYER_MAX_OBJECTS) - pobjs == PLAYER_MAX_OBJECTS - #elif defined (SCR_END) - ( - n_pant == SCR_END && - ((prx + 8) >> 4) == PLAYER_END_X && - ((pry + 8) >> 4) == PLAYER_END_Y - ) + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" #endif - ) { - music_stop (); - delay (50); - break; - } - - // Warp to level + + // Update player - if (warp_to_level) { - music_stop (); break; + if (!warp_to_level) { + player_move (); } - // Update propellers + // Timer - #ifdef ENABLE_PROPELLERS - if (propellers_on) propellers_do (); + #ifdef ENABLE_TIMER + #include "mainloop/timer.h" #endif - // Detect interactions - - #ifdef ENABLE_INTERACTIVES - #include "mainloop/interactives.h" - #endif - - // Update / collide hotspots + // Extra checks - #include "mainloop/hotspots.h" + #include "my/extra_checks.h" - // Update player + // Win level condition - if (!warp_to_level) { - player_move (); - player_render (); - } + #include "mainloop/win_level_condition.h" - // Automatic scripting calls (USE_ANIM & fire zone) + // Update propellers - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" + #ifdef ENABLE_PROPELLERS + if (propellers_on) propellers_do (); #endif // Update bullets @@ -411,10 +403,21 @@ void game_loop (void) { cocos_do (); #endif + // Paint player + + oam_index_player = oam_index; + if (!warp_to_level) player_render (); + // Update enemies enems_move (); + // Warp to level + + if (warp_to_level) { + update_cycle (); music_stop (); break; + } + // Do resonators #ifdef ENABLE_RESONATORS @@ -454,6 +457,8 @@ void game_loop (void) { #ifdef ENABLE_TILE_CHAC_CHAC chac_chacs_do (); #endif + + #include "my/extra_routines.h" } // Cheat to skip level diff --git a/examples/08_cheril_the_writer/dev/mainloop/asset_setup.h b/examples/08_cheril_the_writer/dev/mainloop/asset_setup.h index 53304f8..683f300 100644 --- a/examples/08_cheril_the_writer/dev/mainloop/asset_setup.h +++ b/examples/08_cheril_the_writer/dev/mainloop/asset_setup.h @@ -35,6 +35,7 @@ c_max_enems = l_player_max_enems [level]; c_map_w = l_map_w [level]; + c_map_h = l_map_h [level]; #if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) c_interactives = @@ -79,6 +80,7 @@ #endif c_map_w = MAP_W; + c_map_h = MAP_H; #if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) c_interactives = @@ -86,3 +88,5 @@ #endif #endif + +rda = c_map_h; c_map_size = 0; while (rda --) c_map_size += c_map_w; diff --git a/examples/08_cheril_the_writer/dev/mainloop/flickscreen.h b/examples/08_cheril_the_writer/dev/mainloop/flickscreen.h index b051cac..fa522be 100644 --- a/examples/08_cheril_the_writer/dev/mainloop/flickscreen.h +++ b/examples/08_cheril_the_writer/dev/mainloop/flickscreen.h @@ -4,8 +4,7 @@ // Change screen // Very basic. Extend when needed. -if (flick_override == 0 && warp_to_level == 0) { - +void flickscreen_do_horizontal (void) { if (prx == 4 && #if defined (PLAYER_TOP_DOWN) || !defined (ENABLE_CONVEYORS) pvx < 0 @@ -24,24 +23,30 @@ if (flick_override == 0 && warp_to_level == 0) { ) { ++ n_pant; px = 4 << FIXBITS; + } +} + +void flickscreen_do_vertical (void) { #ifdef PLAYER_TOP_DOWN - } else if (pry <= 16 && pvy < 0) { + if (pry <= 16 && pvy < 0) { n_pant -= c_map_w; py = 192 << FIXBITS; } else if (pry >= 192 && pvy > 0) { n_pant += c_map_w; py = 16 << FIXBITS; + } #else - } else if (pry == 0 && pvy < 0 && n_pant >= c_map_w) { + + if (pry == 0 && pvy < 0 && n_pant >= c_map_w) { n_pant -= c_map_w; py = 192 << FIXBITS; if (pvy > -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - } else if (pry >= 192 && pvy > 0) { + } else if (pry >= 192 && pvy > 0 && n_pant < c_map_size - c_map_w) { n_pant += c_map_w; py = 0; + } + #endif - } - } diff --git a/examples/08_cheril_the_writer/dev/mainloop/hotspots.h b/examples/08_cheril_the_writer/dev/mainloop/hotspots.h index c41ce24..a3f0550 100644 --- a/examples/08_cheril_the_writer/dev/mainloop/hotspots.h +++ b/examples/08_cheril_the_writer/dev/mainloop/hotspots.h @@ -187,6 +187,7 @@ if (hrt) { ++ pstars; rda = SFX_OBJECT; break; #endif + #include "my/extra_hotspots.h" } if (rda) { sfx_play (rda, 1); diff --git a/examples/08_cheril_the_writer/dev/mainloop/relocate_player.h b/examples/08_cheril_the_writer/dev/mainloop/relocate_player.h new file mode 100644 index 0000000..03d4d35 --- /dev/null +++ b/examples/08_cheril_the_writer/dev/mainloop/relocate_player.h @@ -0,0 +1,19 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Check if the player needs to be relocated after respawning. + + #if defined (DIE_AND_RESPAWN) && defined (ENABLE_BREAKABLE) + if (pmayneedrelocation) { + pmayneedrelocation = 0; + gpit = 16; + while (gpit --) { + cx1 = prx >> 4; cx2 = (prx + 7) >> 4; + cy1 = cy2 = (pry + 15) >> 4; + cm_two_points (); + if ((at1 & 8) == 0 && (at2 & 8) == 0) break; + prx += 16; // Try next cell + } + px = prx << FIXBITS; + } + #endif \ No newline at end of file diff --git a/examples/08_cheril_the_writer/dev/mainloop/timer.h b/examples/08_cheril_the_writer/dev/mainloop/timer.h index 57ef5d9..1347ba6 100644 --- a/examples/08_cheril_the_writer/dev/mainloop/timer.h +++ b/examples/08_cheril_the_writer/dev/mainloop/timer.h @@ -22,6 +22,8 @@ if (timer_on && timer) { run_script (2 * MAP_SIZE + 3); #endif } + + #include "my/on_timer_tick.h" } } #ifdef TIMER_TIME_FLAG diff --git a/examples/08_cheril_the_writer/dev/mainloop/win_level_condition.h b/examples/08_cheril_the_writer/dev/mainloop/win_level_condition.h new file mode 100644 index 0000000..2bc3e46 --- /dev/null +++ b/examples/08_cheril_the_writer/dev/mainloop/win_level_condition.h @@ -0,0 +1,26 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Win level condition. Note the precedence if severan items are +// #defined: first, WIN_LEVEL_CUSTOM, then ACTIVATE_SCRIPTING (by WIN LEVEL), +// then, ponjs == PLAYER_MAX_OBJECTS, then "ending location" + + if ( + #if defined (WIN_LEVEL_CUSTOM) + win_level + #elif defined (ACTIVATE_SCRIPTING) + script_result == 1 + #elif defined (PLAYER_MAX_OBJECTS) + pobjs == PLAYER_MAX_OBJECTS + #elif defined (SCR_END) + ( + n_pant == SCR_END && + ((prx + 8) >> 4) == PLAYER_END_X && + ((pry + 8) >> 4) == PLAYER_END_Y + ) + #endif + ) { + music_stop (); + delay (50); + break; + } diff --git a/examples/08_cheril_the_writer/dev/my/custom_center_detections.h b/examples/08_cheril_the_writer/dev/my/custom_center_detections.h new file mode 100644 index 0000000..963c83d --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/custom_center_detections.h @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// custom_center_detections.h +// at1 constains the tile beh at the center of the player sprite +// For this code to be included, enable CUSTOM_CENTER_DETECTIONS in config.h diff --git a/examples/08_cheril_the_writer/dev/my/effects.h b/examples/08_cheril_the_writer/dev/my/effects.h new file mode 100644 index 0000000..333066d --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/effects.h @@ -0,0 +1,5 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Effects - This code gets included right before waiting for next NMI +// Add here palette cycles/etc, splits... diff --git a/examples/08_cheril_the_writer/dev/my/extra_hotspots.h b/examples/08_cheril_the_writer/dev/my/extra_hotspots.h new file mode 100644 index 0000000..0ec35ab --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/extra_hotspots.h @@ -0,0 +1,17 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add support for custom hotspots types here. Support for each +// new type of hotspot should be coded in a 'case', like this: + +/* + case HOTSPOT_TYPE_MY_OWN: + rda = SFX_OBJECT; + // do stuff + break; +*/ + +// If rda != 0, the engine will play the sound in rda when getting +// the hotspot. + +// hrt contains the hotspot type, in case you need it. diff --git a/examples/08_cheril_the_writer/dev/my/extra_modules.h b/examples/08_cheril_the_writer/dev/my/extra_modules.h new file mode 100644 index 0000000..110e0e3 --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/extra_modules.h @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Extra modules. #include here custom code you write. + +// Ring implementation, Sonic SMS style: diff --git a/examples/08_cheril_the_writer/dev/my/extra_routines.h b/examples/08_cheril_the_writer/dev/my/extra_routines.h new file mode 100644 index 0000000..e93f807 --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/extra_routines.h @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Extra routines. +// Add here calls to routines which need to update sprites and/or bg. + \ No newline at end of file diff --git a/examples/08_cheril_the_writer/dev/my/on_player_coco.h b/examples/08_cheril_the_writer/dev/my/on_player_coco.h new file mode 100644 index 0000000..12c9eec --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/on_player_coco.h @@ -0,0 +1,11 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by a coco. + +// The default action can be overriden assigning values to flags: +// en_sg_2 controls if player suffers or not. + +// If +// - Player has rings (prings) +// Then create animated ring, but don't hurt the player! diff --git a/examples/08_cheril_the_writer/dev/my/on_player_hit.h b/examples/08_cheril_the_writer/dev/my/on_player_hit.h new file mode 100644 index 0000000..ba76abc --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/on_player_hit.h @@ -0,0 +1,13 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by an enemy. + +// The default action can be overriden assigning values to flags: +// en_sg_1 controls if enemy suffers or not. +// en_sg_2 controls if player suffers or not. + +// If: +// - Player will suffer (hit registered, not spinning): en_sg_2 +// - Player has rings (prings) +// Then create animated ring, and simulate hit but don't hurt player! diff --git a/examples/08_cheril_the_writer/dev/my/on_player_spike.h b/examples/08_cheril_the_writer/dev/my/on_player_spike.h new file mode 100644 index 0000000..fbb1bc6 --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/on_player_spike.h @@ -0,0 +1,11 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by a killing tile. + +// The default action can be overriden assigning values to flags: +// en_sg_2 controls if player suffers or not. + +// If +// - Player has rings (prings) +// Then create animated ring, but don't hurt the player! diff --git a/examples/08_cheril_the_writer/dev/my/on_tile_got.h b/examples/08_cheril_the_writer/dev/my/on_tile_got.h new file mode 100644 index 0000000..dc2066d --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/on_tile_got.h @@ -0,0 +1,7 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. An TILE_GET has just been got. +// You may add checks and set variables and stuff. + +// The value of the tile just got is QTILE (cx1, cy1) diff --git a/examples/08_cheril_the_writer/dev/my/on_timer_tick.h b/examples/08_cheril_the_writer/dev/my/on_timer_tick.h new file mode 100644 index 0000000..484f553 --- /dev/null +++ b/examples/08_cheril_the_writer/dev/my/on_timer_tick.h @@ -0,0 +1,5 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Timer has ticked (a second passed) +// timer_zero equals 1 if timer == 0. diff --git a/examples/08_cheril_the_writer/dev/neslib.h b/examples/08_cheril_the_writer/dev/neslib.h index 46c73fb..f4ac0a8 100644 --- a/examples/08_cheril_the_writer/dev/neslib.h +++ b/examples/08_cheril_the_writer/dev/neslib.h @@ -47,9 +47,9 @@ void __fastcall__ ppu_on_spr(void); //set PPU_MASK directly -;void __fastcall__ ppu_mask(unsigned char mask); - +void __fastcall__ ppu_mask(unsigned char mask); +unsigned char __fastcall__ ppu_system(void); //clear OAM buffer, all the sprites are hidden @@ -121,6 +121,7 @@ unsigned char __fastcall__ pad_state(unsigned char pad); void __fastcall__ scroll(unsigned int x,unsigned int y); +void __fastcall__ split(unsigned int x,unsigned int y); //select current chr bank for sprites, 0..1 diff --git a/examples/08_cheril_the_writer/dev/neslib.s b/examples/08_cheril_the_writer/dev/neslib.s index 80898c2..dd0a181 100644 --- a/examples/08_cheril_the_writer/dev/neslib.s +++ b/examples/08_cheril_the_writer/dev/neslib.s @@ -4,11 +4,11 @@ .export _pal_all,_pal_bg,_pal_spr,_pal_col,_pal_clear,_pal_bright - .export _ppu_off,_ppu_on_all,_ppu_on_bg,_ppu_on_spr,_ppu_mask + .export _ppu_off,_ppu_on_all,_ppu_on_bg,_ppu_on_spr,_ppu_mask, _ppu_system .export _oam_clear,_oam_size,_oam_spr,_oam_meta_spr,_oam_hide_rest .export _ppu_waitnmi .export _unrle_vram - .export _scroll + .export _scroll, _split .export _bank_spr,_bank_bg .export _vram_read,_vram_write .export _music_play,_music_stop,_music_pause @@ -225,7 +225,11 @@ _ppu_off: sta PPU_MASK rts +;unsigned char __fastcall__ ppu_system(void); +_ppu_system: + lda kL+rmt#A1(@*7<@ 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 delta 10425 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 diff --git "a/examples/09_cad\303\240veri\303\266n/dev/config.h" "b/examples/09_cad\303\240veri\303\266n/dev/config.h" index 80a087d..5bc93ca 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/config.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/config.h" @@ -6,6 +6,10 @@ #define GAME_AREA_BOTTOM //#define GAME_AREA_CUSTOM +#define MAP_CLEAR_LIST_ADDRESS 0x2c40 // To store map persistence in VRAM. + // Each screen takes 24 bytes. move it where + // It fits. Below 2c40 you may "see" the buffer + // ============================================================================ // I. General configuration // ============================================================================ @@ -59,7 +63,8 @@ //#define HOTSPOT_TYPE_AMMO 4 #define HOTSPOT_TYPE_TIME 5 // For time refills -//#define HOTSPOT_TYPE_RESONATOR 4 // An example of custom hotspot +//#define HOTSPOT_TYPE_RESONATOR 4 // An example of custom hotspot +//#define HOTSPOT_TYPE_RESONATOR_ON 5 // Custom for this game. //#define WIN_LEVEL_CUSTOM // A level ends when win_level == 1 // And such a thing has to be setup by YOU @@ -122,17 +127,19 @@ #define DEACTIVATE_KEYS // If defined, keys are not present. #define DEACTIVATE_OBJECTS // If defined, objects are not present. -//#define PLAYER_BOUNCES +//#define PLAYER_BOUNCES 16 //#define DOUBLE_BOUNCE -#define DIE_AND_RESPAWN // If defined, dying = respawn on latest safe. -#define DIE_AND_REENTER // ... also, reenter screen on death -#define PLAYER_FLICKERS // If defined, collisions make player flicker instead. -#define WALLS_STOP_ENEMIES // If defined, enemies react to the scenary +#define DIE_AND_RESPAWN // If defined, dying = respawn on latest safe. + #define DIE_AND_REENTER // ... also, reenter screen on death + //#define DIE_AND_REINIT // ... or start the level over! +#define PLAYER_FLICKERS 100 // If defined, collisions make player flicker for N frames +#define WALLS_STOP_ENEMIES // If defined, enemies react to the scenary // Extra special tiles // ------------------- //#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically +//#define CUSTOM_CENTER_DETECTIONS // Define this if you need custom tile behs // Quicksands, beh == 2. // For player movement values, see section 4 @@ -141,14 +148,14 @@ //#define ENABLE_QUICKSANDS // Breakable, beh & 16 -//#define ENABLE_BREAKABLE // Breakable walls -#define BREAKABLE_LIFE 2 // Amount of hits to break wall -#define BREAKABLE_ANIM // Show explosion when breaking -#define BREAKABLE_MAX 4 // Max # of concurrent explosions -#define BREAKABLE_MAX_FRAMES 8 // Frames to show explosion -#define BREAKABLE_ERASE 0 // Tile to erase broken tiles -#define BREAKABLE_BREAKING 8 // Tile to display while breaking -//#define BREAKABLE_WALKABLE // If defined (side view), tiles break when stepped on +//#define ENABLE_BREAKABLE // Breakable walls +#define BREAKABLE_LIFE 2 // Amount of hits to break wall +#define BREAKABLE_ANIM // Show explosion when breaking +#define BREAKABLE_MAX 4 // Max # of concurrent explosions +#define BREAKABLE_MAX_FRAMES 8 // Frames to show explosion +#define BREAKABLE_ERASE 0 // Tile to erase broken tiles +#define BREAKABLE_BREAKING 8 // Tile to display while breaking +//#define BREAKABLE_WALKABLE // If defined (side view), tiles break when stepped on // Conveyors, beh & 32 [+1] (must be & 8!) // For player movement values, see section 4 @@ -166,6 +173,17 @@ //#define ENABLE_LADDERS +// Special, "collectable" map tiles. +// beh == 34 + +//#define ENABLE_TILE_GET +//#define PERSISTENT_TILE_GET + +// Trampolines. Needs PLAYER_VY_TRAMPOLINE +// beh == 66 + +//#define ENABLE_TRAMPOLINES + // Extra special stuff // ------------------- @@ -251,10 +269,15 @@ //#define ENEMS_IN_CHRROM // Enems are stored somewhere in CHR-ROM #define ENEMS_LIFE_GAUGE 2 // Amount of shots/punches/kicks needed to kill enemies. +//#define NEEDS_LIFE_GAUGE_LOGIC // This is activated automaticly when needed, but you can + // do it yourself if you need it to do customs... + //#define ENEMS_FLICKER // Ifdef: flicker, if not: explosion //#define ENEMS_FLICKER_ONLY_ON_DYING // Flicker, but only when life == 0 //#define ENEMS_CAN_RESPAWN // Read docs for this. +//#define ENEMS_TREMBLE // Make enemies tremble when hit + //#define PERSISTENT_ENEMIES //#define PERSISTENT_DEATHS @@ -272,23 +295,27 @@ // Beware: only activate this if enemies are killable by any means: //#define ENEMIES_SUFFER_ON_PLAYER_COLLISION -// Fanties / Homing fanties +// Fanties / Homing fanties / Timed fanties //#define ENABLE_FANTY //#define ENABLE_HOMING_FANTY +//#define ENABLE_TIMED_FANTY #define FANTY_BASE_SPRID 32 #define FANTY_WITH_FACING #define FANTY_COLLIDES -#define FANTY_KILLED_BY_TILE +//#define FANTY_KILLED_BY_TILE //#define FANTY_LIFE_GAUGE 5 // Define if you need these to be tougher #define FANTY_A 4 #define FANTY_MAXV 48 +//#define FANTY_FAST_ANIM // If defined, cells A/B are changed every frame (for transparency effects) #define FANTY_DISTANCE 80 #define FANTY_V_RETREAT 16 +#define FANTY_BASE_TIMER 120 // Timed fanties use this + // Pursuers (for top-down) //#define ENABLE_PURSUERS // If defined, type 7 enemies are active @@ -365,6 +392,24 @@ #define COMPILED_ENEMS_SHOOT #define COMPILED_ENEMS_BASE_SPRID 48 +// Boioiongs + +//#define ENABLE_BOIOIONG +#define BOIOIONG_G 16 +#define BOIOIONG_VY_MAX 256 +#define BOIOIONG_BASE_SPRID 54 +//#define BOIOIONG_ACTIVE_BY_DEFAULT // Define and they are active by default +//#define BOIOIONG_INITIAL_TIMER 200 // If active by default, time to be active in frames +//#define BOIOIONG_AUTO_RESPAWN + +// Catacrocks + +//#define ENABLE_CATACROCKS +#define CATACROCK_G 16 +#define CATACROCK_MAX_V 256 +#define CATACROCK_CROCK_FRAMES 50 +#define CATACROCK_BASE_SPRID 50 + // Cocos will get enabled automaticly on choosing monococos or shooties. //#define ENABLE_COCOS @@ -440,7 +485,7 @@ #define ACTIVATE_SCRIPTING // Activates msc scripting and flag related stuff. #define CLEAR_FLAGS // Zero all flags when entering a level -#define ENABLE_EXTERN_CODE // Enables custom code to be run from the script using EXTERN n +#define ENABLE_EXTERN_CODE // Enables custom code to be run from the script using EXTERN n #define ENABLE_FIRE_ZONE // Allows to define a zone which auto-triggers "FIRE" // Interactives @@ -460,16 +505,23 @@ // Side view: // ---------- +// Choose ONE or SEVERAL of those. +// If you choose several, use the vertical_engine_type variable to select + //#define PLAYER_HAS_JUMP // If defined, player is able to jump. -//#define PLAYER_JUMP_TYPE_MK2 // Use MK2 method for jump / gravity / release //#define PLAYER_AUTO_JUMP // Automatic jump when hitting the floor //#define PLAYER_SWIMS // If defined, player swims a la Ninjajar! //#define PLAYER_HAS_JETPAC // If defined, player can thrust a vertical jetpac + +// Extra configuration for side view: + +//#define PLAYER_JUMP_TYPE_MK2 // Use MK2 method for jump / gravity / release //#define PLAYER_STEPS_ON_ENEMS // If defined, stepping on enemies kills them //#define PLAYER_STEPS_STRICT // Only registers advantage hit when pvy > PLAYER_VY_FALLING_MIN //#define PLAYER_SAFE_LANDING // Step over vertical inverts direction //#define PLAYER_STEPS_MIN_KILLABLE 0xff // Only kill enemies with id >= PLAYER_STEPS_MIN_KILLABLE // 0xff = Nobody +//#define PLAYER_SPINS // Spins on DOWN and JUMP and kills baddies // ============================================================================ // III. Screen configuration @@ -520,6 +572,7 @@ #define PLAYER_G 16 // Gravity #define PLAYER_VY_JUMP_INITIAL 64 +#define PLAYER_VY_JUMP_INITIAL_TRAMPOLINE 128 #define PLAYER_VY_JUMP_MAX 192 // Max. velocity when jumping #define PLAYER_AY_JUMP 12 // Jumpin acceleration @@ -542,6 +595,8 @@ #define PLAYER_VY_MK2_JUMP_INITIAL 208 #define PLAYER_VY_MK2_JUMP_RELEASE 96 #define PLAYER_VY_MK2_JUMP_A_STEPS 16 +#define PLAYER_VY_MK2_JUMP_INITIAL_TRAMPOLINE 296 +#define PLAYER_VY_MK2_TRAMPOLINE_A_STEPS 32 // For trampolines // IV.2. Horizontal (side view) or general (top view) movement. @@ -584,6 +639,9 @@ #define CELL_WALK_INIT 1 #define CELL_WALK_CYCLE 1 #define CELL_AIRBORNE 5 + + #define CELL_SPIN_CYCLE 5 + #define CELL_ASCENDING 5 #define CELL_DESCENDING 6 @@ -594,6 +652,8 @@ #define CELL_PUNCHING 8 #define CELL_KICKING 9 + #define CELL_HIT 9 + #define CELL_CLIMB_CYCLE 20 #define CELL_CLIMB_HALF 29 #endif @@ -610,6 +670,7 @@ #define SFX_TILE 1 #define SFX_OBJECT 2 #define SFX_USE 3 +#define SFX_TRAMPOLINE 3 #define SFX_PHIT 4 #define SFX_DUMMY1 5 #define SFX_ENHIT 6 @@ -624,3 +685,5 @@ #define SFX_STEPON 15 #define SFX_FLOAT 16 #define SFX_BREAKB 17 +#define SFX_RING 18 +#define SFX_FANFARE 19 diff --git "a/examples/09_cad\303\240veri\303\266n/dev/crt0.s" "b/examples/09_cad\303\240veri\303\266n/dev/crt0.s" index 3151b83..dce496d 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/crt0.s" +++ "b/examples/09_cad\303\240veri\303\266n/dev/crt0.s" @@ -20,7 +20,7 @@ FT_SFX_STREAMS =4 ;number of sound effects played at once, can be 4 or less (f .define FT_DPCM_ENABLE 0 ;zero to exclude all the DMC code .define FT_SFX_ENABLE 1 ;zero to exclude all the sound effects code -.define SPEED_FIX 1 ;zero if you want to handle PAL/NTSC speed difference by yourself +.define SPEED_FIX 0 ;zero if you want to handle PAL/NTSC speed difference by yourself .export _exit,__STARTUP__:absolute=1 .import push0,popa,popax,_main,zerobss,copydata @@ -71,6 +71,8 @@ RAND_SEED =$1a ;word PALUPDATE =$1c TEMP =$1d +SCROLL_X1 =$1e ;Added by mojon twins +PPU_CTRL_VAR1=$1f ;Added by mojon twins PAD_BUF =TEMP+1 diff --git "a/examples/09_cad\303\240veri\303\266n/dev/definitions.h" "b/examples/09_cad\303\240veri\303\266n/dev/definitions.h" index fbf256b..9d02020 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/definitions.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/definitions.h" @@ -50,3 +50,10 @@ #define EN_STATE_DEAD 1 #define EN_STATE_SPAWNING 2 + +// Vertical engine type for side_view + +#define ENGINE_TYPE_JUMP 0 +#define ENGINE_TYPE_JET_PAC 1 +#define ENGINE_TYPE_SWIM 2 +#define ENGINE_TYPE_AUTO_JUMP 3 diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/cocos.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/cocos.h" index 5547eed..f6fbfd8 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/cocos.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/cocos.h" @@ -17,7 +17,12 @@ void cocos_init (void) { void cocos_shoot_aimed (void) { rdct = distance (); - if (rdct > COCO_FAIR_D && coco_slots_i) { + #ifdef COCO_FAIR_D + if (rdct > COCO_FAIR_D && coco_slots_i) + #else + if (coco_slots_i) + #endif + { -- coco_slots_i; coco_it = coco_slots [coco_slots_i]; coco_x [coco_it] = rdx << 6; @@ -86,13 +91,15 @@ void cocos_do (void) { #endif // Collide w/player - if (pstate == EST_NORMAL && + if (pflickering == 0 && rdx + 7 >= prx && rdx <= prx + 7 && rdy + 7 + PLAYER_COLLISION_VSTRETCH_FG >= pry && rdy <= pry + 12 ) { - pkill = 1; + en_sg_2 = 1; + #include "my/on_player_coco.h" + pkill = !!en_sg_2; cocos_destroy (); } } diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_boioiong.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_boioiong.h" new file mode 100644 index 0000000..dc438f6 --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_boioiong.h" @@ -0,0 +1,78 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Boioiongs bounce around the screen until a timer exhausts. + +if (_en_ct) { + _en_ct --; + + // Vertical movement & collision + // ----------------------------- + + _enf_vy += BOIOIONG_G; if (_enf_vy > BOIOIONG_VY_MAX) _enf_vy = BOIOIONG_VY_MAX; + _enf_y += _enf_vy; + + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > (192 << FIXBITS)) _enf_y = (192 << FIXBITS); + + _en_y = _enf_y >> FIXBITS; _en_x = _enf_x >> FIXBITS; + + cx1 = _en_x >> 4; cx2 = (_en_x + 15) >> 4; rda = 0; + + if (_enf_vy > 0) { + cy1 = cy2 = (_en_y + 15) >> 4; + rda = 13; rds = -16; + } else if (_enf_vy < 0) { + cy1 = cy2 = _en_y >> 4; + rda = 9; rds = 16; + } + + if (rda) { + cm_two_points (); + if ((at1 & rda) || (at2 & rda)) { + _en_y = rds + (cy1 << 4); + _enf_vy = -_enf_vy; + } + } + + _enf_y = _en_y << FIXBITS; + + // Horizontal movement & collision + // ------------------------------- + + _enf_x += _enf_vx; + _en_x = _enf_x >> FIXBITS; + + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > (240 << FIXBITS)) _enf_x = (240 << FIXBITS); + + cy1 = _en_y >> 4; cy2 = (_en_y + 15) >> 4; rda = 0; + + if (_enf_vx) { + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 15) >> 4; rds = -16; + } else { + cx1 = cx2 = _en_x >> 4; rds = 16; + } + + cm_two_points (); + if ((at1 & 9) || (at2 & 9)) { + _en_x = rds + (cx1 << 4); + _enf_vx = -_enf_vx; + } + } + + _enf_x = _en_x << FIXBITS; + + // Sprite + + if (_en_ct > 50 || half_life) { + en_spr = _en_s + ((frame_counter >> 2) & 1); + } +} +#ifdef BOIOIONG_AUTO_RESPAWN +else { + _en_x = _en_x1; _en_y = _en_y1; + enems_boioiong_init (); +} +#endif diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_catacrock.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_catacrock.h" new file mode 100644 index 0000000..701d9fd --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_catacrock.h" @@ -0,0 +1,37 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Appear, fall, and catacrock. + +switch (_en_state) { + case 0: + // Idling. + if (_en_ct) _en_ct --; else { + _en_state = 1; + _enf_y = _en_y << FIXBITS; _enf_vy = 0; + } + break; + + case 1: + // Falling + _enf_vy += CATACROCK_G; if (_enf_vy > CATACROCK_MAX_V) _enf_vy = CATACROCK_MAX_V; + _enf_y += _enf_vy; _en_y = _enf_y >> FIXBITS; + + if (_en_y > _en_y2) { + _en_state = 2; + _en_ct = CATACROCK_CROCK_FRAMES; + _en_y = _en_y2; + } + break; + + case 2: + // Catacrock + if (_en_ct) _en_ct --; else { + _en_state = 0; + _en_ct = CATACROCK_WAIT; + _en_y = _en_y1; + } + +} + +en_spr = _en_state + CATACROCK_BASE_SPRID; diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_chac_chac.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_chac_chac.h" index 769d8f8..a8f8cb2 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_chac_chac.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_chac_chac.h" @@ -2,14 +2,15 @@ // Copyleft Mojon Twins 2013, 2015, 2017, 2018 // CHAC CHAC! +// DEPRECATED -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Wait for idle. if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1); _en_mx = CHAC_CHAC_IDLE_2; - en_alive [gpit] = 1; + _en_state = 1; } break; case 1: @@ -17,7 +18,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 3); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 2; + _en_state = 2; } break; case 2: @@ -25,7 +26,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 5, CHAC_CHAC_BASE_TILE + 4, CHAC_CHAC_BASE_TILE + 5); _en_mx = CHAC_CHAC_IDLE_4; - en_alive [gpit] = 3; + _en_state = 3; sfx_play (SFX_STEPON, 1); shaker_ct = 8; } @@ -35,7 +36,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 3); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 4; + _en_state = 4; } break; case 4: @@ -43,7 +44,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 5; + _en_state = 5; } break; case 5: @@ -51,7 +52,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6); _en_mx = _en_my; - en_alive [gpit] = 0; + _en_state = 0; } break; } diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_compiled.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_compiled.h" index 050e80c..39cab39 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_compiled.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_compiled.h" @@ -6,15 +6,9 @@ // needs endx [8], endy [8] from precalcs.h if (_en_ct) { - // Do - - switch (en_alive [gpit]) { + switch (_en_state) { case 0: // Idling - - // Idle animation, cells 2, 3. - en_spr = _en_s + _en_facing + 2 + - ((frame_counter >> 3) & 1); break; case 1: // Moving @@ -23,8 +17,6 @@ if (_en_ct) { rdx = _en_x; _en_x += _en_mx; rdy = _en_y; _en_y += _en_my; - // Moving animation, cells 0, 1. - en_spr = _en_s + _en_facing + en_fr; break; } @@ -35,42 +27,64 @@ if (_en_ct) { // the whole array and that a proper RETURN is issued! rda = *en_behptr [gpit] ++; - en_alive [gpit] = 0; - + _en_state = 0; + rdc = (rda & 0x38) >> 3; rdt = rda & 0x07; switch (rda & 0xc0) { // Command case 0x00: - // IDLE - rdb = 1; while (rdt --) rdb += 25; - _en_ct = rdb; + // IDLE / EXTERN + if (rdt == 0) { + // EXTERN + do_extern_action (*en_behptr [gpit] ++); + } else { + // IDLE + rdb = 0; while (rdt --) rdb += 25; + _en_ct = rdb; + en_rawv [gpit] = _en_s + 2 + _en_facing; + } break; case 0x40: // ADVANCE - _en_mx = endx [rdc]; _en_my = endy [rdc]; + _en_mx = endx [rdc] << _en_x1; _en_my = endy [rdc] << _en_x1; - rda = (_en_mx < 0); enems_facing (); - if (_en_mx < 0) _en_facing = 4; else if (_en_mx > 0) _en_facing = 0; // If _en_mx == 0, no change! + en_rawv [gpit] = _en_s + _en_facing; - _en_ct = rdt << 4; en_alive [gpit] = 1; + _en_ct = (rdt << 4) >> _en_x1; _en_state = 1; break; case 0x80: - // FIRE - rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); + // FIRE & SPEED + rdb = rda & 0x3f; + if (rdb > 0x3b) { + // SPEED + _en_x1 =0x3f - rda; // 0 for 1, 1 for 2, 2 for 4, 3 for 8 + } else { + // FIRE + rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); + } + break; case 0xC0: // RETURN en_behptr [gpit] -= ((rda & 0x3f) + 1); + break; } - - en_spr = _en_s + _en_facing; } +en_spr = en_rawv [gpit]; +switch (_en_state) { + case 0: + en_spr += ((frame_counter >> 3) & 1); + break; + case 1: + en_spr += en_fr; + break; +} diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_fanty.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_fanty.h" index b835c1e..2e15f02 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_fanty.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_fanty.h" @@ -1,101 +1,101 @@ // NES MK1 v1.0 // Copyleft Mojon Twins 2013, 2015, 2017, 2018 -// Fanties - -#ifdef FANTY_KILLED_BY_TILE - #define FANTY_OBSTACLE(a) ((a)>1) -#else - #define FANTY_OBSTACLE(a) (a) -#endif - -// Modify v - -if (px < _enf_x) { - _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; -} else { - _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; -} - -if (py < _enf_y) { - _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; -} else { - _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; -} - -// Horizontal - -_enf_x += _enf_vx; -if (_enf_x < 0) _enf_x = 0; -if (_enf_x > 15360) _enf_x = 15360; -_en_x = _enf_x >> 6; - -#ifdef FANTY_COLLIDES - - if (_enf_vx) { - cy1 = (_en_y + 4) >> 4; - cy2 = (_en_y + 11) >> 4; + // Fanties + + // Modify v - if (_enf_vx > 0) { - cx1 = cx2 = (_en_x + 11) >> 4; - rda = ((cx2 - 1) << 4) + 4; - } else { - cx1 = cx2 = (_en_x + 4) >> 4; - rda = ((cx1 + 1) << 4) - 4; - } - cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vx = -_enf_vx; - _en_x = rda; - _enf_x = rda << 6; - } + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; } -#endif + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } -// Vertical - -_enf_y += _enf_vy; -if (_enf_y < 0) _enf_y = 0; -if (_enf_y > 11264) _enf_y = 11264; -_en_y = _enf_y >> 6; + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } + } -#ifdef FANTY_COLLIDES + #endif - if (_enf_vy) { - cx1 = (_en_x + 4) >> 4; - cx2 = (_en_x + 11) >> 4; + // Vertical - if (_enf_vy > 0) { - cy1 = cy2 = (_en_y + 11) >> 4; - rda = ((cy2 - 1) << 4) + 4; - } else { - cy1 = cy2 = (_en_y + 4) >> 4; - rda = ((cy1 + 1) << 4) - 4; + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } } + #endif + + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vy = -_enf_vy; - _en_y = rda; - _enf_y = rda << 6; + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); } - } + #endif +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; #endif -#ifdef FANTY_KILLED_BY_TILE - cx1 = (_en_x + 8) >> 4; - cy1 = (_en_y + 8) >> 4; - cm_two_points (); - if (at1 & 1) { - en_cttouched [gpit] = 8; - enems_kill (); - } -#endif - -en_fr = (_en_x >> 3) & 1; - #ifdef FANTY_WITH_FACING //_en_facing = ((_en_x < prx) ? 0 : 4); rda = (prx < _en_x); enems_facing (); @@ -103,3 +103,4 @@ en_fr = (_en_x >> 3) & 1; #else en_spr = _en_s + en_fr; #endif + diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_homing_fanty.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_homing_fanty.h" index cba1185..b45aab0 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_homing_fanty.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_homing_fanty.h" @@ -3,125 +3,125 @@ // Fanties that have a home -#ifdef FANTY_KILLED_BY_TILE - #define FANTY_OBSTACLE(a) ((a)>1) -#else - #define FANTY_OBSTACLE(a) (a) -#endif - -// Precalc distance -rdx = _en_x; rdy = _en_y; rdt = distance (); - -// Modify v - always upon state - -switch (en_alive [gpit]) { - case 0: - // Retreating - _enf_vx = ADD_SIGN2 (_en_x1, _en_x, FANTY_V_RETREAT); - _enf_vy = ADD_SIGN2 (_en_y1, _en_y, FANTY_V_RETREAT); - if (rdt < FANTY_DISTANCE) en_alive [gpit] = 1; - break; - case 1: - // Pursuing - if (px < _enf_x) { - _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; - } else { - _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; - } + // Precalc distance + rdx = _en_x; rdy = _en_y; rdt = distance (); + + // Modify v + + switch (_en_state) { + case 0: + // Retreating + _enf_vx = ADD_SIGN2 (_en_x1, _en_x, FANTY_V_RETREAT); + _enf_vy = ADD_SIGN2 (_en_y1, _en_y, FANTY_V_RETREAT); + if (rdt < FANTY_DISTANCE) _en_state = 1; + break; + case 1: + // Pursuing + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; + } + + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } + + if (rdt > FANTY_DISTANCE) { + // Adjust to pixel + _enf_x = _en_x << FIXBITS; + _enf_y = _en_y << FIXBITS; + _en_state = 0; + } + break; + } - if (py < _enf_y) { - _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; - } else { - _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } } - if (rdt > FANTY_DISTANCE) { - // Adjust to pixel - _enf_x = _en_x << FIXBITS; - _enf_y = _en_y << FIXBITS; - en_alive [gpit] = 0; + #endif + + // Vertical + + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } } - break; -} - -// Horizontal -_enf_x += _enf_vx; -if (_enf_x < 0) _enf_x = 0; -if (_enf_x > 15360) _enf_x = 15360; -_en_x = _enf_x >> 6; + #endif -#ifdef FANTY_COLLIDES - - if (_enf_vx) { - cy1 = (_en_y + 4) >> 4; - cy2 = (_en_y + 11) >> 4; - - if (_enf_vx > 0) { - cx1 = cx2 = (_en_x + 11) >> 4; - rda = ((cx2 - 1) << 4) + 4; - } else { - cx1 = cx2 = (_en_x + 4) >> 4; - rda = ((cx1 + 1) << 4) - 4; - } + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vx = -_enf_vx; - _en_x = rda; - _enf_x = rda << FIXBITS; + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); } - } - -#endif - -// Vertical + #endif -_enf_y += _enf_vy; -if (_enf_y < 0) _enf_y = 0; -if (_enf_y > 11264) _enf_y = 11264; -_en_y = _enf_y >> 6; - -#ifdef FANTY_COLLIDES - - if (_enf_vy) { - cx1 = (_en_x + 4) >> 4; - cx2 = (_en_x + 11) >> 4; - - if (_enf_vy > 0) { - cy1 = cy2 = (_en_y + 11) >> 4; - rda = ((cy2 - 1) << 4) + 4; - } else { - cy1 = cy2 = (_en_y + 4) >> 4; - rda = ((cy1 + 1) << 4) - 4; - } - - cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vy = -_enf_vy; - _en_y = rda; - _enf_y = rda << FIXBITS; - } - } - -#endif - -#ifdef FANTY_KILLED_BY_TILE - cx1 = (_en_x + 8) >> 4; - cy1 = (_en_y + 8) >> 4; - cm_two_points (); - if (at1 & 1) { - en_cttouched [gpit] = 8; - enems_kill (); - } +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; #endif -en_fr = (_en_x >> 3) & 1; - #ifdef FANTY_WITH_FACING //_en_facing = ((_en_x < prx) ? 0 : 4); rda = (prx < _en_x); enems_facing (); - en_spr = FANTY_BASE_SPRID + en_fr + _en_facing; + en_spr = _en_s + en_fr + _en_facing; #else - en_spr = FANTY_BASE_SPRID + en_fr; + en_spr = _en_s + en_fr; #endif diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_linear.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_linear.h" index b52a7f3..917a549 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_linear.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_linear.h" @@ -46,13 +46,29 @@ if (!en_status [gpit] || half_life) { // Change direction ? - #ifdef WALLS_STOP_ENEMIES - if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; - if (_en_y == _en_y1 || _en_y == _en_y2 || en_colly) _en_my = -_en_my; - #else - if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; - if (_en_y == _en_y1 || _en_y == _en_y2) _en_my = -_en_my; - #endif + #ifdef PLAYER_SAFE_LANDING + #ifdef WALLS_STOP_ENEMIES + if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; + #else + if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; + #endif + #ifdef WALLS_STOP_ENEMIES + if (en_colly) _en_my = -_en_my; + else + #endif + { + if (_en_y <= _en_y1) { _en_y = _en_y1; _en_my = ABS (_en_my); } + else if (_en_y >= _en_y2) { _en_y = _en_y2; _en_my = -ABS (_en_my); } + } + #else + #ifdef WALLS_STOP_ENEMIES + if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; + if (_en_y == _en_y1 || _en_y == _en_y2 || en_colly) _en_my = -_en_my; + #else + if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; + if (_en_y == _en_y1 || _en_y == _en_y2) _en_my = -_en_my; + #endif + #endif } //_en_facing = (_en_mx > 0 || _en_my > 0) ? 0 : 4; diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_monococo.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_monococo.h" index d2bd1f9..d457ba3 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_monococo.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_monococo.h" @@ -4,12 +4,12 @@ // mx is state. my is counter. // Counter & state change --- MONOCOCO_COUNTER; if (!MONOCOCO_COUNTER) { - MONOCOCO_STATE = (MONOCOCO_STATE + 1) & 3; MONOCOCO_COUNTER = monococo_state_times [MONOCOCO_STATE] - (rand8 () & 0x15); +-- _en_ct; if (!_en_ct) { + _en_state = (_en_state + 1) & 3; _en_ct = monococo_state_times [_en_state] - (rand8 () & 0x15); } // Shoot -if (MONOCOCO_STATE == 2 && MONOCOCO_COUNTER == MONOCOCO_FIRE_COCO_AT) { +if (_en_state == 2 && _en_ct == MONOCOCO_FIRE_COCO_AT) { rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); } @@ -18,14 +18,14 @@ if (MONOCOCO_STATE == 2 && MONOCOCO_COUNTER == MONOCOCO_FIRE_COCO_AT) { rda = (prx < rdx); enems_facing (); #ifdef MONOCOCO_TYPE_A if ( - ((MONOCOCO_STATE == 1 || MONOCOCO_STATE == 3) && half_life) || - MONOCOCO_STATE == 2 + ((_en_state == 1 || _en_state == 3) && half_life) || + _en_state == 2 ) { en_spr = MONOCOCO_BASE_SPRID + _en_facing + ((frame_counter >> 5) & 1); } #else en_spr = MONOCOCO_BASE_SPRID + _en_facing; - switch (MONOCOCO_STATE) { + switch (_en_state) { case 0: en_spr += 9; break; diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_pezon.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_pezon.h" index b739b68..9288bb2 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_pezon.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_pezon.h" @@ -10,12 +10,12 @@ oam_index = oam_meta_spr ( spr_enems [ENEMS_OCCLUDING_CELL] ); -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Idling if (_en_mx) { -- _en_mx; } else { - en_alive [gpit] = 1; + _en_state = 1; _enf_y = _en_y1 << 6; _enf_vy = -PEZON_THRUST; sfx_play (SFX_FLOAT, 1); @@ -29,7 +29,7 @@ switch (en_alive [gpit]) { _en_y = _enf_y >> 6; if (_en_y >= _en_y1) { - en_alive [gpit] = 0; + _en_state = 0; _en_mx = _en_my; } else { diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_punchy.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_punchy.h" index 2ac8139..3cdc71e 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_punchy.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_punchy.h" @@ -23,7 +23,13 @@ if (_en_t & 0x40) { sfx_play (SFX_HITTER, 1); // Collide w/player - if (pstate == EST_NORMAL && + if ( + #ifdef PLAYER_FLICKERS + !pflickering && + #endif + #ifdef PLAYER_BOUNCES + !pbouncing && + #endif rdx + 7 >= prx && rdx <= prx + 7 && rdy + 7 + PLAYER_COLLISION_VSTRETCH_FG >= pry && rdy <= pry + 13 diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_pursuers.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_pursuers.h" index 7ada650..fe6da73 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_pursuers.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_pursuers.h" @@ -3,14 +3,14 @@ // Pursuing enemies -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // IDLE if (_en_ct) { -- _en_ct; _en_y = 240; } else { - en_alive [gpit] = 1; + _en_state = 1; _en_x = _en_x1; _en_y = _en_y1; en_rawv [gpit] = 1 << (rand8 () % 5); @@ -22,12 +22,12 @@ switch (en_alive [gpit]) { case 1: // Appearing en_spr = ENEMS_EXPLODING_CELL; - if (_en_ct) -- _en_ct; else en_alive [gpit] = 2; + if (_en_ct) -- _en_ct; else _en_state = 2; break; case 2: // Pursuing - if (pstate == EST_NORMAL && (!en_status [gpit] || half_life)) { + if (pflickering == 0 && pbouncing == 0 && (!en_status [gpit] || half_life)) { _en_mx = add_sign (((prx >> 2) << 2) - _en_x, en_rawv [gpit]); _en_my = add_sign (((pry >> 2) << 2) - _en_y, en_rawv [gpit]); diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_saw.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_saw.h" index 241c928..dc1df35 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_saw.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_saw.h" @@ -8,18 +8,18 @@ rda = (_en_x1 == _en_x2); -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Idling. Goes from 2->1 (backwards). if (rda) { _en_y -= _en_mx; if (_en_y == _en_y1) { - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; } } else { _en_x -= _en_mx; if (_en_x == _en_x1) { - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; } } @@ -34,7 +34,7 @@ switch (en_alive [gpit]) { _en_y += _en_my; } } else { - en_alive [gpit] = 2; + _en_state = 2; } } break; @@ -42,13 +42,13 @@ switch (en_alive [gpit]) { if (rda) { _en_y += _en_mx; if (_en_y == _en_y2) { - en_alive [gpit] = 3; + _en_state = 3; _en_ct = SAW_EMERGING_STEPS; } } else { _en_x += _en_mx; if (_en_x == _en_x2) { - en_alive [gpit] = 3; + _en_state = 3; _en_ct = SAW_EMERGING_STEPS; } } @@ -63,7 +63,7 @@ switch (en_alive [gpit]) { _en_y -= _en_my; } } else { - en_alive [gpit] = 0; + _en_state = 0; } } break; diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_timed_fanty.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_timed_fanty.h" new file mode 100644 index 0000000..4528fcf --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enemmods/enem_timed_fanty.h" @@ -0,0 +1,109 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Timed fanties + +if (_en_ct) _en_ct --; else { + + // Modify v + + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; + } + + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } + + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } + } + + #endif + + // Vertical + + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } + } + + #endif + + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; + cm_two_points (); + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); + } + #endif +} + +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; +#endif + +#ifdef FANTY_WITH_FACING + //_en_facing = ((_en_x < prx) ? 0 : 4); + rda = (prx < _en_x); enems_facing (); + en_spr = _en_s + en_fr + _en_facing; +#else + en_spr = _en_s + en_fr; +#endif + diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/enengine.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/enengine.h" index e8db546..6b60bae 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/enengine.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/enengine.h" @@ -138,12 +138,36 @@ void enems_update_unsigned_char_arrays (void) { __asm__ ("lda %v", _en_facing); __asm__ ("sta %v, y", en_facing); + + __asm__ ("lda %v", _en_state); + __asm__ ("sta %v, y", en_state); + + #ifdef ENEMS_NEED_FP + enf_x [gpit] = _enf_x; enf_vx [gpit] = _enf_vx; + enf_y [gpit] = _enf_y; enf_vy [gpit] = _enf_vy; + #endif } -void enems_facing () { +void enems_facing (void) { _en_facing = rda << 2; } +void enems_init_fp (void) { + _enf_x = _en_x << 6; + _enf_y = _en_y << 6; +} + +void enems_boioiong_init (void) { + enems_init_fp (); + _enf_vy = 0; + _enf_vx = ADD_SIGN2 (_en_x2, _en_x1, rdm << FIXBITS); + #ifdef BOIOIONG_ACTIVE_BY_DEFAULT + _en_ct = BOIOIONG_INITIAL_TIMER; + #else + _en_ct = 0; + #endif +} + void enems_load (void) { #ifdef ENEMS_IN_CHRROM @@ -180,7 +204,7 @@ void enems_load (void) { _en_t = VRAM_READ; // General... - en_alive [gpit] = 0; + _en_state = 0; // YX1 rda = VRAM_READ; @@ -200,7 +224,7 @@ void enems_load (void) { SET_FROM_PTR (_en_t, gp_gen); gp_gen ++; // General... - en_alive [gpit] = 0; + _en_state = 0; // YX1 // rda = *gp_gen ++; @@ -298,17 +322,20 @@ void enems_load (void) { break; #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) + #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_TIMED_FANTY) case 6: // Fantys - enf_x [gpit] = _en_x << 6; - enf_y [gpit] = _en_y << 6; - enf_vx [gpit] = enf_vy [gpit] = 0; + enems_init_fp (); + _enf_vx = _enf_vy = 0; + #ifdef ENABLE_TIMED_FANTY + _en_ct = FANTY_BASE_TIMER; + #endif + _en_s = FANTY_BASE_SPRID; break; #endif - #ifdef ENABLE_PURSUERS + #ifdef ENABLE_PURSUERS case 7: // Pursuers _en_ct = DEATH_COUNT_EXPRESSION; @@ -344,7 +371,7 @@ void enems_load (void) { _en_my = rda; // EMERGING SENSE _en_mx = rdb; // MOVING SENSE - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; break; @@ -377,10 +404,33 @@ void enems_load (void) { #ifdef ENABLE_MONOCOCOS case 11: // Monococos - _en_mx = 0; _en_my = MONOCOCO_BASE_TIME_HIDDEN - (rand8 () & 0x15); + _en_state = 0; _en_ct = MONOCOCO_BASE_TIME_HIDDEN - (rand8 () & 0x15); _en_s = MONOCOCO_BASE_SPRID; break; - #endif + #endif + + #ifdef ENABLE_CATACROCKS + case 12: + // Catacrocks + enems_init_fp (); + _en_state = 0; + CATACROCK_WAIT = _en_ct = rdm << 5; + break; + #endif + + #ifdef ENABLE_BOIOIONG + case 13: + // Boioiongs + #ifdef PERSISTENT_ENEMIES + // Initialize position from ROM + _en_x = _en_x1; + _en_y = _en_y1; + #endif + enems_boioiong_init (); + _en_mx = rdm; // Store + _en_s = BOIOIONG_BASE_SPRID; + break; + #endif #ifdef ENABLE_COMPILED_ENEMS case 20: @@ -390,8 +440,9 @@ void enems_load (void) { _en_y = _en_y1; #endif _en_ct = 0; - _en_s = COMPILED_ENEMS_BASE_SPRID; + en_rawv [gpit] = _en_s = COMPILED_ENEMS_BASE_SPRID; en_behptr [gpit] = en_behptrs [rda]; + _en_x1 = 1; // Repurpose for speed break; #endif @@ -457,7 +508,7 @@ void enems_load (void) { { #ifdef ENABLE_PURSUERS if (_en_t == 7) { - en_alive [gpit] = 0; + _en_state = 0; _en_ct = DEATH_COUNT_EXPRESSION; #ifdef NEEDS_LIFE_GAUGE_LOGIC en_life [gpit] = ENEMS_LIFE_GAUGE; @@ -523,21 +574,23 @@ void enems_move (void) { __asm__ ("lda %v, y", en_facing); __asm__ ("sta %v", _en_facing); - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) + __asm__ ("lda %v, y", en_state); + __asm__ ("sta %v", _en_state); + + #ifdef ENEMS_NEED_FP _enf_x = enf_x [gpit]; _enf_vx = enf_vx [gpit]; - #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_PEZONS) _enf_y = enf_y [gpit]; _enf_vy = enf_vy [gpit]; #endif if (_en_t == 0) continue; en_is_alive = !(en_flags [gpit] & EN_STATE_DEAD); - + // Clear selected sprite // Means don't render (can/will be overwritten): en_spr = 0xff; // "touched" state control + en_spr_x_mod = 0; #ifdef ENEMS_MAY_DIE if (en_cttouched [gpit]) { @@ -557,16 +610,22 @@ void enems_move (void) { en_spr = en_spr_id [gpit]; } #else + rda = frame_counter & 0xf; oam_index = oam_meta_spr ( - _en_x, _en_y + SPRITE_ADJUST, + _en_x + jitter [rda], + _en_y + jitter [15 - rda] + SPRITE_ADJUST, oam_index, spr_enems [ENEMS_EXPLODING_CELL] ); #ifndef ENEMS_EXPLODING_CELLS_HIDES - en_spr = en_spr_id [gpit]; + if (en_life [gpit]) en_spr = en_spr_id [gpit]; #endif #endif + #ifdef ENEMS_TREMBLE + en_spr_x_mod = half_life; + #endif + #ifdef ENEMS_RECOIL_ON_HIT #include "engine/enemmods/enems_recoiling.h" #endif @@ -635,6 +694,12 @@ void enems_move (void) { break; #endif + #ifdef ENABLE_TIMED_FANTY + case 6: + #include "engine/enemmods/enem_timed_fanty.h" + break; + #endif + #ifdef ENABLE_PURSUERS case 7: #include "engine/enemmods/enem_pursuers.h" @@ -665,6 +730,18 @@ void enems_move (void) { break; #endif + #ifdef ENABLE_CATACROCKS + case 12: + #include "engine/enemmods/enem_catacrock.h" + break; + #endif + + #ifdef ENABLE_BOIOIONG + case 13: + #include "engine/enemmods/enem_boioiong.h" + break; + #endif + #ifdef ENABLE_SIMPLE_WARPERS case 0x3f: en_spr = SIMPLE_WARPERS_BASE_SPRID; @@ -695,6 +772,7 @@ void enems_move (void) { n_pant = _en_mx; on_pant = 0xff; prx = _en_x2; px = prx << FIXBITS; pry = _en_y2; py = pry << FIXBITS; + player_stop (); #if defined (SIMPLE_WARPERS_FIRE_BUTTON) && (defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS)) phitteract = 0; @@ -740,23 +818,30 @@ void enems_move (void) { pvy = 0; } } + + #ifdef PLAYER_SPINS + if (pgotten) pspin = 0; + #endif #endif // Is enemy collidable? If not, exit if ( en_is_alive == 0 // General condition. + #ifdef ENEMS_MAY_DIE + || en_cttouched [gpit] + #endif #ifndef PLAYER_TOP_DOWN || _en_t == 4 #endif #ifdef ENABLE_PURSUERS - || (_en_t == 7 && en_alive [gpit] != 2) + || (_en_t == 7 && _en_state != 2) #endif #ifdef ENABLE_SAW - || (_en_t == 8 && en_alive [gpit] != 2) + || (_en_t == 8 && _en_state != 2) #endif #ifdef ENABLE_PEZONS - || (_en_t == 9 && en_alive [gpit] == 0) + || (_en_t == 9 && _en_state == 0) #endif #ifdef ENABLE_CHAC_CHAC || _en_t == 10 @@ -764,6 +849,12 @@ void enems_move (void) { #ifdef ENABLE_MONOCOCOS || (_en_t == 11 && _en_mx != 2) #endif + #ifdef ENABLE_CATACROCKS + || (_en_t == 12 && _en_state != 1) + #endif + #ifdef ENABLE_BOIOIONG + || (_en_t == 13 && _en_ct == 0) + #endif ) goto skipdo; // Collide with player (includes step over enemy) @@ -827,30 +918,68 @@ void enems_move (void) { _en_t != 5 && #endif touched == 0 && - pstate == EST_NORMAL && collide () ) { - #ifdef PLAYER_BOUNCES - pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); _en_mx = ADD_SIGN (_en_x - prx, ABS (_en_mx)); - pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); if (!_en_mx) _en_my = ADD_SIGN (_en_y - pry, ABS (_en_my)); - #endif - - #if defined ENEMIES_SUFFER_ON_PLAYER_COLLISION - enems_hit (); + // en_sg_1 => kill enemy + #ifdef ENEMIES_SUFFER_ON_PLAYER_COLLISION + en_sg_1 = 1; + #else + en_sg_1 = 0; #endif + + // en_sg_2 => kill player. + en_sg_2 = (pflickering == 0); #ifdef ENABLE_RESONATORS + // If resonators are on and not a saw, don't kill player if ( - res_on == 0 + res_on == 1 #ifdef ENABLE_SAW - || _en_t == 8 + && _en_t != 8 #endif - ) + ) en_sg_2 = 0; #endif - { - pkill = 1; - touched = 1; + + #ifdef PLAYER_SPINS + // If spinning and not a saw or a steady shooter + // kill enemy, don't kill player + if (pspin + #ifndef STEADY_SHOOTER_KILLABLE + && _en_t != 5 + #endif + #ifdef ENABLE_SAW + && _en_t != 8 + #endif + ) { + en_sg_2 = 0; + en_sg_1 = 1; + pvy = -pvy; + sfx_play (SFX_STEPON, 1); + } + #endif + + #include "my/on_player_hit.h" + + #ifdef ENEMS_MAY_DIE + if (en_sg_1) enems_hit (); + #endif + if (en_sg_2) { + pkill = 1; + #if defined (PLAYER_BOUNCES) && !defined (DIE_AND_RESPAWN) + pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); + pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); + + #ifdef ENABLE_COMPILED_ENEMS + if (_en_t != 20) + #endif + { + if (!_en_mx) _en_my = ADD_SIGN (_en_y - pry, ABS (_en_my)); + _en_mx = ADD_SIGN (_en_x - prx, ABS (_en_mx)); + } + + #endif } + touched = 1; } // Is enemy killable? If not, exit @@ -902,7 +1031,7 @@ void enems_move (void) { // Bullets bi = MAX_BULLETS; while (bi --) if (bst [bi]) { #ifdef ENABLE_PURSUERS - if (_en_t != 7 || en_alive [gpit] == 2) + if (_en_t != 7 || _en_state == 2) #endif if (collide_in (bx [bi] + 3, by [bi] + 3, _en_x, _en_y)) { @@ -950,8 +1079,7 @@ void enems_move (void) { _en_y = en_resy [gpit]; _en_my = en_resmy [gpit]; #if (defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY)) - _enf_x = _en_x << FIXBITS; - _enf_y = _en_y << FIXBITS; + enems_init_fp (); #ifdef NEEDS_LIFE_GAUGE_LOGIC en_life [gpit] = _en_t == 6 ? FANTY_LIFE_GAUGE : ENEMS_LIFE_GAUGE; #endif @@ -974,7 +1102,7 @@ void enems_move (void) { if (en_spr != 0xff) { oam_index = oam_meta_spr ( - _en_x, _en_y + SPRITE_ADJUST, + _en_x + en_spr_x_mod, _en_y + SPRITE_ADJUST, oam_index, spr_enems [en_spr] ); @@ -983,13 +1111,5 @@ void enems_move (void) { // Update arrays enems_update_unsigned_char_arrays (); - - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) - enf_x [gpit] = _enf_x; enf_vx [gpit] = _enf_vx; - #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_PEZONS) - enf_y [gpit] = _enf_y; enf_vy [gpit] = _enf_vy; - #endif - } } diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/general.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/general.h" index 01c962c..1725196 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/general.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/general.h" @@ -88,12 +88,31 @@ void pad_read (void) { #ifndef PLAYER_TOP_DOWN void jump_start (void) { - sfx_play (SFX_JUMP, 0); pj = 1; pctj = 0; - #ifdef PLAYER_JUMP_TYPE_MK2 - pvy = -PLAYER_VY_MK2_JUMP_INITIAL; - #else - pvy = -PLAYER_VY_JUMP_INITIAL; + #ifdef ENABLE_TRAMPOLINES + if (ptrampoline) { + sfx_play (SFX_TRAMPOLINE, 0); + #ifdef PLAYER_JUMP_TYPE_MK2 + pvy = -PLAYER_VY_MK2_JUMP_INITIAL_TRAMPOLINE; + #else + pvy = -PLAYER_VY_JUMP_INITIAL_TRAMPOLINE; + #endif + } else #endif + { + sfx_play (SFX_JUMP, 0); + #ifdef PLAYER_JUMP_TYPE_MK2 + pvy = -PLAYER_VY_MK2_JUMP_INITIAL; + #else + pvy = -PLAYER_VY_JUMP_INITIAL; + #endif + } } #endif + +void update_cycle (void) { + oam_hide_rest (oam_index); + ppu_waitnmi (); + clear_update_list (); + oam_index = 4; +} diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/mapmods/map_renderer_complex.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/mapmods/map_renderer_complex.h" index 6f0a96e..6e3bc07 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/mapmods/map_renderer_complex.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/mapmods/map_renderer_complex.h" @@ -11,15 +11,13 @@ void add_tile (void) { map_buff [rdm] = rda; ++ rdm; - // Need to do this to keep track of where I am - rdx = (rdx + 1) & 15; if (!rdx) ++ rdy; } void draw_scr (void) { // Draw Map - rdx = rdy = rdm = 0; + rdm = 0; #ifdef MAP_FORMAT_PACKED // Get pointer @@ -34,6 +32,8 @@ void draw_scr (void) { #endif #ifdef MAP_FORMAT_RLE16 + rdx = rdy = 0; + // Get pointer gp_gen = c_map [n_pant]; @@ -119,13 +119,13 @@ void draw_scr (void) { #ifdef MAP_FORMAT_RLE44_CHRROM bankswitch (c_map_chr_rom_bank); vram_adr (c_map [n_pant]); - rda = VRAM_READ; // Dummy read. + rdt = VRAM_READ; // Dummy read. // UNRLE into scr_buff while (rdm < 192) { rdt = VRAM_READ; rda = rdt & 0x0f; - + rdct = rdt; while (rdct >= 16) { add_tile (); rdct -= 16; @@ -200,11 +200,19 @@ void draw_scr (void) { // Now blit the buffer + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + rdd = 0; + #endif + _x = 0; _y = TOP_ADJUST; gp_ram = map_buff; - //rdx = 0; rdy = 0; gp_ram = map_buff; for (rdm = 0; rdm < 192; rdm ++) { - // rdt = *gp_ram ++; SET_FROM_PTR (rdt, gp_ram); gp_ram ++; + + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + if (tile_got [rdd] & bits [rdm & 7]) rdt = 0; + if ((rdm & 7) == 7) ++ rdd; + #endif + map_attr [rdm] = c_behs [rdt]; #if defined (ENABLE_BREAKABLE) && !defined (BREAKABLES_SOFT) @@ -213,11 +221,6 @@ void draw_scr (void) { #include "engine/mapmods/map_detectors.h" - /* - _x = rdx << 1; _y = (rdy << 1) + TOP_ADJUST; _t = rdt; - draw_tile (); - rdx = (rdx + 1) & 15; if (!rdx) ++ rdy; - */ _t = rdt; draw_tile (); _x = (_x + 2) & 0x1f; if (!_x) _y += 2; } diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/player.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/player.h" index 0ebb092..8cd006d 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/player.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/player.h" @@ -59,7 +59,7 @@ void player_init (void) { #endif #endif - pstate = EST_NORMAL; + pflickering = pbouncing = 0; #ifdef DIE_AND_RESPAWN player_register_safe_spot (); @@ -68,10 +68,31 @@ void player_init (void) { #ifdef CARRY_ONE_HS_OBJECT pinv = HS_OBJ_EMPTY; #endif + + // Default engine type + #ifndef PLAYER_TOP_DOWN + #ifdef PLAYER_HAS_JUMP + vertical_engine_type = ENGINE_TYPE_JUMP; + #elif defined (PLAYER_HAS_JETPAC) + vertical_engine_type = ENGINE_TYPE_JET_PAC; + #elif defined (PLAYER_AUTO_JUMP) + vertical_engine_type = ENGINE_TYPE_AUTO_JUMP; + #elif defined (PLAYER_SWIMS) + vertical_engine_type = ENGINE_TYPE_SWIM; + #endif + #endif + + #ifdef ENABLE_TRAMPOLINES + ptrampoline = 0; + #endif + + #ifdef PLAYER_SPINS + pspin = 0; + #endif } void player_render (void) { - if (pstate == EST_NORMAL || half_life) + if (0 == pflickering || half_life) oam_index = oam_meta_spr ( prx, pry + SPRITE_ADJUST, oam_index, @@ -85,17 +106,21 @@ void player_to_pixels (void) { } void player_kill (void) { + oam_index = oam_index_player; + player_render (); + ppu_waitnmi (); + pkill = phit = 0; sfx_play (SFX_PHIT, 0); if (plife) -- plife; else game_over = 1; #ifdef PLAYER_FLICKERS - pstate = EST_PARP; - pctstate = 100; - #else - pstate = EST_REBOUND; - pctstate = 16; + pflickering = PLAYER_FLICKERS; + #endif + + #ifdef PLAYER_BOUNCES + pbouncing = PLAYER_BOUNCES; #endif #ifdef ENABLE_USE_ANIM @@ -103,14 +128,19 @@ void player_kill (void) { #endif #ifdef DIE_AND_RESPAWN - px = px_safe; - py = py_safe; - player_to_pixels (); - n_pant = n_pant_safe; music_pause (1); delay (60); - player_stop (); - music_pause (0); + + #ifdef DIE_AND_REINIT + level_reset = 1; + #else + px = px_safe; + py = py_safe; + player_to_pixels (); + n_pant = n_pant_safe; + player_stop (); + music_pause (0); + #endif // May be necessary to find a proper cell later on #if defined (ENABLE_BREAKABLE) @@ -132,10 +162,8 @@ void player_kill (void) { #endif void player_move (void) { - if (pstate) { - -- pctstate; - if (!pctstate) pstate = EST_NORMAL; - } + if (pflickering) -- pflickering; + if (pbouncing) -- pbouncing; #if defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS) if (pfrozen) { @@ -172,6 +200,7 @@ void player_move (void) { #endif hitv = hith = 0; + pcx = prx; pcy = pry; pnotsafe = 0; #ifdef ENABLE_SLIPPERY pice = 0; @@ -207,11 +236,12 @@ void player_move (void) { #endif { if (QTILE (cx1, cy1 + 1) == SPRING_TILE && QTILE (cx1, cy1) != SPRING_SPIKE_TILE) { _x = cx1; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} - if (QTILE (cx2, cy1 + 1) == SPRING_TILE && QTILE (cx1, cy1) != SPRING_SPIKE_TILE) { _x = cx2; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} + if (QTILE (cx2, cy1 + 1) == SPRING_TILE && QTILE (cx2, cy1) != SPRING_SPIKE_TILE) { _x = cx2; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} } } #endif + oppossee = ppossee; ppossee = 0; // ******** @@ -284,7 +314,7 @@ void player_move (void) { } else #endif - #ifndef PLAYER_SWIMS + if (vertical_engine_type != ENGINE_TYPE_SWIM) { #ifdef PLAYER_JUMP_TYPE_MK2 if ( !pgotten @@ -300,56 +330,57 @@ void player_move (void) { if (pvy > PLAYER_VY_FALLING_MAX) pvy = PLAYER_VY_FALLING_MAX; } #endif - #endif + } // Moving platforms invalidate pvy - #ifdef PLAYER_CUMULATIVE_JUMP - if (!pj) - #endif - if (pgotten) pvy = 0; + if (pgotten) pvy = 0; #endif - cx1 = prx >> 4; - cx2 = (prx + 7) >> 4; - #ifdef PLAYER_HAS_JETPAC // Controller - if (pad0 & PAD_A) { - pvy -= PLAYER_AY_JETPAC; - if (pvy < -PLAYER_VY_JETPAC_MAX) pvy = -PLAYER_VY_JETPAC_MAX; + if (vertical_engine_type == ENGINE_TYPE_JET_PAC) { + if (pad0 & PAD_A) { + pvy -= PLAYER_AY_JETPAC; + if (pvy < -PLAYER_VY_JETPAC_MAX) pvy = -PLAYER_VY_JETPAC_MAX; + } } #endif #ifdef PLAYER_SWIMS // Controller - if (!(pad0 & (PAD_DOWN|PAD_A))) { - pvy -= PLAYER_AY_SWIM >> 1; - } else { - if (pad0 & (PAD_DOWN|PAD_A)) { - pvy += PLAYER_AY_SWIM; + if (vertical_engine_type == ENGINE_TYPE_SWIM) { + if (!(pad0 & (PAD_DOWN|PAD_A))) { + pvy -= PLAYER_AY_SWIM >> 1; + } else { + if (pad0 & (PAD_DOWN|PAD_A)) { + pvy += PLAYER_AY_SWIM; + } + + // Limit + if (pvy > PLAYER_VY_SWIM_MAX) { + pvy = PLAYER_VY_SWIM_MAX; + } } - - // Limit - if (pvy > PLAYER_VY_SWIM_MAX) { - pvy = PLAYER_VY_SWIM_MAX; + if (pvy < -PLAYER_VY_SWIM_MAX) { + pvy = -PLAYER_VY_SWIM_MAX; } } - if (pvy < -PLAYER_VY_SWIM_MAX) { - pvy = -PLAYER_VY_SWIM_MAX; - } - #endif // Move py += pvy; if (py < 0) py = 0; - + pry = py >> FIXBITS; + // Collision player_to_pixels (); + cx1 = prx >> 4; + cx2 = (prx + 7) >> 4; + #ifdef PLAYER_TOP_DOWN if (pvy < 0) #else @@ -404,7 +435,7 @@ void player_move (void) { pgotten = 0; pfiring = 1; ppossee = 1; - + #if defined (PLAYER_TOP_DOWN) && (defined(PLAYER_PUSH_BOXES) || !defined(DEACTIVATE_KEYS)) if (at1 & 2) player_process_tile (at1, cx1, cy1, cx1, cy1 + 1); if (cx1 != cx2) if (at2 & 2) player_process_tile (at2, cx2, cy1, cx2, cy1 + 1); @@ -414,6 +445,18 @@ void player_move (void) { pice = (at1 & 64) || (at2 & 64); #endif + #if defined (ENABLE_TRAMPOLINES) + if (at1 == 74 || at2 == 74) { + a_button = 1; ptrampoline = 1; + #ifdef PLAYER_SPINS + pspin = 0; + #endif + #ifdef ENABLE_SLIPPERY + pice = 0; + #endif + } + #endif + #ifdef ENABLE_CONVEYORS cfx = 0; if ((at1 & 40) == 40) { if (at1 & 1) cfx = pgtmx = PLAYER_VX_CONVEYORS; else cfx = pgtmx = -PLAYER_VX_CONVEYORS; pgotten = 1; } @@ -427,7 +470,7 @@ void player_move (void) { if ((at1 & 1) || (at2 & 1)) pnotsafe = 1; } else if ((at1 & 1) || (at2 & 1)) { - hitv = 1; + if ((pry & 15) > 4) hitv = 1; } #ifdef ENABLE_QUICKSANDS else { @@ -444,40 +487,101 @@ void player_move (void) { // Jump: PAD_A, change when needed // ******************************* - #ifdef PLAYER_JUMP_TYPE_MK2 + if (vertical_engine_type == ENGINE_TYPE_JUMP) { + #ifdef PLAYER_JUMP_TYPE_MK2 - if ( - a_button - && !pj - && ( - pgotten || ppossee || hitv - #ifdef ENABLE_LADDERS - || ponladder - #endif - ) - ) { - jump_start (); - - #ifdef DIE_AND_RESPAWN - if (!(pgotten || hitv || pnotsafe)) { - player_register_safe_spot (); + if ( + a_button + && !pj + && ( + pgotten || ppossee || hitv + #ifdef ENABLE_LADDERS + || ponladder + #endif + ) + ) { + jump_start (); + + #ifdef DIE_AND_RESPAWN + if (!(pgotten || hitv || pnotsafe)) { + player_register_safe_spot (); + } + #endif + + #ifdef PLAYER_SPINS + #ifdef ENABLE_TRAMPOLINES + if (!ptrampoline) + #endif + pspin = 1; + #endif + } + + if (pj) { + #ifdef ENABLE_TRAMPOLINES + if (ptrampoline) { + ++ pctj; if (pctj == PLAYER_VY_MK2_TRAMPOLINE_A_STEPS) + { pj = 0; ptrampoline = 0; } + } else + #endif + if (pad0 & PAD_A) { + ++ pctj; if (pctj == PLAYER_VY_MK2_JUMP_A_STEPS) pj = 0; + } else { + pj = 0; if (pvy < -PLAYER_VY_MK2_JUMP_RELEASE) pvy = -PLAYER_VY_MK2_JUMP_RELEASE; } - #endif - } + } - if (pj) { + #else + + if ( + a_button + && !pj + && ( + pgotten || ppossee || hitv + #ifdef ENABLE_LADDERS + || ponladder + #endif + ) + ) { + jump_start (); + + #ifdef DIE_AND_RESPAWN + if (!(pgotten || hitv || pnotsafe)) { + player_register_safe_spot (); + } + #endif + + #ifdef PLAYER_SPINS + #ifdef ENABLE_TRAMPOLINES + if (!ptrampoline) + #endif + pspin = 1; + #endif + } + + #ifdef ENABLE_TRAMPOLINES + if (pj && ptrampoline) { + + ++ pctj; if (pctj == 32) pj = 0; + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + } else + #endif if (pad0 & PAD_A) { - ++ pctj; if (pctj == PLAYER_VY_MK2_JUMP_A_STEPS) pj = 0; + if (pj) { + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; + ++ pctj; if (pctj == 16) pj = 0; + } } else { - pj = 0; if (pvy < -PLAYER_VY_MK2_JUMP_RELEASE) pvy = -PLAYER_VY_MK2_JUMP_RELEASE; + pj = 0; } - } + #endif + } + #endif - #else - + #ifdef PLAYER_AUTO_JUMP + if (vertical_engine_type == ENGINE_TYPE_AUTO_JUMP) { if ( - a_button - && !pj + !pj && ( pgotten || ppossee || hitv #ifdef ENABLE_LADDERS @@ -486,53 +590,32 @@ void player_move (void) { ) ) { jump_start (); - + #ifdef DIE_AND_RESPAWN if (!(pgotten || hitv || pnotsafe)) { player_register_safe_spot (); } #endif } + + if (pj) { + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; + ++ pctj; if (pctj == 16) pj = 0; + } - if (pad0 & PAD_A) { - if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); - if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - ++ pctj; if (pctj == 16) pj = 0; - } - } else { - pj = 0; + if (pad0 & PAD_DOWN) { + if (pvy < 0) pvy += PLAYER_AY_UNTHRUST; } - #endif - #endif - - #ifdef PLAYER_AUTO_JUMP - if ( - !pj - && ( - pgotten || ppossee || hitv - #ifdef ENABLE_LADDERS - || ponladder - #endif - ) - ) { - jump_start (); - - #ifdef DIE_AND_RESPAWN - if (!(pgotten || hitv || pnotsafe)) { - player_register_safe_spot (); - } - #endif } + #endif - if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); - if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - ++ pctj; if (pctj == 16) pj = 0; - } - + #ifdef PLAYER_SPINS if (pad0 & PAD_DOWN) { - if (pvy < 0) pvy += PLAYER_AY_UNTHRUST; + if (ppossee && ABS (pvx) > PLAYER_VX_MIN) { + if (!pspin) sfx_play (SFX_DUMMY2, 0); + pspin = 1; + } } #endif @@ -545,25 +628,29 @@ void player_move (void) { #ifdef PLAYER_TOP_DOWN pfacingh = 0xff; #endif - - if (pvx > 0) { + #ifdef PLAYER_SPINS + if (!pspin) + #endif + { + if (pvx > 0) { - #ifdef ENABLE_SLIPPERY - pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx -= PLAYER_RX; - #endif - - if (pvx < 0) pvx = 0; - } else if (pvx < 0) { + #ifdef ENABLE_SLIPPERY + pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx -= PLAYER_RX; + #endif + + if (pvx < 0) pvx = 0; + } else if (pvx < 0) { - #ifdef ENABLE_SLIPPERY - pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx += PLAYER_RX; - #endif + #ifdef ENABLE_SLIPPERY + pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx += PLAYER_RX; + #endif - if (pvx > 0) pvx = 0; + if (pvx > 0) pvx = 0; + } } } @@ -607,8 +694,8 @@ void player_move (void) { if (pgotten) px += pgtmx; #endif - if (px < (4< (244< (244< 0) hith &= ((pry & 15) > 4); } // Facing @@ -675,27 +763,78 @@ void player_move (void) { #endif #endif + #ifdef PLAYER_SPINS + if ((!pvx && (ppossee || pgotten) && !pj) || (ppossee && !oppossee)) pspin = 0; + #endif + // ************* // Killing tiles // ************* phit = 0; - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; - #ifndef NO_HORIZONTAL_EVIL_TILE - pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); - #endif + if (pgotten == 0) { + #ifdef NO_HORIZONTAL_EVIL_TILE + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } + #else + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } + #endif + + #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) + cx1 = cx2 = (prx + 4) >> 4; + cy1 = pry >> 4; cy2 = (pry + 15) >> 4; + cm_two_points (); + if ((at1 & 1) || (at2 & 1)) phit = 1; + #endif + + if (!pflickering && !pbouncing) if (phit) { + player_to_pixels (); + en_sg_2 = 1; + + #include "my/on_player_spike.h" + + if (en_sg_2) + pkill = 1; + #ifdef PLAYER_SPINS + pspin = 0; + #endif + } } - #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) + // *********************** + // Center point detections + // *********************** + + #ifdef NEEDS_CENTER_DETECTION cx1 = cx2 = (prx + 4) >> 4; - cy1 = pry >> 4; cy2 = (pry + 15) >> 4; + cy1 = cy2 = (pry + 8) >> 4; cm_two_points (); - if ((at1 & 1) || (at2 & 1)) phit = 1; + + #include "my/custom_center_detections.h" #endif - if (pstate != EST_PARP) if (phit) { player_to_pixels (); pkill = 1; } + #ifdef ENABLE_TILE_GET + if (cy1 && at1 == 34) { + -- cy1; + + _x = cx1; _y = cy1; _t = 0; map_set (); + sfx_play (SFX_RING, 2); + + #include "my/on_tile_got.h" + + #ifdef PERSISTENT_TILE_GET + tile_got [(cy1 << 1) | (cx1 > 7)] |= bits [cx1 & 7]; + #endif + } + #endif // ************** // B Button stuff diff --git "a/examples/09_cad\303\240veri\303\266n/dev/engine/prototypes.h" "b/examples/09_cad\303\240veri\303\266n/dev/engine/prototypes.h" index 9bc892f..8507ada 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/engine/prototypes.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/engine/prototypes.h" @@ -6,3 +6,5 @@ void propellers_add (void); void shines_add (void); void chac_chacs_add (void); +void player_render (void); +void do_extern_action (unsigned char); diff --git "a/examples/09_cad\303\240veri\303\266n/dev/game.c" "b/examples/09_cad\303\240veri\303\266n/dev/game.c" index 6f50607..bda33ac 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/game.c" +++ "b/examples/09_cad\303\240veri\303\266n/dev/game.c" @@ -66,11 +66,12 @@ extern const unsigned char m_ingame []; // ************* #include "engine/prototypes.h" -#include "engine/general.h" #include "engine/printer.h" +#include "engine/general.h" #ifdef ENABLE_TEXT_BOX #include "engine/textbox.h" #endif +#include "my/extra_modules.h" #ifdef ENABLE_BREAKABLE #include "engine/breakable.h" #endif @@ -92,14 +93,15 @@ extern const unsigned char m_ingame []; #endif #include "engine/player.h" #include "engine/enengine.h" +#if (defined (ACTIVATE_SCRIPTING) && defined (ENABLE_EXTERN_CODE)) || defined (ENABLE_COMPILED_ENEMS) + #include "my/extern.h" +#endif #include "engine/frame.h" #include "my/pres.h" #ifdef ACTIVATE_SCRIPTING - #ifdef ENABLE_EXTERN_CODE - #include "my/extern.h" - #endif #include "assets/mscnes.h" #endif +#include "mainloop/flickscreen.h" #include "mainloop.h" // ************* @@ -112,6 +114,7 @@ void main(void) { ppu_off (); first_game = 1; + ntsc = ppu_system (); // Main loop diff --git "a/examples/09_cad\303\240veri\303\266n/dev/labels.txt" "b/examples/09_cad\303\240veri\303\266n/dev/labels.txt" index cd41930..6902d49 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/labels.txt" +++ "b/examples/09_cad\303\240veri\303\266n/dev/labels.txt" @@ -3,86 +3,86 @@ Modules list: crt0.o: RODATA Offs = 000000 Size = 00072C HEADER Offs = 000000 Size = 000010 - STARTUP Offs = 000000 Size = 000C7F + STARTUP Offs = 000000 Size = 000CB2 VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 002000 game.o: - CODE Offs = 000000 Size = 00211A - RODATA Offs = 00072C Size = 0013B7 - BSS Offs = 000000 Size = 00028D - ZEROPAGE Offs = 000000 Size = 0000B6 + CODE Offs = 000000 Size = 0021C8 + RODATA Offs = 00072C Size = 0013BF + BSS Offs = 000000 Size = 000295 + ZEROPAGE Offs = 000000 Size = 0000BA runtime.lib(addysp.o): - CODE Offs = 00211A Size = 00000E + CODE Offs = 0021C8 Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 002128 Size = 00000B + CODE Offs = 0021D6 Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 002133 Size = 00000E + CODE Offs = 0021E1 Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 002141 Size = 000011 + CODE Offs = 0021EF Size = 000011 runtime.lib(asrax1.o): - CODE Offs = 002152 Size = 00000A + CODE Offs = 002200 Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 00215C Size = 00000F + CODE Offs = 00220A Size = 00000F runtime.lib(asrax4.o): - CODE Offs = 00216B Size = 000019 + CODE Offs = 002219 Size = 000019 runtime.lib(bneg.o): - CODE Offs = 002184 Size = 00000E + CODE Offs = 002232 Size = 00000E runtime.lib(call.o): - CODE Offs = 002192 Size = 000007 + CODE Offs = 002240 Size = 000007 runtime.lib(copydata.o): - CODE Offs = 002199 Size = 00002D + CODE Offs = 002247 Size = 00002D runtime.lib(decsp3.o): - CODE Offs = 0021C6 Size = 00000D + CODE Offs = 002274 Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 0021D3 Size = 00000D + CODE Offs = 002281 Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 0021E0 Size = 00000D + CODE Offs = 00228E Size = 00000D runtime.lib(icmp.o): - CODE Offs = 0021ED Size = 00002E + CODE Offs = 00229B Size = 00002E runtime.lib(incsp1.o): - CODE Offs = 00221B Size = 000007 + CODE Offs = 0022C9 Size = 000007 runtime.lib(incsp2.o): - CODE Offs = 002222 Size = 000016 + CODE Offs = 0022D0 Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 002238 Size = 000005 + CODE Offs = 0022E6 Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 00223D Size = 000005 + CODE Offs = 0022EB Size = 000005 runtime.lib(makebool.o): - CODE Offs = 002242 Size = 000031 + CODE Offs = 0022F0 Size = 000031 runtime.lib(neg.o): - CODE Offs = 002273 Size = 00000E + CODE Offs = 002321 Size = 00000E runtime.lib(or.o): - CODE Offs = 002281 Size = 000012 + CODE Offs = 00232F Size = 000012 runtime.lib(popa.o): - CODE Offs = 002293 Size = 00000C + CODE Offs = 002341 Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 00229F Size = 000010 + CODE Offs = 00234D Size = 000010 runtime.lib(pusha.o): - CODE Offs = 0022AF Size = 000016 + CODE Offs = 00235D Size = 000016 runtime.lib(pushax.o): - CODE Offs = 0022C5 Size = 00001A + CODE Offs = 002373 Size = 00001A runtime.lib(shl.o): - CODE Offs = 0022DF Size = 00002B + CODE Offs = 00238D Size = 00002B runtime.lib(shrax3.o): - CODE Offs = 00230A Size = 00000E + CODE Offs = 0023B8 Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 002318 Size = 000011 + CODE Offs = 0023C6 Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 002329 Size = 000016 + CODE Offs = 0023D7 Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 00233F Size = 00000B + CODE Offs = 0023ED Size = 00000B runtime.lib(subeqsp.o): - CODE Offs = 00234A Size = 000015 + CODE Offs = 0023F8 Size = 000015 runtime.lib(subysp.o): - CODE Offs = 00235F Size = 00000D + CODE Offs = 00240D Size = 00000D runtime.lib(udiv.o): - CODE Offs = 00236C Size = 00004F + CODE Offs = 00241A Size = 00004F runtime.lib(umod.o): - CODE Offs = 0023BB Size = 000011 + CODE Offs = 002469 Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000B6 Size = 00001A + ZEROPAGE Offs = 0000BA Size = 00001A Segment list: @@ -91,60 +91,61 @@ Name Start End Size -------------------------------------------- CHARS 000000 001FFF 002000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000F7 0000D0 -BSS 000300 00058C 00028D -STARTUP 008000 008C7E 000C7F -INIT 008C7F 008CA1 000023 -CODE 008CA2 00B06D 0023CC -RODATA 00B06E 00CB50 001AE3 +ZEROPAGE 000028 0000FB 0000D4 +BSS 000300 000594 000295 +STARTUP 008000 008CB1 000CB2 +INIT 008CB2 008CD4 000023 +CODE 008CD5 00B14E 00247A +RODATA 00B14F 00CC39 001AEB VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 00028D REA -__DATA_LOAD__ 00CB51 RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 000295 REA +__DATA_LOAD__ 00CC3A RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA -_bank_bg 0083E3 RLA _bank_spr 0083D3 RLA -_delay 008588 RLA _main 00AD48 RLA -_memfill 008559 RLA _music_pause 00876E REA -_music_play 008701 REA _music_stop 0086C3 REA -_oam_clear 0082A8 RLA _oam_hide_rest 00833A RLA -_oam_meta_spr 0082F2 RLA _pad_poll 008468 RLA -_pal_bg 008229 RLA _pal_bright 00825B RLA -_pal_spr 008233 RLA _ppu_off 008269 RLA -_ppu_on_all 00827C RLA _ppu_waitnmi 008347 RLA -_rand8 0084C7 RLA _scroll 0083A0 RLA -_set_vram_update 0084DD RLA _sfx_play 008457 RLA -_unrle_vram 008360 RLA _vram_adr 0084E7 RLA -_vram_fill 0084F2 RLA _vram_put 0084EE RLA -_vram_write 008427 RLA addysp 00ADBD RLA -addysp1 00ADBC RLA aslax2 00ADCA RLA -aslax3 00ADD5 RLA aslax4 00ADE3 RLA -asrax1 00ADF4 RLA asrax2 00ADFE RLA -asrax4 00AE0D RLA bnega 00AE2A RLA -boolne 00AEE4 RLA boolule 00AF00 RLA -callax 00AE34 RLA copydata 00AE3B RLA -decsp3 00AE68 RLA decsp4 00AE75 RLA -decsp8 00AE82 RLA incsp1 00AEBD RLA -incsp2 00AECC RLA incsp4 00AEDA RLA -incsp8 00AEDF RLA negax 00AF15 RLA -popa 00AF35 RLA popax 00AEC4 RLA -popsreg 00AF41 RLA ptr1 0000E6 RLZ -ptr2 0000E8 RLZ ptr4 0000EC RLZ -push0 00AF67 RLA pusha 00AF55 RLA -pusha0 00AF69 RLA pushax 00AF6B RLA -regsave 0000E2 RLZ shlax4 00ADE3 RLA -shrax3 00AFAC RLA shrax4 00AFBA RLA -sp 0000DE RLZ sreg 0000E0 RLZ -staspidx 00AFCB RLA stax0sp 00AFE1 RLA -subeq0sp 00AFEC RLA subeqysp 00AFEE RLA -subysp 00B001 RLA tmp1 0000EE RLZ -tosaslax 00AF81 RLA tosicmp 00AE91 RLA -tosicmp0 00AE8F RLA tosorax 00AF25 RLA -tosudiva0 00B00E RLA tosumoda0 00B05D RLA -udiv16 00B01F RLA zerobss 008C7F RLA +_bank_bg 008416 RLA _bank_spr 008406 RLA +_delay 0085BB RLA _main 00AE20 RLA +_memfill 00858C RLA _music_pause 0087A1 REA +_music_play 008734 REA _music_stop 0086F6 REA +_oam_clear 0082AF RLA _oam_hide_rest 008341 RLA +_oam_meta_spr 0082F9 RLA _pad_poll 00849B RLA +_pal_bg 00822D RLA _pal_bright 00825F RLA +_pal_spr 008237 RLA _ppu_off 00826D RLA +_ppu_on_all 008283 RLA _ppu_system 008280 RLA +_ppu_waitnmi 00834E RLA _rand8 0084FA RLA +_scroll 0083A7 RLA _set_vram_update 008510 RLA +_sfx_play 00848A RLA _unrle_vram 008367 RLA +_vram_adr 00851A RLA _vram_fill 008525 RLA +_vram_put 008521 RLA _vram_write 00845A RLA +addysp 00AE9E RLA addysp1 00AE9D RLA +aslax2 00AEAB RLA aslax3 00AEB6 RLA +aslax4 00AEC4 RLA asrax1 00AED5 RLA +asrax2 00AEDF RLA asrax4 00AEEE RLA +bnega 00AF0B RLA booleq 00AFCB RLA +boolne 00AFC5 RLA boolule 00AFE1 RLA +callax 00AF15 RLA copydata 00AF1C RLA +decsp3 00AF49 RLA decsp4 00AF56 RLA +decsp8 00AF63 RLA incsp1 00AF9E RLA +incsp2 00AFAD RLA incsp4 00AFBB RLA +incsp8 00AFC0 RLA negax 00AFF6 RLA +popa 00B016 RLA popax 00AFA5 RLA +popsreg 00B022 RLA ptr1 0000EA RLZ +ptr2 0000EC RLZ ptr4 0000F0 RLZ +push0 00B048 RLA pusha 00B036 RLA +pusha0 00B04A RLA pushax 00B04C RLA +regsave 0000E6 RLZ shlax4 00AEC4 RLA +shrax3 00B08D RLA shrax4 00B09B RLA +sp 0000E2 RLZ sreg 0000E4 RLZ +staspidx 00B0AC RLA stax0sp 00B0C2 RLA +subeq0sp 00B0CD RLA subeqysp 00B0CF RLA +subysp 00B0E2 RLA tmp1 0000F2 RLZ +tosaslax 00B062 RLA tosicmp 00AF72 RLA +tosicmp0 00AF70 RLA tosorax 00B006 RLA +tosudiva0 00B0EF RLA tosumoda0 00B13E RLA +udiv16 00B100 RLA zerobss 008CB2 RLA @@ -167,29 +168,29 @@ __RAM_START__ ([linker generated]): __STARTUP__ (crt0.o): game.o game.s(12) _bank_bg (crt0.o): - game.o game.s(29) + game.o game.s(30) _bank_spr (crt0.o): - game.o game.s(28) + game.o game.s(29) _delay (crt0.o): - game.o game.s(38) + game.o game.s(39) _main (game.o): crt0.o crt0.s(26) _memfill (crt0.o): - game.o game.s(37) + game.o game.s(38) _music_pause (crt0.o): - game.o game.s(24) + game.o game.s(25) _music_play (crt0.o): - game.o game.s(22) -_music_stop (crt0.o): game.o game.s(23) +_music_stop (crt0.o): + game.o game.s(24) _oam_clear (crt0.o): - game.o game.s(18) + game.o game.s(19) _oam_hide_rest (crt0.o): - game.o game.s(20) + game.o game.s(21) _oam_meta_spr (crt0.o): - game.o game.s(19) + game.o game.s(20) _pad_poll (crt0.o): - game.o game.s(26) + game.o game.s(27) _pal_bg (crt0.o): game.o game.s(13) _pal_bright (crt0.o): @@ -200,110 +201,120 @@ _ppu_off (crt0.o): game.o game.s(16) _ppu_on_all (crt0.o): game.o game.s(17) +_ppu_system (crt0.o): + game.o game.s(18) _ppu_waitnmi (crt0.o): - game.o game.s(21) + game.o game.s(22) _rand8 (crt0.o): - game.o game.s(30) + game.o game.s(31) _scroll (crt0.o): - game.o game.s(27) + game.o game.s(28) _set_vram_update (crt0.o): - game.o game.s(31) + game.o game.s(32) _sfx_play (crt0.o): - game.o game.s(25) + game.o game.s(26) _unrle_vram (crt0.o): - game.o game.s(36) + game.o game.s(37) _vram_adr (crt0.o): - game.o game.s(32) + game.o game.s(33) _vram_fill (crt0.o): - game.o game.s(34) + game.o game.s(35) _vram_put (crt0.o): - game.o game.s(33) + game.o game.s(34) _vram_write (crt0.o): - game.o game.s(35) + game.o game.s(36) addysp (addysp.o): incsp8.o incsp8.s(8) incsp4.o incsp4.s(8) - game.o game.s(8541) + game.o game.s(8713) addysp1 (addysp.o): or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(6988) - game.o game.s(7149) - game.o game.s(8881) - game.o game.s(9973) - game.o game.s(10946) - game.o game.s(11675) + game.o game.s(6779) + game.o game.s(6940) + game.o game.s(9072) + game.o game.s(10244) + game.o game.s(10299) + game.o game.s(10334) + game.o game.s(11142) + game.o game.s(11794) aslax3 (aslax3.o): - game.o game.s(6908) - game.o game.s(9982) + game.o game.s(6699) + game.o game.s(10343) aslax4 (aslax4.o): - game.o game.s(5851) - game.o game.s(6848) - game.o game.s(7000) - game.o game.s(7161) - game.o game.s(7254) - game.o game.s(7682) - game.o game.s(7761) - game.o game.s(8449) - game.o game.s(8880) - game.o game.s(10945) - game.o game.s(11674) + game.o game.s(5901) + game.o game.s(6639) + game.o game.s(6791) + game.o game.s(6952) + game.o game.s(7045) + game.o game.s(7460) + game.o game.s(7539) + game.o game.s(8621) + game.o game.s(9071) + game.o game.s(10243) + game.o game.s(10298) + game.o game.s(11141) + game.o game.s(11793) asrax1 (asrax1.o): - game.o game.s(6919) - game.o game.s(10211) + game.o game.s(6710) + game.o game.s(10569) asrax2 (asrax2.o): - game.o game.s(6902) - game.o game.s(8220) - game.o game.s(10908) - game.o game.s(12025) + game.o game.s(6693) + game.o game.s(8384) + game.o game.s(8991) + game.o game.s(11104) + game.o game.s(12330) asrax4 (asrax4.o): - game.o game.s(7546) - game.o game.s(8219) - game.o game.s(8788) - game.o game.s(10729) - game.o game.s(12024) + game.o game.s(7324) + game.o game.s(8383) + game.o game.s(8990) + game.o game.s(10925) + game.o game.s(12329) bnega (bneg.o): - game.o game.s(5898) - game.o game.s(8659) - game.o game.s(10560) + game.o game.s(5948) + game.o game.s(8842) + game.o game.s(10826) +booleq (makebool.o): + game.o game.s(11197) boolne (makebool.o): - game.o game.s(5825) + game.o game.s(5875) boolule (makebool.o): - game.o game.s(5837) + game.o game.s(5887) callax (call.o): - game.o game.s(11250) + game.o game.s(11464) copydata (copydata.o): crt0.o crt0.s(26) decsp3 (decsp3.o): - game.o game.s(5640) - game.o game.s(6701) - game.o game.s(7867) - game.o game.s(8144) - game.o game.s(10592) + game.o game.s(5690) + game.o game.s(6239) + game.o game.s(6492) + game.o game.s(8115) + game.o game.s(11223) decsp4 (decsp4.o): - game.o game.s(7648) - game.o game.s(12840) + game.o game.s(7426) + game.o game.s(13054) decsp8 (decsp8.o): - game.o game.s(12457) + game.o game.s(12573) incsp1 (incsp1.o): - game.o game.s(5733) - game.o game.s(11460) + game.o game.s(5783) + game.o game.s(6314) incsp2 (incsp2.o): popsreg.o popsreg.s(8) staspidx.o staspidx.s(8) - game.o game.s(7715) + game.o game.s(7493) incsp4 (incsp4.o): - game.o game.s(6436) - game.o game.s(6554) - game.o game.s(11272) + game.o game.s(7851) + game.o game.s(7969) + game.o game.s(11486) incsp8 (incsp8.o): - game.o game.s(6321) + game.o game.s(7736) negax (neg.o): - game.o game.s(6447) - game.o game.s(6545) - game.o game.s(9624) - game.o game.s(10162) - game.o game.s(10858) + game.o game.s(7862) + game.o game.s(7960) + game.o game.s(9856) + game.o game.s(10304) + game.o game.s(10520) + game.o game.s(11054) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -326,44 +337,43 @@ ptr4 (zeropage.o): umod.o umod.s(9) udiv.o udiv.s(9) push0 (pushax.o): - game.o game.s(12821) + game.o game.s(13035) pusha (pusha.o): - game.o game.s(6133) - game.o game.s(6480) - game.o game.s(6743) - game.o game.s(8257) - game.o game.s(8502) - game.o game.s(10319) - game.o game.s(11979) - game.o game.s(12102) + game.o game.s(6183) + game.o game.s(6534) + game.o game.s(7895) + game.o game.s(8434) + game.o game.s(8674) + game.o game.s(12284) + game.o game.s(12403) pusha0 (pushax.o): - game.o game.s(5866) - game.o game.s(6358) - game.o game.s(6866) - game.o game.s(6943) - game.o game.s(8943) - game.o game.s(10661) + game.o game.s(5916) + game.o game.s(6657) + game.o game.s(6734) + game.o game.s(7773) + game.o game.s(9134) + game.o game.s(10857) pushax (pushax.o): - game.o game.s(6262) - game.o game.s(6524) - game.o game.s(6793) - game.o game.s(7279) - game.o game.s(7609) - game.o game.s(11090) - game.o game.s(11291) - game.o game.s(11380) - game.o game.s(11400) - game.o game.s(11960) + game.o game.s(6584) + game.o game.s(7070) + game.o game.s(7387) + game.o game.s(7677) + game.o game.s(7939) + game.o game.s(11304) + game.o game.s(11505) + game.o game.s(11594) + game.o game.s(11614) + game.o game.s(12265) regsave (zeropage.o): game.o game.s(10) shlax4 (aslax4.o): - game.o game.s(6204) - game.o game.s(8866) + game.o game.s(7619) + game.o game.s(9057) shrax3 (shrax3.o): - game.o game.s(10687) + game.o game.s(10883) shrax4 (shrax4.o): - game.o game.s(8799) - game.o game.s(10740) + game.o game.s(9013) + game.o game.s(10936) sp (zeropage.o): popsreg.o popsreg.s(9) subysp.o subysp.s(9) @@ -389,17 +399,17 @@ sreg (zeropage.o): icmp.o icmp.s(9) game.o game.s(10) staspidx (staspidx.o): - game.o game.s(6805) - game.o game.s(7287) - game.o game.s(7617) + game.o game.s(6596) + game.o game.s(7078) + game.o game.s(7395) stax0sp (staxsp.o): - game.o game.s(7710) + game.o game.s(7488) subeq0sp (subeqsp.o): - game.o game.s(8369) + game.o game.s(8541) subeqysp (subeqsp.o): - game.o game.s(8358) + game.o game.s(8530) subysp (subysp.o): - game.o game.s(8902) + game.o game.s(9093) tmp1 (zeropage.o): staspidx.o staspidx.s(9) shrax4.o shrax4.s(8) @@ -415,21 +425,21 @@ tmp1 (zeropage.o): aslax2.o aslax2.s(8) game.o game.s(10) tosaslax (shl.o): - game.o game.s(6953) + game.o game.s(6744) tosicmp (icmp.o): - game.o game.s(5872) - game.o game.s(6268) - game.o game.s(6364) - game.o game.s(6530) - game.o game.s(10667) + game.o game.s(5922) + game.o game.s(7683) + game.o game.s(7779) + game.o game.s(7945) + game.o game.s(10863) tosicmp0 (icmp.o): - game.o game.s(8945) + game.o game.s(9136) tosorax (or.o): - game.o game.s(6954) + game.o game.s(6745) tosudiva0 (udiv.o): - game.o game.s(6868) + game.o game.s(6659) tosumoda0 (umod.o): - game.o game.s(6879) + game.o game.s(6670) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git "a/examples/09_cad\303\240veri\303\266n/dev/mainloop.h" "b/examples/09_cad\303\240veri\303\266n/dev/mainloop.h" index 70c962b..79c7b2f 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/mainloop.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/mainloop.h" @@ -95,6 +95,12 @@ void game_init (void) { #endif #endif + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Clear tile_got persistence + vram_adr (MAP_CLEAR_LIST_ADDRESS); + vram_fill (0, MAP_SIZE*24); + #endif + half_life = 0; frame_counter = 0; olife = oammo = oobjs = okeys = 0xff; @@ -108,9 +114,20 @@ void game_init (void) { } void prepare_scr (void) { - if (!ft) fade_out (); else ft = 0; + if (!ft) { + fade_out (); + ppu_off (); + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Update tile_got persistence + rda = on_pant << 3; + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); + #endif + } else { + ft = 0; + ppu_off (); + } - ppu_off (); + clear_update_list (); #ifdef ENABLE_PROPELLERS // Clear propellers @@ -144,6 +161,12 @@ void prepare_scr (void) { max_chac_chacs = 0; #endif + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Read tile_got persistence + rda = n_pant << 3; + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); + #endif + draw_scr (); #if defined (ENABLE_BREAKABLE) && defined (BREAKABLE_ANIM) @@ -200,7 +223,7 @@ void prepare_scr (void) { #include "my/on_entering_screen.h" gpit = 3; while (gpit --) en_spr_id [gpit] = en_s [gpit]; - + oam_index = 4; prx = px >> FIXBITS; pry = py >> FIXBITS; #if defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS) @@ -208,8 +231,8 @@ void prepare_scr (void) { #endif player_move (); - player_render (); enems_move (); + if (hrt) hotspots_paint (); #ifdef ENABLE_INTERACTIVES @@ -259,51 +282,42 @@ void game_loop (void) { run_script (2 * MAP_SIZE); #endif - warp_to_level = 0; oam_index = 0; ticker = 50; + ntsc_frame = level_reset = warp_to_level = 0; + oam_index = 4; ticker = 50; while (1) { + // Update hud + + #ifdef ACTIVATE_SCRIPTING + if (n_pant != 0xfe && on_pant != 0xfe) + #endif + hud_update (); + // Finish him if (pkill) player_kill (); - if (game_over) break; + if (game_over || level_reset) break; // Flick the screen flick_override = 0; #include "my/custom_flickscreen.h" - #include "mainloop/flickscreen.h" + if (flick_override == 0) { + flickscreen_do_horizontal (); + flickscreen_do_vertical (); + } // Change screen ? - if (on_pant != n_pant && !warp_to_level) { + if (on_pant != n_pant) { prepare_scr (); on_pant = n_pant; } // Relocate player if spawned on a broken tile - #if defined (ENABLE_BREAKABLE) - if (pmayneedrelocation) { - pmayneedrelocation = 0; - gpit = 16; - while (gpit --) { - cx1 = prx >> 4; cx2 = (prx + 7) >> 4; - cy1 = cy2 = (pry + 15) >> 4; - cm_two_points (); - if ((at1 & 8) == 0 && (at2 & 8) == 0) break; - prx += 16; // Try next cell - } - px = prx << FIXBITS; - } - #endif - - // Update hud - - #ifdef ACTIVATE_SCRIPTING - if (n_pant != 0xfe && on_pant != 0xfe) - #endif - hud_update (); + #include "mainloop/relocate_player.h" // Shake the screen ? @@ -311,12 +325,13 @@ void game_loop (void) { #include "mainloop/shaker.h" #endif + // Effects + + #include "my/effects.h" + // Finish frame and wait for NMI - oam_hide_rest (oam_index); - ppu_waitnmi (); - clear_update_list (); - oam_index = 4; + update_cycle (); // Poll pads @@ -326,77 +341,54 @@ void game_loop (void) { // Update actors if not paused... - if (paused == 0) { + ntsc_frame ++; if (ntsc_frame == 6) ntsc_frame = 0; + + if (paused == 0 && (ntsc == 0 || ntsc_frame)) { // Count frames if (ticker) -- ticker; else ticker = 50; half_life ^= 1; ++ frame_counter; - // Timer + // Detect interactions - #ifdef ENABLE_TIMER - #include "mainloop/timer.h" - #endif + #ifdef ENABLE_INTERACTIVES + #include "mainloop/interactives.h" + #endif - // Extra checks + // Update / collide hotspots - #include "my/extra_checks.h" + #include "mainloop/hotspots.h" - // Win level condition + // Automatic scripting calls (USE_ANIM & fire zone) - if ( - #if defined (WIN_LEVEL_CUSTOM) - win_level - #elif defined (ACTIVATE_SCRIPTING) - script_result == 1 - #elif defined (PLAYER_MAX_OBJECTS) - pobjs == PLAYER_MAX_OBJECTS - #elif defined (SCR_END) - ( - n_pant == SCR_END && - ((prx + 8) >> 4) == PLAYER_END_X && - ((pry + 8) >> 4) == PLAYER_END_Y - ) + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" #endif - ) { - music_stop (); - delay (50); - break; - } - - // Warp to level + + // Update player - if (warp_to_level) { - music_stop (); break; + if (!warp_to_level) { + player_move (); } - // Update propellers + // Timer - #ifdef ENABLE_PROPELLERS - if (propellers_on) propellers_do (); + #ifdef ENABLE_TIMER + #include "mainloop/timer.h" #endif - // Detect interactions - - #ifdef ENABLE_INTERACTIVES - #include "mainloop/interactives.h" - #endif - - // Update / collide hotspots + // Extra checks - #include "mainloop/hotspots.h" + #include "my/extra_checks.h" - // Update player + // Win level condition - if (!warp_to_level) { - player_move (); - player_render (); - } + #include "mainloop/win_level_condition.h" - // Automatic scripting calls (USE_ANIM & fire zone) + // Update propellers - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" + #ifdef ENABLE_PROPELLERS + if (propellers_on) propellers_do (); #endif // Update bullets @@ -411,10 +403,21 @@ void game_loop (void) { cocos_do (); #endif + // Paint player + + oam_index_player = oam_index; + if (!warp_to_level) player_render (); + // Update enemies enems_move (); + // Warp to level + + if (warp_to_level) { + update_cycle (); music_stop (); break; + } + // Do resonators #ifdef ENABLE_RESONATORS @@ -454,6 +457,8 @@ void game_loop (void) { #ifdef ENABLE_TILE_CHAC_CHAC chac_chacs_do (); #endif + + #include "my/extra_routines.h" } // Cheat to skip level diff --git "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/asset_setup.h" "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/asset_setup.h" index 53304f8..683f300 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/asset_setup.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/asset_setup.h" @@ -35,6 +35,7 @@ c_max_enems = l_player_max_enems [level]; c_map_w = l_map_w [level]; + c_map_h = l_map_h [level]; #if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) c_interactives = @@ -79,6 +80,7 @@ #endif c_map_w = MAP_W; + c_map_h = MAP_H; #if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) c_interactives = @@ -86,3 +88,5 @@ #endif #endif + +rda = c_map_h; c_map_size = 0; while (rda --) c_map_size += c_map_w; diff --git "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/flickscreen.h" "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/flickscreen.h" index b051cac..fa522be 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/flickscreen.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/flickscreen.h" @@ -4,8 +4,7 @@ // Change screen // Very basic. Extend when needed. -if (flick_override == 0 && warp_to_level == 0) { - +void flickscreen_do_horizontal (void) { if (prx == 4 && #if defined (PLAYER_TOP_DOWN) || !defined (ENABLE_CONVEYORS) pvx < 0 @@ -24,24 +23,30 @@ if (flick_override == 0 && warp_to_level == 0) { ) { ++ n_pant; px = 4 << FIXBITS; + } +} + +void flickscreen_do_vertical (void) { #ifdef PLAYER_TOP_DOWN - } else if (pry <= 16 && pvy < 0) { + if (pry <= 16 && pvy < 0) { n_pant -= c_map_w; py = 192 << FIXBITS; } else if (pry >= 192 && pvy > 0) { n_pant += c_map_w; py = 16 << FIXBITS; + } #else - } else if (pry == 0 && pvy < 0 && n_pant >= c_map_w) { + + if (pry == 0 && pvy < 0 && n_pant >= c_map_w) { n_pant -= c_map_w; py = 192 << FIXBITS; if (pvy > -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - } else if (pry >= 192 && pvy > 0) { + } else if (pry >= 192 && pvy > 0 && n_pant < c_map_size - c_map_w) { n_pant += c_map_w; py = 0; + } + #endif - } - } diff --git "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/hotspots.h" "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/hotspots.h" index c41ce24..b311555 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/hotspots.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/hotspots.h" @@ -26,7 +26,7 @@ if (hrt) { } else #endif { - #ifdef ENABLE_USE_ANIM + #ifdef ENABLE_USE_ANIM if ( use_ct == 0 && b_button #ifndef PLAYER_TOP_DOWN @@ -187,6 +187,7 @@ if (hrt) { ++ pstars; rda = SFX_OBJECT; break; #endif + #include "my/extra_hotspots.h" } if (rda) { sfx_play (rda, 1); diff --git "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/relocate_player.h" "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/relocate_player.h" new file mode 100644 index 0000000..03d4d35 --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/relocate_player.h" @@ -0,0 +1,19 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Check if the player needs to be relocated after respawning. + + #if defined (DIE_AND_RESPAWN) && defined (ENABLE_BREAKABLE) + if (pmayneedrelocation) { + pmayneedrelocation = 0; + gpit = 16; + while (gpit --) { + cx1 = prx >> 4; cx2 = (prx + 7) >> 4; + cy1 = cy2 = (pry + 15) >> 4; + cm_two_points (); + if ((at1 & 8) == 0 && (at2 & 8) == 0) break; + prx += 16; // Try next cell + } + px = prx << FIXBITS; + } + #endif \ No newline at end of file diff --git "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/timer.h" "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/timer.h" index 57ef5d9..1347ba6 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/timer.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/timer.h" @@ -22,6 +22,8 @@ if (timer_on && timer) { run_script (2 * MAP_SIZE + 3); #endif } + + #include "my/on_timer_tick.h" } } #ifdef TIMER_TIME_FLAG diff --git "a/examples/09_cad\303\240veri\303\266n/dev/mainloop/win_level_condition.h" "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/win_level_condition.h" new file mode 100644 index 0000000..2bc3e46 --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/mainloop/win_level_condition.h" @@ -0,0 +1,26 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Win level condition. Note the precedence if severan items are +// #defined: first, WIN_LEVEL_CUSTOM, then ACTIVATE_SCRIPTING (by WIN LEVEL), +// then, ponjs == PLAYER_MAX_OBJECTS, then "ending location" + + if ( + #if defined (WIN_LEVEL_CUSTOM) + win_level + #elif defined (ACTIVATE_SCRIPTING) + script_result == 1 + #elif defined (PLAYER_MAX_OBJECTS) + pobjs == PLAYER_MAX_OBJECTS + #elif defined (SCR_END) + ( + n_pant == SCR_END && + ((prx + 8) >> 4) == PLAYER_END_X && + ((pry + 8) >> 4) == PLAYER_END_Y + ) + #endif + ) { + music_stop (); + delay (50); + break; + } diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/custom_center_detections.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/custom_center_detections.h" new file mode 100644 index 0000000..963c83d --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/custom_center_detections.h" @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// custom_center_detections.h +// at1 constains the tile beh at the center of the player sprite +// For this code to be included, enable CUSTOM_CENTER_DETECTIONS in config.h diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/effects.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/effects.h" new file mode 100644 index 0000000..333066d --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/effects.h" @@ -0,0 +1,5 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Effects - This code gets included right before waiting for next NMI +// Add here palette cycles/etc, splits... diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/extra_hotspots.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/extra_hotspots.h" new file mode 100644 index 0000000..0ec35ab --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/extra_hotspots.h" @@ -0,0 +1,17 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add support for custom hotspots types here. Support for each +// new type of hotspot should be coded in a 'case', like this: + +/* + case HOTSPOT_TYPE_MY_OWN: + rda = SFX_OBJECT; + // do stuff + break; +*/ + +// If rda != 0, the engine will play the sound in rda when getting +// the hotspot. + +// hrt contains the hotspot type, in case you need it. diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/extra_modules.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/extra_modules.h" new file mode 100644 index 0000000..110e0e3 --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/extra_modules.h" @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Extra modules. #include here custom code you write. + +// Ring implementation, Sonic SMS style: diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/extra_routines.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/extra_routines.h" new file mode 100644 index 0000000..e93f807 --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/extra_routines.h" @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Extra routines. +// Add here calls to routines which need to update sprites and/or bg. + \ No newline at end of file diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/on_player_coco.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/on_player_coco.h" new file mode 100644 index 0000000..12c9eec --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/on_player_coco.h" @@ -0,0 +1,11 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by a coco. + +// The default action can be overriden assigning values to flags: +// en_sg_2 controls if player suffers or not. + +// If +// - Player has rings (prings) +// Then create animated ring, but don't hurt the player! diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/on_player_hit.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/on_player_hit.h" new file mode 100644 index 0000000..ba76abc --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/on_player_hit.h" @@ -0,0 +1,13 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by an enemy. + +// The default action can be overriden assigning values to flags: +// en_sg_1 controls if enemy suffers or not. +// en_sg_2 controls if player suffers or not. + +// If: +// - Player will suffer (hit registered, not spinning): en_sg_2 +// - Player has rings (prings) +// Then create animated ring, and simulate hit but don't hurt player! diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/on_player_spike.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/on_player_spike.h" new file mode 100644 index 0000000..fbb1bc6 --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/on_player_spike.h" @@ -0,0 +1,11 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by a killing tile. + +// The default action can be overriden assigning values to flags: +// en_sg_2 controls if player suffers or not. + +// If +// - Player has rings (prings) +// Then create animated ring, but don't hurt the player! diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/on_tile_got.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/on_tile_got.h" new file mode 100644 index 0000000..dc2066d --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/on_tile_got.h" @@ -0,0 +1,7 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. An TILE_GET has just been got. +// You may add checks and set variables and stuff. + +// The value of the tile just got is QTILE (cx1, cy1) diff --git "a/examples/09_cad\303\240veri\303\266n/dev/my/on_timer_tick.h" "b/examples/09_cad\303\240veri\303\266n/dev/my/on_timer_tick.h" new file mode 100644 index 0000000..484f553 --- /dev/null +++ "b/examples/09_cad\303\240veri\303\266n/dev/my/on_timer_tick.h" @@ -0,0 +1,5 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Timer has ticked (a second passed) +// timer_zero equals 1 if timer == 0. diff --git "a/examples/09_cad\303\240veri\303\266n/dev/neslib.h" "b/examples/09_cad\303\240veri\303\266n/dev/neslib.h" index 46c73fb..f4ac0a8 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/neslib.h" +++ "b/examples/09_cad\303\240veri\303\266n/dev/neslib.h" @@ -47,9 +47,9 @@ void __fastcall__ ppu_on_spr(void); //set PPU_MASK directly -;void __fastcall__ ppu_mask(unsigned char mask); - +void __fastcall__ ppu_mask(unsigned char mask); +unsigned char __fastcall__ ppu_system(void); //clear OAM buffer, all the sprites are hidden @@ -121,6 +121,7 @@ unsigned char __fastcall__ pad_state(unsigned char pad); void __fastcall__ scroll(unsigned int x,unsigned int y); +void __fastcall__ split(unsigned int x,unsigned int y); //select current chr bank for sprites, 0..1 diff --git "a/examples/09_cad\303\240veri\303\266n/dev/neslib.s" "b/examples/09_cad\303\240veri\303\266n/dev/neslib.s" index 80898c2..dd0a181 100644 --- "a/examples/09_cad\303\240veri\303\266n/dev/neslib.s" +++ "b/examples/09_cad\303\240veri\303\266n/dev/neslib.s" @@ -4,11 +4,11 @@ .export _pal_all,_pal_bg,_pal_spr,_pal_col,_pal_clear,_pal_bright - .export _ppu_off,_ppu_on_all,_ppu_on_bg,_ppu_on_spr,_ppu_mask + .export _ppu_off,_ppu_on_all,_ppu_on_bg,_ppu_on_spr,_ppu_mask, _ppu_system .export _oam_clear,_oam_size,_oam_spr,_oam_meta_spr,_oam_hide_rest .export _ppu_waitnmi .export _unrle_vram - .export _scroll + .export _scroll, _split .export _bank_spr,_bank_bg .export _vram_read,_vram_write .export _music_play,_music_stop,_music_pause @@ -225,7 +225,11 @@ _ppu_off: sta PPU_MASK rts +;unsigned char __fastcall__ ppu_system(void); +_ppu_system: + lda 8J&1YBa4V(Ll>$vbn0YDM* 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 delta 10581 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 diff --git a/examples/10_che_man/dev/config.h b/examples/10_che_man/dev/config.h index 8e8cf16..34c6bb5 100644 --- a/examples/10_che_man/dev/config.h +++ b/examples/10_che_man/dev/config.h @@ -6,6 +6,10 @@ #define GAME_AREA_BOTTOM //#define GAME_AREA_CUSTOM +#define MAP_CLEAR_LIST_ADDRESS 0x2c40 // To store map persistence in VRAM. + // Each screen takes 24 bytes. move it where + // It fits. Below 2c40 you may "see" the buffer + // ============================================================================ // I. General configuration // ============================================================================ @@ -134,7 +138,8 @@ // Extra special tiles // ------------------- -#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically +//#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically +//#define CUSTOM_CENTER_DETECTIONS // Define this if you need custom tile behs // Quicksands, beh == 2. // For player movement values, see section 4 @@ -568,8 +573,8 @@ #define PLAYER_VY_JUMP_INITIAL 64 #define PLAYER_VY_JUMP_INITIAL_TRAMPOLINE 128 -#define PLAYER_VY_JUMP_MAX 192 // Max. velocity when jumping -#define PLAYER_AY_JUMP 12 // Jumpin acceleration +#define PLAYER_VY_JUMP_MAX 256 // Max. velocity when jumping +#define PLAYER_AY_JUMP 16 // Jumpin acceleration #define PLAYER_AY_JETPAC 32 // Jetpac increment #define PLAYER_VY_JETPAC_MAX 256 // Max jetpac vertical speed diff --git a/examples/10_che_man/dev/engine/enemmods/enem_punchy.h b/examples/10_che_man/dev/engine/enemmods/enem_punchy.h index 2ac8139..3cdc71e 100644 --- a/examples/10_che_man/dev/engine/enemmods/enem_punchy.h +++ b/examples/10_che_man/dev/engine/enemmods/enem_punchy.h @@ -23,7 +23,13 @@ if (_en_t & 0x40) { sfx_play (SFX_HITTER, 1); // Collide w/player - if (pstate == EST_NORMAL && + if ( + #ifdef PLAYER_FLICKERS + !pflickering && + #endif + #ifdef PLAYER_BOUNCES + !pbouncing && + #endif rdx + 7 >= prx && rdx <= prx + 7 && rdy + 7 + PLAYER_COLLISION_VSTRETCH_FG >= pry && rdy <= pry + 13 diff --git a/examples/10_che_man/dev/engine/enengine.h b/examples/10_che_man/dev/engine/enengine.h index 4c1b093..6b60bae 100644 --- a/examples/10_che_man/dev/engine/enengine.h +++ b/examples/10_che_man/dev/engine/enengine.h @@ -772,6 +772,7 @@ void enems_move (void) { n_pant = _en_mx; on_pant = 0xff; prx = _en_x2; px = prx << FIXBITS; pry = _en_y2; py = pry << FIXBITS; + player_stop (); #if defined (SIMPLE_WARPERS_FIRE_BUTTON) && (defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS)) phitteract = 0; @@ -817,6 +818,10 @@ void enems_move (void) { pvy = 0; } } + + #ifdef PLAYER_SPINS + if (pgotten) pspin = 0; + #endif #endif // Is enemy collidable? If not, exit @@ -960,7 +965,7 @@ void enems_move (void) { #endif if (en_sg_2) { pkill = 1; - #ifdef PLAYER_BOUNCES + #if defined (PLAYER_BOUNCES) && !defined (DIE_AND_RESPAWN) pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); diff --git a/examples/10_che_man/dev/engine/mapmods/map_renderer_complex.h b/examples/10_che_man/dev/engine/mapmods/map_renderer_complex.h index da3f401..6e3bc07 100644 --- a/examples/10_che_man/dev/engine/mapmods/map_renderer_complex.h +++ b/examples/10_che_man/dev/engine/mapmods/map_renderer_complex.h @@ -32,6 +32,8 @@ void draw_scr (void) { #endif #ifdef MAP_FORMAT_RLE16 + rdx = rdy = 0; + // Get pointer gp_gen = c_map [n_pant]; diff --git a/examples/10_che_man/dev/engine/player.h b/examples/10_che_man/dev/engine/player.h index bb87814..8cd006d 100644 --- a/examples/10_che_man/dev/engine/player.h +++ b/examples/10_che_man/dev/engine/player.h @@ -106,8 +106,9 @@ void player_to_pixels (void) { } void player_kill (void) { + oam_index = oam_index_player; player_render (); - update_cycle (); + ppu_waitnmi (); pkill = phit = 0; sfx_play (SFX_PHIT, 0); @@ -199,6 +200,7 @@ void player_move (void) { #endif hitv = hith = 0; + pcx = prx; pcy = pry; pnotsafe = 0; #ifdef ENABLE_SLIPPERY pice = 0; @@ -565,7 +567,7 @@ void player_move (void) { #endif if (pad0 & PAD_A) { if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (32 - (pctj)); + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; ++ pctj; if (pctj == 16) pj = 0; } @@ -626,25 +628,29 @@ void player_move (void) { #ifdef PLAYER_TOP_DOWN pfacingh = 0xff; #endif - - if (pvx > 0) { + #ifdef PLAYER_SPINS + if (!pspin) + #endif + { + if (pvx > 0) { - #ifdef ENABLE_SLIPPERY - pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx -= PLAYER_RX; - #endif - - if (pvx < 0) pvx = 0; - } else if (pvx < 0) { + #ifdef ENABLE_SLIPPERY + pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx -= PLAYER_RX; + #endif + + if (pvx < 0) pvx = 0; + } else if (pvx < 0) { - #ifdef ENABLE_SLIPPERY - pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx += PLAYER_RX; - #endif + #ifdef ENABLE_SLIPPERY + pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx += PLAYER_RX; + #endif - if (pvx > 0) pvx = 0; + if (pvx > 0) pvx = 0; + } } } @@ -721,7 +727,7 @@ void player_move (void) { if (cy2 != cy3) if (at3 & 2) player_process_tile (at3, cx1, cy3, rdm, cy3); #endif } else { - hith = ((at1 & 1) || (at2 & 1) || (at3 & 1)); + hith = ((at1 & 1) || (at2 & 1) || (at3 & 1)); } #else cm_two_points (); @@ -737,6 +743,7 @@ void player_move (void) { hith = ((at1 & 1) || (at2 & 1)); } #endif + if (pvy > 0) hith &= ((pry & 15) > 4); } // Facing @@ -768,10 +775,17 @@ void player_move (void) { if (pgotten == 0) { #ifdef NO_HORIZONTAL_EVIL_TILE - if (hitv || hith) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } #else - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); } + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } #endif #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) @@ -803,6 +817,8 @@ void player_move (void) { cx1 = cx2 = (prx + 4) >> 4; cy1 = cy2 = (pry + 8) >> 4; cm_two_points (); + + #include "my/custom_center_detections.h" #endif #ifdef ENABLE_TILE_GET diff --git a/examples/10_che_man/dev/labels.txt b/examples/10_che_man/dev/labels.txt index 60ff983..0c71d12 100644 --- a/examples/10_che_man/dev/labels.txt +++ b/examples/10_che_man/dev/labels.txt @@ -7,88 +7,88 @@ crt0.o: VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 002000 game.o: - CODE Offs = 000000 Size = 00278F + CODE Offs = 000000 Size = 002826 RODATA Offs = 000730 Size = 001FA4 - BSS Offs = 000000 Size = 0002F0 - ZEROPAGE Offs = 000000 Size = 0000BA + BSS Offs = 000000 Size = 0002F1 + ZEROPAGE Offs = 000000 Size = 0000BB runtime.lib(addysp.o): - CODE Offs = 00278F Size = 00000E + CODE Offs = 002826 Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 00279D Size = 00000B + CODE Offs = 002834 Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 0027A8 Size = 00000E + CODE Offs = 00283F Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 0027B6 Size = 000011 + CODE Offs = 00284D Size = 000011 runtime.lib(asrax1.o): - CODE Offs = 0027C7 Size = 00000A + CODE Offs = 00285E Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 0027D1 Size = 00000F + CODE Offs = 002868 Size = 00000F runtime.lib(asrax3.o): - CODE Offs = 0027E0 Size = 000014 + CODE Offs = 002877 Size = 000014 runtime.lib(asrax4.o): - CODE Offs = 0027F4 Size = 000019 + CODE Offs = 00288B Size = 000019 runtime.lib(bneg.o): - CODE Offs = 00280D Size = 00000E + CODE Offs = 0028A4 Size = 00000E runtime.lib(call.o): - CODE Offs = 00281B Size = 000007 + CODE Offs = 0028B2 Size = 000007 runtime.lib(copydata.o): - CODE Offs = 002822 Size = 00002D + CODE Offs = 0028B9 Size = 00002D runtime.lib(decsp3.o): - CODE Offs = 00284F Size = 00000D + CODE Offs = 0028E6 Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 00285C Size = 00000D + CODE Offs = 0028F3 Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 002869 Size = 00000D + CODE Offs = 002900 Size = 00000D runtime.lib(icmp.o): - CODE Offs = 002876 Size = 00002E + CODE Offs = 00290D Size = 00002E runtime.lib(incsp1.o): - CODE Offs = 0028A4 Size = 000007 + CODE Offs = 00293B Size = 000007 runtime.lib(incsp2.o): - CODE Offs = 0028AB Size = 000016 + CODE Offs = 002942 Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 0028C1 Size = 000005 + CODE Offs = 002958 Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 0028C6 Size = 000005 + CODE Offs = 00295D Size = 000005 runtime.lib(makebool.o): - CODE Offs = 0028CB Size = 000031 + CODE Offs = 002962 Size = 000031 runtime.lib(neg.o): - CODE Offs = 0028FC Size = 00000E + CODE Offs = 002993 Size = 00000E runtime.lib(or.o): - CODE Offs = 00290A Size = 000012 + CODE Offs = 0029A1 Size = 000012 runtime.lib(popa.o): - CODE Offs = 00291C Size = 00000C + CODE Offs = 0029B3 Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 002928 Size = 000010 + CODE Offs = 0029BF Size = 000010 runtime.lib(pusha.o): - CODE Offs = 002938 Size = 000016 + CODE Offs = 0029CF Size = 000016 runtime.lib(pushax.o): - CODE Offs = 00294E Size = 00001A + CODE Offs = 0029E5 Size = 00001A runtime.lib(shl.o): - CODE Offs = 002968 Size = 00002B + CODE Offs = 0029FF Size = 00002B runtime.lib(shrax1.o): - CODE Offs = 002993 Size = 000008 + CODE Offs = 002A2A Size = 000008 runtime.lib(shrax3.o): - CODE Offs = 00299B Size = 00000E + CODE Offs = 002A32 Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 0029A9 Size = 000011 + CODE Offs = 002A40 Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 0029BA Size = 000016 + CODE Offs = 002A51 Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 0029D0 Size = 00000B + CODE Offs = 002A67 Size = 00000B runtime.lib(sub.o): - CODE Offs = 0029DB Size = 000015 + CODE Offs = 002A72 Size = 000015 runtime.lib(subeqsp.o): - CODE Offs = 0029F0 Size = 000015 + CODE Offs = 002A87 Size = 000015 runtime.lib(subysp.o): - CODE Offs = 002A05 Size = 00000D + CODE Offs = 002A9C Size = 00000D runtime.lib(udiv.o): - CODE Offs = 002A12 Size = 00004F + CODE Offs = 002AA9 Size = 00004F runtime.lib(umod.o): - CODE Offs = 002A61 Size = 000011 + CODE Offs = 002AF8 Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000BA Size = 00001A + ZEROPAGE Offs = 0000BB Size = 00001A Segment list: @@ -97,23 +97,23 @@ Name Start End Size -------------------------------------------- CHARS 000000 001FFF 002000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000FB 0000D4 -BSS 000300 0005EF 0002F0 +ZEROPAGE 000028 0000FC 0000D5 +BSS 000300 0005F0 0002F1 STARTUP 008000 008CB1 000CB2 INIT 008CB2 008CD4 000023 -CODE 008CD5 00B746 002A72 -RODATA 00B747 00DE1A 0026D4 +CODE 008CD5 00B7DD 002B09 +RODATA 00B7DE 00DEB1 0026D4 VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 0002F0 REA -__DATA_LOAD__ 00DE1B RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 0002F1 REA +__DATA_LOAD__ 00DEB2 RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA _bank_bg 008416 RLA _bank_spr 008406 RLA -_delay 0085BB RLA _main 00B3EC RLA +_delay 0085BB RLA _main 00B483 RLA _memfill 00858C RLA _music_pause 0087A1 REA _music_play 008734 REA _music_stop 0086F6 REA _oam_clear 0082AF RLA _oam_hide_rest 008341 RLA @@ -127,33 +127,33 @@ _set_rand 00850B RLA _set_vram_update 008510 RLA _sfx_play 00848A RLA _unrle_vram 008367 RLA _vram_adr 00851A RLA _vram_fill 008525 RLA _vram_put 008521 RLA _vram_read 008427 RLA -_vram_write 00845A RLA addysp 00B465 RLA -addysp1 00B464 RLA aslax2 00B472 RLA -aslax3 00B47D RLA aslax4 00B48B RLA -asrax1 00B49C RLA asrax2 00B4A6 RLA -asrax3 00B4B5 RLA asrax4 00B4C9 RLA -bnega 00B4E6 RLA booleq 00B5A6 RLA -boolne 00B5A0 RLA callax 00B4F0 RLA -copydata 00B4F7 RLA decsp3 00B524 RLA -decsp4 00B531 RLA decsp8 00B53E RLA -incsp1 00B579 RLA incsp2 00B588 RLA -incsp4 00B596 RLA incsp8 00B59B RLA -negax 00B5D1 RLA popa 00B5F1 RLA -popax 00B580 RLA popsreg 00B5FD RLA -ptr1 0000EA RLZ ptr2 0000EC RLZ -ptr4 0000F0 RLZ push0 00B623 RLA -pusha 00B611 RLA pusha0 00B625 RLA -pushax 00B627 RLA regsave 0000E6 RLZ -shlax2 00B472 RLA shlax4 00B48B RLA -shrax1 00B668 RLA shrax3 00B670 RLA -shrax4 00B67E RLA sp 0000E2 RLZ -sreg 0000E4 RLZ staspidx 00B68F RLA -stax0sp 00B6A5 RLA subeqysp 00B6C7 RLA -subysp 00B6DA RLA tmp1 0000F2 RLZ -tosaslax 00B63D RLA tosicmp 00B54D RLA -tosicmp0 00B54B RLA tosorax 00B5E1 RLA -tossuba0 00B6B0 RLA tosudiva0 00B6E7 RLA -tosumoda0 00B736 RLA udiv16 00B6F8 RLA +_vram_write 00845A RLA addysp 00B4FC RLA +addysp1 00B4FB RLA aslax2 00B509 RLA +aslax3 00B514 RLA aslax4 00B522 RLA +asrax1 00B533 RLA asrax2 00B53D RLA +asrax3 00B54C RLA asrax4 00B560 RLA +bnega 00B57D RLA booleq 00B63D RLA +boolne 00B637 RLA callax 00B587 RLA +copydata 00B58E RLA decsp3 00B5BB RLA +decsp4 00B5C8 RLA decsp8 00B5D5 RLA +incsp1 00B610 RLA incsp2 00B61F RLA +incsp4 00B62D RLA incsp8 00B632 RLA +negax 00B668 RLA popa 00B688 RLA +popax 00B617 RLA popsreg 00B694 RLA +ptr1 0000EB RLZ ptr2 0000ED RLZ +ptr4 0000F1 RLZ push0 00B6BA RLA +pusha 00B6A8 RLA pusha0 00B6BC RLA +pushax 00B6BE RLA regsave 0000E7 RLZ +shlax2 00B509 RLA shlax4 00B522 RLA +shrax1 00B6FF RLA shrax3 00B707 RLA +shrax4 00B715 RLA sp 0000E3 RLZ +sreg 0000E5 RLZ staspidx 00B726 RLA +stax0sp 00B73C RLA subeqysp 00B75E RLA +subysp 00B771 RLA tmp1 0000F3 RLZ +tosaslax 00B6D4 RLA tosicmp 00B5E4 RLA +tosicmp0 00B5E2 RLA tosorax 00B678 RLA +tossuba0 00B747 RLA tosudiva0 00B77E RLA +tosumoda0 00B7CD RLA udiv16 00B78F RLA zerobss 008CB2 RLA @@ -240,106 +240,106 @@ _vram_write (crt0.o): addysp (addysp.o): incsp8.o incsp8.s(8) incsp4.o incsp4.s(8) - game.o game.s(10301) + game.o game.s(10312) addysp1 (addysp.o): sub.o sub.s(8) or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(8001) - game.o game.s(8162) - game.o game.s(10644) - game.o game.s(11794) - game.o game.s(11849) - game.o game.s(11884) - game.o game.s(13154) - game.o game.s(14061) - game.o game.s(14694) + game.o game.s(8007) + game.o game.s(8168) + game.o game.s(10663) + game.o game.s(11879) + game.o game.s(11934) + game.o game.s(11969) + game.o game.s(13239) + game.o game.s(14146) + game.o game.s(14779) aslax3 (aslax3.o): - game.o game.s(7921) - game.o game.s(11893) + game.o game.s(7927) + game.o game.s(11978) aslax4 (aslax4.o): - game.o game.s(7403) - game.o game.s(7861) - game.o game.s(8013) - game.o game.s(8174) - game.o game.s(8267) - game.o game.s(8863) - game.o game.s(9603) - game.o game.s(10264) - game.o game.s(10414) - game.o game.s(11793) - game.o game.s(11848) - game.o game.s(13153) - game.o game.s(13706) - game.o game.s(14688) + game.o game.s(7409) + game.o game.s(7867) + game.o game.s(8019) + game.o game.s(8180) + game.o game.s(8273) + game.o game.s(8869) + game.o game.s(9609) + game.o game.s(10275) + game.o game.s(10433) + game.o game.s(11878) + game.o game.s(11933) + game.o game.s(13238) + game.o game.s(13791) + game.o game.s(14773) asrax1 (asrax1.o): - game.o game.s(7932) - game.o game.s(12150) + game.o game.s(7938) + game.o game.s(12235) asrax2 (asrax2.o): - game.o game.s(7915) - game.o game.s(10040) - game.o game.s(10553) - game.o game.s(12905) - game.o game.s(15018) + game.o game.s(7921) + game.o game.s(10046) + game.o game.s(10572) + game.o game.s(12990) + game.o game.s(15107) asrax3 (asrax3.o): - game.o game.s(11554) + game.o game.s(11639) asrax4 (asrax4.o): - game.o game.s(10039) - game.o game.s(10342) - game.o game.s(12904) - game.o game.s(15017) + game.o game.s(10045) + game.o game.s(10361) + game.o game.s(12989) + game.o game.s(15106) bnega (bneg.o): - game.o game.s(7450) - game.o game.s(10827) - game.o game.s(12527) + game.o game.s(7456) + game.o game.s(10846) + game.o game.s(12612) booleq (makebool.o): - game.o game.s(13181) - game.o game.s(14810) + game.o game.s(13266) + game.o game.s(14895) boolne (makebool.o): - game.o game.s(7389) - game.o game.s(15419) + game.o game.s(7395) + game.o game.s(15468) callax (call.o): - game.o game.s(13580) + game.o game.s(13665) copydata (copydata.o): crt0.o crt0.s(26) decsp3 (decsp3.o): - game.o game.s(7556) - game.o game.s(7714) - game.o game.s(9751) - game.o game.s(11613) - game.o game.s(12570) - game.o game.s(13409) - game.o game.s(13634) - game.o game.s(13817) - game.o game.s(14658) - game.o game.s(15481) + game.o game.s(7562) + game.o game.s(7720) + game.o game.s(9757) + game.o game.s(11698) + game.o game.s(12655) + game.o game.s(13494) + game.o game.s(13719) + game.o game.s(13902) + game.o game.s(14743) + game.o game.s(15577) decsp4 (decsp4.o): - game.o game.s(8829) - game.o game.s(13700) - game.o game.s(14055) - game.o game.s(14866) - game.o game.s(15828) + game.o game.s(8835) + game.o game.s(13785) + game.o game.s(14140) + game.o game.s(14951) + game.o game.s(15924) decsp8 (decsp8.o): - game.o game.s(15298) + game.o game.s(15347) incsp1 (incsp1.o): - game.o game.s(7305) + game.o game.s(7311) incsp2 (incsp2.o): popsreg.o popsreg.s(8) staspidx.o staspidx.s(8) - game.o game.s(8896) + game.o game.s(8902) incsp4 (incsp4.o): - game.o game.s(9194) - game.o game.s(9303) - game.o game.s(13602) + game.o game.s(9200) + game.o game.s(9309) + game.o game.s(13687) incsp8 (incsp8.o): - game.o game.s(9075) + game.o game.s(9081) negax (neg.o): - game.o game.s(9205) - game.o game.s(9294) - game.o game.s(11328) - game.o game.s(11854) - game.o game.s(12101) - game.o game.s(12743) + game.o game.s(9211) + game.o game.s(9300) + game.o game.s(11362) + game.o game.s(11939) + game.o game.s(12186) + game.o game.s(12828) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -363,57 +363,57 @@ ptr4 (zeropage.o): umod.o umod.s(9) udiv.o udiv.s(9) push0 (pushax.o): - game.o game.s(15800) + game.o game.s(15896) pusha (pusha.o): - game.o game.s(7513) - game.o game.s(7756) - game.o game.s(9238) - game.o game.s(9373) - game.o game.s(10085) - game.o game.s(10295) - game.o game.s(10431) - game.o game.s(12270) - game.o game.s(13131) - game.o game.s(13747) - game.o game.s(14743) - game.o game.s(14972) - game.o game.s(15092) + game.o game.s(7519) + game.o game.s(7762) + game.o game.s(9244) + game.o game.s(9379) + game.o game.s(10096) + game.o game.s(10306) + game.o game.s(10450) + game.o game.s(12355) + game.o game.s(13216) + game.o game.s(13832) + game.o game.s(14828) + game.o game.s(15061) + game.o game.s(15181) pusha0 (pushax.o): - game.o game.s(7418) - game.o game.s(7879) - game.o game.s(7956) - game.o game.s(9112) - game.o game.s(10698) - game.o game.s(12663) - game.o game.s(14346) + game.o game.s(7424) + game.o game.s(7885) + game.o game.s(7962) + game.o game.s(9118) + game.o game.s(10717) + game.o game.s(12748) + game.o game.s(14431) pushax (pushax.o): - game.o game.s(7806) - game.o game.s(8292) - game.o game.s(8790) - game.o game.s(9016) - game.o game.s(9273) - game.o game.s(12882) - game.o game.s(13294) - game.o game.s(13621) - game.o game.s(13790) - game.o game.s(13810) - game.o game.s(13994) - game.o game.s(14823) + game.o game.s(7812) + game.o game.s(8298) + game.o game.s(8796) + game.o game.s(9022) + game.o game.s(9279) + game.o game.s(12967) + game.o game.s(13379) + game.o game.s(13706) + game.o game.s(13875) + game.o game.s(13895) + game.o game.s(14079) + game.o game.s(14908) regsave (zeropage.o): game.o game.s(10) shlax2 (aslax2.o): - game.o game.s(12901) + game.o game.s(12986) shlax4 (aslax4.o): - game.o game.s(8958) - game.o game.s(9458) - game.o game.s(10401) - game.o game.s(12900) + game.o game.s(8964) + game.o game.s(9464) + game.o game.s(10420) + game.o game.s(12985) shrax1 (shrax1.o): - game.o game.s(9457) + game.o game.s(9463) shrax3 (shrax3.o): - game.o game.s(12689) + game.o game.s(12774) shrax4 (shrax4.o): - game.o game.s(10350) + game.o game.s(10369) sp (zeropage.o): popsreg.o popsreg.s(9) subysp.o subysp.s(9) @@ -440,16 +440,16 @@ sreg (zeropage.o): icmp.o icmp.s(9) game.o game.s(10) staspidx (staspidx.o): - game.o game.s(7818) - game.o game.s(8300) - game.o game.s(8798) + game.o game.s(7824) + game.o game.s(8306) + game.o game.s(8804) stax0sp (staxsp.o): - game.o game.s(8891) - game.o game.s(10176) + game.o game.s(8897) + game.o game.s(10187) subeqysp (subeqsp.o): - game.o game.s(10167) + game.o game.s(10178) subysp (subysp.o): - game.o game.s(11215) + game.o game.s(11234) tmp1 (zeropage.o): staspidx.o staspidx.s(9) shrax4.o shrax4.s(8) @@ -467,26 +467,26 @@ tmp1 (zeropage.o): aslax2.o aslax2.s(8) game.o game.s(10) tosaslax (shl.o): - game.o game.s(7966) - game.o game.s(12888) + game.o game.s(7972) + game.o game.s(12973) tosicmp (icmp.o): - game.o game.s(7424) - game.o game.s(9022) - game.o game.s(9118) - game.o game.s(9279) - game.o game.s(10709) - game.o game.s(12669) + game.o game.s(7430) + game.o game.s(9028) + game.o game.s(9124) + game.o game.s(9285) + game.o game.s(10728) + game.o game.s(12754) tosicmp0 (icmp.o): - game.o game.s(11253) - game.o game.s(14350) + game.o game.s(11272) + game.o game.s(14435) tosorax (or.o): - game.o game.s(7967) + game.o game.s(7973) tossuba0 (sub.o): - game.o game.s(12887) + game.o game.s(12972) tosudiva0 (udiv.o): - game.o game.s(7881) + game.o game.s(7887) tosumoda0 (umod.o): - game.o game.s(7892) + game.o game.s(7898) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git a/examples/10_che_man/dev/mainloop.h b/examples/10_che_man/dev/mainloop.h index f453909..79c7b2f 100644 --- a/examples/10_che_man/dev/mainloop.h +++ b/examples/10_che_man/dev/mainloop.h @@ -97,7 +97,7 @@ void game_init (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Clear tile_got persistence - vram_adr (0x2c20); + vram_adr (MAP_CLEAR_LIST_ADDRESS); vram_fill (0, MAP_SIZE*24); #endif @@ -120,12 +120,15 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Update tile_got persistence rda = on_pant << 3; - vram_write (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif } else { ft = 0; ppu_off (); } + + clear_update_list (); + #ifdef ENABLE_PROPELLERS // Clear propellers prp_idx = 0; @@ -161,7 +164,7 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Read tile_got persistence rda = n_pant << 3; - vram_read (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif draw_scr (); @@ -346,6 +349,22 @@ void game_loop (void) { half_life ^= 1; ++ frame_counter; + // Detect interactions + + #ifdef ENABLE_INTERACTIVES + #include "mainloop/interactives.h" + #endif + + // Update / collide hotspots + + #include "mainloop/hotspots.h" + + // Automatic scripting calls (USE_ANIM & fire zone) + + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" + #endif + // Update player if (!warp_to_level) { @@ -372,22 +391,6 @@ void game_loop (void) { if (propellers_on) propellers_do (); #endif - // Detect interactions - - #ifdef ENABLE_INTERACTIVES - #include "mainloop/interactives.h" - #endif - - // Update / collide hotspots - - #include "mainloop/hotspots.h" - - // Automatic scripting calls (USE_ANIM & fire zone) - - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" - #endif - // Update bullets #ifdef PLAYER_CAN_FIRE @@ -402,7 +405,8 @@ void game_loop (void) { // Paint player - player_render (); + oam_index_player = oam_index; + if (!warp_to_level) player_render (); // Update enemies diff --git a/examples/10_che_man/dev/my/custom_center_detections.h b/examples/10_che_man/dev/my/custom_center_detections.h new file mode 100644 index 0000000..963c83d --- /dev/null +++ b/examples/10_che_man/dev/my/custom_center_detections.h @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// custom_center_detections.h +// at1 constains the tile beh at the center of the player sprite +// For this code to be included, enable CUSTOM_CENTER_DETECTIONS in config.h diff --git a/examples/10_che_man/dev/ram/bss.h b/examples/10_che_man/dev/ram/bss.h index 06fd516..78c44e8 100644 --- a/examples/10_che_man/dev/ram/bss.h +++ b/examples/10_che_man/dev/ram/bss.h @@ -52,6 +52,8 @@ unsigned char oobjs; // Player items, last frame value (used unsigned char oammo; // Player ammo, last frame value (used to detect changes) unsigned char okilled; // Player # of killed enems., last frame value (used to detect changes) +unsigned char oam_index_player; // Index copy + // Custom hotspot type star (used as an extra collectible). #ifdef HOTSPOT_TYPE_STAR diff --git a/examples/10_che_man/dev/ram/zp.h b/examples/10_che_man/dev/ram/zp.h index 462136d..e4da55b 100644 --- a/examples/10_che_man/dev/ram/zp.h +++ b/examples/10_che_man/dev/ram/zp.h @@ -40,7 +40,7 @@ unsigned char caux; // Auxiliar variable // Sprite related (neslib) -unsigned char oam_index, oam_index_aux; +unsigned char oam_index; // Enemies @@ -92,6 +92,7 @@ unsigned char vertical_engine_type; // Player engine type. Se ENGINE_TYPE_* signed int px, py; // Player X, Y coordinates, fixed point 10.6 signed int pvx, pvy; // Player VX, VY velocities, fixed point 10.6 unsigned char prx, pry; // Player pixel coordinates, calculated from px, py. +unsigned char pcx, pcy; // Coordinates prior to movement. unsigned char pfacing; // Player facing left, right unsigned char pfr; // Player frame unsigned char pctfr; // Player counter (for animation) diff --git "a/examples/11_boot\303\250e/dev/assets/behs.h" "b/examples/11_boot\303\250e/dev/assets/behs.h" index d451798..18c2d5a 100644 --- "a/examples/11_boot\303\250e/dev/assets/behs.h" +++ "b/examples/11_boot\303\250e/dev/assets/behs.h" @@ -5,7 +5,6 @@ // Add these: // + 1 kills (useless if + 8 obstacle) -// + 2 quicksands ( " , needs ENABLE_QUICKSANDS) // + 4 platform (side view) // + 8 obstacle (nullifies + 1 & + 2, see bellow) // +16 breakable @@ -13,11 +12,14 @@ // +64 slippery // Special values (= nonsensical combinations): +// 2 quicksands ( " , needs ENABLE_QUICKSANDS) // 9 not safe block (safe spot not saved when jumping off this) // 10 lock // 11 pushable -// 32 ladder (== 32, no obstacle!) -// 64 float (== 64, no obstacle!) +// 32 ladder (== 32, no obstacle!) +// 34 tile_get (== 34, no obstacle!) +// 64 float (== 64, no obstacle!) +// 74 trampol. (== 74, obstacle!) const unsigned char behs0 [] = { 0, 8, 8, 8, 0, 8, 4, 1, 8, 8, 8, 4, 4, 8, 4,10, diff --git "a/examples/11_boot\303\250e/dev/assets/levelset.h" "b/examples/11_boot\303\250e/dev/assets/levelset.h" index 4a4ac86..52a3aec 100644 --- "a/examples/11_boot\303\250e/dev/assets/levelset.h" +++ "b/examples/11_boot\303\250e/dev/assets/levelset.h" @@ -5,6 +5,7 @@ const unsigned char l_scr_ini [] = { 0, 0, 0 }; const unsigned char l_ini_x [] = { 10, 2, 10 }; const unsigned char l_ini_y [] = { 3, 2, 2 }; const unsigned char l_map_w [] = { 6, 4, 4 }; +const unsigned char l_map_h [] = { 5, 6, 6 }; // Ending screen & position, per level (comment if N/A) diff --git "a/examples/11_boot\303\250e/dev/assets/precalcs.h" "b/examples/11_boot\303\250e/dev/assets/precalcs.h" index 7fd5156..6efc4c3 100644 --- "a/examples/11_boot\303\250e/dev/assets/precalcs.h" +++ "b/examples/11_boot\303\250e/dev/assets/precalcs.h" @@ -40,3 +40,12 @@ CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1, CHAC_CHAC_BASE_TILE + 3, CHAC_CHAC_BASE_TILE + 5, CHAC_CHAC_BASE_TILE + 3, CHAC_CHAC_BASE_TILE + 1 }; #endif + +const unsigned char bits [] = { + 1, 2, 4, 8, 16, 32, 64, 128 +}; + +#ifdef ENEMS_MAY_DIE + const unsigned char jitter [] = { 0,1,1,0,0,1,0,1,1,0,0,0,1,0,1,1 }; +#endif + diff --git "a/examples/11_boot\303\250e/dev/autodefs.h" "b/examples/11_boot\303\250e/dev/autodefs.h" index f13855d..a1a70d4 100644 --- "a/examples/11_boot\303\250e/dev/autodefs.h" +++ "b/examples/11_boot\303\250e/dev/autodefs.h" @@ -3,8 +3,7 @@ // Inner workings. Don't touch. -#define MONOCOCO_COUNTER _en_my -#define MONOCOCO_STATE _en_mx +#define CATACROCK_WAIT _en_mx #if defined (ENABLE_MONOCOCOS) || (defined (ENABLE_COMPILED_ENEMS) && defined (COMPILED_ENEMS_SHOOT)) #define ENABLE_COCOS @@ -25,11 +24,15 @@ #define PLAYER_CAN_FLOAT #endif -#if defined (ENABLE_LADDERS) || defined (ENABLE_PROPELLERS) || defined (ENABLE_SPRINGS) +#if defined (ENABLE_LADDERS) || defined (ENABLE_PROPELLERS) || defined (ENABLE_SPRINGS) /*|| defined (ENABLE_TRAMPOLINES)*/ #define NEEDS_INITIAL_DETECTION #endif -#if defined (PLAYER_STEPS_ON_ENEMS) || defined (PLAYER_CAN_FIRE) || defined (PLAYER_KICKS) || defined (PLAYER_PUNCHES) || defined (ENEMIES_SUFFER_ON_PLAYER_COLLISION) || defined (FANTY_KILLED_BY_TILE) +#if defined (ENABLE_TILE_GET) || defined (CUSTOM_CENTER_DETECTIONS) +#define NEEDS_CENTER_DETECTION +#endif + +#if defined (PLAYER_STEPS_ON_ENEMS) || defined (PLAYER_CAN_FIRE) || defined (PLAYER_KICKS) || defined (PLAYER_PUNCHES) || defined (ENEMIES_SUFFER_ON_PLAYER_COLLISION) || defined (FANTY_KILLED_BY_TILE) || defined (PLAYER_SPINS) #define ENEMS_MAY_DIE #endif @@ -75,6 +78,10 @@ #define MAP_RENDERER_COMPLEX #endif +#if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + #define MAP_RENDERER_COMPLEX +#endif + #if defined (ENABLE_BREAKABLE) && BREAKABLE_LIFE == 1 #define BREAKABLES_SOFT #endif @@ -95,3 +102,12 @@ #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) #define ENABLE_SHAKER #endif + +#if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_TIMED_FANTY) || defined (ENABLE_BOIOIONG) || defined (ENABLE_CATACROCKS) + #define ENEMS_NEED_FP +#endif + +#if defined (PLAYER_TOP_DOWN) && defined (NO_HORIZONTAL_EVIL_TILE) + #undef NO_HORIZONTAL_EVIL_TILE +#endif + diff --git "a/examples/11_boot\303\250e/dev/cart-omv.nes" "b/examples/11_boot\303\250e/dev/cart-omv.nes" index 8d7a0c0b1428dab9d386bd4112aa75fe2fc5aeea..ea6b999a742c0c0a5c466588b8dfba7dc9788a4f 100644 GIT binary patch delta 12125 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 qvQCa^+Iw_f8|Scs$RW% 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 diff --git "a/examples/11_boot\303\250e/dev/cart.nes" "b/examples/11_boot\303\250e/dev/cart.nes" index 006ae59e30aceace89f0c184b980c23e9be76484..b79a2114d5d3b25c48e95338a745ae6a2b49b268 100644 GIT binary patch delta 12125 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 qvQCa^+Iw_f8|Scs$RW% z@71eUui~k*dhqwBUUTzBDPP=?FUqULV*%AdG&P!>EF^<6a`Jtx-U@0J=ec|ny$8g3 z1?m;jo7}2e+=7TdX>eIaLB_@m+9S!KM^T$*m%eyi`uTOAWwlLIt?nL^XdlfcH3ohd z#&K(vKGv}ro63{=`)S`TbzG>AQ;qjoP`lVHYCpUBIQ_Lngg9z_gxo^P6Q~%VbsKF%2sPys@Ay0Y7OAc8E*^TTWnUUIdXWSd90z61*kbmUspdbP%Fql z_8Jt>lv{1Xx^pr7= zwOw@E#nLEIMAQ5EA>Ghr#R}kR zmpe&s*R4*{)71+N$<0oaq|+TGI!S+*2%s`vxI+dHgIz;FmJD?b^I52<$BENPgBThT z8YYb+CH?hSuO%?JaA@OU?dP_hq;KaAvEmZeVVE>8(wz1+nqPMMA=ASe$}Q`O)52M8 zf2%q2+1LN+cI!xD{J314OZiTipp3L{;66~^x92z(Z|TLUE4K{bRLhob+!hN|)=g`b zvXrS&L($}gs0X+#<=v=JS!pXArSrJ?Ih=bQSNbA1{{`;Y{al&d{URsDtVsR#ehxL? zSaHvro^C!%X*wr9_on+P&X;OJY^Bo-h?Dc(%^=Y}duaxP_{NzHVoEddsboa|jvJ^f zj27eNmF}0hjWKeHRkbV$uT<3Nehl_XXV|AEY(Zz3E#|I-Lj}Hg5wCviHA*~Gkr8t% zCmwq<5bM653&m=_P&aLBAeO{6;?<4Dk=PZ|u{V`vvFWho!?DBh{&(!;o1#`Wy5h3p z{DD~5Ay*P7{j;EATDPT~*reLXY1OjB$Lq0$O^w=rLZ=UFKi1iGfqnhtROa3|P(HNE zFTNTOW{@V>D%yLW4K$Gl=`8&QsC`yyD_15QmcB6?&Fs=>y3-pK(EKX`ns~C@D@3Y; z%2VcC2kyv;_iz`*LFKwNA+^2n$#U6i>*y$ULbSo#JElbIcAup{dZFBBQ8}Za3Rni& z`rLw6i|0P7h$qTvt|O zv(esT*Le)#WCJ+c7-+U=Q9%p5NLG0xSZ&VpboX)*o)?t^+V;h&m`qCF2ogf+G`HLJ z+q|4KclA|B8PZ!+j{@`dGi)s*{q>HFoS7F!0o0+)?~ zG^rM5OmvdhQrOfLw}YYl8(}kaV#y?#e2n(c4w>khL_hXg#NSnPZQo971f%7oBS;!_ zngpYDHOCHZE@^gT4LAD3enm2gra`@GtoUYyBPW535Tn+#L7Gg66txEZhl`#7X>y&G z4O*Un_T)kLNhWSus!u0RrIVIWyG*26J$dhxXC20KYBPOsK43}GYDnv(s+BN?SY z6Z=e$6)%*FE6dSl8ci!|u*31P@kWY|V}M#Rwjk>ONj2yi6OcP*kijP4&t`%kAG<#3 zES8c_AZ$3?vE(*7wj?!z8tY1>w~3d28=>}hWKAR!u@OyTvc4YGM}NDwIi7TBIc7ko zIdbaAM5t~M6R{!J|7TWgQc56xkTq(JaxlIpE53~v<)}3V%@L*wm153snu3KuGRYJ&* z{4HVRQ=vloKx(TfrLPr3h0@@)Y8^?Y$r)HqBstr!4=PTs9>kNhpitIbJhVKC)1%Y` zM^+k4AlVpNdU`EJ(7MsGU=K}D`?^>1G)V5EhshXM8a<)hl{oem;17Y$5J9VBgX~&M zhO3yEI!Gaj0|!6rvpKRdVdZSqFj-7BEzXq1R5DWR?@^8<_Lgmm7*(z|c&%*V+Ocr! zAX8Ka6>4y5lcZtGJ4|nAGknQ#p(%ql8-~YBEaKQY#3)XyfX+T9$$ogiN6Kk(aEK;^ zlBA^yO@>ThebOd{9>Z*olQF7nA<4mhW%0$yDpwRG&}0Z)`do3+JtPetg;p`f=(~=b zl+@O^GA^|>fxWmD0M5n>yrmh6$mz{&;veL6W1tBeOq2M1KA8=-+^#4LSdfJg!P{MA z57WG{Cgh6*Y6mEd?$K}F8RDy>1U;UnCF$f{kj4+GVrt*RUWH^WSwlR|(rI#xd_m6=N>gTRP1}?mC%`=4AG< z$uwUz8M?A$mAEay+>k=uC95O#b&Rv^#IN#g-kt8!g@#?yxb-UM{)ShrWSjaN@jBU7 zxgt^1qu6F8=2RGajm$PJ;^M+K zTcjttnDyh=t|!A1(yoQWKGJF0u@En72iv#sR|8&qqLxw6n5g-)v5C_9bZvWaazW7$ zLE5;!VK=z0DaY<5-MB%0&iy0rjg@8uN`GPEJ^l;7^B2DQC!SOmSC;ZZ(PdsuaN7mC zULP2Y)*e%T_3@6ZO6K+9c&U=w8qHisaiy&OD*a`{)o4df1g-K#7D4@Qm(Eb2-R!Jd zimZYf!{lz29$8*o3BYB>2(2voiNEvEJO%IeFo9_hQcj6r3CDJ)XP z7rYPK5>$&%Fqy?_{ZqL(CSa`E4mPf8ZoO`EW1wJ6nE(USld#AE_?7o!Z${<6yd&o( zW{$Et5z9!m84F5m#G)y#^jXjl#}MW{#0oOQfUq76VywW!4E_)n-$U0%f|=^&&frz{P%}_0^ESkfVW|4Hk zK_43tq2a3mY}CZCUM`}egB-oH)$$SorW6|hzEMU{nGj(qGL8{fJ_PBM zS$$!HxFPdF<;vz;2F$sJFedz95~tb08K>Wjp?0#NIzT)?C3KS(Pq%2%bgRbG5(shO zYPv}uM>hu(%5GE>Qd>4FLwgVIwwVDm9z1VS{?L1uv(t98`O7Zqi=GH43>g$z% z_Z}v1(QlwWN7hQRlD?g_imak5gBH4~l`~?&D3vFQ^x_u{$K!^#IKSs zGZ`!&Bd}-UrfVEoK4`>~^)|Vaju!5Oz{SlaOgH_Q62)zDfXpN_Ab!IYr_mWqS|g?O zO{R{c+jMLw-9U1O4M|4BqqBY_^JiNmhNLH&$GX z4{vm#jI9v+A)VpH-e^`I^73ufOtysDpvJa|mpFAj)&(NFS>k|l{V_V-pgGH=IUO{w zB{}Q5Bxk|PM8*eA2&R*+tzh>ZXm2}oJO=gcw6J6?&IPV!p;;FrA3?6bw7~@C^P8o| zSimo$@Ux(wzN0gX*-p0wt$H`QU5|ps0PvUE1>Jt!E=U_TQ~9r20v!dJ#KNlvlgn(E zctJdd14fb+v(w@kG}>bmZ{C0~pBF$Y8Uc%4O4jdH$XkuY-5@41{GfPL$HjoV4=PIG2^Q`hXj@#LVbY-mYxaZ2qtp=hp9J3%O_5^5!(DBfN>Lnz9zhf>TaYQa_~ z!pQ|iV+HzJ(JX=H7L60=!lDTRT~stlpi7F<1-iIssz8?(WeQX-k_4JpG((`T7tPDE z(EOr52u>COk$f|ZGL9ohSh#zXV5dT06*&PRt~yP|7=aeJ4Dn(n8lGOYmxD_H1f4X35x^dxdO?>`Kd}E3+aNSi9t?}XQmpo=}|#m zw@J5qG0y9B0ek`r)Luh!4r-eQMH?F@kyS$#41j%<xOTSp=W3gf32PSqh*WM;8OSlz>OF)adb)r8v3h8B1uISiIGga=&frGd_zW zD>-6bY`=@ab{8sl(%gEbj9JZmFAOvv1fq+cvPjby*TsYqA9)+`;^U!*>BB*rhxuaE zNHTITDKrI#1*PA>zVcXsEU2C(kk_imK^oN)AdBir0$Eg@E|4YFQw6fPI#VD^t0jTR z)iVT=S3M6hss4jN^63J78%_w%Sdut#e}FuphRIxfKgCiL`?sr4UCp+!O|x({%IIYj z@*IK8rMYCX`bt}KL$;2rT#^f`U&uCG=GKuOX?N=#Z6WqpPb|>6XeYh3oz*%T!m~5y zJY9H@JW6x1(c}j8vMBl}_-ieplS!`BDwohFj8F88?CECire}NZCO(q8VT%#M*0;ll zJxOJ(%v|ZpcDfLJo3YG|6-gYKb6rd7{WhkYZPBCI^lj2*AC=7+%D*v1DtDUKeBbrv z1(-RrJV(|-STGZTu}yWB0L?S$FgZ$9j811kl80mnC_?Blx~M)^kEKiS=INuT$qCr( z7L^m3F0NmQ@1=P2^f5gSJ@O*BJVO$)B)pBGR10z;;ul-#YmTfrEJ2aaEP~E0nj_E! z#*%uzm_7*spxC0bLPqdle9HRspo-0##V}@K>|qlS2S94eLeh-QMrig}wR@p}Ex;M< zoh(=F%;_=linA(^>mWYY+rTc2M3U`c4kW&&zyI~TL?5y{A#^`4BoII@n-uv28pNjH_y$DzocC5WV1Aue&V^Etj{{T9kj zp-hC4IAJt3;)K!EPvkW&56w+&Q8F;Q=4=EP5160XdVjVC5;0Q541;-|WT}u+8I^w< zl~~VB9cZ5g@NUv7v%z=Z*s$C@4Bw`~$nXJk_yC44lo6-M+QXPu%Q|ClR>@$4Lr84! zh@BgQ-%vvHjKNvO96W-K3?6MZhzy+) z@Wb3nr?dm~ZJhYe=PTJ&EU-h*h6kgZ>44K z?|8Kj@=iQS+W944J*p+Or3{(AKdqs=kLkSLgYI@C#!N6<(A_3#*Rg-``i*p#`(Hdd z4kt-;mw`Y`AqdBKp{zGTN703&Rxz2_vw)>&)fgjxD1H47nxuZqD^A~z_Veg{q6 zf`AkV($?bQe3aSC{o2pSXFp?;DprdhxWx6VaZ@Peyl&^k{VsyT$whKXYE|XOx6xE){xc%(A0NIF3 z6;%MFHz0zK<=p^bq^B)wqy7U(8yO6>2lDF@hU$h6@#xUU=ztuV8V5)MAj8^8Ag}%s zGbwcrw53|u>uroEeV;FlTV}Lp6jIvSmwpL@Of0h@4U0dT7PP4r{|Ga$^aIN)T`;qi zMwZM}spwP&jJQee$*?V5uxwI{BPdu+?K%Pyc`7GyZ!jGiiN{H8cy<#IXK;L9JI67; zvqnm;1NS0uMh;K4`OY!i{MjAIb?wNzOyq1Q+@6PYRR}c1E`g7gi{52$Pov45s!pb$ zHeBrmhQn!}cN_L@6DzZ9 zC23&T`cBx1k-iLhfFWx;A=5e`_cLToC*%X2kaY}suoLp3PRREe@;$i|_K{B5Mut7q z3Hd}P`c;`RbGwcMH#mjc6hJ z=m#YqV!6@!k_Id{rrj~`h^G{07DK$o&5{7)=a^Ha7#Vjpq~x9b$CgkO#MP zq*Bb_0;hWuHH@J;_C=Ny5?8Mi@7V&IDRck8lif%wx-atXR$dLmb-};6zvtno-2dj) zc=v~P_XkKdx$EstTCLe(1JWBi(Y2bH!c$wtueOS*>%?#&K*>RCSuccE$w&kmCx^?t zd0yDK6aQuK3(tI&P41FD?XAvXXVSKV1Oks)0(0h4-A=5r*}s+k6@Ph4+_O&1^&)|7 z6TesJY;oK&@jk=v{Czd+2|vh0^ye0ldqV_BG&UihO_a|rSD$rXU|E1_tc><$VsU?q zZt5LGqJGfqv%d5jcHD|Bb6?_1FR^N$U68y{QU!5Nj}i~N^(CuIL;SG|yxyIeNsO4g6W^FFgkuUx zhHExOWO`_h6k!*zlE0RI#U^)tHWRr(QHz|ZiFY;#Bn;}JH;k|AXsPlF(bFc0u$pd zrO`-dz01~6qs;0?WHJr%!VO5|gq?sBb|Q`gH%for9V(OlXLo3~^wRFoF1#-Nz%CTh zXc{*6G{cVAbu#WpaCL(F8zyLb#3E}qbQopnkG!6G{6`*g>bM5EC?lxM3FG?r`jLrx zHX=bfDydhnmp%x}VJX=sOQ9dA;w!`tso#FZvm0x?|K|;0jE&#i^^MKeFP>eF)hWSI zbK*zXC9t>S8#g0g@S@zTV)IbruziT>J4(Oc^&w0S>_Y4|rp!k5J@}hkLsqH^QT0M_ zfR64jk=ZA^Si7TUyE?RMHQVhl+QHRdLnx**A#tT&l!ukFmDT?$LOVJWlI|`8=U*%X zLH6GkS2NdzrqPB2chH|rdbR8-y8Eu8>ys@GujOT}F{9vR&F|>=-=b`1V}@g6mS+B^ zQMS{?uFZ{`^Y-dBUu}TqygxR-P|}QsM(ui^?FgAQ#6^!C;Wqw%g8d@}3wmE{vZxzz ziQmfp7loWbKIAhj`!H$tS}y801eyxZG-^MFPKQ3z^iZ?*FDKPfTW#Q#b2gkbKG?rf zwSPpnefTWoluqbI!by$qFxL28ba|7x37e zAuV*$>E&_fUdfwIph!xv?No^V4Q&I__@*7)s}y zppd}`laFxkM&wi3xFKc8VqD8LXiPttLxY9_mq3;bHZ%OcSDCfpq?f}I&W3Yw;y$_= z|29?JtoN^r_9Xf@wnpzLkSrCkD-wS7s}@s5E40go64IMrF#o!K0S17avAo&f<}~A` zskk{CyA5Lqrk}xv!&Fi;!x0%90* zx%k%#daC3j%m!g)Ldi#ZfBUJSAB`A#I-~v^JuSDK_e7J^*)8WXLZ`A(6=kmUE#~E3``hcA?i)a@uK)t(;g{P$^8HBVD+c_r%GWAyWDRm6i06z_*>~4J2HUG<*3NRzbW3=`(T=LH z-Hs;?&y7`W-^#%;<71z}XHHc(>g6g$7(3Rwwo18o>}cWBsw=B1mA{O=-}+Id^8VNd zQ?Bhjvo;((w4K&9v?rzx9@_NoOp;D!lZWxlBodx*!Z+`R6Ph9qtAF#Z@@DF2``W5- zLQ$3Se(FFWbI+A4RZ45>BLnH4frS0uh9lNclta;2q55gcC30 z>9#kV*ay%5|2<;;?dwzAZ=i6exKUkyr~3^CxzioCKe0C)_3YlT{RNaS?Oi)At@|6G zw{dScK}A`;SNZ+8LDrY{D6ftC{f#}U!-=Eubd<{3abw4I1$8ue4ow$b)1@~E^W3EV!2#V89zvZ^=1TO=z6;HO}~fE5G8*EV3GdyFALYAy2CN+) zW4khMpVD*uA7Xcd{y{t^_9?H7AJqLn`@*q&P1xSOCLGnXMxo_$$5UFPOrLOT_fJ6M44!7txlp4lm@uHXuzw9S zPv;o=?|5Iyt5M1)%#OW(e>m~6{o#ap`;~-y(?`68&mDNG@f^nU+uuswy|>u!Mw1@Z z%C>v^S{GF-2k!0NovC7IttscUS|xPv_^I=23kIyZ)sP!2R^19Y+HC#%8&aH)wgq@t z`L{@U?YELOag23fEu`oed1df{srY^Vz`_IcK+S=H2k$*N``{A?JqHgQ{O3V?UH`iK z>Yl7yR=2aRwyvUiVwSbyi7D?zkALyKt?!+DFY*1<_y6+#p7#fSu=s=bKCpc_^~1ss zkA0X>Kc~L3KBnP;hLsJ68h&aRedx_YM-GXNPc;@d{?IrjSn=2cr=nB-_sHHO-HzUK zbluT2M+Y6tITk$D_xRJt-#H$0;_(xIJ8|(ux|XLM(QY`IbF$>*FDIv-s(5_%zUY+x zA20p52;^MGqcVVpSgJE zcb`?HKOqQm%-MU+&Of{D?8&pXb9bG4{@lQ`v(LKD?mhd}**@o{pUXQJJ~!aJ1wRSr z?=Z@#=d+A*_W8dU)FHX&MY&yv@@B0i53{|~g}93lV! diff --git "a/examples/11_boot\303\250e/dev/config.h" "b/examples/11_boot\303\250e/dev/config.h" index 3adcb30..51b2deb 100644 --- "a/examples/11_boot\303\250e/dev/config.h" +++ "b/examples/11_boot\303\250e/dev/config.h" @@ -6,6 +6,10 @@ //#define GAME_AREA_BOTTOM #define GAME_AREA_CUSTOM +#define MAP_CLEAR_LIST_ADDRESS 0x2c40 // To store map persistence in VRAM. + // Each screen takes 24 bytes. move it where + // It fits. Below 2c40 you may "see" the buffer + // ============================================================================ // I. General configuration // ============================================================================ @@ -59,10 +63,11 @@ //#define HOTSPOT_TYPE_AMMO 4 //#define HOTSPOT_TYPE_TIME 5 // For time refills -//#define HOTSPOT_TYPE_RESONATOR 4 // An example of custom hotspot - #define HOTSPOT_TYPE_STAR 4 // Stars are extra collectibles +//#define HOTSPOT_TYPE_RESONATOR 4 // An example of custom hotspot +//#define HOTSPOT_TYPE_RESONATOR_ON 5 // Custom for this game. + #define WIN_LEVEL_CUSTOM // A level ends when win_level == 1 // And such a thing has to be setup by YOU @@ -112,7 +117,7 @@ // Push boxes -//#define PLAYER_PUSH_BOXES // If defined, tile #14 is pushable +//#define PLAYER_PUSH_BOXES // If defined, tile beh 11 is pushable #define FIRE_TO_PUSH //#define ENABLE_PUSHED_SCRIPT @@ -122,19 +127,21 @@ // General stuff -//#define DEACTIVATE_KEYS // If defined, keys are not present. -//#define DEACTIVATE_OBJECTS // If defined, objects are not present. -#define PLAYER_BOUNCES +//#define DEACTIVATE_KEYS // If defined, keys are not present. +//#define DEACTIVATE_OBJECTS // If defined, objects are not present. +//#define PLAYER_BOUNCES 16 //#define DOUBLE_BOUNCE -//#define DIE_AND_RESPAWN // If defined, dying = respawn on latest safe. -//#define DIE_AND_REENTER // ... also, reenter screen on death -#define PLAYER_FLICKERS // If defined, collisions make player flicker instead. -#define WALLS_STOP_ENEMIES // If defined, enemies react to the scenary +//#define DIE_AND_RESPAWN // If defined, dying = respawn on latest safe. + //#define DIE_AND_REENTER // ... also, reenter screen on death + //#define DIE_AND_REINIT // ... or start the level over! +#define PLAYER_FLICKERS 100 // If defined, collisions make player flicker for N frames +#define WALLS_STOP_ENEMIES // If defined, enemies react to the scenary // Extra special tiles // ------------------- -#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically +//#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically +//#define CUSTOM_CENTER_DETECTIONS // Define this if you need custom tile behs // Quicksands, beh == 2. // For player movement values, see section 4 @@ -143,14 +150,14 @@ //#define ENABLE_QUICKSANDS // Breakable, beh & 16 -//#define ENABLE_BREAKABLE // Breakable walls -#define BREAKABLE_LIFE 2 // Amount of hits to break wall -#define BREAKABLE_ANIM // Show explosion when breaking -#define BREAKABLE_MAX 4 // Max # of concurrent explosions -#define BREAKABLE_MAX_FRAMES 8 // Frames to show explosion -#define BREAKABLE_ERASE 0 // Tile to erase broken tiles -#define BREAKABLE_BREAKING 8 // Tile to display while breaking -//#define BREAKABLE_WALKABLE // If defined (side view), tiles break when stepped on +//#define ENABLE_BREAKABLE // Breakable walls +#define BREAKABLE_LIFE 2 // Amount of hits to break wall +#define BREAKABLE_ANIM // Show explosion when breaking +#define BREAKABLE_MAX 4 // Max # of concurrent explosions +#define BREAKABLE_MAX_FRAMES 8 // Frames to show explosion +#define BREAKABLE_ERASE 0 // Tile to erase broken tiles +#define BREAKABLE_BREAKING 8 // Tile to display while breaking +//#define BREAKABLE_WALKABLE // If defined (side view), tiles break when stepped on // Conveyors, beh & 32 [+1] (must be & 8!) // For player movement values, see section 4 @@ -168,6 +175,17 @@ //#define ENABLE_LADDERS +// Special, "collectable" map tiles. +// beh == 34 + +//#define ENABLE_TILE_GET +//#define PERSISTENT_TILE_GET + +// Trampolines. Needs PLAYER_VY_TRAMPOLINE +// beh == 66 + +//#define ENABLE_TRAMPOLINES + // Extra special stuff // ------------------- @@ -253,10 +271,15 @@ //#define ENEMS_IN_CHRROM // Enems are stored somewhere in CHR-ROM #define ENEMS_LIFE_GAUGE 1 // Amount of shots/punches/kicks needed to kill enemies. +//#define NEEDS_LIFE_GAUGE_LOGIC // This is activated automaticly when needed, but you can + // do it yourself if you need it to do customs... + #define ENEMS_FLICKER // Ifdef: flicker, if not: explosion #define ENEMS_FLICKER_ONLY_ON_DYING // Flicker, but only when life == 0 //#define ENEMS_CAN_RESPAWN // Read docs for this. +//#define ENEMS_TREMBLE // Make enemies tremble when hit + #define PERSISTENT_ENEMIES //#define PERSISTENT_DEATHS @@ -274,23 +297,27 @@ // Beware: only activate this if enemies are killable by any means: //#define ENEMIES_SUFFER_ON_PLAYER_COLLISION -// Fanties / Homing fanties +// Fanties / Homing fanties / Timed fanties //#define ENABLE_FANTY //#define ENABLE_HOMING_FANTY +//#define ENABLE_TIMED_FANTY #define FANTY_BASE_SPRID 32 #define FANTY_WITH_FACING #define FANTY_COLLIDES -#define FANTY_KILLED_BY_TILE +//#define FANTY_KILLED_BY_TILE //#define FANTY_LIFE_GAUGE 5 // Define if you need these to be tougher #define FANTY_A 4 #define FANTY_MAXV 48 +//#define FANTY_FAST_ANIM // If defined, cells A/B are changed every frame (for transparency effects) #define FANTY_DISTANCE 80 #define FANTY_V_RETREAT 16 +#define FANTY_BASE_TIMER 120 // Timed fanties use this + // Pursuers (for top-down) //#define ENABLE_PURSUERS // If defined, type 7 enemies are active @@ -367,6 +394,24 @@ #define COMPILED_ENEMS_SHOOT #define COMPILED_ENEMS_BASE_SPRID 48 +// Boioiongs + +//#define ENABLE_BOIOIONG +#define BOIOIONG_G 16 +#define BOIOIONG_VY_MAX 256 +#define BOIOIONG_BASE_SPRID 54 +//#define BOIOIONG_ACTIVE_BY_DEFAULT // Define and they are active by default +//#define BOIOIONG_INITIAL_TIMER 200 // If active by default, time to be active in frames +//#define BOIOIONG_AUTO_RESPAWN + +// Catacrocks + +//#define ENABLE_CATACROCKS +#define CATACROCK_G 16 +#define CATACROCK_MAX_V 256 +#define CATACROCK_CROCK_FRAMES 50 +#define CATACROCK_BASE_SPRID 50 + // Cocos will get enabled automaticly on choosing monococos or shooties. //#define ENABLE_COCOS @@ -457,21 +502,28 @@ // --------- //#define PLAYER_TOP_DOWN // Enable top view. -//#define TOP_OVER_SIDE // UP/DOWN has priority over LEFT/RIGHT +//#define TOP_OVER_SIDE // UP/DOWN has priority over LEFT/RIGHT // Side view: // ---------- +// Choose ONE or SEVERAL of those. +// If you choose several, use the vertical_engine_type variable to select + //#define PLAYER_HAS_JUMP // If defined, player is able to jump. -//#define PLAYER_JUMP_TYPE_MK2 // Use MK2 method for jump / gravity / release #define PLAYER_AUTO_JUMP // Automatic jump when hitting the floor //#define PLAYER_SWIMS // If defined, player swims a la Ninjajar! //#define PLAYER_HAS_JETPAC // If defined, player can thrust a vertical jetpac + +// Extra configuration for side view: + +//#define PLAYER_JUMP_TYPE_MK2 // Use MK2 method for jump / gravity / release #define PLAYER_STEPS_ON_ENEMS // If defined, stepping on enemies kills them //#define PLAYER_STEPS_STRICT // Only registers advantage hit when pvy > PLAYER_VY_FALLING_MIN #define PLAYER_SAFE_LANDING // Step over vertical inverts direction #define PLAYER_STEPS_MIN_KILLABLE 0xff // Only kill enemies with id >= PLAYER_BULLETS_MIN_KILLABLE // 0xff = Nobody +//#define PLAYER_SPINS // Spins on DOWN and JUMP and kills baddies // ============================================================================ // III. Screen configuration @@ -522,6 +574,7 @@ #define PLAYER_G 16 // Gravity #define PLAYER_VY_JUMP_INITIAL 96 +#define PLAYER_VY_JUMP_INITIAL_TRAMPOLINE 128 #define PLAYER_VY_JUMP_MAX 256 // Max. velocity when jumping #define PLAYER_AY_JUMP 16 // Jumpin acceleration @@ -544,6 +597,8 @@ #define PLAYER_VY_MK2_JUMP_INITIAL 208 #define PLAYER_VY_MK2_JUMP_RELEASE 96 #define PLAYER_VY_MK2_JUMP_A_STEPS 16 +#define PLAYER_VY_MK2_JUMP_INITIAL_TRAMPOLINE 296 +#define PLAYER_VY_MK2_TRAMPOLINE_A_STEPS 32 // For trampolines // IV.2. Horizontal (side view) or general (top view) movement. @@ -586,6 +641,9 @@ #define CELL_WALK_INIT 1 #define CELL_WALK_CYCLE 1 #define CELL_AIRBORNE 5 + + #define CELL_SPIN_CYCLE 5 + #define CELL_ASCENDING 5 #define CELL_DESCENDING 6 @@ -596,6 +654,8 @@ #define CELL_PUNCHING 8 #define CELL_KICKING 9 + #define CELL_HIT 9 + #define CELL_CLIMB_CYCLE 20 #define CELL_CLIMB_HALF 29 #endif @@ -610,6 +670,7 @@ #define SFX_TILE 1 #define SFX_OBJECT 2 #define SFX_USE 3 +#define SFX_TRAMPOLINE 3 #define SFX_PHIT 4 #define SFX_DUMMY1 5 #define SFX_ENHIT 6 @@ -624,3 +685,5 @@ #define SFX_STEPON 15 #define SFX_FLOAT 16 #define SFX_BREAKB 17 +#define SFX_RING 18 +#define SFX_FANFARE 19 diff --git "a/examples/11_boot\303\250e/dev/crt0.s" "b/examples/11_boot\303\250e/dev/crt0.s" index 3151b83..dce496d 100644 --- "a/examples/11_boot\303\250e/dev/crt0.s" +++ "b/examples/11_boot\303\250e/dev/crt0.s" @@ -20,7 +20,7 @@ FT_SFX_STREAMS =4 ;number of sound effects played at once, can be 4 or less (f .define FT_DPCM_ENABLE 0 ;zero to exclude all the DMC code .define FT_SFX_ENABLE 1 ;zero to exclude all the sound effects code -.define SPEED_FIX 1 ;zero if you want to handle PAL/NTSC speed difference by yourself +.define SPEED_FIX 0 ;zero if you want to handle PAL/NTSC speed difference by yourself .export _exit,__STARTUP__:absolute=1 .import push0,popa,popax,_main,zerobss,copydata @@ -71,6 +71,8 @@ RAND_SEED =$1a ;word PALUPDATE =$1c TEMP =$1d +SCROLL_X1 =$1e ;Added by mojon twins +PPU_CTRL_VAR1=$1f ;Added by mojon twins PAD_BUF =TEMP+1 diff --git "a/examples/11_boot\303\250e/dev/definitions.h" "b/examples/11_boot\303\250e/dev/definitions.h" index fbf256b..9d02020 100644 --- "a/examples/11_boot\303\250e/dev/definitions.h" +++ "b/examples/11_boot\303\250e/dev/definitions.h" @@ -50,3 +50,10 @@ #define EN_STATE_DEAD 1 #define EN_STATE_SPAWNING 2 + +// Vertical engine type for side_view + +#define ENGINE_TYPE_JUMP 0 +#define ENGINE_TYPE_JET_PAC 1 +#define ENGINE_TYPE_SWIM 2 +#define ENGINE_TYPE_AUTO_JUMP 3 diff --git "a/examples/11_boot\303\250e/dev/engine/cocos.h" "b/examples/11_boot\303\250e/dev/engine/cocos.h" index 5547eed..f6fbfd8 100644 --- "a/examples/11_boot\303\250e/dev/engine/cocos.h" +++ "b/examples/11_boot\303\250e/dev/engine/cocos.h" @@ -17,7 +17,12 @@ void cocos_init (void) { void cocos_shoot_aimed (void) { rdct = distance (); - if (rdct > COCO_FAIR_D && coco_slots_i) { + #ifdef COCO_FAIR_D + if (rdct > COCO_FAIR_D && coco_slots_i) + #else + if (coco_slots_i) + #endif + { -- coco_slots_i; coco_it = coco_slots [coco_slots_i]; coco_x [coco_it] = rdx << 6; @@ -86,13 +91,15 @@ void cocos_do (void) { #endif // Collide w/player - if (pstate == EST_NORMAL && + if (pflickering == 0 && rdx + 7 >= prx && rdx <= prx + 7 && rdy + 7 + PLAYER_COLLISION_VSTRETCH_FG >= pry && rdy <= pry + 12 ) { - pkill = 1; + en_sg_2 = 1; + #include "my/on_player_coco.h" + pkill = !!en_sg_2; cocos_destroy (); } } diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_boioiong.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_boioiong.h" new file mode 100644 index 0000000..dc438f6 --- /dev/null +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_boioiong.h" @@ -0,0 +1,78 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Boioiongs bounce around the screen until a timer exhausts. + +if (_en_ct) { + _en_ct --; + + // Vertical movement & collision + // ----------------------------- + + _enf_vy += BOIOIONG_G; if (_enf_vy > BOIOIONG_VY_MAX) _enf_vy = BOIOIONG_VY_MAX; + _enf_y += _enf_vy; + + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > (192 << FIXBITS)) _enf_y = (192 << FIXBITS); + + _en_y = _enf_y >> FIXBITS; _en_x = _enf_x >> FIXBITS; + + cx1 = _en_x >> 4; cx2 = (_en_x + 15) >> 4; rda = 0; + + if (_enf_vy > 0) { + cy1 = cy2 = (_en_y + 15) >> 4; + rda = 13; rds = -16; + } else if (_enf_vy < 0) { + cy1 = cy2 = _en_y >> 4; + rda = 9; rds = 16; + } + + if (rda) { + cm_two_points (); + if ((at1 & rda) || (at2 & rda)) { + _en_y = rds + (cy1 << 4); + _enf_vy = -_enf_vy; + } + } + + _enf_y = _en_y << FIXBITS; + + // Horizontal movement & collision + // ------------------------------- + + _enf_x += _enf_vx; + _en_x = _enf_x >> FIXBITS; + + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > (240 << FIXBITS)) _enf_x = (240 << FIXBITS); + + cy1 = _en_y >> 4; cy2 = (_en_y + 15) >> 4; rda = 0; + + if (_enf_vx) { + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 15) >> 4; rds = -16; + } else { + cx1 = cx2 = _en_x >> 4; rds = 16; + } + + cm_two_points (); + if ((at1 & 9) || (at2 & 9)) { + _en_x = rds + (cx1 << 4); + _enf_vx = -_enf_vx; + } + } + + _enf_x = _en_x << FIXBITS; + + // Sprite + + if (_en_ct > 50 || half_life) { + en_spr = _en_s + ((frame_counter >> 2) & 1); + } +} +#ifdef BOIOIONG_AUTO_RESPAWN +else { + _en_x = _en_x1; _en_y = _en_y1; + enems_boioiong_init (); +} +#endif diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_catacrock.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_catacrock.h" new file mode 100644 index 0000000..701d9fd --- /dev/null +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_catacrock.h" @@ -0,0 +1,37 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Appear, fall, and catacrock. + +switch (_en_state) { + case 0: + // Idling. + if (_en_ct) _en_ct --; else { + _en_state = 1; + _enf_y = _en_y << FIXBITS; _enf_vy = 0; + } + break; + + case 1: + // Falling + _enf_vy += CATACROCK_G; if (_enf_vy > CATACROCK_MAX_V) _enf_vy = CATACROCK_MAX_V; + _enf_y += _enf_vy; _en_y = _enf_y >> FIXBITS; + + if (_en_y > _en_y2) { + _en_state = 2; + _en_ct = CATACROCK_CROCK_FRAMES; + _en_y = _en_y2; + } + break; + + case 2: + // Catacrock + if (_en_ct) _en_ct --; else { + _en_state = 0; + _en_ct = CATACROCK_WAIT; + _en_y = _en_y1; + } + +} + +en_spr = _en_state + CATACROCK_BASE_SPRID; diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_chac_chac.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_chac_chac.h" index 769d8f8..a8f8cb2 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_chac_chac.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_chac_chac.h" @@ -2,14 +2,15 @@ // Copyleft Mojon Twins 2013, 2015, 2017, 2018 // CHAC CHAC! +// DEPRECATED -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Wait for idle. if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1); _en_mx = CHAC_CHAC_IDLE_2; - en_alive [gpit] = 1; + _en_state = 1; } break; case 1: @@ -17,7 +18,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 3); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 2; + _en_state = 2; } break; case 2: @@ -25,7 +26,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 5, CHAC_CHAC_BASE_TILE + 4, CHAC_CHAC_BASE_TILE + 5); _en_mx = CHAC_CHAC_IDLE_4; - en_alive [gpit] = 3; + _en_state = 3; sfx_play (SFX_STEPON, 1); shaker_ct = 8; } @@ -35,7 +36,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 3); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 4; + _en_state = 4; } break; case 4: @@ -43,7 +44,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1); _en_mx = CHAC_CHAC_IDLE_3; - en_alive [gpit] = 5; + _en_state = 5; } break; case 5: @@ -51,7 +52,7 @@ switch (en_alive [gpit]) { if (_en_mx) -- _en_mx; else { enems_draw_chac_chac (CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6); _en_mx = _en_my; - en_alive [gpit] = 0; + _en_state = 0; } break; } diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_compiled.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_compiled.h" index 050e80c..39cab39 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_compiled.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_compiled.h" @@ -6,15 +6,9 @@ // needs endx [8], endy [8] from precalcs.h if (_en_ct) { - // Do - - switch (en_alive [gpit]) { + switch (_en_state) { case 0: // Idling - - // Idle animation, cells 2, 3. - en_spr = _en_s + _en_facing + 2 + - ((frame_counter >> 3) & 1); break; case 1: // Moving @@ -23,8 +17,6 @@ if (_en_ct) { rdx = _en_x; _en_x += _en_mx; rdy = _en_y; _en_y += _en_my; - // Moving animation, cells 0, 1. - en_spr = _en_s + _en_facing + en_fr; break; } @@ -35,42 +27,64 @@ if (_en_ct) { // the whole array and that a proper RETURN is issued! rda = *en_behptr [gpit] ++; - en_alive [gpit] = 0; - + _en_state = 0; + rdc = (rda & 0x38) >> 3; rdt = rda & 0x07; switch (rda & 0xc0) { // Command case 0x00: - // IDLE - rdb = 1; while (rdt --) rdb += 25; - _en_ct = rdb; + // IDLE / EXTERN + if (rdt == 0) { + // EXTERN + do_extern_action (*en_behptr [gpit] ++); + } else { + // IDLE + rdb = 0; while (rdt --) rdb += 25; + _en_ct = rdb; + en_rawv [gpit] = _en_s + 2 + _en_facing; + } break; case 0x40: // ADVANCE - _en_mx = endx [rdc]; _en_my = endy [rdc]; + _en_mx = endx [rdc] << _en_x1; _en_my = endy [rdc] << _en_x1; - rda = (_en_mx < 0); enems_facing (); - if (_en_mx < 0) _en_facing = 4; else if (_en_mx > 0) _en_facing = 0; // If _en_mx == 0, no change! + en_rawv [gpit] = _en_s + _en_facing; - _en_ct = rdt << 4; en_alive [gpit] = 1; + _en_ct = (rdt << 4) >> _en_x1; _en_state = 1; break; case 0x80: - // FIRE - rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); + // FIRE & SPEED + rdb = rda & 0x3f; + if (rdb > 0x3b) { + // SPEED + _en_x1 =0x3f - rda; // 0 for 1, 1 for 2, 2 for 4, 3 for 8 + } else { + // FIRE + rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); + } + break; case 0xC0: // RETURN en_behptr [gpit] -= ((rda & 0x3f) + 1); + break; } - - en_spr = _en_s + _en_facing; } +en_spr = en_rawv [gpit]; +switch (_en_state) { + case 0: + en_spr += ((frame_counter >> 3) & 1); + break; + case 1: + en_spr += en_fr; + break; +} diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_fanty.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_fanty.h" index b835c1e..2e15f02 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_fanty.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_fanty.h" @@ -1,101 +1,101 @@ // NES MK1 v1.0 // Copyleft Mojon Twins 2013, 2015, 2017, 2018 -// Fanties - -#ifdef FANTY_KILLED_BY_TILE - #define FANTY_OBSTACLE(a) ((a)>1) -#else - #define FANTY_OBSTACLE(a) (a) -#endif - -// Modify v - -if (px < _enf_x) { - _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; -} else { - _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; -} - -if (py < _enf_y) { - _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; -} else { - _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; -} - -// Horizontal - -_enf_x += _enf_vx; -if (_enf_x < 0) _enf_x = 0; -if (_enf_x > 15360) _enf_x = 15360; -_en_x = _enf_x >> 6; - -#ifdef FANTY_COLLIDES - - if (_enf_vx) { - cy1 = (_en_y + 4) >> 4; - cy2 = (_en_y + 11) >> 4; + // Fanties + + // Modify v - if (_enf_vx > 0) { - cx1 = cx2 = (_en_x + 11) >> 4; - rda = ((cx2 - 1) << 4) + 4; - } else { - cx1 = cx2 = (_en_x + 4) >> 4; - rda = ((cx1 + 1) << 4) - 4; - } - cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vx = -_enf_vx; - _en_x = rda; - _enf_x = rda << 6; - } + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; } -#endif + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } -// Vertical - -_enf_y += _enf_vy; -if (_enf_y < 0) _enf_y = 0; -if (_enf_y > 11264) _enf_y = 11264; -_en_y = _enf_y >> 6; + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } + } -#ifdef FANTY_COLLIDES + #endif - if (_enf_vy) { - cx1 = (_en_x + 4) >> 4; - cx2 = (_en_x + 11) >> 4; + // Vertical - if (_enf_vy > 0) { - cy1 = cy2 = (_en_y + 11) >> 4; - rda = ((cy2 - 1) << 4) + 4; - } else { - cy1 = cy2 = (_en_y + 4) >> 4; - rda = ((cy1 + 1) << 4) - 4; + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } } + #endif + + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vy = -_enf_vy; - _en_y = rda; - _enf_y = rda << 6; + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); } - } + #endif +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; #endif -#ifdef FANTY_KILLED_BY_TILE - cx1 = (_en_x + 8) >> 4; - cy1 = (_en_y + 8) >> 4; - cm_two_points (); - if (at1 & 1) { - en_cttouched [gpit] = 8; - enems_kill (); - } -#endif - -en_fr = (_en_x >> 3) & 1; - #ifdef FANTY_WITH_FACING //_en_facing = ((_en_x < prx) ? 0 : 4); rda = (prx < _en_x); enems_facing (); @@ -103,3 +103,4 @@ en_fr = (_en_x >> 3) & 1; #else en_spr = _en_s + en_fr; #endif + diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_homing_fanty.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_homing_fanty.h" index cba1185..b45aab0 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_homing_fanty.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_homing_fanty.h" @@ -3,125 +3,125 @@ // Fanties that have a home -#ifdef FANTY_KILLED_BY_TILE - #define FANTY_OBSTACLE(a) ((a)>1) -#else - #define FANTY_OBSTACLE(a) (a) -#endif - -// Precalc distance -rdx = _en_x; rdy = _en_y; rdt = distance (); - -// Modify v - always upon state - -switch (en_alive [gpit]) { - case 0: - // Retreating - _enf_vx = ADD_SIGN2 (_en_x1, _en_x, FANTY_V_RETREAT); - _enf_vy = ADD_SIGN2 (_en_y1, _en_y, FANTY_V_RETREAT); - if (rdt < FANTY_DISTANCE) en_alive [gpit] = 1; - break; - case 1: - // Pursuing - if (px < _enf_x) { - _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; - } else { - _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; - } + // Precalc distance + rdx = _en_x; rdy = _en_y; rdt = distance (); + + // Modify v + + switch (_en_state) { + case 0: + // Retreating + _enf_vx = ADD_SIGN2 (_en_x1, _en_x, FANTY_V_RETREAT); + _enf_vy = ADD_SIGN2 (_en_y1, _en_y, FANTY_V_RETREAT); + if (rdt < FANTY_DISTANCE) _en_state = 1; + break; + case 1: + // Pursuing + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; + } + + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } + + if (rdt > FANTY_DISTANCE) { + // Adjust to pixel + _enf_x = _en_x << FIXBITS; + _enf_y = _en_y << FIXBITS; + _en_state = 0; + } + break; + } - if (py < _enf_y) { - _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; - } else { - _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } } - if (rdt > FANTY_DISTANCE) { - // Adjust to pixel - _enf_x = _en_x << FIXBITS; - _enf_y = _en_y << FIXBITS; - en_alive [gpit] = 0; + #endif + + // Vertical + + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } } - break; -} - -// Horizontal -_enf_x += _enf_vx; -if (_enf_x < 0) _enf_x = 0; -if (_enf_x > 15360) _enf_x = 15360; -_en_x = _enf_x >> 6; + #endif -#ifdef FANTY_COLLIDES - - if (_enf_vx) { - cy1 = (_en_y + 4) >> 4; - cy2 = (_en_y + 11) >> 4; - - if (_enf_vx > 0) { - cx1 = cx2 = (_en_x + 11) >> 4; - rda = ((cx2 - 1) << 4) + 4; - } else { - cx1 = cx2 = (_en_x + 4) >> 4; - rda = ((cx1 + 1) << 4) - 4; - } + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vx = -_enf_vx; - _en_x = rda; - _enf_x = rda << FIXBITS; + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); } - } - -#endif - -// Vertical + #endif -_enf_y += _enf_vy; -if (_enf_y < 0) _enf_y = 0; -if (_enf_y > 11264) _enf_y = 11264; -_en_y = _enf_y >> 6; - -#ifdef FANTY_COLLIDES - - if (_enf_vy) { - cx1 = (_en_x + 4) >> 4; - cx2 = (_en_x + 11) >> 4; - - if (_enf_vy > 0) { - cy1 = cy2 = (_en_y + 11) >> 4; - rda = ((cy2 - 1) << 4) + 4; - } else { - cy1 = cy2 = (_en_y + 4) >> 4; - rda = ((cy1 + 1) << 4) - 4; - } - - cm_two_points (); - if (FANTY_OBSTACLE (at1) || FANTY_OBSTACLE (at2)) { - _enf_vy = -_enf_vy; - _en_y = rda; - _enf_y = rda << FIXBITS; - } - } - -#endif - -#ifdef FANTY_KILLED_BY_TILE - cx1 = (_en_x + 8) >> 4; - cy1 = (_en_y + 8) >> 4; - cm_two_points (); - if (at1 & 1) { - en_cttouched [gpit] = 8; - enems_kill (); - } +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; #endif -en_fr = (_en_x >> 3) & 1; - #ifdef FANTY_WITH_FACING //_en_facing = ((_en_x < prx) ? 0 : 4); rda = (prx < _en_x); enems_facing (); - en_spr = FANTY_BASE_SPRID + en_fr + _en_facing; + en_spr = _en_s + en_fr + _en_facing; #else - en_spr = FANTY_BASE_SPRID + en_fr; + en_spr = _en_s + en_fr; #endif diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_linear.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_linear.h" index b52a7f3..917a549 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_linear.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_linear.h" @@ -46,13 +46,29 @@ if (!en_status [gpit] || half_life) { // Change direction ? - #ifdef WALLS_STOP_ENEMIES - if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; - if (_en_y == _en_y1 || _en_y == _en_y2 || en_colly) _en_my = -_en_my; - #else - if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; - if (_en_y == _en_y1 || _en_y == _en_y2) _en_my = -_en_my; - #endif + #ifdef PLAYER_SAFE_LANDING + #ifdef WALLS_STOP_ENEMIES + if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; + #else + if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; + #endif + #ifdef WALLS_STOP_ENEMIES + if (en_colly) _en_my = -_en_my; + else + #endif + { + if (_en_y <= _en_y1) { _en_y = _en_y1; _en_my = ABS (_en_my); } + else if (_en_y >= _en_y2) { _en_y = _en_y2; _en_my = -ABS (_en_my); } + } + #else + #ifdef WALLS_STOP_ENEMIES + if (_en_x == _en_x1 || _en_x == _en_x2 || en_collx) _en_mx = -_en_mx; + if (_en_y == _en_y1 || _en_y == _en_y2 || en_colly) _en_my = -_en_my; + #else + if (_en_x == _en_x1 || _en_x == _en_x2) _en_mx = -_en_mx; + if (_en_y == _en_y1 || _en_y == _en_y2) _en_my = -_en_my; + #endif + #endif } //_en_facing = (_en_mx > 0 || _en_my > 0) ? 0 : 4; diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_monococo.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_monococo.h" index d2bd1f9..d457ba3 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_monococo.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_monococo.h" @@ -4,12 +4,12 @@ // mx is state. my is counter. // Counter & state change --- MONOCOCO_COUNTER; if (!MONOCOCO_COUNTER) { - MONOCOCO_STATE = (MONOCOCO_STATE + 1) & 3; MONOCOCO_COUNTER = monococo_state_times [MONOCOCO_STATE] - (rand8 () & 0x15); +-- _en_ct; if (!_en_ct) { + _en_state = (_en_state + 1) & 3; _en_ct = monococo_state_times [_en_state] - (rand8 () & 0x15); } // Shoot -if (MONOCOCO_STATE == 2 && MONOCOCO_COUNTER == MONOCOCO_FIRE_COCO_AT) { +if (_en_state == 2 && _en_ct == MONOCOCO_FIRE_COCO_AT) { rdx = _en_x + 4; rdy = _en_y + 4; cocos_shoot_aimed (); } @@ -18,14 +18,14 @@ if (MONOCOCO_STATE == 2 && MONOCOCO_COUNTER == MONOCOCO_FIRE_COCO_AT) { rda = (prx < rdx); enems_facing (); #ifdef MONOCOCO_TYPE_A if ( - ((MONOCOCO_STATE == 1 || MONOCOCO_STATE == 3) && half_life) || - MONOCOCO_STATE == 2 + ((_en_state == 1 || _en_state == 3) && half_life) || + _en_state == 2 ) { en_spr = MONOCOCO_BASE_SPRID + _en_facing + ((frame_counter >> 5) & 1); } #else en_spr = MONOCOCO_BASE_SPRID + _en_facing; - switch (MONOCOCO_STATE) { + switch (_en_state) { case 0: en_spr += 9; break; diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_pezon.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_pezon.h" index b739b68..9288bb2 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_pezon.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_pezon.h" @@ -10,12 +10,12 @@ oam_index = oam_meta_spr ( spr_enems [ENEMS_OCCLUDING_CELL] ); -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Idling if (_en_mx) { -- _en_mx; } else { - en_alive [gpit] = 1; + _en_state = 1; _enf_y = _en_y1 << 6; _enf_vy = -PEZON_THRUST; sfx_play (SFX_FLOAT, 1); @@ -29,7 +29,7 @@ switch (en_alive [gpit]) { _en_y = _enf_y >> 6; if (_en_y >= _en_y1) { - en_alive [gpit] = 0; + _en_state = 0; _en_mx = _en_my; } else { diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_punchy.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_punchy.h" index 2ac8139..3cdc71e 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_punchy.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_punchy.h" @@ -23,7 +23,13 @@ if (_en_t & 0x40) { sfx_play (SFX_HITTER, 1); // Collide w/player - if (pstate == EST_NORMAL && + if ( + #ifdef PLAYER_FLICKERS + !pflickering && + #endif + #ifdef PLAYER_BOUNCES + !pbouncing && + #endif rdx + 7 >= prx && rdx <= prx + 7 && rdy + 7 + PLAYER_COLLISION_VSTRETCH_FG >= pry && rdy <= pry + 13 diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_pursuers.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_pursuers.h" index 7ada650..fe6da73 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_pursuers.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_pursuers.h" @@ -3,14 +3,14 @@ // Pursuing enemies -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // IDLE if (_en_ct) { -- _en_ct; _en_y = 240; } else { - en_alive [gpit] = 1; + _en_state = 1; _en_x = _en_x1; _en_y = _en_y1; en_rawv [gpit] = 1 << (rand8 () % 5); @@ -22,12 +22,12 @@ switch (en_alive [gpit]) { case 1: // Appearing en_spr = ENEMS_EXPLODING_CELL; - if (_en_ct) -- _en_ct; else en_alive [gpit] = 2; + if (_en_ct) -- _en_ct; else _en_state = 2; break; case 2: // Pursuing - if (pstate == EST_NORMAL && (!en_status [gpit] || half_life)) { + if (pflickering == 0 && pbouncing == 0 && (!en_status [gpit] || half_life)) { _en_mx = add_sign (((prx >> 2) << 2) - _en_x, en_rawv [gpit]); _en_my = add_sign (((pry >> 2) << 2) - _en_y, en_rawv [gpit]); diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_saw.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_saw.h" index 241c928..dc1df35 100644 --- "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_saw.h" +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_saw.h" @@ -8,18 +8,18 @@ rda = (_en_x1 == _en_x2); -switch (en_alive [gpit]) { +switch (_en_state) { case 0: // Idling. Goes from 2->1 (backwards). if (rda) { _en_y -= _en_mx; if (_en_y == _en_y1) { - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; } } else { _en_x -= _en_mx; if (_en_x == _en_x1) { - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; } } @@ -34,7 +34,7 @@ switch (en_alive [gpit]) { _en_y += _en_my; } } else { - en_alive [gpit] = 2; + _en_state = 2; } } break; @@ -42,13 +42,13 @@ switch (en_alive [gpit]) { if (rda) { _en_y += _en_mx; if (_en_y == _en_y2) { - en_alive [gpit] = 3; + _en_state = 3; _en_ct = SAW_EMERGING_STEPS; } } else { _en_x += _en_mx; if (_en_x == _en_x2) { - en_alive [gpit] = 3; + _en_state = 3; _en_ct = SAW_EMERGING_STEPS; } } @@ -63,7 +63,7 @@ switch (en_alive [gpit]) { _en_y -= _en_my; } } else { - en_alive [gpit] = 0; + _en_state = 0; } } break; diff --git "a/examples/11_boot\303\250e/dev/engine/enemmods/enem_timed_fanty.h" "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_timed_fanty.h" new file mode 100644 index 0000000..4528fcf --- /dev/null +++ "b/examples/11_boot\303\250e/dev/engine/enemmods/enem_timed_fanty.h" @@ -0,0 +1,109 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Timed fanties + +if (_en_ct) _en_ct --; else { + + // Modify v + + if (px < _enf_x) { + _enf_vx -= FANTY_A; if (_enf_vx < -FANTY_MAXV) _enf_vx = -FANTY_MAXV; + } else { + _enf_vx += FANTY_A; if (_enf_vx > FANTY_MAXV) _enf_vx = FANTY_MAXV; + } + + if (py < _enf_y) { + _enf_vy -= FANTY_A; if (_enf_vy < -FANTY_MAXV) _enf_vy = -FANTY_MAXV; + } else { + _enf_vy += FANTY_A; if (_enf_vy > FANTY_MAXV) _enf_vy = FANTY_MAXV; + } + + // Horizontal + + _enf_x += _enf_vx; + if (_enf_x < 0) _enf_x = 0; + if (_enf_x > 15360) _enf_x = 15360; + _en_x = _enf_x >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vx) { + cy1 = (_en_y + 4) >> 4; + cy2 = (_en_y + 11) >> 4; + + if (_enf_vx > 0) { + cx1 = cx2 = (_en_x + 11) >> 4; + rda = ((cx2 - 1) << 4) + 4; + } else { + cx1 = cx2 = (_en_x + 4) >> 4; + rda = ((cx1 + 1) << 4) - 4; + } + cm_two_points (); + if ((at1 & 8) || (at2 & 8)) { + _enf_vx = -_enf_vx; + _en_x = rda; + _enf_x = rda << FIXBITS; + } + } + + #endif + + // Vertical + + _enf_y += _enf_vy; + if (_enf_y < 0) _enf_y = 0; + if (_enf_y > 11264) _enf_y = 11264; + _en_y = _enf_y >> 6; + + #ifdef FANTY_COLLIDES + + if (_enf_vy) { + cx1 = (_en_x + 4) >> 4; + cx2 = (_en_x + 11) >> 4; + + if (_enf_vy > 0) { + rdb = 12; + cy1 = cy2 = (_en_y + 11) >> 4; + rda = ((cy2 - 1) << 4) + 4; + } else { + rdb = 8; + cy1 = cy2 = (_en_y + 4) >> 4; + rda = ((cy1 + 1) << 4) - 4; + } + + cm_two_points (); + if ((at1 & rdb) || (at2 & rdb)) { + _enf_vy = -_enf_vy; + _en_y = rda; + _enf_y = rda << FIXBITS; + } + } + + #endif + + #ifdef FANTY_KILLED_BY_TILE + cx1 = (_en_x + 8) >> 4; + cy1 = (_en_y + 8) >> 4; + cm_two_points (); + if (at1 & 1) { + en_cttouched [gpit] = 8; + enems_kill (); + } + #endif +} + +#ifdef FANTY_FAST_ANIM + en_fr = half_life; +#else + en_fr = (_en_x >> 3) & 1; +#endif + +#ifdef FANTY_WITH_FACING + //_en_facing = ((_en_x < prx) ? 0 : 4); + rda = (prx < _en_x); enems_facing (); + en_spr = _en_s + en_fr + _en_facing; +#else + en_spr = _en_s + en_fr; +#endif + diff --git "a/examples/11_boot\303\250e/dev/engine/enengine.h" "b/examples/11_boot\303\250e/dev/engine/enengine.h" index e8db546..6b60bae 100644 --- "a/examples/11_boot\303\250e/dev/engine/enengine.h" +++ "b/examples/11_boot\303\250e/dev/engine/enengine.h" @@ -138,12 +138,36 @@ void enems_update_unsigned_char_arrays (void) { __asm__ ("lda %v", _en_facing); __asm__ ("sta %v, y", en_facing); + + __asm__ ("lda %v", _en_state); + __asm__ ("sta %v, y", en_state); + + #ifdef ENEMS_NEED_FP + enf_x [gpit] = _enf_x; enf_vx [gpit] = _enf_vx; + enf_y [gpit] = _enf_y; enf_vy [gpit] = _enf_vy; + #endif } -void enems_facing () { +void enems_facing (void) { _en_facing = rda << 2; } +void enems_init_fp (void) { + _enf_x = _en_x << 6; + _enf_y = _en_y << 6; +} + +void enems_boioiong_init (void) { + enems_init_fp (); + _enf_vy = 0; + _enf_vx = ADD_SIGN2 (_en_x2, _en_x1, rdm << FIXBITS); + #ifdef BOIOIONG_ACTIVE_BY_DEFAULT + _en_ct = BOIOIONG_INITIAL_TIMER; + #else + _en_ct = 0; + #endif +} + void enems_load (void) { #ifdef ENEMS_IN_CHRROM @@ -180,7 +204,7 @@ void enems_load (void) { _en_t = VRAM_READ; // General... - en_alive [gpit] = 0; + _en_state = 0; // YX1 rda = VRAM_READ; @@ -200,7 +224,7 @@ void enems_load (void) { SET_FROM_PTR (_en_t, gp_gen); gp_gen ++; // General... - en_alive [gpit] = 0; + _en_state = 0; // YX1 // rda = *gp_gen ++; @@ -298,17 +322,20 @@ void enems_load (void) { break; #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) + #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_TIMED_FANTY) case 6: // Fantys - enf_x [gpit] = _en_x << 6; - enf_y [gpit] = _en_y << 6; - enf_vx [gpit] = enf_vy [gpit] = 0; + enems_init_fp (); + _enf_vx = _enf_vy = 0; + #ifdef ENABLE_TIMED_FANTY + _en_ct = FANTY_BASE_TIMER; + #endif + _en_s = FANTY_BASE_SPRID; break; #endif - #ifdef ENABLE_PURSUERS + #ifdef ENABLE_PURSUERS case 7: // Pursuers _en_ct = DEATH_COUNT_EXPRESSION; @@ -344,7 +371,7 @@ void enems_load (void) { _en_my = rda; // EMERGING SENSE _en_mx = rdb; // MOVING SENSE - en_alive [gpit] = 1; + _en_state = 1; _en_ct = SAW_EMERGING_STEPS; break; @@ -377,10 +404,33 @@ void enems_load (void) { #ifdef ENABLE_MONOCOCOS case 11: // Monococos - _en_mx = 0; _en_my = MONOCOCO_BASE_TIME_HIDDEN - (rand8 () & 0x15); + _en_state = 0; _en_ct = MONOCOCO_BASE_TIME_HIDDEN - (rand8 () & 0x15); _en_s = MONOCOCO_BASE_SPRID; break; - #endif + #endif + + #ifdef ENABLE_CATACROCKS + case 12: + // Catacrocks + enems_init_fp (); + _en_state = 0; + CATACROCK_WAIT = _en_ct = rdm << 5; + break; + #endif + + #ifdef ENABLE_BOIOIONG + case 13: + // Boioiongs + #ifdef PERSISTENT_ENEMIES + // Initialize position from ROM + _en_x = _en_x1; + _en_y = _en_y1; + #endif + enems_boioiong_init (); + _en_mx = rdm; // Store + _en_s = BOIOIONG_BASE_SPRID; + break; + #endif #ifdef ENABLE_COMPILED_ENEMS case 20: @@ -390,8 +440,9 @@ void enems_load (void) { _en_y = _en_y1; #endif _en_ct = 0; - _en_s = COMPILED_ENEMS_BASE_SPRID; + en_rawv [gpit] = _en_s = COMPILED_ENEMS_BASE_SPRID; en_behptr [gpit] = en_behptrs [rda]; + _en_x1 = 1; // Repurpose for speed break; #endif @@ -457,7 +508,7 @@ void enems_load (void) { { #ifdef ENABLE_PURSUERS if (_en_t == 7) { - en_alive [gpit] = 0; + _en_state = 0; _en_ct = DEATH_COUNT_EXPRESSION; #ifdef NEEDS_LIFE_GAUGE_LOGIC en_life [gpit] = ENEMS_LIFE_GAUGE; @@ -523,21 +574,23 @@ void enems_move (void) { __asm__ ("lda %v, y", en_facing); __asm__ ("sta %v", _en_facing); - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) + __asm__ ("lda %v, y", en_state); + __asm__ ("sta %v", _en_state); + + #ifdef ENEMS_NEED_FP _enf_x = enf_x [gpit]; _enf_vx = enf_vx [gpit]; - #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_PEZONS) _enf_y = enf_y [gpit]; _enf_vy = enf_vy [gpit]; #endif if (_en_t == 0) continue; en_is_alive = !(en_flags [gpit] & EN_STATE_DEAD); - + // Clear selected sprite // Means don't render (can/will be overwritten): en_spr = 0xff; // "touched" state control + en_spr_x_mod = 0; #ifdef ENEMS_MAY_DIE if (en_cttouched [gpit]) { @@ -557,16 +610,22 @@ void enems_move (void) { en_spr = en_spr_id [gpit]; } #else + rda = frame_counter & 0xf; oam_index = oam_meta_spr ( - _en_x, _en_y + SPRITE_ADJUST, + _en_x + jitter [rda], + _en_y + jitter [15 - rda] + SPRITE_ADJUST, oam_index, spr_enems [ENEMS_EXPLODING_CELL] ); #ifndef ENEMS_EXPLODING_CELLS_HIDES - en_spr = en_spr_id [gpit]; + if (en_life [gpit]) en_spr = en_spr_id [gpit]; #endif #endif + #ifdef ENEMS_TREMBLE + en_spr_x_mod = half_life; + #endif + #ifdef ENEMS_RECOIL_ON_HIT #include "engine/enemmods/enems_recoiling.h" #endif @@ -635,6 +694,12 @@ void enems_move (void) { break; #endif + #ifdef ENABLE_TIMED_FANTY + case 6: + #include "engine/enemmods/enem_timed_fanty.h" + break; + #endif + #ifdef ENABLE_PURSUERS case 7: #include "engine/enemmods/enem_pursuers.h" @@ -665,6 +730,18 @@ void enems_move (void) { break; #endif + #ifdef ENABLE_CATACROCKS + case 12: + #include "engine/enemmods/enem_catacrock.h" + break; + #endif + + #ifdef ENABLE_BOIOIONG + case 13: + #include "engine/enemmods/enem_boioiong.h" + break; + #endif + #ifdef ENABLE_SIMPLE_WARPERS case 0x3f: en_spr = SIMPLE_WARPERS_BASE_SPRID; @@ -695,6 +772,7 @@ void enems_move (void) { n_pant = _en_mx; on_pant = 0xff; prx = _en_x2; px = prx << FIXBITS; pry = _en_y2; py = pry << FIXBITS; + player_stop (); #if defined (SIMPLE_WARPERS_FIRE_BUTTON) && (defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS)) phitteract = 0; @@ -740,23 +818,30 @@ void enems_move (void) { pvy = 0; } } + + #ifdef PLAYER_SPINS + if (pgotten) pspin = 0; + #endif #endif // Is enemy collidable? If not, exit if ( en_is_alive == 0 // General condition. + #ifdef ENEMS_MAY_DIE + || en_cttouched [gpit] + #endif #ifndef PLAYER_TOP_DOWN || _en_t == 4 #endif #ifdef ENABLE_PURSUERS - || (_en_t == 7 && en_alive [gpit] != 2) + || (_en_t == 7 && _en_state != 2) #endif #ifdef ENABLE_SAW - || (_en_t == 8 && en_alive [gpit] != 2) + || (_en_t == 8 && _en_state != 2) #endif #ifdef ENABLE_PEZONS - || (_en_t == 9 && en_alive [gpit] == 0) + || (_en_t == 9 && _en_state == 0) #endif #ifdef ENABLE_CHAC_CHAC || _en_t == 10 @@ -764,6 +849,12 @@ void enems_move (void) { #ifdef ENABLE_MONOCOCOS || (_en_t == 11 && _en_mx != 2) #endif + #ifdef ENABLE_CATACROCKS + || (_en_t == 12 && _en_state != 1) + #endif + #ifdef ENABLE_BOIOIONG + || (_en_t == 13 && _en_ct == 0) + #endif ) goto skipdo; // Collide with player (includes step over enemy) @@ -827,30 +918,68 @@ void enems_move (void) { _en_t != 5 && #endif touched == 0 && - pstate == EST_NORMAL && collide () ) { - #ifdef PLAYER_BOUNCES - pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); _en_mx = ADD_SIGN (_en_x - prx, ABS (_en_mx)); - pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); if (!_en_mx) _en_my = ADD_SIGN (_en_y - pry, ABS (_en_my)); - #endif - - #if defined ENEMIES_SUFFER_ON_PLAYER_COLLISION - enems_hit (); + // en_sg_1 => kill enemy + #ifdef ENEMIES_SUFFER_ON_PLAYER_COLLISION + en_sg_1 = 1; + #else + en_sg_1 = 0; #endif + + // en_sg_2 => kill player. + en_sg_2 = (pflickering == 0); #ifdef ENABLE_RESONATORS + // If resonators are on and not a saw, don't kill player if ( - res_on == 0 + res_on == 1 #ifdef ENABLE_SAW - || _en_t == 8 + && _en_t != 8 #endif - ) + ) en_sg_2 = 0; #endif - { - pkill = 1; - touched = 1; + + #ifdef PLAYER_SPINS + // If spinning and not a saw or a steady shooter + // kill enemy, don't kill player + if (pspin + #ifndef STEADY_SHOOTER_KILLABLE + && _en_t != 5 + #endif + #ifdef ENABLE_SAW + && _en_t != 8 + #endif + ) { + en_sg_2 = 0; + en_sg_1 = 1; + pvy = -pvy; + sfx_play (SFX_STEPON, 1); + } + #endif + + #include "my/on_player_hit.h" + + #ifdef ENEMS_MAY_DIE + if (en_sg_1) enems_hit (); + #endif + if (en_sg_2) { + pkill = 1; + #if defined (PLAYER_BOUNCES) && !defined (DIE_AND_RESPAWN) + pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); + pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); + + #ifdef ENABLE_COMPILED_ENEMS + if (_en_t != 20) + #endif + { + if (!_en_mx) _en_my = ADD_SIGN (_en_y - pry, ABS (_en_my)); + _en_mx = ADD_SIGN (_en_x - prx, ABS (_en_mx)); + } + + #endif } + touched = 1; } // Is enemy killable? If not, exit @@ -902,7 +1031,7 @@ void enems_move (void) { // Bullets bi = MAX_BULLETS; while (bi --) if (bst [bi]) { #ifdef ENABLE_PURSUERS - if (_en_t != 7 || en_alive [gpit] == 2) + if (_en_t != 7 || _en_state == 2) #endif if (collide_in (bx [bi] + 3, by [bi] + 3, _en_x, _en_y)) { @@ -950,8 +1079,7 @@ void enems_move (void) { _en_y = en_resy [gpit]; _en_my = en_resmy [gpit]; #if (defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY)) - _enf_x = _en_x << FIXBITS; - _enf_y = _en_y << FIXBITS; + enems_init_fp (); #ifdef NEEDS_LIFE_GAUGE_LOGIC en_life [gpit] = _en_t == 6 ? FANTY_LIFE_GAUGE : ENEMS_LIFE_GAUGE; #endif @@ -974,7 +1102,7 @@ void enems_move (void) { if (en_spr != 0xff) { oam_index = oam_meta_spr ( - _en_x, _en_y + SPRITE_ADJUST, + _en_x + en_spr_x_mod, _en_y + SPRITE_ADJUST, oam_index, spr_enems [en_spr] ); @@ -983,13 +1111,5 @@ void enems_move (void) { // Update arrays enems_update_unsigned_char_arrays (); - - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) - enf_x [gpit] = _enf_x; enf_vx [gpit] = _enf_vx; - #endif - #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_PEZONS) - enf_y [gpit] = _enf_y; enf_vy [gpit] = _enf_vy; - #endif - } } diff --git "a/examples/11_boot\303\250e/dev/engine/general.h" "b/examples/11_boot\303\250e/dev/engine/general.h" index 01c962c..1725196 100644 --- "a/examples/11_boot\303\250e/dev/engine/general.h" +++ "b/examples/11_boot\303\250e/dev/engine/general.h" @@ -88,12 +88,31 @@ void pad_read (void) { #ifndef PLAYER_TOP_DOWN void jump_start (void) { - sfx_play (SFX_JUMP, 0); pj = 1; pctj = 0; - #ifdef PLAYER_JUMP_TYPE_MK2 - pvy = -PLAYER_VY_MK2_JUMP_INITIAL; - #else - pvy = -PLAYER_VY_JUMP_INITIAL; + #ifdef ENABLE_TRAMPOLINES + if (ptrampoline) { + sfx_play (SFX_TRAMPOLINE, 0); + #ifdef PLAYER_JUMP_TYPE_MK2 + pvy = -PLAYER_VY_MK2_JUMP_INITIAL_TRAMPOLINE; + #else + pvy = -PLAYER_VY_JUMP_INITIAL_TRAMPOLINE; + #endif + } else #endif + { + sfx_play (SFX_JUMP, 0); + #ifdef PLAYER_JUMP_TYPE_MK2 + pvy = -PLAYER_VY_MK2_JUMP_INITIAL; + #else + pvy = -PLAYER_VY_JUMP_INITIAL; + #endif + } } #endif + +void update_cycle (void) { + oam_hide_rest (oam_index); + ppu_waitnmi (); + clear_update_list (); + oam_index = 4; +} diff --git "a/examples/11_boot\303\250e/dev/engine/mapmods/map_renderer_complex.h" "b/examples/11_boot\303\250e/dev/engine/mapmods/map_renderer_complex.h" index 6f0a96e..6e3bc07 100644 --- "a/examples/11_boot\303\250e/dev/engine/mapmods/map_renderer_complex.h" +++ "b/examples/11_boot\303\250e/dev/engine/mapmods/map_renderer_complex.h" @@ -11,15 +11,13 @@ void add_tile (void) { map_buff [rdm] = rda; ++ rdm; - // Need to do this to keep track of where I am - rdx = (rdx + 1) & 15; if (!rdx) ++ rdy; } void draw_scr (void) { // Draw Map - rdx = rdy = rdm = 0; + rdm = 0; #ifdef MAP_FORMAT_PACKED // Get pointer @@ -34,6 +32,8 @@ void draw_scr (void) { #endif #ifdef MAP_FORMAT_RLE16 + rdx = rdy = 0; + // Get pointer gp_gen = c_map [n_pant]; @@ -119,13 +119,13 @@ void draw_scr (void) { #ifdef MAP_FORMAT_RLE44_CHRROM bankswitch (c_map_chr_rom_bank); vram_adr (c_map [n_pant]); - rda = VRAM_READ; // Dummy read. + rdt = VRAM_READ; // Dummy read. // UNRLE into scr_buff while (rdm < 192) { rdt = VRAM_READ; rda = rdt & 0x0f; - + rdct = rdt; while (rdct >= 16) { add_tile (); rdct -= 16; @@ -200,11 +200,19 @@ void draw_scr (void) { // Now blit the buffer + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + rdd = 0; + #endif + _x = 0; _y = TOP_ADJUST; gp_ram = map_buff; - //rdx = 0; rdy = 0; gp_ram = map_buff; for (rdm = 0; rdm < 192; rdm ++) { - // rdt = *gp_ram ++; SET_FROM_PTR (rdt, gp_ram); gp_ram ++; + + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + if (tile_got [rdd] & bits [rdm & 7]) rdt = 0; + if ((rdm & 7) == 7) ++ rdd; + #endif + map_attr [rdm] = c_behs [rdt]; #if defined (ENABLE_BREAKABLE) && !defined (BREAKABLES_SOFT) @@ -213,11 +221,6 @@ void draw_scr (void) { #include "engine/mapmods/map_detectors.h" - /* - _x = rdx << 1; _y = (rdy << 1) + TOP_ADJUST; _t = rdt; - draw_tile (); - rdx = (rdx + 1) & 15; if (!rdx) ++ rdy; - */ _t = rdt; draw_tile (); _x = (_x + 2) & 0x1f; if (!_x) _y += 2; } diff --git "a/examples/11_boot\303\250e/dev/engine/player.h" "b/examples/11_boot\303\250e/dev/engine/player.h" index 0ebb092..8cd006d 100644 --- "a/examples/11_boot\303\250e/dev/engine/player.h" +++ "b/examples/11_boot\303\250e/dev/engine/player.h" @@ -59,7 +59,7 @@ void player_init (void) { #endif #endif - pstate = EST_NORMAL; + pflickering = pbouncing = 0; #ifdef DIE_AND_RESPAWN player_register_safe_spot (); @@ -68,10 +68,31 @@ void player_init (void) { #ifdef CARRY_ONE_HS_OBJECT pinv = HS_OBJ_EMPTY; #endif + + // Default engine type + #ifndef PLAYER_TOP_DOWN + #ifdef PLAYER_HAS_JUMP + vertical_engine_type = ENGINE_TYPE_JUMP; + #elif defined (PLAYER_HAS_JETPAC) + vertical_engine_type = ENGINE_TYPE_JET_PAC; + #elif defined (PLAYER_AUTO_JUMP) + vertical_engine_type = ENGINE_TYPE_AUTO_JUMP; + #elif defined (PLAYER_SWIMS) + vertical_engine_type = ENGINE_TYPE_SWIM; + #endif + #endif + + #ifdef ENABLE_TRAMPOLINES + ptrampoline = 0; + #endif + + #ifdef PLAYER_SPINS + pspin = 0; + #endif } void player_render (void) { - if (pstate == EST_NORMAL || half_life) + if (0 == pflickering || half_life) oam_index = oam_meta_spr ( prx, pry + SPRITE_ADJUST, oam_index, @@ -85,17 +106,21 @@ void player_to_pixels (void) { } void player_kill (void) { + oam_index = oam_index_player; + player_render (); + ppu_waitnmi (); + pkill = phit = 0; sfx_play (SFX_PHIT, 0); if (plife) -- plife; else game_over = 1; #ifdef PLAYER_FLICKERS - pstate = EST_PARP; - pctstate = 100; - #else - pstate = EST_REBOUND; - pctstate = 16; + pflickering = PLAYER_FLICKERS; + #endif + + #ifdef PLAYER_BOUNCES + pbouncing = PLAYER_BOUNCES; #endif #ifdef ENABLE_USE_ANIM @@ -103,14 +128,19 @@ void player_kill (void) { #endif #ifdef DIE_AND_RESPAWN - px = px_safe; - py = py_safe; - player_to_pixels (); - n_pant = n_pant_safe; music_pause (1); delay (60); - player_stop (); - music_pause (0); + + #ifdef DIE_AND_REINIT + level_reset = 1; + #else + px = px_safe; + py = py_safe; + player_to_pixels (); + n_pant = n_pant_safe; + player_stop (); + music_pause (0); + #endif // May be necessary to find a proper cell later on #if defined (ENABLE_BREAKABLE) @@ -132,10 +162,8 @@ void player_kill (void) { #endif void player_move (void) { - if (pstate) { - -- pctstate; - if (!pctstate) pstate = EST_NORMAL; - } + if (pflickering) -- pflickering; + if (pbouncing) -- pbouncing; #if defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS) if (pfrozen) { @@ -172,6 +200,7 @@ void player_move (void) { #endif hitv = hith = 0; + pcx = prx; pcy = pry; pnotsafe = 0; #ifdef ENABLE_SLIPPERY pice = 0; @@ -207,11 +236,12 @@ void player_move (void) { #endif { if (QTILE (cx1, cy1 + 1) == SPRING_TILE && QTILE (cx1, cy1) != SPRING_SPIKE_TILE) { _x = cx1; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} - if (QTILE (cx2, cy1 + 1) == SPRING_TILE && QTILE (cx1, cy1) != SPRING_SPIKE_TILE) { _x = cx2; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} + if (QTILE (cx2, cy1 + 1) == SPRING_TILE && QTILE (cx2, cy1) != SPRING_SPIKE_TILE) { _x = cx2; _y = cy1; map_set (); sfx_play (SFX_SPRING, 1);} } } #endif + oppossee = ppossee; ppossee = 0; // ******** @@ -284,7 +314,7 @@ void player_move (void) { } else #endif - #ifndef PLAYER_SWIMS + if (vertical_engine_type != ENGINE_TYPE_SWIM) { #ifdef PLAYER_JUMP_TYPE_MK2 if ( !pgotten @@ -300,56 +330,57 @@ void player_move (void) { if (pvy > PLAYER_VY_FALLING_MAX) pvy = PLAYER_VY_FALLING_MAX; } #endif - #endif + } // Moving platforms invalidate pvy - #ifdef PLAYER_CUMULATIVE_JUMP - if (!pj) - #endif - if (pgotten) pvy = 0; + if (pgotten) pvy = 0; #endif - cx1 = prx >> 4; - cx2 = (prx + 7) >> 4; - #ifdef PLAYER_HAS_JETPAC // Controller - if (pad0 & PAD_A) { - pvy -= PLAYER_AY_JETPAC; - if (pvy < -PLAYER_VY_JETPAC_MAX) pvy = -PLAYER_VY_JETPAC_MAX; + if (vertical_engine_type == ENGINE_TYPE_JET_PAC) { + if (pad0 & PAD_A) { + pvy -= PLAYER_AY_JETPAC; + if (pvy < -PLAYER_VY_JETPAC_MAX) pvy = -PLAYER_VY_JETPAC_MAX; + } } #endif #ifdef PLAYER_SWIMS // Controller - if (!(pad0 & (PAD_DOWN|PAD_A))) { - pvy -= PLAYER_AY_SWIM >> 1; - } else { - if (pad0 & (PAD_DOWN|PAD_A)) { - pvy += PLAYER_AY_SWIM; + if (vertical_engine_type == ENGINE_TYPE_SWIM) { + if (!(pad0 & (PAD_DOWN|PAD_A))) { + pvy -= PLAYER_AY_SWIM >> 1; + } else { + if (pad0 & (PAD_DOWN|PAD_A)) { + pvy += PLAYER_AY_SWIM; + } + + // Limit + if (pvy > PLAYER_VY_SWIM_MAX) { + pvy = PLAYER_VY_SWIM_MAX; + } } - - // Limit - if (pvy > PLAYER_VY_SWIM_MAX) { - pvy = PLAYER_VY_SWIM_MAX; + if (pvy < -PLAYER_VY_SWIM_MAX) { + pvy = -PLAYER_VY_SWIM_MAX; } } - if (pvy < -PLAYER_VY_SWIM_MAX) { - pvy = -PLAYER_VY_SWIM_MAX; - } - #endif // Move py += pvy; if (py < 0) py = 0; - + pry = py >> FIXBITS; + // Collision player_to_pixels (); + cx1 = prx >> 4; + cx2 = (prx + 7) >> 4; + #ifdef PLAYER_TOP_DOWN if (pvy < 0) #else @@ -404,7 +435,7 @@ void player_move (void) { pgotten = 0; pfiring = 1; ppossee = 1; - + #if defined (PLAYER_TOP_DOWN) && (defined(PLAYER_PUSH_BOXES) || !defined(DEACTIVATE_KEYS)) if (at1 & 2) player_process_tile (at1, cx1, cy1, cx1, cy1 + 1); if (cx1 != cx2) if (at2 & 2) player_process_tile (at2, cx2, cy1, cx2, cy1 + 1); @@ -414,6 +445,18 @@ void player_move (void) { pice = (at1 & 64) || (at2 & 64); #endif + #if defined (ENABLE_TRAMPOLINES) + if (at1 == 74 || at2 == 74) { + a_button = 1; ptrampoline = 1; + #ifdef PLAYER_SPINS + pspin = 0; + #endif + #ifdef ENABLE_SLIPPERY + pice = 0; + #endif + } + #endif + #ifdef ENABLE_CONVEYORS cfx = 0; if ((at1 & 40) == 40) { if (at1 & 1) cfx = pgtmx = PLAYER_VX_CONVEYORS; else cfx = pgtmx = -PLAYER_VX_CONVEYORS; pgotten = 1; } @@ -427,7 +470,7 @@ void player_move (void) { if ((at1 & 1) || (at2 & 1)) pnotsafe = 1; } else if ((at1 & 1) || (at2 & 1)) { - hitv = 1; + if ((pry & 15) > 4) hitv = 1; } #ifdef ENABLE_QUICKSANDS else { @@ -444,40 +487,101 @@ void player_move (void) { // Jump: PAD_A, change when needed // ******************************* - #ifdef PLAYER_JUMP_TYPE_MK2 + if (vertical_engine_type == ENGINE_TYPE_JUMP) { + #ifdef PLAYER_JUMP_TYPE_MK2 - if ( - a_button - && !pj - && ( - pgotten || ppossee || hitv - #ifdef ENABLE_LADDERS - || ponladder - #endif - ) - ) { - jump_start (); - - #ifdef DIE_AND_RESPAWN - if (!(pgotten || hitv || pnotsafe)) { - player_register_safe_spot (); + if ( + a_button + && !pj + && ( + pgotten || ppossee || hitv + #ifdef ENABLE_LADDERS + || ponladder + #endif + ) + ) { + jump_start (); + + #ifdef DIE_AND_RESPAWN + if (!(pgotten || hitv || pnotsafe)) { + player_register_safe_spot (); + } + #endif + + #ifdef PLAYER_SPINS + #ifdef ENABLE_TRAMPOLINES + if (!ptrampoline) + #endif + pspin = 1; + #endif + } + + if (pj) { + #ifdef ENABLE_TRAMPOLINES + if (ptrampoline) { + ++ pctj; if (pctj == PLAYER_VY_MK2_TRAMPOLINE_A_STEPS) + { pj = 0; ptrampoline = 0; } + } else + #endif + if (pad0 & PAD_A) { + ++ pctj; if (pctj == PLAYER_VY_MK2_JUMP_A_STEPS) pj = 0; + } else { + pj = 0; if (pvy < -PLAYER_VY_MK2_JUMP_RELEASE) pvy = -PLAYER_VY_MK2_JUMP_RELEASE; } - #endif - } + } - if (pj) { + #else + + if ( + a_button + && !pj + && ( + pgotten || ppossee || hitv + #ifdef ENABLE_LADDERS + || ponladder + #endif + ) + ) { + jump_start (); + + #ifdef DIE_AND_RESPAWN + if (!(pgotten || hitv || pnotsafe)) { + player_register_safe_spot (); + } + #endif + + #ifdef PLAYER_SPINS + #ifdef ENABLE_TRAMPOLINES + if (!ptrampoline) + #endif + pspin = 1; + #endif + } + + #ifdef ENABLE_TRAMPOLINES + if (pj && ptrampoline) { + + ++ pctj; if (pctj == 32) pj = 0; + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + } else + #endif if (pad0 & PAD_A) { - ++ pctj; if (pctj == PLAYER_VY_MK2_JUMP_A_STEPS) pj = 0; + if (pj) { + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; + ++ pctj; if (pctj == 16) pj = 0; + } } else { - pj = 0; if (pvy < -PLAYER_VY_MK2_JUMP_RELEASE) pvy = -PLAYER_VY_MK2_JUMP_RELEASE; + pj = 0; } - } + #endif + } + #endif - #else - + #ifdef PLAYER_AUTO_JUMP + if (vertical_engine_type == ENGINE_TYPE_AUTO_JUMP) { if ( - a_button - && !pj + !pj && ( pgotten || ppossee || hitv #ifdef ENABLE_LADDERS @@ -486,53 +590,32 @@ void player_move (void) { ) ) { jump_start (); - + #ifdef DIE_AND_RESPAWN if (!(pgotten || hitv || pnotsafe)) { player_register_safe_spot (); } #endif } + + if (pj) { + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); + if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; + ++ pctj; if (pctj == 16) pj = 0; + } - if (pad0 & PAD_A) { - if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); - if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - ++ pctj; if (pctj == 16) pj = 0; - } - } else { - pj = 0; + if (pad0 & PAD_DOWN) { + if (pvy < 0) pvy += PLAYER_AY_UNTHRUST; } - #endif - #endif - - #ifdef PLAYER_AUTO_JUMP - if ( - !pj - && ( - pgotten || ppossee || hitv - #ifdef ENABLE_LADDERS - || ponladder - #endif - ) - ) { - jump_start (); - - #ifdef DIE_AND_RESPAWN - if (!(pgotten || hitv || pnotsafe)) { - player_register_safe_spot (); - } - #endif } + #endif - if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); - if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - ++ pctj; if (pctj == 16) pj = 0; - } - + #ifdef PLAYER_SPINS if (pad0 & PAD_DOWN) { - if (pvy < 0) pvy += PLAYER_AY_UNTHRUST; + if (ppossee && ABS (pvx) > PLAYER_VX_MIN) { + if (!pspin) sfx_play (SFX_DUMMY2, 0); + pspin = 1; + } } #endif @@ -545,25 +628,29 @@ void player_move (void) { #ifdef PLAYER_TOP_DOWN pfacingh = 0xff; #endif - - if (pvx > 0) { + #ifdef PLAYER_SPINS + if (!pspin) + #endif + { + if (pvx > 0) { - #ifdef ENABLE_SLIPPERY - pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx -= PLAYER_RX; - #endif - - if (pvx < 0) pvx = 0; - } else if (pvx < 0) { + #ifdef ENABLE_SLIPPERY + pvx -= pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx -= PLAYER_RX; + #endif + + if (pvx < 0) pvx = 0; + } else if (pvx < 0) { - #ifdef ENABLE_SLIPPERY - pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; - #else - pvx += PLAYER_RX; - #endif + #ifdef ENABLE_SLIPPERY + pvx += pice ? PLAYER_RX_ICE : PLAYER_RX; + #else + pvx += PLAYER_RX; + #endif - if (pvx > 0) pvx = 0; + if (pvx > 0) pvx = 0; + } } } @@ -607,8 +694,8 @@ void player_move (void) { if (pgotten) px += pgtmx; #endif - if (px < (4< (244< (244< 0) hith &= ((pry & 15) > 4); } // Facing @@ -675,27 +763,78 @@ void player_move (void) { #endif #endif + #ifdef PLAYER_SPINS + if ((!pvx && (ppossee || pgotten) && !pj) || (ppossee && !oppossee)) pspin = 0; + #endif + // ************* // Killing tiles // ************* phit = 0; - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; - #ifndef NO_HORIZONTAL_EVIL_TILE - pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); - #endif + if (pgotten == 0) { + #ifdef NO_HORIZONTAL_EVIL_TILE + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } + #else + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } + #endif + + #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) + cx1 = cx2 = (prx + 4) >> 4; + cy1 = pry >> 4; cy2 = (pry + 15) >> 4; + cm_two_points (); + if ((at1 & 1) || (at2 & 1)) phit = 1; + #endif + + if (!pflickering && !pbouncing) if (phit) { + player_to_pixels (); + en_sg_2 = 1; + + #include "my/on_player_spike.h" + + if (en_sg_2) + pkill = 1; + #ifdef PLAYER_SPINS + pspin = 0; + #endif + } } - #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) + // *********************** + // Center point detections + // *********************** + + #ifdef NEEDS_CENTER_DETECTION cx1 = cx2 = (prx + 4) >> 4; - cy1 = pry >> 4; cy2 = (pry + 15) >> 4; + cy1 = cy2 = (pry + 8) >> 4; cm_two_points (); - if ((at1 & 1) || (at2 & 1)) phit = 1; + + #include "my/custom_center_detections.h" #endif - if (pstate != EST_PARP) if (phit) { player_to_pixels (); pkill = 1; } + #ifdef ENABLE_TILE_GET + if (cy1 && at1 == 34) { + -- cy1; + + _x = cx1; _y = cy1; _t = 0; map_set (); + sfx_play (SFX_RING, 2); + + #include "my/on_tile_got.h" + + #ifdef PERSISTENT_TILE_GET + tile_got [(cy1 << 1) | (cx1 > 7)] |= bits [cx1 & 7]; + #endif + } + #endif // ************** // B Button stuff diff --git "a/examples/11_boot\303\250e/dev/engine/prototypes.h" "b/examples/11_boot\303\250e/dev/engine/prototypes.h" index 9bc892f..8507ada 100644 --- "a/examples/11_boot\303\250e/dev/engine/prototypes.h" +++ "b/examples/11_boot\303\250e/dev/engine/prototypes.h" @@ -6,3 +6,5 @@ void propellers_add (void); void shines_add (void); void chac_chacs_add (void); +void player_render (void); +void do_extern_action (unsigned char); diff --git "a/examples/11_boot\303\250e/dev/game.c" "b/examples/11_boot\303\250e/dev/game.c" index e704c3f..e90c69d 100644 --- "a/examples/11_boot\303\250e/dev/game.c" +++ "b/examples/11_boot\303\250e/dev/game.c" @@ -73,11 +73,12 @@ extern const unsigned char m_ingame []; // ************* #include "engine/prototypes.h" -#include "engine/general.h" #include "engine/printer.h" +#include "engine/general.h" #ifdef ENABLE_TEXT_BOX #include "engine/textbox.h" #endif +#include "my/extra_modules.h" #ifdef ENABLE_BREAKABLE #include "engine/breakable.h" #endif @@ -99,14 +100,15 @@ extern const unsigned char m_ingame []; #endif #include "engine/player.h" #include "engine/enengine.h" +#if (defined (ACTIVATE_SCRIPTING) && defined (ENABLE_EXTERN_CODE)) || defined (ENABLE_COMPILED_ENEMS) + #include "my/extern.h" +#endif #include "engine/frame.h" #include "my/pres.h" #ifdef ACTIVATE_SCRIPTING - #ifdef ENABLE_EXTERN_CODE - #include "my/extern.h" - #endif #include "assets/mscnes.h" #endif +#include "mainloop/flickscreen.h" #include "mainloop.h" // ************* @@ -119,6 +121,7 @@ void main(void) { ppu_off (); first_game = 1; + ntsc = ppu_system (); credits (); diff --git "a/examples/11_boot\303\250e/dev/labels.txt" "b/examples/11_boot\303\250e/dev/labels.txt" index 4ada07e..82c84ab 100644 --- "a/examples/11_boot\303\250e/dev/labels.txt" +++ "b/examples/11_boot\303\250e/dev/labels.txt" @@ -3,88 +3,90 @@ Modules list: crt0.o: RODATA Offs = 000000 Size = 000CE3 HEADER Offs = 000000 Size = 000010 - STARTUP Offs = 000000 Size = 000C7F + STARTUP Offs = 000000 Size = 000CB2 VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 002000 game.o: - CODE Offs = 000000 Size = 002492 - RODATA Offs = 000CE3 Size = 0028CC - BSS Offs = 000000 Size = 000406 - ZEROPAGE Offs = 000000 Size = 0000A8 + CODE Offs = 000000 Size = 002597 + RODATA Offs = 000CE3 Size = 0028E7 + BSS Offs = 000000 Size = 00040E + ZEROPAGE Offs = 000000 Size = 0000AD runtime.lib(add.o): - CODE Offs = 002492 Size = 00001A + CODE Offs = 002597 Size = 00001A runtime.lib(addysp.o): - CODE Offs = 0024AC Size = 00000E + CODE Offs = 0025B1 Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 0024BA Size = 00000B + CODE Offs = 0025BF Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 0024C5 Size = 00000E + CODE Offs = 0025CA Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 0024D3 Size = 000011 + CODE Offs = 0025D8 Size = 000011 runtime.lib(asrax1.o): - CODE Offs = 0024E4 Size = 00000A + CODE Offs = 0025E9 Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 0024EE Size = 00000F + CODE Offs = 0025F3 Size = 00000F runtime.lib(asrax4.o): - CODE Offs = 0024FD Size = 000019 + CODE Offs = 002602 Size = 000019 runtime.lib(bneg.o): - CODE Offs = 002516 Size = 00000E + CODE Offs = 00261B Size = 00000E runtime.lib(call.o): - CODE Offs = 002524 Size = 000007 + CODE Offs = 002629 Size = 000007 runtime.lib(copydata.o): - CODE Offs = 00252B Size = 00002D + CODE Offs = 002630 Size = 00002D runtime.lib(decsp3.o): - CODE Offs = 002558 Size = 00000D + CODE Offs = 00265D Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 002565 Size = 00000D + CODE Offs = 00266A Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 002572 Size = 00000D + CODE Offs = 002677 Size = 00000D runtime.lib(icmp.o): - CODE Offs = 00257F Size = 00002E + CODE Offs = 002684 Size = 00002E runtime.lib(incsp2.o): - CODE Offs = 0025AD Size = 000016 + CODE Offs = 0026B2 Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 0025C3 Size = 000005 + CODE Offs = 0026C8 Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 0025C8 Size = 000005 + CODE Offs = 0026CD Size = 000005 runtime.lib(ldai.o): - CODE Offs = 0025CD Size = 00000C + CODE Offs = 0026D2 Size = 00000C +runtime.lib(makebool.o): + CODE Offs = 0026DE Size = 000031 runtime.lib(neg.o): - CODE Offs = 0025D9 Size = 00000E + CODE Offs = 00270F Size = 00000E runtime.lib(or.o): - CODE Offs = 0025E7 Size = 000012 + CODE Offs = 00271D Size = 000012 runtime.lib(popa.o): - CODE Offs = 0025F9 Size = 00000C + CODE Offs = 00272F Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 002605 Size = 000010 + CODE Offs = 00273B Size = 000010 runtime.lib(pusha.o): - CODE Offs = 002615 Size = 000016 + CODE Offs = 00274B Size = 000016 runtime.lib(pushax.o): - CODE Offs = 00262B Size = 00001A + CODE Offs = 002761 Size = 00001A runtime.lib(shl.o): - CODE Offs = 002645 Size = 00002B + CODE Offs = 00277B Size = 00002B runtime.lib(shrax3.o): - CODE Offs = 002670 Size = 00000E + CODE Offs = 0027A6 Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 00267E Size = 000011 + CODE Offs = 0027B4 Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 00268F Size = 000016 + CODE Offs = 0027C5 Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 0026A5 Size = 00000B + CODE Offs = 0027DB Size = 00000B runtime.lib(sub.o): - CODE Offs = 0026B0 Size = 000015 + CODE Offs = 0027E6 Size = 000015 runtime.lib(subeqsp.o): - CODE Offs = 0026C5 Size = 000015 + CODE Offs = 0027FB Size = 000015 runtime.lib(subysp.o): - CODE Offs = 0026DA Size = 00000D + CODE Offs = 002810 Size = 00000D runtime.lib(udiv.o): - CODE Offs = 0026E7 Size = 00004F + CODE Offs = 00281D Size = 00004F runtime.lib(umod.o): - CODE Offs = 002736 Size = 000011 + CODE Offs = 00286C Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000A8 Size = 00001A + ZEROPAGE Offs = 0000AD Size = 00001A Segment list: @@ -93,62 +95,63 @@ Name Start End Size -------------------------------------------- CHARS 000000 001FFF 002000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000E9 0000C2 -BSS 000300 000705 000406 -STARTUP 008000 008C7E 000C7F -INIT 008C7F 008CA1 000023 -CODE 008CA2 00B3E8 002747 -RODATA 00B3E9 00E997 0035AF +ZEROPAGE 000028 0000EE 0000C7 +BSS 000300 00070D 00040E +STARTUP 008000 008CB1 000CB2 +INIT 008CB2 008CD4 000023 +CODE 008CD5 00B551 00287D +RODATA 00B552 00EB1B 0035CA VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 000406 REA -__DATA_LOAD__ 00E998 RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 00040E REA +__DATA_LOAD__ 00EB1C RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA -_bank_bg 0083E3 RLA _bank_spr 0083D3 RLA -_bankswitch 008590 RLA _delay 008588 RLA -_main 00B024 RLA _memfill 008559 RLA -_music_pause 00876E REA _music_play 008701 REA -_music_stop 0086C3 REA _oam_clear 0082A8 RLA -_oam_hide_rest 00833A RLA _oam_meta_spr 0082F2 RLA -_oam_spr 0082C8 RLA _pad_poll 008468 RLA -_pal_bg 008229 RLA _pal_bright 00825B RLA -_pal_col 00823C RLA _pal_spr 008233 RLA -_ppu_off 008269 RLA _ppu_on_all 00827C RLA -_ppu_waitnmi 008347 RLA _rand8 0084C7 RLA -_scroll 0083A0 RLA _set_vram_update 0084DD RLA -_sfx_play 008457 RLA _unrle_vram 008360 RLA -_vram_adr 0084E7 RLA _vram_fill 0084F2 RLA -_vram_put 0084EE RLA _vram_write 008427 RLA -addysp 00B14F RLA addysp1 00B14E RLA -aslax2 00B15C RLA aslax3 00B167 RLA -aslax4 00B175 RLA asrax1 00B186 RLA -asrax2 00B190 RLA asrax4 00B19F RLA -bnega 00B1BC RLA callax 00B1C6 RLA -copydata 00B1CD RLA decsp3 00B1FA RLA -decsp4 00B207 RLA decsp8 00B214 RLA -incsp2 00B257 RLA incsp4 00B265 RLA -incsp8 00B26A RLA ldaidx 00B26F RLA -negax 00B27B RLA popa 00B29B RLA -popax 00B24F RLA popsreg 00B2A7 RLA -ptr1 0000D8 RLZ ptr2 0000DA RLZ -ptr4 0000DE RLZ push0 00B2CD RLA -pusha 00B2BB RLA pusha0 00B2CF RLA -pushax 00B2D1 RLA regsave 0000D4 RLZ -shlax2 00B15C RLA shlax4 00B175 RLA -shrax3 00B312 RLA shrax4 00B320 RLA -sp 0000D0 RLZ sreg 0000D2 RLZ -staspidx 00B331 RLA stax0sp 00B347 RLA -subeqysp 00B369 RLA subysp 00B37C RLA -tmp1 0000E0 RLZ tosaddax 00B136 RLA -tosaslax 00B2E7 RLA tosicmp 00B223 RLA -tosicmp0 00B221 RLA tosorax 00B28B RLA -tossuba0 00B352 RLA tosudiva0 00B389 RLA -tosumoda0 00B3D8 RLA udiv16 00B39A RLA -zerobss 008C7F RLA +_bank_bg 008416 RLA _bank_spr 008406 RLA +_bankswitch 0085C3 RLA _delay 0085BB RLA +_main 00B156 RLA _memfill 00858C RLA +_music_pause 0087A1 REA _music_play 008734 REA +_music_stop 0086F6 REA _oam_clear 0082AF RLA +_oam_hide_rest 008341 RLA _oam_meta_spr 0082F9 RLA +_oam_spr 0082CF RLA _pad_poll 00849B RLA +_pal_bg 00822D RLA _pal_bright 00825F RLA +_pal_col 008240 RLA _pal_spr 008237 RLA +_ppu_off 00826D RLA _ppu_on_all 008283 RLA +_ppu_system 008280 RLA _ppu_waitnmi 00834E RLA +_rand8 0084FA RLA _scroll 0083A7 RLA +_set_vram_update 008510 RLA _sfx_play 00848A RLA +_unrle_vram 008367 RLA _vram_adr 00851A RLA +_vram_fill 008525 RLA _vram_put 008521 RLA +_vram_write 00845A RLA addysp 00B287 RLA +addysp1 00B286 RLA aslax2 00B294 RLA +aslax3 00B29F RLA aslax4 00B2AD RLA +asrax1 00B2BE RLA asrax2 00B2C8 RLA +asrax4 00B2D7 RLA bnega 00B2F4 RLA +booleq 00B3B9 RLA callax 00B2FE RLA +copydata 00B305 RLA decsp3 00B332 RLA +decsp4 00B33F RLA decsp8 00B34C RLA +incsp2 00B38F RLA incsp4 00B39D RLA +incsp8 00B3A2 RLA ldaidx 00B3A7 RLA +negax 00B3E4 RLA popa 00B404 RLA +popax 00B387 RLA popsreg 00B410 RLA +ptr1 0000DD RLZ ptr2 0000DF RLZ +ptr4 0000E3 RLZ push0 00B436 RLA +pusha 00B424 RLA pusha0 00B438 RLA +pushax 00B43A RLA regsave 0000D9 RLZ +shlax2 00B294 RLA shlax4 00B2AD RLA +shrax3 00B47B RLA shrax4 00B489 RLA +sp 0000D5 RLZ sreg 0000D7 RLZ +staspidx 00B49A RLA stax0sp 00B4B0 RLA +subeqysp 00B4D2 RLA subysp 00B4E5 RLA +tmp1 0000E5 RLZ tosaddax 00B26E RLA +tosaslax 00B450 RLA tosicmp 00B35B RLA +tosicmp0 00B359 RLA tosorax 00B3F4 RLA +tossuba0 00B4BB RLA tosudiva0 00B4F2 RLA +tosumoda0 00B541 RLA udiv16 00B503 RLA +zerobss 008CB2 RLA Imports list: @@ -170,33 +173,33 @@ __RAM_START__ ([linker generated]): __STARTUP__ (crt0.o): game.o game.s(12) _bank_bg (crt0.o): - game.o game.s(31) + game.o game.s(32) _bank_spr (crt0.o): - game.o game.s(30) + game.o game.s(31) _bankswitch (crt0.o): - game.o game.s(41) + game.o game.s(42) _delay (crt0.o): - game.o game.s(40) + game.o game.s(41) _main (game.o): crt0.o crt0.s(26) _memfill (crt0.o): - game.o game.s(39) + game.o game.s(40) _music_pause (crt0.o): - game.o game.s(26) + game.o game.s(27) _music_play (crt0.o): - game.o game.s(24) -_music_stop (crt0.o): game.o game.s(25) +_music_stop (crt0.o): + game.o game.s(26) _oam_clear (crt0.o): - game.o game.s(19) + game.o game.s(20) _oam_hide_rest (crt0.o): - game.o game.s(22) + game.o game.s(23) _oam_meta_spr (crt0.o): - game.o game.s(21) + game.o game.s(22) _oam_spr (crt0.o): - game.o game.s(20) + game.o game.s(21) _pad_poll (crt0.o): - game.o game.s(28) + game.o game.s(29) _pal_bg (crt0.o): game.o game.s(13) _pal_bright (crt0.o): @@ -209,111 +212,121 @@ _ppu_off (crt0.o): game.o game.s(17) _ppu_on_all (crt0.o): game.o game.s(18) +_ppu_system (crt0.o): + game.o game.s(19) _ppu_waitnmi (crt0.o): - game.o game.s(23) + game.o game.s(24) _rand8 (crt0.o): - game.o game.s(32) + game.o game.s(33) _scroll (crt0.o): - game.o game.s(29) + game.o game.s(30) _set_vram_update (crt0.o): - game.o game.s(33) + game.o game.s(34) _sfx_play (crt0.o): - game.o game.s(27) + game.o game.s(28) _unrle_vram (crt0.o): - game.o game.s(38) + game.o game.s(39) _vram_adr (crt0.o): - game.o game.s(34) + game.o game.s(35) _vram_fill (crt0.o): - game.o game.s(36) + game.o game.s(37) _vram_put (crt0.o): - game.o game.s(35) + game.o game.s(36) _vram_write (crt0.o): - game.o game.s(37) + game.o game.s(38) addysp (addysp.o): incsp8.o incsp8.s(8) incsp4.o incsp4.s(8) - game.o game.s(12152) + game.o game.s(12266) addysp1 (addysp.o): sub.o sub.s(8) or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(10762) - game.o game.s(10923) - game.o game.s(12731) - game.o game.s(14052) - game.o game.s(15293) - game.o game.s(16764) + game.o game.s(10491) + game.o game.s(10652) + game.o game.s(12870) + game.o game.s(14307) + game.o game.s(14362) + game.o game.s(14397) + game.o game.s(15701) + game.o game.s(17248) aslax3 (aslax3.o): - game.o game.s(10682) - game.o game.s(14061) + game.o game.s(10411) + game.o game.s(14406) aslax4 (aslax4.o): - game.o game.s(10622) - game.o game.s(10774) - game.o game.s(10935) - game.o game.s(11028) - game.o game.s(11473) - game.o game.s(12106) - game.o game.s(12465) - game.o game.s(12730) - game.o game.s(15292) - game.o game.s(16758) + game.o game.s(10351) + game.o game.s(10503) + game.o game.s(10664) + game.o game.s(10757) + game.o game.s(11189) + game.o game.s(12220) + game.o game.s(12579) + game.o game.s(12869) + game.o game.s(14306) + game.o game.s(14361) + game.o game.s(15700) + game.o game.s(17242) asrax1 (asrax1.o): - game.o game.s(10693) - game.o game.s(15780) + game.o game.s(10422) + game.o game.s(16070) asrax2 (asrax2.o): - game.o game.s(10676) - game.o game.s(11923) - game.o game.s(15064) - game.o game.s(16953) + game.o game.s(10405) + game.o game.s(12029) + game.o game.s(12779) + game.o game.s(15466) + game.o game.s(17450) asrax4 (asrax4.o): - game.o game.s(11922) - game.o game.s(12628) - game.o game.s(14648) - game.o game.s(16952) + game.o game.s(12028) + game.o game.s(12778) + game.o game.s(15003) + game.o game.s(17449) bnega (bneg.o): - game.o game.s(12955) - game.o game.s(14581) + game.o game.s(13111) + game.o game.s(14931) +booleq (makebool.o): + game.o game.s(15728) callax (call.o): - game.o game.s(15930) + game.o game.s(16220) copydata (copydata.o): crt0.o crt0.s(26) decsp3 (decsp3.o): - game.o game.s(10475) - game.o game.s(11594) - game.o game.s(11847) - game.o game.s(15602) - game.o game.s(16099) - game.o game.s(16256) - game.o game.s(16405) - game.o game.s(16728) - game.o game.s(17308) + game.o game.s(10046) + game.o game.s(10204) + game.o game.s(11775) + game.o game.s(15890) + game.o game.s(16389) + game.o game.s(16546) + game.o game.s(16695) + game.o game.s(17212) + game.o game.s(17811) decsp4 (decsp4.o): - game.o game.s(11439) - game.o game.s(12406) - game.o game.s(17716) + game.o game.s(11155) + game.o game.s(12520) + game.o game.s(18104) decsp8 (decsp8.o): - game.o game.s(15487) - game.o game.s(17411) + game.o game.s(15775) + game.o game.s(17675) incsp2 (incsp2.o): popsreg.o popsreg.s(8) staspidx.o staspidx.s(8) - game.o game.s(11506) + game.o game.s(11222) incsp4 (incsp4.o): - game.o game.s(10215) - game.o game.s(10290) - game.o game.s(15957) + game.o game.s(11516) + game.o game.s(11591) + game.o game.s(16247) incsp8 (incsp8.o): - game.o game.s(10100) + game.o game.s(11401) ldaidx (ldai.o): - game.o game.s(12364) - game.o game.s(14244) - game.o game.s(14639) + game.o game.s(12478) + game.o game.s(14586) + game.o game.s(14994) negax (neg.o): - game.o game.s(10226) - game.o game.s(10281) - game.o game.s(13372) - game.o game.s(13762) - game.o game.s(14937) + game.o game.s(11527) + game.o game.s(11582) + game.o game.s(13558) + game.o game.s(14008) + game.o game.s(14367) + game.o game.s(15292) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -337,58 +350,59 @@ ptr4 (zeropage.o): umod.o umod.s(9) udiv.o udiv.s(9) push0 (pushax.o): - game.o game.s(13440) - game.o game.s(16346) - game.o game.s(17699) + game.o game.s(13687) + game.o game.s(16636) + game.o game.s(18087) pusha (pusha.o): - game.o game.s(10353) - game.o game.s(10517) - game.o game.s(11960) - game.o game.s(12137) - game.o game.s(12276) - game.o game.s(12309) - game.o game.s(15266) - game.o game.s(16040) - game.o game.s(17031) + game.o game.s(10246) + game.o game.s(11661) + game.o game.s(12079) + game.o game.s(12251) + game.o game.s(12390) + game.o game.s(12423) + game.o game.s(15674) + game.o game.s(16330) + game.o game.s(17524) pusha0 (pushax.o): - game.o game.s(10137) - game.o game.s(10640) - game.o game.s(10717) - game.o game.s(12356) - game.o game.s(12778) - game.o game.s(13752) - game.o game.s(14743) + game.o game.s(10369) + game.o game.s(10446) + game.o game.s(11438) + game.o game.s(12470) + game.o game.s(12924) + game.o game.s(13998) + game.o game.s(15098) + game.o game.s(16900) pushax (pushax.o): - game.o game.s(10041) - game.o game.s(10260) - game.o game.s(10567) - game.o game.s(11053) - game.o game.s(11400) - game.o game.s(12351) - game.o game.s(13744) - game.o game.s(15041) - game.o game.s(15681) - game.o game.s(15992) - game.o game.s(16070) - game.o game.s(16094) - game.o game.s(16135) - game.o game.s(16177) - game.o game.s(16251) - game.o game.s(16368) + game.o game.s(10296) + game.o game.s(10782) + game.o game.s(11116) + game.o game.s(11342) + game.o game.s(11561) + game.o game.s(12465) + game.o game.s(13990) + game.o game.s(15443) + game.o game.s(15971) + game.o game.s(16282) + game.o game.s(16360) + game.o game.s(16384) + game.o game.s(16425) + game.o game.s(16467) + game.o game.s(16541) + game.o game.s(16658) regsave (zeropage.o): game.o game.s(10) shlax2 (aslax2.o): - game.o game.s(15060) + game.o game.s(15462) shlax4 (aslax4.o): - game.o game.s(9983) - game.o game.s(12716) - game.o game.s(15059) + game.o game.s(11284) + game.o game.s(12855) + game.o game.s(15461) shrax3 (shrax3.o): - game.o game.s(14769) + game.o game.s(15124) shrax4 (shrax4.o): - game.o game.s(12442) - game.o game.s(12639) - game.o game.s(14659) + game.o game.s(12556) + game.o game.s(12801) + game.o game.s(15014) sp (zeropage.o): popsreg.o popsreg.s(9) subysp.o subysp.s(9) @@ -414,18 +428,18 @@ sreg (zeropage.o): udiv.o udiv.s(9) icmp.o icmp.s(9) staspidx (staspidx.o): - game.o game.s(10579) - game.o game.s(11061) - game.o game.s(11408) - game.o game.s(12367) - game.o game.s(13764) + game.o game.s(10308) + game.o game.s(10790) + game.o game.s(11124) + game.o game.s(12481) + game.o game.s(14010) stax0sp (staxsp.o): - game.o game.s(11501) - game.o game.s(12018) + game.o game.s(11217) + game.o game.s(12132) subeqysp (subeqsp.o): - game.o game.s(12009) + game.o game.s(12123) subysp (subysp.o): - game.o game.s(13266) + game.o game.s(13430) tmp1 (zeropage.o): staspidx.o staspidx.s(9) shrax4.o shrax4.s(8) @@ -441,27 +455,28 @@ tmp1 (zeropage.o): aslax2.o aslax2.s(8) game.o game.s(10) tosaddax (add.o): - game.o game.s(12365) + game.o game.s(12479) tosaslax (shl.o): - game.o game.s(10727) - game.o game.s(15047) + game.o game.s(10456) + game.o game.s(15449) tosicmp (icmp.o): - game.o game.s(10047) - game.o game.s(10143) - game.o game.s(10266) - game.o game.s(12789) - game.o game.s(14749) + game.o game.s(11348) + game.o game.s(11444) + game.o game.s(11567) + game.o game.s(12935) + game.o game.s(15104) tosicmp0 (icmp.o): - game.o game.s(13304) - game.o game.s(13755) + game.o game.s(13468) + game.o game.s(14001) + game.o game.s(16904) tosorax (or.o): - game.o game.s(10728) + game.o game.s(10457) tossuba0 (sub.o): - game.o game.s(15046) + game.o game.s(15448) tosudiva0 (udiv.o): - game.o game.s(10642) + game.o game.s(10371) tosumoda0 (umod.o): - game.o game.s(10653) + game.o game.s(10382) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git "a/examples/11_boot\303\250e/dev/mainloop.h" "b/examples/11_boot\303\250e/dev/mainloop.h" index 70c962b..79c7b2f 100644 --- "a/examples/11_boot\303\250e/dev/mainloop.h" +++ "b/examples/11_boot\303\250e/dev/mainloop.h" @@ -95,6 +95,12 @@ void game_init (void) { #endif #endif + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Clear tile_got persistence + vram_adr (MAP_CLEAR_LIST_ADDRESS); + vram_fill (0, MAP_SIZE*24); + #endif + half_life = 0; frame_counter = 0; olife = oammo = oobjs = okeys = 0xff; @@ -108,9 +114,20 @@ void game_init (void) { } void prepare_scr (void) { - if (!ft) fade_out (); else ft = 0; + if (!ft) { + fade_out (); + ppu_off (); + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Update tile_got persistence + rda = on_pant << 3; + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); + #endif + } else { + ft = 0; + ppu_off (); + } - ppu_off (); + clear_update_list (); #ifdef ENABLE_PROPELLERS // Clear propellers @@ -144,6 +161,12 @@ void prepare_scr (void) { max_chac_chacs = 0; #endif + #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) + // Read tile_got persistence + rda = n_pant << 3; + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); + #endif + draw_scr (); #if defined (ENABLE_BREAKABLE) && defined (BREAKABLE_ANIM) @@ -200,7 +223,7 @@ void prepare_scr (void) { #include "my/on_entering_screen.h" gpit = 3; while (gpit --) en_spr_id [gpit] = en_s [gpit]; - + oam_index = 4; prx = px >> FIXBITS; pry = py >> FIXBITS; #if defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS) @@ -208,8 +231,8 @@ void prepare_scr (void) { #endif player_move (); - player_render (); enems_move (); + if (hrt) hotspots_paint (); #ifdef ENABLE_INTERACTIVES @@ -259,51 +282,42 @@ void game_loop (void) { run_script (2 * MAP_SIZE); #endif - warp_to_level = 0; oam_index = 0; ticker = 50; + ntsc_frame = level_reset = warp_to_level = 0; + oam_index = 4; ticker = 50; while (1) { + // Update hud + + #ifdef ACTIVATE_SCRIPTING + if (n_pant != 0xfe && on_pant != 0xfe) + #endif + hud_update (); + // Finish him if (pkill) player_kill (); - if (game_over) break; + if (game_over || level_reset) break; // Flick the screen flick_override = 0; #include "my/custom_flickscreen.h" - #include "mainloop/flickscreen.h" + if (flick_override == 0) { + flickscreen_do_horizontal (); + flickscreen_do_vertical (); + } // Change screen ? - if (on_pant != n_pant && !warp_to_level) { + if (on_pant != n_pant) { prepare_scr (); on_pant = n_pant; } // Relocate player if spawned on a broken tile - #if defined (ENABLE_BREAKABLE) - if (pmayneedrelocation) { - pmayneedrelocation = 0; - gpit = 16; - while (gpit --) { - cx1 = prx >> 4; cx2 = (prx + 7) >> 4; - cy1 = cy2 = (pry + 15) >> 4; - cm_two_points (); - if ((at1 & 8) == 0 && (at2 & 8) == 0) break; - prx += 16; // Try next cell - } - px = prx << FIXBITS; - } - #endif - - // Update hud - - #ifdef ACTIVATE_SCRIPTING - if (n_pant != 0xfe && on_pant != 0xfe) - #endif - hud_update (); + #include "mainloop/relocate_player.h" // Shake the screen ? @@ -311,12 +325,13 @@ void game_loop (void) { #include "mainloop/shaker.h" #endif + // Effects + + #include "my/effects.h" + // Finish frame and wait for NMI - oam_hide_rest (oam_index); - ppu_waitnmi (); - clear_update_list (); - oam_index = 4; + update_cycle (); // Poll pads @@ -326,77 +341,54 @@ void game_loop (void) { // Update actors if not paused... - if (paused == 0) { + ntsc_frame ++; if (ntsc_frame == 6) ntsc_frame = 0; + + if (paused == 0 && (ntsc == 0 || ntsc_frame)) { // Count frames if (ticker) -- ticker; else ticker = 50; half_life ^= 1; ++ frame_counter; - // Timer + // Detect interactions - #ifdef ENABLE_TIMER - #include "mainloop/timer.h" - #endif + #ifdef ENABLE_INTERACTIVES + #include "mainloop/interactives.h" + #endif - // Extra checks + // Update / collide hotspots - #include "my/extra_checks.h" + #include "mainloop/hotspots.h" - // Win level condition + // Automatic scripting calls (USE_ANIM & fire zone) - if ( - #if defined (WIN_LEVEL_CUSTOM) - win_level - #elif defined (ACTIVATE_SCRIPTING) - script_result == 1 - #elif defined (PLAYER_MAX_OBJECTS) - pobjs == PLAYER_MAX_OBJECTS - #elif defined (SCR_END) - ( - n_pant == SCR_END && - ((prx + 8) >> 4) == PLAYER_END_X && - ((pry + 8) >> 4) == PLAYER_END_Y - ) + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" #endif - ) { - music_stop (); - delay (50); - break; - } - - // Warp to level + + // Update player - if (warp_to_level) { - music_stop (); break; + if (!warp_to_level) { + player_move (); } - // Update propellers + // Timer - #ifdef ENABLE_PROPELLERS - if (propellers_on) propellers_do (); + #ifdef ENABLE_TIMER + #include "mainloop/timer.h" #endif - // Detect interactions - - #ifdef ENABLE_INTERACTIVES - #include "mainloop/interactives.h" - #endif - - // Update / collide hotspots + // Extra checks - #include "mainloop/hotspots.h" + #include "my/extra_checks.h" - // Update player + // Win level condition - if (!warp_to_level) { - player_move (); - player_render (); - } + #include "mainloop/win_level_condition.h" - // Automatic scripting calls (USE_ANIM & fire zone) + // Update propellers - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" + #ifdef ENABLE_PROPELLERS + if (propellers_on) propellers_do (); #endif // Update bullets @@ -411,10 +403,21 @@ void game_loop (void) { cocos_do (); #endif + // Paint player + + oam_index_player = oam_index; + if (!warp_to_level) player_render (); + // Update enemies enems_move (); + // Warp to level + + if (warp_to_level) { + update_cycle (); music_stop (); break; + } + // Do resonators #ifdef ENABLE_RESONATORS @@ -454,6 +457,8 @@ void game_loop (void) { #ifdef ENABLE_TILE_CHAC_CHAC chac_chacs_do (); #endif + + #include "my/extra_routines.h" } // Cheat to skip level diff --git "a/examples/11_boot\303\250e/dev/mainloop/asset_setup.h" "b/examples/11_boot\303\250e/dev/mainloop/asset_setup.h" index 53304f8..683f300 100644 --- "a/examples/11_boot\303\250e/dev/mainloop/asset_setup.h" +++ "b/examples/11_boot\303\250e/dev/mainloop/asset_setup.h" @@ -35,6 +35,7 @@ c_max_enems = l_player_max_enems [level]; c_map_w = l_map_w [level]; + c_map_h = l_map_h [level]; #if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) c_interactives = @@ -79,6 +80,7 @@ #endif c_map_w = MAP_W; + c_map_h = MAP_H; #if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) c_interactives = @@ -86,3 +88,5 @@ #endif #endif + +rda = c_map_h; c_map_size = 0; while (rda --) c_map_size += c_map_w; diff --git "a/examples/11_boot\303\250e/dev/mainloop/flickscreen.h" "b/examples/11_boot\303\250e/dev/mainloop/flickscreen.h" index b051cac..fa522be 100644 --- "a/examples/11_boot\303\250e/dev/mainloop/flickscreen.h" +++ "b/examples/11_boot\303\250e/dev/mainloop/flickscreen.h" @@ -4,8 +4,7 @@ // Change screen // Very basic. Extend when needed. -if (flick_override == 0 && warp_to_level == 0) { - +void flickscreen_do_horizontal (void) { if (prx == 4 && #if defined (PLAYER_TOP_DOWN) || !defined (ENABLE_CONVEYORS) pvx < 0 @@ -24,24 +23,30 @@ if (flick_override == 0 && warp_to_level == 0) { ) { ++ n_pant; px = 4 << FIXBITS; + } +} + +void flickscreen_do_vertical (void) { #ifdef PLAYER_TOP_DOWN - } else if (pry <= 16 && pvy < 0) { + if (pry <= 16 && pvy < 0) { n_pant -= c_map_w; py = 192 << FIXBITS; } else if (pry >= 192 && pvy > 0) { n_pant += c_map_w; py = 16 << FIXBITS; + } #else - } else if (pry == 0 && pvy < 0 && n_pant >= c_map_w) { + + if (pry == 0 && pvy < 0 && n_pant >= c_map_w) { n_pant -= c_map_w; py = 192 << FIXBITS; if (pvy > -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; - } else if (pry >= 192 && pvy > 0) { + } else if (pry >= 192 && pvy > 0 && n_pant < c_map_size - c_map_w) { n_pant += c_map_w; py = 0; + } + #endif - } - } diff --git "a/examples/11_boot\303\250e/dev/mainloop/hotspots.h" "b/examples/11_boot\303\250e/dev/mainloop/hotspots.h" index c41ce24..a3f0550 100644 --- "a/examples/11_boot\303\250e/dev/mainloop/hotspots.h" +++ "b/examples/11_boot\303\250e/dev/mainloop/hotspots.h" @@ -187,6 +187,7 @@ if (hrt) { ++ pstars; rda = SFX_OBJECT; break; #endif + #include "my/extra_hotspots.h" } if (rda) { sfx_play (rda, 1); diff --git "a/examples/11_boot\303\250e/dev/mainloop/relocate_player.h" "b/examples/11_boot\303\250e/dev/mainloop/relocate_player.h" new file mode 100644 index 0000000..03d4d35 --- /dev/null +++ "b/examples/11_boot\303\250e/dev/mainloop/relocate_player.h" @@ -0,0 +1,19 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Check if the player needs to be relocated after respawning. + + #if defined (DIE_AND_RESPAWN) && defined (ENABLE_BREAKABLE) + if (pmayneedrelocation) { + pmayneedrelocation = 0; + gpit = 16; + while (gpit --) { + cx1 = prx >> 4; cx2 = (prx + 7) >> 4; + cy1 = cy2 = (pry + 15) >> 4; + cm_two_points (); + if ((at1 & 8) == 0 && (at2 & 8) == 0) break; + prx += 16; // Try next cell + } + px = prx << FIXBITS; + } + #endif \ No newline at end of file diff --git "a/examples/11_boot\303\250e/dev/mainloop/timer.h" "b/examples/11_boot\303\250e/dev/mainloop/timer.h" index 57ef5d9..1347ba6 100644 --- "a/examples/11_boot\303\250e/dev/mainloop/timer.h" +++ "b/examples/11_boot\303\250e/dev/mainloop/timer.h" @@ -22,6 +22,8 @@ if (timer_on && timer) { run_script (2 * MAP_SIZE + 3); #endif } + + #include "my/on_timer_tick.h" } } #ifdef TIMER_TIME_FLAG diff --git "a/examples/11_boot\303\250e/dev/mainloop/win_level_condition.h" "b/examples/11_boot\303\250e/dev/mainloop/win_level_condition.h" new file mode 100644 index 0000000..2bc3e46 --- /dev/null +++ "b/examples/11_boot\303\250e/dev/mainloop/win_level_condition.h" @@ -0,0 +1,26 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Win level condition. Note the precedence if severan items are +// #defined: first, WIN_LEVEL_CUSTOM, then ACTIVATE_SCRIPTING (by WIN LEVEL), +// then, ponjs == PLAYER_MAX_OBJECTS, then "ending location" + + if ( + #if defined (WIN_LEVEL_CUSTOM) + win_level + #elif defined (ACTIVATE_SCRIPTING) + script_result == 1 + #elif defined (PLAYER_MAX_OBJECTS) + pobjs == PLAYER_MAX_OBJECTS + #elif defined (SCR_END) + ( + n_pant == SCR_END && + ((prx + 8) >> 4) == PLAYER_END_X && + ((pry + 8) >> 4) == PLAYER_END_Y + ) + #endif + ) { + music_stop (); + delay (50); + break; + } diff --git "a/examples/11_boot\303\250e/dev/my/custom_center_detections.h" "b/examples/11_boot\303\250e/dev/my/custom_center_detections.h" new file mode 100644 index 0000000..963c83d --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/custom_center_detections.h" @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// custom_center_detections.h +// at1 constains the tile beh at the center of the player sprite +// For this code to be included, enable CUSTOM_CENTER_DETECTIONS in config.h diff --git "a/examples/11_boot\303\250e/dev/my/effects.h" "b/examples/11_boot\303\250e/dev/my/effects.h" new file mode 100644 index 0000000..333066d --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/effects.h" @@ -0,0 +1,5 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Effects - This code gets included right before waiting for next NMI +// Add here palette cycles/etc, splits... diff --git "a/examples/11_boot\303\250e/dev/my/extra_hotspots.h" "b/examples/11_boot\303\250e/dev/my/extra_hotspots.h" new file mode 100644 index 0000000..0ec35ab --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/extra_hotspots.h" @@ -0,0 +1,17 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add support for custom hotspots types here. Support for each +// new type of hotspot should be coded in a 'case', like this: + +/* + case HOTSPOT_TYPE_MY_OWN: + rda = SFX_OBJECT; + // do stuff + break; +*/ + +// If rda != 0, the engine will play the sound in rda when getting +// the hotspot. + +// hrt contains the hotspot type, in case you need it. diff --git "a/examples/11_boot\303\250e/dev/my/extra_modules.h" "b/examples/11_boot\303\250e/dev/my/extra_modules.h" new file mode 100644 index 0000000..110e0e3 --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/extra_modules.h" @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Extra modules. #include here custom code you write. + +// Ring implementation, Sonic SMS style: diff --git "a/examples/11_boot\303\250e/dev/my/extra_routines.h" "b/examples/11_boot\303\250e/dev/my/extra_routines.h" new file mode 100644 index 0000000..e93f807 --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/extra_routines.h" @@ -0,0 +1,6 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Extra routines. +// Add here calls to routines which need to update sprites and/or bg. + \ No newline at end of file diff --git "a/examples/11_boot\303\250e/dev/my/on_player_coco.h" "b/examples/11_boot\303\250e/dev/my/on_player_coco.h" new file mode 100644 index 0000000..12c9eec --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/on_player_coco.h" @@ -0,0 +1,11 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by a coco. + +// The default action can be overriden assigning values to flags: +// en_sg_2 controls if player suffers or not. + +// If +// - Player has rings (prings) +// Then create animated ring, but don't hurt the player! diff --git "a/examples/11_boot\303\250e/dev/my/on_player_hit.h" "b/examples/11_boot\303\250e/dev/my/on_player_hit.h" new file mode 100644 index 0000000..ba76abc --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/on_player_hit.h" @@ -0,0 +1,13 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by an enemy. + +// The default action can be overriden assigning values to flags: +// en_sg_1 controls if enemy suffers or not. +// en_sg_2 controls if player suffers or not. + +// If: +// - Player will suffer (hit registered, not spinning): en_sg_2 +// - Player has rings (prings) +// Then create animated ring, and simulate hit but don't hurt player! diff --git "a/examples/11_boot\303\250e/dev/my/on_player_spike.h" "b/examples/11_boot\303\250e/dev/my/on_player_spike.h" new file mode 100644 index 0000000..fbb1bc6 --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/on_player_spike.h" @@ -0,0 +1,11 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Player has been hit by a killing tile. + +// The default action can be overriden assigning values to flags: +// en_sg_2 controls if player suffers or not. + +// If +// - Player has rings (prings) +// Then create animated ring, but don't hurt the player! diff --git "a/examples/11_boot\303\250e/dev/my/on_tile_got.h" "b/examples/11_boot\303\250e/dev/my/on_tile_got.h" new file mode 100644 index 0000000..dc2066d --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/on_tile_got.h" @@ -0,0 +1,7 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. An TILE_GET has just been got. +// You may add checks and set variables and stuff. + +// The value of the tile just got is QTILE (cx1, cy1) diff --git "a/examples/11_boot\303\250e/dev/my/on_timer_tick.h" "b/examples/11_boot\303\250e/dev/my/on_timer_tick.h" new file mode 100644 index 0000000..484f553 --- /dev/null +++ "b/examples/11_boot\303\250e/dev/my/on_timer_tick.h" @@ -0,0 +1,5 @@ +// NES MK1 v1.0 +// Copyleft Mojon Twins 2013, 2015, 2017, 2018 + +// Add here your code. Timer has ticked (a second passed) +// timer_zero equals 1 if timer == 0. diff --git "a/examples/11_boot\303\250e/dev/my/player_frame_selector.h" "b/examples/11_boot\303\250e/dev/my/player_frame_selector.h" index 06d86b8..1cef962 100644 --- "a/examples/11_boot\303\250e/dev/my/player_frame_selector.h" +++ "b/examples/11_boot\303\250e/dev/my/player_frame_selector.h" @@ -10,7 +10,7 @@ // For Bootèe -if (pstate == EST_REBOUND) { +if (pbouncing) { psprid = 6; } else { if (pfiregauge) { diff --git "a/examples/11_boot\303\250e/dev/neslib.h" "b/examples/11_boot\303\250e/dev/neslib.h" index 46c73fb..f4ac0a8 100644 --- "a/examples/11_boot\303\250e/dev/neslib.h" +++ "b/examples/11_boot\303\250e/dev/neslib.h" @@ -47,9 +47,9 @@ void __fastcall__ ppu_on_spr(void); //set PPU_MASK directly -;void __fastcall__ ppu_mask(unsigned char mask); - +void __fastcall__ ppu_mask(unsigned char mask); +unsigned char __fastcall__ ppu_system(void); //clear OAM buffer, all the sprites are hidden @@ -121,6 +121,7 @@ unsigned char __fastcall__ pad_state(unsigned char pad); void __fastcall__ scroll(unsigned int x,unsigned int y); +void __fastcall__ split(unsigned int x,unsigned int y); //select current chr bank for sprites, 0..1 diff --git "a/examples/11_boot\303\250e/dev/neslib.s" "b/examples/11_boot\303\250e/dev/neslib.s" index 80898c2..dd0a181 100644 --- "a/examples/11_boot\303\250e/dev/neslib.s" +++ "b/examples/11_boot\303\250e/dev/neslib.s" @@ -4,11 +4,11 @@ .export _pal_all,_pal_bg,_pal_spr,_pal_col,_pal_clear,_pal_bright - .export _ppu_off,_ppu_on_all,_ppu_on_bg,_ppu_on_spr,_ppu_mask + .export _ppu_off,_ppu_on_all,_ppu_on_bg,_ppu_on_spr,_ppu_mask, _ppu_system .export _oam_clear,_oam_size,_oam_spr,_oam_meta_spr,_oam_hide_rest .export _ppu_waitnmi .export _unrle_vram - .export _scroll + .export _scroll, _split .export _bank_spr,_bank_bg .export _vram_read,_vram_write .export _music_play,_music_stop,_music_pause @@ -225,7 +225,11 @@ _ppu_off: sta PPU_MASK rts +;unsigned char __fastcall__ ppu_system(void); +_ppu_system: + lda C$D0qSkKGqdN+oH=vm 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 qvQCa^+Iw_f8|Scs$RW% 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 diff --git a/examples/cadaverion.nes b/examples/cadaverion.nes index 0ef015e21338f418893fc78e41d8c094d5bba6b1..52320e22f8b158ccd5a88282229f3985d26caf3f 100644 GIT binary patch delta 10419 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 delta 10425 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 diff --git a/examples/che-man.nes b/examples/che-man.nes index 895513509f82ebb6f1d85be289c2f0a97cdf9610..a73c9a031d1474bf245f39b204dc77da1c00d6bc 100644 GIT binary patch delta 10695 zcmb7q30zc1ws$vuF9I&0qI68q8(czb5F!!Ls4+_`POb}1%*;5MOlMwtgiP|D`!boC zi%YcxX>8J&1YBa4V(Ll>$vbn0YDM* zzsVSKx2&`C0{+BpHC3(K^%41X&gBtBne8q6A|k5r)T>V&p8E_DwB4A?k#LNn(%jRqf8Z4O61qb0f4)&LxJ_h=e+4p5dv4ggP?3z@+CBNg^F-x{3El zivZX)!;)bMbw!baJyP%v5?IquxQT*LXwWS?zm^ zTj%ZMVjK}yjk))dU_tH|q}!#h3VQOZf+T3`cI&FzRj4(XRbcJ*&z&V56TQk1vsf-jM8Y7=JE ziCgVLl$TzJ!9Q}rt)p#1QmrvJj0T{_1@)FGUxqZf?1v5pA0UbtMV zL{v^fuVU7MUTv(`C|b;Vwe|OM3{rSmCyp(W^}-)(F`p#s#XLLxo3dEe+wTF4(HD3G zYw+upSpPi5=)a_l^YTpFAw=*KsGP|NG^_gAw#j&S8AFWT~ffc;2vGNth%8yBR zXsez7Gi>1#$7^MSOJCgHA{&a^ArZyx9@!!k66isM!QvKVoiGL!(BkIAiNqUW$O4lA z%Q5B}NKn?{*-huUbj3mEf5wiMPSw$e%jc0RAxU`HHjiF$>4Zr~e`MrjHqt^T6Eo;E zfj73Em`Oe5Jw|IXP`hbvEA=AsQ1jkr@TnW|GP9rrf@QEVckB2sUDXf~eb4e%1L_ zoOyV^+Vr<3Iqw@jZp`h-`*Axh!(VtVsg_SR=1ycx<-mg}Y$w&VX#i_QL9W45B7h_B zm$!tMqw<0#$B<-dV(ZV1Bqni8ar5JJdiiZC?A9H);!GQH*YH+MVGU>|fMmc1I9H6= zG(N~o9vUYy^~SuZA(jtlcmAIdg+tGg>GUI#0W~nw&zwag=jw+z&y1Xv@Cr{l=t9#V zCPc>E24EUi6`a`N92=iFGDP!Z8VgjKor~iq{Hmo^u43ZeBJ+^eMywdc@l3|$dE$!g zq1CG*1k;nu2eW98y8jSjm%geU2CTiG4Z`fBE*%V2st1N;T%EHuezt_YTY}{>;qG=> zv9v{WnKBfJmqDc}`P1UKKYPFje(5cp7F%3{H0;=J7auBKu1)*-9ojW>qS}|Z%)ZVT zXQ*nI7=-|(3AX`Qd*8scC?(RZD-fsEVc~l9#cY{@S*bP5O8rE$WowMNgZpjSbgTkq zVyJ4?Io5YA>pNDnXloh7Ah{tDH?sAthX@w7#WvzfkA#9wk)Nt z1ud8I9K*tUE9BInHC#gxW&{>+GR%i?zR-IWXA1D^Q5DY@GJI)?{oBUSOQGdYRql7` z#md)ig)(4H9q5X?eZ~-Jn31NCsjydjwv!a|R0u)J#2}e!k@aLZByf)$#jL6hR@L1r zH%ej6)P$q~y84i9 zHj^Favk8mR`!yH`pDIz0d6dVgSxIC#A@?5oXjpfd!aYoToPSMND4mC9e5z_jsz1Im zwk%cFm;Rko6-gXlVxcFAnHl)wOycQ@egppl`)=0k`?t&#^xJpgA6v?mj3j-%X) z`3kI<5F}0~C#eLD59usBu%|;mPbvwAu5!M=b4n~Vn-p?_n$?5zxCP5NX`%V#D1DjK z(*ok7JIOI%CUp!{M0SxvVz+p|<^l%cQVE(~C9jb`lRacNd7V^~DzcZ zBl~eg9@rtz7LF5ol;qQT@-p?20(y+>6cS2lo&74O(jy+&!89s=c)K!)Nwe_GQ7J6Y z%nn3rl6FZ4M`H1Ae~kK~Rgm(^AlEO@%W*M z9A~r^ks>(dyJ(SLPj_|cS4Aw$i;HsW(GeO?_bQRB^dAHrjMf53%P#9qva@_AOc{d| zkevhN5po2Y@3^0Ad>Ki{c@m_S+cH+8PHKjo!{R*7H0}e z0*jke3*Uhh*mh#Ry|7NT;@5lWB9mS*h{3&du}P1O|9USgr~CEv!7d$JLmF!XEwJKo z8V^G()J%9bJE9`oy+DqmnRU2aTWO}!BGZsSBybK)wpDTQv=IIx`fHj6!G#K z3~J1c3W*o`pg{%VAjBznaqKQh zXz(>i2p&K&v*J4#_s;C3$){#L83po>+M%QTdWT~Sha$N-$n z?uc{QK%C;K{R8A0(n#cxeNc5PZm1^KvTpK3naJ4j1K^oK-0gxaKY`u{Xi@ntxF0sD zhwo8@P|dH052dn+9V?f_F)lb30$v`~)Hq2oV@Kfla6T0}0d>7)cK(u@DU4wNabGRP&I=N!1Q8+plsGmLtqs z&G^%7NXF6wbdf&^i(Pu4IXi5$u>nF$nK}3G@C-`ka5h1N^#1 zOO-hMh6q`&dGFz|6dfs5P0C(n8kFr3Duq-$Z5XPJ&^^sc3}@>V#9EVq9aS-+>j0v1 zJb3atebs1v9WMv*;DCISh0XGEmm2l5I6{khXN!fTES0V*P2uV4(kz~?DNW<)+R}8M zt}D&p>4wtTJY8Qplb7hm(uaAvsq|5vZZ0+R^!KID>*!0RPw?~)rHgqB^O?v?aJ=Z6 z5TE{N`x9zwLp8~kXAwrbnGS6u+v&Qd4FRq|{H>dA$n03>7^)1W3$>oCEmVY@kS(^Y z*o)s=UQk^+HT3+LMP{E6M7MCoLeVaKyl#?#I`g$(gon0(JcV(oeuM`Wgu2UlWfbbG zWX@=vPNr8H#MrXV3_L2}0|fOESZ81WuXq6=|aCg5LK31x>6^8bPyi04kZuW6bEaRUQ0G%*yd1qGhLS{b!>19 zQ-;uW@MSlUb+Atx==#i#jcVh1G;SnV3)u)n5v9-RRD93iRr;*1bAj-|0nPV5=$4;# z>x|aakRUT@jn=Ed^;4{srNx#rUzP+kyCQr+~WCfHrn@8g_j0l;^&)ktpZ;&&^N@^@pX7-J4Fk06zvn|JFc9{Ev z_t8~BqjfC{@4|T~Elgo*rskojAJN!pMAeUInLaf<5ieKJr!o2E3UD&yscIqYC@3?| z0EDn=I_`cJjY2rEvtLkHw_njskd!szSCp;=)tb9A=%`6geijnNx684zl{zJgrOFKA zfpWSDltWrKgH8zSx~4TsB;C-oCNKnZs}jXT66LiJMAAchkpH_^mF>+jj#y33a_anf zjtp^sIo*sx4=b!~+US@B!CFhvZFsnwThgIJjJQYZdE+#b_suHNo5VwCjDcyyp2oWA zYNPdM*f;A-WCiTciqd5~UFGK#gE*{${tA@i#SS98c5AOq%1Tffasss={wb|t2qZSM zV=d_^=#q4Nk0T;57kkBAMsf}gls=6=2f}==k5x0%0-dZ>|EYj`sO2e@jTa!t{ zJsh~T$&5dkjLo%3d4g_+ShK@0%^*s{7)wJ$hH`RDRgrPia>g32r|*a>BJg;KZdJSQ zKzEsqV&sp~E$bx09BoauR1wGCLD;af0kyz(_Jm4e(^>~BGFl;O(Cz-*$cu1bb8+}s zG0xyH2+PaZhA??i=~7wBeA!6&x+1B-(VxeTeK}UBkhEwglw8T|8lrmU5aPM;d_nh+ zA9x0rD(Ei*6NJh?dz7(Id_wmNbLw!M6Zp)SICQFGUw%nfAbYIl2G$r~%;uRkQsi%L zQ9Nm20(ga%0DuM-SfPTU1hA@suzKQKWwOuxKS*7%e6P528?8C>9j6#+jr}`Ljwi{u zEiienaG4!7$h~@Y(dskba?0Jb+WxHu=7{M~C+7>aWp-3+J*v(~J)9CxtL#0ToCpl) zLaQ`b<(Y37sM7w81_E+gse;(KoT=KDK}cMOve({3{>RfBxJJMMG1mJQf95c+jFty! zQ^8e&Tuyf zGqy6S)Fiw7YfvR~?2+ycVE2$Xf_srHk02&_qWcSMps?jtc^Fzop=EYo3;N8E$Drwn zzNQU8owAitfSe{$Yb=L}#Xtj%x%=4+Iy~^_Tt8WmLMbay8m-i*$#}S9ay)V#;$)9J z81uyf`EOL@A}F}WeKEvLtb&ohRNd5{F}y1IzjL>08r7^QSL888^y+sS8I&u@YuP1a5i=Y zYPeKj`^pBd?*p>Ij=sT@)a?v0Og=tv{W#<*`94<1DI?jMqw&b>;>6z_lA{2|&Q4H9 zq0Jvv84bti#Y$eZ9a2XEBn?&!*l5P7r6EoMBeL_kmI0g+TA4f`XC*E>#O|p2^UUN+ z+h15R-SWd`xE5E)MZ}UL=|z*II>T@(T#2}03o;M#q6K$C61jjUX|qrVtk*C#hK)LV zm2=M#AMv8?+W_-~`$FF|z2!Q9EZczq!9t4zGs<@%@OuD0VN;`HGHpbt4ad-qPHE_b zBt$3>(&F4XFk@=CjiLTV*`vi|m9egVdb; z8t3V|*E2?e-1$LDFdEoC_ZYlU*TBc!#2{$-e=p$+r%tOI`R%Rt7%3v(u`5q zaO*o_)LZm}@(*D|=$Z1f%uGG7OPDSTca<=OAJQM)=n+)4Q_zN6J(i!H$uKv!fnO-N zb-otuMpTUx`@%{Mbee&Lq>15N6#`5lSRzy-vSK-1dol06U!E7bAap*EIzf6Bd07u{ zf0MT#;_Y5uz6&dYJRn5uwZFxy)*6Qz2BH`kfwN3K8Du%E$QIfVFbjbq;l-`qE{@&V znwi?Y!t9rN=>wezWxMC$mg0U-j&@&&0bt???_+kS)d-rxd}!bq=><;8l=ba6_w z5LbyJ5DH(trX7rWQUd!IK}x-P7FFBz27hD#J~#^AZiZ@ZjaO%Yi>)`{_?TNmMWp9N z@gG(4G$MMXuegPJ`&ZocAV*IEzQ0;HUke7p&u7x6W`qjV3u?GtEG?lXanPb&d1!f| z6Dn(24oOIdXOs=L;-12MkOf6S2Iaaj* zySPJq^oV>ECy46k$e+5;sScU9gL$ZPYgm3@I?15>lnGuBuZ%15@Hn6}lX-ZcbzwKM zxJjx}QoV2T%4BfoP2Pj9Y8WqFRc}L$xfnuw`i!tP2HS=~hqOV5LW3f}i2uhJT8$xI zZHPBCgk3!T$dGuIw&{F^63;Y%-Re9hJH6?5O?jaTA_V#9=43AOS~n;BdMg@mnIpbX zC3BEx>?kY&b9bCK(kDn$*?9~P=~$f{CH(g`;TaEnuS%ibD@?3n@;!zbiVd2fXn>=0 zza}_uiq~sygUk&9BRe@o4vSwg>R( zQdPV5&g|$6L|^VuxZK`oy=CdY7qXWIvbgl2i`ve1g~!hTK<8zPi^ENnD@wfSd~3Q{ zY9~D{1-QGSJ>tJ=*aYYZ43{lgEMqG@M@i~>nQCg?_`;sZdY7+r!p?GV^ZhjN!?jZH)waq zH;yRMozrn6tFt2~KLB6FqJk^ArW+2f<3?vkegLV`ThRr}yDj<~MXUq}zO%=g zkEiQ(dSys`bp3?-I9*z7{WuhLN&=qI_0BCbUWmx3cYZx%fiW*5-$3y8Igc$|vOI6uKHa|F2lMKCAIwm@guC{}e_20`WRO{8 zHhGjhPO?ZA)$RNDw0h^B%+$zaU#~IQ=L}?KC!@&y%$G)VO}(QmzTWr^zWyOUK}LER z8BEKrk# z|Dku&zgvA+bpgtB_*2PC7N zQ4dYmpLNcCNSNAuJc$1zPfR+IePZQ_vnRefp*tCUa`wsRPZpi5KKa2(?lNT3cK7f#0>J2Xwk+t=n7cTCcW_32bi_QMU$O$5W^KQ=me9 z`vO7r{ZW8B$J!ImEm7YY=W^8dmUCNfc{iQAa_*IL2hY`XEQm{lM;DqG z3)#!f6U|2oe!7oedh_FTpIrOor{~X}U+`(;rU&pM-1ONa4 delta 10581 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 diff --git a/examples/cheril_perils_classic.nes b/examples/cheril_perils_classic.nes index 721803127017f3da40ba22f53a589b74884f977f..8dcb317ecad862ef8f2b30bd85252d9149d3206a 100644 GIT binary patch delta 13128 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 delta 12656 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 delta 17940 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 diff --git a/mk1_nes.sublime-workspace b/mk1_nes.sublime-workspace index 2337e28..057ff31 100644 --- a/mk1_nes.sublime-workspace +++ b/mk1_nes.sublime-workspace @@ -520,21 +520,67 @@ "buffers": [ { - "file": "testers/03_tester_interactives/dev/mainloop.h", + "file": "testers/05_tester_tile_get/dev/engine/breakable.h", "settings": { - "buffer_size": 8312, + "buffer_size": 1203, + "encoding": "UTF-8", "line_ending": "Windows" } }, { - "file": "testers/04_tester_warp_to_level/dev/mainloop.h", + "file": "testers/05_tester_tile_get/dev/mainloop.h", "settings": { - "buffer_size": 8332, + "buffer_size": 8439, "encoding": "UTF-8", "line_ending": "Windows" } + }, + { + "file": "/D/Google Drive/Maritrini/dev/cpc/Nanako Descends to Hell/dev/ndthcpc.c", + "settings": + { + "buffer_size": 29088, + "encoding": "Western (Windows 1252)", + "line_ending": "Windows" + } + }, + { + "file": "/D/Google Drive/Maritrini/dev/cpc/Nanako Descends to Hell/dev/paletas.h", + "settings": + { + "buffer_size": 1762, + "encoding": "Western (Windows 1252)", + "line_ending": "Windows" + } + }, + { + "contents": "Searching 124 files for \"breakable_break\"\n\nD:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev\\config.h:\n 155 #define BREAKABLE_MAX_FRAMES\t\t\t24\t// Frames to show explosion\n 156 #define BREAKABLE_ERASE\t\t\t\t\t0\t// Tile to erase broken tiles\n 157: #define BREAKABLE_BREAKING\t\t\t\t19\t// Tile to display while breaking\n 158 #define BREAKABLE_WALKABLE\t\t\t\t\t// If defined (side view), tiles break when stepped on\n 159 \n\nD:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev\\engine\\breakable.h:\n 23 #endif\n 24 \n 25: void breakable_break (unsigned char x, unsigned char y) {\n 26 \tgpaux = COORDS (x, y);\n 27 \t#ifndef BREAKABLES_SOFT\n ..\n 40 \t\t\t\t_x = brkx [gpit] = x;\n 41 \t\t\t\t_y = brky [gpit] = y;\n 42: \t\t\t\t_t = BREAKABLE_BREAKING;\n 43 \t\t\t\tmap_set ();\t\t\t\t\t// Break tile!\n 44 \t\t\t\tsfx_play (SFX_BREAKB, 1);\n\nD:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev\\engine\\player.h:\n 472 \n 473 \t\t\t\t#if defined (ENABLE_BREAKABLE) && defined (BREAKABLE_WALKABLE)\n 474: \t\t\t\t\tif (at1 & 16) { breakable_break (cx1, cy1 - 1); pnotsafe = 1; }\n 475: \t\t\t\t\tif (cx1 != cx2 && (at2 & 16)) { breakable_break (cx2, cy1 - 1); pnotsafe = 1; }\n 476 \t\t\t\t#endif\n 477 \n ...\n 908 \t\t\tcy1 = (phittery + 4 - 16) >> 4;\n 909 \t\t\tif (ATTR(cx1, cy1) & 16) {\n 910: \t\t\t\tbreakable_break (cx1, cy1);\n 911 \t\t\t\tpfrozen = PLAYER_FROZEN_FRAMES;\n 912 \t\t\t\tphitteract = 0;\n\nD:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev\\engine\\playermods\\bullets.h:\n 118 \t\t\t#ifdef ENABLE_BREAKABLE\n 119 \t\t\t\tif (rdm & 16) {\n 120: \t\t\t\t\tbreakable_break (cx1, cy1);\n 121 \t\t\t\t\tbullets_destroy ();\n 122 \t\t\t\t} else\n\n7 matches across 4 files\n\n\nSearching 124 files for \"brk_buff\"\n\nD:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev\\engine\\breakable.h:\n 26 \tgpaux = COORDS (x, y);\n 27 \t#ifndef BREAKABLES_SOFT\n 28: \t\tif (brk_buff [gpaux] < BREAKABLE_LIFE) {\n 29: \t\t\t++ brk_buff [gpaux];\n 30 \t\t} else \n 31 \t#endif\n\nD:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev\\engine\\mapmods\\map_renderer_complex.h:\n 217 \n 218 \t\t#if defined (ENABLE_BREAKABLE) && !defined (BREAKABLES_SOFT)\n 219: \t\t\tbrk_buff [rdm] = 1;\n 220 \t\t#endif\n 221 \n\nD:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev\\engine\\mapmods\\map_renderer_fast.h:\n 8 \tmap_attr [rdm] = c_behs [rdt];\n 9 \t#if defined (ENABLE_BREAKABLE) && !defined (BREAKABLES_SOFT)\n 10: \t\tbrk_buff [rdm] = 1;\n 11 \t#endif\n 12 \n\nD:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev\\ram\\bss.h:\n 120 #ifdef ENABLE_BREAKABLE\n 121 #ifndef BREAKABLES_SOFT\n 122: unsigned char brk_buff [192]; // A \"life gauge\" for each tile on screen, used when BREAKABLES_SOFT is unset.\n 123 #endif\n 124 #ifdef BREAKABLE_ANIM\n\n5 matches across 4 files\n", + "settings": + { + "buffer_size": 2669, + "line_ending": "Windows", + "name": "Find Results", + "scratch": true + } + }, + { + "file": "wip/diario.md", + "settings": + { + "buffer_size": 177128, + "encoding": "UTF-8", + "line_ending": "Windows" + } + }, + { + "file": "testers/05_tester_tile_get/dev/config.h", + "settings": + { + "buffer_size": 23046, + "line_ending": "Windows" + } } ], "build_system": "", @@ -614,13 +660,48 @@ "expanded_folders": [ "/D/git/MK1_NES", + "/D/git/MK1_NES/docs", "/D/git/MK1_NES/testers", - "/D/git/MK1_NES/testers/03_tester_interactives", - "/D/git/MK1_NES/testers/03_tester_interactives/dev", - "/D/git/MK1_NES/testers/03_tester_interactives/script" + "/D/git/MK1_NES/testers/05_tester_tile_get", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/mainloop" ], "file_history": [ + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/game.c", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/pres.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/config.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/levelset.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/mainloop.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/mainloop.h.bak", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/somari.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_routines.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_vars.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_checks.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_inits.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_modules.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/spritedata.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/enengine.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/effects.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/map_renderer_customization.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/chr_rom_maps.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/metasprites.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/compile.bat", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/behs.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/gfx/import_patterns0.spt", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/custom_flickscreen.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/enem_constants.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/enems/updr.bat", + "/D/git/MK1_NES/testers/05_tester_tile_get/map/maplist.txt", + "/D/git/MK1_NES/docs/engine_config.md", + "/D/git/MK1_NES/testers/04_tester_warp_to_level/dev/mainloop.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/player.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/player_frame_selector.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/gfx/import_patterns1.spt", + "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/custom_center_detections.h", + "/D/git/MK1_NES/testers/05_tester_tile_get/README.md", "/D/git/MK1_NES/testers/03_tester_interactives/dev/engine/playermods/scripting.h", "/D/git/MK1_NES/testers/03_tester_interactives/dev/mainloop.h", "/D/git/MK1_NES/testers/03_tester_interactives/dev/assets/mscnes.h", @@ -643,54 +724,32 @@ "/D/git/MK1_NES/testers/02_tester_punchy/dev/engine/player.h", "/D/git/MK1_NES/wip/multicopy.bas", "/D/git/MK1_NES/testers/00_tester_sideview/dev/config.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/config.h", "/D/git/MK1_NES/examples/08_cheril_the_writer/dev/config.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_routines.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/README.md", - "/D/git/MK1_NES/testers/05_tester_tile_get/gfx/import_patterns0.spt", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/compile.bat", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/pres.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/game.c", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/behs.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/effects.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/map/maplist.txt", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/levelset.h", "/D/git/newspectrum/SirAbabol_project/SirAbabol_R/dev/util/system_cpc.h", "/D/git/MK1_NES/testers/05_tester_tile_get/script/enembehs.spt", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/palettes.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/metasprites.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_checks.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/on_entering_screen.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/printer.h", "/D/git/MK1_NES/src/utils/rle44mapchrrom.bas", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/chr_rom_maps.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/mainloop.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/neslib.s", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/mapmods/map_renderer_complex.h", "/D/git/MK1_NES/src/dev/engine/printer.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_inits.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/enem_constants.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/ram/bss.h", "/D/git/MK1_NES/wip/diario.md", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/enengine.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/compiled_enems.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_vars.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/on_timer_tick.h", "/D/git/MK1_NES/docs/code_injection.md", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/mainloop/hotspots.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/on_interactive.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/mainloop/timer.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/map_renderer_customization.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extern.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/precalcs.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/enemmods/enem_boioiong.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/enemmods/enem_compiled.h", "/D/git/MK1_NES/examples/07_cheril_perils_classic/dev/engine/enengine.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/prototypes.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/custom_flickscreen.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/enemmods/enem_catacrock.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/autodefs.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/player.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/hotspots.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/enem_index.h", "/D/git/MK1_NES/src/dev/config.h", @@ -702,7 +761,6 @@ "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/enemmods/enem_pursuers.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/enemmods/enem_saw.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/mainloop/flickscreen.h", - "/D/git/MK1_NES/docs/engine_config.md", "/D/git/MK1_NES/src/utils/pencompiler.bas", "/D/git/MK1_NES/docs/features.md", "/D/git/MK1_NES/src/dev/autodefs.h", @@ -711,11 +769,9 @@ "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/enemmods/enem_timed_fanty.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/general.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/engine/enemmods/enem_fanty.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/assets/spritedata.h", "/D/git/MK1_NES/examples/11_bootèe/dev/autodefs.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/game_frame.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/ring.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/player_frame_selector.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/on_player_spike.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/on_player_coco.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/definitions.h", @@ -726,12 +782,9 @@ "/D/git/MK1_NES/testers/02_tester_punchy/dev/mainloop/relocate_player.h", "/D/git/MK1_NES/testers/02_tester_punchy/dev/mainloop.h", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_hud_update.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/dev/my/extra_modules.h", "/D/git/MK1_NES/examples/07_cheril_perils_classic/dev/engine/general.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/enems/updr.bat", "/D/git/MK1_NES/testers/05_tester_tile_get/trash/eneupdr.bas", "/D/git/MK1_NES/testers/05_tester_tile_get/dev/work/enems3.h", - "/D/git/MK1_NES/testers/05_tester_tile_get/gfx/import_patterns1.spt", "/D/git/MK1_NES/src/utils/fillto.bas", "/D/git/MK1_NES/src/utils/rle53mapchrrom.bas", "/D/git/MK1_NES/src/dev/my/on_tile_got.h", @@ -744,11 +797,7 @@ "/D/git/MK1_NES/src/dev/neslib.h", "/D/git/MK1_NES/src/dev/assets/behs.h", "/D/git/MK1_NES/testers/04_tester_warp_to_level/dev/crt0.s", - "/D/git/MK1_NES/testers/04_tester_warp_to_level/dev/nes.cfg", - "/D/git/MK1_NES/testers/04_tester_warp_to_level/dev/nes-CNROM.cfg", - "/D/git/MK1_NES/src/dev/my/extra_hotspots.h", - "/D/git/MK1_NES/wip/roadmap.md", - "/D/git/MK1_NES/src/dev/mainloop/hotspots.h" + "/D/git/MK1_NES/testers/04_tester_warp_to_level/dev/nes.cfg" ], "find": { @@ -759,6 +808,7 @@ "height": 108.0, "where_history": [ + "D:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev", "D:\\git\\MK1_NES\\testers\\02_tester_punchy\\dev", "D:\\git\\MK1_NES\\src", "D:\\git\\MK1_NES\\testers\\05_tester_tile_get\\dev", @@ -837,6 +887,18 @@ "case_sensitive": false, "find_history": [ + "brk_buff", + "breakable_break", + "do_process_breakable", + "MAP_CLEAR_LIST_ADDRESS", + "OAM_FIRST", + "0x2c20", + "tile_got", + "pres", + "spr_enems", + "spr_enems5", + "0xff", + "warper", "player_render", "warp_to_", "pal_col", @@ -952,19 +1014,7 @@ "on_tile_got", "chrrom", "phit", - "explosion", - "_a", - "assets", - "..\\utils\\", - "rdd", - "vram_read", - "vram_write", - "bitmask", - "set_map_tile", - "conveyor", - "NEEDS_INITIAL_DETECTION", - "NEED_", - "cx1" + "explosion" ], "highlight": true, "in_selection": false, @@ -972,6 +1022,8 @@ "regex": false, "replace_history": [ + "MAP_CLEAR_LIST_ADDRESS", + "spr_enems4", "pals", "bubble_y", "bubble_x", @@ -1019,24 +1071,24 @@ "groups": [ { - "selected": 0, + "selected": 3, "sheets": [ { "buffer": 0, - "file": "testers/03_tester_interactives/dev/mainloop.h", - "semi_transient": true, + "file": "testers/05_tester_tile_get/dev/engine/breakable.h", + "semi_transient": false, "settings": { - "buffer_size": 8312, + "buffer_size": 1203, "regions": { }, "selection": [ [ - 7275, - 7288 + 622, + 630 ] ], "settings": @@ -1044,7 +1096,48 @@ "WordCount": { "changes": 0, - "count": 711, + "count": 127, + "modified": false, + "selection": false, + "status": -1, + "syntax": "plain text" + }, + "incomplete_sync": null, + "remote_loading": false, + "synced": false, + "syntax": "Packages/C++/C++.sublime-syntax", + "translate_tabs_to_spaces": false + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 4, + "type": "text" + }, + { + "buffer": 1, + "file": "testers/05_tester_tile_get/dev/mainloop.h", + "semi_transient": false, + "settings": + { + "buffer_size": 8439, + "regions": + { + }, + "selection": + [ + [ + 2289, + 2289 + ] + ], + "settings": + { + "WordCount": + { + "changes": 22, + "count": 715, "modified": false, "selection": false, "status": -1, @@ -1057,11 +1150,193 @@ "translate_tabs_to_spaces": false }, "translation.x": 0.0, - "translation.y": 4840.0, + "translation.y": 1278.0, + "zoom_level": 1.0 + }, + "stack_index": 2, + "type": "text" + }, + { + "buffer": 2, + "file": "/D/Google Drive/Maritrini/dev/cpc/Nanako Descends to Hell/dev/ndthcpc.c", + "semi_transient": false, + "settings": + { + "buffer_size": 29088, + "regions": + { + }, + "selection": + [ + [ + 288, + 295 + ] + ], + "settings": + { + "WordCount": + { + "changes": 0, + "count": 2948, + "modified": false, + "selection": false, + "status": -1, + "syntax": "plain text" + }, + "incomplete_sync": null, + "remote_loading": false, + "synced": false, + "syntax": "Packages/C Improved/C Improved.tmLanguage", + "translate_tabs_to_spaces": false + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 1, + "type": "text" + }, + { + "buffer": 3, + "file": "/D/Google Drive/Maritrini/dev/cpc/Nanako Descends to Hell/dev/paletas.h", + "semi_transient": false, + "settings": + { + "buffer_size": 1762, + "regions": + { + }, + "selection": + [ + [ + 1762, + 1762 + ] + ], + "settings": + { + "WordCount": + { + "changes": 0, + "count": 307, + "modified": false, + "selection": false, + "status": -1, + "syntax": "plain text" + }, + "incomplete_sync": null, + "remote_loading": false, + "synced": false, + "syntax": "Packages/C++/C++.sublime-syntax", + "translate_tabs_to_spaces": false + }, + "translation.x": 0.0, + "translation.y": 507.0, "zoom_level": 1.0 }, "stack_index": 0, "type": "text" + }, + { + "buffer": 4, + "semi_transient": false, + "settings": + { + "buffer_size": 2669, + "regions": + { + "match": + { + "flags": 112, + "regions": + [ + [ + 250, + 265 + ], + [ + 511, + 526 + ], + [ + 715, + 730 + ], + [ + 988, + 1003 + ], + [ + 1080, + 1095 + ], + [ + 1250, + 1265 + ], + [ + 1497, + 1512 + ], + [ + 1781, + 1789 + ], + [ + 1831, + 1839 + ], + [ + 2055, + 2063 + ], + [ + 2299, + 2307 + ], + [ + 2495, + 2503 + ] + ], + "scope": "" + } + }, + "selection": + [ + [ + 2242, + 2258 + ] + ], + "settings": + { + "WordCount": + { + "changes": 13, + "count": 198, + "modified": false, + "selection": false, + "status": -1, + "syntax": "plain text" + }, + "detect_indentation": false, + "incomplete_sync": null, + "line_numbers": false, + "output_tag": 2, + "result_base_dir": "", + "result_file_regex": "^([^ \t].*):$", + "result_line_regex": "^ +([0-9]+):", + "scroll_past_end": true, + "syntax": "Packages/Default/Find Results.hidden-tmLanguage" + }, + "translation.x": 0.0, + "translation.y": 689.0, + "zoom_level": 1.0 + }, + "stack_index": 5, + "type": "text" } ] }, @@ -1070,28 +1345,70 @@ "sheets": [ { - "buffer": 1, - "file": "testers/04_tester_warp_to_level/dev/mainloop.h", + "buffer": 5, + "file": "wip/diario.md", "semi_transient": false, "settings": { - "buffer_size": 8332, + "buffer_size": 177128, "regions": { }, "selection": [ [ - 7295, - 7295 + 176477, + 176477 ] ], "settings": { "WordCount": { - "changes": 2, - "count": 712, + "changes": 2556, + "count": 25024, + "modified": false, + "selection": false, + "status": -1, + "syntax": "plain text" + }, + "incomplete_sync": null, + "remote_loading": false, + "synced": false, + "syntax": "Packages/Markdown Extended/Syntaxes/Markdown Extended.sublime-syntax", + "tab_size": 4, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 78466.0, + "zoom_level": 1.0 + }, + "stack_index": 3, + "type": "text" + }, + { + "buffer": 6, + "file": "testers/05_tester_tile_get/dev/config.h", + "semi_transient": false, + "settings": + { + "buffer_size": 23046, + "regions": + { + }, + "selection": + [ + [ + 5616, + 5616 + ] + ], + "settings": + { + "WordCount": + { + "changes": 0, + "count": 2133, "modified": false, "selection": false, "status": -1, @@ -1104,10 +1421,10 @@ "translate_tabs_to_spaces": false }, "translation.x": 0.0, - "translation.y": 4840.0, + "translation.y": 1538.0, "zoom_level": 1.0 }, - "stack_index": 1, + "stack_index": 6, "type": "text" } ] @@ -1163,7 +1480,7 @@ "project": "mk1_nes.sublime-project", "replace": { - "height": 50.0 + "height": 74.0 }, "save_all_on_build": true, "select_file": diff --git a/src/dev/autodefs.h b/src/dev/autodefs.h index 30189bc..a1a70d4 100644 --- a/src/dev/autodefs.h +++ b/src/dev/autodefs.h @@ -106,3 +106,8 @@ #if defined (ENABLE_FANTY) || defined (ENABLE_HOMING_FANTY) || defined (ENABLE_TIMED_FANTY) || defined (ENABLE_BOIOIONG) || defined (ENABLE_CATACROCKS) #define ENEMS_NEED_FP #endif + +#if defined (PLAYER_TOP_DOWN) && defined (NO_HORIZONTAL_EVIL_TILE) + #undef NO_HORIZONTAL_EVIL_TILE +#endif + diff --git a/src/dev/config.h b/src/dev/config.h index 3ac4d0c..8ef0c87 100644 --- a/src/dev/config.h +++ b/src/dev/config.h @@ -6,6 +6,10 @@ //#define GAME_AREA_BOTTOM //#define GAME_AREA_CUSTOM +#define MAP_CLEAR_LIST_ADDRESS 0x2c40 // To store map persistence in VRAM. + // Each screen takes 24 bytes. move it where + // It fits. Below 2c40 you may "see" the buffer + // ============================================================================ // I. General configuration // ============================================================================ @@ -134,7 +138,7 @@ // Extra special tiles // ------------------- -#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically +//#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically //#define CUSTOM_CENTER_DETECTIONS // Define this if you need custom tile behs // Quicksands, beh == 2. diff --git a/src/dev/engine/enengine.h b/src/dev/engine/enengine.h index 2bad72d..6b60bae 100644 --- a/src/dev/engine/enengine.h +++ b/src/dev/engine/enengine.h @@ -965,7 +965,7 @@ void enems_move (void) { #endif if (en_sg_2) { pkill = 1; - #ifdef PLAYER_BOUNCES + #if defined (PLAYER_BOUNCES) && !defined (DIE_AND_RESPAWN) pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); diff --git a/src/dev/engine/player.h b/src/dev/engine/player.h index 28914d7..8cd006d 100644 --- a/src/dev/engine/player.h +++ b/src/dev/engine/player.h @@ -106,8 +106,9 @@ void player_to_pixels (void) { } void player_kill (void) { + oam_index = oam_index_player; player_render (); - update_cycle (); + ppu_waitnmi (); pkill = phit = 0; sfx_play (SFX_PHIT, 0); @@ -199,6 +200,7 @@ void player_move (void) { #endif hitv = hith = 0; + pcx = prx; pcy = pry; pnotsafe = 0; #ifdef ENABLE_SLIPPERY pice = 0; @@ -565,7 +567,7 @@ void player_move (void) { #endif if (pad0 & PAD_A) { if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (32 - (pctj)); + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; ++ pctj; if (pctj == 16) pj = 0; } @@ -725,7 +727,7 @@ void player_move (void) { if (cy2 != cy3) if (at3 & 2) player_process_tile (at3, cx1, cy3, rdm, cy3); #endif } else { - hith = ((at1 & 1) || (at2 & 1) || (at3 & 1)); + hith = ((at1 & 1) || (at2 & 1) || (at3 & 1)); } #else cm_two_points (); @@ -741,6 +743,7 @@ void player_move (void) { hith = ((at1 & 1) || (at2 & 1)); } #endif + if (pvy > 0) hith &= ((pry & 15) > 4); } // Facing @@ -772,10 +775,17 @@ void player_move (void) { if (pgotten == 0) { #ifdef NO_HORIZONTAL_EVIL_TILE - if (hitv || hith) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } #else - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); } + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } #endif #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) diff --git a/src/dev/mainloop.h b/src/dev/mainloop.h index e74325b..79c7b2f 100644 --- a/src/dev/mainloop.h +++ b/src/dev/mainloop.h @@ -97,7 +97,7 @@ void game_init (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Clear tile_got persistence - vram_adr (0x2c20); + vram_adr (MAP_CLEAR_LIST_ADDRESS); vram_fill (0, MAP_SIZE*24); #endif @@ -120,12 +120,15 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Update tile_got persistence rda = on_pant << 3; - vram_write (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif } else { ft = 0; ppu_off (); } + + clear_update_list (); + #ifdef ENABLE_PROPELLERS // Clear propellers prp_idx = 0; @@ -161,7 +164,7 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Read tile_got persistence rda = n_pant << 3; - vram_read (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif draw_scr (); @@ -352,6 +355,16 @@ void game_loop (void) { #include "mainloop/interactives.h" #endif + // Update / collide hotspots + + #include "mainloop/hotspots.h" + + // Automatic scripting calls (USE_ANIM & fire zone) + + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" + #endif + // Update player if (!warp_to_level) { @@ -378,16 +391,6 @@ void game_loop (void) { if (propellers_on) propellers_do (); #endif - // Update / collide hotspots - - #include "mainloop/hotspots.h" - - // Automatic scripting calls (USE_ANIM & fire zone) - - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" - #endif - // Update bullets #ifdef PLAYER_CAN_FIRE @@ -402,6 +405,7 @@ void game_loop (void) { // Paint player + oam_index_player = oam_index; if (!warp_to_level) player_render (); // Update enemies diff --git a/src/dev/ram/bss.h b/src/dev/ram/bss.h index 06fd516..78c44e8 100644 --- a/src/dev/ram/bss.h +++ b/src/dev/ram/bss.h @@ -52,6 +52,8 @@ unsigned char oobjs; // Player items, last frame value (used unsigned char oammo; // Player ammo, last frame value (used to detect changes) unsigned char okilled; // Player # of killed enems., last frame value (used to detect changes) +unsigned char oam_index_player; // Index copy + // Custom hotspot type star (used as an extra collectible). #ifdef HOTSPOT_TYPE_STAR diff --git a/src/dev/ram/zp.h b/src/dev/ram/zp.h index 462136d..e4da55b 100644 --- a/src/dev/ram/zp.h +++ b/src/dev/ram/zp.h @@ -40,7 +40,7 @@ unsigned char caux; // Auxiliar variable // Sprite related (neslib) -unsigned char oam_index, oam_index_aux; +unsigned char oam_index; // Enemies @@ -92,6 +92,7 @@ unsigned char vertical_engine_type; // Player engine type. Se ENGINE_TYPE_* signed int px, py; // Player X, Y coordinates, fixed point 10.6 signed int pvx, pvy; // Player VX, VY velocities, fixed point 10.6 unsigned char prx, pry; // Player pixel coordinates, calculated from px, py. +unsigned char pcx, pcy; // Coordinates prior to movement. unsigned char pfacing; // Player facing left, right unsigned char pfr; // Player frame unsigned char pctfr; // Player counter (for animation) diff --git a/src/ogt/sounds.s b/src/ogt/sounds.s index 0e035ec..618542a 100644 --- a/src/ogt/sounds.s +++ b/src/ogt/sounds.s @@ -22,6 +22,8 @@ sounds: .word @sfx_ntsc_15 .word @sfx_ntsc_16 .word @sfx_ntsc_17 + .word @sfx_ntsc_18 + .word @sfx_ntsc_19 @sfx_ntsc_0: .byte $80,$3f,$81,$d5,$82,$00,$03,$81,$6a,$03,$80,$32,$81,$d5,$03,$81 @@ -89,3 +91,16 @@ sounds: .byte $00 @sfx_ntsc_17: .byte $89,$3f,$8a,$0c,$06,$89,$38,$08,$89,$34,$08,$89,$32,$08,$00 +@sfx_ntsc_18: + .byte $80,$7a,$81,$54,$82,$00,$03,$81,$46,$03,$81,$34,$0c,$80,$78,$03 + .byte $80,$74,$03,$00 +@sfx_ntsc_19: + .byte $80,$3f,$81,$d5,$82,$00,$83,$3f,$84,$a9,$85,$00,$86,$81,$87,$1c + .byte $88,$01,$08,$80,$30,$83,$30,$02,$80,$3f,$83,$3f,$02,$80,$30,$83 + .byte $30,$03,$80,$3f,$83,$3f,$02,$80,$30,$83,$30,$03,$80,$3f,$83,$3f + .byte $07,$80,$30,$02,$80,$3f,$81,$bd,$84,$9f,$87,$fd,$88,$00,$07,$80 + .byte $30,$83,$30,$03,$80,$3f,$81,$d5,$83,$3f,$84,$a9,$87,$1c,$88,$01 + .byte $07,$80,$30,$83,$30,$02,$80,$3f,$81,$bd,$83,$3f,$84,$9f,$87,$fd + .byte $88,$00,$08,$80,$30,$83,$30,$02,$80,$3f,$81,$a9,$83,$3f,$84,$8e + .byte $87,$d5,$30,$80,$30,$83,$30,$86,$00,$0a,$80,$3f,$81,$ab,$82,$01 + .byte $07,$00 diff --git a/testers/00_tester_sideview/dev/cart.nes b/testers/00_tester_sideview/dev/cart.nes index f9a23905d5621445e3f9348e93529b21c97179aa..b5ff990f320ebc109f5a7d2a23b8d0eaac72fe91 100644 GIT binary patch delta 13466 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 Od*&Rzc~4S>L;7zoVsm={ delta 13342 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 LO?xuR?ehNs)Zu47 diff --git a/testers/00_tester_sideview/dev/config.h b/testers/00_tester_sideview/dev/config.h index d83aa36..8a85492 100644 --- a/testers/00_tester_sideview/dev/config.h +++ b/testers/00_tester_sideview/dev/config.h @@ -6,6 +6,10 @@ //#define GAME_AREA_BOTTOM //#define GAME_AREA_CUSTOM +#define MAP_CLEAR_LIST_ADDRESS 0x2c40 // To store map persistence in VRAM. + // Each screen takes 24 bytes. move it where + // It fits. Below 2c40 you may "see" the buffer + // ============================================================================ // I. General configuration // ============================================================================ @@ -134,7 +138,7 @@ // Extra special tiles // ------------------- -#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically +//#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically //#define CUSTOM_CENTER_DETECTIONS // Define this if you need custom tile behs // Quicksands, beh == 2. diff --git a/testers/00_tester_sideview/dev/engine/enengine.h b/testers/00_tester_sideview/dev/engine/enengine.h index 4c1b093..6b60bae 100644 --- a/testers/00_tester_sideview/dev/engine/enengine.h +++ b/testers/00_tester_sideview/dev/engine/enengine.h @@ -772,6 +772,7 @@ void enems_move (void) { n_pant = _en_mx; on_pant = 0xff; prx = _en_x2; px = prx << FIXBITS; pry = _en_y2; py = pry << FIXBITS; + player_stop (); #if defined (SIMPLE_WARPERS_FIRE_BUTTON) && (defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS)) phitteract = 0; @@ -817,6 +818,10 @@ void enems_move (void) { pvy = 0; } } + + #ifdef PLAYER_SPINS + if (pgotten) pspin = 0; + #endif #endif // Is enemy collidable? If not, exit @@ -960,7 +965,7 @@ void enems_move (void) { #endif if (en_sg_2) { pkill = 1; - #ifdef PLAYER_BOUNCES + #if defined (PLAYER_BOUNCES) && !defined (DIE_AND_RESPAWN) pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); diff --git a/testers/00_tester_sideview/dev/engine/player.h b/testers/00_tester_sideview/dev/engine/player.h index 28914d7..8cd006d 100644 --- a/testers/00_tester_sideview/dev/engine/player.h +++ b/testers/00_tester_sideview/dev/engine/player.h @@ -106,8 +106,9 @@ void player_to_pixels (void) { } void player_kill (void) { + oam_index = oam_index_player; player_render (); - update_cycle (); + ppu_waitnmi (); pkill = phit = 0; sfx_play (SFX_PHIT, 0); @@ -199,6 +200,7 @@ void player_move (void) { #endif hitv = hith = 0; + pcx = prx; pcy = pry; pnotsafe = 0; #ifdef ENABLE_SLIPPERY pice = 0; @@ -565,7 +567,7 @@ void player_move (void) { #endif if (pad0 & PAD_A) { if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (32 - (pctj)); + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; ++ pctj; if (pctj == 16) pj = 0; } @@ -725,7 +727,7 @@ void player_move (void) { if (cy2 != cy3) if (at3 & 2) player_process_tile (at3, cx1, cy3, rdm, cy3); #endif } else { - hith = ((at1 & 1) || (at2 & 1) || (at3 & 1)); + hith = ((at1 & 1) || (at2 & 1) || (at3 & 1)); } #else cm_two_points (); @@ -741,6 +743,7 @@ void player_move (void) { hith = ((at1 & 1) || (at2 & 1)); } #endif + if (pvy > 0) hith &= ((pry & 15) > 4); } // Facing @@ -772,10 +775,17 @@ void player_move (void) { if (pgotten == 0) { #ifdef NO_HORIZONTAL_EVIL_TILE - if (hitv || hith) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } #else - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); } + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } #endif #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) diff --git a/testers/00_tester_sideview/dev/labels.txt b/testers/00_tester_sideview/dev/labels.txt index e501268..ed26e03 100644 --- a/testers/00_tester_sideview/dev/labels.txt +++ b/testers/00_tester_sideview/dev/labels.txt @@ -7,94 +7,94 @@ crt0.o: VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 002000 game.o: - CODE Offs = 000000 Size = 0030B2 + CODE Offs = 000000 Size = 003146 RODATA Offs = 00052A Size = 0007D7 - BSS Offs = 000000 Size = 0003A2 - ZEROPAGE Offs = 000000 Size = 0000B1 + BSS Offs = 000000 Size = 0003A3 + ZEROPAGE Offs = 000000 Size = 0000B2 runtime.lib(add.o): - CODE Offs = 0030B2 Size = 00001A + CODE Offs = 003146 Size = 00001A runtime.lib(addysp.o): - CODE Offs = 0030CC Size = 00000E + CODE Offs = 003160 Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 0030DA Size = 00000B + CODE Offs = 00316E Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 0030E5 Size = 00000E + CODE Offs = 003179 Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 0030F3 Size = 000011 + CODE Offs = 003187 Size = 000011 runtime.lib(asrax1.o): - CODE Offs = 003104 Size = 00000A + CODE Offs = 003198 Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 00310E Size = 00000F + CODE Offs = 0031A2 Size = 00000F runtime.lib(asrax3.o): - CODE Offs = 00311D Size = 000014 + CODE Offs = 0031B1 Size = 000014 runtime.lib(asrax4.o): - CODE Offs = 003131 Size = 000019 + CODE Offs = 0031C5 Size = 000019 runtime.lib(bneg.o): - CODE Offs = 00314A Size = 00000E + CODE Offs = 0031DE Size = 00000E runtime.lib(copydata.o): - CODE Offs = 003158 Size = 00002D + CODE Offs = 0031EC Size = 00002D runtime.lib(decsp2.o): - CODE Offs = 003185 Size = 00000D + CODE Offs = 003219 Size = 00000D runtime.lib(decsp3.o): - CODE Offs = 003192 Size = 00000D + CODE Offs = 003226 Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 00319F Size = 00000D + CODE Offs = 003233 Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 0031AC Size = 00000D + CODE Offs = 003240 Size = 00000D runtime.lib(icmp.o): - CODE Offs = 0031B9 Size = 00002E + CODE Offs = 00324D Size = 00002E runtime.lib(incsp2.o): - CODE Offs = 0031E7 Size = 000016 + CODE Offs = 00327B Size = 000016 runtime.lib(incsp3.o): - CODE Offs = 0031FD Size = 000005 + CODE Offs = 003291 Size = 000005 runtime.lib(incsp4.o): - CODE Offs = 003202 Size = 000005 + CODE Offs = 003296 Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 003207 Size = 000005 + CODE Offs = 00329B Size = 000005 runtime.lib(ldai.o): - CODE Offs = 00320C Size = 00000C + CODE Offs = 0032A0 Size = 00000C runtime.lib(makebool.o): - CODE Offs = 003218 Size = 000031 + CODE Offs = 0032AC Size = 000031 runtime.lib(mul8.o): - CODE Offs = 003249 Size = 00003A + CODE Offs = 0032DD Size = 00003A runtime.lib(neg.o): - CODE Offs = 003283 Size = 00000E + CODE Offs = 003317 Size = 00000E runtime.lib(or.o): - CODE Offs = 003291 Size = 000012 + CODE Offs = 003325 Size = 000012 runtime.lib(popa.o): - CODE Offs = 0032A3 Size = 00000C + CODE Offs = 003337 Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 0032AF Size = 000010 + CODE Offs = 003343 Size = 000010 runtime.lib(pusha.o): - CODE Offs = 0032BF Size = 000016 + CODE Offs = 003353 Size = 000016 runtime.lib(pushax.o): - CODE Offs = 0032D5 Size = 00001A + CODE Offs = 003369 Size = 00001A runtime.lib(shl.o): - CODE Offs = 0032EF Size = 00002B + CODE Offs = 003383 Size = 00002B runtime.lib(shrax3.o): - CODE Offs = 00331A Size = 00000E + CODE Offs = 0033AE Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 003328 Size = 000011 + CODE Offs = 0033BC Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 003339 Size = 000016 + CODE Offs = 0033CD Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 00334F Size = 00000B + CODE Offs = 0033E3 Size = 00000B runtime.lib(staxspi.o): - CODE Offs = 00335A Size = 00001B + CODE Offs = 0033EE Size = 00001B runtime.lib(sub.o): - CODE Offs = 003375 Size = 000015 + CODE Offs = 003409 Size = 000015 runtime.lib(subeqsp.o): - CODE Offs = 00338A Size = 000015 + CODE Offs = 00341E Size = 000015 runtime.lib(subysp.o): - CODE Offs = 00339F Size = 00000D + CODE Offs = 003433 Size = 00000D runtime.lib(udiv.o): - CODE Offs = 0033AC Size = 00004F + CODE Offs = 003440 Size = 00004F runtime.lib(umod.o): - CODE Offs = 0033FB Size = 000011 + CODE Offs = 00348F Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000B1 Size = 00001A + ZEROPAGE Offs = 0000B2 Size = 00001A Segment list: @@ -103,23 +103,23 @@ Name Start End Size -------------------------------------------- CHARS 000000 001FFF 002000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000F2 0000CB -BSS 000300 0006A1 0003A2 +ZEROPAGE 000028 0000F3 0000CC +BSS 000300 0006A2 0003A3 STARTUP 008000 008CB1 000CB2 INIT 008CB2 008CD4 000023 -CODE 008CD5 00C0E0 00340C -RODATA 00C0E1 00CDE1 000D01 +CODE 008CD5 00C174 0034A0 +RODATA 00C175 00CE75 000D01 VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 0003A2 REA -__DATA_LOAD__ 00CDE2 RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 0003A3 REA +__DATA_LOAD__ 00CE76 RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA _bank_bg 008416 RLA _bank_spr 008406 RLA -_delay 0085BB RLA _main 00BD55 RLA +_delay 0085BB RLA _main 00BDE9 RLA _memfill 00858C RLA _music_pause 0087A1 REA _music_play 008734 REA _music_stop 0086F6 REA _oam_clear 0082AF RLA _oam_hide_rest 008341 RLA @@ -132,36 +132,36 @@ _rand8 0084FA RLA _scroll 0083A7 RLA _set_vram_update 008510 RLA _sfx_play 00848A RLA _vram_adr 00851A RLA _vram_fill 008525 RLA _vram_put 008521 RLA _vram_write 00845A RLA -addysp 00BDA2 RLA addysp1 00BDA1 RLA -aslax2 00BDAF RLA aslax3 00BDBA RLA -aslax4 00BDC8 RLA asrax1 00BDD9 RLA -asrax2 00BDE3 RLA asrax3 00BDF2 RLA -asrax4 00BE06 RLA bnega 00BE23 RLA -booleq 00BEF3 RLA boolne 00BEED RLA -boolult 00BF0B RLA copydata 00BE2D RLA -decsp2 00BE5A RLA decsp3 00BE67 RLA -decsp4 00BE74 RLA decsp8 00BE81 RLA -incsp2 00BEC4 RLA incsp3 00BED2 RLA -incsp4 00BED7 RLA incsp8 00BEDC RLA -ldaidx 00BEE1 RLA negax 00BF58 RLA -popa 00BF78 RLA popax 00BEBC RLA -popsreg 00BF84 RLA ptr1 0000E1 RLZ -ptr2 0000E3 RLZ ptr4 0000E7 RLZ -push0 00BFAA RLA pusha 00BF98 RLA -pusha0 00BFAC RLA pushax 00BFAE RLA -regsave 0000DD RLZ shlax2 00BDAF RLA -shlax4 00BDC8 RLA shrax3 00BFEF RLA -shrax4 00BFFD RLA sp 0000D9 RLZ -sreg 0000DB RLZ staspidx 00C00E RLA -stax0sp 00C024 RLA staxspidx 00C02F RLA -subeq0sp 00C05F RLA subeqysp 00C061 RLA -subysp 00C074 RLA tmp1 0000E9 RLZ -tosaddax 00BD89 RLA tosaslax 00BFC4 RLA -tosicmp 00BE90 RLA tosicmp0 00BE8E RLA -tosorax 00BF68 RLA tossuba0 00C04A RLA -tossubax 00C04C RLA tosudiva0 00C081 RLA -tosumoda0 00C0D0 RLA tosumula0 00BF1E RLA -udiv16 00C092 RLA zerobss 008CB2 RLA +addysp 00BE36 RLA addysp1 00BE35 RLA +aslax2 00BE43 RLA aslax3 00BE4E RLA +aslax4 00BE5C RLA asrax1 00BE6D RLA +asrax2 00BE77 RLA asrax3 00BE86 RLA +asrax4 00BE9A RLA bnega 00BEB7 RLA +booleq 00BF87 RLA boolne 00BF81 RLA +boolult 00BF9F RLA copydata 00BEC1 RLA +decsp2 00BEEE RLA decsp3 00BEFB RLA +decsp4 00BF08 RLA decsp8 00BF15 RLA +incsp2 00BF58 RLA incsp3 00BF66 RLA +incsp4 00BF6B RLA incsp8 00BF70 RLA +ldaidx 00BF75 RLA negax 00BFEC RLA +popa 00C00C RLA popax 00BF50 RLA +popsreg 00C018 RLA ptr1 0000E2 RLZ +ptr2 0000E4 RLZ ptr4 0000E8 RLZ +push0 00C03E RLA pusha 00C02C RLA +pusha0 00C040 RLA pushax 00C042 RLA +regsave 0000DE RLZ shlax2 00BE43 RLA +shlax4 00BE5C RLA shrax3 00C083 RLA +shrax4 00C091 RLA sp 0000DA RLZ +sreg 0000DC RLZ staspidx 00C0A2 RLA +stax0sp 00C0B8 RLA staxspidx 00C0C3 RLA +subeq0sp 00C0F3 RLA subeqysp 00C0F5 RLA +subysp 00C108 RLA tmp1 0000EA RLZ +tosaddax 00BE1D RLA tosaslax 00C058 RLA +tosicmp 00BF24 RLA tosicmp0 00BF22 RLA +tosorax 00BFFC RLA tossuba0 00C0DE RLA +tossubax 00C0E0 RLA tosudiva0 00C115 RLA +tosumoda0 00C164 RLA tosumula0 00BFB2 RLA +udiv16 00C126 RLA zerobss 008CB2 RLA @@ -243,116 +243,116 @@ addysp (addysp.o): incsp8.o incsp8.s(8) incsp4.o incsp4.s(8) incsp3.o incsp3.s(8) - game.o game.s(6304) + game.o game.s(6315) addysp1 (addysp.o): sub.o sub.s(8) or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(3200) - game.o game.s(3361) - game.o game.s(5135) - game.o game.s(6927) - game.o game.s(8273) - game.o game.s(8328) - game.o game.s(8363) - game.o game.s(9721) - game.o game.s(12420) + game.o game.s(3206) + game.o game.s(3367) + game.o game.s(5141) + game.o game.s(6946) + game.o game.s(8358) + game.o game.s(8413) + game.o game.s(8448) + game.o game.s(9806) + game.o game.s(12509) aslax3 (aslax3.o): - game.o game.s(3120) - game.o game.s(8372) + game.o game.s(3126) + game.o game.s(8457) aslax4 (aslax4.o): - game.o game.s(3060) - game.o game.s(3212) - game.o game.s(3373) - game.o game.s(3466) - game.o game.s(3940) - game.o game.s(4660) - game.o game.s(5134) - game.o game.s(6134) - game.o game.s(6645) - game.o game.s(6926) - game.o game.s(8272) - game.o game.s(8327) - game.o game.s(9720) - game.o game.s(12419) + game.o game.s(3066) + game.o game.s(3218) + game.o game.s(3379) + game.o game.s(3472) + game.o game.s(3946) + game.o game.s(4666) + game.o game.s(5140) + game.o game.s(6145) + game.o game.s(6656) + game.o game.s(6945) + game.o game.s(8357) + game.o game.s(8412) + game.o game.s(9805) + game.o game.s(12508) asrax1 (asrax1.o): - game.o game.s(3131) - game.o game.s(4448) - game.o game.s(8606) - game.o game.s(11022) + game.o game.s(3137) + game.o game.s(4454) + game.o game.s(8691) + game.o game.s(11107) asrax2 (asrax2.o): - game.o game.s(3114) - game.o game.s(4453) - game.o game.s(5605) - game.o game.s(5902) - game.o game.s(6836) - game.o game.s(9777) - game.o game.s(12180) + game.o game.s(3120) + game.o game.s(4459) + game.o game.s(5611) + game.o game.s(5908) + game.o game.s(6855) + game.o game.s(9862) + game.o game.s(12269) asrax3 (asrax3.o): - game.o game.s(7910) - game.o game.s(10133) + game.o game.s(7995) + game.o game.s(10218) asrax4 (asrax4.o): - game.o game.s(3732) - game.o game.s(4459) - game.o game.s(5604) - game.o game.s(5901) - game.o game.s(6835) - game.o game.s(8829) - game.o game.s(9776) - game.o game.s(12179) - game.o game.s(12368) + game.o game.s(3738) + game.o game.s(4465) + game.o game.s(5610) + game.o game.s(5907) + game.o game.s(6854) + game.o game.s(8914) + game.o game.s(9861) + game.o game.s(12268) + game.o game.s(12457) bnega (bneg.o): - game.o game.s(5730) - game.o game.s(7255) - game.o game.s(9262) + game.o game.s(5736) + game.o game.s(7274) + game.o game.s(9347) booleq (makebool.o): - game.o game.s(10162) + game.o game.s(10247) boolne (makebool.o): - game.o game.s(12857) + game.o game.s(12946) boolult (makebool.o): - game.o game.s(10141) + game.o game.s(10226) copydata (copydata.o): crt0.o crt0.s(26) decsp2 (decsp2.o): - game.o game.s(6663) - game.o game.s(7127) + game.o game.s(6674) + game.o game.s(7146) decsp3 (decsp3.o): - game.o game.s(2755) - game.o game.s(2913) - game.o game.s(4922) - game.o game.s(9305) - game.o game.s(11579) - game.o game.s(11962) + game.o game.s(2761) + game.o game.s(2919) + game.o game.s(4928) + game.o game.s(9390) + game.o game.s(11664) + game.o game.s(12047) decsp4 (decsp4.o): - game.o game.s(3907) - game.o game.s(5632) - game.o game.s(6586) + game.o game.s(3913) + game.o game.s(5638) + game.o game.s(6597) decsp8 (decsp8.o): - game.o game.s(11355) - game.o game.s(12553) + game.o game.s(11440) + game.o game.s(12642) incsp2 (incsp2.o): staxspi.o staxspi.s(8) staspidx.o staspidx.s(8) popsreg.o popsreg.s(8) - game.o game.s(3973) - game.o game.s(4690) + game.o game.s(3979) + game.o game.s(4696) incsp3 (incsp3.o): - game.o game.s(8030) + game.o game.s(8115) incsp4 (incsp4.o): - game.o game.s(4264) - game.o game.s(4339) + game.o game.s(4270) + game.o game.s(4345) incsp8 (incsp8.o): - game.o game.s(4152) + game.o game.s(4158) ldaidx (ldai.o): - game.o game.s(6553) + game.o game.s(6564) negax (neg.o): - game.o game.s(4275) - game.o game.s(4330) - game.o game.s(5240) - game.o game.s(7778) - game.o game.s(8333) - game.o game.s(8557) - game.o game.s(9489) + game.o game.s(4281) + game.o game.s(4336) + game.o game.s(5246) + game.o game.s(7812) + game.o game.s(8418) + game.o game.s(8642) + game.o game.s(9574) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -378,61 +378,61 @@ ptr4 (zeropage.o): udiv.o udiv.s(9) mul8.o mul8.s(10) push0 (pushax.o): - game.o game.s(6418) - game.o game.s(12456) - game.o game.s(13005) + game.o game.s(6429) + game.o game.s(12545) + game.o game.s(13101) pusha (pusha.o): - game.o game.s(2955) - game.o game.s(4495) - game.o game.s(4695) - game.o game.s(5332) - game.o game.s(5368) - game.o game.s(5947) - game.o game.s(6154) - game.o game.s(6465) - game.o game.s(6498) - game.o game.s(10586) - game.o game.s(12253) + game.o game.s(2961) + game.o game.s(4501) + game.o game.s(4701) + game.o game.s(5338) + game.o game.s(5374) + game.o game.s(5958) + game.o game.s(6165) + game.o game.s(6476) + game.o game.s(6509) + game.o game.s(10671) + game.o game.s(12342) pusha0 (pushax.o): - game.o game.s(3078) - game.o game.s(3155) - game.o game.s(4189) - game.o game.s(5168) - game.o game.s(5680) - game.o game.s(6545) - game.o game.s(7004) - game.o game.s(8854) - game.o game.s(9398) - game.o game.s(11784) + game.o game.s(3084) + game.o game.s(3161) + game.o game.s(4195) + game.o game.s(5174) + game.o game.s(5686) + game.o game.s(6556) + game.o game.s(7023) + game.o game.s(8939) + game.o game.s(9483) + game.o game.s(11869) pushax (pushax.o): - game.o game.s(3005) - game.o game.s(3491) - game.o game.s(3577) - game.o game.s(4093) - game.o game.s(4309) - game.o game.s(4445) - game.o game.s(4813) - game.o game.s(5171) - game.o game.s(5422) - game.o game.s(6540) - game.o game.s(11089) - game.o game.s(11510) - game.o game.s(12442) + game.o game.s(3011) + game.o game.s(3497) + game.o game.s(3583) + game.o game.s(4099) + game.o game.s(4315) + game.o game.s(4451) + game.o game.s(4819) + game.o game.s(5177) + game.o game.s(5428) + game.o game.s(6551) + game.o game.s(11174) + game.o game.s(11595) + game.o game.s(12531) regsave (zeropage.o): game.o game.s(10) shlax2 (aslax2.o): - game.o game.s(11108) + game.o game.s(11193) shlax4 (aslax4.o): - game.o game.s(4035) - game.o game.s(6912) - game.o game.s(9838) + game.o game.s(4041) + game.o game.s(6931) + game.o game.s(9923) shrax3 (shrax3.o): - game.o game.s(9424) + game.o game.s(9509) shrax4 (shrax4.o): - game.o game.s(6622) - game.o game.s(6858) - game.o game.s(9794) - game.o game.s(12376) + game.o game.s(6633) + game.o game.s(6877) + game.o game.s(9879) + game.o game.s(12465) sp (zeropage.o): subysp.o subysp.s(9) subeqsp.o subeqsp.s(8) @@ -461,22 +461,22 @@ sreg (zeropage.o): mul8.o mul8.s(10) icmp.o icmp.s(9) staspidx (staspidx.o): - game.o game.s(3017) - game.o game.s(3499) - game.o game.s(3585) - game.o game.s(4826) - game.o game.s(6556) + game.o game.s(3023) + game.o game.s(3505) + game.o game.s(3591) + game.o game.s(4832) + game.o game.s(6567) stax0sp (staxsp.o): - game.o game.s(3968) + game.o game.s(3974) staxspidx (staxspi.o): - game.o game.s(5242) - game.o game.s(5449) + game.o game.s(5248) + game.o game.s(5455) subeq0sp (subeqsp.o): - game.o game.s(6054) + game.o game.s(6065) subeqysp (subeqsp.o): - game.o game.s(6043) + game.o game.s(6054) subysp (subysp.o): - game.o game.s(7665) + game.o game.s(7684) tmp1 (zeropage.o): staxspi.o staxspi.s(9) staspidx.o staspidx.s(9) @@ -494,37 +494,37 @@ tmp1 (zeropage.o): aslax2.o aslax2.s(8) game.o game.s(10) tosaddax (add.o): - game.o game.s(5447) - game.o game.s(6554) + game.o game.s(5453) + game.o game.s(6565) tosaslax (shl.o): - game.o game.s(3165) - game.o game.s(11095) + game.o game.s(3171) + game.o game.s(11180) tosicmp (icmp.o): - game.o game.s(4099) - game.o game.s(4195) - game.o game.s(4315) - game.o game.s(5208) - game.o game.s(5686) - game.o game.s(7015) - game.o game.s(9404) + game.o game.s(4105) + game.o game.s(4201) + game.o game.s(4321) + game.o game.s(5214) + game.o game.s(5692) + game.o game.s(7034) + game.o game.s(9489) tosicmp0 (icmp.o): - game.o game.s(6421) - game.o game.s(7703) - game.o game.s(11788) + game.o game.s(6432) + game.o game.s(7722) + game.o game.s(11873) tosorax (or.o): - game.o game.s(3166) + game.o game.s(3172) tossuba0 (sub.o): - game.o game.s(8857) - game.o game.s(10947) + game.o game.s(8942) + game.o game.s(11032) tossubax (sub.o): - game.o game.s(4449) + game.o game.s(4455) tosudiva0 (udiv.o): - game.o game.s(3080) - game.o game.s(5173) + game.o game.s(3086) + game.o game.s(5179) tosumoda0 (umod.o): - game.o game.s(3091) + game.o game.s(3097) tosumula0 (mul8.o): - game.o game.s(5170) + game.o game.s(5176) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git a/testers/00_tester_sideview/dev/mainloop.h b/testers/00_tester_sideview/dev/mainloop.h index e74325b..79c7b2f 100644 --- a/testers/00_tester_sideview/dev/mainloop.h +++ b/testers/00_tester_sideview/dev/mainloop.h @@ -97,7 +97,7 @@ void game_init (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Clear tile_got persistence - vram_adr (0x2c20); + vram_adr (MAP_CLEAR_LIST_ADDRESS); vram_fill (0, MAP_SIZE*24); #endif @@ -120,12 +120,15 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Update tile_got persistence rda = on_pant << 3; - vram_write (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif } else { ft = 0; ppu_off (); } + + clear_update_list (); + #ifdef ENABLE_PROPELLERS // Clear propellers prp_idx = 0; @@ -161,7 +164,7 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Read tile_got persistence rda = n_pant << 3; - vram_read (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif draw_scr (); @@ -352,6 +355,16 @@ void game_loop (void) { #include "mainloop/interactives.h" #endif + // Update / collide hotspots + + #include "mainloop/hotspots.h" + + // Automatic scripting calls (USE_ANIM & fire zone) + + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" + #endif + // Update player if (!warp_to_level) { @@ -378,16 +391,6 @@ void game_loop (void) { if (propellers_on) propellers_do (); #endif - // Update / collide hotspots - - #include "mainloop/hotspots.h" - - // Automatic scripting calls (USE_ANIM & fire zone) - - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" - #endif - // Update bullets #ifdef PLAYER_CAN_FIRE @@ -402,6 +405,7 @@ void game_loop (void) { // Paint player + oam_index_player = oam_index; if (!warp_to_level) player_render (); // Update enemies diff --git a/testers/00_tester_sideview/dev/ram/bss.h b/testers/00_tester_sideview/dev/ram/bss.h index 06fd516..78c44e8 100644 --- a/testers/00_tester_sideview/dev/ram/bss.h +++ b/testers/00_tester_sideview/dev/ram/bss.h @@ -52,6 +52,8 @@ unsigned char oobjs; // Player items, last frame value (used unsigned char oammo; // Player ammo, last frame value (used to detect changes) unsigned char okilled; // Player # of killed enems., last frame value (used to detect changes) +unsigned char oam_index_player; // Index copy + // Custom hotspot type star (used as an extra collectible). #ifdef HOTSPOT_TYPE_STAR diff --git a/testers/00_tester_sideview/dev/ram/zp.h b/testers/00_tester_sideview/dev/ram/zp.h index 462136d..e4da55b 100644 --- a/testers/00_tester_sideview/dev/ram/zp.h +++ b/testers/00_tester_sideview/dev/ram/zp.h @@ -40,7 +40,7 @@ unsigned char caux; // Auxiliar variable // Sprite related (neslib) -unsigned char oam_index, oam_index_aux; +unsigned char oam_index; // Enemies @@ -92,6 +92,7 @@ unsigned char vertical_engine_type; // Player engine type. Se ENGINE_TYPE_* signed int px, py; // Player X, Y coordinates, fixed point 10.6 signed int pvx, pvy; // Player VX, VY velocities, fixed point 10.6 unsigned char prx, pry; // Player pixel coordinates, calculated from px, py. +unsigned char pcx, pcy; // Coordinates prior to movement. unsigned char pfacing; // Player facing left, right unsigned char pfr; // Player frame unsigned char pctfr; // Player counter (for animation) diff --git a/testers/01_tester_top_down/dev/cart.nes b/testers/01_tester_top_down/dev/cart.nes index b2325bcc9cf1563e0fe4db878b642af3d16c8778..acffc42dd345a0e657aea255329392a936a5cf77 100644 GIT binary patch delta 12607 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

T;%{a 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 0) hith &= ((pry & 15) > 4); } // Facing @@ -772,10 +775,17 @@ void player_move (void) { if (pgotten == 0) { #ifdef NO_HORIZONTAL_EVIL_TILE - if (hitv || hith) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } #else - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); } + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } #endif #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) diff --git a/testers/01_tester_top_down/dev/labels.txt b/testers/01_tester_top_down/dev/labels.txt index 68b20c4..1cf2ae1 100644 --- a/testers/01_tester_top_down/dev/labels.txt +++ b/testers/01_tester_top_down/dev/labels.txt @@ -7,86 +7,88 @@ crt0.o: VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 002000 game.o: - CODE Offs = 000000 Size = 002BFB + CODE Offs = 000000 Size = 002D98 RODATA Offs = 000763 Size = 001F6D - BSS Offs = 000000 Size = 0003D8 - ZEROPAGE Offs = 000000 Size = 0000BD + BSS Offs = 000000 Size = 0004A6 + ZEROPAGE Offs = 000000 Size = 0000BE runtime.lib(add.o): - CODE Offs = 002BFB Size = 00001A + CODE Offs = 002D98 Size = 00001A runtime.lib(addysp.o): - CODE Offs = 002C15 Size = 00000E + CODE Offs = 002DB2 Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 002C23 Size = 00000B + CODE Offs = 002DC0 Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 002C2E Size = 00000E + CODE Offs = 002DCB Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 002C3C Size = 000011 + CODE Offs = 002DD9 Size = 000011 runtime.lib(asrax1.o): - CODE Offs = 002C4D Size = 00000A + CODE Offs = 002DEA Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 002C57 Size = 00000F + CODE Offs = 002DF4 Size = 00000F runtime.lib(asrax4.o): - CODE Offs = 002C66 Size = 000019 + CODE Offs = 002E03 Size = 000019 runtime.lib(bneg.o): - CODE Offs = 002C7F Size = 00000E + CODE Offs = 002E1C Size = 00000E runtime.lib(copydata.o): - CODE Offs = 002C8D Size = 00002D + CODE Offs = 002E2A Size = 00002D +runtime.lib(decsp2.o): + CODE Offs = 002E57 Size = 00000D runtime.lib(decsp3.o): - CODE Offs = 002CBA Size = 00000D + CODE Offs = 002E64 Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 002CC7 Size = 00000D + CODE Offs = 002E71 Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 002CD4 Size = 00000D + CODE Offs = 002E7E Size = 00000D runtime.lib(icmp.o): - CODE Offs = 002CE1 Size = 00002E + CODE Offs = 002E8B Size = 00002E runtime.lib(incsp1.o): - CODE Offs = 002D0F Size = 000007 + CODE Offs = 002EB9 Size = 000007 runtime.lib(incsp2.o): - CODE Offs = 002D16 Size = 000016 + CODE Offs = 002EC0 Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 002D2C Size = 000005 + CODE Offs = 002ED6 Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 002D31 Size = 000005 + CODE Offs = 002EDB Size = 000005 runtime.lib(ldai.o): - CODE Offs = 002D36 Size = 00000C + CODE Offs = 002EE0 Size = 00000C runtime.lib(makebool.o): - CODE Offs = 002D42 Size = 000031 + CODE Offs = 002EEC Size = 000031 runtime.lib(ne.o): - CODE Offs = 002D73 Size = 00000A + CODE Offs = 002F1D Size = 00000A runtime.lib(neg.o): - CODE Offs = 002D7D Size = 00000E + CODE Offs = 002F27 Size = 00000E runtime.lib(or.o): - CODE Offs = 002D8B Size = 000012 + CODE Offs = 002F35 Size = 000012 runtime.lib(popa.o): - CODE Offs = 002D9D Size = 00000C + CODE Offs = 002F47 Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 002DA9 Size = 000010 + CODE Offs = 002F53 Size = 000010 runtime.lib(pusha.o): - CODE Offs = 002DB9 Size = 000016 + CODE Offs = 002F63 Size = 000016 runtime.lib(pushax.o): - CODE Offs = 002DCF Size = 00001A + CODE Offs = 002F79 Size = 00001A runtime.lib(shl.o): - CODE Offs = 002DE9 Size = 00002B + CODE Offs = 002F93 Size = 00002B runtime.lib(shrax3.o): - CODE Offs = 002E14 Size = 00000E + CODE Offs = 002FBE Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 002E22 Size = 000011 + CODE Offs = 002FCC Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 002E33 Size = 000016 + CODE Offs = 002FDD Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 002E49 Size = 00000B + CODE Offs = 002FF3 Size = 00000B runtime.lib(subeqsp.o): - CODE Offs = 002E54 Size = 000015 + CODE Offs = 002FFE Size = 000015 runtime.lib(subysp.o): - CODE Offs = 002E69 Size = 00000D + CODE Offs = 003013 Size = 00000D runtime.lib(udiv.o): - CODE Offs = 002E76 Size = 00004F + CODE Offs = 003020 Size = 00004F runtime.lib(umod.o): - CODE Offs = 002EC5 Size = 000011 + CODE Offs = 00306F Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000BD Size = 00001A + ZEROPAGE Offs = 0000BE Size = 00001A Segment list: @@ -95,23 +97,23 @@ Name Start End Size -------------------------------------------- CHARS 000000 001FFF 002000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000FE 0000D7 -BSS 000300 0006D7 0003D8 +ZEROPAGE 000028 0000FF 0000D8 +BSS 000300 0007A5 0004A6 STARTUP 008000 008CB1 000CB2 INIT 008CB2 008CD4 000023 -CODE 008CD5 00BBAA 002ED6 -RODATA 00BBAB 00E27A 0026D0 +CODE 008CD5 00BD54 003080 +RODATA 00BD55 00E424 0026D0 VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 0003D8 REA -__DATA_LOAD__ 00E27B RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 0004A6 REA +__DATA_LOAD__ 00E425 RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA _bank_bg 008416 RLA _bank_spr 008406 RLA -_delay 0085BB RLA _main 00B887 RLA +_delay 0085BB RLA _main 00BA24 RLA _memfill 00858C RLA _music_pause 0087A1 REA _music_play 008734 REA _music_stop 0086F6 REA _oam_clear 0082AF RLA _oam_hide_rest 008341 RLA @@ -124,34 +126,34 @@ _rand8 0084FA RLA _scroll 0083A7 RLA _set_vram_update 008510 RLA _sfx_play 00848A RLA _unrle_vram 008367 RLA _vram_adr 00851A RLA _vram_fill 008525 RLA _vram_put 008521 RLA -_vram_write 00845A RLA addysp 00B8EB RLA -addysp1 00B8EA RLA aslax2 00B8F8 RLA -aslax3 00B903 RLA aslax4 00B911 RLA -asrax1 00B922 RLA asrax2 00B92C RLA -asrax4 00B93B RLA bnega 00B958 RLA -booleq 00BA1D RLA boolne 00BA17 RLA -copydata 00B962 RLA decsp3 00B98F RLA -decsp4 00B99C RLA decsp8 00B9A9 RLA -incsp1 00B9E4 RLA incsp2 00B9F3 RLA -incsp4 00BA01 RLA incsp8 00BA06 RLA -ldaidx 00BA0B RLA negax 00BA52 RLA -popa 00BA72 RLA popax 00B9EB RLA -popsreg 00BA7E RLA ptr1 0000ED RLZ -ptr2 0000EF RLZ ptr4 0000F3 RLZ -push0 00BAA4 RLA pusha 00BA92 RLA -pusha0 00BAA6 RLA pushax 00BAA8 RLA -regsave 0000E9 RLZ shlax4 00B911 RLA -shrax3 00BAE9 RLA shrax4 00BAF7 RLA -sp 0000E5 RLZ sreg 0000E7 RLZ -staspidx 00BB08 RLA stax0sp 00BB1E RLA -subeq0sp 00BB29 RLA subeqysp 00BB2B RLA -subysp 00BB3E RLA tmp1 0000F5 RLZ -tosaddax 00B8D2 RLA tosaslax 00BABE RLA -tosicmp 00B9B8 RLA tosicmp0 00B9B6 RLA -tosneax 00BA4C RLA tosorax 00BA62 RLA -tosudiva0 00BB4B RLA tosumoda0 00BB9A RLA -udiv16 00BB5C RLA zerobss 008CB2 RLA - +_vram_write 00845A RLA addysp 00BA88 RLA +addysp1 00BA87 RLA aslax2 00BA95 RLA +aslax3 00BAA0 RLA aslax4 00BAAE RLA +asrax1 00BABF RLA asrax2 00BAC9 RLA +asrax4 00BAD8 RLA bnega 00BAF5 RLA +booleq 00BBC7 RLA boolne 00BBC1 RLA +copydata 00BAFF RLA decsp2 00BB2C RLA +decsp3 00BB39 RLA decsp4 00BB46 RLA +decsp8 00BB53 RLA incsp1 00BB8E RLA +incsp2 00BB9D RLA incsp4 00BBAB RLA +incsp8 00BBB0 RLA ldaidx 00BBB5 RLA +negax 00BBFC RLA popa 00BC1C RLA +popax 00BB95 RLA popsreg 00BC28 RLA +ptr1 0000EE RLZ ptr2 0000F0 RLZ +ptr4 0000F4 RLZ push0 00BC4E RLA +pusha 00BC3C RLA pusha0 00BC50 RLA +pushax 00BC52 RLA regsave 0000EA RLZ +shlax4 00BAAE RLA shrax3 00BC93 RLA +shrax4 00BCA1 RLA sp 0000E6 RLZ +sreg 0000E8 RLZ staspidx 00BCB2 RLA +stax0sp 00BCC8 RLA subeq0sp 00BCD3 RLA +subeqysp 00BCD5 RLA subysp 00BCE8 RLA +tmp1 0000F6 RLZ tosaddax 00BA6F RLA +tosaslax 00BC68 RLA tosicmp 00BB62 RLA +tosicmp0 00BB60 RLA tosneax 00BBF6 RLA +tosorax 00BC0C RLA tosudiva0 00BCF5 RLA +tosumoda0 00BD44 RLA udiv16 00BD06 RLA +zerobss 008CB2 RLA Imports list: @@ -233,102 +235,106 @@ _vram_write (crt0.o): addysp (addysp.o): incsp8.o incsp8.s(8) incsp4.o incsp4.s(8) - game.o game.s(11294) + game.o game.s(11561) addysp1 (addysp.o): or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(9405) - game.o game.s(9566) - game.o game.s(9857) - game.o game.s(12146) - game.o game.s(13541) - game.o game.s(13596) - game.o game.s(13631) - game.o game.s(15000) - game.o game.s(17015) + game.o game.s(9428) + game.o game.s(9589) + game.o game.s(9886) + game.o game.s(12441) + game.o game.s(13869) + game.o game.s(13924) + game.o game.s(13959) + game.o game.s(15328) + game.o game.s(17343) aslax3 (aslax3.o): - game.o game.s(9325) - game.o game.s(13640) + game.o game.s(9348) + game.o game.s(13968) aslax4 (aslax4.o): - game.o game.s(9265) - game.o game.s(9417) - game.o game.s(9578) - game.o game.s(9671) - game.o game.s(9856) - game.o game.s(10042) - game.o game.s(10121) - game.o game.s(11124) - game.o game.s(11806) - game.o game.s(12145) - game.o game.s(13540) - game.o game.s(13595) - game.o game.s(16047) - game.o game.s(17009) + game.o game.s(9288) + game.o game.s(9440) + game.o game.s(9601) + game.o game.s(9694) + game.o game.s(9885) + game.o game.s(10071) + game.o game.s(10150) + game.o game.s(10768) + game.o game.s(11391) + game.o game.s(12073) + game.o game.s(12440) + game.o game.s(13868) + game.o game.s(13923) + game.o game.s(16375) + game.o game.s(17337) asrax1 (asrax1.o): - game.o game.s(9336) + game.o game.s(9359) asrax2 (asrax2.o): - game.o game.s(9319) - game.o game.s(10939) - game.o game.s(12065) - game.o game.s(14999) - game.o game.s(17234) + game.o game.s(9342) + game.o game.s(11201) + game.o game.s(12360) + game.o game.s(15327) + game.o game.s(17588) asrax4 (asrax4.o): - game.o game.s(8896) - game.o game.s(9910) - game.o game.s(10938) - game.o game.s(12064) - game.o game.s(14391) - game.o game.s(17233) + game.o game.s(8919) + game.o game.s(9939) + game.o game.s(11200) + game.o game.s(12359) + game.o game.s(14719) + game.o game.s(17587) bnega (bneg.o): - game.o game.s(8738) - game.o game.s(11916) - game.o game.s(14240) + game.o game.s(8761) + game.o game.s(12211) + game.o game.s(14568) booleq (makebool.o): - game.o game.s(15323) + game.o game.s(15651) boolne (makebool.o): ne.o ne.s(8) - game.o game.s(8719) + game.o game.s(8742) copydata (copydata.o): crt0.o crt0.s(26) +decsp2 (decsp2.o): + game.o game.s(12091) decsp3 (decsp3.o): - game.o game.s(8538) - game.o game.s(8960) - game.o game.s(9118) - game.o game.s(10688) - game.o game.s(14283) - game.o game.s(15786) - game.o game.s(16041) - game.o game.s(16391) - game.o game.s(16979) + game.o game.s(8561) + game.o game.s(8983) + game.o game.s(9141) + game.o game.s(10950) + game.o game.s(14611) + game.o game.s(16114) + game.o game.s(16369) + game.o game.s(16719) + game.o game.s(17307) decsp4 (decsp4.o): - game.o game.s(10009) - game.o game.s(11743) - game.o game.s(14996) + game.o game.s(10038) + game.o game.s(12010) + game.o game.s(15324) decsp8 (decsp8.o): - game.o game.s(15523) - game.o game.s(17509) + game.o game.s(15851) + game.o game.s(17863) incsp1 (incsp1.o): - game.o game.s(8631) + game.o game.s(8654) incsp2 (incsp2.o): popsreg.o popsreg.s(8) staspidx.o staspidx.s(8) - game.o game.s(10075) + game.o game.s(10104) + game.o game.s(10798) incsp4 (incsp4.o): - game.o game.s(10433) - game.o game.s(10542) + game.o game.s(10462) + game.o game.s(10571) incsp8 (incsp8.o): - game.o game.s(10318) + game.o game.s(10347) ldaidx (ldai.o): - game.o game.s(11710) - game.o game.s(13823) - game.o game.s(14369) + game.o game.s(11977) + game.o game.s(14151) + game.o game.s(14697) negax (neg.o): - game.o game.s(10444) - game.o game.s(10533) - game.o game.s(12913) - game.o game.s(13242) - game.o game.s(13601) - game.o game.s(14811) + game.o game.s(10473) + game.o game.s(10562) + game.o game.s(13225) + game.o game.s(13570) + game.o game.s(13929) + game.o game.s(15139) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -351,58 +357,59 @@ ptr4 (zeropage.o): umod.o umod.s(9) udiv.o udiv.s(9) push0 (pushax.o): - game.o game.s(16306) - game.o game.s(17818) + game.o game.s(16634) + game.o game.s(18185) pusha (pusha.o): - game.o game.s(8911) - game.o game.s(9160) - game.o game.s(10477) - game.o game.s(10984) - game.o game.s(11144) - game.o game.s(11622) - game.o game.s(11655) - game.o game.s(13965) - game.o game.s(15567) - game.o game.s(16021) - game.o game.s(16298) - game.o game.s(17188) - game.o game.s(17308) + game.o game.s(8934) + game.o game.s(9183) + game.o game.s(10506) + game.o game.s(10803) + game.o game.s(11251) + game.o game.s(11411) + game.o game.s(11889) + game.o game.s(11922) + game.o game.s(14293) + game.o game.s(15895) + game.o game.s(16349) + game.o game.s(16626) + game.o game.s(17542) + game.o game.s(17662) pusha0 (pushax.o): - game.o game.s(8725) - game.o game.s(9283) - game.o game.s(9360) - game.o game.s(10355) - game.o game.s(11702) - game.o game.s(12208) - game.o game.s(13232) - game.o game.s(14614) + game.o game.s(8748) + game.o game.s(9306) + game.o game.s(9383) + game.o game.s(10384) + game.o game.s(11969) + game.o game.s(12503) + game.o game.s(13560) + game.o game.s(14942) pushax (pushax.o): - game.o game.s(9210) - game.o game.s(9696) - game.o game.s(9782) - game.o game.s(10259) - game.o game.s(10512) - game.o game.s(11697) - game.o game.s(13224) - game.o game.s(14909) - game.o game.s(15779) - game.o game.s(15982) - game.o game.s(16144) - game.o game.s(16214) - game.o game.s(16325) - game.o game.s(17150) + game.o game.s(9233) + game.o game.s(9719) + game.o game.s(9805) + game.o game.s(10288) + game.o game.s(10541) + game.o game.s(11964) + game.o game.s(13552) + game.o game.s(15237) + game.o game.s(16107) + game.o game.s(16310) + game.o game.s(16472) + game.o game.s(16542) + game.o game.s(16653) + game.o game.s(17504) regsave (zeropage.o): game.o game.s(10) shlax4 (aslax4.o): - game.o game.s(10201) - game.o game.s(12131) - game.o game.s(15111) + game.o game.s(10230) + game.o game.s(12426) + game.o game.s(15439) shrax3 (shrax3.o): - game.o game.s(14640) + game.o game.s(14968) shrax4 (shrax4.o): - game.o game.s(11783) - game.o game.s(12087) - game.o game.s(14402) + game.o game.s(12050) + game.o game.s(12382) + game.o game.s(14730) sp (zeropage.o): popsreg.o popsreg.s(9) subysp.o subysp.s(9) @@ -419,6 +426,7 @@ sp (zeropage.o): decsp8.o decsp8.s(8) decsp4.o decsp4.s(8) decsp3.o decsp3.s(8) + decsp2.o decsp2.s(8) addysp.o addysp.s(8) add.o add.s(11) game.o game.s(10) @@ -428,20 +436,20 @@ sreg (zeropage.o): udiv.o udiv.s(9) icmp.o icmp.s(9) staspidx (staspidx.o): - game.o game.s(9222) - game.o game.s(9704) - game.o game.s(9790) - game.o game.s(11713) - game.o game.s(13244) - game.o game.s(14918) + game.o game.s(9245) + game.o game.s(9727) + game.o game.s(9813) + game.o game.s(11980) + game.o game.s(13572) + game.o game.s(15246) stax0sp (staxsp.o): - game.o game.s(10070) + game.o game.s(10099) subeq0sp (subeqsp.o): - game.o game.s(11044) + game.o game.s(11311) subeqysp (subeqsp.o): - game.o game.s(11033) + game.o game.s(11300) subysp (subysp.o): - game.o game.s(12167) + game.o game.s(12462) tmp1 (zeropage.o): staspidx.o staspidx.s(9) shrax4.o shrax4.s(8) @@ -457,29 +465,29 @@ tmp1 (zeropage.o): aslax2.o aslax2.s(8) game.o game.s(10) tosaddax (add.o): - game.o game.s(11711) + game.o game.s(11978) tosaslax (shl.o): - game.o game.s(9370) - game.o game.s(14916) + game.o game.s(9393) + game.o game.s(15244) tosicmp (icmp.o): ne.o ne.s(8) - game.o game.s(8727) - game.o game.s(10265) - game.o game.s(10361) - game.o game.s(10518) - game.o game.s(14620) + game.o game.s(8750) + game.o game.s(10294) + game.o game.s(10390) + game.o game.s(10547) + game.o game.s(14948) tosicmp0 (icmp.o): - game.o game.s(12210) - game.o game.s(13235) + game.o game.s(12505) + game.o game.s(13563) tosneax (ne.o): - game.o game.s(8765) + game.o game.s(8788) tosorax (or.o): - game.o game.s(9371) + game.o game.s(9394) tosudiva0 (udiv.o): - game.o game.s(9285) + game.o game.s(9308) tosumoda0 (umod.o): - game.o game.s(9296) - game.o game.s(14915) + game.o game.s(9319) + game.o game.s(15243) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git a/testers/01_tester_top_down/dev/mainloop.h b/testers/01_tester_top_down/dev/mainloop.h index e74325b..79c7b2f 100644 --- a/testers/01_tester_top_down/dev/mainloop.h +++ b/testers/01_tester_top_down/dev/mainloop.h @@ -97,7 +97,7 @@ void game_init (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Clear tile_got persistence - vram_adr (0x2c20); + vram_adr (MAP_CLEAR_LIST_ADDRESS); vram_fill (0, MAP_SIZE*24); #endif @@ -120,12 +120,15 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Update tile_got persistence rda = on_pant << 3; - vram_write (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif } else { ft = 0; ppu_off (); } + + clear_update_list (); + #ifdef ENABLE_PROPELLERS // Clear propellers prp_idx = 0; @@ -161,7 +164,7 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Read tile_got persistence rda = n_pant << 3; - vram_read (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif draw_scr (); @@ -352,6 +355,16 @@ void game_loop (void) { #include "mainloop/interactives.h" #endif + // Update / collide hotspots + + #include "mainloop/hotspots.h" + + // Automatic scripting calls (USE_ANIM & fire zone) + + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" + #endif + // Update player if (!warp_to_level) { @@ -378,16 +391,6 @@ void game_loop (void) { if (propellers_on) propellers_do (); #endif - // Update / collide hotspots - - #include "mainloop/hotspots.h" - - // Automatic scripting calls (USE_ANIM & fire zone) - - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" - #endif - // Update bullets #ifdef PLAYER_CAN_FIRE @@ -402,6 +405,7 @@ void game_loop (void) { // Paint player + oam_index_player = oam_index; if (!warp_to_level) player_render (); // Update enemies diff --git a/testers/01_tester_top_down/dev/my/game_frame.h b/testers/01_tester_top_down/dev/my/game_frame.h index 3df4bcf..6e369b5 100644 --- a/testers/01_tester_top_down/dev/my/game_frame.h +++ b/testers/01_tester_top_down/dev/my/game_frame.h @@ -2,7 +2,7 @@ // Copyleft Mojon Twins 2013, 2015, 2017, 2018 // game_frame.h -// Custom code to draw your HUD. +// Custom code to draw the frame around your HUD void draw_game_frame (void) { unrle_vram (frame_rle, 0x2000); diff --git a/testers/01_tester_top_down/dev/my/player_frame_selector.h b/testers/01_tester_top_down/dev/my/player_frame_selector.h index 3855805..ee5a47a 100644 --- a/testers/01_tester_top_down/dev/my/player_frame_selector.h +++ b/testers/01_tester_top_down/dev/my/player_frame_selector.h @@ -1,3 +1,4 @@ + // NES MK1 v1.0 // Copyleft Mojon Twins 2013, 2015, 2017, 2018 @@ -54,3 +55,4 @@ psprid += pfacing; #endif + \ No newline at end of file diff --git a/testers/01_tester_top_down/dev/ram/bss.h b/testers/01_tester_top_down/dev/ram/bss.h index 06fd516..78c44e8 100644 --- a/testers/01_tester_top_down/dev/ram/bss.h +++ b/testers/01_tester_top_down/dev/ram/bss.h @@ -52,6 +52,8 @@ unsigned char oobjs; // Player items, last frame value (used unsigned char oammo; // Player ammo, last frame value (used to detect changes) unsigned char okilled; // Player # of killed enems., last frame value (used to detect changes) +unsigned char oam_index_player; // Index copy + // Custom hotspot type star (used as an extra collectible). #ifdef HOTSPOT_TYPE_STAR diff --git a/testers/01_tester_top_down/dev/ram/zp.h b/testers/01_tester_top_down/dev/ram/zp.h index 462136d..e4da55b 100644 --- a/testers/01_tester_top_down/dev/ram/zp.h +++ b/testers/01_tester_top_down/dev/ram/zp.h @@ -40,7 +40,7 @@ unsigned char caux; // Auxiliar variable // Sprite related (neslib) -unsigned char oam_index, oam_index_aux; +unsigned char oam_index; // Enemies @@ -92,6 +92,7 @@ unsigned char vertical_engine_type; // Player engine type. Se ENGINE_TYPE_* signed int px, py; // Player X, Y coordinates, fixed point 10.6 signed int pvx, pvy; // Player VX, VY velocities, fixed point 10.6 unsigned char prx, pry; // Player pixel coordinates, calculated from px, py. +unsigned char pcx, pcy; // Coordinates prior to movement. unsigned char pfacing; // Player facing left, right unsigned char pfr; // Player frame unsigned char pctfr; // Player counter (for animation) diff --git a/testers/02_tester_punchy/dev/cart.nes b/testers/02_tester_punchy/dev/cart.nes index 9848ec36603571adb909bf5bf16b3846a389c621..8fb9c835b668de96c550b9934a189117b2930179 100644 GIT binary patch delta 10428 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 D9Ukw5 delta 10334 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 eaNs|w=5yCQCezfKp) 0) hith &= ((pry & 15) > 4); } // Facing @@ -772,10 +775,17 @@ void player_move (void) { if (pgotten == 0) { #ifdef NO_HORIZONTAL_EVIL_TILE - if (hitv || hith) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } #else - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); } + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } #endif #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) diff --git a/testers/02_tester_punchy/dev/labels.txt b/testers/02_tester_punchy/dev/labels.txt index 557cdd2..4ddaa38 100644 --- a/testers/02_tester_punchy/dev/labels.txt +++ b/testers/02_tester_punchy/dev/labels.txt @@ -7,86 +7,86 @@ crt0.o: VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 002000 game.o: - CODE Offs = 000000 Size = 00264B + CODE Offs = 000000 Size = 002690 RODATA Offs = 00052A Size = 000BBA - BSS Offs = 000000 Size = 0002BC - ZEROPAGE Offs = 000000 Size = 0000BC + BSS Offs = 000000 Size = 0002BD + ZEROPAGE Offs = 000000 Size = 0000BD runtime.lib(add.o): - CODE Offs = 00264B Size = 00001A + CODE Offs = 002690 Size = 00001A runtime.lib(addysp.o): - CODE Offs = 002665 Size = 00000E + CODE Offs = 0026AA Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 002673 Size = 00000B + CODE Offs = 0026B8 Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 00267E Size = 00000E + CODE Offs = 0026C3 Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 00268C Size = 000011 + CODE Offs = 0026D1 Size = 000011 runtime.lib(asrax1.o): - CODE Offs = 00269D Size = 00000A + CODE Offs = 0026E2 Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 0026A7 Size = 00000F + CODE Offs = 0026EC Size = 00000F runtime.lib(asrax3.o): - CODE Offs = 0026B6 Size = 000014 + CODE Offs = 0026FB Size = 000014 runtime.lib(asrax4.o): - CODE Offs = 0026CA Size = 000019 + CODE Offs = 00270F Size = 000019 runtime.lib(bneg.o): - CODE Offs = 0026E3 Size = 00000E + CODE Offs = 002728 Size = 00000E runtime.lib(copydata.o): - CODE Offs = 0026F1 Size = 00002D + CODE Offs = 002736 Size = 00002D runtime.lib(decsp2.o): - CODE Offs = 00271E Size = 00000D + CODE Offs = 002763 Size = 00000D runtime.lib(decsp3.o): - CODE Offs = 00272B Size = 00000D + CODE Offs = 002770 Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 002738 Size = 00000D + CODE Offs = 00277D Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 002745 Size = 00000D + CODE Offs = 00278A Size = 00000D runtime.lib(icmp.o): - CODE Offs = 002752 Size = 00002E + CODE Offs = 002797 Size = 00002E runtime.lib(incsp2.o): - CODE Offs = 002780 Size = 000016 + CODE Offs = 0027C5 Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 002796 Size = 000005 + CODE Offs = 0027DB Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 00279B Size = 000005 + CODE Offs = 0027E0 Size = 000005 runtime.lib(ldai.o): - CODE Offs = 0027A0 Size = 00000C + CODE Offs = 0027E5 Size = 00000C runtime.lib(makebool.o): - CODE Offs = 0027AC Size = 000031 + CODE Offs = 0027F1 Size = 000031 runtime.lib(neg.o): - CODE Offs = 0027DD Size = 00000E + CODE Offs = 002822 Size = 00000E runtime.lib(or.o): - CODE Offs = 0027EB Size = 000012 + CODE Offs = 002830 Size = 000012 runtime.lib(popa.o): - CODE Offs = 0027FD Size = 00000C + CODE Offs = 002842 Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 002809 Size = 000010 + CODE Offs = 00284E Size = 000010 runtime.lib(pusha.o): - CODE Offs = 002819 Size = 000016 + CODE Offs = 00285E Size = 000016 runtime.lib(pushax.o): - CODE Offs = 00282F Size = 00001A + CODE Offs = 002874 Size = 00001A runtime.lib(shl.o): - CODE Offs = 002849 Size = 00002B + CODE Offs = 00288E Size = 00002B runtime.lib(shrax3.o): - CODE Offs = 002874 Size = 00000E + CODE Offs = 0028B9 Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 002882 Size = 000011 + CODE Offs = 0028C7 Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 002893 Size = 000016 + CODE Offs = 0028D8 Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 0028A9 Size = 00000B + CODE Offs = 0028EE Size = 00000B runtime.lib(staxspi.o): - CODE Offs = 0028B4 Size = 00001B + CODE Offs = 0028F9 Size = 00001B runtime.lib(sub.o): - CODE Offs = 0028CF Size = 000015 + CODE Offs = 002914 Size = 000015 runtime.lib(udiv.o): - CODE Offs = 0028E4 Size = 00004F + CODE Offs = 002929 Size = 00004F runtime.lib(umod.o): - CODE Offs = 002933 Size = 000011 + CODE Offs = 002978 Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000BC Size = 00001A + ZEROPAGE Offs = 0000BD Size = 00001A Segment list: @@ -95,23 +95,23 @@ Name Start End Size -------------------------------------------- CHARS 000000 001FFF 002000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000FD 0000D6 -BSS 000300 0005BB 0002BC +ZEROPAGE 000028 0000FE 0000D7 +BSS 000300 0005BC 0002BD STARTUP 008000 008CB1 000CB2 INIT 008CB2 008CD4 000023 -CODE 008CD5 00B618 002944 -RODATA 00B619 00C6FC 0010E4 +CODE 008CD5 00B65D 002989 +RODATA 00B65E 00C741 0010E4 VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 0002BC REA -__DATA_LOAD__ 00C6FD RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 0002BD REA +__DATA_LOAD__ 00C742 RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA _bank_bg 008416 RLA _bank_spr 008406 RLA -_delay 0085BB RLA _main 00B2EE RLA +_delay 0085BB RLA _main 00B333 RLA _memfill 00858C RLA _music_pause 0087A1 REA _music_play 008734 REA _music_stop 0086F6 REA _oam_clear 0082AF RLA _oam_hide_rest 008341 RLA @@ -124,32 +124,32 @@ _rand8 0084FA RLA _scroll 0083A7 RLA _set_vram_update 008510 RLA _sfx_play 00848A RLA _vram_adr 00851A RLA _vram_fill 008525 RLA _vram_put 008521 RLA _vram_write 00845A RLA -addysp 00B33B RLA addysp1 00B33A RLA -aslax2 00B348 RLA aslax3 00B353 RLA -aslax4 00B361 RLA asrax1 00B372 RLA -asrax2 00B37C RLA asrax3 00B38B RLA -asrax4 00B39F RLA bnega 00B3BC RLA -booleq 00B487 RLA copydata 00B3C6 RLA -decsp2 00B3F3 RLA decsp3 00B400 RLA -decsp4 00B40D RLA decsp8 00B41A RLA -incsp2 00B45D RLA incsp4 00B46B RLA -incsp8 00B470 RLA ldaidx 00B475 RLA -negax 00B4B2 RLA popa 00B4D2 RLA -popax 00B455 RLA popsreg 00B4DE RLA -ptr1 0000EC RLZ ptr2 0000EE RLZ -ptr4 0000F2 RLZ push0 00B504 RLA -pusha 00B4F2 RLA pusha0 00B506 RLA -pushax 00B508 RLA regsave 0000E8 RLZ -shlax2 00B348 RLA shlax4 00B361 RLA -shrax3 00B549 RLA shrax4 00B557 RLA -sp 0000E4 RLZ sreg 0000E6 RLZ -staspidx 00B568 RLA stax0sp 00B57E RLA -staxspidx 00B589 RLA tmp1 0000F4 RLZ -tosaddax 00B322 RLA tosaslax 00B51E RLA -tosicmp 00B429 RLA tosicmp0 00B427 RLA -tosorax 00B4C2 RLA tossuba0 00B5A4 RLA -tossubax 00B5A6 RLA tosudiva0 00B5B9 RLA -tosumoda0 00B608 RLA udiv16 00B5CA RLA +addysp 00B380 RLA addysp1 00B37F RLA +aslax2 00B38D RLA aslax3 00B398 RLA +aslax4 00B3A6 RLA asrax1 00B3B7 RLA +asrax2 00B3C1 RLA asrax3 00B3D0 RLA +asrax4 00B3E4 RLA bnega 00B401 RLA +booleq 00B4CC RLA copydata 00B40B RLA +decsp2 00B438 RLA decsp3 00B445 RLA +decsp4 00B452 RLA decsp8 00B45F RLA +incsp2 00B4A2 RLA incsp4 00B4B0 RLA +incsp8 00B4B5 RLA ldaidx 00B4BA RLA +negax 00B4F7 RLA popa 00B517 RLA +popax 00B49A RLA popsreg 00B523 RLA +ptr1 0000ED RLZ ptr2 0000EF RLZ +ptr4 0000F3 RLZ push0 00B549 RLA +pusha 00B537 RLA pusha0 00B54B RLA +pushax 00B54D RLA regsave 0000E9 RLZ +shlax2 00B38D RLA shlax4 00B3A6 RLA +shrax3 00B58E RLA shrax4 00B59C RLA +sp 0000E5 RLZ sreg 0000E7 RLZ +staspidx 00B5AD RLA stax0sp 00B5C3 RLA +staxspidx 00B5CE RLA tmp1 0000F5 RLZ +tosaddax 00B367 RLA tosaslax 00B563 RLA +tosicmp 00B46E RLA tosicmp0 00B46C RLA +tosorax 00B507 RLA tossuba0 00B5E9 RLA +tossubax 00B5EB RLA tosudiva0 00B5FE RLA +tosumoda0 00B64D RLA udiv16 00B60F RLA zerobss 008CB2 RLA @@ -234,100 +234,99 @@ addysp1 (addysp.o): sub.o sub.s(8) or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(4222) - game.o game.s(4383) - game.o game.s(4830) - game.o game.s(6381) - game.o game.s(7616) - game.o game.s(8795) - game.o game.s(8850) - game.o game.s(8885) - game.o game.s(10310) - game.o game.s(11727) + game.o game.s(4228) + game.o game.s(4389) + game.o game.s(4836) + game.o game.s(6387) + game.o game.s(7635) + game.o game.s(8844) + game.o game.s(8899) + game.o game.s(8934) + game.o game.s(10359) + game.o game.s(11784) aslax3 (aslax3.o): - game.o game.s(4142) - game.o game.s(4820) - game.o game.s(8894) + game.o game.s(4148) + game.o game.s(4826) + game.o game.s(8943) aslax4 (aslax4.o): - game.o game.s(4082) - game.o game.s(4234) - game.o game.s(4395) - game.o game.s(4488) - game.o game.s(4819) - game.o game.s(5044) - game.o game.s(5889) - game.o game.s(6237) - game.o game.s(6380) - game.o game.s(7615) - game.o game.s(8794) - game.o game.s(8849) - game.o game.s(10309) - game.o game.s(11726) + game.o game.s(4088) + game.o game.s(4240) + game.o game.s(4401) + game.o game.s(4494) + game.o game.s(4825) + game.o game.s(5050) + game.o game.s(5895) + game.o game.s(6243) + game.o game.s(6386) + game.o game.s(7634) + game.o game.s(8843) + game.o game.s(8898) + game.o game.s(10358) + game.o game.s(11783) asrax1 (asrax1.o): - game.o game.s(4153) - game.o game.s(5677) - game.o game.s(9140) + game.o game.s(4159) + game.o game.s(5683) + game.o game.s(9189) asrax2 (asrax2.o): - game.o game.s(4136) - game.o game.s(5682) - game.o game.s(6759) - game.o game.s(7046) - game.o game.s(7529) - game.o game.s(10266) - game.o game.s(11482) + game.o game.s(4142) + game.o game.s(5688) + game.o game.s(6765) + game.o game.s(7052) + game.o game.s(7548) + game.o game.s(10315) + game.o game.s(11539) asrax3 (asrax3.o): - game.o game.s(6230) - game.o game.s(8563) + game.o game.s(6236) + game.o game.s(8612) asrax4 (asrax4.o): - game.o game.s(4701) - game.o game.s(5230) - game.o game.s(5688) - game.o game.s(6758) - game.o game.s(7045) - game.o game.s(7229) - game.o game.s(9631) - game.o game.s(11481) - game.o game.s(11675) + game.o game.s(4707) + game.o game.s(5236) + game.o game.s(5694) + game.o game.s(6764) + game.o game.s(7051) + game.o game.s(7248) + game.o game.s(9680) + game.o game.s(11538) + game.o game.s(11732) bnega (bneg.o): - game.o game.s(6883) - game.o game.s(7812) - game.o game.s(9553) + game.o game.s(6889) + game.o game.s(7831) + game.o game.s(9602) booleq (makebool.o): - game.o game.s(10585) + game.o game.s(10638) copydata (copydata.o): crt0.o crt0.s(26) decsp2 (decsp2.o): - game.o game.s(8431) + game.o game.s(8480) decsp3 (decsp3.o): - game.o game.s(3777) - game.o game.s(3935) - game.o game.s(6044) - game.o game.s(10827) + game.o game.s(3783) + game.o game.s(3941) + game.o game.s(6050) + game.o game.s(10880) decsp4 (decsp4.o): - game.o game.s(5010) - game.o game.s(6786) + game.o game.s(5016) + game.o game.s(6792) decsp8 (decsp8.o): - game.o game.s(11834) + game.o game.s(11891) incsp2 (incsp2.o): popsreg.o popsreg.s(8) staxspi.o staxspi.s(8) staspidx.o staspidx.s(8) - game.o game.s(5077) - game.o game.s(5912) + game.o game.s(5083) + game.o game.s(5918) incsp4 (incsp4.o): - game.o game.s(5493) - game.o game.s(5568) + game.o game.s(5499) + game.o game.s(5574) incsp8 (incsp8.o): - game.o game.s(5377) + game.o game.s(5383) ldaidx (ldai.o): - game.o game.s(9622) + game.o game.s(9671) negax (neg.o): - game.o game.s(5504) - game.o game.s(5559) - game.o game.s(8210) - game.o game.s(8855) - game.o game.s(9091) - game.o game.s(9820) + game.o game.s(5510) + game.o game.s(5565) + game.o game.s(8904) + game.o game.s(9140) + game.o game.s(9869) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -351,52 +350,52 @@ ptr4 (zeropage.o): umod.o umod.s(9) udiv.o udiv.s(9) push0 (pushax.o): - game.o game.s(12074) + game.o game.s(12138) pusha (pusha.o): - game.o game.s(3977) - game.o game.s(5724) - game.o game.s(5897) - game.o game.s(6486) - game.o game.s(6522) - game.o game.s(7091) - game.o game.s(7299) - game.o game.s(10169) - game.o game.s(11560) + game.o game.s(3983) + game.o game.s(5730) + game.o game.s(5903) + game.o game.s(6492) + game.o game.s(6528) + game.o game.s(7102) + game.o game.s(7318) + game.o game.s(10218) + game.o game.s(11617) pusha0 (pushax.o): - game.o game.s(4100) - game.o game.s(4177) - game.o game.s(5414) - game.o game.s(6833) - game.o game.s(7670) - game.o game.s(9727) - game.o game.s(11136) + game.o game.s(4106) + game.o game.s(4183) + game.o game.s(5420) + game.o game.s(6839) + game.o game.s(7689) + game.o game.s(9776) + game.o game.s(11189) pushax (pushax.o): - game.o game.s(4027) - game.o game.s(4513) - game.o game.s(4862) - game.o game.s(5318) - game.o game.s(5538) - game.o game.s(5674) - game.o game.s(6425) - game.o game.s(6576) - game.o game.s(9905) - game.o game.s(10912) + game.o game.s(4033) + game.o game.s(4519) + game.o game.s(4868) + game.o game.s(5324) + game.o game.s(5544) + game.o game.s(5680) + game.o game.s(6431) + game.o game.s(6582) + game.o game.s(9954) + game.o game.s(10965) regsave (zeropage.o): game.o game.s(10) shlax2 (aslax2.o): - game.o game.s(10420) + game.o game.s(10473) shlax4 (aslax4.o): - game.o game.s(5139) - game.o game.s(5215) - game.o game.s(7603) - game.o game.s(10419) + game.o game.s(5145) + game.o game.s(5221) + game.o game.s(7622) + game.o game.s(10472) shrax3 (shrax3.o): - game.o game.s(9753) + game.o game.s(9802) shrax4 (shrax4.o): - game.o game.s(5198) - game.o game.s(7237) - game.o game.s(9642) - game.o game.s(11683) + game.o game.s(5204) + game.o game.s(7256) + game.o game.s(9691) + game.o game.s(11740) sp (zeropage.o): popsreg.o popsreg.s(9) addysp.o addysp.s(8) @@ -422,14 +421,14 @@ sreg (zeropage.o): udiv.o udiv.s(9) icmp.o icmp.s(9) staspidx (staspidx.o): - game.o game.s(4039) - game.o game.s(4521) - game.o game.s(4870) + game.o game.s(4045) + game.o game.s(4527) + game.o game.s(4876) stax0sp (staxsp.o): - game.o game.s(5072) + game.o game.s(5078) staxspidx (staxspi.o): - game.o game.s(6442) - game.o game.s(6603) + game.o game.s(6448) + game.o game.s(6609) tmp1 (zeropage.o): staxspi.o staxspi.s(9) staspidx.o staspidx.s(9) @@ -447,31 +446,31 @@ tmp1 (zeropage.o): aslax2.o aslax2.s(8) game.o game.s(10) tosaddax (add.o): - game.o game.s(6601) + game.o game.s(6607) tosaslax (shl.o): - game.o game.s(4187) - game.o game.s(10407) + game.o game.s(4193) + game.o game.s(10460) tosicmp (icmp.o): - game.o game.s(5324) - game.o game.s(5420) - game.o game.s(5544) - game.o game.s(6839) - game.o game.s(7681) - game.o game.s(9733) + game.o game.s(5330) + game.o game.s(5426) + game.o game.s(5550) + game.o game.s(6845) + game.o game.s(7700) + game.o game.s(9782) tosicmp0 (icmp.o): - game.o game.s(9908) - game.o game.s(11140) + game.o game.s(9957) + game.o game.s(11193) tosorax (or.o): - game.o game.s(4188) + game.o game.s(4194) tossuba0 (sub.o): - game.o game.s(10406) + game.o game.s(10459) tossubax (sub.o): - game.o game.s(5678) - game.o game.s(10119) + game.o game.s(5684) + game.o game.s(10168) tosudiva0 (udiv.o): - game.o game.s(4102) + game.o game.s(4108) tosumoda0 (umod.o): - game.o game.s(4113) + game.o game.s(4119) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git a/testers/02_tester_punchy/dev/mainloop.h b/testers/02_tester_punchy/dev/mainloop.h index e74325b..79c7b2f 100644 --- a/testers/02_tester_punchy/dev/mainloop.h +++ b/testers/02_tester_punchy/dev/mainloop.h @@ -97,7 +97,7 @@ void game_init (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Clear tile_got persistence - vram_adr (0x2c20); + vram_adr (MAP_CLEAR_LIST_ADDRESS); vram_fill (0, MAP_SIZE*24); #endif @@ -120,12 +120,15 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Update tile_got persistence rda = on_pant << 3; - vram_write (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif } else { ft = 0; ppu_off (); } + + clear_update_list (); + #ifdef ENABLE_PROPELLERS // Clear propellers prp_idx = 0; @@ -161,7 +164,7 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Read tile_got persistence rda = n_pant << 3; - vram_read (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif draw_scr (); @@ -352,6 +355,16 @@ void game_loop (void) { #include "mainloop/interactives.h" #endif + // Update / collide hotspots + + #include "mainloop/hotspots.h" + + // Automatic scripting calls (USE_ANIM & fire zone) + + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" + #endif + // Update player if (!warp_to_level) { @@ -378,16 +391,6 @@ void game_loop (void) { if (propellers_on) propellers_do (); #endif - // Update / collide hotspots - - #include "mainloop/hotspots.h" - - // Automatic scripting calls (USE_ANIM & fire zone) - - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" - #endif - // Update bullets #ifdef PLAYER_CAN_FIRE @@ -402,6 +405,7 @@ void game_loop (void) { // Paint player + oam_index_player = oam_index; if (!warp_to_level) player_render (); // Update enemies diff --git a/testers/02_tester_punchy/dev/ram/bss.h b/testers/02_tester_punchy/dev/ram/bss.h index 06fd516..78c44e8 100644 --- a/testers/02_tester_punchy/dev/ram/bss.h +++ b/testers/02_tester_punchy/dev/ram/bss.h @@ -52,6 +52,8 @@ unsigned char oobjs; // Player items, last frame value (used unsigned char oammo; // Player ammo, last frame value (used to detect changes) unsigned char okilled; // Player # of killed enems., last frame value (used to detect changes) +unsigned char oam_index_player; // Index copy + // Custom hotspot type star (used as an extra collectible). #ifdef HOTSPOT_TYPE_STAR diff --git a/testers/02_tester_punchy/dev/ram/zp.h b/testers/02_tester_punchy/dev/ram/zp.h index 462136d..e4da55b 100644 --- a/testers/02_tester_punchy/dev/ram/zp.h +++ b/testers/02_tester_punchy/dev/ram/zp.h @@ -40,7 +40,7 @@ unsigned char caux; // Auxiliar variable // Sprite related (neslib) -unsigned char oam_index, oam_index_aux; +unsigned char oam_index; // Enemies @@ -92,6 +92,7 @@ unsigned char vertical_engine_type; // Player engine type. Se ENGINE_TYPE_* signed int px, py; // Player X, Y coordinates, fixed point 10.6 signed int pvx, pvy; // Player VX, VY velocities, fixed point 10.6 unsigned char prx, pry; // Player pixel coordinates, calculated from px, py. +unsigned char pcx, pcy; // Coordinates prior to movement. unsigned char pfacing; // Player facing left, right unsigned char pfr; // Player frame unsigned char pctfr; // Player counter (for animation) diff --git a/testers/03_tester_interactives/dev/cart.nes b/testers/03_tester_interactives/dev/cart.nes index c1bb1f1ff5bbb1f4af433ec5b0f95d208904bb42..f9bfe07c814eff43d714341bbe89ef19efb06d32 100644 GIT binary patch delta 8170 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 delta 8055 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 lzbECjqgfrl= 0) hith &= ((pry & 15) > 4); } // Facing @@ -772,10 +775,17 @@ void player_move (void) { if (pgotten == 0) { #ifdef NO_HORIZONTAL_EVIL_TILE - if (hitv || hith) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } #else - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); } + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } #endif #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) diff --git a/testers/03_tester_interactives/dev/labels.txt b/testers/03_tester_interactives/dev/labels.txt index ad5d754..862da51 100644 --- a/testers/03_tester_interactives/dev/labels.txt +++ b/testers/03_tester_interactives/dev/labels.txt @@ -7,84 +7,84 @@ crt0.o: VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 002000 game.o: - CODE Offs = 000000 Size = 001D6F + CODE Offs = 000000 Size = 001E06 RODATA Offs = 00052A Size = 000A9A - BSS Offs = 000000 Size = 00028A - ZEROPAGE Offs = 000000 Size = 0000B6 + BSS Offs = 000000 Size = 00028B + ZEROPAGE Offs = 000000 Size = 0000B7 runtime.lib(addysp.o): - CODE Offs = 001D6F Size = 00000E + CODE Offs = 001E06 Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 001D7D Size = 00000B + CODE Offs = 001E14 Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 001D88 Size = 00000E + CODE Offs = 001E1F Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 001D96 Size = 000011 + CODE Offs = 001E2D Size = 000011 runtime.lib(asrax1.o): - CODE Offs = 001DA7 Size = 00000A + CODE Offs = 001E3E Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 001DB1 Size = 00000F + CODE Offs = 001E48 Size = 00000F runtime.lib(asrax3.o): - CODE Offs = 001DC0 Size = 000014 + CODE Offs = 001E57 Size = 000014 runtime.lib(asrax4.o): - CODE Offs = 001DD4 Size = 000019 + CODE Offs = 001E6B Size = 000019 runtime.lib(bneg.o): - CODE Offs = 001DED Size = 00000E + CODE Offs = 001E84 Size = 00000E runtime.lib(copydata.o): - CODE Offs = 001DFB Size = 00002D + CODE Offs = 001E92 Size = 00002D runtime.lib(decsp3.o): - CODE Offs = 001E28 Size = 00000D + CODE Offs = 001EBF Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 001E35 Size = 00000D + CODE Offs = 001ECC Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 001E42 Size = 00000D + CODE Offs = 001ED9 Size = 00000D runtime.lib(icmp.o): - CODE Offs = 001E4F Size = 00002E + CODE Offs = 001EE6 Size = 00002E runtime.lib(incsp1.o): - CODE Offs = 001E7D Size = 000007 + CODE Offs = 001F14 Size = 000007 runtime.lib(incsp2.o): - CODE Offs = 001E84 Size = 000016 + CODE Offs = 001F1B Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 001E9A Size = 000005 + CODE Offs = 001F31 Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 001E9F Size = 000005 + CODE Offs = 001F36 Size = 000005 runtime.lib(makebool.o): - CODE Offs = 001EA4 Size = 000031 + CODE Offs = 001F3B Size = 000031 runtime.lib(ne.o): - CODE Offs = 001ED5 Size = 00000A + CODE Offs = 001F6C Size = 00000A runtime.lib(neg.o): - CODE Offs = 001EDF Size = 00000E + CODE Offs = 001F76 Size = 00000E runtime.lib(or.o): - CODE Offs = 001EED Size = 000012 + CODE Offs = 001F84 Size = 000012 runtime.lib(popa.o): - CODE Offs = 001EFF Size = 00000C + CODE Offs = 001F96 Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 001F0B Size = 000010 + CODE Offs = 001FA2 Size = 000010 runtime.lib(pusha.o): - CODE Offs = 001F1B Size = 000016 + CODE Offs = 001FB2 Size = 000016 runtime.lib(pushax.o): - CODE Offs = 001F31 Size = 00001A + CODE Offs = 001FC8 Size = 00001A runtime.lib(shl.o): - CODE Offs = 001F4B Size = 00002B + CODE Offs = 001FE2 Size = 00002B runtime.lib(shrax1.o): - CODE Offs = 001F76 Size = 000008 + CODE Offs = 00200D Size = 000008 runtime.lib(shrax3.o): - CODE Offs = 001F7E Size = 00000E + CODE Offs = 002015 Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 001F8C Size = 000011 + CODE Offs = 002023 Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 001F9D Size = 000016 + CODE Offs = 002034 Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 001FB3 Size = 00000B + CODE Offs = 00204A Size = 00000B runtime.lib(sub.o): - CODE Offs = 001FBE Size = 000015 + CODE Offs = 002055 Size = 000015 runtime.lib(udiv.o): - CODE Offs = 001FD3 Size = 00004F + CODE Offs = 00206A Size = 00004F runtime.lib(umod.o): - CODE Offs = 002022 Size = 000011 + CODE Offs = 0020B9 Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000B6 Size = 00001A + ZEROPAGE Offs = 0000B7 Size = 00001A Segment list: @@ -93,23 +93,23 @@ Name Start End Size -------------------------------------------- CHARS 000000 001FFF 002000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000F7 0000D0 -BSS 000300 000589 00028A +ZEROPAGE 000028 0000F8 0000D1 +BSS 000300 00058A 00028B STARTUP 008000 008CB1 000CB2 INIT 008CB2 008CD4 000023 -CODE 008CD5 00AD07 002033 -RODATA 00AD08 00BCCB 000FC4 +CODE 008CD5 00AD9E 0020CA +RODATA 00AD9F 00BD62 000FC4 VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 00028A REA -__DATA_LOAD__ 00BCCC RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 00028B REA +__DATA_LOAD__ 00BD63 RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA _bank_bg 008416 RLA _bank_spr 008406 RLA -_delay 0085BB RLA _main 00AA12 RLA +_delay 0085BB RLA _main 00AAA9 RLA _memfill 00858C RLA _music_pause 0087A1 REA _music_play 008734 REA _music_stop 0086F6 REA _oam_clear 0082AF RLA _oam_hide_rest 008341 RLA @@ -121,32 +121,32 @@ _ppu_waitnmi 00834E RLA _scroll 0083A7 RLA _set_vram_update 008510 RLA _sfx_play 00848A RLA _vram_adr 00851A RLA _vram_fill 008525 RLA _vram_put 008521 RLA _vram_write 00845A RLA -addysp 00AA45 RLA addysp1 00AA44 RLA -aslax2 00AA52 RLA aslax3 00AA5D RLA -aslax4 00AA6B RLA asrax1 00AA7C RLA -asrax2 00AA86 RLA asrax3 00AA95 RLA -asrax4 00AAA9 RLA bnega 00AAC6 RLA -booleq 00AB7F RLA boolne 00AB79 RLA -copydata 00AAD0 RLA decsp3 00AAFD RLA -decsp4 00AB0A RLA decsp8 00AB17 RLA -incsp1 00AB52 RLA incsp2 00AB61 RLA -incsp4 00AB6F RLA incsp8 00AB74 RLA -negax 00ABB4 RLA popa 00ABD4 RLA -popax 00AB59 RLA popsreg 00ABE0 RLA -ptr1 0000E6 RLZ ptr2 0000E8 RLZ -ptr4 0000EC RLZ push0 00AC06 RLA -pusha 00ABF4 RLA pusha0 00AC08 RLA -pushax 00AC0A RLA regsave 0000E2 RLZ -shlax2 00AA52 RLA shlax4 00AA6B RLA -shrax1 00AC4B RLA shrax3 00AC53 RLA -shrax4 00AC61 RLA sp 0000DE RLZ -sreg 0000E0 RLZ staspidx 00AC72 RLA -stax0sp 00AC88 RLA tmp1 0000EE RLZ -tosaslax 00AC20 RLA tosicmp 00AB26 RLA -tosicmp0 00AB24 RLA tosneax 00ABAE RLA -tosorax 00ABC4 RLA tossuba0 00AC93 RLA -tosudiva0 00ACA8 RLA tosumoda0 00ACF7 RLA -udiv16 00ACB9 RLA zerobss 008CB2 RLA +addysp 00AADC RLA addysp1 00AADB RLA +aslax2 00AAE9 RLA aslax3 00AAF4 RLA +aslax4 00AB02 RLA asrax1 00AB13 RLA +asrax2 00AB1D RLA asrax3 00AB2C RLA +asrax4 00AB40 RLA bnega 00AB5D RLA +booleq 00AC16 RLA boolne 00AC10 RLA +copydata 00AB67 RLA decsp3 00AB94 RLA +decsp4 00ABA1 RLA decsp8 00ABAE RLA +incsp1 00ABE9 RLA incsp2 00ABF8 RLA +incsp4 00AC06 RLA incsp8 00AC0B RLA +negax 00AC4B RLA popa 00AC6B RLA +popax 00ABF0 RLA popsreg 00AC77 RLA +ptr1 0000E7 RLZ ptr2 0000E9 RLZ +ptr4 0000ED RLZ push0 00AC9D RLA +pusha 00AC8B RLA pusha0 00AC9F RLA +pushax 00ACA1 RLA regsave 0000E3 RLZ +shlax2 00AAE9 RLA shlax4 00AB02 RLA +shrax1 00ACE2 RLA shrax3 00ACEA RLA +shrax4 00ACF8 RLA sp 0000DF RLZ +sreg 0000E1 RLZ staspidx 00AD09 RLA +stax0sp 00AD1F RLA tmp1 0000EF RLZ +tosaslax 00ACB7 RLA tosicmp 00ABBD RLA +tosicmp0 00ABBB RLA tosneax 00AC45 RLA +tosorax 00AC5B RLA tossuba0 00AD2A RLA +tosudiva0 00AD3F RLA tosumoda0 00AD8E RLA +udiv16 00AD50 RLA zerobss 008CB2 RLA @@ -227,82 +227,82 @@ addysp1 (addysp.o): sub.o sub.s(8) or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(4032) - game.o game.s(4193) - game.o game.s(6319) - game.o game.s(7274) - game.o game.s(7329) - game.o game.s(7364) + game.o game.s(4038) + game.o game.s(4199) + game.o game.s(6338) + game.o game.s(7359) + game.o game.s(7414) + game.o game.s(7449) aslax3 (aslax3.o): - game.o game.s(3952) - game.o game.s(7373) + game.o game.s(3958) + game.o game.s(7458) aslax4 (aslax4.o): - game.o game.s(3892) - game.o game.s(4044) - game.o game.s(4205) - game.o game.s(4298) - game.o game.s(4615) - game.o game.s(5360) - game.o game.s(6318) - game.o game.s(7273) - game.o game.s(7328) + game.o game.s(3898) + game.o game.s(4050) + game.o game.s(4211) + game.o game.s(4304) + game.o game.s(4621) + game.o game.s(5366) + game.o game.s(6337) + game.o game.s(7358) + game.o game.s(7413) asrax1 (asrax1.o): - game.o game.s(3963) - game.o game.s(7596) + game.o game.s(3969) + game.o game.s(7681) asrax2 (asrax2.o): - game.o game.s(3946) - game.o game.s(5942) - game.o game.s(6228) - game.o game.s(8088) - game.o game.s(9060) + game.o game.s(3952) + game.o game.s(5948) + game.o game.s(6247) + game.o game.s(8173) + game.o game.s(9149) asrax3 (asrax3.o): - game.o game.s(7045) + game.o game.s(7130) asrax4 (asrax4.o): - game.o game.s(5941) - game.o game.s(6227) - game.o game.s(8087) - game.o game.s(9059) + game.o game.s(5947) + game.o game.s(6246) + game.o game.s(8172) + game.o game.s(9148) bnega (bneg.o): - game.o game.s(3405) - game.o game.s(6502) - game.o game.s(7852) + game.o game.s(3411) + game.o game.s(6521) + game.o game.s(7937) booleq (makebool.o): - game.o game.s(3386) - game.o game.s(8243) + game.o game.s(3392) + game.o game.s(8328) boolne (makebool.o): ne.o ne.s(8) - game.o game.s(3377) + game.o game.s(3383) copydata (copydata.o): crt0.o crt0.s(26) decsp3 (decsp3.o): - game.o game.s(3587) - game.o game.s(3745) - game.o game.s(5508) - game.o game.s(5676) - game.o game.s(8269) - game.o game.s(8402) + game.o game.s(3593) + game.o game.s(3751) + game.o game.s(5514) + game.o game.s(5682) + game.o game.s(8354) + game.o game.s(8487) decsp4 (decsp4.o): - game.o game.s(4581) + game.o game.s(4587) decsp8 (decsp8.o): - game.o game.s(9540) + game.o game.s(9629) incsp1 (incsp1.o): - game.o game.s(3285) + game.o game.s(3291) incsp2 (incsp2.o): popsreg.o popsreg.s(8) staspidx.o staspidx.s(8) - game.o game.s(4648) + game.o game.s(4654) incsp4 (incsp4.o): - game.o game.s(4942) - game.o game.s(5060) + game.o game.s(4948) + game.o game.s(5066) incsp8 (incsp8.o): - game.o game.s(4827) + game.o game.s(4833) negax (neg.o): - game.o game.s(4953) - game.o game.s(5051) - game.o game.s(6918) - game.o game.s(7334) - game.o game.s(7547) - game.o game.s(7963) + game.o game.s(4959) + game.o game.s(5057) + game.o game.s(6952) + game.o game.s(7419) + game.o game.s(7632) + game.o game.s(8048) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -324,46 +324,46 @@ ptr4 (zeropage.o): umod.o umod.s(9) udiv.o udiv.s(9) push0 (pushax.o): - game.o game.s(9881) + game.o game.s(9977) pusha (pusha.o): - game.o game.s(3787) - game.o game.s(4986) - game.o game.s(5130) - game.o game.s(5987) - game.o game.s(9014) - game.o game.s(9137) + game.o game.s(3793) + game.o game.s(4992) + game.o game.s(5136) + game.o game.s(5998) + game.o game.s(9103) + game.o game.s(9226) pusha0 (pushax.o): - game.o game.s(3392) - game.o game.s(3910) - game.o game.s(3987) - game.o game.s(4864) - game.o game.s(6373) - game.o game.s(7883) - game.o game.s(8708) - game.o game.s(9352) + game.o game.s(3398) + game.o game.s(3916) + game.o game.s(3993) + game.o game.s(4870) + game.o game.s(6392) + game.o game.s(7968) + game.o game.s(8793) + game.o game.s(9441) pushax (pushax.o): - game.o game.s(3837) - game.o game.s(4323) - game.o game.s(4542) - game.o game.s(4768) - game.o game.s(5030) - game.o game.s(8065) - game.o game.s(8354) + game.o game.s(3843) + game.o game.s(4329) + game.o game.s(4548) + game.o game.s(4774) + game.o game.s(5036) + game.o game.s(8150) + game.o game.s(8439) regsave (zeropage.o): game.o game.s(10) shlax2 (aslax2.o): - game.o game.s(8084) + game.o game.s(8169) shlax4 (aslax4.o): - game.o game.s(4710) - game.o game.s(5215) - game.o game.s(6304) - game.o game.s(8083) + game.o game.s(4716) + game.o game.s(5221) + game.o game.s(6323) + game.o game.s(8168) shrax1 (shrax1.o): - game.o game.s(5214) + game.o game.s(5220) shrax3 (shrax3.o): - game.o game.s(7909) + game.o game.s(7994) shrax4 (shrax4.o): - game.o game.s(6250) + game.o game.s(6269) sp (zeropage.o): popsreg.o popsreg.s(9) addysp.o addysp.s(8) @@ -387,11 +387,11 @@ sreg (zeropage.o): udiv.o udiv.s(9) icmp.o icmp.s(9) staspidx (staspidx.o): - game.o game.s(3849) - game.o game.s(4331) - game.o game.s(4550) + game.o game.s(3855) + game.o game.s(4337) + game.o game.s(4556) stax0sp (staxsp.o): - game.o game.s(4643) + game.o game.s(4649) tmp1 (zeropage.o): staspidx.o staspidx.s(9) shrax4.o shrax4.s(8) @@ -409,29 +409,29 @@ tmp1 (zeropage.o): aslax2.o aslax2.s(8) game.o game.s(10) tosaslax (shl.o): - game.o game.s(3997) - game.o game.s(8071) + game.o game.s(4003) + game.o game.s(8156) tosicmp (icmp.o): ne.o ne.s(8) - game.o game.s(3394) - game.o game.s(4774) - game.o game.s(4870) - game.o game.s(5036) - game.o game.s(6384) - game.o game.s(7889) - game.o game.s(9358) + game.o game.s(3400) + game.o game.s(4780) + game.o game.s(4876) + game.o game.s(5042) + game.o game.s(6403) + game.o game.s(7974) + game.o game.s(9447) tosicmp0 (icmp.o): - game.o game.s(8712) + game.o game.s(8797) tosneax (ne.o): - game.o game.s(3419) + game.o game.s(3425) tosorax (or.o): - game.o game.s(3998) + game.o game.s(4004) tossuba0 (sub.o): - game.o game.s(8070) + game.o game.s(8155) tosudiva0 (udiv.o): - game.o game.s(3912) + game.o game.s(3918) tosumoda0 (umod.o): - game.o game.s(3923) + game.o game.s(3929) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git a/testers/03_tester_interactives/dev/mainloop.h b/testers/03_tester_interactives/dev/mainloop.h index e74325b..79c7b2f 100644 --- a/testers/03_tester_interactives/dev/mainloop.h +++ b/testers/03_tester_interactives/dev/mainloop.h @@ -97,7 +97,7 @@ void game_init (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Clear tile_got persistence - vram_adr (0x2c20); + vram_adr (MAP_CLEAR_LIST_ADDRESS); vram_fill (0, MAP_SIZE*24); #endif @@ -120,12 +120,15 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Update tile_got persistence rda = on_pant << 3; - vram_write (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif } else { ft = 0; ppu_off (); } + + clear_update_list (); + #ifdef ENABLE_PROPELLERS // Clear propellers prp_idx = 0; @@ -161,7 +164,7 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Read tile_got persistence rda = n_pant << 3; - vram_read (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif draw_scr (); @@ -352,6 +355,16 @@ void game_loop (void) { #include "mainloop/interactives.h" #endif + // Update / collide hotspots + + #include "mainloop/hotspots.h" + + // Automatic scripting calls (USE_ANIM & fire zone) + + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" + #endif + // Update player if (!warp_to_level) { @@ -378,16 +391,6 @@ void game_loop (void) { if (propellers_on) propellers_do (); #endif - // Update / collide hotspots - - #include "mainloop/hotspots.h" - - // Automatic scripting calls (USE_ANIM & fire zone) - - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" - #endif - // Update bullets #ifdef PLAYER_CAN_FIRE @@ -402,6 +405,7 @@ void game_loop (void) { // Paint player + oam_index_player = oam_index; if (!warp_to_level) player_render (); // Update enemies diff --git a/testers/03_tester_interactives/dev/mainloop/interactives.h b/testers/03_tester_interactives/dev/mainloop/interactives.h index 08d5e96..0169ed1 100644 --- a/testers/03_tester_interactives/dev/mainloop/interactives.h +++ b/testers/03_tester_interactives/dev/mainloop/interactives.h @@ -28,7 +28,6 @@ if (interactives_index) { } #endif interactives_interact_with = gpit; - b_button = 0; break; } diff --git a/testers/03_tester_interactives/dev/mainloop/scripting.h b/testers/03_tester_interactives/dev/mainloop/scripting.h index aefc057..4882369 100644 --- a/testers/03_tester_interactives/dev/mainloop/scripting.h +++ b/testers/03_tester_interactives/dev/mainloop/scripting.h @@ -7,7 +7,7 @@ use_ct == USE_ANIM_INTERACT_ON && use_sub_ct == USE_ANIM_FRAMES_PER_STEP && use_type == USE_TYPE_SCRIPTING - ) { + ) { run_fire_script (); sfx_play (fire_script_success ? SFX_OBJECT : SFX_SPRING, 1); run_fire_script_do = 0; diff --git a/testers/03_tester_interactives/dev/ram/bss.h b/testers/03_tester_interactives/dev/ram/bss.h index 06fd516..78c44e8 100644 --- a/testers/03_tester_interactives/dev/ram/bss.h +++ b/testers/03_tester_interactives/dev/ram/bss.h @@ -52,6 +52,8 @@ unsigned char oobjs; // Player items, last frame value (used unsigned char oammo; // Player ammo, last frame value (used to detect changes) unsigned char okilled; // Player # of killed enems., last frame value (used to detect changes) +unsigned char oam_index_player; // Index copy + // Custom hotspot type star (used as an extra collectible). #ifdef HOTSPOT_TYPE_STAR diff --git a/testers/03_tester_interactives/dev/ram/zp.h b/testers/03_tester_interactives/dev/ram/zp.h index 462136d..e4da55b 100644 --- a/testers/03_tester_interactives/dev/ram/zp.h +++ b/testers/03_tester_interactives/dev/ram/zp.h @@ -40,7 +40,7 @@ unsigned char caux; // Auxiliar variable // Sprite related (neslib) -unsigned char oam_index, oam_index_aux; +unsigned char oam_index; // Enemies @@ -92,6 +92,7 @@ unsigned char vertical_engine_type; // Player engine type. Se ENGINE_TYPE_* signed int px, py; // Player X, Y coordinates, fixed point 10.6 signed int pvx, pvy; // Player VX, VY velocities, fixed point 10.6 unsigned char prx, pry; // Player pixel coordinates, calculated from px, py. +unsigned char pcx, pcy; // Coordinates prior to movement. unsigned char pfacing; // Player facing left, right unsigned char pfr; // Player frame unsigned char pctfr; // Player counter (for animation) diff --git a/testers/04_tester_warp_to_level/dev/assets/behs.h.bak b/testers/04_tester_warp_to_level/dev/assets/behs.h.bak deleted file mode 100644 index 942b905..0000000 --- a/testers/04_tester_warp_to_level/dev/assets/behs.h.bak +++ /dev/null @@ -1,36 +0,0 @@ -// NES MK1 v1.0 -// Copyleft Mojon Twins 2013, 2015, 2017, 2018 - -// Tile behaviours - -// Add these: -// + 1 kills (useless if + 8 obstacle) -// + 2 quicksands ( " , needs ENABLE_QUICKSANDS) -// + 4 platform (side view) -// + 8 obstacle (nullifies + 1 & + 2, see bellow) -// +16 breakable -// +32 conveyor (pushes left, + 1 pushes right) -// +64 slippery - -// Special values (= nonsensical combinations): -// 9 not safe block (safe spot not saved when jumping off this) -// 10 lock -// 11 pushable -// 32 ladder (== 32, no obstacle!) -// 64 float (== 64, no obstacle!) - -const unsigned char behs0 [] = { - 0, 0, 0, 8, 8, 8, 8, 0, 0, 0, 0,24,24,24, 1,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -const unsigned char behs1 [] = { - 0, 0, 0,40,41, 8, 8, 8, 8, 8,24,24,24, 1, 1, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -// 68 = 4 + 64, slippery platform -// 24 = 8 + 16, breakable obstacle -// 40 = 8 + 32, conveyor platform, pushes left. diff --git a/testers/04_tester_warp_to_level/dev/assets/levelset.h.bak b/testers/04_tester_warp_to_level/dev/assets/levelset.h.bak deleted file mode 100644 index 0ffa1a8..0000000 --- a/testers/04_tester_warp_to_level/dev/assets/levelset.h.bak +++ /dev/null @@ -1,104 +0,0 @@ - -// Initial screen & position, per level - -const unsigned char l_scr_ini [] = { 2, 0 }; -const unsigned char l_ini_x [] = { 3, 5 }; -const unsigned char l_ini_y [] = { 3, 5 }; -const unsigned char l_map_w [] = { 5, 5 }; - -// Ending screen & position, per level (comment if N/A) - -/* -const unsigned char l_scr_end [] = { 0, 0 }; -const unsigned char l_end_x [] = { 3, 3 }; -const unsigned char l_end_y [] = { 3, 3 }; -*/ - -// # of objects. - -const unsigned char l_player_max_objects [] = { MAX_HOTSPOTS_TYPE_1_0, MAX_HOTSPOTS_TYPE_1_1 }; - -// # of killable enemies - -const unsigned char l_player_max_enems [] = { KILLABLE_ENEMS_0, KILLABLE_ENEMS_1 }; - -// Palettes - -const unsigned char * const l_pal_bg [] = { palts0, palts1 }; -const unsigned char * const l_pal_fg [] = { palss0, palss0 }; - -// Metatiles - -const unsigned char * const l_ts_tmaps [] = { ts0_tmaps, ts1_tmaps }; -const unsigned char * const l_ts_pals [] = { ts0_pals, ts1_pals }; -const unsigned char * const l_behs [] = { behs0, behs1 }; - -// Enemy spriteset - -const unsigned char * const * const l_spr_enems [] = - { spr_enems0, spr_enems0 }; - -// Map data - -#ifdef MAP_FORMAT_PACKED - const unsigned char * const l_map [] = { map_0, map_1 }; -#endif -#if defined (MAP_FORMAT_RLE16) || defined (MAP_FORMAT_RLE53) || defined (MAP_FORMAT_RLE44) - const unsigned char * const * const l_map [] = - { map_0, map_1 }; -#endif -#if defined (MAP_FORMAT_RLE53_CHRROM) || defined (MAP_FORMAT_RLE44_CHRROM) - const unsigned char l_map_chr_rom_bank [] = { MAP_00_CHRROM, MAP_01_CHRROM }; - const unsigned int * const l_map [] = { map_00_scr_offsets, map_01_scr_offsets }; -#endif - -#ifdef MAP_WITH_DECORATIONS - #if defined (MAP_FORMAT_PACKED) || defined (MAP_FORMAT_RLE16) - const unsigned char * const * const l_decos [] = - { map_0_decos, map_1_decos }; - #else - // 0 = no decos in this level's map, 1 = decos. - const unsigned char l_decos [] = { 1, 1 }; - #endif -#endif - -#ifndef DEACTIVATE_KEYS - const unsigned char * const l_locks [] = { map_0_locks, map_1_locks }; - const unsigned char l_n_bolts [] = { N_BOLTS_0, N_BOLTS_1 }; -#endif - -// Objects - -#ifdef ENEMS_IN_CHRROM - // change 'base_address' for the actual base address in CHR-ROM - - const unsigned char l_enems_chr_rombank [] = { 2, 2 }; - const unsigned int l_enems [] = { - base_address + ENEMS0_H_BIN_OFFS, - base_address + ENEMS1_H_BIN_OFFS, - }; - const unsigned int l_hotspots [] = { - base_address + ENEMS0_H_BIN_OFFS + HOTSPOTS_OFFSET_4, - base_address + ENEMS1_H_BIN_OFFS + HOTSPOTS_OFFSET_1, - }; -#else -const unsigned char * const l_enems [] = { enems_0, enems_1 }; -const unsigned char * const l_hotspots [] = { hotspots_0, hotspots_1 }; -#endif - -// CHR-ROM bank, for CNROM - -#ifdef CNROM - const unsigned char l_chr_rom_bank [] = { 0, 1 }; -#endif - -// Interactives - -#if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) - const unsigned char * const l_interactives [] = - { interactives0, interactives1 }; -#endif - -// Music track - -const unsigned char l_music [] = { 0, 1 }; diff --git a/testers/04_tester_warp_to_level/dev/assets/precalcs.h.bak b/testers/04_tester_warp_to_level/dev/assets/precalcs.h.bak deleted file mode 100644 index 7fd5156..0000000 --- a/testers/04_tester_warp_to_level/dev/assets/precalcs.h.bak +++ /dev/null @@ -1,42 +0,0 @@ -// NES MK1 v1.0 -// Copyleft Mojon Twins 2013, 2015, 2017, 2018 - -// LUTs - -#ifdef ENABLE_MONOCOCOS - const unsigned char monococo_state_times [] = { - MONOCOCO_BASE_TIME_HIDDEN, MONOCOCO_BASE_TIME_APPEARING, MONOCOCO_BASE_TIME_ONBOARD, MONOCOCO_BASE_TIME_APPEARING - }; -#endif - -#if defined (ENABLE_COCOS) && defined(COCOS_ENABLE_LINEAR) - // left, up, right, down - const signed int coco_dx [] = { -COCO_V, 0, COCO_V, 0 }; - const signed int coco_dy [] = { 0, -COCO_V, 0, COCO_V }; -#endif - -#if defined (ENABLE_COMPILED_ENEMS) - // Directions are - // LEFT DOWNLEFT DOWN DOWNRIGHT RIGHT UPRIGHT UP UPLEFT - // 0 1 2 3 4 5 6 7 - const signed char endx [] = {-1, -1, 0, 1, 1, 1, 0, -1}; - const signed char endy [] = {0, 1, 1, 1, 0, -1, -1, -1}; -#endif - -#if defined (ENABLE_TILE_CHAC_CHAC) - const unsigned char chac_chacs_times [] = { - 0, CHAC_CHAC_IDLE_2, CHAC_CHAC_IDLE_3, CHAC_CHAC_IDLE_4, CHAC_CHAC_IDLE_3, CHAC_CHAC_IDLE_3 - }; - - const unsigned char chac_chacs_t1 [] = { - CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE, CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE + 5, CHAC_CHAC_BASE_TILE + 2, CHAC_CHAC_BASE_TILE - }; - - const unsigned char chac_chacs_t2 [] = { - CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 4, CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 6 - }; - - const unsigned char chac_chacs_t3 [] = { - CHAC_CHAC_BASE_TILE + 6, CHAC_CHAC_BASE_TILE + 1, CHAC_CHAC_BASE_TILE + 3, CHAC_CHAC_BASE_TILE + 5, CHAC_CHAC_BASE_TILE + 3, CHAC_CHAC_BASE_TILE + 1 - }; -#endif diff --git a/testers/04_tester_warp_to_level/dev/cart.nes b/testers/04_tester_warp_to_level/dev/cart.nes index ca5d85c2ccf7e244bb026958136b0bfc8507f0eb..82f82f4bc7f04b30a56b2048c12b2702a747f272 100644 GIT binary patch delta 8296 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 VoF>z&_qWcwb8%s7#+o$oe*s39SJ40f delta 8226 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 diff --git a/testers/04_tester_warp_to_level/dev/config.h b/testers/04_tester_warp_to_level/dev/config.h index 4166e82..e31d9b8 100644 --- a/testers/04_tester_warp_to_level/dev/config.h +++ b/testers/04_tester_warp_to_level/dev/config.h @@ -6,6 +6,10 @@ //#define GAME_AREA_BOTTOM //#define GAME_AREA_CUSTOM +#define MAP_CLEAR_LIST_ADDRESS 0x2c40 // To store map persistence in VRAM. + // Each screen takes 24 bytes. move it where + // It fits. Below 2c40 you may "see" the buffer + // ============================================================================ // I. General configuration // ============================================================================ diff --git a/testers/04_tester_warp_to_level/dev/config.h.bak b/testers/04_tester_warp_to_level/dev/config.h.bak deleted file mode 100644 index 937b8f4..0000000 --- a/testers/04_tester_warp_to_level/dev/config.h.bak +++ /dev/null @@ -1,672 +0,0 @@ -// NES MK1 v1.0 -// Copyleft Mojon Twins 2013, 2015, 2017, 2018 - -//#define GAME_AREA_TOP -#define GAME_AREA_MIDDLE -//#define GAME_AREA_BOTTOM -//#define GAME_AREA_CUSTOM - -// ============================================================================ -// I. General configuration -// ============================================================================ - -// In this section we define map dimmensions, initial and authomatic ending conditions, etc. - -#define MAP_W 3 // -#define MAP_H 1 // Map dimensions in screens -#define MAP_SIZE MAP_W*MAP_H - -#define PLAYER_LIFE 5 // Max / Initial life -#define PLAYER_REFILL 1 // Life refill - -#define MULTI_LEVEL // Comment for single level -#define MAX_LEVELS 2 - -#define MAX_FLAGS 2 // Keep it low if you don't need flags - -#ifndef MULTI_LEVEL - - // If you aim for a single level ROM, fill in those: - - #define SCR_INI 0 // Initial screen - #define PLAYER_INI_X 2 // - #define PLAYER_INI_Y 2 // Initial position - //#define SCR_END 99 // Final screen, undefine if N/A - #define PLAYER_END_X 99 // - #define PLAYER_END_Y 99 // Ending position - #define PLAYER_MAX_OBJECTS 1 // Objects to finish game - -#else - - // If you want multiple levels, please don't touch this much. - // Just comment SCR_END and / or PLAYER_MAX_OBJECTS if N/A. - // You should be fiddling with assets/levelset.h - - #define SCR_INI (l_scr_ini [level]) - #define PLAYER_INI_X (l_ini_x [level]) - #define PLAYER_INI_Y (l_ini_y [level]) - //#define SCR_END (l_scr_end [level]) - #define PLAYER_END_X (l_end_x [level]) - #define PLAYER_END_Y (l_end_y [level]) - #define PLAYER_MAX_OBJECTS (l_player_max_objects [level]) - -#endif - -// Some flexibility -#define HOTSPOT_TYPE_OBJECT 1 -#define HOTSPOT_TYPE_KEYS 2 -#define HOTSPOT_TYPE_REFILL 3 -//#define HOTSPOT_TYPE_AMMO 4 -//#define HOTSPOT_TYPE_TIME 5 // For time refills - -//#define HOTSPOT_TYPE_RESONATOR 4 // An example of custom hotspot -//#define HOTSPOT_TYPE_RESONATOR_ON 5 // Custom for this game. - -#define WIN_LEVEL_CUSTOM // A level ends when win_level == 1 - // And such a thing has to be setup by YOU - -//#define MAP_FORMAT_PACKED // Each byte in map data = 2 tiles, 16 tiles max. -//#define MAP_FORMAT_RLE16 // RLE'd by rlemap2. 16 tiles max. -#define MAP_FORMAT_RLE53 // RLE'd by rle53mapMK1. 32 tiles max. -//#define MAP_FORMAT_RLE44 // RLE'd by rle44mapMK1. 16 tiles max. -//#define MAP_FORMAT_RLE53_CHRROM // RLE'd by rle53mapchrrom and stored in CHR-ROM. 32 tiles max. -//#define MAP_FORMAT_RLE44_CHRROM // RLE'd by rle44mapchrrom and stored in CHR-ROM. 16 tiles max. - -//#define MAP_WITH_DECORATIONS // Add decorations when use a 16 tiles mode. - -// Use the complex renderer if you need to post-process the map buffer before -// printing. - -#define MAP_RENDERER_COMPLEX // Comment for the simple, old renderer - -// ============================================================================ -// II. Engine type -// ============================================================================ - -// This section is used to define the game engine behaviour. Many directives are related, -// and others are mutually exclusive. I think this will be pretty obvious when you look at them. - -// Right now the shooting engine is only compatible with the side-view engine. - -// Bounding box size -// ----------------- - -// Player is 8x16 for collision with BG but can be made taller by this amount. Negative values=shorter -#define PLAYER_COLLISION_VSTRETCH_BG -4 - -// This defines how the player will collide with enemies. -// Player is always 8 pixels wide and 16 pixel tall PLUS the value of this variable. -// this offset goes to the head. -// So if you define it as -8, the collision box will be 8x8 bottom centerd. -// And if you define it as 4 the collision box will be 8x20 bottom centered. -// For 16x24 sprites it's safe to leave it at 0. For 16x16 should be better -2. -#define PLAYER_COLLISION_VSTRETCH_FG -4 - -// Same for enemies. -// I usually leave it at 0 for <=24 pixels tall, 8 for 32 pixels tall. -#define ENEMS_COLLISION_VSTRETCH_FG 0 - -// General directives: -// ------------------- - -// Push boxes - -//#define PLAYER_PUSH_BOXES // If defined, tile beh 11 is pushable -#define FIRE_TO_PUSH - -//#define ENABLE_PUSHED_SCRIPT -#define PUSHED_TILE_FLAG 1 -#define PUSHED_TO_X_FLAG 2 -#define PUSHED_TO_Y_FLAG 3 - -// General stuff - -#define DEACTIVATE_KEYS // If defined, keys are not present. -//#define DEACTIVATE_OBJECTS // If defined, objects are not present. -//#define PLAYER_BOUNCES 16 -//#define DOUBLE_BOUNCE -#define DIE_AND_RESPAWN // If defined, dying = respawn on latest safe. - //#define DIE_AND_REENTER // ... also, reenter screen on death - //#define DIE_AND_REINIT // ... or start the level over! -#define PLAYER_FLICKERS 100 // If defined, collisions make player flicker for N frames -//#define WALLS_STOP_ENEMIES // If defined, enemies react to the scenary - -// Extra special tiles -// ------------------- - -#define NO_HORIZONTAL_EVIL_TILE // Only check for evil tiles vertically -//#define CUSTOM_CENTER_DETECTIONS // Define this if you need custom tile behs - -// Quicksands, beh == 2. -// For player movement values, see section 4 -// (PLAYER_VY_SINKING) - -//#define ENABLE_QUICKSANDS - -// Breakable, beh & 16 -//#define ENABLE_BREAKABLE // Breakable walls -#define BREAKABLE_LIFE 2 // Amount of hits to break wall -#define BREAKABLE_ANIM // Show explosion when breaking -#define BREAKABLE_MAX 4 // Max # of concurrent explosions -#define BREAKABLE_MAX_FRAMES 8 // Frames to show explosion -#define BREAKABLE_ERASE 0 // Tile to erase broken tiles -#define BREAKABLE_BREAKING 8 // Tile to display while breaking -//#define BREAKABLE_WALKABLE // If defined (side view), tiles break when stepped on - -// Conveyors, beh & 32 [+1] (must be & 8!) -// For player movement values, see section 4 -// (PLAYER_VX_CONVEYORS) - -//#define ENABLE_CONVEYORS - -// Slippery, beh & 64. (must be & 12!) -// For player movement values, see section 4 -// (PLAYER_AX_ICE & PLAYER_RX_ICE) - -//#define ENABLE_SLIPPERY - -// Ladders, beh == 32 - -//#define ENABLE_LADDERS - -// Special, "collectable" map tiles. -// beh == 34 - -//#define ENABLE_TILE_GET -//#define PERSISTENT_TILE_GET - -// Trampolines. Needs PLAYER_VY_TRAMPOLINE -// beh == 66 - -//#define ENABLE_TRAMPOLINES - -// Extra special stuff -// ------------------- - -// Propellers - -//#define ENABLE_PROPELLERS -#define PROPELLERS_MAX 4 -#define PROPELLERS_BASE_PATTERN 64 // First of 4 patterns to draw/animate propellers -#define PROPELLERS_MAX_LENGTH 6 // In tiles; undef for infinite -#define PROPELLER_TILE 14 // Tile # in map to detect a propeller -#define PROPELLERS_ON_BY_DEFAULT // Define so propellers are on by default - -// Killing tiles shine, beware! - -//#define ENABLE_SHINES -#define SHINES_MAX 8 -#define SHINES_BASE_PATTERN 10 // In the sprite bank, two patterns needed -#define SHINES_PALETTE 3 -#define SHINING_TILE 23 // Tile # in map to add shines - -// Resonators. Not sure if you need this, but. - -//#define ENABLE_RESONATORS -#define RESONATOR_BASE_PATTERN 0 -#define RESONATOR_PALETTE 3 -#define RESONATOR_COUNTER_OFFS_X 4 -#define RESONATOR_COUNTER_OFFS_Y 7 -//#define RESONATOR_CHANGE_BG_PAL paltsgrey // Define to change pal for this palette -//#define RESONATOR_CHANGE_SPR_PAL palssgrey // Define to change pal for this palette - -// Springs - -//#define ENABLE_SPRINGS -#define SPRING_TILE 10 -#define SPRING_SPIKE_TILE 11 -//#define SPRINGS_NEED_POSSEE // You have to actually STEP on the tile for the spikes to show -//#define SPRINGS_ON_BY_DEFAULT - -// Simple warpers. Put as 0xff type enemies. -// Destination is attr:s1 (n_pant:YX). - -//#define ENABLE_SIMPLE_WARPERS -#define SIMPLE_WARPERS_BASE_SPRID (32+((frame_counter>>2)&3)) -//#define SIMPLE_WARPERS_FIRE_BUTTON - -// No! - -//#define ENABLE_NO -#define NO_METASPRITE ssit_06 -#define NO_OFFS_X 0 -#define NO_OFFS_Y -24 - -// Use animation. -// Note: When activated hotspots need b_button press and, in side view, possee. - -#define ENABLE_USE_ANIM -#define USE_ANIM_MAX_FRAMES 8 -#define USE_ANIM_INTERACT_ON 3 -#define USE_ANIM_FRAMES_PER_STEP 4 - -// Text boxes. If you need them, you call them - -//#define ENABLE_TEXT_BOX -#define TEXT_BOX_FRAME_TILE_OFFSET 0x20 // We need tiles in the active metatileset to draw the frame -//#define TEXT_BOX_WITH_PORTRAITS // Draw spr_hs [rdd] if != 0 in the text box if defined -//#define TEXT_BOX_DIALOGUES // Add code for dialogues - -// Timer. - -//#define ENABLE_TIMER -#define TIMER_INITIAL 99 -#define TIMER_START_ON -#define TIMER_REFILL 30 -//#define TIMER_RESET_ON_ENTER -//#define TIMER_TIME_FLAG 0 // Useful with scripting. Copies time to flag -//#define TIMER_ZERO_FLAG 1 // Useful with scripting. raises flag when time zero -#define TIMER_SOUND 10 // play a sound if timer < value - - -// Enemy types and definitions -// --------------------------- - -//#define ENEMS_IN_CHRROM // Enems are stored somewhere in CHR-ROM - -#define ENEMS_LIFE_GAUGE 1 // Amount of shots/punches/kicks needed to kill enemies. -//#define NEEDS_LIFE_GAUGE_LOGIC // This is activated automaticly when needed, but you can - // do it yourself if you need it to do customs... - -//#define ENEMS_FLICKER // Ifdef: flicker, if not: explosion -//#define ENEMS_FLICKER_ONLY_ON_DYING // Flicker, but only when life == 0 -//#define ENEMS_CAN_RESPAWN // Read docs for this. - -//#define ENEMS_TREMBLE // Make enemies tremble when hit - -//#define PERSISTENT_ENEMIES -//#define PERSISTENT_DEATHS - -#define ENEMS_TOUCHED_FRAMES 8 // # frames to stay frozen after hit -//#define ENEMS_RECOIL_ON_HIT 2 // horizontal recoil when hit, #ifdef, value is speed in pixels! -//#define ENEMS_RECOIL_OVER_BOUNDARIES // (x1,y1), (x2,y2) boundaries don't stop a recoil - -//#define ENEMS_ENABLE_DYING_FRAME - -#define ENEMS_EXPLODING_CELL 32 -#define ENEMS_EXPLODING_CELLS_HIDES // Define and the baddie will be substituted by the explosion - -#define ENEMS_OCCLUDING_CELL 33 // If you use pezons or saws you need a flame for occlusion - -// Beware: only activate this if enemies are killable by any means: -//#define ENEMIES_SUFFER_ON_PLAYER_COLLISION - -// Fanties / Homing fanties / Timed fanties - -//#define ENABLE_FANTY -//#define ENABLE_HOMING_FANTY -//#define ENABLE_TIMED_FANTY - -#define FANTY_BASE_SPRID 32 -#define FANTY_WITH_FACING -#define FANTY_COLLIDES -//#define FANTY_KILLED_BY_TILE -//#define FANTY_LIFE_GAUGE 5 // Define if you need these to be tougher - -#define FANTY_A 4 -#define FANTY_MAXV 48 -//#define FANTY_FAST_ANIM // If defined, cells A/B are changed every frame (for transparency effects) - -#define FANTY_DISTANCE 80 -#define FANTY_V_RETREAT 16 - -#define FANTY_BASE_TIMER 120 // Timed fanties use this - -// Pursuers (for top-down) - -//#define ENABLE_PURSUERS // If defined, type 7 enemies are active -#define DEATH_COUNT_EXPRESSION 50+(rand8()&63) -#define TYPE_7_FIXED_SPRITE 4 // If defined, type 7 enemies are always # - -// Saws - -//#define ENABLE_SAW -#define SAW_BASE_SPRID 48 -#define SAW_V_DISPL 4 -#define SAW_EMERGING_STEPS 10 - -// Pezons - -//#define ENABLE_PEZONS -#define PEZONS_BASE_SPRID 40 -#define PEZON_WAIT 50 -#define PEZON_THRUST 384 -#define PEZON_VY_FALLING_MAX 256 -#define PEZON_G 16 - -// Chac chacs - -//#define ENABLE_CHAC_CHAC -#define CHAC_CHAC_BASE_TILE 16 -#define CHAC_CHAC_IDLE_2 16 -#define CHAC_CHAC_IDLE_3 1 -#define CHAC_CHAC_IDLE_4 50 - -//#define CHAC_CHAC_FROM_MAP // Chac chacs are not placed as enemies but as tiles -#define MAX_CHAC_CHACS 4 -#define MAX_CHAC_CHACKS_QUEUED 16 // Make the closest power of 2 >= (MAX_CHAC_CHACS*4) -#define CHAC_CHAC_DETECT_TILE 39 -#define CHAC_CHACS_CLEAR // You are placing chac chacks from map but need the path to be clear - -// Monococos - -//#define ENABLE_MONOCOCOS -//#define MONOCOCO_TYPE_A // Comment for 4 cells monococo (appearing/disappearing & hidden) -#define MONOCOCO_BASE_SPRID 56 -#define MONOCOCO_BASE_TIME_HIDDEN 150 -#define MONOCOCO_BASE_TIME_APPEARING 50 -#define MONOCOCO_BASE_TIME_ONBOARD 50 -#define MONOCOCO_FIRE_COCO_AT MONOCOCO_BASE_TIME_ONBOARD/2 - -// Shooties - -//#define ENABLE_SHOOTIES -#define SHOOTIES_BASE_SPRID 40 -#define SHOOTIES_SHOOT_OFFS_X 16 -#define SHOOTIES_SHOOT_OFFS_Y -2 -#define SHOOT_FREQ (pry+23>=en_y[gpit]&&pry<=en_y[gpit]+23&&((en_facing[gpit]&&en_x[gpit]>prx)||(en_facing[gpit]==0&&en_x[gpit]=en_y[gpit]&&pry<=en_y[gpit]+23&&((en_facing[gpit]&&en_x[gpit]>prx)||(en_facing[gpit]==0&&en_x[gpit] inventory (just 1) -//#define ONLY_ONE_OBJECT_FLAG 0 // If def, use flag [.] instead of pinv - -// Easy objects mode: A range of hotspot id's are considered -// 'objects'. The user can carry one of those. Contents of hotspots -// can change in this mode. - -//#define ENABLE_EASY_OBJECTS - -#define HS_OBJ_EMPTY 4 -#define HS_OBJ_MIN 5 -#define HS_OBJ_MAX 6 -#define HS_USE_OFFS 2 - -#define HS_TYPE_A // If defined, render receptors = HS_OBJ_EMPTY, object used = object - // Otherwise, use its own graphics. -#define HS_FIX_ON_USE // If defined, object N used at N+H_USE_OFFS becomes N+H_USE_OFFS*2 - -// Silly Brawlers -// -------------- -//#define PLAYER_PUNCHES // When on floor -#define PLAYER_PUNCH_OFFS_X 15 -#define PLAYER_PUNCH_OFFS_Y -7 - -//#define PLAYER_KICKS // While airborne -#define PLAYER_KICK_OFFS_X 12 -#define PLAYER_KICK_OFFS_Y -3 - -#define PLAYER_FROZEN_FRAMES 16 // Frames to be frozen when hit landed - -// Shooting behaviour -// ------------------ -//#define PLAYER_CAN_FIRE // If defined, shooting engine is enabled. -//#define PLAYER_CAN_FIRE_8_WAY // If defined, use diagonals -#define PLAYER_BULLET_SPEED 4 // Pixels/frame. -#define MAX_BULLETS 4 // Max number of bullets on screen. Be careful!. -#define PLAYER_BULLET_Y_OFFSET 6 // vertical offset from the player's top. -#define PLAYER_BULLET_X_OFFSET -4 // vertical offset from the player's left/right. -//#define PLAYER_BULLETS_MIN_KILLABLE 3 // If defined, only enemies >= N can be killed. -//#define BULLETS_DONT_KILL // Bullets don't kill, but affect enemies otherwise - -// Special shooting -//#define PLAYER_FIRE_RELOAD 16 // If defined # of frames until next shoot -//#define PLAYER_CHARGE_AND_FIRE // If defined, press B to charge, release to fire - #define PLAYER_CHARGE_MIN 8 - #define PLAYER_CHARGE_MAX 48 // Min/max frames for charging -//#define PLAYER_BULLET_LIFE pfiregauge // Max life. Can be whatever. -//#define PLAYER_BULLET_FLICKERS 8 // Bullets flickers for N frames before dying, if defined - -//#define MAX_AMMO 99 // If defined, ammo is not infinite! - #define AMMO_REFILL 50 // type 3 hotspots refill amo, using tile 20 - //#define INITIAL_AMMO 0 // If defined, ammo = X when entering game. - -#define BULLET_PALETTE 3 -#define BULLET_PATTERN 0 // To paint the bullet. Can be an expresion. - -// Scripting -// --------- - -#define ACTIVATE_SCRIPTING // Activates msc scripting and flag related stuff. -//#define CLEAR_FLAGS // Zero all flags when entering a level - -//#define ENABLE_EXTERN_CODE // Enables custom code to be run from the script using EXTERN n -#define ENABLE_FIRE_ZONE // Allows to define a zone which auto-triggers "FIRE" - -// Interactives -// ------------ - -//#define ENABLE_INTERACTIVES // Graphical flag representations! -#define INTERACTIVES_MAX 4 // As per screen -#define FLAG_INVENTORY 0 -//#define INTERACTIVES_ONLY_SPRITES // If you are using other means for items and just need sprites - -// Top view: -// --------- - -//#define PLAYER_TOP_DOWN // Enable top view. -//#define TOP_OVER_SIDE // UP/DOWN has priority over LEFT/RIGHT - -// Side view: -// ---------- - -// Choose ONE or SEVERAL of those. -// If you choose several, use the vertical_engine_type variable to select - -#define PLAYER_HAS_JUMP // If defined, player is able to jump. -#define PLAYER_AUTO_JUMP // Automatic jump when hitting the floor -#define PLAYER_SWIMS // If defined, player swims a la Ninjajar! -#define PLAYER_HAS_JETPAC // If defined, player can thrust a vertical jetpac - -// Extra configuration for side view: - -//#define PLAYER_JUMP_TYPE_MK2 // Use MK2 method for jump / gravity / release -//#define PLAYER_STEPS_ON_ENEMS // If defined, stepping on enemies kills them -//#define PLAYER_STEPS_STRICT // Only registers advantage hit when pvy > PLAYER_VY_FALLING_MIN -//#define PLAYER_SAFE_LANDING // Step over vertical inverts direction -//#define PLAYER_STEPS_MIN_KILLABLE 0xff // Only kill enemies with id >= PLAYER_STEPS_MIN_KILLABLE - // 0xff = Nobody -//#define PLAYER_SPINS // Spins on DOWN and JUMP and kills baddies - -// ============================================================================ -// III. Screen configuration -// ============================================================================ - -// This sections defines how stuff is rendered, where to show counters, etcetera - -//#define LIFE_X 7 // -//#define LIFE_Y 3 // Life gauge counter character coordinates - -//#define OBJECTS_X 18 // -//#define OBJECTS_Y 3 // Objects counter character coordinates -#define OBJECTS_REMAINING // Show # remaining instead of got - -//#define KEYS_X 28 // -//#define KEYS_Y 3 // Keys counter character coordinates - -//#define KILLED_X 16 // -//#define KILLED_Y 2 // Kills counter character coordinates - -//#define AMMO_X 8 // -//#define AMMO_Y 2 // Ammo counter character coordinates - -//#define HS_INV_X 136 // -//#define HS_INV_Y 11 // Object you are carrying - -//#define TIMER_X 0 // -//#define TIMER_Y 5 // Current timer value - -// Text -//#define LINE_OF_TEXT 26 // If defined, scripts can show text @ Y = # -//#define LINE_OF_TEXT_X 1 // X coordinate. - -// ============================================================================ -// IV. Player movement configuration -// ============================================================================ - -// This section is used to define which constants are used in the gravity/acceleration engine. -// If a side-view engine is configured, we have to define vertical and horizontal constants -// separately. If a top-view engine is configured instead, the horizontal values are also -// applied to the vertical component, vertical values are ignored. - -// IV.1. Vertical movement. Only for side-view. - -#define PLAYER_VY_FALLING_MAX 256 // Max. velocity when falling -#define PLAYER_VY_FALLING_MIN 64 // Use for animating if you need -#define PLAYER_VY_SINKING 2 -#define PLAYER_G 16 // Gravity - -#define PLAYER_VY_JUMP_INITIAL 64 -#define PLAYER_VY_JUMP_MAX 192 // Max. velocity when jumping -#define PLAYER_AY_JUMP 12 // Jumpin acceleration - -#define PLAYER_AY_JETPAC 32 // Jetpac increment -#define PLAYER_VY_JETPAC_MAX 256 // Max jetpac vertical speed - -#define PLAYER_AY_SWIM 8 // Swimming acceleration. -#define PLAYER_VY_SWIM_MAX 64 // Swimming max. speed - -#define PLAYER_VY_LADDERS 96 - -#define PLAYER_AY_FLOAT 16 -#define PLAYER_VY_FLOAT_MAX 256 - -#define PLAYER_AY_UNTHRUST 8 // Used in the Autojump engine. - -// IV.1.b MK2 style jump (overrides PLAYER_?Y_JUMP_* defined before!) -// (Used if PLAYER_JUMP_TYPE_MK2 is defined) -#define PLAYER_G_MK2_JUMPING 4 -#define PLAYER_VY_MK2_JUMP_INITIAL 208 -#define PLAYER_VY_MK2_JUMP_RELEASE 96 -#define PLAYER_VY_MK2_JUMP_A_STEPS 16 - -// IV.2. Horizontal (side view) or general (top view) movement. - -#define PLAYER_VX_MAX 128 // Max. horizontal speed -#define PLAYER_VX_CONVEYORS 64 -#define PLAYER_AX 16 // Horizontal acceleration -#define PLAYER_AX_ICE 4 -#define PLAYER_RX 16 // Horizontal friction -#define PLAYER_RX_ICE 2 - -#define PLAYER_VX_MIN (PLAYER_AX << 1) - -#define PLAYER_V_REBOUND 224 - -// Animation cells - -#ifdef PLAYER_TOP_DOWN - - // Cell definitions for top-down view - - #define CELL_FACING_RIGHT 0 - #define CELL_FACING_LEFT 6 - #define CELL_FACING_UP 18 - #define CELL_FACING_DOWN 12 - - #define CELL_IDLE 0 - #define CELL_WALK_CYCLE 1 - #define CELL_PUSHING 5 - - #define CELL_USE 24 - -#else - - // Cell definitions for side view - - #define CELL_FACING_RIGHT 0 - #define CELL_FACING_LEFT 16 - - #define CELL_IDLE 0 - #define CELL_WALK_INIT 1 - #define CELL_WALK_CYCLE 1 - #define CELL_AIRBORNE 5 - #define CELL_ASCENDING 5 - #define CELL_DESCENDING 6 - - #define CELL_SWIM_CYCLE 6 - - #define CELL_USE 7 - - #define CELL_PUNCHING 8 - #define CELL_KICKING 9 - - #define CELL_CLIMB_CYCLE 20 - #define CELL_CLIMB_HALF 29 -#endif - -// Music - -#define MUSIC_INGAME 0 - -// SFX - -#define SFX_START 0 -#define SFX_TILE 1 -#define SFX_OBJECT 2 -#define SFX_USE 3 -#define SFX_PHIT 4 -#define SFX_DUMMY1 5 -#define SFX_ENHIT 6 -#define SFX_DUMMY2 7 -#define SFX_JUMP 8 -#define SFX_BULLET 9 -#define SFX_COCO 10 -#define SFX_SPRING 11 -#define SFX_COUNT 12 -#define SFX_BREAKH 13 -#define SFX_HITTER 14 -#define SFX_STEPON 15 -#define SFX_FLOAT 16 -#define SFX_BREAKB 17 diff --git a/testers/04_tester_warp_to_level/dev/engine/enengine.h b/testers/04_tester_warp_to_level/dev/engine/enengine.h index 4c1b093..6b60bae 100644 --- a/testers/04_tester_warp_to_level/dev/engine/enengine.h +++ b/testers/04_tester_warp_to_level/dev/engine/enengine.h @@ -772,6 +772,7 @@ void enems_move (void) { n_pant = _en_mx; on_pant = 0xff; prx = _en_x2; px = prx << FIXBITS; pry = _en_y2; py = pry << FIXBITS; + player_stop (); #if defined (SIMPLE_WARPERS_FIRE_BUTTON) && (defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS)) phitteract = 0; @@ -817,6 +818,10 @@ void enems_move (void) { pvy = 0; } } + + #ifdef PLAYER_SPINS + if (pgotten) pspin = 0; + #endif #endif // Is enemy collidable? If not, exit @@ -960,7 +965,7 @@ void enems_move (void) { #endif if (en_sg_2) { pkill = 1; - #ifdef PLAYER_BOUNCES + #if defined (PLAYER_BOUNCES) && !defined (DIE_AND_RESPAWN) pvx = ADD_SIGN (_en_mx, PLAYER_V_REBOUND); pvy = ADD_SIGN (_en_my, PLAYER_V_REBOUND); diff --git a/testers/04_tester_warp_to_level/dev/engine/player.h b/testers/04_tester_warp_to_level/dev/engine/player.h index 28914d7..8cd006d 100644 --- a/testers/04_tester_warp_to_level/dev/engine/player.h +++ b/testers/04_tester_warp_to_level/dev/engine/player.h @@ -106,8 +106,9 @@ void player_to_pixels (void) { } void player_kill (void) { + oam_index = oam_index_player; player_render (); - update_cycle (); + ppu_waitnmi (); pkill = phit = 0; sfx_play (SFX_PHIT, 0); @@ -199,6 +200,7 @@ void player_move (void) { #endif hitv = hith = 0; + pcx = prx; pcy = pry; pnotsafe = 0; #ifdef ENABLE_SLIPPERY pice = 0; @@ -565,7 +567,7 @@ void player_move (void) { #endif if (pad0 & PAD_A) { if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (32 - (pctj)); + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; ++ pctj; if (pctj == 16) pj = 0; } @@ -725,7 +727,7 @@ void player_move (void) { if (cy2 != cy3) if (at3 & 2) player_process_tile (at3, cx1, cy3, rdm, cy3); #endif } else { - hith = ((at1 & 1) || (at2 & 1) || (at3 & 1)); + hith = ((at1 & 1) || (at2 & 1) || (at3 & 1)); } #else cm_two_points (); @@ -741,6 +743,7 @@ void player_move (void) { hith = ((at1 & 1) || (at2 & 1)); } #endif + if (pvy > 0) hith &= ((pry & 15) > 4); } // Facing @@ -772,10 +775,17 @@ void player_move (void) { if (pgotten == 0) { #ifdef NO_HORIZONTAL_EVIL_TILE - if (hitv || hith) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } #else - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } - if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); } + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } + #ifndef PLAYER_TOP_DOWN + else + #endif + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } #endif #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) diff --git a/testers/04_tester_warp_to_level/dev/game.c.bak b/testers/04_tester_warp_to_level/dev/game.c.bak deleted file mode 100644 index 7c11e7d..0000000 --- a/testers/04_tester_warp_to_level/dev/game.c.bak +++ /dev/null @@ -1,149 +0,0 @@ -// NES MK1 v1.0 -// Copyleft Mojon Twins 2013, 2015, 2017, 2018 - -// Uses neslib and related tools by Shiru - -// Comment this when you are done -//#define DEBUG -#define DEBUG_LEVEL 0 -#define DEBUG_SCR_INI 20 -#define DEBUG_INI_X 14 -#define DEBUG_INI_Y 5 -// - -#define MAX_BOLTS 16 // max 32, make it as small as possible. - -#include "neslib.h" - -#include "definitions.h" -#include "config.h" -#include "autodefs.h" - -// ************** -// * const data * -// ************** - -#include "assets/precalcs.h" -#include "assets/palettes.h" -#include "assets/behs.h" -#include "assets/map0.h" -#include "assets/enems0.h" -#include "assets/map1.h" -#include "assets/enems1.h" -#include "assets/spritedata.h" -#include "assets/tiledata.h" -#include "assets/metasprites.h" -#include "assets/custom_texts.h" -#ifdef ENABLE_COMPILED_ENEMS - #include "assets/compiled_enems.h" -#endif -#if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) - #include "assets/interactives.h" -#endif -#ifdef MULTI_LEVEL - #include "assets/levelset.h" -#endif - -// Music -extern const unsigned char m_ingame []; - -// Push to zero page: -#pragma bssseg (push,"ZEROPAGE") -#pragma dataseg(push,"ZEROPAGE") - -#include "ram/zp.h" - -// Everything else on normal RAM -#pragma bssseg (push,"BSS") -#pragma dataseg(push,"BSS") - -#include "ram/bss.h" - -// ************* -// Main includes -// ************* - -#include "engine/prototypes.h" -#include "engine/general.h" -#include "engine/printer.h" -#ifdef ENABLE_TEXT_BOX - #include "engine/textbox.h" -#endif -#ifdef ENABLE_BREAKABLE - #include "engine/breakable.h" -#endif -#include "engine/hotspots.h" -#ifdef ENABLE_PROPELLERS - #include "engine/propellers.h" -#endif -#ifdef ENABLE_TILE_CHAC_CHAC - #include "engine/tile_chac_chac.h" -#endif -#ifdef ENABLE_SHINES - #include "engine/shines.h" -#endif -#ifdef ENABLE_INTERACTIVES - #include "engine/interactives.h" -#endif -#ifdef ENABLE_COCOS - #include "engine/cocos.h" -#endif -#include "engine/player.h" -#include "engine/enengine.h" -#include "engine/frame.h" -#include "my/pres.h" -#ifdef ACTIVATE_SCRIPTING - #ifdef ENABLE_EXTERN_CODE - #include "my/extern.h" - #endif - #include "assets/mscnes.h" -#endif -#include "mainloop.h" - -// ************* -// Main function -// ************* - -void main(void) { - bank_spr (1); - bank_bg (0); - - ppu_off (); - first_game = 1; - - // Main loop - - while (1) { - pres (palts0, scr_title); - - #ifdef MULTI_LEVEL - level = 0; - #endif - plife = PLAYER_LIFE; - - // Game loop - - while (1) { - scroll (0, SCROLL_Y); - game_init (); - game_loop (); - - if (game_over) { - pres (palts0, scr_game_over); - break; - } else { - #ifdef MULTI_LEVEL - if (warp_to_level) continue; - level ++; - if (level == MAX_LEVELS) - #endif - { - pres (palts0, scr_the_end); - break; - } - } - } - - first_game = 0; - } -} diff --git a/testers/04_tester_warp_to_level/dev/labels.txt b/testers/04_tester_warp_to_level/dev/labels.txt index c5c3dda..33d4285 100644 --- a/testers/04_tester_warp_to_level/dev/labels.txt +++ b/testers/04_tester_warp_to_level/dev/labels.txt @@ -7,86 +7,86 @@ crt0.o: VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 002000 game.o: - CODE Offs = 000000 Size = 001D5A + CODE Offs = 000000 Size = 001D97 RODATA Offs = 00052A Size = 00085C - BSS Offs = 000000 Size = 00026E - ZEROPAGE Offs = 000000 Size = 0000B6 + BSS Offs = 000000 Size = 00026F + ZEROPAGE Offs = 000000 Size = 0000B7 runtime.lib(addysp.o): - CODE Offs = 001D5A Size = 00000E + CODE Offs = 001D97 Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 001D68 Size = 00000B + CODE Offs = 001DA5 Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 001D73 Size = 00000E + CODE Offs = 001DB0 Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 001D81 Size = 000011 + CODE Offs = 001DBE Size = 000011 runtime.lib(asrax1.o): - CODE Offs = 001D92 Size = 00000A + CODE Offs = 001DCF Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 001D9C Size = 00000F + CODE Offs = 001DD9 Size = 00000F runtime.lib(asrax3.o): - CODE Offs = 001DAB Size = 000014 + CODE Offs = 001DE8 Size = 000014 runtime.lib(asrax4.o): - CODE Offs = 001DBF Size = 000019 + CODE Offs = 001DFC Size = 000019 runtime.lib(bneg.o): - CODE Offs = 001DD8 Size = 00000E + CODE Offs = 001E15 Size = 00000E runtime.lib(call.o): - CODE Offs = 001DE6 Size = 000007 + CODE Offs = 001E23 Size = 000007 runtime.lib(copydata.o): - CODE Offs = 001DED Size = 00002D + CODE Offs = 001E2A Size = 00002D runtime.lib(decsp3.o): - CODE Offs = 001E1A Size = 00000D + CODE Offs = 001E57 Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 001E27 Size = 00000D + CODE Offs = 001E64 Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 001E34 Size = 00000D + CODE Offs = 001E71 Size = 00000D runtime.lib(ge.o): - CODE Offs = 001E41 Size = 00000A + CODE Offs = 001E7E Size = 00000A runtime.lib(icmp.o): - CODE Offs = 001E4B Size = 00002E + CODE Offs = 001E88 Size = 00002E runtime.lib(incsp1.o): - CODE Offs = 001E79 Size = 000007 + CODE Offs = 001EB6 Size = 000007 runtime.lib(incsp2.o): - CODE Offs = 001E80 Size = 000016 + CODE Offs = 001EBD Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 001E96 Size = 000005 + CODE Offs = 001ED3 Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 001E9B Size = 000005 + CODE Offs = 001ED8 Size = 000005 runtime.lib(le.o): - CODE Offs = 001EA0 Size = 00000A + CODE Offs = 001EDD Size = 00000A runtime.lib(makebool.o): - CODE Offs = 001EAA Size = 000031 + CODE Offs = 001EE7 Size = 000031 runtime.lib(neg.o): - CODE Offs = 001EDB Size = 00000E + CODE Offs = 001F18 Size = 00000E runtime.lib(or.o): - CODE Offs = 001EE9 Size = 000012 + CODE Offs = 001F26 Size = 000012 runtime.lib(popa.o): - CODE Offs = 001EFB Size = 00000C + CODE Offs = 001F38 Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 001F07 Size = 000010 + CODE Offs = 001F44 Size = 000010 runtime.lib(pusha.o): - CODE Offs = 001F17 Size = 000016 + CODE Offs = 001F54 Size = 000016 runtime.lib(pushax.o): - CODE Offs = 001F2D Size = 00001A + CODE Offs = 001F6A Size = 00001A runtime.lib(shl.o): - CODE Offs = 001F47 Size = 00002B + CODE Offs = 001F84 Size = 00002B runtime.lib(shrax3.o): - CODE Offs = 001F72 Size = 00000E + CODE Offs = 001FAF Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 001F80 Size = 000011 + CODE Offs = 001FBD Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 001F91 Size = 000016 + CODE Offs = 001FCE Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 001FA7 Size = 00000B + CODE Offs = 001FE4 Size = 00000B runtime.lib(sub.o): - CODE Offs = 001FB2 Size = 000015 + CODE Offs = 001FEF Size = 000015 runtime.lib(udiv.o): - CODE Offs = 001FC7 Size = 00004F + CODE Offs = 002004 Size = 00004F runtime.lib(umod.o): - CODE Offs = 002016 Size = 000011 + CODE Offs = 002053 Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000B6 Size = 00001A + ZEROPAGE Offs = 0000B7 Size = 00001A Segment list: @@ -95,23 +95,23 @@ Name Start End Size -------------------------------------------- CHARS 000000 001FFF 002000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000F7 0000D0 -BSS 000300 00056D 00026E +ZEROPAGE 000028 0000F8 0000D1 +BSS 000300 00056E 00026F STARTUP 008000 008CB1 000CB2 INIT 008CB2 008CD4 000023 -CODE 008CD5 00ACFB 002027 -RODATA 00ACFC 00BA81 000D86 +CODE 008CD5 00AD38 002064 +RODATA 00AD39 00BABE 000D86 VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 00026E REA -__DATA_LOAD__ 00BA82 RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 00026F REA +__DATA_LOAD__ 00BABF RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA _bank_bg 008416 RLA _bank_spr 008406 RLA -_delay 0085BB RLA _main 00A98F RLA +_delay 0085BB RLA _main 00A9CC RLA _memfill 00858C RLA _music_pause 0087A1 REA _music_play 008734 REA _music_stop 0086F6 REA _oam_clear 0082AF RLA _oam_hide_rest 008341 RLA @@ -123,33 +123,33 @@ _ppu_waitnmi 00834E RLA _scroll 0083A7 RLA _set_vram_update 008510 RLA _sfx_play 00848A RLA _vram_adr 00851A RLA _vram_fill 008525 RLA _vram_put 008521 RLA _vram_write 00845A RLA -addysp 00AA30 RLA addysp1 00AA2F RLA -aslax2 00AA3D RLA aslax3 00AA48 RLA -aslax4 00AA56 RLA asrax1 00AA67 RLA -asrax2 00AA71 RLA asrax3 00AA80 RLA -asrax4 00AA94 RLA bnega 00AAB1 RLA -booleq 00AB85 RLA boolge 00AB95 RLA -boolle 00AB8B RLA callax 00AABB RLA -copydata 00AAC2 RLA decsp3 00AAEF RLA -decsp4 00AAFC RLA decsp8 00AB09 RLA -incsp1 00AB4E RLA incsp2 00AB5D RLA -incsp4 00AB6B RLA incsp8 00AB70 RLA -negax 00ABB0 RLA popa 00ABD0 RLA -popax 00AB55 RLA popsreg 00ABDC RLA -ptr1 0000E6 RLZ ptr2 0000E8 RLZ -ptr4 0000EC RLZ push0 00AC02 RLA -pusha 00ABF0 RLA pusha0 00AC04 RLA -pushax 00AC06 RLA regsave 0000E2 RLZ -shlax2 00AA3D RLA shlax4 00AA56 RLA -shrax3 00AC47 RLA shrax4 00AC55 RLA -sp 0000DE RLZ sreg 0000E0 RLZ -staspidx 00AC66 RLA stax0sp 00AC7C RLA -tmp1 0000EE RLZ tosaslax 00AC1C RLA -tosgeax 00AB1A RLA tosicmp 00AB22 RLA -tosicmp0 00AB20 RLA tosleax 00AB79 RLA -tosorax 00ABC0 RLA tossuba0 00AC87 RLA -tosudiva0 00AC9C RLA tosumoda0 00ACEB RLA -udiv16 00ACAD RLA zerobss 008CB2 RLA +addysp 00AA6D RLA addysp1 00AA6C RLA +aslax2 00AA7A RLA aslax3 00AA85 RLA +aslax4 00AA93 RLA asrax1 00AAA4 RLA +asrax2 00AAAE RLA asrax3 00AABD RLA +asrax4 00AAD1 RLA bnega 00AAEE RLA +booleq 00ABC2 RLA boolge 00ABD2 RLA +boolle 00ABC8 RLA callax 00AAF8 RLA +copydata 00AAFF RLA decsp3 00AB2C RLA +decsp4 00AB39 RLA decsp8 00AB46 RLA +incsp1 00AB8B RLA incsp2 00AB9A RLA +incsp4 00ABA8 RLA incsp8 00ABAD RLA +negax 00ABED RLA popa 00AC0D RLA +popax 00AB92 RLA popsreg 00AC19 RLA +ptr1 0000E7 RLZ ptr2 0000E9 RLZ +ptr4 0000ED RLZ push0 00AC3F RLA +pusha 00AC2D RLA pusha0 00AC41 RLA +pushax 00AC43 RLA regsave 0000E3 RLZ +shlax2 00AA7A RLA shlax4 00AA93 RLA +shrax3 00AC84 RLA shrax4 00AC92 RLA +sp 0000DF RLZ sreg 0000E1 RLZ +staspidx 00ACA3 RLA stax0sp 00ACB9 RLA +tmp1 0000EF RLZ tosaslax 00AC59 RLA +tosgeax 00AB57 RLA tosicmp 00AB5F RLA +tosicmp0 00AB5D RLA tosleax 00ABB6 RLA +tosorax 00ABFD RLA tossuba0 00ACC4 RLA +tosudiva0 00ACD9 RLA tosumoda0 00AD28 RLA +udiv16 00ACEA RLA zerobss 008CB2 RLA @@ -230,89 +230,88 @@ addysp1 (addysp.o): sub.o sub.s(8) or.o or.s(8) aslax2 (aslax2.o): - game.o game.s(3184) - game.o game.s(3682) - game.o game.s(3843) - game.o game.s(5652) - game.o game.s(6709) - game.o game.s(6764) - game.o game.s(6799) - game.o game.s(8145) - game.o game.s(8618) + game.o game.s(3190) + game.o game.s(3688) + game.o game.s(3849) + game.o game.s(5671) + game.o game.s(6758) + game.o game.s(6813) + game.o game.s(6848) + game.o game.s(8194) + game.o game.s(8667) aslax3 (aslax3.o): - game.o game.s(3602) - game.o game.s(6808) + game.o game.s(3608) + game.o game.s(6857) aslax4 (aslax4.o): - game.o game.s(3030) - game.o game.s(3542) - game.o game.s(3694) - game.o game.s(3855) - game.o game.s(3948) - game.o game.s(4265) - game.o game.s(5651) - game.o game.s(6708) - game.o game.s(6763) - game.o game.s(8144) - game.o game.s(8612) + game.o game.s(3036) + game.o game.s(3548) + game.o game.s(3700) + game.o game.s(3861) + game.o game.s(3954) + game.o game.s(4271) + game.o game.s(5670) + game.o game.s(6757) + game.o game.s(6812) + game.o game.s(8193) + game.o game.s(8661) asrax1 (asrax1.o): - game.o game.s(3613) - game.o game.s(7031) + game.o game.s(3619) + game.o game.s(7080) asrax2 (asrax2.o): - game.o game.s(3596) - game.o game.s(5166) - game.o game.s(5561) - game.o game.s(7517) - game.o game.s(8794) + game.o game.s(3602) + game.o game.s(5172) + game.o game.s(5580) + game.o game.s(7566) + game.o game.s(8847) asrax3 (asrax3.o): - game.o game.s(6480) + game.o game.s(6529) asrax4 (asrax4.o): - game.o game.s(5165) - game.o game.s(5560) - game.o game.s(7516) - game.o game.s(8793) + game.o game.s(5171) + game.o game.s(5579) + game.o game.s(7565) + game.o game.s(8846) bnega (bneg.o): - game.o game.s(3077) - game.o game.s(5835) - game.o game.s(7281) + game.o game.s(3083) + game.o game.s(5854) + game.o game.s(7330) booleq (makebool.o): - game.o game.s(7672) + game.o game.s(7721) boolge (makebool.o): ge.o ge.s(8) boolle (makebool.o): le.o le.s(8) callax (call.o): - game.o game.s(7896) + game.o game.s(7945) copydata (copydata.o): crt0.o crt0.s(26) decsp3 (decsp3.o): - game.o game.s(3237) - game.o game.s(3395) - game.o game.s(4885) - game.o game.s(7698) + game.o game.s(3243) + game.o game.s(3401) + game.o game.s(4891) + game.o game.s(7747) decsp4 (decsp4.o): - game.o game.s(4231) - game.o game.s(9410) + game.o game.s(4237) + game.o game.s(9468) decsp8 (decsp8.o): - game.o game.s(9061) + game.o game.s(9114) incsp1 (incsp1.o): - game.o game.s(2937) + game.o game.s(2943) incsp2 (incsp2.o): popsreg.o popsreg.s(8) staspidx.o staspidx.s(8) - game.o game.s(4298) + game.o game.s(4304) incsp4 (incsp4.o): - game.o game.s(4592) - game.o game.s(4701) - game.o game.s(7923) + game.o game.s(4598) + game.o game.s(4707) + game.o game.s(7972) incsp8 (incsp8.o): - game.o game.s(4477) + game.o game.s(4483) negax (neg.o): - game.o game.s(4603) - game.o game.s(4692) - game.o game.s(6356) - game.o game.s(6769) - game.o game.s(6982) - game.o game.s(7392) + game.o game.s(4609) + game.o game.s(4698) + game.o game.s(6818) + game.o game.s(7031) + game.o game.s(7441) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -335,45 +334,45 @@ ptr4 (zeropage.o): umod.o umod.s(9) udiv.o udiv.s(9) push0 (pushax.o): - game.o game.s(9437) + game.o game.s(9495) pusha (pusha.o): - game.o game.s(3437) - game.o game.s(4636) - game.o game.s(4771) - game.o game.s(5211) - game.o game.s(8748) - game.o game.s(8868) + game.o game.s(3443) + game.o game.s(4642) + game.o game.s(4777) + game.o game.s(5222) + game.o game.s(8801) + game.o game.s(8921) pusha0 (pushax.o): - game.o game.s(3045) - game.o game.s(3560) - game.o game.s(3637) - game.o game.s(4514) - game.o game.s(5706) - game.o game.s(7312) - game.o game.s(8312) + game.o game.s(3051) + game.o game.s(3566) + game.o game.s(3643) + game.o game.s(4520) + game.o game.s(5725) + game.o game.s(7361) + game.o game.s(8361) pushax (pushax.o): - game.o game.s(3103) - game.o game.s(3487) - game.o game.s(3973) - game.o game.s(4192) - game.o game.s(4418) - game.o game.s(4671) - game.o game.s(7494) - game.o game.s(7946) - game.o game.s(7981) - game.o game.s(8005) + game.o game.s(3109) + game.o game.s(3493) + game.o game.s(3979) + game.o game.s(4198) + game.o game.s(4424) + game.o game.s(4677) + game.o game.s(7543) + game.o game.s(7995) + game.o game.s(8030) + game.o game.s(8054) regsave (zeropage.o): game.o game.s(10) shlax2 (aslax2.o): - game.o game.s(7513) + game.o game.s(7562) shlax4 (aslax4.o): - game.o game.s(4360) - game.o game.s(5637) - game.o game.s(7512) + game.o game.s(4366) + game.o game.s(5656) + game.o game.s(7561) shrax3 (shrax3.o): - game.o game.s(7338) + game.o game.s(7387) shrax4 (shrax4.o): - game.o game.s(5583) + game.o game.s(5602) sp (zeropage.o): popsreg.o popsreg.s(9) addysp.o addysp.s(8) @@ -397,11 +396,11 @@ sreg (zeropage.o): udiv.o udiv.s(9) icmp.o icmp.s(9) staspidx (staspidx.o): - game.o game.s(3499) - game.o game.s(3981) - game.o game.s(4200) + game.o game.s(3505) + game.o game.s(3987) + game.o game.s(4206) stax0sp (staxsp.o): - game.o game.s(4293) + game.o game.s(4299) tmp1 (zeropage.o): staspidx.o staspidx.s(9) shrax4.o shrax4.s(8) @@ -418,31 +417,31 @@ tmp1 (zeropage.o): aslax2.o aslax2.s(8) game.o game.s(10) tosaslax (shl.o): - game.o game.s(3647) - game.o game.s(7500) + game.o game.s(3653) + game.o game.s(7549) tosgeax (ge.o): - game.o game.s(3105) + game.o game.s(3111) tosicmp (icmp.o): le.o le.s(8) ge.o ge.s(8) - game.o game.s(3051) - game.o game.s(4424) - game.o game.s(4520) - game.o game.s(4677) - game.o game.s(5717) - game.o game.s(7318) + game.o game.s(3057) + game.o game.s(4430) + game.o game.s(4526) + game.o game.s(4683) + game.o game.s(5736) + game.o game.s(7367) tosicmp0 (icmp.o): - game.o game.s(8316) + game.o game.s(8365) tosleax (le.o): - game.o game.s(3114) + game.o game.s(3120) tosorax (or.o): - game.o game.s(3648) + game.o game.s(3654) tossuba0 (sub.o): - game.o game.s(7499) + game.o game.s(7548) tosudiva0 (udiv.o): - game.o game.s(3562) + game.o game.s(3568) tosumoda0 (umod.o): - game.o game.s(3573) + game.o game.s(3579) udiv16 (udiv.o): umod.o umod.s(8) zerobss (zerobss.o): diff --git a/testers/04_tester_warp_to_level/dev/mainloop.h b/testers/04_tester_warp_to_level/dev/mainloop.h index e74325b..79c7b2f 100644 --- a/testers/04_tester_warp_to_level/dev/mainloop.h +++ b/testers/04_tester_warp_to_level/dev/mainloop.h @@ -97,7 +97,7 @@ void game_init (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Clear tile_got persistence - vram_adr (0x2c20); + vram_adr (MAP_CLEAR_LIST_ADDRESS); vram_fill (0, MAP_SIZE*24); #endif @@ -120,12 +120,15 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Update tile_got persistence rda = on_pant << 3; - vram_write (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif } else { ft = 0; ppu_off (); } + + clear_update_list (); + #ifdef ENABLE_PROPELLERS // Clear propellers prp_idx = 0; @@ -161,7 +164,7 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Read tile_got persistence rda = n_pant << 3; - vram_read (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif draw_scr (); @@ -352,6 +355,16 @@ void game_loop (void) { #include "mainloop/interactives.h" #endif + // Update / collide hotspots + + #include "mainloop/hotspots.h" + + // Automatic scripting calls (USE_ANIM & fire zone) + + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" + #endif + // Update player if (!warp_to_level) { @@ -378,16 +391,6 @@ void game_loop (void) { if (propellers_on) propellers_do (); #endif - // Update / collide hotspots - - #include "mainloop/hotspots.h" - - // Automatic scripting calls (USE_ANIM & fire zone) - - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" - #endif - // Update bullets #ifdef PLAYER_CAN_FIRE @@ -402,6 +405,7 @@ void game_loop (void) { // Paint player + oam_index_player = oam_index; if (!warp_to_level) player_render (); // Update enemies diff --git a/testers/04_tester_warp_to_level/dev/ram/bss.h b/testers/04_tester_warp_to_level/dev/ram/bss.h index 06fd516..78c44e8 100644 --- a/testers/04_tester_warp_to_level/dev/ram/bss.h +++ b/testers/04_tester_warp_to_level/dev/ram/bss.h @@ -52,6 +52,8 @@ unsigned char oobjs; // Player items, last frame value (used unsigned char oammo; // Player ammo, last frame value (used to detect changes) unsigned char okilled; // Player # of killed enems., last frame value (used to detect changes) +unsigned char oam_index_player; // Index copy + // Custom hotspot type star (used as an extra collectible). #ifdef HOTSPOT_TYPE_STAR diff --git a/testers/04_tester_warp_to_level/dev/ram/zp.h b/testers/04_tester_warp_to_level/dev/ram/zp.h index 462136d..e4da55b 100644 --- a/testers/04_tester_warp_to_level/dev/ram/zp.h +++ b/testers/04_tester_warp_to_level/dev/ram/zp.h @@ -40,7 +40,7 @@ unsigned char caux; // Auxiliar variable // Sprite related (neslib) -unsigned char oam_index, oam_index_aux; +unsigned char oam_index; // Enemies @@ -92,6 +92,7 @@ unsigned char vertical_engine_type; // Player engine type. Se ENGINE_TYPE_* signed int px, py; // Player X, Y coordinates, fixed point 10.6 signed int pvx, pvy; // Player VX, VY velocities, fixed point 10.6 unsigned char prx, pry; // Player pixel coordinates, calculated from px, py. +unsigned char pcx, pcy; // Coordinates prior to movement. unsigned char pfacing; // Player facing left, right unsigned char pfr; // Player frame unsigned char pctfr; // Player counter (for animation) diff --git a/testers/05_tester_tile_get/dev/assets/levelset.h b/testers/05_tester_tile_get/dev/assets/levelset.h index f2825ba..787235a 100644 --- a/testers/05_tester_tile_get/dev/assets/levelset.h +++ b/testers/05_tester_tile_get/dev/assets/levelset.h @@ -258,6 +258,6 @@ const unsigned char l_music [] = { 2, 2, 4, 1, 1, 4, 0, 0, 4, - 0, 0, 4, - 0, 0, 4, + 3, 3, 4, + 1, 1, 4, }; diff --git a/testers/05_tester_tile_get/dev/cart.nes b/testers/05_tester_tile_get/dev/cart.nes index 0d267fbe53f3887dd7df47f7002cc798a4114227..b6af5bf69af9ba327eadb9c322958275d3cef103 100644 GIT binary patch delta 18954 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 bW&bZj@vJd$b0`t( delta 18739 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 aw&&S)_-q_F|EO`}gbxag8)Gu0jQ> 4; cm_two_points (); - if ((at1 & 9) || (at2 & 9)) { + if ((at1 & 8) || (at2 & 8)) { pry = ((cy1 + 1) << 4) + PLAYER_COLLISION_VSTRETCH_BG; - if ((at1 & 1) || (at2 & 1)) { - hitv = 1; - } else pvy = 0; - py = pry << FIXBITS; + pvy = 0; py = pry << FIXBITS; pgotten = 0; pfiring = 1; #if defined (PLAYER_TOP_DOWN) && (defined(PLAYER_PUSH_BOXES) || !defined(DEACTIVATE_KEYS)) @@ -402,6 +400,8 @@ void player_move (void) { if (at1 & 2) player_process_tile (at1, cx1, cy1, cx1, cy1 - 1); if (cx1 != cx2) if (at2 & 2) player_process_tile (at2, cx2, cy1, cx2, cy1 - 1); #endif + } else if ((at1 & 1) || (at2 & 1)) { + hitv = 1; } #ifdef ENABLE_QUICKSANDS else if ((at1 == 2) || (at2 == 2)) { @@ -418,12 +418,12 @@ void player_move (void) { cy1 = cy2 = (pry + 16) >> 4; cm_two_points (); #ifdef PLAYER_TOP_DOWN - if ((at1 & 9) || (at2 & 9)) + if ((at1 & 8) || (at2 & 8)) #else if ( pry < ((cy1 - 1) << 4) + 4 && ( - (at1 & 13) || (at2 & 13) + (at1 & 12) || (at2 & 12) #ifdef ENABLE_LADDERS || (!ponladder && ((at1 & 32) && at2 & 32)) #endif @@ -431,14 +431,7 @@ void player_move (void) { ) #endif { - if ((at1 & 1) || (at2 & 1) - #ifndef PLAYER_TOP_DOWN - && (pry & 15) > 4 - #endif - ) { - hitv = 1; - } else pvy = 0; - pry = ((cy1 - 1) << 4);py = pry << FIXBITS; + pvy = 0; pry = ((cy1 - 1) << 4);py = pry << FIXBITS; pgotten = 0; pfiring = 1; ppossee = 1; @@ -476,6 +469,8 @@ void player_move (void) { #endif if ((at1 & 1) || (at2 & 1)) pnotsafe = 1; + } else if ((at1 & 1) || (at2 & 1)) { + if ((pry & 15) > 4) hitv = 1; } #ifdef ENABLE_QUICKSANDS else { @@ -572,7 +567,7 @@ void player_move (void) { #endif if (pad0 & PAD_A) { if (pj) { - if (pctj < PLAYER_AY_JUMP) pvy -= (32 - (pctj)); + if (pctj < PLAYER_AY_JUMP) pvy -= (PLAYER_AY_JUMP - (pctj)); if (pvy < -PLAYER_VY_JUMP_MAX) pvy = -PLAYER_VY_JUMP_MAX; ++ pctj; if (pctj == 16) pj = 0; } @@ -723,29 +718,32 @@ void player_move (void) { } #if PLAYER_COLLISION_VSTRETCH_BG > 0 cm_three_points (); - if ((at1 & 9) || (at2 & 9) || (at3 & 9)) { - if ((at1 & 1) || (at2 & 1) || (at3 & 1)) hith = 1; else pvx = 0; - prx = rda; px = prx << FIXBITS; pfiring = 1; + if ((at1 & 8) || (at2 & 8) || (at3 & 8)) { + pvx = 0; prx = rda; px = prx << FIXBITS; pfiring = 1; // Special obstacles #if (defined(PLAYER_PUSH_BOXES) || !defined(DEACTIVATE_KEYS)) if (at2 & 2) player_process_tile (at2, cx1, cy2, rdm, cy2); if (cy2 != cy3) if (at3 & 2) player_process_tile (at3, cx1, cy3, rdm, cy3); #endif - } + } else { + hith = ((at1 & 1) || (at2 & 1) || (at3 & 1)); + } #else cm_two_points (); - if ((at1 & 9) || (at2 & 9)) { - if ((at1 & 1) || (at2 & 1)) hith = 1; else pvx = 0; - prx = rda; px = prx << FIXBITS; pfiring = 1; + if ((at1 & 8) || (at2 & 8)) { + pvx = 0; prx = rda; px = prx << FIXBITS; pfiring = 1; // Special obstacles #if (defined(PLAYER_PUSH_BOXES) || !defined(DEACTIVATE_KEYS)) if (at1 & 2) player_process_tile (at1, cx1, cy1, rdm, cy1); if (cy1 != cy2) if (at2 & 2) player_process_tile (at2, cx1, cy2, rdm, cy2); #endif - } + } else { + hith = ((at1 & 1) || (at2 & 1)); + } #endif + if (pvy > 0) hith &= ((pry & 15) > 4); } // Facing @@ -777,13 +775,17 @@ void player_move (void) { if (pgotten == 0) { #ifdef NO_HORIZONTAL_EVIL_TILE - if (hitv || hith) { phit = 1; if (pvy) pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); else pvy = -PLAYER_V_REBOUND; } + if (hitv || hith) { + if (hith) { prx = pcx; px = prx << FIXBITS; } + if (hitv) { pry = pcy; py = pry << FIXBITS; } + if (pvy < 0) pvy = PLAYER_V_REBOUND; else pvy = -PLAYER_V_REBOUND; + } #else - if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); } + if (hitv) { phit = 1; pvy = ADD_SIGN (-pvy, PLAYER_V_REBOUND); pry = pcy; py = pry << FIXBITS; } #ifndef PLAYER_TOP_DOWN else #endif - if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); } + if (hith) { phit = 1; pvx = ADD_SIGN (-pvx, PLAYER_V_REBOUND); prx = pcx; px = prx << FIXBITS; } #endif #if defined (ENABLE_CHAC_CHAC) || defined (ENABLE_TILE_CHAC_CHAC) diff --git a/testers/05_tester_tile_get/dev/game.c b/testers/05_tester_tile_get/dev/game.c index 776e2a1..3ff293b 100644 --- a/testers/05_tester_tile_get/dev/game.c +++ b/testers/05_tester_tile_get/dev/game.c @@ -122,7 +122,6 @@ void main(void) { while (1) { title (); // level* vars are set there. - plife = PLAYER_LIFE; // Game loop @@ -134,8 +133,10 @@ void main(void) { level_act = base_act [level]; if (level == 0) { + music_play (MUSIC_CUTS); rdm = 0; cutscene (); rdm = 1; cutscene (); + music_stop (); } pres (paltstitle, scr_level); @@ -155,12 +156,13 @@ void main(void) { #ifdef MULTI_LEVEL if (warp_to_level) continue; level ++; - if (level == MAX_LEVELS) #endif { + music_play (MUSIC_CUTS); rdm = 2; cutscene (); rdm = (pemmeralds == 0x3f) ? 4 : 3; cutscene (); + music_stop (); if (pemmeralds == 0x3f) pres (palts0, scr_the_end); first_game = 1; break; diff --git a/testers/05_tester_tile_get/dev/labels.txt b/testers/05_tester_tile_get/dev/labels.txt index 593243a..dd17adb 100644 --- a/testers/05_tester_tile_get/dev/labels.txt +++ b/testers/05_tester_tile_get/dev/labels.txt @@ -1,100 +1,100 @@ Modules list: ------------- crt0.o: - RODATA Offs = 000000 Size = 000FE9 + RODATA Offs = 000000 Size = 001114 HEADER Offs = 000000 Size = 000010 STARTUP Offs = 000000 Size = 000CB2 VECTORS Offs = 000000 Size = 000006 CHARS Offs = 000000 Size = 008000 game.o: - CODE Offs = 000000 Size = 004095 - RODATA Offs = 000FE9 Size = 001C58 - BSS Offs = 000000 Size = 000427 - ZEROPAGE Offs = 000000 Size = 0000B8 + CODE Offs = 000000 Size = 0040FB + RODATA Offs = 001114 Size = 001C57 + BSS Offs = 000000 Size = 00042A + ZEROPAGE Offs = 000000 Size = 0000B5 runtime.lib(add.o): - CODE Offs = 004095 Size = 00001A + CODE Offs = 0040FB Size = 00001A runtime.lib(addysp.o): - CODE Offs = 0040AF Size = 00000E + CODE Offs = 004115 Size = 00000E runtime.lib(aslax2.o): - CODE Offs = 0040BD Size = 00000B + CODE Offs = 004123 Size = 00000B runtime.lib(aslax3.o): - CODE Offs = 0040C8 Size = 00000E + CODE Offs = 00412E Size = 00000E runtime.lib(aslax4.o): - CODE Offs = 0040D6 Size = 000011 + CODE Offs = 00413C Size = 000011 runtime.lib(asr.o): - CODE Offs = 0040E7 Size = 00002B + CODE Offs = 00414D Size = 00002B runtime.lib(asrax1.o): - CODE Offs = 004112 Size = 00000A + CODE Offs = 004178 Size = 00000A runtime.lib(asrax2.o): - CODE Offs = 00411C Size = 00000F + CODE Offs = 004182 Size = 00000F runtime.lib(asrax3.o): - CODE Offs = 00412B Size = 000014 + CODE Offs = 004191 Size = 000014 runtime.lib(asrax4.o): - CODE Offs = 00413F Size = 000019 + CODE Offs = 0041A5 Size = 000019 runtime.lib(bneg.o): - CODE Offs = 004158 Size = 00000E + CODE Offs = 0041BE Size = 00000E runtime.lib(call.o): - CODE Offs = 004166 Size = 000007 + CODE Offs = 0041CC Size = 000007 runtime.lib(copydata.o): - CODE Offs = 00416D Size = 00002D + CODE Offs = 0041D3 Size = 00002D runtime.lib(decsp2.o): - CODE Offs = 00419A Size = 00000D + CODE Offs = 004200 Size = 00000D runtime.lib(decsp3.o): - CODE Offs = 0041A7 Size = 00000D + CODE Offs = 00420D Size = 00000D runtime.lib(decsp4.o): - CODE Offs = 0041B4 Size = 00000D + CODE Offs = 00421A Size = 00000D runtime.lib(decsp8.o): - CODE Offs = 0041C1 Size = 00000D + CODE Offs = 004227 Size = 00000D runtime.lib(icmp.o): - CODE Offs = 0041CE Size = 00002E + CODE Offs = 004234 Size = 00002E runtime.lib(incsp1.o): - CODE Offs = 0041FC Size = 000007 + CODE Offs = 004262 Size = 000007 runtime.lib(incsp2.o): - CODE Offs = 004203 Size = 000016 + CODE Offs = 004269 Size = 000016 runtime.lib(incsp4.o): - CODE Offs = 004219 Size = 000005 + CODE Offs = 00427F Size = 000005 runtime.lib(incsp8.o): - CODE Offs = 00421E Size = 000005 + CODE Offs = 004284 Size = 000005 runtime.lib(ldai.o): - CODE Offs = 004223 Size = 00000C + CODE Offs = 004289 Size = 00000C runtime.lib(makebool.o): - CODE Offs = 00422F Size = 000031 + CODE Offs = 004295 Size = 000031 runtime.lib(mul8.o): - CODE Offs = 004260 Size = 00003A + CODE Offs = 0042C6 Size = 00003A runtime.lib(neg.o): - CODE Offs = 00429A Size = 00000E + CODE Offs = 004300 Size = 00000E runtime.lib(or.o): - CODE Offs = 0042A8 Size = 000012 + CODE Offs = 00430E Size = 000012 runtime.lib(popa.o): - CODE Offs = 0042BA Size = 00000C + CODE Offs = 004320 Size = 00000C runtime.lib(popsreg.o): - CODE Offs = 0042C6 Size = 000010 + CODE Offs = 00432C Size = 000010 runtime.lib(pusha.o): - CODE Offs = 0042D6 Size = 000016 + CODE Offs = 00433C Size = 000016 runtime.lib(pushax.o): - CODE Offs = 0042EC Size = 00001A + CODE Offs = 004352 Size = 00001A runtime.lib(shl.o): - CODE Offs = 004306 Size = 00002B + CODE Offs = 00436C Size = 00002B runtime.lib(shrax3.o): - CODE Offs = 004331 Size = 00000E + CODE Offs = 004397 Size = 00000E runtime.lib(shrax4.o): - CODE Offs = 00433F Size = 000011 + CODE Offs = 0043A5 Size = 000011 runtime.lib(staspidx.o): - CODE Offs = 004350 Size = 000016 + CODE Offs = 0043B6 Size = 000016 runtime.lib(staxsp.o): - CODE Offs = 004366 Size = 00000B + CODE Offs = 0043CC Size = 00000B runtime.lib(staxspi.o): - CODE Offs = 004371 Size = 00001B + CODE Offs = 0043D7 Size = 00001B runtime.lib(sub.o): - CODE Offs = 00438C Size = 000015 + CODE Offs = 0043F2 Size = 000015 runtime.lib(udiv.o): - CODE Offs = 0043A1 Size = 00004F + CODE Offs = 004407 Size = 00004F runtime.lib(umod.o): - CODE Offs = 0043F0 Size = 000011 + CODE Offs = 004456 Size = 000011 runtime.lib(zerobss.o): INIT Offs = 000000 Size = 000023 runtime.lib(zeropage.o): - ZEROPAGE Offs = 0000B8 Size = 00001A + ZEROPAGE Offs = 0000B5 Size = 00001A Segment list: @@ -103,24 +103,24 @@ Name Start End Size -------------------------------------------- CHARS 000000 007FFF 008000 HEADER 000000 00000F 000010 -ZEROPAGE 000028 0000F9 0000D2 -BSS 000300 000726 000427 +ZEROPAGE 000028 0000F6 0000CF +BSS 000300 000729 00042A STARTUP 008000 008CB1 000CB2 INIT 008CB2 008CD4 000023 -CODE 008CD5 00D0D5 004401 -RODATA 00D0D6 00FD16 002C41 +CODE 008CD5 00D13B 004467 +RODATA 00D13C 00FEA6 002D6B VECTORS 00FFFA 00FFFF 000006 Exports list: ------------- -__BSS_RUN__ 000300 RLA __BSS_SIZE__ 000427 REA -__DATA_LOAD__ 00FD17 RLA __DATA_RUN__ 000300 RLA +__BSS_RUN__ 000300 RLA __BSS_SIZE__ 00042A REA +__DATA_LOAD__ 00FEA7 RLA __DATA_RUN__ 000300 RLA __DATA_SIZE__ 000000 REA __RAM_SIZE__ 000500 REA __RAM_START__ 000300 RLA __STARTUP__ 000001 REA _bank_bg 008416 RLA _bank_spr 008406 RLA _bankswitch 0085C3 RLA _delay 0085BB RLA -_main 00CC76 RLA _memfill 00858C RLA +_main 00CCC4 RLA _memfill 00858C RLA _music_pause 0087A1 REA _music_play 008734 REA _music_stop 0086F6 REA _oam_clear 0082AF RLA _oam_hide_rest 008341 RLA _oam_meta_spr 0082F9 RLA @@ -135,36 +135,36 @@ _set_vram_update 008510 RLA _sfx_play 00848A RLA _split 0083DA RLA _unrle_vram 008367 RLA _vram_adr 00851A RLA _vram_fill 008525 RLA _vram_put 008521 RLA _vram_read 008427 RLA -_vram_write 00845A RLA addysp 00CD85 RLA -addysp1 00CD84 RLA aslax2 00CD92 RLA -aslax3 00CD9D RLA aslax4 00CDAB RLA -asrax1 00CDE7 RLA asrax2 00CDF1 RLA -asrax3 00CE00 RLA asrax4 00CE14 RLA -bnega 00CE31 RLA booleq 00CF0A RLA -boolne 00CF04 RLA boolult 00CF22 RLA -callax 00CE3B RLA copydata 00CE42 RLA -decsp2 00CE6F RLA decsp3 00CE7C RLA -decsp4 00CE89 RLA decsp8 00CE96 RLA -incsp1 00CED1 RLA incsp2 00CEE0 RLA -incsp4 00CEEE RLA incsp8 00CEF3 RLA -ldaidx 00CEF8 RLA negax 00CF6F RLA -popa 00CF8F RLA popax 00CED8 RLA -popsreg 00CF9B RLA ptr1 0000E8 RLZ -ptr2 0000EA RLZ ptr4 0000EE RLZ -push0 00CFC1 RLA pusha 00CFAF RLA -pusha0 00CFC3 RLA pushax 00CFC5 RLA -regsave 0000E4 RLZ shlax2 00CD92 RLA -shlax4 00CDAB RLA shrax3 00D006 RLA -shrax4 00D014 RLA sp 0000E0 RLZ -sreg 0000E2 RLZ staspidx 00D025 RLA -stax0sp 00D03B RLA staxspidx 00D046 RLA -tmp1 0000F0 RLZ tosaddax 00CD6C RLA -tosaslax 00CFDB RLA tosasrax 00CDBC RLA -tosicmp 00CEA5 RLA tosicmp0 00CEA3 RLA -tosorax 00CF7F RLA tossuba0 00D061 RLA -tossubax 00D063 RLA tosudiva0 00D076 RLA -tosumoda0 00D0C5 RLA tosumula0 00CF35 RLA -udiv16 00D087 RLA zerobss 008CB2 RLA +_vram_write 00845A RLA addysp 00CDEB RLA +addysp1 00CDEA RLA aslax2 00CDF8 RLA +aslax3 00CE03 RLA aslax4 00CE11 RLA +asrax1 00CE4D RLA asrax2 00CE57 RLA +asrax3 00CE66 RLA asrax4 00CE7A RLA +bnega 00CE97 RLA booleq 00CF70 RLA +boolne 00CF6A RLA boolult 00CF88 RLA +callax 00CEA1 RLA copydata 00CEA8 RLA +decsp2 00CED5 RLA decsp3 00CEE2 RLA +decsp4 00CEEF RLA decsp8 00CEFC RLA +incsp1 00CF37 RLA incsp2 00CF46 RLA +incsp4 00CF54 RLA incsp8 00CF59 RLA +ldaidx 00CF5E RLA negax 00CFD5 RLA +popa 00CFF5 RLA popax 00CF3E RLA +popsreg 00D001 RLA ptr1 0000E5 RLZ +ptr2 0000E7 RLZ ptr4 0000EB RLZ +push0 00D027 RLA pusha 00D015 RLA +pusha0 00D029 RLA pushax 00D02B RLA +regsave 0000E1 RLZ shlax2 00CDF8 RLA +shlax4 00CE11 RLA shrax3 00D06C RLA +shrax4 00D07A RLA sp 0000DD RLZ +sreg 0000DF RLZ staspidx 00D08B RLA +stax0sp 00D0A1 RLA staxspidx 00D0AC RLA +tmp1 0000ED RLZ tosaddax 00CDD2 RLA +tosaslax 00D041 RLA tosasrax 00CE22 RLA +tosicmp 00CF0B RLA tosicmp0 00CF09 RLA +tosorax 00CFE5 RLA tossuba0 00D0C7 RLA +tossubax 00D0C9 RLA tosudiva0 00D0DC RLA +tosumoda0 00D12B RLA tosumula0 00CF9B RLA +udiv16 00D0ED RLA zerobss 008CB2 RLA @@ -269,16 +269,16 @@ aslax2 (aslax2.o): game.o game.s(9631) game.o game.s(10545) game.o game.s(10791) - game.o game.s(11837) - game.o game.s(13277) - game.o game.s(13332) - game.o game.s(13373) - game.o game.s(14867) - game.o game.s(18058) - game.o game.s(18881) + game.o game.s(11828) + game.o game.s(13303) + game.o game.s(13358) + game.o game.s(13399) + game.o game.s(14893) + game.o game.s(18085) + game.o game.s(18912) aslax3 (aslax3.o): game.o game.s(7472) - game.o game.s(13382) + game.o game.s(13408) aslax4 (aslax4.o): game.o game.s(7045) game.o game.s(7412) @@ -291,19 +291,19 @@ aslax4 (aslax4.o): game.o game.s(10127) game.o game.s(10544) game.o game.s(10790) - game.o game.s(11836) - game.o game.s(13276) - game.o game.s(13331) - game.o game.s(13769) - game.o game.s(14866) - game.o game.s(18052) - game.o game.s(18880) + game.o game.s(11827) + game.o game.s(13302) + game.o game.s(13357) + game.o game.s(13795) + game.o game.s(14892) + game.o game.s(18079) + game.o game.s(18911) asrax1 (asrax1.o): game.o game.s(7483) game.o game.s(9279) game.o game.s(9569) - game.o game.s(13595) - game.o game.s(15348) + game.o game.s(13621) + game.o game.s(15374) asrax2 (asrax2.o): game.o game.s(7466) game.o game.s(9284) @@ -311,58 +311,58 @@ asrax2 (asrax2.o): game.o game.s(9512) game.o game.s(11169) game.o game.s(11512) - game.o game.s(11729) - game.o game.s(14742) - game.o game.s(18554) - game.o game.s(19567) + game.o game.s(11737) + game.o game.s(14768) + game.o game.s(18585) + game.o game.s(19598) asrax3 (asrax3.o): game.o game.s(8581) game.o game.s(9916) - game.o game.s(12992) - game.o game.s(16248) + game.o game.s(13018) + game.o game.s(16274) asrax4 (asrax4.o): game.o game.s(9290) game.o game.s(9511) game.o game.s(11168) game.o game.s(11511) - game.o game.s(11728) - game.o game.s(14741) - game.o game.s(18553) - game.o game.s(18829) + game.o game.s(11736) + game.o game.s(14767) + game.o game.s(18584) + game.o game.s(18860) bnega (bneg.o): game.o game.s(11341) - game.o game.s(12128) - game.o game.s(14251) - game.o game.s(19314) + game.o game.s(12118) + game.o game.s(14277) + game.o game.s(19211) booleq (makebool.o): - game.o game.s(16605) + game.o game.s(16631) boolne (makebool.o): game.o game.s(8290) boolult (makebool.o): - game.o game.s(15061) + game.o game.s(15087) callax (call.o): - game.o game.s(17145) + game.o game.s(17167) copydata (copydata.o): crt0.o crt0.s(26) decsp2 (decsp2.o): - game.o game.s(12043) + game.o game.s(12014) decsp3 (decsp3.o): game.o game.s(6884) game.o game.s(7265) game.o game.s(9825) game.o game.s(9964) game.o game.s(10331) - game.o game.s(14294) - game.o game.s(17244) + game.o game.s(14320) + game.o game.s(17266) decsp4 (decsp4.o): game.o game.s(8734) game.o game.s(11196) - game.o game.s(17554) - game.o game.s(18258) - game.o game.s(19488) - game.o game.s(19987) + game.o game.s(17581) + game.o game.s(18285) + game.o game.s(19519) + game.o game.s(20028) decsp8 (decsp8.o): - game.o game.s(19187) + game.o game.s(19084) incsp1 (incsp1.o): game.o game.s(6960) incsp2 (incsp2.o): @@ -374,22 +374,22 @@ incsp2 (incsp2.o): incsp4 (incsp4.o): game.o game.s(9095) game.o game.s(9170) - game.o game.s(17167) + game.o game.s(17189) incsp8 (incsp8.o): game.o game.s(8980) ldaidx (ldai.o): game.o game.s(7139) - game.o game.s(16086) + game.o game.s(16112) negax (neg.o): game.o game.s(7152) game.o game.s(9106) game.o game.s(9161) game.o game.s(9582) game.o game.s(10650) - game.o game.s(12221) - game.o game.s(13337) - game.o game.s(13546) - game.o game.s(14498) + game.o game.s(12211) + game.o game.s(13363) + game.o game.s(13572) + game.o game.s(14524) popa (popa.o): crt0.o crt0.s(26) popax (incsp2.o): @@ -418,7 +418,7 @@ ptr4 (zeropage.o): udiv.o udiv.s(9) mul8.o mul8.s(10) push0 (pushax.o): - game.o game.s(19953) + game.o game.s(19984) pusha (pusha.o): game.o game.s(7307) game.o game.s(9331) @@ -429,11 +429,11 @@ pusha (pusha.o): game.o game.s(10932) game.o game.s(11311) game.o game.s(11562) - game.o game.s(12237) - game.o game.s(15177) - game.o game.s(17413) - game.o game.s(18120) - game.o game.s(18628) + game.o game.s(12227) + game.o game.s(15203) + game.o game.s(17440) + game.o game.s(18147) + game.o game.s(18659) pusha0 (pushax.o): game.o game.s(7126) game.o game.s(7430) @@ -441,11 +441,11 @@ pusha0 (pushax.o): game.o game.s(9017) game.o game.s(10578) game.o game.s(11243) - game.o game.s(11881) - game.o game.s(13741) - game.o game.s(14401) - game.o game.s(17746) - game.o game.s(18937) + game.o game.s(11882) + game.o game.s(13767) + game.o game.s(14427) + game.o game.s(17773) + game.o game.s(18968) pushax (pushax.o): game.o game.s(7110) game.o game.s(7357) @@ -457,29 +457,29 @@ pushax (pushax.o): game.o game.s(10581) game.o game.s(10835) game.o game.s(10986) - game.o game.s(13808) - game.o game.s(16087) - game.o game.s(16974) - game.o game.s(17210) - game.o game.s(17320) - game.o game.s(17446) - game.o game.s(17470) - game.o game.s(17504) - game.o game.s(19563) + game.o game.s(13834) + game.o game.s(16113) + game.o game.s(17000) + game.o game.s(17232) + game.o game.s(17342) + game.o game.s(17473) + game.o game.s(17497) + game.o game.s(17531) + game.o game.s(19594) regsave (zeropage.o): game.o game.s(10) shlax2 (aslax2.o): - game.o game.s(16396) + game.o game.s(16422) shlax4 (aslax4.o): game.o game.s(8863) - game.o game.s(11805) - game.o game.s(14803) + game.o game.s(11813) + game.o game.s(14829) shrax3 (shrax3.o): - game.o game.s(14427) + game.o game.s(14453) shrax4 (shrax4.o): - game.o game.s(11751) - game.o game.s(14759) - game.o game.s(18837) + game.o game.s(11759) + game.o game.s(14785) + game.o game.s(18868) sp (zeropage.o): addysp.o addysp.s(8) sub.o sub.s(9) @@ -511,7 +511,7 @@ staspidx (staspidx.o): game.o game.s(7369) game.o game.s(7851) game.o game.s(8697) - game.o game.s(13812) + game.o game.s(13838) stax0sp (staxsp.o): game.o game.s(8796) staxspidx (staxspi.o): @@ -519,8 +519,8 @@ staxspidx (staxspi.o): game.o game.s(10652) game.o game.s(10852) game.o game.s(11013) - game.o game.s(13845) - game.o game.s(16225) + game.o game.s(13871) + game.o game.s(16251) tmp1 (zeropage.o): staxspi.o staxspi.s(9) staspidx.o staspidx.s(9) @@ -542,30 +542,30 @@ tosaddax (add.o): game.o game.s(11011) tosaslax (shl.o): game.o game.s(7517) - game.o game.s(16089) + game.o game.s(16115) tosasrax (asr.o): - game.o game.s(16146) + game.o game.s(16172) tosicmp (icmp.o): game.o game.s(8927) game.o game.s(9023) game.o game.s(9146) game.o game.s(10618) game.o game.s(11249) - game.o game.s(11892) - game.o game.s(14407) - game.o game.s(19833) + game.o game.s(11893) + game.o game.s(14433) + game.o game.s(19864) tosicmp0 (icmp.o): game.o game.s(7129) - game.o game.s(17750) + game.o game.s(17777) tosorax (or.o): game.o game.s(7518) tossuba0 (sub.o): - game.o game.s(13744) - game.o game.s(15287) + game.o game.s(13770) + game.o game.s(15313) tossubax (sub.o): game.o game.s(9280) - game.o game.s(16223) - game.o game.s(19568) + game.o game.s(16249) + game.o game.s(19599) tosudiva0 (udiv.o): game.o game.s(7432) game.o game.s(10583) diff --git a/testers/05_tester_tile_get/dev/mainloop.h b/testers/05_tester_tile_get/dev/mainloop.h index bd28928..79c7b2f 100644 --- a/testers/05_tester_tile_get/dev/mainloop.h +++ b/testers/05_tester_tile_get/dev/mainloop.h @@ -97,7 +97,7 @@ void game_init (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Clear tile_got persistence - vram_adr (0x2c20); + vram_adr (MAP_CLEAR_LIST_ADDRESS); vram_fill (0, MAP_SIZE*24); #endif @@ -120,12 +120,15 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Update tile_got persistence rda = on_pant << 3; - vram_write (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_write (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif } else { ft = 0; ppu_off (); } + + clear_update_list (); + #ifdef ENABLE_PROPELLERS // Clear propellers prp_idx = 0; @@ -161,7 +164,7 @@ void prepare_scr (void) { #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) // Read tile_got persistence rda = n_pant << 3; - vram_read (tile_got, 0x2c20 + (rda << 1) + rda, 24); + vram_read (tile_got, MAP_CLEAR_LIST_ADDRESS + (rda << 1) + rda, 24); #endif draw_scr (); @@ -352,6 +355,16 @@ void game_loop (void) { #include "mainloop/interactives.h" #endif + // Update / collide hotspots + + #include "mainloop/hotspots.h" + + // Automatic scripting calls (USE_ANIM & fire zone) + + #ifdef ACTIVATE_SCRIPTING + #include "mainloop/scripting.h" + #endif + // Update player if (!warp_to_level) { @@ -378,16 +391,6 @@ void game_loop (void) { if (propellers_on) propellers_do (); #endif - // Update / collide hotspots - - #include "mainloop/hotspots.h" - - // Automatic scripting calls (USE_ANIM & fire zone) - - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" - #endif - // Update bullets #ifdef PLAYER_CAN_FIRE diff --git a/testers/05_tester_tile_get/dev/mainloop.h.bak b/testers/05_tester_tile_get/dev/mainloop.h.bak deleted file mode 100644 index eb14c73..0000000 --- a/testers/05_tester_tile_get/dev/mainloop.h.bak +++ /dev/null @@ -1,475 +0,0 @@ -// NES MK1 v1.0 -// Copyleft Mojon Twins 2013, 2015, 2017, 2018 - -// Main loop & helpers - -void game_init (void) { - - win_level = game_over = 0; - - // Assets setup. Selects tileset, map, palettes, etc. - #include "mainloop/asset_setup.h" - - pal_bg (c_pal_bg); - pal_spr (c_pal_fg); - - cls (); - - draw_game_frame (); - //clean_gauge (); - - hotspots_load (); - #ifndef DEACTIVATE_KEYS - // bolts_load - memfill (lkact, 1, c_max_bolts); - #endif - - if (!warp_to_level) { - n_pant = SCR_INI; - px = (4 + (PLAYER_INI_X << 4)) << FIXBITS; - py = (PLAYER_INI_Y << 4) << FIXBITS; - } - player_to_pixels (); - player_init (); - - #ifdef PERSISTENT_ENEMIES - enems_persistent_load (); - #endif - - #ifdef PERSISTENT_DEATHS - enems_persistent_deaths_load (); - #endif - - #ifndef DEACTIVATE_OBJECTS - pobjs = 0; - #endif - - #ifdef HOTSPOT_TYPE_STAR - pstars = 0; - #endif - - #ifndef DEACTIVATE_KEYS - pkeys = 0; - #endif - - #ifdef ENABLE_RESONATORS - res_on = 0; - res_disable = 0; - #endif - - #ifdef ENABLE_USE_ANIM - if (!warp_to_level) use_ct = 0; - #endif - - #ifdef ENABLE_NO - no_ct = 0; - #endif - - #ifdef ENABLE_PROPELLERS - #ifdef PROPELLERS_ON_BY_DEFAULT - propellers_on = 1; - #else - propellers_on = 0; - #endif - #endif - - #ifdef ENABLE_SPRINGS - #ifdef SPRINGS_ON_BY_DEFAULT - springs_on = 1; - #else - springs_on = 0; - #endif - #endif - - #ifdef ENABLE_TIMER - #ifndef TIMER_RESET_ON_ENTER - timer = TIMER_INITIAL; - timer_frames = 50; - timer_zero = 0; - otimer = 0xff; - #endif - #ifdef TIMER_START_ON - timer_on = 1; - #else - timer_on = 0; - #endif - #endif - - #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) - // Clear tile_got persistence - vram_adr (0x2c20); - vram_fill (0, MAP_SIZE*24); - #endif - - half_life = 0; - frame_counter = 0; - olife = oammo = oobjs = okeys = 0xff; - okilled = 0xff; - - #include "my/extra_inits.h" - - #if defined (ENABLE_INTERACTIVES) && defined (INTERACTIVES_FROM_CODE) - #include "my/interactives_setup.h" - #endif -} - -void prepare_scr (void) { - if (!ft) { - fade_out (); - ppu_off (); - #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) - // Update tile_got persistence - rda = on_pant << 3; - vram_write (tile_got, 0x2c20 + (rda << 1) + rda, 24); - #endif - } else { - ft = 0; - ppu_off (); - } - #ifdef ENABLE_PROPELLERS - // Clear propellers - prp_idx = 0; - #endif - - #ifdef PERSISTENT_ENEMIES - // Preserve enems - enems_persistent_update (); - #endif - - enems_load (); - hotspots_create (); - - #ifdef ENABLE_COCOS - cocos_init (); - #endif - - #if defined (ACTIVATE_SCRIPTING) && defined (ENABLE_FIRE_ZONE) - f_zone_ac = 0; - fzx1 = fzx2 = fzy1 = fzy2 = 240; - #endif - - #ifdef ENABLE_SHINES - shine_active_ct = 0; - max_shines = 0; - #endif - - #ifdef ENABLE_TILE_CHAC_CHAC - chac_chacs_queue_write = chac_chacs_queue_read = 0; - max_chac_chacs = 0; - #endif - - #if defined (ENABLE_TILE_GET) && defined (PERSISTENT_TILE_GET) - // Read tile_got persistence - rda = n_pant << 3; - vram_read (tile_got, 0x2c20 + (rda << 1) + rda, 24); - #endif - - draw_scr (); - - #if defined (ENABLE_BREAKABLE) && defined (BREAKABLE_ANIM) - do_process_breakable = 0; - gpit = BREAKABLE_MAX; while (gpit --) brkf [gpit] = 0; - #endif - - #ifdef LINE_OF_TEXT - _x = LINE_OF_TEXT_X; _y = LINE_OF_TEXT; - pr_str (" "); - #endif - - #if defined (DIE_AND_RESPAWN) && (defined (PLAYER_SWIMS) || defined (PLAYER_TOP_DOWN)) - player_register_safe_spot (); - #endif - - #ifdef PLAYER_CAN_FIRE - for (gpit = 0; gpit < MAX_BULLETS; gpit ++) { - b_slots [gpit] = gpit; bst [gpit] = 0; - } - b_slots_i = MAX_BULLETS; - #endif - - #ifdef ENABLE_INTERACTIVES - #ifdef INTERACTIVES_FROM_CODE - interactives_create (); - #else - interactives_index = 0; - #endif - - interactives_interact_with = 0xff; - #endif - - // Reenable sprites and tiles now we are finished. - #ifdef CNROM - bankswitch (l_chr_rom_bank [level]); - #endif - - ppu_on_all (); - - #ifdef ACTIVATE_SCRIPTING - #if defined (ENABLE_PUSHED_SCRIPT) - just_pushed = 0; - #endif - #if defined (ENABLE_INTERACTIVES) - just_interacted = 0; - #endif - // Entering any script - run_script (2 * MAP_SIZE + 1); - // This room script - run_script (n_pant << 1); - #endif - - #include "my/on_entering_screen.h" - - gpit = 3; while (gpit --) en_spr_id [gpit] = en_s [gpit]; - - oam_index = 4; - prx = px >> FIXBITS; pry = py >> FIXBITS; - #if defined (PLAYER_PUNCHES) || defined (PLAYER_KICKS) - phitteract = 0; - #endif - - player_move (); - enems_move (); - - if (hrt) hotspots_paint (); - - #ifdef ENABLE_INTERACTIVES - interactives_paint (); - #endif - - #ifdef ENABLE_TIMER - #ifdef TIMER_RESET_ON_ENTER - timer = TIMER_INITIAL; - timer_frames = 50; - timer_zero = 0; - otimer = 0xff; - #endif - #endif - - oam_hide_rest (oam_index); - hud_update (); - ppu_waitnmi (); - clear_update_list (); - oam_index = 4; - fade_in (); -} - -void game_loop (void) { - #ifdef MULTI_LEVEL - music_play (l_music [level]); - #else - music_play (MUSIC_INGAME); - #endif - - clear_update_list (); - set_vram_update (UPDATE_LIST_SIZE, update_list); - - on_pant = 99; ft = 1; fade_delay = 1; - - // MAIN LOOP - - pal_bright (0); - ppu_on_all (); - - #ifdef ACTIVATE_SCRIPTING - #ifdef CLEAR_FLAGS - msc_clear_flags (); - #endif - - // Entering game script - run_script (2 * MAP_SIZE); - #endif - - ntsc_frame = level_reset = warp_to_level = 0; - oam_index = 4; ticker = 50; - - while (1) { - - // Update hud - - #ifdef ACTIVATE_SCRIPTING - if (n_pant != 0xfe && on_pant != 0xfe) - #endif - hud_update (); - - // Finish him - - if (pkill) player_kill (); - if (game_over || level_reset) break; - - // Flick the screen - - flick_override = 0; - #include "my/custom_flickscreen.h" - if (flick_override == 0) { - flickscreen_do_horizontal (); - flickscreen_do_vertical (); - } - - // Change screen ? - - if (on_pant != n_pant) { - prepare_scr (); - on_pant = n_pant; - } - - // Relocate player if spawned on a broken tile - - #include "mainloop/relocate_player.h" - - // Shake the screen ? - - #ifdef ENABLE_SHAKER - #include "mainloop/shaker.h" - #endif - - // Effects - - #include "my/effects.h" - - // Finish frame and wait for NMI - - update_cycle (); - - // Poll pads - - pad_read (); - a_button = (pad_this_frame & PAD_A); - b_button = (pad_this_frame & PAD_B); - - // Update actors if not paused... - - ntsc_frame ++; if (ntsc_frame == 6) ntsc_frame = 0; - - if (paused == 0 && (ntsc == 0 || ntsc_frame)) { - // Count frames - if (ticker) -- ticker; else ticker = 50; - half_life ^= 1; - ++ frame_counter; - - // Detect interactions - - #ifdef ENABLE_INTERACTIVES - #include "mainloop/interactives.h" - #endif - - // Update player - - if (!warp_to_level) { - player_move (); - } - - // Timer - - #ifdef ENABLE_TIMER - #include "mainloop/timer.h" - #endif - - // Extra checks - - #include "my/extra_checks.h" - - // Win level condition - - #include "mainloop/win_level_condition.h" - - // Update propellers - - #ifdef ENABLE_PROPELLERS - if (propellers_on) propellers_do (); - #endif - - // Update / collide hotspots - - #include "mainloop/hotspots.h" - - // Automatic scripting calls (USE_ANIM & fire zone) - - #ifdef ACTIVATE_SCRIPTING - #include "mainloop/scripting.h" - #endif - - // Update bullets - - #ifdef PLAYER_CAN_FIRE - bullets_move (); - #endif - - // Update cocos - - #ifdef ENABLE_COCOS - cocos_do (); - #endif - - // Paint player - - player_render (); - - // Update enemies - - enems_move (); - - // Warp to level - - if (warp_to_level) { - update_cycle (); music_stop (); break; - } - - // Do resonators - - #ifdef ENABLE_RESONATORS - #include "mainloop/resonators.h" - #endif - - // Paint hotspots - - if (hrt) hotspots_paint (); - - // Paint interactives - - #ifdef ENABLE_INTERACTIVES - interactives_paint (); - #endif - - // Do breakable tiles - - #if defined (ENABLE_BREAKABLE) && defined (BREAKABLE_ANIM) - if (do_process_breakable) breakable_do_anim (); - #endif - - // Update shines - - #ifdef ENABLE_SHINES - shines_do (); - #endif - - // Update no - - #ifdef ENABLE_NO - #include "mainloop/no.h" - #endif - - // Update chac-chacs - - #ifdef ENABLE_TILE_CHAC_CHAC - chac_chacs_do (); - #endif - - #include "my/extra_routines.h" - } - - // Cheat to skip level - - #include "mainloop/cheat.h" - - // Pause - - #include "mainloop/pause.h" - } - - fade_delay = 4; - music_stop (); - fade_out (); - set_vram_update (0, 0); - ppu_off (); - oam_clear (); -} diff --git a/testers/05_tester_tile_get/dev/music.s b/testers/05_tester_tile_get/dev/music.s index e2d8f89..bffae72 100644 --- a/testers/05_tester_tile_get/dev/music.s +++ b/testers/05_tester_tile_get/dev/music.s @@ -1,7 +1,7 @@ ;this file for FamiTone2 library generated by text2data tool music_music_data: - .byte 5 + .byte 7 .word @instruments .word @samples-3 .word @song0ch0,@song0ch1,@song0ch2,@song0ch3,@song0ch4,307,256 @@ -9,22 +9,24 @@ music_music_data: .word @song2ch0,@song2ch1,@song2ch2,@song2ch3,@song2ch4,307,256 .word @song3ch0,@song3ch1,@song3ch2,@song3ch3,@song3ch4,307,256 .word @song4ch0,@song4ch1,@song4ch2,@song4ch3,@song4ch4,307,256 + .word @song5ch0,@song5ch1,@song5ch2,@song5ch3,@song5ch4,307,256 + .word @song6ch0,@song6ch1,@song6ch2,@song6ch3,@song6ch4,307,256 @instruments: .byte $30 ;instrument $00 .word @env3,@env0,@env0 .byte $00 .byte $30 ;instrument $01 - .word @env1,@env0,@env22 + .word @env1,@env0,@env23 .byte $00 .byte $30 ;instrument $02 - .word @env4,@env17,@env0 + .word @env4,@env18,@env0 .byte $00 .byte $30 ;instrument $03 - .word @env2,@env0,@env22 + .word @env2,@env0,@env23 .byte $00 .byte $30 ;instrument $04 - .word @env8,@env21,@env0 + .word @env8,@env22,@env0 .byte $00 .byte $30 ;instrument $05 .word @env14,@env0,@env0 @@ -32,6 +34,9 @@ music_music_data: .byte $30 ;instrument $06 .word @env10,@env0,@env0 .byte $00 + .byte $30 ;instrument $07 + .word @env3,@env0,@env24 + .byte $00 .byte $b0 ;instrument $09 .word @env6,@env0,@env0 .byte $00 @@ -42,32 +47,35 @@ music_music_data: .word @env4,@env0,@env0 .byte $00 .byte $30 ;instrument $0d - .word @env7,@env16,@env0 + .word @env7,@env17,@env0 .byte $00 .byte $30 ;instrument $0e - .word @env4,@env18,@env0 + .word @env4,@env19,@env0 .byte $00 .byte $30 ;instrument $0f - .word @env4,@env19,@env0 + .word @env4,@env20,@env0 .byte $00 .byte $30 ;instrument $10 - .word @env4,@env20,@env0 + .word @env4,@env21,@env0 .byte $00 .byte $30 ;instrument $11 .word @env9,@env0,@env0 .byte $00 .byte $30 ;instrument $12 - .word @env13,@env21,@env0 + .word @env13,@env22,@env0 .byte $00 .byte $30 ;instrument $13 - .word @env15,@env0,@env0 + .word @env16,@env0,@env0 .byte $00 .byte $30 ;instrument $14 - .word @env11,@env0,@env22 + .word @env11,@env0,@env23 .byte $00 .byte $70 ;instrument $15 .word @env12,@env0,@env0 .byte $00 + .byte $30 ;instrument $1d + .word @env15,@env22,@env0 + .byte $00 @samples: @env0: @@ -102,38 +110,42 @@ music_music_data: @env14: .byte $cb,$ca,$c8,$c7,$c4,$c3,$c2,$c1,$c0,$00,$08 @env15: - .byte $cd,$cc,$ca,$c9,$c7,$c6,$c5,$c3,$c0,$00,$08 + .byte $c9,$c7,$c6,$c4,$c3,$c2,$c1,$c0,$00,$07 @env16: - .byte $c0,$cc,$cc,$c0,$00,$03 + .byte $cd,$cc,$ca,$c9,$c7,$c6,$c5,$c3,$c0,$00,$08 @env17: - .byte $c0,$c4,$c7,$cc,$00,$00 + .byte $c0,$cc,$cc,$c0,$00,$03 @env18: - .byte $bb,$c0,$c3,$c7,$00,$00 + .byte $c0,$c4,$c7,$cc,$00,$00 @env19: - .byte $c0,$c3,$c7,$ca,$00,$00 + .byte $bb,$c0,$c3,$c7,$00,$00 @env20: - .byte $bb,$be,$c0,$c4,$00,$00 + .byte $c0,$c3,$c7,$ca,$00,$00 @env21: - .byte $c7,$c3,$c0,$bd,$00,$02 + .byte $bb,$be,$c0,$c4,$00,$00 @env22: + .byte $c7,$c3,$c0,$bd,$00,$02 +@env23: .byte $c0,$0e,$bf,$be,$bd,$bc,$bd,$be,$bf,$c0,$00,$02 +@env24: + .byte $c0,$0b,$c1,$c2,$c3,$c4,$c3,$c2,$c1,$c0,$00,$02 @song0ch0: .byte $fb,$06 @ref0: - .byte $8e,$32,$85,$32,$85,$36,$85,$36,$85,$3a,$85,$3a,$85,$36,$83,$3a + .byte $90,$32,$85,$32,$85,$36,$85,$36,$85,$3a,$85,$3a,$85,$36,$83,$3a .byte $36,$85 @ref1: .byte $32,$85,$32,$85,$36,$85,$36,$85,$3a,$85,$3a,$85,$36,$83,$3a,$36 .byte $85 @song0ch0loop: @ref2: - .byte $94,$32,$9d,$2c,$9d,$28,$9d,$24,$9d + .byte $96,$32,$9d,$2c,$9d,$28,$9d,$24,$9d @ref3: .byte $28,$9d,$2c,$9d,$28,$89,$2c,$89,$30,$9d,$00,$85 @ref4: - .byte $2c,$99,$29,$00,$8d,$2e,$85,$24,$85,$8e,$3a,$85,$3a,$85,$3c,$85 + .byte $2c,$99,$29,$00,$8d,$2e,$85,$24,$85,$90,$3a,$85,$3a,$85,$3c,$85 .byte $3c,$85,$3a,$85,$3a,$85,$36,$83,$3a,$36,$85 .byte $ff,$11 .word @ref1 @@ -154,7 +166,7 @@ music_music_data: @song0ch1: @ref12: - .byte $8e,$3a,$85,$3a,$85,$3c,$85,$3c,$85,$40,$85,$40,$85,$3c,$83,$40 + .byte $90,$3a,$85,$3a,$85,$3c,$85,$3c,$85,$40,$85,$40,$85,$3c,$83,$40 .byte $3c,$85 @ref13: .byte $3a,$85,$3a,$85,$3c,$85,$3c,$85,$40,$85,$40,$85,$3c,$83,$40,$3c @@ -168,7 +180,7 @@ music_music_data: .byte $4e,$9d,$4b,$4e,$81 @ref16: .byte $50,$85,$4e,$85,$4a,$85,$45,$41,$00,$85,$40,$83,$44,$46,$85,$44 - .byte $85,$41,$4a,$83,$00,$4a,$91,$8e,$40,$85,$40,$85,$3c,$83,$40,$3c + .byte $85,$41,$4a,$83,$00,$4a,$91,$90,$40,$85,$40,$85,$3c,$83,$40,$3c .byte $85 .byte $ff,$11 .word @ref13 @@ -181,7 +193,7 @@ music_music_data: .byte $ff,$11 .word @ref13 @ref22: - .byte $87,$94,$32,$00,$33,$3c,$83,$00,$44,$83,$00,$40,$83,$00,$3d,$32 + .byte $87,$96,$32,$00,$33,$3c,$83,$00,$44,$83,$00,$40,$83,$00,$3d,$32 .byte $99,$32,$00,$33,$3c,$83,$00,$44,$83,$00,$40,$83,$00,$45,$46,$85 .byte $33,$3d,$40,$81 @ref23: @@ -298,7 +310,7 @@ music_music_data: .byte $fb,$06 @song1ch0loop: @ref60: - .byte $8e,$5d,$5d,$5d,$57,$5b,$5b,$5b,$57,$5d,$5d,$5d,$57,$5b,$5b,$5a + .byte $90,$5d,$5d,$5d,$57,$5b,$5b,$5b,$57,$5d,$5d,$5d,$57,$5b,$5b,$5a .byte $85,$56,$85,$56,$85,$56,$8d @ref61: .byte $58,$83,$52,$83,$4f,$4c,$83,$4e,$83,$53,$56,$8d,$56,$8d @@ -321,7 +333,7 @@ music_music_data: @song1ch1: @song1ch1loop: @ref68: - .byte $90,$4f,$4f,$4f,$57,$49,$49,$49,$45,$4f,$4f,$4f,$57,$49,$49,$49 + .byte $92,$4f,$4f,$4f,$57,$49,$49,$49,$45,$4f,$4f,$4f,$57,$49,$49,$49 .byte $45,$36,$85,$48,$85,$36,$8d @ref69: .byte $36,$83,$40,$37,$31,$44,$89,$41,$36,$8d,$4e,$8d @@ -351,7 +363,7 @@ music_music_data: .byte $29,$00,$30,$37,$01,$2c,$83,$34,$01,$41,$36,$83,$00,$87,$47,$00 .byte $89 @ref78: - .byte $8e,$19,$01,$27,$31,$2c,$85,$01,$0f,$19,$01,$27,$31,$2c,$85,$01 + .byte $90,$19,$01,$27,$31,$2c,$85,$01,$0f,$19,$01,$27,$31,$2c,$85,$01 .byte $0e,$81 @ref79: .byte $80,$18,$85,$30,$85,$27,$1f,$19,$01,$18,$85,$30,$85,$27,$1f,$19 @@ -435,21 +447,21 @@ music_music_data: @ref107: .byte $83,$5d,$01,$59,$59,$01,$5d,$00,$81 @ref108: - .byte $8e,$49,$49,$49,$3f,$49,$49,$45,$40,$85,$48,$85,$40,$85,$3a,$85 + .byte $90,$49,$49,$49,$3f,$49,$49,$45,$40,$85,$48,$85,$40,$85,$3a,$85 .byte $3e,$81 @ref109: .byte $83,$48,$85,$39,$3f,$3b,$39,$3a,$85,$30,$99 @ref110: .byte $49,$49,$49,$3f,$49,$49,$45,$40,$85,$44,$85,$48,$85,$4a,$89 @ref111: - .byte $82,$4a,$8d,$8e,$4f,$4b,$41,$44,$85,$00,$8d,$82,$36,$85,$00,$81 + .byte $82,$4a,$8d,$90,$4f,$4b,$41,$44,$85,$00,$8d,$82,$36,$85,$00,$81 .byte $fd .word @song2ch0loop @song2ch1: @song2ch1loop: @ref112: - .byte $92,$30,$89,$36,$89,$30,$85 + .byte $94,$30,$89,$36,$89,$30,$85 @ref113: .byte $32,$89,$3a,$91 @ref114: @@ -571,7 +583,7 @@ music_music_data: .byte $fb,$06 @song3ch0loop: @ref160: - .byte $8e,$52,$85,$52,$85,$52,$85,$55,$58,$85,$62,$87,$00,$8f + .byte $90,$52,$85,$52,$85,$52,$85,$55,$58,$85,$62,$87,$00,$8f @ref161: .byte $52,$85,$52,$85,$52,$85,$4f,$52,$a1 @ref162: @@ -581,13 +593,13 @@ music_music_data: @ref164: .byte $5d,$5d,$5d,$5d,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 @ref165: - .byte $8e,$59,$59,$59,$59,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 + .byte $90,$59,$59,$59,$59,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 @ref166: - .byte $8e,$4f,$4f,$4f,$4f,$54,$85,$54,$8d,$5c,$85,$59,$59,$54,$85 + .byte $90,$4f,$4f,$4f,$4f,$54,$85,$54,$8d,$5c,$85,$59,$59,$54,$85 @ref167: .byte $52,$85,$55,$58,$91,$82,$63,$01,$61,$01,$5c,$85,$59,$00,$81 @ref168: - .byte $8e,$5d,$5d,$5d,$5d,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 + .byte $90,$5d,$5d,$5d,$5d,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 .byte $ff,$0e .word @ref165 .byte $ff,$0e @@ -595,7 +607,7 @@ music_music_data: @ref171: .byte $52,$85,$62,$95,$82,$33,$3d,$45,$4b,$49,$41,$37,$00,$81 @ref172: - .byte $8e,$6a,$85,$66,$85,$62,$85,$6b,$66,$85,$60,$89,$6a,$85,$66,$85 + .byte $90,$6a,$85,$66,$85,$62,$85,$6b,$66,$85,$60,$89,$6a,$85,$66,$85 @ref173: .byte $62,$85,$61,$5c,$85,$62,$95,$5d,$61,$5d,$61,$58,$81 @ref174: @@ -624,7 +636,7 @@ music_music_data: @song3ch1: @song3ch1loop: @ref184: - .byte $92,$41,$01,$41,$01,$41,$01,$4b,$53,$01,$4b,$00,$95 + .byte $94,$41,$01,$41,$01,$41,$01,$4b,$53,$01,$4b,$00,$95 @ref185: .byte $41,$01,$41,$01,$41,$01,$45,$40,$00,$97,$84,$4b,$00,$81 .byte $ff,$0c @@ -636,7 +648,7 @@ music_music_data: @ref189: .byte $4a,$85,$01,$4b,$33,$4a,$85,$01,$4a,$85,$01,$33,$4a,$85,$00,$85 @ref190: - .byte $98,$4e,$85,$01,$4f,$37,$4e,$85,$01,$9a,$58,$85,$01,$41,$58,$85 + .byte $9a,$4e,$85,$01,$4f,$37,$4e,$85,$01,$9c,$58,$85,$01,$41,$58,$85 .byte $00,$85 @ref191: .byte $84,$4a,$85,$01,$4b,$33,$4a,$85,$01,$4a,$85,$01,$33,$4a,$85,$00 @@ -648,13 +660,13 @@ music_music_data: .byte $ff,$10 .word @ref190 @ref195: - .byte $84,$4a,$85,$01,$4b,$33,$4a,$85,$01,$98,$4f,$01,$4f,$37,$9a,$59 + .byte $84,$4a,$85,$01,$4b,$33,$4a,$85,$01,$9a,$4f,$01,$4f,$37,$9c,$59 .byte $41,$59,$00,$81 @ref196: - .byte $84,$32,$85,$01,$4b,$32,$85,$01,$96,$3a,$00,$3a,$85,$01,$53,$3a + .byte $84,$32,$85,$01,$4b,$32,$85,$01,$98,$3a,$00,$3a,$85,$01,$53,$3a .byte $85,$01,$52,$81 @ref197: - .byte $98,$44,$85,$01,$5d,$44,$85,$01,$5d,$84,$3c,$85,$01,$55,$3c,$85 + .byte $9a,$44,$85,$01,$5d,$44,$85,$01,$5d,$84,$3c,$85,$01,$55,$3c,$85 .byte $01,$4a,$81 @ref198: .byte $4a,$85,$01,$4b,$33,$4a,$85,$01,$4a,$85,$01,$4b,$33,$4a,$85,$00 @@ -664,7 +676,7 @@ music_music_data: @ref200: .byte $84,$4a,$85,$01,$4b,$33,$4a,$85,$00,$81 @ref201: - .byte $98,$4f,$01,$4f,$37,$9a,$59,$41,$59,$00,$81 + .byte $9a,$4f,$01,$4f,$37,$9c,$59,$41,$59,$00,$81 .byte $ff,$12 .word @ref196 .byte $ff,$11 @@ -853,13 +865,13 @@ music_music_data: .byte $fb,$06 @song4ch0loop: @ref280: - .byte $90,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b + .byte $92,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b .byte $62,$81 @ref281: .byte $5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$62 .byte $81 @ref282: - .byte $a2,$2c,$9d,$2a,$9d + .byte $a4,$2c,$9d,$2a,$9d @ref283: .byte $28,$9d,$2a,$9d @ref284: @@ -872,7 +884,7 @@ music_music_data: @song4ch1: @song4ch1loop: @ref286: - .byte $a4,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b + .byte $a6,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b .byte $62,$81 .byte $ff,$11 .word @ref281 @@ -890,7 +902,7 @@ music_music_data: @song4ch2: @song4ch2loop: @ref292: - .byte $9c,$15,$1b,$1b,$15,$1b,$1b,$15,$1b,$15,$1b,$1b,$15,$1b,$1b,$15 + .byte $9e,$15,$1b,$1b,$15,$1b,$1b,$15,$1b,$15,$1b,$1b,$15,$1b,$1b,$15 .byte $1a,$81 @ref293: .byte $13,$1b,$1b,$13,$1b,$1b,$13,$1b,$13,$1b,$1b,$13,$1b,$1b,$13,$1a @@ -911,14 +923,14 @@ music_music_data: @song4ch3: @song4ch3loop: @ref298: - .byte $9e,$20,$20,$21,$21,$20,$20,$21,$21,$21,$21,$20,$20,$21,$21,$20 + .byte $a0,$20,$20,$21,$21,$20,$20,$21,$21,$21,$21,$20,$20,$21,$21,$20 .byte $20,$21,$21,$21,$20,$81 @ref299: .byte $20,$20,$21,$21,$20,$20,$21,$21,$21,$21,$20,$20,$21,$21,$20,$20 .byte $21,$21,$20,$20,$20,$20 @ref300: - .byte $a0,$21,$21,$9e,$20,$89,$a0,$21,$9e,$20,$85,$a0,$21,$21,$9e,$20 - .byte $89,$a0,$21,$9e,$20,$85 + .byte $a2,$21,$21,$a0,$20,$89,$a2,$21,$a0,$20,$85,$a2,$21,$21,$a0,$20 + .byte $89,$a2,$21,$a0,$20,$85 .byte $ff,$0e .word @ref300 .byte $ff,$0e @@ -944,3 +956,104 @@ music_music_data: .byte $bf .byte $fd .word @song4ch4loop + + +@song5ch0: + .byte $fb,$08 +@ref310: + .byte $91 +@ref311: + .byte $90,$4a,$89,$4b,$4e,$83,$48,$87,$4b,$4b,$4b,$45,$40,$83,$48,$87 + .byte $45,$4b,$5d,$52,$83,$58,$83,$5c,$95,$00,$89,$00,$81 +@song5ch0loop: +@ref312: + .byte $81 + .byte $fd + .word @song5ch0loop + +@song5ch1: +@ref313: + .byte $91 +@ref314: + .byte $c7,$92,$53,$4a,$83,$4e,$83,$52,$95,$00,$8d +@song5ch1loop: +@ref315: + .byte $81 + .byte $fd + .word @song5ch1loop + +@song5ch2: +@ref316: + .byte $80,$3b,$3b,$3b,$3a,$83 +@ref317: + .byte $5c,$85,$52,$85,$58,$83,$55,$58,$55,$5c,$85,$52,$85,$4e,$83,$4b + .byte $4e,$4b,$01,$45,$01,$44,$83,$40,$83,$45,$5c,$91,$00,$8d +@song5ch2loop: +@ref318: + .byte $81 + .byte $fd + .word @song5ch2loop + +@song5ch3: +@ref319: + .byte $a2,$05,$05,$05,$04,$83 +@ref320: + .byte $21,$a0,$09,$a2,$20,$20,$a0,$09,$a2,$21,$a0,$08,$a2,$21,$20,$a0 + .byte $09,$a2,$21,$a0,$09,$a2,$20,$20,$a0,$09,$a2,$21,$a0,$08,$a2,$21 + .byte $20,$a0,$09,$a2,$21,$a0,$09,$a2,$20,$20,$a0,$09,$a2,$21,$a0,$08 + .byte $08,$a2,$21,$a0,$18,$91,$00,$8d +@song5ch3loop: +@ref321: + .byte $81 + .byte $fd + .word @song5ch3loop + +@song5ch4: +@ref322: + .byte $91 +@ref323: + .byte $f9,$85 +@song5ch4loop: +@ref324: + .byte $81 + .byte $fd + .word @song5ch4loop + + +@song6ch0: + .byte $fb,$06 +@song6ch0loop: +@ref325: + .byte $f9,$85 + .byte $fd + .word @song6ch0loop + +@song6ch1: +@song6ch1loop: +@ref326: + .byte $f9,$85 + .byte $fd + .word @song6ch1loop + +@song6ch2: +@song6ch2loop: +@ref327: + .byte $8e,$4b,$53,$59,$61,$63,$61,$59,$53,$4b,$53,$59,$61,$63,$61,$6b + .byte $63,$41,$49,$4f,$57,$59,$57,$4f,$49,$41,$49,$4f,$57,$59,$61,$67 + .byte $60,$81 + .byte $fd + .word @song6ch2loop + +@song6ch3: +@song6ch3loop: +@ref328: + .byte $a8,$20,$99,$21,$20,$9d,$20,$99,$21,$20,$9d + .byte $fd + .word @song6ch3loop + +@song6ch4: +@song6ch4loop: +@ref329: + .byte $f9,$85 + .byte $fd + .word @song6ch4loop diff --git a/testers/05_tester_tile_get/dev/my/pres.h b/testers/05_tester_tile_get/dev/my/pres.h index 038a682..a387543 100644 --- a/testers/05_tester_tile_get/dev/my/pres.h +++ b/testers/05_tester_tile_get/dev/my/pres.h @@ -11,8 +11,7 @@ void bat_in (void) { fade_in (); } -void bat_out (void) { - music_stop (); +void bat_out (void) { fade_out (); oam_clear (); ppu_off (); @@ -69,6 +68,7 @@ void title (void) { _x = 5; _y = 26; pr_str ("@ 2018 THE MOJON TWINS"); bat_in (); + music_play (MUSIC_TITLE); while (1) { pad_read (); if (pad_this_frame & PAD_START) { diff --git a/testers/05_tester_tile_get/dev/ram/bss.h b/testers/05_tester_tile_get/dev/ram/bss.h index 06fd516..5c262f3 100644 --- a/testers/05_tester_tile_get/dev/ram/bss.h +++ b/testers/05_tester_tile_get/dev/ram/bss.h @@ -52,6 +52,8 @@ unsigned char oobjs; // Player items, last frame value (used unsigned char oammo; // Player ammo, last frame value (used to detect changes) unsigned char okilled; // Player # of killed enems., last frame value (used to detect changes) +unsigned char oam_index_player; // Index copy + // Custom hotspot type star (used as an extra collectible). #ifdef HOTSPOT_TYPE_STAR @@ -197,6 +199,9 @@ unsigned char flags [MAX_FLAGS]; // Array of flags used by interactives, // More globals for baddies (for current screen) +unsigned char en_initial; // First enemy to process in current screen, current frame (cycles 0, 1, 2, ...) +unsigned char en_offs; // Precalculated value: n_pant * 3; used to index data related to enemy persistence + unsigned char en_t [3]; // Enemy types. unsigned char en_x [3]; // Enemy X coordinates. diff --git a/testers/05_tester_tile_get/dev/ram/zp.h b/testers/05_tester_tile_get/dev/ram/zp.h index 3021de8..d8a5e35 100644 --- a/testers/05_tester_tile_get/dev/ram/zp.h +++ b/testers/05_tester_tile_get/dev/ram/zp.h @@ -40,13 +40,10 @@ unsigned char caux; // Auxiliar variable // Sprite related (neslib) -unsigned char oam_index, oam_index_player; +unsigned char oam_index; // Enemies -unsigned char en_initial; // First enemy to process in current screen, current frame (cycles 0, 1, 2, ...) -unsigned char en_offs; // Precalculated value: n_pant * 3; used to index data related to enemy persistence - unsigned char en_fr; // (Temporal) enemies frame number unsigned char en_collx, en_colly; // (Temporal) collision flags unsigned char en_spr; // Current enemy sprite index diff --git a/testers/05_tester_tile_get/map/level50.BAK b/testers/05_tester_tile_get/map/level50.BAK deleted file mode 100644 index 5ba9a7e5b9bedff13b17b1217d43b3892e54b620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39978 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 diff --git a/testers/05_tester_tile_get/map/level51.BAK b/testers/05_tester_tile_get/map/level51.BAK deleted file mode 100644 index 3d75d1592f11726cf202f27010a660492e0d660f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40220 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 IHm;BKf6u+GumAu6 diff --git a/testers/05_tester_tile_get/ogt/music.s b/testers/05_tester_tile_get/ogt/music.s index e2d8f89..bffae72 100644 --- a/testers/05_tester_tile_get/ogt/music.s +++ b/testers/05_tester_tile_get/ogt/music.s @@ -1,7 +1,7 @@ ;this file for FamiTone2 library generated by text2data tool music_music_data: - .byte 5 + .byte 7 .word @instruments .word @samples-3 .word @song0ch0,@song0ch1,@song0ch2,@song0ch3,@song0ch4,307,256 @@ -9,22 +9,24 @@ music_music_data: .word @song2ch0,@song2ch1,@song2ch2,@song2ch3,@song2ch4,307,256 .word @song3ch0,@song3ch1,@song3ch2,@song3ch3,@song3ch4,307,256 .word @song4ch0,@song4ch1,@song4ch2,@song4ch3,@song4ch4,307,256 + .word @song5ch0,@song5ch1,@song5ch2,@song5ch3,@song5ch4,307,256 + .word @song6ch0,@song6ch1,@song6ch2,@song6ch3,@song6ch4,307,256 @instruments: .byte $30 ;instrument $00 .word @env3,@env0,@env0 .byte $00 .byte $30 ;instrument $01 - .word @env1,@env0,@env22 + .word @env1,@env0,@env23 .byte $00 .byte $30 ;instrument $02 - .word @env4,@env17,@env0 + .word @env4,@env18,@env0 .byte $00 .byte $30 ;instrument $03 - .word @env2,@env0,@env22 + .word @env2,@env0,@env23 .byte $00 .byte $30 ;instrument $04 - .word @env8,@env21,@env0 + .word @env8,@env22,@env0 .byte $00 .byte $30 ;instrument $05 .word @env14,@env0,@env0 @@ -32,6 +34,9 @@ music_music_data: .byte $30 ;instrument $06 .word @env10,@env0,@env0 .byte $00 + .byte $30 ;instrument $07 + .word @env3,@env0,@env24 + .byte $00 .byte $b0 ;instrument $09 .word @env6,@env0,@env0 .byte $00 @@ -42,32 +47,35 @@ music_music_data: .word @env4,@env0,@env0 .byte $00 .byte $30 ;instrument $0d - .word @env7,@env16,@env0 + .word @env7,@env17,@env0 .byte $00 .byte $30 ;instrument $0e - .word @env4,@env18,@env0 + .word @env4,@env19,@env0 .byte $00 .byte $30 ;instrument $0f - .word @env4,@env19,@env0 + .word @env4,@env20,@env0 .byte $00 .byte $30 ;instrument $10 - .word @env4,@env20,@env0 + .word @env4,@env21,@env0 .byte $00 .byte $30 ;instrument $11 .word @env9,@env0,@env0 .byte $00 .byte $30 ;instrument $12 - .word @env13,@env21,@env0 + .word @env13,@env22,@env0 .byte $00 .byte $30 ;instrument $13 - .word @env15,@env0,@env0 + .word @env16,@env0,@env0 .byte $00 .byte $30 ;instrument $14 - .word @env11,@env0,@env22 + .word @env11,@env0,@env23 .byte $00 .byte $70 ;instrument $15 .word @env12,@env0,@env0 .byte $00 + .byte $30 ;instrument $1d + .word @env15,@env22,@env0 + .byte $00 @samples: @env0: @@ -102,38 +110,42 @@ music_music_data: @env14: .byte $cb,$ca,$c8,$c7,$c4,$c3,$c2,$c1,$c0,$00,$08 @env15: - .byte $cd,$cc,$ca,$c9,$c7,$c6,$c5,$c3,$c0,$00,$08 + .byte $c9,$c7,$c6,$c4,$c3,$c2,$c1,$c0,$00,$07 @env16: - .byte $c0,$cc,$cc,$c0,$00,$03 + .byte $cd,$cc,$ca,$c9,$c7,$c6,$c5,$c3,$c0,$00,$08 @env17: - .byte $c0,$c4,$c7,$cc,$00,$00 + .byte $c0,$cc,$cc,$c0,$00,$03 @env18: - .byte $bb,$c0,$c3,$c7,$00,$00 + .byte $c0,$c4,$c7,$cc,$00,$00 @env19: - .byte $c0,$c3,$c7,$ca,$00,$00 + .byte $bb,$c0,$c3,$c7,$00,$00 @env20: - .byte $bb,$be,$c0,$c4,$00,$00 + .byte $c0,$c3,$c7,$ca,$00,$00 @env21: - .byte $c7,$c3,$c0,$bd,$00,$02 + .byte $bb,$be,$c0,$c4,$00,$00 @env22: + .byte $c7,$c3,$c0,$bd,$00,$02 +@env23: .byte $c0,$0e,$bf,$be,$bd,$bc,$bd,$be,$bf,$c0,$00,$02 +@env24: + .byte $c0,$0b,$c1,$c2,$c3,$c4,$c3,$c2,$c1,$c0,$00,$02 @song0ch0: .byte $fb,$06 @ref0: - .byte $8e,$32,$85,$32,$85,$36,$85,$36,$85,$3a,$85,$3a,$85,$36,$83,$3a + .byte $90,$32,$85,$32,$85,$36,$85,$36,$85,$3a,$85,$3a,$85,$36,$83,$3a .byte $36,$85 @ref1: .byte $32,$85,$32,$85,$36,$85,$36,$85,$3a,$85,$3a,$85,$36,$83,$3a,$36 .byte $85 @song0ch0loop: @ref2: - .byte $94,$32,$9d,$2c,$9d,$28,$9d,$24,$9d + .byte $96,$32,$9d,$2c,$9d,$28,$9d,$24,$9d @ref3: .byte $28,$9d,$2c,$9d,$28,$89,$2c,$89,$30,$9d,$00,$85 @ref4: - .byte $2c,$99,$29,$00,$8d,$2e,$85,$24,$85,$8e,$3a,$85,$3a,$85,$3c,$85 + .byte $2c,$99,$29,$00,$8d,$2e,$85,$24,$85,$90,$3a,$85,$3a,$85,$3c,$85 .byte $3c,$85,$3a,$85,$3a,$85,$36,$83,$3a,$36,$85 .byte $ff,$11 .word @ref1 @@ -154,7 +166,7 @@ music_music_data: @song0ch1: @ref12: - .byte $8e,$3a,$85,$3a,$85,$3c,$85,$3c,$85,$40,$85,$40,$85,$3c,$83,$40 + .byte $90,$3a,$85,$3a,$85,$3c,$85,$3c,$85,$40,$85,$40,$85,$3c,$83,$40 .byte $3c,$85 @ref13: .byte $3a,$85,$3a,$85,$3c,$85,$3c,$85,$40,$85,$40,$85,$3c,$83,$40,$3c @@ -168,7 +180,7 @@ music_music_data: .byte $4e,$9d,$4b,$4e,$81 @ref16: .byte $50,$85,$4e,$85,$4a,$85,$45,$41,$00,$85,$40,$83,$44,$46,$85,$44 - .byte $85,$41,$4a,$83,$00,$4a,$91,$8e,$40,$85,$40,$85,$3c,$83,$40,$3c + .byte $85,$41,$4a,$83,$00,$4a,$91,$90,$40,$85,$40,$85,$3c,$83,$40,$3c .byte $85 .byte $ff,$11 .word @ref13 @@ -181,7 +193,7 @@ music_music_data: .byte $ff,$11 .word @ref13 @ref22: - .byte $87,$94,$32,$00,$33,$3c,$83,$00,$44,$83,$00,$40,$83,$00,$3d,$32 + .byte $87,$96,$32,$00,$33,$3c,$83,$00,$44,$83,$00,$40,$83,$00,$3d,$32 .byte $99,$32,$00,$33,$3c,$83,$00,$44,$83,$00,$40,$83,$00,$45,$46,$85 .byte $33,$3d,$40,$81 @ref23: @@ -298,7 +310,7 @@ music_music_data: .byte $fb,$06 @song1ch0loop: @ref60: - .byte $8e,$5d,$5d,$5d,$57,$5b,$5b,$5b,$57,$5d,$5d,$5d,$57,$5b,$5b,$5a + .byte $90,$5d,$5d,$5d,$57,$5b,$5b,$5b,$57,$5d,$5d,$5d,$57,$5b,$5b,$5a .byte $85,$56,$85,$56,$85,$56,$8d @ref61: .byte $58,$83,$52,$83,$4f,$4c,$83,$4e,$83,$53,$56,$8d,$56,$8d @@ -321,7 +333,7 @@ music_music_data: @song1ch1: @song1ch1loop: @ref68: - .byte $90,$4f,$4f,$4f,$57,$49,$49,$49,$45,$4f,$4f,$4f,$57,$49,$49,$49 + .byte $92,$4f,$4f,$4f,$57,$49,$49,$49,$45,$4f,$4f,$4f,$57,$49,$49,$49 .byte $45,$36,$85,$48,$85,$36,$8d @ref69: .byte $36,$83,$40,$37,$31,$44,$89,$41,$36,$8d,$4e,$8d @@ -351,7 +363,7 @@ music_music_data: .byte $29,$00,$30,$37,$01,$2c,$83,$34,$01,$41,$36,$83,$00,$87,$47,$00 .byte $89 @ref78: - .byte $8e,$19,$01,$27,$31,$2c,$85,$01,$0f,$19,$01,$27,$31,$2c,$85,$01 + .byte $90,$19,$01,$27,$31,$2c,$85,$01,$0f,$19,$01,$27,$31,$2c,$85,$01 .byte $0e,$81 @ref79: .byte $80,$18,$85,$30,$85,$27,$1f,$19,$01,$18,$85,$30,$85,$27,$1f,$19 @@ -435,21 +447,21 @@ music_music_data: @ref107: .byte $83,$5d,$01,$59,$59,$01,$5d,$00,$81 @ref108: - .byte $8e,$49,$49,$49,$3f,$49,$49,$45,$40,$85,$48,$85,$40,$85,$3a,$85 + .byte $90,$49,$49,$49,$3f,$49,$49,$45,$40,$85,$48,$85,$40,$85,$3a,$85 .byte $3e,$81 @ref109: .byte $83,$48,$85,$39,$3f,$3b,$39,$3a,$85,$30,$99 @ref110: .byte $49,$49,$49,$3f,$49,$49,$45,$40,$85,$44,$85,$48,$85,$4a,$89 @ref111: - .byte $82,$4a,$8d,$8e,$4f,$4b,$41,$44,$85,$00,$8d,$82,$36,$85,$00,$81 + .byte $82,$4a,$8d,$90,$4f,$4b,$41,$44,$85,$00,$8d,$82,$36,$85,$00,$81 .byte $fd .word @song2ch0loop @song2ch1: @song2ch1loop: @ref112: - .byte $92,$30,$89,$36,$89,$30,$85 + .byte $94,$30,$89,$36,$89,$30,$85 @ref113: .byte $32,$89,$3a,$91 @ref114: @@ -571,7 +583,7 @@ music_music_data: .byte $fb,$06 @song3ch0loop: @ref160: - .byte $8e,$52,$85,$52,$85,$52,$85,$55,$58,$85,$62,$87,$00,$8f + .byte $90,$52,$85,$52,$85,$52,$85,$55,$58,$85,$62,$87,$00,$8f @ref161: .byte $52,$85,$52,$85,$52,$85,$4f,$52,$a1 @ref162: @@ -581,13 +593,13 @@ music_music_data: @ref164: .byte $5d,$5d,$5d,$5d,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 @ref165: - .byte $8e,$59,$59,$59,$59,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 + .byte $90,$59,$59,$59,$59,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 @ref166: - .byte $8e,$4f,$4f,$4f,$4f,$54,$85,$54,$8d,$5c,$85,$59,$59,$54,$85 + .byte $90,$4f,$4f,$4f,$4f,$54,$85,$54,$8d,$5c,$85,$59,$59,$54,$85 @ref167: .byte $52,$85,$55,$58,$91,$82,$63,$01,$61,$01,$5c,$85,$59,$00,$81 @ref168: - .byte $8e,$5d,$5d,$5d,$5d,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 + .byte $90,$5d,$5d,$5d,$5d,$62,$85,$62,$8d,$82,$67,$01,$62,$85,$00,$85 .byte $ff,$0e .word @ref165 .byte $ff,$0e @@ -595,7 +607,7 @@ music_music_data: @ref171: .byte $52,$85,$62,$95,$82,$33,$3d,$45,$4b,$49,$41,$37,$00,$81 @ref172: - .byte $8e,$6a,$85,$66,$85,$62,$85,$6b,$66,$85,$60,$89,$6a,$85,$66,$85 + .byte $90,$6a,$85,$66,$85,$62,$85,$6b,$66,$85,$60,$89,$6a,$85,$66,$85 @ref173: .byte $62,$85,$61,$5c,$85,$62,$95,$5d,$61,$5d,$61,$58,$81 @ref174: @@ -624,7 +636,7 @@ music_music_data: @song3ch1: @song3ch1loop: @ref184: - .byte $92,$41,$01,$41,$01,$41,$01,$4b,$53,$01,$4b,$00,$95 + .byte $94,$41,$01,$41,$01,$41,$01,$4b,$53,$01,$4b,$00,$95 @ref185: .byte $41,$01,$41,$01,$41,$01,$45,$40,$00,$97,$84,$4b,$00,$81 .byte $ff,$0c @@ -636,7 +648,7 @@ music_music_data: @ref189: .byte $4a,$85,$01,$4b,$33,$4a,$85,$01,$4a,$85,$01,$33,$4a,$85,$00,$85 @ref190: - .byte $98,$4e,$85,$01,$4f,$37,$4e,$85,$01,$9a,$58,$85,$01,$41,$58,$85 + .byte $9a,$4e,$85,$01,$4f,$37,$4e,$85,$01,$9c,$58,$85,$01,$41,$58,$85 .byte $00,$85 @ref191: .byte $84,$4a,$85,$01,$4b,$33,$4a,$85,$01,$4a,$85,$01,$33,$4a,$85,$00 @@ -648,13 +660,13 @@ music_music_data: .byte $ff,$10 .word @ref190 @ref195: - .byte $84,$4a,$85,$01,$4b,$33,$4a,$85,$01,$98,$4f,$01,$4f,$37,$9a,$59 + .byte $84,$4a,$85,$01,$4b,$33,$4a,$85,$01,$9a,$4f,$01,$4f,$37,$9c,$59 .byte $41,$59,$00,$81 @ref196: - .byte $84,$32,$85,$01,$4b,$32,$85,$01,$96,$3a,$00,$3a,$85,$01,$53,$3a + .byte $84,$32,$85,$01,$4b,$32,$85,$01,$98,$3a,$00,$3a,$85,$01,$53,$3a .byte $85,$01,$52,$81 @ref197: - .byte $98,$44,$85,$01,$5d,$44,$85,$01,$5d,$84,$3c,$85,$01,$55,$3c,$85 + .byte $9a,$44,$85,$01,$5d,$44,$85,$01,$5d,$84,$3c,$85,$01,$55,$3c,$85 .byte $01,$4a,$81 @ref198: .byte $4a,$85,$01,$4b,$33,$4a,$85,$01,$4a,$85,$01,$4b,$33,$4a,$85,$00 @@ -664,7 +676,7 @@ music_music_data: @ref200: .byte $84,$4a,$85,$01,$4b,$33,$4a,$85,$00,$81 @ref201: - .byte $98,$4f,$01,$4f,$37,$9a,$59,$41,$59,$00,$81 + .byte $9a,$4f,$01,$4f,$37,$9c,$59,$41,$59,$00,$81 .byte $ff,$12 .word @ref196 .byte $ff,$11 @@ -853,13 +865,13 @@ music_music_data: .byte $fb,$06 @song4ch0loop: @ref280: - .byte $90,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b + .byte $92,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b .byte $62,$81 @ref281: .byte $5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$62 .byte $81 @ref282: - .byte $a2,$2c,$9d,$2a,$9d + .byte $a4,$2c,$9d,$2a,$9d @ref283: .byte $28,$9d,$2a,$9d @ref284: @@ -872,7 +884,7 @@ music_music_data: @song4ch1: @song4ch1loop: @ref286: - .byte $a4,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b + .byte $a6,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b,$63,$5d,$63,$5b .byte $62,$81 .byte $ff,$11 .word @ref281 @@ -890,7 +902,7 @@ music_music_data: @song4ch2: @song4ch2loop: @ref292: - .byte $9c,$15,$1b,$1b,$15,$1b,$1b,$15,$1b,$15,$1b,$1b,$15,$1b,$1b,$15 + .byte $9e,$15,$1b,$1b,$15,$1b,$1b,$15,$1b,$15,$1b,$1b,$15,$1b,$1b,$15 .byte $1a,$81 @ref293: .byte $13,$1b,$1b,$13,$1b,$1b,$13,$1b,$13,$1b,$1b,$13,$1b,$1b,$13,$1a @@ -911,14 +923,14 @@ music_music_data: @song4ch3: @song4ch3loop: @ref298: - .byte $9e,$20,$20,$21,$21,$20,$20,$21,$21,$21,$21,$20,$20,$21,$21,$20 + .byte $a0,$20,$20,$21,$21,$20,$20,$21,$21,$21,$21,$20,$20,$21,$21,$20 .byte $20,$21,$21,$21,$20,$81 @ref299: .byte $20,$20,$21,$21,$20,$20,$21,$21,$21,$21,$20,$20,$21,$21,$20,$20 .byte $21,$21,$20,$20,$20,$20 @ref300: - .byte $a0,$21,$21,$9e,$20,$89,$a0,$21,$9e,$20,$85,$a0,$21,$21,$9e,$20 - .byte $89,$a0,$21,$9e,$20,$85 + .byte $a2,$21,$21,$a0,$20,$89,$a2,$21,$a0,$20,$85,$a2,$21,$21,$a0,$20 + .byte $89,$a2,$21,$a0,$20,$85 .byte $ff,$0e .word @ref300 .byte $ff,$0e @@ -944,3 +956,104 @@ music_music_data: .byte $bf .byte $fd .word @song4ch4loop + + +@song5ch0: + .byte $fb,$08 +@ref310: + .byte $91 +@ref311: + .byte $90,$4a,$89,$4b,$4e,$83,$48,$87,$4b,$4b,$4b,$45,$40,$83,$48,$87 + .byte $45,$4b,$5d,$52,$83,$58,$83,$5c,$95,$00,$89,$00,$81 +@song5ch0loop: +@ref312: + .byte $81 + .byte $fd + .word @song5ch0loop + +@song5ch1: +@ref313: + .byte $91 +@ref314: + .byte $c7,$92,$53,$4a,$83,$4e,$83,$52,$95,$00,$8d +@song5ch1loop: +@ref315: + .byte $81 + .byte $fd + .word @song5ch1loop + +@song5ch2: +@ref316: + .byte $80,$3b,$3b,$3b,$3a,$83 +@ref317: + .byte $5c,$85,$52,$85,$58,$83,$55,$58,$55,$5c,$85,$52,$85,$4e,$83,$4b + .byte $4e,$4b,$01,$45,$01,$44,$83,$40,$83,$45,$5c,$91,$00,$8d +@song5ch2loop: +@ref318: + .byte $81 + .byte $fd + .word @song5ch2loop + +@song5ch3: +@ref319: + .byte $a2,$05,$05,$05,$04,$83 +@ref320: + .byte $21,$a0,$09,$a2,$20,$20,$a0,$09,$a2,$21,$a0,$08,$a2,$21,$20,$a0 + .byte $09,$a2,$21,$a0,$09,$a2,$20,$20,$a0,$09,$a2,$21,$a0,$08,$a2,$21 + .byte $20,$a0,$09,$a2,$21,$a0,$09,$a2,$20,$20,$a0,$09,$a2,$21,$a0,$08 + .byte $08,$a2,$21,$a0,$18,$91,$00,$8d +@song5ch3loop: +@ref321: + .byte $81 + .byte $fd + .word @song5ch3loop + +@song5ch4: +@ref322: + .byte $91 +@ref323: + .byte $f9,$85 +@song5ch4loop: +@ref324: + .byte $81 + .byte $fd + .word @song5ch4loop + + +@song6ch0: + .byte $fb,$06 +@song6ch0loop: +@ref325: + .byte $f9,$85 + .byte $fd + .word @song6ch0loop + +@song6ch1: +@song6ch1loop: +@ref326: + .byte $f9,$85 + .byte $fd + .word @song6ch1loop + +@song6ch2: +@song6ch2loop: +@ref327: + .byte $8e,$4b,$53,$59,$61,$63,$61,$59,$53,$4b,$53,$59,$61,$63,$61,$6b + .byte $63,$41,$49,$4f,$57,$59,$57,$4f,$49,$41,$49,$4f,$57,$59,$61,$67 + .byte $60,$81 + .byte $fd + .word @song6ch2loop + +@song6ch3: +@song6ch3loop: +@ref328: + .byte $a8,$20,$99,$21,$20,$9d,$20,$99,$21,$20,$9d + .byte $fd + .word @song6ch3loop + +@song6ch4: +@song6ch4loop: +@ref329: + .byte $f9,$85 + .byte $fd + .word @song6ch4loop diff --git a/testers/05_tester_tile_get/ogt/music.txt b/testers/05_tester_tile_get/ogt/music.txt index 8c403e8..5d19dae 100644 --- a/testers/05_tester_tile_get/ogt/music.txt +++ b/testers/05_tester_tile_get/ogt/music.txt @@ -20,34 +20,52 @@ MACRO 0 0 -1 -1 0 : 1 2 3 5 MACRO 0 1 -1 -1 0 : 1 3 6 10 MACRO 0 2 -1 -1 0 : 15 MACRO 0 3 -1 -1 0 : 2 3 4 4 4 3 3 2 2 2 2 2 2 2 2 2 +MACRO 0 4 -1 -1 0 : 15 MACRO 0 5 -1 -1 0 : 10 9 7 4 2 0 MACRO 0 6 -1 -1 0 : 2 3 4 4 4 3 3 2 2 2 2 2 2 2 2 2 MACRO 0 7 -1 -1 0 : 2 3 4 4 4 3 3 2 2 2 2 2 2 2 2 2 MACRO 0 8 -1 -1 0 : 2 3 4 4 4 3 3 2 2 2 2 2 2 2 2 2 +MACRO 0 9 -1 -1 0 : 6 6 5 4 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 MACRO 0 10 -1 -1 0 : 2 3 4 4 4 3 3 2 2 2 2 2 2 2 2 2 MACRO 0 11 -1 -1 0 : 13 11 10 9 8 7 7 6 4 3 2 2 1 4 4 3 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 2 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 MACRO 0 12 -1 -1 0 : 2 3 5 6 7 8 9 9 9 9 8 6 4 8 8 8 MACRO 0 13 -1 -1 0 : 13 11 9 7 5 4 2 1 0 MACRO 0 14 -1 -1 0 : 12 MACRO 0 15 -1 -1 0 : 10 5 3 2 0 +MACRO 0 16 -1 -1 0 : 12 10 9 7 6 5 4 4 3 3 2 2 2 1 1 1 1 9 7 6 5 4 3 3 3 2 2 2 2 1 1 1 4 3 3 2 2 2 2 1 1 1 1 1 0 0 0 0 MACRO 0 17 -1 -1 0 : 1 3 7 9 MACRO 0 18 -1 -1 0 : 9 9 9 9 9 9 9 9 6 6 6 6 6 6 9 9 9 9 9 9 9 9 9 MACRO 0 19 -1 -1 0 : 15 13 11 9 7 5 3 1 0 +MACRO 0 20 -1 -1 0 : 1 2 3 4 +MACRO 0 21 -1 -1 0 : 8 MACRO 0 22 -1 -1 0 : 11 10 8 7 4 3 2 1 0 +MACRO 0 23 -1 -1 0 : 9 7 6 4 3 2 1 0 0 +MACRO 0 24 -1 -1 0 : 11 9 7 5 4 2 1 1 0 MACRO 0 25 -1 -1 0 : 13 12 10 9 7 6 5 3 0 +MACRO 0 28 10 -1 0 : 10 8 6 4 3 2 2 1 1 1 0 0 0 MACRO 1 0 -1 -1 0 : 0 12 12 0 MACRO 1 1 -1 -1 0 : 12 0 MACRO 1 2 0 -1 0 : 0 4 7 12 MACRO 1 3 0 -1 0 : -5 0 3 7 MACRO 1 4 0 -1 0 : 0 3 7 10 MACRO 1 5 0 -1 0 : -5 -2 0 4 +MACRO 1 6 0 -1 0 : 0 0 5 5 7 7 MACRO 1 7 2 -1 0 : 7 3 0 -3 +MACRO 1 8 0 -1 0 : 0 0 0 3 3 3 7 7 7 +MACRO 1 9 0 -1 0 : 0 0 0 4 4 4 7 7 7 +MACRO 1 10 0 -1 0 : 0 0 0 3 3 3 8 8 8 +MACRO 1 11 0 -1 0 : 0 0 0 2 2 2 7 7 7 MACRO 1 12 2 -1 0 : 7 3 0 -3 +MACRO 1 13 -1 -1 0 : 12 0 +MACRO 1 14 2 -1 0 : 7 3 0 -3 MACRO 2 0 15 -1 0 : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 1 1 1 1 MACRO 2 1 -1 -1 0 : 0 6 0 0 +MACRO 2 2 12 -1 0 : 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 -1 -1 -1 MACRO 2 3 15 -1 0 : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 1 1 1 1 +MACRO 2 4 12 -1 0 : 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 -1 -1 -1 MACRO 3 0 0 -1 0 : 7 MACRO 3 1 0 -1 0 : 7 +MACRO 3 2 0 -1 0 : 7 MACRO 4 0 -1 -1 0 : 0 1 MACRO 4 1 -1 -1 0 : 0 1 MACRO 4 2 -1 -1 0 : 0 1 @@ -56,8 +74,15 @@ MACRO 4 4 -1 -1 0 : 0 1 MACRO 4 5 -1 -1 0 : 0 1 MACRO 4 6 -1 -1 0 : 1 MACRO 4 7 1 -1 0 : 2 0 0 +MACRO 4 8 -1 -1 0 : 2 3 +MACRO 4 9 -1 -1 0 : 0 MACRO 4 10 -1 -1 0 : 0 MACRO 4 11 -1 -1 0 : 0 +MACRO 4 12 -1 -1 0 : 0 +MACRO 4 13 -1 -1 0 : 0 +MACRO 4 14 -1 -1 0 : 0 +MACRO 4 15 -1 -1 0 : 0 +MACRO 4 16 -1 -1 0 : 0 # DPCM samples @@ -69,7 +94,10 @@ INST2A03 3 1 -1 0 -1 1 "S - Strings" INST2A03 4 13 7 -1 -1 -1 "Snare" INST2A03 5 22 -1 -1 -1 10 "Kick" INST2A03 6 15 -1 -1 -1 -1 "Hat" +INST2A03 7 4 -1 4 -1 -1 "bass" +INST2A03 8 9 11 -1 -1 14 "arp27" INST2A03 9 11 -1 -1 -1 7 "pianow" +INST2A03 10 28 -1 -1 -1 0 "pianow" INST2A03 11 5 -1 -1 -1 7 "pianow" INST2A03 12 7 -1 -1 -1 0 "S - Strings" INST2A03 13 12 0 -1 -1 0 "S - Strings 2" @@ -81,6 +109,14 @@ INST2A03 18 19 12 -1 -1 -1 "Snare" INST2A03 19 25 -1 -1 -1 11 "Kick" INST2A03 20 17 -1 3 -1 -1 "S - Strings" INST2A03 21 18 -1 -1 -1 6 "S - Lead" +INST2A03 22 9 9 -1 -1 9 "arp47" +INST2A03 23 16 -1 -1 -1 -1 "tin tin tin" +INST2A03 24 9 8 -1 -1 12 "arp37" +INST2A03 25 9 10 -1 -1 13 "arp38" +INST2A03 26 21 13 -1 -1 16 "S - Lead Helmet" +INST2A03 27 20 -1 -1 -1 8 "S - Strings" +INST2A03 28 24 -1 -1 -1 15 "Kick" +INST2A03 29 23 14 -1 -1 -1 "Snare" # Tracks @@ -2257,4 +2293,280 @@ ROW 3D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . .. ROW 3E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... ROW 3F : ... .. . B00 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +TRACK 64 8 150 "title mal" +COLUMNS : 1 1 1 1 1 + +ORDER 00 : 00 00 00 00 00 +ORDER 01 : 01 01 01 01 01 +ORDER 02 : 02 02 02 02 02 + +PATTERN 00 +ROW 00 : ... .. . ... : ... .. . ... : E-3 00 . ... : 2-# 13 . ... : ... .. . ... +ROW 01 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 02 : ... .. . ... : ... .. . ... : E-3 00 . ... : 2-# 13 . ... : ... .. . ... +ROW 03 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 04 : ... .. . ... : ... .. . ... : E-3 00 . ... : 2-# 13 . ... : ... .. . ... +ROW 05 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 06 : ... .. . ... : ... .. . ... : E-3 00 . ... : 2-# 13 . ... : ... .. . ... +ROW 07 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 08 : ... .. . D00 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 09 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 10 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 11 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 12 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 13 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 14 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 15 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 16 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 17 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 18 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 19 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 20 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 21 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 22 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 23 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 24 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 25 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 26 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 27 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 28 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 29 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 30 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 31 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 32 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 33 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 34 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 35 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 36 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 37 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 38 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 39 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... + +PATTERN 01 +ROW 00 : C-4 09 . ... : ... .. . ... : A-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 01 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 02 : ... .. . ... : ... .. . ... : ... .. . ... : 4-# 12 . ... : ... .. . ... +ROW 03 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 04 : ... .. . ... : ... .. . ... : E-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 05 : ... .. . ... : ... .. . ... : ... .. . ... : 0-# 13 . ... : ... .. . ... +ROW 06 : C-4 09 . ... : ... .. . ... : ... .. . ... : 4-# 12 . ... : ... .. . ... +ROW 07 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 08 : D-4 09 . ... : ... .. . ... : G-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 09 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0A : ... .. . ... : ... .. . ... : ... .. . ... : 4-# 12 . ... : ... .. . ... +ROW 0B : B-3 09 . ... : ... .. . ... : F-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 0C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0D : ... .. . ... : ... .. . ... : G-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 0E : ... .. . ... : ... .. . ... : F-4 00 . ... : 4-# 12 . ... : ... .. . ... +ROW 0F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 10 : C-4 09 . ... : ... .. . ... : A-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 11 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 12 : C-4 09 . ... : ... .. . ... : ... .. . ... : 4-# 12 . ... : ... .. . ... +ROW 13 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 14 : C-4 09 . ... : ... .. . ... : E-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 15 : ... .. . ... : ... .. . ... : ... .. . ... : 0-# 13 . ... : ... .. . ... +ROW 16 : A-3 09 . ... : ... .. . ... : ... .. . ... : 4-# 12 . ... : ... .. . ... +ROW 17 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 18 : G-3 09 . ... : ... .. . ... : D-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 19 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1A : ... .. . ... : ... .. . ... : ... .. . ... : 4-# 12 . ... : ... .. . ... +ROW 1B : B-3 09 . ... : ... .. . ... : C-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 1C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1D : ... .. . ... : ... .. . ... : D-4 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 1E : ... .. . ... : ... .. . ... : C-4 00 . ... : 4-# 12 . ... : ... .. . ... +ROW 1F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 20 : A-3 09 . ... : ... .. . ... : --- .. . ... : 0-# 13 . ... : ... .. . ... +ROW 21 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 22 : C-4 09 . ... : ... .. . ... : A-3 00 . ... : 4-# 12 . ... : ... .. . ... +ROW 23 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 24 : A-4 09 . ... : E-4 0B . ... : --- .. . ... : 0-# 13 . ... : ... .. . ... +ROW 25 : ... .. . ... : ... .. . ... : ... .. . ... : 0-# 13 . ... : ... .. . ... +ROW 26 : E-4 09 . ... : C-4 0B . ... : A-3 00 . ... : 4-# 12 . ... : ... .. . ... +ROW 27 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 28 : ... .. . ... : ... .. . ... : ... .. . ... : 0-# 13 . ... : ... .. . ... +ROW 29 : G-4 09 . ... : D-4 0B . ... : G-3 00 . ... : ... .. . ... : ... .. . ... +ROW 2A : ... .. . ... : ... .. . ... : ... .. . ... : 4-# 12 . ... : ... .. . ... +ROW 2B : ... .. . ... : ... .. . ... : ... .. . ... : 4-# 12 . ... : ... .. . ... +ROW 2C : A-4 09 . ... : E-4 0B . ... : A-3 00 . ... : 0-# 13 . ... : ... .. . ... +ROW 2D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2E : ... .. . ... : ... .. . ... : A-4 00 . ... : C-# 12 . ... : ... .. . ... +ROW 2F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 30 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 31 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 32 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 33 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 34 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 35 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 36 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 37 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 38 : --- 09 . ... : --- .. . ... : --- .. . ... : --- .. . ... : ... .. . ... +ROW 39 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3E : --- .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3F : ... .. . D00 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... + +PATTERN 02 +ROW 00 : ... .. . B02 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 01 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 02 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 03 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 04 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 05 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 06 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 07 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 08 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 09 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 10 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 11 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 12 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 13 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 14 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 15 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 16 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 17 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 18 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 19 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 20 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 21 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 22 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 23 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 24 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 25 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 26 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 27 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 28 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 29 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 30 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 31 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 32 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 33 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 34 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 35 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 36 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 37 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 38 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 39 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... + +TRACK 64 6 150 "cuts" +COLUMNS : 1 1 1 1 1 + +ORDER 00 : 00 00 00 00 00 + +PATTERN 00 +ROW 00 : ... .. . ... : ... .. . ... : C-4 07 . ... : 0-# 1D . ... : ... .. . ... +ROW 01 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 02 : ... .. . ... : ... .. . ... : E-4 07 . ... : ... .. . ... : ... .. . ... +ROW 03 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 04 : ... .. . ... : ... .. . ... : G-4 07 . ... : ... .. . ... : ... .. . ... +ROW 05 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 06 : ... .. . ... : ... .. . ... : B-4 07 . ... : ... .. . ... : ... .. . ... +ROW 07 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 08 : ... .. . ... : ... .. . ... : C-5 07 . ... : ... .. . ... : ... .. . ... +ROW 09 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0A : ... .. . ... : ... .. . ... : B-4 07 . ... : ... .. . ... : ... .. . ... +ROW 0B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0C : ... .. . ... : ... .. . ... : G-4 07 . ... : ... .. . ... : ... .. . ... +ROW 0D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 0E : ... .. . ... : ... .. . ... : E-4 07 . ... : 0-# 1D . ... : ... .. . ... +ROW 0F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 10 : ... .. . ... : ... .. . ... : C-4 07 . ... : 0-# 1D . ... : ... .. . ... +ROW 11 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 12 : ... .. . ... : ... .. . ... : E-4 07 . ... : ... .. . ... : ... .. . ... +ROW 13 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 14 : ... .. . ... : ... .. . ... : G-4 07 . ... : ... .. . ... : ... .. . ... +ROW 15 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 16 : ... .. . ... : ... .. . ... : B-4 07 . ... : ... .. . ... : ... .. . ... +ROW 17 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 18 : ... .. . ... : ... .. . ... : C-5 07 . ... : ... .. . ... : ... .. . ... +ROW 19 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1A : ... .. . ... : ... .. . ... : B-4 07 . ... : ... .. . ... : ... .. . ... +ROW 1B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1C : ... .. . ... : ... .. . ... : E-5 07 . ... : ... .. . ... : ... .. . ... +ROW 1D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 1E : ... .. . ... : ... .. . ... : C-5 07 . ... : ... .. . ... : ... .. . ... +ROW 1F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 20 : ... .. . ... : ... .. . ... : G-3 07 . ... : 0-# 1D . ... : ... .. . ... +ROW 21 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 22 : ... .. . ... : ... .. . ... : B-3 07 . ... : ... .. . ... : ... .. . ... +ROW 23 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 24 : ... .. . ... : ... .. . ... : D-4 07 . ... : ... .. . ... : ... .. . ... +ROW 25 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 26 : ... .. . ... : ... .. . ... : F#4 07 . ... : ... .. . ... : ... .. . ... +ROW 27 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 28 : ... .. . ... : ... .. . ... : G-4 07 . ... : ... .. . ... : ... .. . ... +ROW 29 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2A : ... .. . ... : ... .. . ... : F#4 07 . ... : ... .. . ... : ... .. . ... +ROW 2B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2C : ... .. . ... : ... .. . ... : D-4 07 . ... : ... .. . ... : ... .. . ... +ROW 2D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 2E : ... .. . ... : ... .. . ... : B-3 07 . ... : 0-# 1D . ... : ... .. . ... +ROW 2F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 30 : ... .. . ... : ... .. . ... : G-3 07 . ... : 0-# 1D . ... : ... .. . ... +ROW 31 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 32 : ... .. . ... : ... .. . ... : B-3 07 . ... : ... .. . ... : ... .. . ... +ROW 33 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 34 : ... .. . ... : ... .. . ... : D-4 07 . ... : ... .. . ... : ... .. . ... +ROW 35 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 36 : ... .. . ... : ... .. . ... : F#4 07 . ... : ... .. . ... : ... .. . ... +ROW 37 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 38 : ... .. . ... : ... .. . ... : G-4 07 . ... : ... .. . ... : ... .. . ... +ROW 39 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3A : ... .. . ... : ... .. . ... : B-4 07 . ... : ... .. . ... : ... .. . ... +ROW 3B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3C : ... .. . ... : ... .. . ... : D-5 07 . ... : ... .. . ... : ... .. . ... +ROW 3D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... +ROW 3E : ... .. . ... : ... .. . ... : B-4 07 . ... : ... .. . ... : ... .. . ... +ROW 3F : ... .. . B00 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... + # End of export diff --git a/testers/05_tester_tile_get/show/espitene--20180831a.nes b/testers/05_tester_tile_get/show/espitene--20180831a.nes new file mode 100644 index 0000000000000000000000000000000000000000..f6c1ff26a764ecaeeadd74b5fab0310425cb57ca GIT binary patch literal 65552 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 F{~P^t0$l(A literal 0 HcmV?d00001 diff --git a/testers/sgt_helmet_training_day_R1.0.nes b/testers/sgt_helmet_training_day_R1.0.nes index b2325bcc9cf1563e0fe4db878b642af3d16c8778..acffc42dd345a0e657aea255329392a936a5cf77 100644 GIT binary patch delta 12607 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

T;%{a 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 delta 8055 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 D9Ukw5 delta 10334 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 Od*&Rzc~4S>L;7zoVsm={ delta 13342 zcma)j33yaRwtp|TJDsp~M5SGT>j0X7n26xSabqzt=w1ZW zV%M#zQ>RWnfI5uitX=124YZ zY<%^EAgb1}pV7~x*51Hn)@kXz#TJ7ou*jNY+20;0xBhb6{&tq>%{JS{v+;av_F1H3 z-7@OFwk{gIzkQ=!_Sxm;G?|L-kfw}C7EykcltpqiNEPE&bg*%5gV^m$lih4$wJf9V zCfkg3^f0-43N=`6o06Zs(U@jsCp6Q}kX6s9iST4bR*2dZFV-Wexr`fI5v-!tClRUcf zCt6OWmTo?k@lU`3(ha z4acWYPyBFWxM3PGYK>90AVWUfAs2Ok=60T6|FGRH-?|ZOrpdd}K{xxk*Yh^ZBfisz zkD!nS&{RYd!9K43Bz0OEKdBv)pLw3bp9NNonRw}N)`Oe_tz-V}k)8v#ELZUqT2cus zFpcI>jLfL;?DQ5}o9bk&M^9rUIT*1LJS&4`@oXABnr17HKi_>DpVfGMihQ%GuMe5F ze;lZAj=dzoVV*G^f#D@O3e{vWo@I*_^0-)67zak)3v=on9JM?d?a^^gQ`D*)Zs$3XDN);ky@Hq@r+fY9U+b4yGB5v4%lg;?v)rd(U~wUBzQy zEwaB|w>a|#h|$hE*iJrA`9M20*P+`(Ca>~Qd&s1jMZ#+!BG`sYym6C%4zD3oC~*~! z@LNJ=(O1jWm>B@iD55GQs>^sSQI%4eHAD(#$mO@|64<+mxjQM1CH#DqC|zg_Kt zpr4leM<-`fzNZ7l$sB!RD7oVYXC!50*XUOV&C0Et&aJ$s19CctGfgxFQ$C$t1900? zrLyVy*I;RT>ASJH}&uMY+IeC3GO35Z(lh-$g<@4I`TolgD>#J4PZQ`|geREj> z&kq;0*m%D3!X{q801qxt0gd^!4sf|0kRvOd$qW!l=}h3$?a)D>Pa&|WsmQHrW>ybP ze^GM)Y9W%hD%7uavgfP)Zhp5sXRW+&t^BV(O=5SuLDqqfRD)Om-Tv05f31BRvbj7t z=%0ECVzOOJV>K~R8*xM@Hsolg`fqK>e`jM^NPe)fZ19_=$_~F`{T-y}K!OR_-V3}5 znlpRZjD{I)Ikt$UAX?LBL+AMbcDoP!8eWH;P#(yBog3KE6+2<33Kkiw%MWZ~cSf%8+nUGP;5fW9 z*0yV`t<7m;`=F=$R70w9B$bWPZaD|*kL?XW80+zht!1A^z-Ej z9W=vtVzXw~RnH{uM#D+il5ED7w7$`6*hHdgoSI+?gBQLD%r+|U=+ZiV4)M9Px#@Zu zzpinn0&*k(5A0JporXjOKPgf6fJ7>Pu5rTOMhvWZmF4_M(7cfa`5c!y&mbW~fB4nbivA_|tH-5{Lmigtme-)#-+tXG_ynompY4`lz(Ge7gO zjqc`erKnXNwFN~1_B*zTy~yg>X4cAD*cSFW+rwUF+vFc!1Uz#UH0#{Ltc>y22!%Gj zYu)mD8{{uHfhNda)g)3v+Ku>b-PXNZVOun_?;A;bglz-dZ+}+1N#4i!8*Dv)lX>}D z>^a`XHpqor_#b?yB_R$GnSEz$TE8zYxyc7n*JbwVY2*pW4|UQGKbU{8Gnj7d;-8u@ z6PsU(j1UR0i&Cz-4t^H-TBJQDp*>Vgz5^AGK_O|2^QqxvPIr=Kgg34lL<^~FYDXKL z1sh$=+mneCW5O$oUIY2+IxzI09nM`=P{Oa+E3qHZDH25{Q8Zd?Q9}fuyET#l!RKz} zEf9R})>IbND(z@V?{=7Hd*Au@FZdqk>}zl^;d}_scEGd4NbH%tg*1?+BDhyPToB#f zkmIc%ZC9c%b+?EisWhexC3K+q3>_igIV0^lBene?vAqp@flg;79?*XVZ{ZHjL|f+G z#C{JaDDDViI{?*LCAf8Xt*ba$E7dz}4SRWQy@Uk2&`2Afp6%2xm76;7(W%NC+oNfs zhUmcTo2@99^(ztt!|Ek40K1xclTAxcf}&`CmL%tU>wl2GIU}V2rity1!0~i9>}@*> zvruk%c~DsSHMPTV!M4-cPIDy32sn(j%K{eREl9~?YznF5Ba`Jr$N?DW%VZY~y>$zmc~Ax-8w>_{;dk z9I>7371qpl@s}8um%YT-MJ)OhULUv*BU<3wOLkF=%^kE<;4SX>%*uky?gNCN+ znb<_E%CaE5?fBV3%@pr%DgssDa(M#IOs?XytkzrHkE4a?y4G+=*mKnz&?m5py{^2! zoiE5XN9}xJwpmX@(JP_|BTMHC@r&cfcK%|-if-QDj#l-Qzb<0tGY25%{p}DDFzv(& zk%)J(CGz^(BIB&H1gFv#OQ;`R4<2`{N+WeUGKxO%OWCB1L@zwK^9YM6Uywap$U0lM zK-OJ|!?*)iTydd#`F3$2*j^p-x$UUg!WV}Z>65`eE0Ptx+!!4|b+%G)4&?$UjVncI zAc3Jb;L|MlOhEet&0<5bhSDrh2c|HO8i^?!C>q0Sv&Tei{_&_9m|aYG#1hR23H3k) zvmbRp2W1eJ-XhVUX?$9_y* z>Qixg381zDJ@pH7aS0BR^7-(dgm77COZ4R=nHbK+3Hl3nsKdH+dDdgo-RSXR+ufp% z;@gdakSJImF>!C)ELe;Y7P`LLi><##S+#?&$H=|$n}s}MLN}vNs{EU%q@8=Hp$Qy< z>OUj`45a(q=kjcad2aNC*i3$%Z6>t)&kc<*RR4seNiSxLfGNBAE%S*xGk>BiOhgA<4jXwz@I9YacHrO zq=_`ym^BecA#@b8R!g`^I|No{U||4BDN;zHyKT{N{N?Ca9@NKRZBg_re^#feS9u+d zOm#4_+qViU+@jCmJ~c8YX%)Gnp^2TOxk8OHNeua~2ePeLSpRq>$~6;yxM6&Tw&Kh} z<#x822V9=bNNSkIYgv;UA%IDC5pcND&a#E~L{3m@G1#(fm3%VcP7STHpb+oMxsL4Wg@pCky{>kFl(Z^jFs>*R?3%V-x@LNGq8bP z6S3-3Ba(h)#11HUZzo(woPBmi(vfV_A{j_pwa5sn)08i?s?~g{u?4cHj4{?J|8FPe zL5wm@xAFPNV|*CdN?sOT5tZtcQX*K9*H@m&Ixc+|_;GN8%0n8%Lr0R@KJ^jtPhqLRA^SUM%xU?l>bqc zeUW^J+R0XHdF(086EY1(8u?PJJ(<6)NwbJE0tFf$G+|jDHp#h-MmX*9SG0#yTR{b5 z>E@c)$vtjf60U*tCZ(VW(m#!5bfWptPKZ2jS{w}k4jzgd%T06y-oYB!b{4`p_r8LlmMYuX(zYAz>?uN^k~ZK^X}(BYWEfBYqhd@&K!H6oSee8LL@wA`s;e~WRJwRe0tHo8 zP-XdG!z55p9izG`z7#_XG+~ero3hChV)twP>|S_+x7ktnAdTF-OM7tmRASL;V$EMl zxYeLoWJ7-2xNeu~DG>*eF?oFeI?d!N?#8XdxYn4_)3^{i86N=FNM^_ zVl(@;BiqdG`AHo4ewVvdBV70C?wuW<r<~plhJcq6vUSa=Om9A-=|E<6 zEiVn188nND253{7pjj+vs;U{E7g_ALf*)>PCcnnlho9lzK6NpLGGtzfpfjs%v2?HH zm60f4o7j-E;3Gtp=4MTDc`8{YPG(epE$T&J#OZ)5k;^L8>b3m2a5>-5SCQaXMf|G3 zkMSz-V?+3z75u7L75Gv8wWv?!X9&B*FJmM>xr@R2*6>P~=Na}4SJ!$}rZ$rMOs?@W zOy$o+%v_D%^dt?>5xR*=t5MnrQxyTa5?*Or3pGpMjZScrlyrT_-$8an@(_mMng@nU z0YY&%Wt`9qH)(NRe44pMc$Z+KeE6C{lw_FjK#lzmJ8R&HoQu@T#qHKv6HY6C7Go&Fgcuh2H@HOxR&K6YCv8h zS$0jhL>_@V^K*;|o0j}tJ2tvC`b99LMK~r}l}}nCRwU{Lt;(EMo)5`Z(pikmxh!0& zTTu!mG4?VLh)Obfvh`t=^fZEs_-b)0vKqG{E^y2sct8`XF@S=2T9jL?|L zlB+9o5pMZC{%E$boMnUFY3QF?IVps+=cVngx@?ForN&=~H1 z-Iy26DfYjMF%McMe&iEea~gip`5LHr5Ocv`i?N9oX0))dHRo%A1{aA27g84&B^t~? z1Ja=}$*IyDzK85T(LSX^HMK|SCwn~4ph!g9Pd2!iM1*XHcr@iS^^m7~HD4XQjIRMw zWJ6%JVNKhJ?m>SK?jB!*Ss%w&M=ptG3hW{!282OJD_Gr7MeG*Bto4iR4R(K#?BcxIFi=dvTb%xBh-RTu4cW{cryRe*nvggig;$ z>WyTj{us0|5ri`y8~oBJ7>Nx5n<|TY<0f0&Z;9Rl)urg7*!N%S(CiqF@D}7dI`NQ) zA%=$9(nPFPoTw;bD4<$JY?7SsY=d_ucpII$&fD1n{Z76LU`)WDOX3<-6eu*J#+;mt zfqQ;~)qUq>Wr^Mfxm6NeI40*2d`C6HBR?TH)ygE*ebLGCBY`G;0@zpcZG_y<@@fPQZfHuz5+L_|{Jtbp zI{s~aL&JRn-zxxkF97&a1fkDL`qy#=BIO8pQwW?Mmx$Pnm!jrI6kIh*DU5?sE}T~* zic>lmaXD4nq&Hw$6DS0U&3=-H0^9dS`gL&?U*h`hZFbUnQr4kvE{s56A|~@*5d`qS z-Sv9l@AjxEAd7#{s+s>v$Oq$ZZ!o z<@0(r(wiB_JEx`4%}U3cAoyGK@)QC*F4@>rG!S3PHM_q7DMjoNQ*-m$=+7JdU~nyh z1mP}(H@oKdt9idYE%`u|3n~}|0z7jlx+*-Io0HL1w2gH7C!mt90t^SyNudUW)(++M zbs@UuH@kV4%V0*V*an={aCPYWTGFm!$Fy#CT>CkD2kE<7HS5-nvA4A+*kKhPVeNL- zgNg{I{)l#*9n~T%s=dwrU3-uH5$S(G-~OV#&;Eq(_q2)Z&sqQi zKDs=_^M(55L;W0(#dAp6@fJVUcwC-d$=_*wSN?gWTcLMA+gq^s4jxWmMx;7CJL7aA$>qHv4sq6=4CviiP|d|yhqTZsXuz5}{cyFd9BhTsPnaHE}$jv& zp)Jkd5Rl(^pjkIk-+xNY|0!V}%HEW_--MPNk4t*Gd=*_{gF*8doBjw?16Rb(A%mF< z^E~eb5z15Jp5iiw7caH`4o;?Qn?IMHFttog&~td>gKcmSFxps>2y3)T^Dh-oo*w6QD*BD>holG@gk{{NZDaz$P^sKE@a&vi~Ic@^9}y*+M_NDU1f>%};Vd8+t`W zPrG=yQU1DJp0G{+td1T#EN#LnK_Riw-&c#Zff~aMI*^>%gqxX*BNywFu=cdEW$$hN z3adNC_m!kcd0&4e$q!bd1g{)W1*?3-3MR04*h^hU;M<$0sJjO=>H4?iZ-4{7K1uoQ z0mMOqrlq|-h2EvTO)ft02))SNQ|PMm^cqjni`?STsdy4S@Oe%yS@3E3qw(J~#z82) z#E&{Ge?FQ)Y7pbufE{Y3nGsL+x-~o+2L$6aI{OS@^Eq~aeijd!PV1vuV>O@kM87|I z;^gO1{bW4)t(*5k8z8vZ-Ti^cSXr++n4`D&167V>1{Z`MR)2)xUT@RM-YDMcxAq!o zUf)O2^v^%krQ-f{vwQK6^C=19f`A@vob1(Y_|NJ-*?aN>yeP$UhM+`04*VFdS8EL0 zq&rY^>kRdjT!m*WK}X|9`sM6&!6|=+%kv?2$J6X|(W9q-^XRE{(XX2LDK~1Ys1XJK zMFp<;{l(@&FMdr;MVOGFDYKWwd%SpG!Q;wy7^4uy?1m79Bpdq(!m$sF@J^BH8t~Gk zyH_Qf#hi5aBEeGxQ(<9x>~ySbzO4siG$afP3Bbxn-6|+@Pf&2W!K(ts006gTz;q$ z|7$$dcIfj%|2Xu};WdW?hhIAU?%^K~UlGm^KM-CU-Wom_{xWzNYyRm5bvt*5MKXU_*cBO|v&oNB%DIr;lVDrFNGcy;`L7jem1Z zHy>S?T3~weXsyUs9Ni((*N^^Lq~W8dMEc)HA4Hmd?9yY?j@@)@!LbMS+`jP8wSnNm LO?xuR?ehNs)Zu47 diff --git a/testers/tester_warp_to_level.nes b/testers/tester_warp_to_level.nes index ca5d85c2ccf7e244bb026958136b0bfc8507f0eb..82f82f4bc7f04b30a56b2048c12b2702a747f272 100644 GIT binary patch delta 8296 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 VoF>z&_qWcwb8%s7#+o$oe*s39SJ40f delta 8226 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 diff --git a/wip/diario.md b/wip/diario.md index 26802bb..81df3d9 100644 --- a/wip/diario.md +++ b/wip/diario.md @@ -4379,5 +4379,73 @@ Creo que me va a dar para hacer el Scrap Brain Zone (nombre a inventar), con cin Como hay 20 segundos para matarlo a lo mejor basta con hacer algo muy sencillo (recorrido rollo fase 1) pero dejar al personaje trepar e ir a buscar al malo bajo el agua. +20180831 +======== + +No he escrito nada en todo el mes, pero le he dado fran al Espitene todos los días. Está terminado, salvo por un glitch que aparece en la fase del boss del segundo mundo (el puente): parece relacionado con los breakable tiles. Los atributos de la siguiente pantalla aparecen corruptos. Hay algo que no he controlado (obviamente), ahora toca ponerse a buscar el bicho. + +La putada es seguir usando el compilador viejo. Creo que debería dejarme de hostieces y portar esto a la 2.17 YA (que tampoco tiene mucha historia y lo he hecho ya para otras miserias). Pero bueno, por ahora sigamos así. + +~~ + +Quizá sea buena idea parar la ejecución y ver donde se produce el glitch... Intentémoslo. De entrada parece ser que sólo ocurre si cambio de pantalla MIENTRAS hay una animación. Antes de poner esto patas arriba voy a comprobar ese supuesto. + ~~ +En la animación tenemos `do_process_breakable` y `brkf [gpit]` (si vale 1 se anima un tile). Veamos si estoy inicializando todo bien. + +Al entrar en una nueva pantalla hace + +```c + do_process_breakable = 0; + gpit = BREAKABLE_MAX; while (gpit --) brkf [gpit] = 0; +``` + +Lo que parece correcto. Hm... + +De hecho, cuando aparece la pantalla nueva se actualiza con la animación de la anterior... Hm... Veamos el orden de los eventos en mainloop. `breakable_break` es quien se encarga de poner el tile `BREAKABLE_BREAKING`, y es `breakable_do_anim` quien pone el definitivo `BREAKABLE_ERASE`. El tile que aparece (jodiendo los atributos) es `BREAKABLE_BREAKING`, por lo que debe ser que `breakable_break` se ejecuta en un sitio mal. + +SITIO MAL. + +`breakable_break` se llama desde `player.h` (desde `player_move`) (y desde `bullets.h`, pero no en este juego). + +tenemos: + +```c + while (1) { + [...] + + flick_screen; + + [...] + + if (NTSC bla bla) { + [...] + + player_move (); + + [...] + + breakable_do_anim (); + + [...] + } + } +``` + +En el proceso de `flick_screen` es donde se llama a `prepare_scr` que es donde se inicializa todo. `brk_buff` se inicializa correctamente cuando se pinta la pantalla nueva. + +Creo que lo que pasa es que al cambiar de pantalla estará todavía en el buffer de updates a VRAM... Va a ser eso. Entonces ha dado la cara con esto pero podría fallar con muchas cosas más. + +Menos mal que me he dado cuenta. Voy a arreglarlo. Cuando se entra en la nueva pantalla, tras el fade out, debería follarse el buffer. + +~~ + +¡¡Arreglado!! Espitene terminado, a falta de pulir. Voy a replicar los cambios de la lib. Esta vez los pasaré a los ejemplos para una prueba más heavy. + +~~ + +El cambio que hice para que no se pudiera entrar en los pinchos ha roto un millón de cosas en los otros testers, y con razón. No puedo tratar los pinchos como obstáculos, o procesar pinchos dentro de obstáculos. + +Voy a darle otra vuelta (más). +