From 4d0230aa0ba977b56e6b7e65eab0d0817cc7b0d1 Mon Sep 17 00:00:00 2001 From: 10yard Date: Tue, 24 Aug 2021 10:20:14 +0100 Subject: [PATCH] Add script to package up the release --- VERSION | 1 + build_package.bat | 10 ++++ dkcoach/init.lua | 120 ++++++++++++++++++++++---------------------- dkcoach/plugin.json | 2 +- readme.md | 33 +++++++++--- screenshot.png | Bin 5416 -> 9306 bytes 6 files changed, 99 insertions(+), 67 deletions(-) create mode 100644 VERSION create mode 100644 build_package.bat diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..aa33868 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +v0.1 \ No newline at end of file diff --git a/build_package.bat b/build_package.bat new file mode 100644 index 0000000..5ca7047 --- /dev/null +++ b/build_package.bat @@ -0,0 +1,10 @@ +echo ---------------------------------------------------------------------------------------------- +echo Package the dkcoach plugin +echo ---------------------------------------------------------------------------------------------- +copy readme.md dkcoach\ /Y + +echo **** package into a release ZIP getting the version from version.txt +set /p version= 1 then -- During gameplay - - -- Change Jumpman's start position to focus coaching on DK's Girder. - if mem:read_u8(0x694c) == default_start_x and mem:read_u8(0x694f) == default_start_y then - write_message(0x75ed, "START ") - write_message(0x75ee, "HERE__") - change_jumpman_position(coach_start_x, coach_start_y) - else - if mem:read_u8(0x694f) < 112 then - write_message(0x75ed, " ") - write_message(0x75ee, " ") + if mem:read_u8(0xc600a) == 0xc then + if help_setting > 1 then -- During gameplay + + -- Change Jumpman's start position to focus coaching on DK's Girder. + if mem:read_u8(0x694c) == default_start_x and mem:read_u8(0x694f) == default_start_y then + write_message(0x75ed, "START ") + write_message(0x75ee, "HERE__") + change_jumpman_position(coach_start_x, coach_start_y) + else + if mem:read_u8(0x694f) < 112 then + write_message(0x75ed, " ") + write_message(0x75ee, " ") + end end - end - if help_setting == 3 then - -- Draw safe spots. Box includes a transparent bottom so you can reference jumpman's feet. Feet need to stay within box to be safe. - draw_zone("spring-safe", 185, 148, 168, 168) - draw_zone("spring-safe", 185, 100, 168, 118) - end + if help_setting == 3 then + -- Draw safe spots. Box includes a transparent bottom so you can reference jumpman's feet. Feet need to stay within box to be safe. + draw_zone("spring-safe", 185, 148, 168, 168) + draw_zone("spring-safe", 185, 100, 168, 118) + end - -- Determine the spring type (0-15) of generated springs - for _, address in pairs({0x6500, 0x6510, 0x6520, 0x6530, 0x6540, 0x6550}) do - local s_x = mem:read_u8(address + 3) - local s_y = mem:read_u8(address + 5) - if s_y == 80 then -- y start position of new springs is always 80 - if s_x >= 248 then -- x start position is between 248 and 7 - s_type = s_x - 248 - elseif s_x <= 7 then - s_type = s_x + 8 + -- Determine the spring type (0-15) of generated springs + for _, address in pairs({0x6500, 0x6510, 0x6520, 0x6530, 0x6540, 0x6550}) do + local s_x = mem:read_u8(address + 3) + local s_y = mem:read_u8(address + 5) + if s_y == 80 then -- y start position of new springs is always 80 + if s_x >= 248 then -- x start position is between 248 and 7 + s_type = s_x - 248 + elseif s_x <= 7 then + s_type = s_x + 8 + end + end + if (s_x >= 130 and s_x < 170 and s_y == 80) or s_type_trailing == nil or mem:read_i8(0x6229) < 4 then + -- Remember type of the trailing string. + s_type_trailing = s_type end end - if (s_x >= 130 and s_x < 170 and s_y == 80) or s_type_trailing == nil or mem:read_i8(0x6229) < 4 then - -- Remember type of the trailing string. - s_type_trailing = s_type - end - end - if s_type ~= nil then - -- Update screen with spring info - write_message(0x77a5, "T="..string.format("%02d", s_type)) - write_message(0x77a6, " ") - if s_type >= 13 then - write_message(0x77a6, "'LONG'") - elseif s_type <= 6 then - write_message(0x77a6, "'SHORT'") - end - if help_setting == 3 then - --1st and 2nd bounce boxes use the latest spring type. - draw_zone("spring-hazard", 183, 20 + s_type, 168, 33 + s_type) - draw_zone("spring-hazard", 183, 20 + s_type + 50, 168, 33 + s_type + 50) - --3rd bounce box uses the trailing spring type on levels 4 and above - draw_zone("spring-hazard", 183, 20 + s_type_trailing + 100, 168, 33 + s_type_trailing + 100) + if s_type ~= nil then + -- Update screen with spring info + write_message(0x77a5, "T="..string.format("%02d", s_type)) + write_message(0x77a6, " ") + if s_type >= 13 then + write_message(0x77a6, "'LONG'") + elseif s_type <= 6 then + write_message(0x77a6, "'SHORT'") + end + if help_setting == 3 then + --1st and 2nd bounce boxes use the latest spring type. + draw_zone("spring-hazard", 183, 20 + s_type, 168, 33 + s_type) + draw_zone("spring-hazard", 183, 20 + s_type + 50, 168, 33 + s_type + 50) + --3rd bounce box uses the trailing spring type on levels 4 and above + draw_zone("spring-hazard", 183, 20 + s_type_trailing + 100, 168, 33 + s_type_trailing + 100) + end end - end - else - -- Clear screen info - write_message(0x77a5, " ") - write_message(0x77a6, " ") - write_message(0x75ed, " ") - write_message(0x75ee, " ") - - -- Change Jumpman's position back to default if necessary. - if os.clock() - last_help_toggle < 0.05 then - if mem:read_u8(0x694c) == coach_start_x and mem:read_u8(0x694f) == coach_start_y then - change_jumpman_position(default_start_x, default_start_y) + else + -- Clear screen info + write_message(0x77a5, " ") + write_message(0x77a6, " ") + write_message(0x75ed, " ") + write_message(0x75ee, " ") + + -- Change Jumpman's position back to default if necessary. + if os.clock() - last_help_toggle < 0.05 then + if mem:read_u8(0x694c) == coach_start_x and mem:read_u8(0x694f) == coach_start_y then + change_jumpman_position(default_start_x, default_start_y) + end end end end diff --git a/dkcoach/plugin.json b/dkcoach/plugin.json index 72b9234..822b140 100644 --- a/dkcoach/plugin.json +++ b/dkcoach/plugin.json @@ -2,7 +2,7 @@ "plugin": { "name": "dkcoach", "description": "Donkey Kong Coach", -"version": "0.1.0", +"version": "0.1", "author": "Jon Wilson (10yard)", "type": "plugin", "start": "false" diff --git a/readme.md b/readme.md index 4fec894..b3dba2d 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -+# **DK Coach** # +# **DK Coach** # ## A MAME plugin to assist with Donkey Kong gameplay @@ -7,7 +7,8 @@ Tested with latest MAME version 0.234 At the moment, the plugin only helps you with the springs stage. I plan to add help to other stages. -### Springs Stage + +## The Springs/Elevators Stage The helper visualises the safe zones and danger zones on DK's girder. Information about generated springs helps you make quick decisions on when to make a run and when to sit tight or retreat back to safety. @@ -24,7 +25,7 @@ Use "P2 Start" to toggle the helpfulness setting between 2 (Max Help), 1 (Min He ![Screenshot](https://github.com/10yard/dkcoach/blob/master/screenshot.png) -#### Process for progressing on the springs stage level 4+ +#### Tips for completing the Springs stage, level 4+ - Navigate Jumpman to the first green safe spot on the far right of DK's girder. - Move to the left edge of the safe spot, ensuring that Jumpman's feet remain inside the box. @@ -36,7 +37,7 @@ Use "P2 Start" to toggle the helpfulness setting between 2 (Max Help), 1 (Min He - As you become more confident on the springs stage, you should reduce helpers by pressing "P2 Start" button. See "Help Settings" below. -### Help Settings +## Help Settings The default setting is "Max Help". Toggle the setting by pressing "P2 Start". - Max Help: All of the available helpers are displayed. @@ -46,18 +47,36 @@ The default setting is "Max Help". Toggle the setting by pressing "P2 Start". As you become more confident with your gameplay, you should reduce help features by pressing "P2 Start" button. Switching from "Max Help" to "Min Help" to "No Help". -### Installing +## Installing and running The Plugin is installed by copying the "dkcoach" folder into your MAME plugins folder. -The Plugin is activated by adding `-plugin dkcoach` to your mame arguments e.g. +The Plugin is run by adding `-plugin dkcoach` to your MAME arguments e.g. ```mame dkong -plugin dkcoach``` -### Next up + +## What's next? Addition of barrel stage helper - safe zones from wild barrels - wild barrel alert - probability of steering barrels down ladders % - hammer timer countdown + + +## Thanks to + +The Donkey Kong rom hacking resource +https://github.com/furrykef/dkdasm + +The MAMEdev team +https://docs.mamedev.org/ + + +## Feedback + +Please send feedback to jon123wilson@hotmail.com + +Jon + diff --git a/screenshot.png b/screenshot.png index f52aca84329905dee8daef4fef56b2615b2e390d..b7bdcd7ba85529e0ddac1937d12555395ab436b1 100644 GIT binary patch literal 9306 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 Ui01D8`E!NISqsAov}^Q#0Wqyk82|tP delta 4698 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 A1^@s6