diff options
30 files changed, 995 insertions, 846 deletions
diff --git a/.github/calcrom/webhook.sh b/.github/calcrom/webhook.sh index 2a3015969..fd54b660b 100755 --- a/.github/calcrom/webhook.sh +++ b/.github/calcrom/webhook.sh @@ -8,4 +8,4 @@ if [ ! -f $map_file ]; then fi output=$(perl $(dirname "$0")/calcrom.pl $build_name.map | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g') -curl -d "{\"username\": \"$CALCROM_DISCORD_WEBHOOK_USERNAME\", \"avatar_url\": \"$CALCROM_DISCORD_WEBHOOK_AVATAR_URL\", \"content\":\"\`\`\`$build_name progress:\\n$output\`\`\`\"}" -H "Content-Type: application/json" -X POST "$CALCROM_DISCORD_WEBHOOK_URL" +curl -d "{\"username\": \"$CALCROM_DISCORD_WEBHOOK_USERNAME\", \"avatar_url\": \"$CALCROM_DISCORD_WEBHOOK_AVATAR_URL\", \"content\":\"\`\`\`\\n$build_name progress:\\n$output\\n\`\`\`\"}" -H "Content-Type: application/json" -X POST "$CALCROM_DISCORD_WEBHOOK_URL" diff --git a/charmap.txt b/charmap.txt index 84e1496f0..1bca4e4f4 100644 --- a/charmap.txt +++ b/charmap.txt @@ -414,7 +414,7 @@ HIGHLIGHT = FC 02 @ same as fc 01 SHADOW = FC 03 @ same as fc 01 COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes PALETTE = FC 05 @ used in credits -SIZE = FC 06 @ note that anything other than "SMALL" is invalid +FONT = FC 06 @ valid values are 0, 1, 2, 6 (braille), 7 and 8 RESET_SIZE = FC 07 PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them PAUSE_UNTIL_PRESS = FC 09 diff --git a/common_syms/ereader_screen.txt b/common_syms/ereader_screen.txt index 5a89d370d..2189eedbc 100644 --- a/common_syms/ereader_screen.txt +++ b/common_syms/ereader_screen.txt @@ -1 +1 @@ -gUnknown_03006370 +gEReaderData diff --git a/data/unknown_serial_data.bin b/data/ereader_link_data.bin Binary files differindex 85057cf4e..85057cf4e 100644 --- a/data/unknown_serial_data.bin +++ b/data/ereader_link_data.bin diff --git a/data/ereader_link_data.s b/data/ereader_link_data.s new file mode 100644 index 000000000..d3269ebfe --- /dev/null +++ b/data/ereader_link_data.s @@ -0,0 +1,6 @@ + .section .rodata + + .align 2 +gEReaderLinkData_Start:: + .incbin "data/ereader_link_data.bin" +gEReaderLinkData_End:: diff --git a/data/event_scripts.s b/data/event_scripts.s index a68c339a6..bbf25c93c 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -1026,7 +1026,7 @@ Common_EventScript_LegendaryFlewAway:: .include "data/scripts/mauville_man.inc" .include "data/scripts/field_move_scripts.inc" .include "data/scripts/item_ball_scripts.inc" - .include "data/scripts/mystery_event_club.inc" + .include "data/scripts/profile_man.inc" .include "data/scripts/day_care.inc" .include "data/scripts/flash.inc" .include "data/scripts/players_house.inc" diff --git a/data/maps/PetalburgCity_PokemonCenter_1F/map.json b/data/maps/PetalburgCity_PokemonCenter_1F/map.json index 1fd6e972b..875c53c2b 100644 --- a/data/maps/PetalburgCity_PokemonCenter_1F/map.json +++ b/data/maps/PetalburgCity_PokemonCenter_1F/map.json @@ -37,7 +37,7 @@ "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "MysteryEventClub_EventScript_Man", + "script": "ProfileMan_EventScript_Man", "flag": "0" }, { diff --git a/data/scripts/mystery_event_club.inc b/data/scripts/mystery_event_club.inc deleted file mode 100644 index f0cb55998..000000000 --- a/data/scripts/mystery_event_club.inc +++ /dev/null @@ -1,170 +0,0 @@ -MysteryEventClub_EventScript_Man:: - lock - faceplayer - goto_if_set FLAG_SYS_CHAT_USED, MysteryEventClub_EventScript_GivenProfileBefore - msgbox MysteryEventClub_Text_CollectTrainerProfiles, MSGBOX_DEFAULT - goto MysteryEventClub_EventScript_AskToSeeProfile - end - -MysteryEventClub_EventScript_AskToSeeProfile:: - msgbox MysteryEventClub_Text_MayISeeYourProfile, MSGBOX_DEFAULT - multichoice 17, 6, MULTI_YESNOINFO_2, FALSE - switch VAR_RESULT - case 0, MysteryEventClub_EventScript_CreateProfile - case 1, MysteryEventClub_EventScript_DeclineShowProfile - case 2, MysteryEventClub_EventScript_Info - case MULTI_B_PRESSED, MysteryEventClub_EventScript_DeclineShowProfile - end - -MysteryEventClub_EventScript_Info:: - msgbox MysteryEventClub_Text_EasyChatExplanation, MSGBOX_DEFAULT - goto MysteryEventClub_EventScript_AskToSeeProfile - end - -MysteryEventClub_EventScript_CreateProfile:: - msgbox MysteryEventClub_Text_LetsSeeItThen, MSGBOX_DEFAULT - closemessage - setvar VAR_0x8004, EASY_CHAT_TYPE_PROFILE - call Common_ShowEasyChatScreen - lock - faceplayer - compare VAR_RESULT, 0 - goto_if_eq MysteryEventClub_EventScript_CancelShowProfile - compare VAR_RESULT, 1 - goto_if_eq MysteryEventClub_EventScript_ShowProfile - end - -MysteryEventClub_EventScript_CancelShowProfile:: - msgbox MysteryEventClub_Text_NotIntoItRightNow, MSGBOX_DEFAULT - release - end - -MysteryEventClub_EventScript_ShowProfile:: - setvar VAR_0x8004, 0 - special ShowEasyChatProfile - waitmessage - delay 80 - msgbox MysteryEventClub_Text_FantasticProfile, MSGBOX_DEFAULT - release - end - -MysteryEventClub_EventScript_DeclineShowProfile:: - msgbox MysteryEventClub_Text_ImagineYouWouldHaveWonderfulProfile, MSGBOX_DEFAULT - release - end - -MysteryEventClub_EventScript_GivenProfileBefore:: - msgbox MysteryEventClub_Text_YouHaveWonderfulSmile, MSGBOX_DEFAULT - goto MysteryEventClub_EventScript_AskToSeeNewProfile - end - -MysteryEventClub_EventScript_AskToSeeNewProfile:: - msgbox MysteryEventClub_Text_MayISeeYourNewProfile, MSGBOX_DEFAULT - multichoice 17, 6, MULTI_YESNOINFO_2, FALSE - switch VAR_RESULT - case 0, MysteryEventClub_EventScript_CreateNewProfile - case 1, MysteryEventClub_EventScript_DeclineNewProfile - case 2, MysteryEventClub_EventScript_InfoNewProfile - case MULTI_B_PRESSED, MysteryEventClub_EventScript_DeclineNewProfile - end - -MysteryEventClub_EventScript_InfoNewProfile:: - msgbox MysteryEventClub_Text_EasyChatExplanation, MSGBOX_DEFAULT - goto MysteryEventClub_EventScript_AskToSeeNewProfile - end - -MysteryEventClub_EventScript_CreateNewProfile:: - msgbox MysteryEventClub_Text_EvenBetterThanLastProfile, MSGBOX_DEFAULT - closemessage - setvar VAR_0x8004, EASY_CHAT_TYPE_PROFILE - call Common_ShowEasyChatScreen - lock - faceplayer - compare VAR_RESULT, 0 - goto_if_eq MysteryEventClub_EventScript_CancelShowProfile - compare VAR_RESULT, 1 - goto_if_eq MysteryEventClub_EventScript_ShowProfile - end - -MysteryEventClub_EventScript_DeclineNewProfile:: - msgbox MysteryEventClub_Text_LikeProfileWayItIs, MSGBOX_DEFAULT - release - end - -@ Unused -MysteryEventClub_EventScript_Ret:: - return - -MysteryEventClub_Text_CollectTrainerProfiles: - .string "Hello there, TRAINER!\n" - .string "You've got a wonderful smile, there.\p" - .string "I have a hobby--collecting the profiles\n" - .string "of POKéMON TRAINERS.$" - -MysteryEventClub_Text_MayISeeYourProfile: - .string "So, how about it?\n" - .string "May I see your profile?$" - -MysteryEventClub_Text_EasyChatExplanation: - .string "You make your own profile by putting\n" - .string "together four words or phrases.\p" - .string "Here, I'll show you an example of a\n" - .string "profile using four pieces of text.\p" - .string "You can switch those four pieces with\n" - .string "other text pieces any which way you\l" - .string "like to make your own profile.\p" - .string "There are a lot of text pieces that\n" - .string "you can use.\p" - .string "They are arranged in groups like\n" - .string "POKéMON, lifestyles, and hobbies so\l" - .string "it is easier to look them up.\p" - .string "So, first, choose the group of text\n" - .string "pieces to display a list of choices.\p" - .string "Then, pick the choice you want.\p" - .string "Repeat for the remaining text choices,\n" - .string "and you'll have your very own profile.$" - -MysteryEventClub_Text_LetsSeeItThen: - .string "Yes! Thank you!\n" - .string "So, let's see it, then.$" - -MysteryEventClub_Text_ImagineYouWouldHaveWonderfulProfile: - .string "Oh, no, really?\p" - .string "I imagine someone like you would have\n" - .string "a wonderful profile…$" - -MysteryEventClub_Text_NotIntoItRightNow: - .string "Oh? You're not into it right now?\p" - .string "Well, anytime is good by me!$" - -MysteryEventClub_Text_YouHaveWonderfulSmile: - .string "Hello there, TRAINER!\n" - .string "You've got a wonderful smile.$" - -MysteryEventClub_Text_MayISeeYourNewProfile: - .string "May I see your new profile?$" - -MysteryEventClub_Text_EvenBetterThanLastProfile: - .string "Yes! Thank you!\p" - .string "I hope it's even better than the profile\n" - .string "you showed me before.$" - -MysteryEventClub_Text_LikeProfileWayItIs: - .string "Oh, you like your profile the way it is.\p" - .string "I don't blame you--it's a wonderful\n" - .string "profile the way it is now.$" - -MysteryEventClub_Text_FantasticProfile: - .string "F-fantastic!\p" - .string "Your profile, it's wonderful!\n" - .string "It really says what you're about.\p" - .string "Why, anyone hearing this profile would\n" - .string "be captivated by you!\p" - .string "Thank you!$" - -@ Unused -MysteryEventClub_Text_YouKnowSecretSaying: - .string "Oh?\n" - .string "You know the secret saying!\p" - .string "That means you're now a fellow member\n" - .string "of the MYSTERY EVENT CLUB!$" diff --git a/data/scripts/profile_man.inc b/data/scripts/profile_man.inc new file mode 100644 index 000000000..2c5b16122 --- /dev/null +++ b/data/scripts/profile_man.inc @@ -0,0 +1,170 @@ +ProfileMan_EventScript_Man:: + lock + faceplayer + goto_if_set FLAG_SYS_CHAT_USED, ProfileMan_EventScript_GivenProfileBefore + msgbox ProfileMan_Text_CollectTrainerProfiles, MSGBOX_DEFAULT + goto ProfileMan_EventScript_AskToSeeProfile + end + +ProfileMan_EventScript_AskToSeeProfile:: + msgbox ProfileMan_Text_MayISeeYourProfile, MSGBOX_DEFAULT + multichoice 17, 6, MULTI_YESNOINFO_2, FALSE + switch VAR_RESULT + case 0, ProfileMan_EventScript_CreateProfile + case 1, ProfileMan_EventScript_DeclineShowProfile + case 2, ProfileMan_EventScript_Info + case MULTI_B_PRESSED, ProfileMan_EventScript_DeclineShowProfile + end + +ProfileMan_EventScript_Info:: + msgbox ProfileMan_Text_EasyChatExplanation, MSGBOX_DEFAULT + goto ProfileMan_EventScript_AskToSeeProfile + end + +ProfileMan_EventScript_CreateProfile:: + msgbox ProfileMan_Text_LetsSeeItThen, MSGBOX_DEFAULT + closemessage + setvar VAR_0x8004, EASY_CHAT_TYPE_PROFILE + call Common_ShowEasyChatScreen + lock + faceplayer + compare VAR_RESULT, 0 + goto_if_eq ProfileMan_EventScript_CancelShowProfile + compare VAR_RESULT, 1 + goto_if_eq ProfileMan_EventScript_ShowProfile + end + +ProfileMan_EventScript_CancelShowProfile:: + msgbox ProfileMan_Text_NotIntoItRightNow, MSGBOX_DEFAULT + release + end + +ProfileMan_EventScript_ShowProfile:: + setvar VAR_0x8004, 0 + special ShowEasyChatProfile + waitmessage + delay 80 + msgbox ProfileMan_Text_FantasticProfile, MSGBOX_DEFAULT + release + end + +ProfileMan_EventScript_DeclineShowProfile:: + msgbox ProfileMan_Text_ImagineYouWouldHaveWonderfulProfile, MSGBOX_DEFAULT + release + end + +ProfileMan_EventScript_GivenProfileBefore:: + msgbox ProfileMan_Text_YouHaveWonderfulSmile, MSGBOX_DEFAULT + goto ProfileMan_EventScript_AskToSeeNewProfile + end + +ProfileMan_EventScript_AskToSeeNewProfile:: + msgbox ProfileMan_Text_MayISeeYourNewProfile, MSGBOX_DEFAULT + multichoice 17, 6, MULTI_YESNOINFO_2, FALSE + switch VAR_RESULT + case 0, ProfileMan_EventScript_CreateNewProfile + case 1, ProfileMan_EventScript_DeclineNewProfile + case 2, ProfileMan_EventScript_InfoNewProfile + case MULTI_B_PRESSED, ProfileMan_EventScript_DeclineNewProfile + end + +ProfileMan_EventScript_InfoNewProfile:: + msgbox ProfileMan_Text_EasyChatExplanation, MSGBOX_DEFAULT + goto ProfileMan_EventScript_AskToSeeNewProfile + end + +ProfileMan_EventScript_CreateNewProfile:: + msgbox ProfileMan_Text_EvenBetterThanLastProfile, MSGBOX_DEFAULT + closemessage + setvar VAR_0x8004, EASY_CHAT_TYPE_PROFILE + call Common_ShowEasyChatScreen + lock + faceplayer + compare VAR_RESULT, 0 + goto_if_eq ProfileMan_EventScript_CancelShowProfile + compare VAR_RESULT, 1 + goto_if_eq ProfileMan_EventScript_ShowProfile + end + +ProfileMan_EventScript_DeclineNewProfile:: + msgbox ProfileMan_Text_LikeProfileWayItIs, MSGBOX_DEFAULT + release + end + +@ Unused +ProfileMan_EventScript_Ret:: + return + +ProfileMan_Text_CollectTrainerProfiles: + .string "Hello there, TRAINER!\n" + .string "You've got a wonderful smile, there.\p" + .string "I have a hobby--collecting the profiles\n" + .string "of POKéMON TRAINERS.$" + +ProfileMan_Text_MayISeeYourProfile: + .string "So, how about it?\n" + .string "May I see your profile?$" + +ProfileMan_Text_EasyChatExplanation: + .string "You make your own profile by putting\n" + .string "together four words or phrases.\p" + .string "Here, I'll show you an example of a\n" + .string "profile using four pieces of text.\p" + .string "You can switch those four pieces with\n" + .string "other text pieces any which way you\l" + .string "like to make your own profile.\p" + .string "There are a lot of text pieces that\n" + .string "you can use.\p" + .string "They are arranged in groups like\n" + .string "POKéMON, lifestyles, and hobbies so\l" + .string "it is easier to look them up.\p" + .string "So, first, choose the group of text\n" + .string "pieces to display a list of choices.\p" + .string "Then, pick the choice you want.\p" + .string "Repeat for the remaining text choices,\n" + .string "and you'll have your very own profile.$" + +ProfileMan_Text_LetsSeeItThen: + .string "Yes! Thank you!\n" + .string "So, let's see it, then.$" + +ProfileMan_Text_ImagineYouWouldHaveWonderfulProfile: + .string "Oh, no, really?\p" + .string "I imagine someone like you would have\n" + .string "a wonderful profile…$" + +ProfileMan_Text_NotIntoItRightNow: + .string "Oh? You're not into it right now?\p" + .string "Well, anytime is good by me!$" + +ProfileMan_Text_YouHaveWonderfulSmile: + .string "Hello there, TRAINER!\n" + .string "You've got a wonderful smile.$" + +ProfileMan_Text_MayISeeYourNewProfile: + .string "May I see your new profile?$" + +ProfileMan_Text_EvenBetterThanLastProfile: + .string "Yes! Thank you!\p" + .string "I hope it's even better than the profile\n" + .string "you showed me before.$" + +ProfileMan_Text_LikeProfileWayItIs: + .string "Oh, you like your profile the way it is.\p" + .string "I don't blame you--it's a wonderful\n" + .string "profile the way it is now.$" + +ProfileMan_Text_FantasticProfile: + .string "F-fantastic!\p" + .string "Your profile, it's wonderful!\n" + .string "It really says what you're about.\p" + .string "Why, anyone hearing this profile would\n" + .string "be captivated by you!\p" + .string "Thank you!$" + +@ Unused +ProfileMan_Text_YouKnowSecretSaying: + .string "Oh?\n" + .string "You know the secret saying!\p" + .string "That means you're now a fellow member\n" + .string "of the MYSTERY EVENT CLUB!$" diff --git a/data/unknown_serial_data.s b/data/unknown_serial_data.s deleted file mode 100644 index 2fb1ba42b..000000000 --- a/data/unknown_serial_data.s +++ /dev/null @@ -1,5 +0,0 @@ - .section .rodata - - .align 2 -gUnknown_089A3470:: - .incbin "data/unknown_serial_data.bin" diff --git a/gflib/string_util.c b/gflib/string_util.c index b7485184a..4bf0d2ae9 100644 --- a/gflib/string_util.c +++ b/gflib/string_util.c @@ -386,7 +386,7 @@ u8 *StringBraille(u8 *dest, const u8 *src) { const u8 setBrailleFont[] = { EXT_CTRL_CODE_BEGIN, - EXT_CTRL_CODE_SIZE, + EXT_CTRL_CODE_FONT, 6, EOS }; @@ -664,7 +664,7 @@ u8 GetExtCtrlCodeLength(u8 code) [EXT_CTRL_CODE_SHADOW] = 2, [EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW] = 4, [EXT_CTRL_CODE_PALETTE] = 2, - [EXT_CTRL_CODE_SIZE] = 2, + [EXT_CTRL_CODE_FONT] = 2, [EXT_CTRL_CODE_RESET_SIZE] = 1, [EXT_CTRL_CODE_PAUSE] = 2, [EXT_CTRL_CODE_PAUSE_UNTIL_PRESS] = 1, diff --git a/gflib/text.c b/gflib/text.c index eb993c421..e3043230b 100644 --- a/gflib/text.c +++ b/gflib/text.c @@ -906,7 +906,7 @@ u16 RenderText(struct TextPrinter *textPrinter) case EXT_CTRL_CODE_PALETTE: textPrinter->printerTemplate.currentChar++; return 2; - case EXT_CTRL_CODE_SIZE: + case EXT_CTRL_CODE_FONT: subStruct->glyphId = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; return 2; @@ -1170,7 +1170,7 @@ u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing) case EXT_CTRL_CODE_HIGHLIGHT: case EXT_CTRL_CODE_SHADOW: case EXT_CTRL_CODE_PALETTE: - case EXT_CTRL_CODE_SIZE: + case EXT_CTRL_CODE_FONT: case EXT_CTRL_CODE_PAUSE: case EXT_CTRL_CODE_ESCAPE: case EXT_CTRL_CODE_SHIFT_TEXT: @@ -1319,7 +1319,7 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) case EXT_CTRL_CODE_SHIFT_DOWN: ++str; break; - case EXT_CTRL_CODE_SIZE: + case EXT_CTRL_CODE_FONT: func = GetFontWidthFunc(*++str); if (func == NULL) return 0; @@ -1449,7 +1449,7 @@ u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str) shadowColor = strLocal[strPos++]; GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); continue; - case EXT_CTRL_CODE_SIZE: + case EXT_CTRL_CODE_FONT: fontId = strLocal[strPos++]; break; case EXT_CTRL_CODE_PLAY_BGM: diff --git a/gflib/text.h b/gflib/text.h index ee3dfa34c..9bb07580e 100644 --- a/gflib/text.h +++ b/gflib/text.h @@ -211,7 +211,7 @@ #define EXT_CTRL_CODE_SHADOW 0x03 #define EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW 0x04 #define EXT_CTRL_CODE_PALETTE 0x05 -#define EXT_CTRL_CODE_SIZE 0x06 +#define EXT_CTRL_CODE_FONT 0x06 #define EXT_CTRL_CODE_RESET_SIZE 0x07 #define EXT_CTRL_CODE_PAUSE 0x08 #define EXT_CTRL_CODE_PAUSE_UNTIL_PRESS 0x09 diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index 13e91c415..4ffb869e4 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -245,4 +245,77 @@ #define MOVEMENT_ACTION_STEP_END 0xFE #define MOVEMENT_ACTION_NONE 0xFF +#define ANIM_STD_FACE_SOUTH 0 +#define ANIM_STD_FACE_NORTH 1 +#define ANIM_STD_FACE_WEST 2 +#define ANIM_STD_FACE_EAST 3 +#define ANIM_STD_GO_SOUTH 4 +#define ANIM_STD_GO_NORTH 5 +#define ANIM_STD_GO_WEST 6 +#define ANIM_STD_GO_EAST 7 +#define ANIM_STD_GO_FAST_SOUTH 8 +#define ANIM_STD_GO_FAST_NORTH 9 +#define ANIM_STD_GO_FAST_WEST 10 +#define ANIM_STD_GO_FAST_EAST 11 +#define ANIM_STD_GO_FASTER_SOUTH 12 +#define ANIM_STD_GO_FASTER_NORTH 13 +#define ANIM_STD_GO_FASTER_WEST 14 +#define ANIM_STD_GO_FASTER_EAST 15 +#define ANIM_STD_GO_FASTEST_SOUTH 16 +#define ANIM_STD_GO_FASTEST_NORTH 17 +#define ANIM_STD_GO_FASTEST_WEST 18 +#define ANIM_STD_GO_FASTEST_EAST 19 +#define ANIM_STD_COUNT 20 + +#define ANIM_RUN_SOUTH (ANIM_STD_COUNT + 0) +#define ANIM_RUN_NORTH (ANIM_STD_COUNT + 1) +#define ANIM_RUN_WEST (ANIM_STD_COUNT + 2) +#define ANIM_RUN_EAST (ANIM_STD_COUNT + 3) + +#define ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH (ANIM_STD_COUNT + 0) +#define ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH (ANIM_STD_COUNT + 1) +#define ANIM_BUNNY_HOPPY_BACK_WHEEL_WEST (ANIM_STD_COUNT + 2) +#define ANIM_BUNNY_HOPPY_BACK_WHEEL_EAST (ANIM_STD_COUNT + 3) +#define ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH (ANIM_STD_COUNT + 4) +#define ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH (ANIM_STD_COUNT + 5) +#define ANIM_BUNNY_HOPPY_FRONT_WHEEL_WEST (ANIM_STD_COUNT + 6) +#define ANIM_BUNNY_HOPPY_FRONT_WHEEL_EAST (ANIM_STD_COUNT + 7) +#define ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH (ANIM_STD_COUNT + 8) +#define ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH (ANIM_STD_COUNT + 9) +#define ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST (ANIM_STD_COUNT + 10) +#define ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST (ANIM_STD_COUNT + 11) +#define ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH (ANIM_STD_COUNT + 12) +#define ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH (ANIM_STD_COUNT + 13) +#define ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST (ANIM_STD_COUNT + 14) +#define ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST (ANIM_STD_COUNT + 15) +#define ANIM_MOVING_WHEELIE_SOUTH (ANIM_STD_COUNT + 16) +#define ANIM_MOVING_WHEELIE_NORTH (ANIM_STD_COUNT + 17) +#define ANIM_MOVING_WHEELIE_WEST (ANIM_STD_COUNT + 18) +#define ANIM_MOVING_WHEELIE_EAST (ANIM_STD_COUNT + 19) + +#define ANIM_GET_ON_OFF_POKEMON_SOUTH (ANIM_STD_COUNT + 0) +#define ANIM_GET_ON_OFF_POKEMON_NORTH (ANIM_STD_COUNT + 1) +#define ANIM_GET_ON_OFF_POKEMON_WEST (ANIM_STD_COUNT + 2) +#define ANIM_GET_ON_OFF_POKEMON_EAST (ANIM_STD_COUNT + 3) + +#define ANIM_NURSE_BOW (ANIM_STD_COUNT + 0) + +#define ANIM_FIELD_MOVE 0 + +#define ANIM_STAY_STILL 0 +#define ANIM_REMOVE_OBSTACLE 1 + +#define ANIM_TAKE_OUT_ROD_SOUTH 0 +#define ANIM_TAKE_OUT_ROD_NORTH 1 +#define ANIM_TAKE_OUT_ROD_WEST 2 +#define ANIM_TAKE_OUT_ROD_EAST 3 +#define ANIM_PUT_AWAY_ROD_SOUTH 4 +#define ANIM_PUT_AWAY_ROD_NORTH 5 +#define ANIM_PUT_AWAY_ROD_WEST 6 +#define ANIM_PUT_AWAY_ROD_EAST 7 +#define ANIM_HOOKED_POKEMON_SOUTH 8 +#define ANIM_HOOKED_POKEMON_NORTH 9 +#define ANIM_HOOKED_POKEMON_WEST 10 +#define ANIM_HOOKED_POKEMON_EAST 11 + #endif // GUARD_CONSTANTS_EVENT_OBJECT_MOVEMENT_H diff --git a/include/ereader_helpers.h b/include/ereader_helpers.h index 064b61ed7..8bf3dc43b 100755 --- a/include/ereader_helpers.h +++ b/include/ereader_helpers.h @@ -3,6 +3,34 @@ #include "trainer_hill.h" +enum { + EREADER_XFR_STATE_INIT = 0, + EREADER_XFR_STATE_HANDSHAKE, + EREADER_XFR_STATE_START, + EREADER_XFR_STATE_TRANSFER, + EREADER_XFR_STATE_TRANSFER_DONE, + EREADER_XFR_STATE_CHECKSUM, + EREADER_XFR_STATE_DONE +}; + +#define EREADER_XFER_EXE 1 +#define EREADER_XFER_CHK 2 +#define EREADER_XFER_SHIFT 0 +#define EREADER_XFER_MASK ((EREADER_XFER_EXE | EREADER_XFER_CHK) << EREADER_XFER_SHIFT) + +#define EREADER_CANCEL_TIMEOUT 1 +#define EREADER_CANCEL_KEY 2 +#define EREADER_CANCEL_SHIFT 2 +#define EREADER_CANCEL_TIMEOUT_MASK (EREADER_CANCEL_TIMEOUT << EREADER_CANCEL_SHIFT) +#define EREADER_CANCEL_KEY_MASK (EREADER_CANCEL_KEY << EREADER_CANCEL_SHIFT) +#define EREADER_CANCEL_MASK ((EREADER_CANCEL_TIMEOUT | EREADER_CANCEL_KEY) << EREADER_CANCEL_SHIFT) + +#define EREADER_CHECKSUM_OK 1 +#define EREADER_CHECKSUM_ERR 2 +#define EREADER_CHECKSUM_SHIFT 4 +#define EREADER_CHECKSUM_OK_MASK (EREADER_CHECKSUM_OK << EREADER_CHECKSUM_SHIFT) +#define EREADER_CHECKSUM_MASK ((EREADER_CHECKSUM_OK | EREADER_CHECKSUM_ERR) << EREADER_CHECKSUM_SHIFT) + struct EReaderTrainerHillTrainer { u8 trainerNum; diff --git a/include/link.h b/include/link.h index 4e0491356..6061745af 100644 --- a/include/link.h +++ b/include/link.h @@ -124,8 +124,9 @@ struct LinkStatus u32 errors:7; }; -#define MASTER_HANDSHAKE 0x8FFF -#define SLAVE_HANDSHAKE 0xB9A0 +#define MASTER_HANDSHAKE 0x8FFF +#define SLAVE_HANDSHAKE 0xB9A0 +#define EREADER_HANDSHAKE 0xCCD0 #define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT) @@ -208,7 +209,7 @@ struct Link /* 0x001 */ u8 state; /* 0x002 */ u8 localId; // local multi-player ID /* 0x003 */ u8 playerCount; - /* 0x004 */ u16 tempRecvBuffer[4]; + /* 0x004 */ u16 handshakeBuffer[MAX_LINK_PLAYERS]; /* 0x00c */ bool8 receivedNothing; /* 0x00d */ s8 serialIntrCounter; /* 0x00e */ bool8 handshakeAsMaster; diff --git a/ld_script.txt b/ld_script.txt index 93babfa16..3c1a25094 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -1250,7 +1250,7 @@ SECTIONS { other_data : ALIGN(4) { - data/unknown_serial_data.o(.rodata); + data/ereader_link_data.o(.rodata); data/multiboot_berry_glitch_fix.o(.rodata); data/multiboot_pokemon_colosseum.o(.rodata); } =0 diff --git a/ld_script_modern.txt b/ld_script_modern.txt index 59d032bb2..c5c711bfd 100644 --- a/ld_script_modern.txt +++ b/ld_script_modern.txt @@ -114,7 +114,7 @@ SECTIONS { other_data : ALIGN(4) { - data/unknown_serial_data.o(.rodata); + data/ereader_link_data.o(.rodata); data/multiboot_berry_glitch_fix.o(.rodata); data/multiboot_pokemon_colosseum.o(.rodata); } =0 diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index ac8babb60..f4e47b434 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1500,7 +1500,7 @@ static void MoveSelectionDisplayMoveType(void) txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; - *(txtPtr)++ = EXT_CTRL_CODE_SIZE; + *(txtPtr)++ = EXT_CTRL_CODE_FONT; *(txtPtr)++ = 1; StringCopy(txtPtr, gTypeNames[gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].type]); diff --git a/src/cable_car.c b/src/cable_car.c index 39154cd1d..c3e6564f8 100644 --- a/src/cable_car.c +++ b/src/cable_car.c @@ -17,6 +17,7 @@ #include "sound.h" #include "sprite.h" #include "task.h" +#include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/rgb.h" #include "constants/songs.h" @@ -902,15 +903,13 @@ static void CreateCableCarSprites(void) { if (rval % 2) { - // Do walking west anim - StartSpriteAnim(&gSprites[spriteId], 6); + StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_WEST); gSprites[spriteId].sSameDir = TRUE; gSprites[spriteId].y += 2; } else { - // Do walking east anim - StartSpriteAnim(&gSprites[spriteId], 7); + StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_EAST); gSprites[spriteId].sSameDir = FALSE; } } @@ -918,15 +917,13 @@ static void CreateCableCarSprites(void) { if (rval % 2) { - // Do walking east anim - StartSpriteAnim(&gSprites[spriteId], 7); + StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_EAST); gSprites[spriteId].sSameDir = TRUE; gSprites[spriteId].y += 2; } else { - // Do walking west anim - StartSpriteAnim(&gSprites[spriteId], 6); + StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_WEST); gSprites[spriteId].sSameDir = FALSE; } } diff --git a/src/data/object_events/object_event_anims.h b/src/data/object_events/object_event_anims.h index a66d634b0..a5fb41462 100755 --- a/src/data/object_events/object_event_anims.h +++ b/src/data/object_events/object_event_anims.h @@ -796,99 +796,100 @@ static const union AnimCmd sAnim_HoOhStayStill[] = }; static const union AnimCmd *const sAnimTable_Inanimate[] = { - sAnim_StayStill, + [ANIM_STAY_STILL] = sAnim_StayStill, }; static const union AnimCmd *const sAnimTable_QuintyPlump[] = { - sAnim_QuintyPlumpFaceSouth, - sAnim_QuintyPlumpFaceNorth, - sAnim_QuintyPlumpFaceWest, - sAnim_QuintyPlumpFaceEast, - sAnim_QuintyPlumpGoSouth, - sAnim_QuintyPlumpGoNorth, - sAnim_QuintyPlumpGoWest, - sAnim_QuintyPlumpGoEast, - sAnim_QuintyPlumpGoFastSouth, - sAnim_QuintyPlumpGoFastNorth, - sAnim_QuintyPlumpGoFastWest, - sAnim_QuintyPlumpGoFastEast, - sAnim_QuintyPlumpGoFasterSouth, - sAnim_QuintyPlumpGoFasterNorth, - sAnim_QuintyPlumpGoFasterWest, - sAnim_QuintyPlumpGoFasterEast, - sAnim_QuintyPlumpGoFastestSouth, - sAnim_QuintyPlumpGoFastestNorth, - sAnim_QuintyPlumpGoFastestWest, - sAnim_QuintyPlumpGoFastestEast, + [ANIM_STD_FACE_SOUTH] = sAnim_QuintyPlumpFaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_QuintyPlumpFaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_QuintyPlumpFaceWest, + [ANIM_STD_FACE_EAST] = sAnim_QuintyPlumpFaceEast, + [ANIM_STD_GO_SOUTH] = sAnim_QuintyPlumpGoSouth, + [ANIM_STD_GO_NORTH] = sAnim_QuintyPlumpGoNorth, + [ANIM_STD_GO_WEST] = sAnim_QuintyPlumpGoWest, + [ANIM_STD_GO_EAST] = sAnim_QuintyPlumpGoEast, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_QuintyPlumpGoFastSouth, + [ANIM_STD_GO_FAST_NORTH] = sAnim_QuintyPlumpGoFastNorth, + [ANIM_STD_GO_FAST_WEST] = sAnim_QuintyPlumpGoFastWest, + [ANIM_STD_GO_FAST_EAST] = sAnim_QuintyPlumpGoFastEast, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_QuintyPlumpGoFasterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_QuintyPlumpGoFasterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_QuintyPlumpGoFasterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_QuintyPlumpGoFasterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_QuintyPlumpGoFastestSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_QuintyPlumpGoFastestNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_QuintyPlumpGoFastestWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_QuintyPlumpGoFastestEast, }; static const union AnimCmd *const sAnimTable_Standard[] = { - sAnim_FaceSouth, - sAnim_FaceNorth, - sAnim_FaceWest, - sAnim_FaceEast, - sAnim_GoSouth, - sAnim_GoNorth, - sAnim_GoWest, - sAnim_GoEast, - sAnim_GoFastSouth, - sAnim_GoFastNorth, - sAnim_GoFastWest, - sAnim_GoFastEast, - sAnim_GoFasterSouth, - sAnim_GoFasterNorth, - sAnim_GoFasterWest, - sAnim_GoFasterEast, - sAnim_GoFastestSouth, - sAnim_GoFastestNorth, - sAnim_GoFastestWest, - sAnim_GoFastestEast, + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, + [ANIM_STD_GO_NORTH] = sAnim_GoNorth, + [ANIM_STD_GO_WEST] = sAnim_GoWest, + [ANIM_STD_GO_EAST] = sAnim_GoEast, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, }; static const union AnimCmd *const sAnimTable_HoOh[] = { - sAnim_FaceSouth, - sAnim_FaceNorth, - sAnim_FaceWest, - sAnim_FaceEast, - sAnim_HoOhFlapWings, - sAnim_HoOhStayStill, - sAnim_GoWest, - sAnim_GoEast, - sAnim_GoFastSouth, - sAnim_GoFastNorth, - sAnim_GoFastWest, - sAnim_GoFastEast, - sAnim_GoFasterSouth, - sAnim_GoFasterNorth, - sAnim_GoFasterWest, - sAnim_GoFasterEast, - sAnim_GoFastestSouth, - sAnim_GoFastestNorth, - sAnim_GoFastestWest, - sAnim_GoFastestEast, -}; - + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast, + [ANIM_STD_GO_SOUTH] = sAnim_HoOhFlapWings, + [ANIM_STD_GO_NORTH] = sAnim_HoOhStayStill, + [ANIM_STD_GO_WEST] = sAnim_GoWest, + [ANIM_STD_GO_EAST] = sAnim_GoEast, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, +}; + +// The movements for going up use the animations for going right instead. static const union AnimCmd *const sAnimTable_GroudonSide[] = { - sAnim_FaceSouth, - sAnim_FaceNorth, - sAnim_FaceWest, - sAnim_FaceEast, - sAnim_GoSouth, - sAnim_GoEast, - sAnim_GoWest, - sAnim_GoEast, - sAnim_GoFastSouth, - sAnim_GoFastEast, - sAnim_GoFastWest, - sAnim_GoFastEast, - sAnim_GoFasterSouth, - sAnim_GoFasterEast, - sAnim_GoFasterWest, - sAnim_GoFasterEast, - sAnim_GoFastestSouth, - sAnim_GoFastestEast, - sAnim_GoFastestWest, - sAnim_GoFastestEast, + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, + [ANIM_STD_GO_NORTH] = sAnim_GoEast, + [ANIM_STD_GO_WEST] = sAnim_GoWest, + [ANIM_STD_GO_EAST] = sAnim_GoEast, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastEast, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterEast, + [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestEast, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, }; static const union AnimCmd sAnim_RayquazaCoiledAwake[] = @@ -952,186 +953,185 @@ static const union AnimCmd sAnim_RayquazaFaceEast[] = // Though they correspond to facing/walking movements, Rayquaza doesn't have // equivalent images aside from flying up. Its other frames aside from the 'normal' // frame are for the sequence where it awakens on Sky Pillar. -// The corresponding facing/walking movements are commented alongside static const union AnimCmd *const sAnimTable_Rayquaza[] = { - sAnim_RayquazaFaceSouth, // Face South - sAnim_RayquazaFaceNorth, // Face North - sAnim_RayquazaFaceWest, // Face West - sAnim_RayquazaFaceEast, // Face East - sAnim_RayquazaCoiledAsleep, // Go South - sAnim_RayquazaFlyUp, // Go North - sAnim_RayquazaCoiledMouthOpen, // Go West - sAnim_RayquazaNormal, // Go East - sAnim_RayquazaCoiledAsleep, // Go fast South - sAnim_RayquazaFlyUp, // Go fast North - sAnim_RayquazaCoiledAwake, // Go fast West - sAnim_RayquazaNormal, // Go fast East - sAnim_RayquazaCoiledAsleep, // Go faster South - sAnim_RayquazaFlyUp, // Go faster North - sAnim_RayquazaCoiledMouthOpen, // Go faster West - sAnim_RayquazaNormal, // Go faster East - sAnim_RayquazaCoiledAsleep, // Go fastest South - sAnim_RayquazaFlyUp, // Go fastest North - sAnim_RayquazaCoiledMouthOpen, // Go fastest West - sAnim_RayquazaNormal, // Go fastest East + [ANIM_STD_FACE_SOUTH] = sAnim_RayquazaFaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_RayquazaFaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_RayquazaFaceWest, + [ANIM_STD_FACE_EAST] = sAnim_RayquazaFaceEast, + [ANIM_STD_GO_SOUTH] = sAnim_RayquazaCoiledAsleep, + [ANIM_STD_GO_NORTH] = sAnim_RayquazaFlyUp, + [ANIM_STD_GO_WEST] = sAnim_RayquazaCoiledMouthOpen, + [ANIM_STD_GO_EAST] = sAnim_RayquazaNormal, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_RayquazaCoiledAsleep, + [ANIM_STD_GO_FAST_NORTH] = sAnim_RayquazaFlyUp, + [ANIM_STD_GO_FAST_WEST] = sAnim_RayquazaCoiledAwake, + [ANIM_STD_GO_FAST_EAST] = sAnim_RayquazaNormal, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_RayquazaCoiledAsleep, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_RayquazaFlyUp, + [ANIM_STD_GO_FASTER_WEST] = sAnim_RayquazaCoiledMouthOpen, + [ANIM_STD_GO_FASTER_EAST] = sAnim_RayquazaNormal, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_RayquazaCoiledAsleep, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_RayquazaFlyUp, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_RayquazaCoiledMouthOpen, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_RayquazaNormal, }; static const union AnimCmd *const sAnimTable_BrendanMayNormal[] = { - sAnim_FaceSouth, - sAnim_FaceNorth, - sAnim_FaceWest, - sAnim_FaceEast, - sAnim_GoSouth, - sAnim_GoNorth, - sAnim_GoWest, - sAnim_GoEast, - sAnim_GoFastSouth, - sAnim_GoFastNorth, - sAnim_GoFastWest, - sAnim_GoFastEast, - sAnim_GoFasterSouth, - sAnim_GoFasterNorth, - sAnim_GoFasterWest, - sAnim_GoFasterEast, - sAnim_GoFastestSouth, - sAnim_GoFastestNorth, - sAnim_GoFastestWest, - sAnim_GoFastestEast, - sAnim_RunSouth, - sAnim_RunNorth, - sAnim_RunWest, - sAnim_RunEast, + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, + [ANIM_STD_GO_NORTH] = sAnim_GoNorth, + [ANIM_STD_GO_WEST] = sAnim_GoWest, + [ANIM_STD_GO_EAST] = sAnim_GoEast, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, + [ANIM_RUN_SOUTH] = sAnim_RunSouth, + [ANIM_RUN_NORTH] = sAnim_RunNorth, + [ANIM_RUN_WEST] = sAnim_RunWest, + [ANIM_RUN_EAST] = sAnim_RunEast, }; static const union AnimCmd *const sAnimTable_AcroBike[] = { - sAnim_FaceSouth, - sAnim_FaceNorth, - sAnim_FaceWest, - sAnim_FaceEast, - sAnim_GoSouth, - sAnim_GoNorth, - sAnim_GoWest, - sAnim_GoEast, - sAnim_GoFastSouth, - sAnim_GoFastNorth, - sAnim_GoFastWest, - sAnim_GoFastEast, - sAnim_GoFasterSouth, - sAnim_GoFasterNorth, - sAnim_GoFasterWest, - sAnim_GoFasterEast, - sAnim_GoFastestSouth, - sAnim_GoFastestNorth, - sAnim_GoFastestWest, - sAnim_GoFastestEast, - sAnim_BunnyHoppyBackWheelSouth, - sAnim_BunnyHoppyBackWheelNorth, - sAnim_BunnyHoppyBackWheelWest, - sAnim_BunnyHoppyBackWheelEast, - sAnim_BunnyHoppyFrontWheelSouth, - sAnim_BunnyHoppyFrontWheelNorth, - sAnim_BunnyHoppyFrontWheelWest, - sAnim_BunnyHoppyFrontWheelEast, - sAnim_StandingWheelieBackWheelSouth, - sAnim_StandingWheelieBackWheelNorth, - sAnim_StandingWheelieBackWheelWest, - sAnim_StandingWheelieBackWheelEast, - sAnim_StandingWheelieFrontWheelSouth, - sAnim_StandingWheelieFrontWheelNorth, - sAnim_StandingWheelieFrontWheelWest, - sAnim_StandingWheelieFrontWheelEast, - sAnim_MovingWheelieSouth, - sAnim_MovingWheelieNorth, - sAnim_MovingWheelieWest, - sAnim_MovingWheelieEast, + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, + [ANIM_STD_GO_NORTH] = sAnim_GoNorth, + [ANIM_STD_GO_WEST] = sAnim_GoWest, + [ANIM_STD_GO_EAST] = sAnim_GoEast, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, + [ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH] = sAnim_BunnyHoppyBackWheelSouth, + [ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH] = sAnim_BunnyHoppyBackWheelNorth, + [ANIM_BUNNY_HOPPY_BACK_WHEEL_WEST] = sAnim_BunnyHoppyBackWheelWest, + [ANIM_BUNNY_HOPPY_BACK_WHEEL_EAST] = sAnim_BunnyHoppyBackWheelEast, + [ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH] = sAnim_BunnyHoppyFrontWheelSouth, + [ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH] = sAnim_BunnyHoppyFrontWheelNorth, + [ANIM_BUNNY_HOPPY_FRONT_WHEEL_WEST] = sAnim_BunnyHoppyFrontWheelWest, + [ANIM_BUNNY_HOPPY_FRONT_WHEEL_EAST] = sAnim_BunnyHoppyFrontWheelEast, + [ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH] = sAnim_StandingWheelieBackWheelSouth, + [ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH] = sAnim_StandingWheelieBackWheelNorth, + [ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST] = sAnim_StandingWheelieBackWheelWest, + [ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST] = sAnim_StandingWheelieBackWheelEast, + [ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH] = sAnim_StandingWheelieFrontWheelSouth, + [ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH] = sAnim_StandingWheelieFrontWheelNorth, + [ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST] = sAnim_StandingWheelieFrontWheelWest, + [ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST] = sAnim_StandingWheelieFrontWheelEast, + [ANIM_MOVING_WHEELIE_SOUTH] = sAnim_MovingWheelieSouth, + [ANIM_MOVING_WHEELIE_NORTH] = sAnim_MovingWheelieNorth, + [ANIM_MOVING_WHEELIE_WEST] = sAnim_MovingWheelieWest, + [ANIM_MOVING_WHEELIE_EAST] = sAnim_MovingWheelieEast, }; static const union AnimCmd *const sAnimTable_Surfing[] = { - sAnim_FaceSouth, - sAnim_FaceNorth, - sAnim_FaceWest, - sAnim_FaceEast, - sAnim_GoSouth, - sAnim_GoNorth, - sAnim_GoWest, - sAnim_GoEast, - sAnim_GoFastSouth, - sAnim_GoFastNorth, - sAnim_GoFastWest, - sAnim_GoFastEast, - sAnim_GoFasterSouth, - sAnim_GoFasterNorth, - sAnim_GoFasterWest, - sAnim_GoFasterEast, - sAnim_GoFastestSouth, - sAnim_GoFastestNorth, - sAnim_GoFastestWest, - sAnim_GoFastestEast, - sAnim_GetOnOffSurfBlobSouth, - sAnim_GetOnOffSurfBlobNorth, - sAnim_GetOnOffSurfBlobWest, - sAnim_GetOnOffSurfBlobEast, + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, + [ANIM_STD_GO_NORTH] = sAnim_GoNorth, + [ANIM_STD_GO_WEST] = sAnim_GoWest, + [ANIM_STD_GO_EAST] = sAnim_GoEast, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, + [ANIM_GET_ON_OFF_POKEMON_SOUTH] = sAnim_GetOnOffSurfBlobSouth, + [ANIM_GET_ON_OFF_POKEMON_NORTH] = sAnim_GetOnOffSurfBlobNorth, + [ANIM_GET_ON_OFF_POKEMON_WEST] = sAnim_GetOnOffSurfBlobWest, + [ANIM_GET_ON_OFF_POKEMON_EAST] = sAnim_GetOnOffSurfBlobEast, }; static const union AnimCmd *const sAnimTable_Nurse[] = { - sAnim_FaceSouth, - sAnim_FaceNorth, - sAnim_FaceWest, - sAnim_FaceEast, - sAnim_GoSouth, - sAnim_GoNorth, - sAnim_GoWest, - sAnim_GoEast, - sAnim_GoFastSouth, - sAnim_GoFastNorth, - sAnim_GoFastWest, - sAnim_GoFastEast, - sAnim_GoFasterSouth, - sAnim_GoFasterNorth, - sAnim_GoFasterWest, - sAnim_GoFasterEast, - sAnim_GoFastestSouth, - sAnim_GoFastestNorth, - sAnim_GoFastestWest, - sAnim_GoFastestEast, - sAnim_NurseBow, + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, + [ANIM_STD_GO_NORTH] = sAnim_GoNorth, + [ANIM_STD_GO_WEST] = sAnim_GoWest, + [ANIM_STD_GO_EAST] = sAnim_GoEast, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, + [ANIM_NURSE_BOW] = sAnim_NurseBow, }; static const union AnimCmd *const sAnimTable_FieldMove[] = { - sAnim_FieldMove, + [ANIM_FIELD_MOVE] = sAnim_FieldMove, }; static const union AnimCmd *const sAnimTable_BerryTree[] = { - sAnim_BerryTreeStage0, - sAnim_BerryTreeStage1, - sAnim_BerryTreeStage2, - sAnim_BerryTreeStage3, - sAnim_BerryTreeStage4, + [BERRY_STAGE_PLANTED - 1] = sAnim_BerryTreeStage0, + [BERRY_STAGE_SPROUTED - 1] = sAnim_BerryTreeStage1, + [BERRY_STAGE_TALLER - 1] = sAnim_BerryTreeStage2, + [BERRY_STAGE_FLOWERING - 1] = sAnim_BerryTreeStage3, + [BERRY_STAGE_BERRIES - 1] = sAnim_BerryTreeStage4, }; static const union AnimCmd *const sAnimTable_BreakableRock[] = { - sAnim_StayStill, - sAnim_RockBreak, + [ANIM_STAY_STILL] = sAnim_StayStill, + [ANIM_REMOVE_OBSTACLE] = sAnim_RockBreak, }; static const union AnimCmd *const sAnimTable_CuttableTree[] = { - sAnim_StayStill, - sAnim_TreeCut, + [ANIM_STAY_STILL] = sAnim_StayStill, + [ANIM_REMOVE_OBSTACLE] = sAnim_TreeCut, }; static const union AnimCmd *const sAnimTable_Fishing[] = { - sAnim_TakeOutRodSouth, - sAnim_TakeOutRodNorth, - sAnim_TakeOutRodWest, - sAnim_TakeOutRodEast, - sAnim_PutAwayRodSouth, - sAnim_PutAwayRodNorth, - sAnim_PutAwayRodWest, - sAnim_PutAwayRodEast, - sAnim_HookedPokemonSouth, - sAnim_HookedPokemonNorth, - sAnim_HookedPokemonWest, - sAnim_HookedPokemonEast, + [ANIM_TAKE_OUT_ROD_SOUTH] = sAnim_TakeOutRodSouth, + [ANIM_TAKE_OUT_ROD_NORTH] = sAnim_TakeOutRodNorth, + [ANIM_TAKE_OUT_ROD_WEST] = sAnim_TakeOutRodWest, + [ANIM_TAKE_OUT_ROD_EAST] = sAnim_TakeOutRodEast, + [ANIM_PUT_AWAY_ROD_SOUTH] = sAnim_PutAwayRodSouth, + [ANIM_PUT_AWAY_ROD_NORTH] = sAnim_PutAwayRodNorth, + [ANIM_PUT_AWAY_ROD_WEST] = sAnim_PutAwayRodWest, + [ANIM_PUT_AWAY_ROD_EAST] = sAnim_PutAwayRodEast, + [ANIM_HOOKED_POKEMON_SOUTH] = sAnim_HookedPokemonSouth, + [ANIM_HOOKED_POKEMON_NORTH] = sAnim_HookedPokemonNorth, + [ANIM_HOOKED_POKEMON_WEST] = sAnim_HookedPokemonWest, + [ANIM_HOOKED_POKEMON_EAST] = sAnim_HookedPokemonEast, }; static const union AffineAnimCmd *const sAffineAnimTable_KyogreGroudon[] = { diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c index 9f265143c..9a93707d8 100755 --- a/src/ereader_helpers.c +++ b/src/ereader_helpers.c @@ -16,31 +16,6 @@ #include "constants/items.h" #include "constants/trainer_hill.h" -enum { - EREADER_XFR_STATE_INIT = 0, - EREADER_XFR_STATE_HANDSHAKE, - EREADER_XFR_STATE_START, - EREADER_XFR_STATE_TRANSFER, - EREADER_XFR_STATE_TRANSFER_DONE, - EREADER_XFR_STATE_CHECKSUM, - EREADER_XFR_STATE_DONE -}; - -#define EREADER_XFER_EXE 1 -#define EREADER_XFER_CHK 2 -#define EREADER_XFER_SHIFT 0 -#define EREADER_XFER_MASK 3 - -#define EREADER_CANCEL_TIMEOUT 1 -#define EREADER_CANCEL_KEY 2 -#define EREADER_CANCEL_MASK 0xC -#define EREADER_CANCEL_SHIFT 2 - -#define EREADER_CHECKSUM_OK 1 -#define EREADER_CHECKSUM_ERR 2 -#define EREADER_CHECKSUM_MASK 0x30 -#define EREADER_CHECKSUM_SHIFT 4 - struct SendRecvMgr { bool8 isParent; @@ -562,17 +537,17 @@ int EReader_Send(int size, const void * src) sendStatus = EReaderHandleTransfer(1, size, src, NULL); sSendRecvStatus = sendStatus; - if ((sSendRecvStatus & 0x13) == 0x10) + if ((sSendRecvStatus & EREADER_XFER_MASK) == 0 && sSendRecvStatus & EREADER_CHECKSUM_OK_MASK) { result = 0; break; } - else if (sSendRecvStatus & 0x8) + else if (sSendRecvStatus & EREADER_CANCEL_KEY_MASK) { result = 1; break; } - else if (sSendRecvStatus & 0x4) + else if (sSendRecvStatus & EREADER_CANCEL_TIMEOUT_MASK) { result = 2; break; @@ -603,17 +578,17 @@ int EReader_Recv(void * dest) recvStatus = EReaderHandleTransfer(0, 0, NULL, dest); sSendRecvStatus = recvStatus; - if ((sSendRecvStatus & 0x13) == 0x10) + if ((sSendRecvStatus & EREADER_XFER_MASK) == 0 && sSendRecvStatus & EREADER_CHECKSUM_OK_MASK) { result = 0; break; } - else if (sSendRecvStatus & 0x8) + else if (sSendRecvStatus & EREADER_CANCEL_KEY_MASK) { result = 1; break; } - else if (sSendRecvStatus & 0x4) + else if (sSendRecvStatus & EREADER_CANCEL_TIMEOUT_MASK) { result = 2; break; diff --git a/src/ereader_screen.c b/src/ereader_screen.c index 73a1b870e..f98a0247d 100755 --- a/src/ereader_screen.c +++ b/src/ereader_screen.c @@ -13,37 +13,38 @@ #include "util.h" #include "constants/songs.h" +// Equivalent to MysteryGiftTaskData struct EReaderTaskData { - u16 unk0; - u16 unk2; - u16 unk4; - u16 unk6; - u8 unk8; - u8 unk9; - u8 unkA; - u8 unkB; - u8 unkC; - u8 unkD; - u8 unkE; - u8 *unk10; + u16 timer; + u16 unused1; + u16 unused2; + u16 unused3; + u8 state; + u8 textState; + u8 unused4; + u8 unused5; + u8 unused6; + u8 unused7; + u8 status; + u8 *unusedBuffer; }; -struct Unk03006370 +struct EReaderData { - u16 unk0; - u32 unk4; - u32 *unk8; + u16 status; + u32 size; + u32 *data; }; static void Task_EReader(u8); -struct Unk03006370 gUnknown_03006370; +struct EReaderData gEReaderData; -extern const u8 gUnknown_089A3470[]; -extern const u8 gMultiBootProgram_BerryGlitchFix_Start[]; +extern const u8 gEReaderLinkData_Start[]; +extern const u8 gEReaderLinkData_End[]; -static void sub_81D4D50(struct Unk03006370 *arg0, int arg1, u32 *arg2) +static void EReader_Load(struct EReaderData *eReader, int size, u32 *data) { volatile u16 backupIME = REG_IME; REG_IME = 0; @@ -53,12 +54,12 @@ static void sub_81D4D50(struct Unk03006370 *arg0, int arg1, u32 *arg2) EReaderHelper_ClearSendRecvMgr(); REG_IE |= INTR_FLAG_VCOUNT; REG_IME = backupIME; - arg0->unk0 = 0; - arg0->unk4 = arg1; - arg0->unk8 = arg2; + eReader->status = 0; + eReader->size = size; + eReader->data = data; } -static void sub_81D4DB8(struct Unk03006370 *arg0) +static void EReader_Reset(struct EReaderData *eReader) { volatile u16 backupIME = REG_IME; REG_IME = 0; @@ -68,21 +69,30 @@ static void sub_81D4DB8(struct Unk03006370 *arg0) REG_IME = backupIME; } -static u8 sub_81D4DE8(struct Unk03006370 *arg0) +// Return values for EReader_Transfer +enum { + TRANSFER_ACTIVE, + TRANSFER_SUCCESS, + TRANSFER_CANCELED, + TRANSFER_TIMEOUT, +}; + +static u8 EReader_Transfer(struct EReaderData *eReader) { - u8 var0 = 0; - arg0->unk0 = EReaderHandleTransfer(1, arg0->unk4, arg0->unk8, NULL); - if ((arg0->unk0 & 0x13) == 0x10) - var0 = 1; + u8 transferStatus = TRANSFER_ACTIVE; + eReader->status = EReaderHandleTransfer(TRUE, eReader->size, eReader->data, NULL); - if (arg0->unk0 & 0x8) - var0 = 2; + if ((eReader->status & EREADER_XFER_MASK) == 0 && eReader->status & EREADER_CHECKSUM_OK_MASK) + transferStatus = TRANSFER_SUCCESS; - if (arg0->unk0 & 0x4) - var0 = 3; + if (eReader->status & EREADER_CANCEL_KEY_MASK) + transferStatus = TRANSFER_CANCELED; + + if (eReader->status & EREADER_CANCEL_TIMEOUT_MASK) + transferStatus = TRANSFER_TIMEOUT; gShouldAdvanceLinkState = 0; - return var0; + return transferStatus; } static void OpenEReaderLink(void) @@ -93,17 +103,20 @@ static void OpenEReaderLink(void) SetSuppressLinkErrorMessage(TRUE); } -static bool32 sub_81D4E60(void) +static bool32 ValidateEReaderConnection(void) { volatile u16 backupIME; - u16 sp4[4]; + u16 handshakes[MAX_LINK_PLAYERS]; backupIME = REG_IME; REG_IME = 0; - *(u64 *)sp4 = *(u64 *)gLink.tempRecvBuffer; + *(u64 *)handshakes = *(u64 *)gLink.handshakeBuffer; REG_IME = backupIME; - if (sp4[0] == 0xB9A0 && sp4[1] == 0xCCD0 - && sp4[2] == 0xFFFF && sp4[3] == 0xFFFF) + + // Validate that we are player 1, the EReader is player 2, + // and that players 3 and 4 are empty. + if (handshakes[0] == SLAVE_HANDSHAKE && handshakes[1] == EREADER_HANDSHAKE + && handshakes[2] == 0xFFFF && handshakes[3] == 0xFFFF) { return TRUE; } @@ -111,7 +124,7 @@ static bool32 sub_81D4E60(void) return FALSE; } -static bool32 sub_81D4EC0(void) +static bool32 IsChildConnected(void) { if (IsLinkMaster() && GetLinkPlayerCount_2() == 2) return TRUE; @@ -119,56 +132,77 @@ static bool32 sub_81D4EC0(void) return FALSE; } -static u32 sub_81D4EE4(u8 *arg0, u16 *arg1) -{ - u8 var0; +// States for TryReceiveCard +enum { + RECV_STATE_INIT, + RECV_STATE_WAIT_START, + RECV_STATE_START, + RECV_STATE_EXCHANGE, + RECV_STATE_START_DISCONNECT, + RECV_STATE_WAIT_DISCONNECT, +}; + +// Return values for TryReceiveCard +enum { + RECV_ACTIVE, + RECV_CANCELED, + RECV_SUCCESS, + RECV_ERROR, + RECV_DISCONNECTED, + RECV_TIMEOUT, +}; - var0 = *arg0 - 3; - if (var0 < 3 && HasLinkErrorOccurred()) +static u32 TryReceiveCard(u8 *state, u16 *timer) +{ + if (*state >= RECV_STATE_EXCHANGE + && *state <= RECV_STATE_WAIT_DISCONNECT + && HasLinkErrorOccurred()) { - *arg0 = 0; - return 3; + // Return error status if an error occurs + // during the link exchange. + *state = 0; + return RECV_ERROR; } - switch (*arg0) + switch (*state) { - case 0: + case RECV_STATE_INIT: if (IsLinkMaster() && GetLinkPlayerCount_2() > 1) { - *arg0 = 1; + *state = RECV_STATE_WAIT_START; } else if (JOY_NEW(B_BUTTON)) { - *arg0 = 0; - return 1; + *state = 0; + return RECV_CANCELED; } break; - case 1: - if (++(*arg1) > 5) + case RECV_STATE_WAIT_START: + if (++(*timer) > 5) { - *arg1 = 0; - *arg0 = 2; + *timer = 0; + *state = RECV_STATE_START; } break; - case 2: + case RECV_STATE_START: if (GetLinkPlayerCount_2() == 2) { PlaySE(SE_DING_DONG); CheckShouldAdvanceLinkState(); - *arg1 = 0; - *arg0 = 3; + *timer = 0; + *state = RECV_STATE_EXCHANGE; } else if (JOY_NEW(B_BUTTON)) { - *arg0 = 0; - return 1; + *state = 0; + return RECV_CANCELED; } break; - case 3: - if (++(*arg1) > 30) + case RECV_STATE_EXCHANGE: + if (++(*timer) > 30) { - *arg0 = 0; - return 5; + *state = 0; + return RECV_TIMEOUT; } if (IsLinkConnectionEstablished()) @@ -177,36 +211,36 @@ static u32 sub_81D4EE4(u8 *arg0, u16 *arg1) { if (IsLinkPlayerDataExchangeComplete()) { - *arg0 = 0; - return 2; + *state = 0; + return RECV_SUCCESS; } else { - *arg0 = 4; + *state = RECV_STATE_START_DISCONNECT; } } else { - *arg0 = 3; + *state = RECV_STATE_EXCHANGE; } } break; - case 4: + case RECV_STATE_START_DISCONNECT: SetCloseLinkCallbackAndType(0); - *arg0 = 5; + *state = RECV_STATE_WAIT_DISCONNECT; break; - case 5: + case RECV_STATE_WAIT_DISCONNECT: if (!gReceivedRemoteLinkPlayers) { - *arg0 = 0; - return 4; + *state = 0; + return RECV_DISCONNECTED; } break; default: - return 0; + return RECV_ACTIVE; } - return 0; + return RECV_ACTIVE; } void CreateEReaderTask(void) @@ -214,248 +248,283 @@ void CreateEReaderTask(void) struct EReaderTaskData *data; u8 taskId = CreateTask(Task_EReader, 0); data = (struct EReaderTaskData *)gTasks[taskId].data; - data->unk8 = 0; - data->unk9 = 0; - data->unkA = 0; - data->unkB = 0; - data->unkC = 0; - data->unkD = 0; - data->unk0 = 0; - data->unk2 = 0; - data->unk4 = 0; - data->unk6 = 0; - data->unkE = 0; - data->unk10 = AllocZeroed(0x40); + data->state = 0; + data->textState = 0; + data->unused4 = 0; + data->unused5 = 0; + data->unused6 = 0; + data->unused7 = 0; + data->timer = 0; + data->unused1 = 0; + data->unused2 = 0; + data->unused3 = 0; + data->status = 0; + data->unusedBuffer = AllocZeroed(0x40); } -static void sub_81D505C(u16 *arg0) +static void ResetTimer(u16 *timer) { - *arg0 = 0; + *timer = 0; } -static bool32 sub_81D5064(u16 *arg0, u16 arg1) +static bool32 UpdateTimer(u16 *timer, u16 time) { - if (++(*arg0) > arg1) + if (++(*timer) > time) { - *arg0 = 0; + // Timer has finished + *timer = 0; return TRUE; } return FALSE; } +// States for Task_EReader +enum { + ER_STATE_START, + ER_STATE_INIT_LINK, + ER_STATE_INIT_LINK_WAIT, + ER_STATE_INIT_LINK_CHECK, + ER_STATE_MSG_SELECT_CONNECT, + ER_STATE_MSG_SELECT_CONNECT_WAIT, + ER_STATE_TRY_LINK, + ER_STATE_INCORRECT_LINK, + ER_STATE_CONNECTING, + ER_STATE_TRANSFER, + ER_STATE_TRANSFER_END, + ER_STATE_TRANSFER_SUCCESS, + ER_STATE_LOAD_CARD_START, + ER_STATE_LOAD_CARD, + ER_STATE_WAIT_RECV_CARD, + ER_STATE_VALIDATE_CARD, + ER_STATE_WAIT_DISCONNECT, + ER_STATE_SAVE, + ER_STATE_SUCCESS_MSG, + ER_STATE_SUCCESS_END, + ER_STATE_LINK_ERROR, + ER_STATE_LINK_ERROR_TRY_AGAIN, + ER_STATE_SAVE_FAILED, + ER_STATE_CANCELED_CARD_READ, + ER_STATE_UNUSED_1, + ER_STATE_UNUSED_2, + ER_STATE_END, +}; + static void Task_EReader(u8 taskId) { struct EReaderTaskData *data = (struct EReaderTaskData *)gTasks[taskId].data; - switch (data->unk8) + switch (data->state) { - case 0: - if (PrintMysteryGiftMenuMessage(&data->unk9, gJPText_ReceiveMysteryGiftWithEReader)) - data->unk8 = 1; + case ER_STATE_START: + if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_ReceiveMysteryGiftWithEReader)) + data->state = ER_STATE_INIT_LINK; break; - case 1: + case ER_STATE_INIT_LINK: OpenEReaderLink(); - sub_81D505C(&data->unk0); - data->unk8 = 2; + ResetTimer(&data->timer); + data->state = ER_STATE_INIT_LINK_WAIT; break; - case 2: - if (sub_81D5064(&data->unk0, 10)) - data->unk8 = 3; + case ER_STATE_INIT_LINK_WAIT: + if (UpdateTimer(&data->timer, 10)) + data->state = ER_STATE_INIT_LINK_CHECK; break; - case 3: - if (!sub_81D4EC0()) + case ER_STATE_INIT_LINK_CHECK: + if (!IsChildConnected()) { CloseLink(); - data->unk8 = 4; + data->state = ER_STATE_MSG_SELECT_CONNECT; } else { - data->unk8 = 13; + data->state = ER_STATE_LOAD_CARD; } break; - case 4: - if (PrintMysteryGiftMenuMessage(&data->unk9, gJPText_SelectConnectFromEReaderMenu)) + case ER_STATE_MSG_SELECT_CONNECT: + if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_SelectConnectFromEReaderMenu)) { AddTextPrinterToWindow1(gJPText_SelectConnectWithGBA); - sub_81D505C(&data->unk0); - data->unk8 = 5; + ResetTimer(&data->timer); + data->state = ER_STATE_MSG_SELECT_CONNECT_WAIT; } break; - case 5: - if (sub_81D5064(&data->unk0, 90)) + case ER_STATE_MSG_SELECT_CONNECT_WAIT: + if (UpdateTimer(&data->timer, 90)) { OpenEReaderLink(); - data->unk8 = 6; + data->state = ER_STATE_TRY_LINK; } else if (JOY_NEW(B_BUTTON)) { - sub_81D505C(&data->unk0); + ResetTimer(&data->timer); PlaySE(SE_SELECT); - data->unk8 = 23; + data->state = ER_STATE_CANCELED_CARD_READ; } break; - case 6: + case ER_STATE_TRY_LINK: if (JOY_NEW(B_BUTTON)) { + // Canceled PlaySE(SE_SELECT); CloseLink(); - sub_81D505C(&data->unk0); - data->unk8 = 23; + ResetTimer(&data->timer); + data->state = ER_STATE_CANCELED_CARD_READ; } else if (GetLinkPlayerCount_2() > 1) { - sub_81D505C(&data->unk0); + ResetTimer(&data->timer); CloseLink(); - data->unk8 = 7; + data->state = ER_STATE_INCORRECT_LINK; } - else if (sub_81D4E60()) + else if (ValidateEReaderConnection()) { + // Successful connection PlaySE(SE_SELECT); CloseLink(); - sub_81D505C(&data->unk0); - data->unk8 = 8; + ResetTimer(&data->timer); + data->state = ER_STATE_CONNECTING; } - else if (sub_81D5064(&data->unk0, 10)) + else if (UpdateTimer(&data->timer, 10)) { + // Retry connection CloseLink(); OpenEReaderLink(); - sub_81D505C(&data->unk0); + ResetTimer(&data->timer); } break; - case 7: - if (PrintMysteryGiftMenuMessage(&data->unk9, gJPText_LinkIsIncorrect)) - data->unk8 = 4; + case ER_STATE_INCORRECT_LINK: + if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_LinkIsIncorrect)) + data->state = ER_STATE_MSG_SELECT_CONNECT; break; - case 8: + case ER_STATE_CONNECTING: AddTextPrinterToWindow1(gJPText_Connecting); - // XXX: This (u32*) cast is discarding the const qualifier from gUnknown_089A3470 - sub_81D4D50(&gUnknown_03006370, gMultiBootProgram_BerryGlitchFix_Start - gUnknown_089A3470, (u32*)gUnknown_089A3470); - data->unk8 = 9; + // XXX: This (u32*) cast is discarding the const qualifier from gEReaderLinkData_Start + EReader_Load(&gEReaderData, gEReaderLinkData_End - gEReaderLinkData_Start, (u32*)gEReaderLinkData_Start); + data->state = ER_STATE_TRANSFER; break; - case 9: - data->unkE = sub_81D4DE8(&gUnknown_03006370); - if (data->unkE) - data->unk8 = 10; + case ER_STATE_TRANSFER: + data->status = EReader_Transfer(&gEReaderData); + if (data->status != TRANSFER_ACTIVE) + data->state = ER_STATE_TRANSFER_END; break; - case 10: - sub_81D4DB8(&gUnknown_03006370); - if (data->unkE == 3) + case ER_STATE_TRANSFER_END: + EReader_Reset(&gEReaderData); + if (data->status == TRANSFER_TIMEOUT) { - data->unk8 = 20; + data->state = ER_STATE_LINK_ERROR; } - else if (data->unkE == 1) + else if (data->status == TRANSFER_SUCCESS) { - sub_81D505C(&data->unk0); + ResetTimer(&data->timer); AddTextPrinterToWindow1(gJPText_PleaseWaitAMoment); - data->unk8 = 11; + data->state = ER_STATE_TRANSFER_SUCCESS; } - else + else // TRANSFER_CANCELED { - data->unk8 = 0; + data->state = ER_STATE_START; } break; - case 11: - if (sub_81D5064(&data->unk0, 840)) - data->unk8 = 12; + case ER_STATE_TRANSFER_SUCCESS: + if (UpdateTimer(&data->timer, 840)) + data->state = ER_STATE_LOAD_CARD_START; break; - case 12: + case ER_STATE_LOAD_CARD_START: OpenEReaderLink(); AddTextPrinterToWindow1(gJPText_AllowEReaderToLoadCard); - data->unk8 = 13; + data->state = ER_STATE_LOAD_CARD; break; - case 13: - switch (sub_81D4EE4(&data->unk9, &data->unk0)) + case ER_STATE_LOAD_CARD: + switch (TryReceiveCard(&data->textState, &data->timer)) { - case 0: - break; - case 2: - AddTextPrinterToWindow1(gJPText_Connecting); - data->unk8 = 14; - break; - case 1: - PlaySE(SE_SELECT); - CloseLink(); - data->unk8 = 23; - break; - case 5: - CloseLink(); - data->unk8 = 21; - break; - case 3: - case 4: - CloseLink(); - data->unk8 = 20; - break; + case RECV_ACTIVE: + break; + case RECV_SUCCESS: + AddTextPrinterToWindow1(gJPText_Connecting); + data->state = ER_STATE_WAIT_RECV_CARD; + break; + case RECV_CANCELED: + PlaySE(SE_SELECT); + CloseLink(); + data->state = ER_STATE_CANCELED_CARD_READ; + break; + case RECV_TIMEOUT: + CloseLink(); + data->state = ER_STATE_LINK_ERROR_TRY_AGAIN; + break; + case RECV_ERROR: + case RECV_DISCONNECTED: + CloseLink(); + data->state = ER_STATE_LINK_ERROR; + break; } break; - case 14: + case ER_STATE_WAIT_RECV_CARD: if (HasLinkErrorOccurred()) { CloseLink(); - data->unk8 = 20; + data->state = ER_STATE_LINK_ERROR; } else if (GetBlockReceivedStatus()) { ResetBlockReceivedFlags(); - data->unk8 = 15; + data->state = ER_STATE_VALIDATE_CARD; } break; - case 15: - data->unkE = ValidateTrainerHillData((struct EReaderTrainerHillSet *)gDecompressionBuffer); - SetCloseLinkCallbackAndType(data->unkE); - data->unk8 = 16; + case ER_STATE_VALIDATE_CARD: + data->status = ValidateTrainerHillData((struct EReaderTrainerHillSet *)gDecompressionBuffer); + SetCloseLinkCallbackAndType(data->status); + data->state = ER_STATE_WAIT_DISCONNECT; break; - case 16: + case ER_STATE_WAIT_DISCONNECT: if (!gReceivedRemoteLinkPlayers) { - if (data->unkE == 1) - data->unk8 = 17; + if (data->status == TRUE) // Was data valid? + data->state = ER_STATE_SAVE; else - data->unk8 = 20; + data->state = ER_STATE_LINK_ERROR; } break; - case 17: + case ER_STATE_SAVE: if (TryWriteTrainerHill((struct EReaderTrainerHillSet *)&gDecompressionBuffer)) { AddTextPrinterToWindow1(gJPText_ConnectionComplete); - sub_81D505C(&data->unk0); - data->unk8 = 18; + ResetTimer(&data->timer); + data->state = ER_STATE_SUCCESS_MSG; } else { - data->unk8 = 22; + data->state = ER_STATE_SAVE_FAILED; } break; - case 18: - if (sub_81D5064(&data->unk0, 120)) + case ER_STATE_SUCCESS_MSG: + if (UpdateTimer(&data->timer, 120)) { AddTextPrinterToWindow1(gJPText_NewTrainerHasComeToHoenn); PlayFanfare(MUS_OBTAIN_ITEM); - data->unk8 = 19; + data->state = ER_STATE_SUCCESS_END; } break; - case 19: + case ER_STATE_SUCCESS_END: if (IsFanfareTaskInactive() && (JOY_NEW(A_BUTTON | B_BUTTON))) - data->unk8 = 26; + data->state = ER_STATE_END; break; - case 23: - if (PrintMysteryGiftMenuMessage(&data->unk9, gJPText_CardReadingHasBeenHalted)) - data->unk8 = 26; + case ER_STATE_CANCELED_CARD_READ: + if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_CardReadingHasBeenHalted)) + data->state = ER_STATE_END; break; - case 20: - if (PrintMysteryGiftMenuMessage(&data->unk9, gJPText_ConnectionErrorCheckLink)) - data->unk8 = 0; + case ER_STATE_LINK_ERROR: + if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_ConnectionErrorCheckLink)) + data->state = ER_STATE_START; break; - case 21: - if (PrintMysteryGiftMenuMessage(&data->unk9, gJPText_ConnectionErrorTryAgain)) - data->unk8 = 0; + case ER_STATE_LINK_ERROR_TRY_AGAIN: + if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_ConnectionErrorTryAgain)) + data->state = ER_STATE_START; break; - case 22: - if (PrintMysteryGiftMenuMessage(&data->unk9, gJPText_WriteErrorUnableToSaveData)) - data->unk8 = 0; + case ER_STATE_SAVE_FAILED: + if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_WriteErrorUnableToSaveData)) + data->state = ER_STATE_START; break; - case 26: - Free(data->unk10); + case ER_STATE_END: + Free(data->unusedBuffer); DestroyTask(taskId); SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen); break; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 2616b65e8..074fa2386 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -703,169 +703,169 @@ static const s16 sMovementDelaysShort[] = {32, 48, 64, 80}; #include "data/object_events/movement_type_func_tables.h" static const u8 sFaceDirectionAnimNums[] = { - [DIR_NONE] = 0, - [DIR_SOUTH] = 0, - [DIR_NORTH] = 1, - [DIR_WEST] = 2, - [DIR_EAST] = 3, - [DIR_SOUTHWEST] = 0, - [DIR_SOUTHEAST] = 0, - [DIR_NORTHWEST] = 1, - [DIR_NORTHEAST] = 1, + [DIR_NONE] = ANIM_STD_FACE_SOUTH, + [DIR_SOUTH] = ANIM_STD_FACE_SOUTH, + [DIR_NORTH] = ANIM_STD_FACE_NORTH, + [DIR_WEST] = ANIM_STD_FACE_WEST, + [DIR_EAST] = ANIM_STD_FACE_EAST, + [DIR_SOUTHWEST] = ANIM_STD_FACE_SOUTH, + [DIR_SOUTHEAST] = ANIM_STD_FACE_SOUTH, + [DIR_NORTHWEST] = ANIM_STD_FACE_NORTH, + [DIR_NORTHEAST] = ANIM_STD_FACE_NORTH, }; static const u8 sMoveDirectionAnimNums[] = { - [DIR_NONE] = 4, - [DIR_SOUTH] = 4, - [DIR_NORTH] = 5, - [DIR_WEST] = 6, - [DIR_EAST] = 7, - [DIR_SOUTHWEST] = 4, - [DIR_SOUTHEAST] = 4, - [DIR_NORTHWEST] = 5, - [DIR_NORTHEAST] = 5, + [DIR_NONE] = ANIM_STD_GO_SOUTH, + [DIR_SOUTH] = ANIM_STD_GO_SOUTH, + [DIR_NORTH] = ANIM_STD_GO_NORTH, + [DIR_WEST] = ANIM_STD_GO_WEST, + [DIR_EAST] = ANIM_STD_GO_EAST, + [DIR_SOUTHWEST] = ANIM_STD_GO_SOUTH, + [DIR_SOUTHEAST] = ANIM_STD_GO_SOUTH, + [DIR_NORTHWEST] = ANIM_STD_GO_NORTH, + [DIR_NORTHEAST] = ANIM_STD_GO_NORTH, }; static const u8 sMoveDirectionFastAnimNums[] = { - [DIR_NONE] = 8, - [DIR_SOUTH] = 8, - [DIR_NORTH] = 9, - [DIR_WEST] = 10, - [DIR_EAST] = 11, - [DIR_SOUTHWEST] = 8, - [DIR_SOUTHEAST] = 8, - [DIR_NORTHWEST] = 9, - [DIR_NORTHEAST] = 9, + [DIR_NONE] = ANIM_STD_GO_FAST_SOUTH, + [DIR_SOUTH] = ANIM_STD_GO_FAST_SOUTH, + [DIR_NORTH] = ANIM_STD_GO_FAST_NORTH, + [DIR_WEST] = ANIM_STD_GO_FAST_WEST, + [DIR_EAST] = ANIM_STD_GO_FAST_EAST, + [DIR_SOUTHWEST] = ANIM_STD_GO_FAST_SOUTH, + [DIR_SOUTHEAST] = ANIM_STD_GO_FAST_SOUTH, + [DIR_NORTHWEST] = ANIM_STD_GO_FAST_NORTH, + [DIR_NORTHEAST] = ANIM_STD_GO_FAST_NORTH, }; static const u8 sMoveDirectionFasterAnimNums[] = { - [DIR_NONE] = 12, - [DIR_SOUTH] = 12, - [DIR_NORTH] = 13, - [DIR_WEST] = 14, - [DIR_EAST] = 15, - [DIR_SOUTHWEST] = 12, - [DIR_SOUTHEAST] = 12, - [DIR_NORTHWEST] = 13, - [DIR_NORTHEAST] = 13, + [DIR_NONE] = ANIM_STD_GO_FASTER_SOUTH, + [DIR_SOUTH] = ANIM_STD_GO_FASTER_SOUTH, + [DIR_NORTH] = ANIM_STD_GO_FASTER_NORTH, + [DIR_WEST] = ANIM_STD_GO_FASTER_WEST, + [DIR_EAST] = ANIM_STD_GO_FASTER_EAST, + [DIR_SOUTHWEST] = ANIM_STD_GO_FASTER_SOUTH, + [DIR_SOUTHEAST] = ANIM_STD_GO_FASTER_SOUTH, + [DIR_NORTHWEST] = ANIM_STD_GO_FASTER_NORTH, + [DIR_NORTHEAST] = ANIM_STD_GO_FASTER_NORTH, }; static const u8 sMoveDirectionFastestAnimNums[] = { - [DIR_NONE] = 16, - [DIR_SOUTH] = 16, - [DIR_NORTH] = 17, - [DIR_WEST] = 18, - [DIR_EAST] = 19, - [DIR_SOUTHWEST] = 16, - [DIR_SOUTHEAST] = 16, - [DIR_NORTHWEST] = 17, - [DIR_NORTHEAST] = 17, + [DIR_NONE] = ANIM_STD_GO_FASTEST_SOUTH, + [DIR_SOUTH] = ANIM_STD_GO_FASTEST_SOUTH, + [DIR_NORTH] = ANIM_STD_GO_FASTEST_NORTH, + [DIR_WEST] = ANIM_STD_GO_FASTEST_WEST, + [DIR_EAST] = ANIM_STD_GO_FASTEST_EAST, + [DIR_SOUTHWEST] = ANIM_STD_GO_FASTEST_SOUTH, + [DIR_SOUTHEAST] = ANIM_STD_GO_FASTEST_SOUTH, + [DIR_NORTHWEST] = ANIM_STD_GO_FASTEST_NORTH, + [DIR_NORTHEAST] = ANIM_STD_GO_FASTEST_NORTH, }; static const u8 sJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon - [DIR_NONE] = 20, - [DIR_SOUTH] = 20, - [DIR_NORTH] = 21, - [DIR_WEST] = 22, - [DIR_EAST] = 23, - [DIR_SOUTHWEST] = 20, - [DIR_SOUTHEAST] = 20, - [DIR_NORTHWEST] = 21, - [DIR_NORTHEAST] = 21, + [DIR_NONE] = ANIM_GET_ON_OFF_POKEMON_SOUTH, + [DIR_SOUTH] = ANIM_GET_ON_OFF_POKEMON_SOUTH, + [DIR_NORTH] = ANIM_GET_ON_OFF_POKEMON_NORTH, + [DIR_WEST] = ANIM_GET_ON_OFF_POKEMON_WEST, + [DIR_EAST] = ANIM_GET_ON_OFF_POKEMON_EAST, + [DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, + [DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, + [DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_NORTH, + [DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_NORTH, }; static const u8 sAcroWheelieDirectionAnimNums[] = { - [DIR_NONE] = 20, - [DIR_SOUTH] = 20, - [DIR_NORTH] = 21, - [DIR_WEST] = 22, - [DIR_EAST] = 23, - [DIR_SOUTHWEST] = 20, - [DIR_SOUTHEAST] = 20, - [DIR_NORTHWEST] = 21, - [DIR_NORTHEAST] = 21, + [DIR_NONE] = ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH, + [DIR_SOUTH] = ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH, + [DIR_NORTH] = ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH, + [DIR_WEST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_WEST, + [DIR_EAST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_EAST, + [DIR_SOUTHWEST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH, + [DIR_SOUTHEAST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_SOUTH, + [DIR_NORTHWEST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH, + [DIR_NORTHEAST] = ANIM_BUNNY_HOPPY_BACK_WHEEL_NORTH, }; static const u8 sAcroUnusedDirectionAnimNums[] = { - [DIR_NONE] = 24, - [DIR_SOUTH] = 24, - [DIR_NORTH] = 25, - [DIR_WEST] = 26, - [DIR_EAST] = 27, - [DIR_SOUTHWEST] = 24, - [DIR_SOUTHEAST] = 24, - [DIR_NORTHWEST] = 25, - [DIR_NORTHEAST] = 25, + [DIR_NONE] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH, + [DIR_SOUTH] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH, + [DIR_NORTH] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH, + [DIR_WEST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_WEST, + [DIR_EAST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_EAST, + [DIR_SOUTHWEST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH, + [DIR_SOUTHEAST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_SOUTH, + [DIR_NORTHWEST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH, + [DIR_NORTHEAST] = ANIM_BUNNY_HOPPY_FRONT_WHEEL_NORTH, }; static const u8 sAcroEndWheelieDirectionAnimNums[] = { - [DIR_NONE] = 28, - [DIR_SOUTH] = 28, - [DIR_NORTH] = 29, - [DIR_WEST] = 30, - [DIR_EAST] = 31, - [DIR_SOUTHWEST] = 28, - [DIR_SOUTHEAST] = 28, - [DIR_NORTHWEST] = 29, - [DIR_NORTHEAST] = 29, + [DIR_NONE] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, + [DIR_SOUTH] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, + [DIR_NORTH] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, + [DIR_WEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST, + [DIR_EAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST, + [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, + [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, + [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, + [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, }; static const u8 sAcroUnusedActionDirectionAnimNums[] = { - [DIR_NONE] = 32, - [DIR_SOUTH] = 32, - [DIR_NORTH] = 33, - [DIR_WEST] = 34, - [DIR_EAST] = 35, - [DIR_SOUTHWEST] = 32, - [DIR_SOUTHEAST] = 32, - [DIR_NORTHWEST] = 33, - [DIR_NORTHEAST] = 33, + [DIR_NONE] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, + [DIR_SOUTH] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, + [DIR_NORTH] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH, + [DIR_WEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST, + [DIR_EAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST, + [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, + [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, + [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH, + [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH, }; static const u8 sAcroWheeliePedalDirectionAnimNums[] = { - [DIR_NONE] = 36, - [DIR_SOUTH] = 36, - [DIR_NORTH] = 37, - [DIR_WEST] = 38, - [DIR_EAST] = 39, - [DIR_SOUTHWEST] = 36, - [DIR_SOUTHEAST] = 36, - [DIR_NORTHWEST] = 37, - [DIR_NORTHEAST] = 37, + [DIR_NONE] = ANIM_MOVING_WHEELIE_SOUTH, + [DIR_SOUTH] = ANIM_MOVING_WHEELIE_SOUTH, + [DIR_NORTH] = ANIM_MOVING_WHEELIE_NORTH, + [DIR_WEST] = ANIM_MOVING_WHEELIE_WEST, + [DIR_EAST] = ANIM_MOVING_WHEELIE_EAST, + [DIR_SOUTHWEST] = ANIM_MOVING_WHEELIE_SOUTH, + [DIR_SOUTHEAST] = ANIM_MOVING_WHEELIE_SOUTH, + [DIR_NORTHWEST] = ANIM_MOVING_WHEELIE_NORTH, + [DIR_NORTHEAST] = ANIM_MOVING_WHEELIE_NORTH, }; static const u8 sFishingDirectionAnimNums[] = { - [DIR_NONE] = 0, - [DIR_SOUTH] = 0, - [DIR_NORTH] = 1, - [DIR_WEST] = 2, - [DIR_EAST] = 3, - [DIR_SOUTHWEST] = 0, - [DIR_SOUTHEAST] = 0, - [DIR_NORTHWEST] = 1, - [DIR_NORTHEAST] = 1, + [DIR_NONE] = ANIM_TAKE_OUT_ROD_SOUTH, + [DIR_SOUTH] = ANIM_TAKE_OUT_ROD_SOUTH, + [DIR_NORTH] = ANIM_TAKE_OUT_ROD_NORTH, + [DIR_WEST] = ANIM_TAKE_OUT_ROD_WEST, + [DIR_EAST] = ANIM_TAKE_OUT_ROD_EAST, + [DIR_SOUTHWEST] = ANIM_TAKE_OUT_ROD_SOUTH, + [DIR_SOUTHEAST] = ANIM_TAKE_OUT_ROD_SOUTH, + [DIR_NORTHWEST] = ANIM_TAKE_OUT_ROD_NORTH, + [DIR_NORTHEAST] = ANIM_TAKE_OUT_ROD_NORTH, }; static const u8 sFishingNoCatchDirectionAnimNums[] = { - [DIR_NONE] = 4, - [DIR_SOUTH] = 4, - [DIR_NORTH] = 5, - [DIR_WEST] = 6, - [DIR_EAST] = 7, - [DIR_SOUTHWEST] = 4, - [DIR_SOUTHEAST] = 4, - [DIR_NORTHWEST] = 5, - [DIR_NORTHEAST] = 5, + [DIR_NONE] = ANIM_PUT_AWAY_ROD_SOUTH, + [DIR_SOUTH] = ANIM_PUT_AWAY_ROD_SOUTH, + [DIR_NORTH] = ANIM_PUT_AWAY_ROD_NORTH, + [DIR_WEST] = ANIM_PUT_AWAY_ROD_WEST, + [DIR_EAST] = ANIM_PUT_AWAY_ROD_EAST, + [DIR_SOUTHWEST] = ANIM_PUT_AWAY_ROD_SOUTH, + [DIR_SOUTHEAST] = ANIM_PUT_AWAY_ROD_SOUTH, + [DIR_NORTHWEST] = ANIM_PUT_AWAY_ROD_NORTH, + [DIR_NORTHEAST] = ANIM_PUT_AWAY_ROD_NORTH, }; static const u8 sFishingBiteDirectionAnimNums[] = { - [DIR_NONE] = 8, - [DIR_SOUTH] = 8, - [DIR_NORTH] = 9, - [DIR_WEST] = 10, - [DIR_EAST] = 11, - [DIR_SOUTHWEST] = 8, - [DIR_SOUTHEAST] = 8, - [DIR_NORTHWEST] = 9, - [DIR_NORTHEAST] = 9, + [DIR_NONE] = ANIM_HOOKED_POKEMON_SOUTH, + [DIR_SOUTH] = ANIM_HOOKED_POKEMON_SOUTH, + [DIR_NORTH] = ANIM_HOOKED_POKEMON_NORTH, + [DIR_WEST] = ANIM_HOOKED_POKEMON_WEST, + [DIR_EAST] = ANIM_HOOKED_POKEMON_EAST, + [DIR_SOUTHWEST] = ANIM_HOOKED_POKEMON_SOUTH, + [DIR_SOUTHEAST] = ANIM_HOOKED_POKEMON_SOUTH, + [DIR_NORTHWEST] = ANIM_HOOKED_POKEMON_NORTH, + [DIR_NORTHEAST] = ANIM_HOOKED_POKEMON_NORTH, }; static const u8 sRunningDirectionAnimNums[] = { - [DIR_NONE] = 20, - [DIR_SOUTH] = 20, - [DIR_NORTH] = 21, - [DIR_WEST] = 22, - [DIR_EAST] = 23, - [DIR_SOUTHWEST] = 20, - [DIR_SOUTHEAST] = 20, - [DIR_NORTHWEST] = 21, - [DIR_NORTHEAST] = 21, + [DIR_NONE] = ANIM_RUN_SOUTH, + [DIR_SOUTH] = ANIM_RUN_SOUTH, + [DIR_NORTH] = ANIM_RUN_NORTH, + [DIR_WEST] = ANIM_RUN_WEST, + [DIR_EAST] = ANIM_RUN_EAST, + [DIR_SOUTHWEST] = ANIM_RUN_SOUTH, + [DIR_SOUTHEAST] = ANIM_RUN_SOUTH, + [DIR_NORTHWEST] = ANIM_RUN_NORTH, + [DIR_NORTHEAST] = ANIM_RUN_NORTH, }; const u8 gTrainerFacingDirectionMovementTypes[] = { @@ -6492,7 +6492,7 @@ bool8 MovementAction_FaceOriginalDirection_Step0(struct ObjectEvent *objectEvent bool8 MovementAction_NurseJoyBowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, 0x14); + StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, ANIM_NURSE_BOW); return FALSE; } @@ -6591,7 +6591,7 @@ bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_RockSmashBreak_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - SetAndStartSpriteAnim(sprite, 1, 0); + SetAndStartSpriteAnim(sprite, ANIM_REMOVE_OBSTACLE, 0); sprite->sActionFuncId = 1; return FALSE; } @@ -6619,7 +6619,7 @@ bool8 MovementAction_RockSmashBreak_Step2(struct ObjectEvent *objectEvent, struc bool8 MovementAction_CutTree_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - SetAndStartSpriteAnim(sprite, 1, 0); + SetAndStartSpriteAnim(sprite, ANIM_REMOVE_OBSTACLE, 0); sprite->sActionFuncId = 1; return FALSE; } diff --git a/src/field_effect.c b/src/field_effect.c index 247744b87..7e1ebdff4 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -3240,7 +3240,7 @@ static void FlyOutFieldEffect_JumpOnBird(struct Task *task) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_SURFING)); - StartSpriteAnim(&gSprites[objectEvent->spriteId], 0x16); + StartSpriteAnim(&gSprites[objectEvent->spriteId], ANIM_GET_ON_OFF_POKEMON_WEST); objectEvent->inanimate = TRUE; ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT); if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) @@ -3478,7 +3478,7 @@ static void FlyInFieldEffect_BirdSwoopDown(struct Task *task) ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_SURFING)); CameraObjectReset2(); ObjectEventTurn(objectEvent, DIR_WEST); - StartSpriteAnim(&gSprites[objectEvent->spriteId], 0x16); + StartSpriteAnim(&gSprites[objectEvent->spriteId], ANIM_GET_ON_OFF_POKEMON_WEST); objectEvent->invisible = FALSE; task->tBirdSpriteId = CreateFlyBirdSprite(); StartFlyBirdSwoopDown(task->tBirdSpriteId); diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index e770ce35d..6ce304c2c 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1403,7 +1403,7 @@ void SetPlayerInvisibility(bool8 invisible) void SetPlayerAvatarFieldMove(void) { ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_FIELD_MOVE)); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 0); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], ANIM_FIELD_MOVE); } static void SetPlayerAvatarFishing(u8 direction) diff --git a/src/link.c b/src/link.c index 779fba9dd..8ba7610cc 100644 --- a/src/link.c +++ b/src/link.c @@ -2192,30 +2192,26 @@ static bool8 DoHandshake(void) { REG_SIOMLT_SEND = SLAVE_HANDSHAKE; } - *(u64 *)gLink.tempRecvBuffer = REG_SIOMLT_RECV; + *(u64 *)gLink.handshakeBuffer = REG_SIOMLT_RECV; REG_SIOMLT_RECV = 0; gLink.handshakeAsMaster = FALSE; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { - if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE) + if ((gLink.handshakeBuffer[i] & ~0x3) == SLAVE_HANDSHAKE || gLink.handshakeBuffer[i] == MASTER_HANDSHAKE) { playerCount++; - if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0) - { - minRecv = gLink.tempRecvBuffer[i]; - } + if (minRecv > gLink.handshakeBuffer[i] && gLink.handshakeBuffer[i] != 0) + minRecv = gLink.handshakeBuffer[i]; } else { - if (gLink.tempRecvBuffer[i] != 0xFFFF) - { + if (gLink.handshakeBuffer[i] != 0xFFFF) playerCount = 0; - } break; } } gLink.playerCount = playerCount; - if (gLink.playerCount > 1 && gLink.playerCount == sHandshakePlayerCount && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE) + if (gLink.playerCount > 1 && gLink.playerCount == sHandshakePlayerCount && gLink.handshakeBuffer[0] == MASTER_HANDSHAKE) { return TRUE; } diff --git a/src/pokemon.c b/src/pokemon.c index 6e3d37ae3..0f943734b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5775,27 +5775,36 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) return TRAINER_ENCOUNTER_MUSIC(trainerOpponentId); } -u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex) -{ +u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) +{ +// Because this is a u16 it will be unable to store the +// result of the multiplication for any stat > 595 for a +// positive nature and > 728 for a negative nature. +// Neither occur in the base game, but this can happen if +// any Nature-affected base stat is increased to a value +// above 248. The closest by default is Shuckle at 230. +#ifdef BUGFIX + u32 retVal; +#else u16 retVal; +#endif + // Don't modify HP, Accuracy, or Evasion by nature if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS) - { - return n; - } + return stat; switch (gNatureStatTable[nature][statIndex - 1]) { case 1: - retVal = n * 110; + retVal = stat * 110; retVal /= 100; break; case -1: - retVal = n * 90; + retVal = stat * 90; retVal /= 100; break; default: - retVal = n; + retVal = stat; break; } diff --git a/src/strings.c b/src/strings.c index bebe89011..ae39e3d4d 100644 --- a/src/strings.c +++ b/src/strings.c @@ -839,17 +839,17 @@ const u8 gText_B4F[] = _("B4F"); const u8 gText_Rooftop[] = _("ROOFTOP"); const u8 gText_ElevatorNowOn[] = _("Now on:"); const u8 gText_BP[] = _("BP"); -const u8 gText_EnergyPowder50[] = _("ENERGYPOWDER{CLEAR_TO 0x72}{SIZE 0}50"); -const u8 gText_EnergyRoot80[] = _("ENERGY ROOT{CLEAR_TO 0x72}{SIZE 0}80"); -const u8 gText_HealPowder50[] = _("HEAL POWDER{CLEAR_TO 0x72}{SIZE 0}50"); -const u8 gText_RevivalHerb300[] = _("REVIVAL HERB{CLEAR_TO 0x6C}{SIZE 0}300"); -const u8 gText_Protein1000[] = _("PROTEIN{CLEAR_TO 0x63}{SIZE 0}1,000"); -const u8 gText_Iron1000[] = _("IRON{CLEAR_TO 0x63}{SIZE 0}1,000"); -const u8 gText_Carbos1000[] = _("CARBOS{CLEAR_TO 0x63}{SIZE 0}1,000"); -const u8 gText_Calcium1000[] = _("CALCIUM{CLEAR_TO 0x63}{SIZE 0}1,000"); -const u8 gText_Zinc1000[] = _("ZINC{CLEAR_TO 0x63}{SIZE 0}1,000"); -const u8 gText_HPUp1000[] = _("HP UP{CLEAR_TO 0x63}{SIZE 0}1,000"); -const u8 gText_PPUp3000[] = _("PP UP{CLEAR_TO 0x63}{SIZE 0}3,000"); +const u8 gText_EnergyPowder50[] = _("ENERGYPOWDER{CLEAR_TO 0x72}{FONT 0}50"); +const u8 gText_EnergyRoot80[] = _("ENERGY ROOT{CLEAR_TO 0x72}{FONT 0}80"); +const u8 gText_HealPowder50[] = _("HEAL POWDER{CLEAR_TO 0x72}{FONT 0}50"); +const u8 gText_RevivalHerb300[] = _("REVIVAL HERB{CLEAR_TO 0x6C}{FONT 0}300"); +const u8 gText_Protein1000[] = _("PROTEIN{CLEAR_TO 0x63}{FONT 0}1,000"); +const u8 gText_Iron1000[] = _("IRON{CLEAR_TO 0x63}{FONT 0}1,000"); +const u8 gText_Carbos1000[] = _("CARBOS{CLEAR_TO 0x63}{FONT 0}1,000"); +const u8 gText_Calcium1000[] = _("CALCIUM{CLEAR_TO 0x63}{FONT 0}1,000"); +const u8 gText_Zinc1000[] = _("ZINC{CLEAR_TO 0x63}{FONT 0}1,000"); +const u8 gText_HPUp1000[] = _("HP UP{CLEAR_TO 0x63}{FONT 0}1,000"); +const u8 gText_PPUp3000[] = _("PP UP{CLEAR_TO 0x63}{FONT 0}3,000"); const u8 gText_RankingHall[] = _("RANKING HALL"); const u8 gText_ExchangeService[] = _("EXCHANGE SERVICE"); const u8 gText_LilycoveCity[] = _("LILYCOVE CITY"); diff --git a/src/unk_text_util_2.c b/src/unk_text_util_2.c index 3459dde85..a0eea575e 100644 --- a/src/unk_text_util_2.c +++ b/src/unk_text_util_2.c @@ -80,7 +80,7 @@ u16 Font6Func(struct TextPrinter *textPrinter) case EXT_CTRL_CODE_PALETTE: textPrinter->printerTemplate.currentChar++; return 2; - case EXT_CTRL_CODE_SIZE: + case EXT_CTRL_CODE_FONT: subStruct->glyphId = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; return 2; |