Merge branch 'master' of https://github.com/GriffinRichards/pokeemerald into update-macros
This commit is contained in:
commit
b9fa18bdd4
79 files changed
+6531
-6301
No files matched your search
+161
-126
@@ -1,131 +1,166 @@
|
||||
.macro create_movement_action name
|
||||
enum _\name
|
||||
.macro create_movement_action name:req, value:req
|
||||
.macro \name
|
||||
.byte _\name
|
||||
.byte \value
|
||||
.endm
|
||||
.endm
|
||||
|
||||
enum_start
|
||||
create_movement_action face_down
|
||||
create_movement_action face_up
|
||||
create_movement_action face_left
|
||||
create_movement_action face_right
|
||||
create_movement_action walk_slow_down
|
||||
create_movement_action walk_slow_up
|
||||
create_movement_action walk_slow_left
|
||||
create_movement_action walk_slow_right
|
||||
create_movement_action walk_down
|
||||
create_movement_action walk_up
|
||||
create_movement_action walk_left
|
||||
create_movement_action walk_right
|
||||
create_movement_action jump_2_down
|
||||
create_movement_action jump_2_up
|
||||
create_movement_action jump_2_left
|
||||
create_movement_action jump_2_right
|
||||
create_movement_action delay_1
|
||||
create_movement_action delay_2
|
||||
create_movement_action delay_4
|
||||
create_movement_action delay_8
|
||||
create_movement_action delay_16
|
||||
create_movement_action walk_fast_down
|
||||
create_movement_action walk_fast_up
|
||||
create_movement_action walk_fast_left
|
||||
create_movement_action walk_fast_right
|
||||
create_movement_action walk_in_place_slow_down
|
||||
create_movement_action walk_in_place_slow_up
|
||||
create_movement_action walk_in_place_slow_left
|
||||
create_movement_action walk_in_place_slow_right
|
||||
create_movement_action walk_in_place_down
|
||||
create_movement_action walk_in_place_up
|
||||
create_movement_action walk_in_place_left
|
||||
create_movement_action walk_in_place_right
|
||||
create_movement_action walk_in_place_fast_down
|
||||
create_movement_action walk_in_place_fast_up
|
||||
create_movement_action walk_in_place_fast_left
|
||||
create_movement_action walk_in_place_fast_right
|
||||
create_movement_action walk_in_place_faster_down
|
||||
create_movement_action walk_in_place_faster_up
|
||||
create_movement_action walk_in_place_faster_left
|
||||
create_movement_action walk_in_place_faster_right
|
||||
create_movement_action ride_water_current_down
|
||||
create_movement_action ride_water_current_up
|
||||
create_movement_action ride_water_current_left
|
||||
create_movement_action ride_water_current_right
|
||||
create_movement_action walk_faster_down
|
||||
create_movement_action walk_faster_up
|
||||
create_movement_action walk_faster_left
|
||||
create_movement_action walk_faster_right
|
||||
create_movement_action slide_down
|
||||
create_movement_action slide_up
|
||||
create_movement_action slide_left
|
||||
create_movement_action slide_right
|
||||
create_movement_action player_run_down
|
||||
create_movement_action player_run_up
|
||||
create_movement_action player_run_left
|
||||
create_movement_action player_run_right
|
||||
create_movement_action start_anim_in_direction
|
||||
create_movement_action jump_special_down
|
||||
create_movement_action jump_special_up
|
||||
create_movement_action jump_special_left
|
||||
create_movement_action jump_special_right
|
||||
create_movement_action face_player
|
||||
create_movement_action face_away_player
|
||||
create_movement_action lock_facing_direction
|
||||
create_movement_action unlock_facing_direction
|
||||
create_movement_action jump_down
|
||||
create_movement_action jump_up
|
||||
create_movement_action jump_left
|
||||
create_movement_action jump_right
|
||||
create_movement_action jump_in_place_down
|
||||
create_movement_action jump_in_place_up
|
||||
create_movement_action jump_in_place_left
|
||||
create_movement_action jump_in_place_right
|
||||
create_movement_action jump_in_place_down_up
|
||||
create_movement_action jump_in_place_up_down
|
||||
create_movement_action jump_in_place_left_right
|
||||
create_movement_action jump_in_place_right_left
|
||||
create_movement_action face_original_direction
|
||||
create_movement_action nurse_joy_bow
|
||||
create_movement_action enable_jump_landing_ground_effect
|
||||
create_movement_action disable_jump_landing_ground_effect
|
||||
create_movement_action disable_anim
|
||||
create_movement_action restore_anim
|
||||
create_movement_action set_invisible
|
||||
create_movement_action set_visible
|
||||
create_movement_action emote_exclamation_mark
|
||||
create_movement_action emote_question_mark
|
||||
create_movement_action emote_heart
|
||||
create_movement_action reveal_trainer
|
||||
create_movement_action rock_smash_break
|
||||
create_movement_action cut_tree
|
||||
create_movement_action set_fixed_priority
|
||||
create_movement_action clear_fixed_priority
|
||||
create_movement_action init_affine_anim
|
||||
create_movement_action clear_affine_anim
|
||||
create_movement_action hide_reflection
|
||||
create_movement_action show_reflection
|
||||
create_movement_action walk_down_start_affine
|
||||
create_movement_action walk_down_affine
|
||||
create_movement_action face_down, MOVEMENT_ACTION_FACE_DOWN
|
||||
create_movement_action face_up, MOVEMENT_ACTION_FACE_UP
|
||||
create_movement_action face_left, MOVEMENT_ACTION_FACE_LEFT
|
||||
create_movement_action face_right, MOVEMENT_ACTION_FACE_RIGHT
|
||||
create_movement_action walk_slow_down, MOVEMENT_ACTION_WALK_SLOW_DOWN
|
||||
create_movement_action walk_slow_up, MOVEMENT_ACTION_WALK_SLOW_UP
|
||||
create_movement_action walk_slow_left, MOVEMENT_ACTION_WALK_SLOW_LEFT
|
||||
create_movement_action walk_slow_right, MOVEMENT_ACTION_WALK_SLOW_RIGHT
|
||||
create_movement_action walk_down, MOVEMENT_ACTION_WALK_NORMAL_DOWN
|
||||
create_movement_action walk_up, MOVEMENT_ACTION_WALK_NORMAL_UP
|
||||
create_movement_action walk_left, MOVEMENT_ACTION_WALK_NORMAL_LEFT
|
||||
create_movement_action walk_right, MOVEMENT_ACTION_WALK_NORMAL_RIGHT
|
||||
create_movement_action jump_2_down, MOVEMENT_ACTION_JUMP_2_DOWN
|
||||
create_movement_action jump_2_up, MOVEMENT_ACTION_JUMP_2_UP
|
||||
create_movement_action jump_2_left, MOVEMENT_ACTION_JUMP_2_LEFT
|
||||
create_movement_action jump_2_right, MOVEMENT_ACTION_JUMP_2_RIGHT
|
||||
create_movement_action delay_1, MOVEMENT_ACTION_DELAY_1
|
||||
create_movement_action delay_2, MOVEMENT_ACTION_DELAY_2
|
||||
create_movement_action delay_4, MOVEMENT_ACTION_DELAY_4
|
||||
create_movement_action delay_8, MOVEMENT_ACTION_DELAY_8
|
||||
create_movement_action delay_16, MOVEMENT_ACTION_DELAY_16
|
||||
create_movement_action walk_fast_down, MOVEMENT_ACTION_WALK_FAST_DOWN
|
||||
create_movement_action walk_fast_up, MOVEMENT_ACTION_WALK_FAST_UP
|
||||
create_movement_action walk_fast_left, MOVEMENT_ACTION_WALK_FAST_LEFT
|
||||
create_movement_action walk_fast_right, MOVEMENT_ACTION_WALK_FAST_RIGHT
|
||||
create_movement_action walk_in_place_slow_down, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN
|
||||
create_movement_action walk_in_place_slow_up, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP
|
||||
create_movement_action walk_in_place_slow_left, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT
|
||||
create_movement_action walk_in_place_slow_right, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT
|
||||
create_movement_action walk_in_place_down, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN
|
||||
create_movement_action walk_in_place_up, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP
|
||||
create_movement_action walk_in_place_left, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT
|
||||
create_movement_action walk_in_place_right, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT
|
||||
create_movement_action walk_in_place_fast_down, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN
|
||||
create_movement_action walk_in_place_fast_up, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP
|
||||
create_movement_action walk_in_place_fast_left, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT
|
||||
create_movement_action walk_in_place_fast_right, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT
|
||||
create_movement_action walk_in_place_faster_down, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN
|
||||
create_movement_action walk_in_place_faster_up, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP
|
||||
create_movement_action walk_in_place_faster_left, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT
|
||||
create_movement_action walk_in_place_faster_right, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT
|
||||
create_movement_action ride_water_current_down, MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN
|
||||
create_movement_action ride_water_current_up, MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP
|
||||
create_movement_action ride_water_current_left, MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT
|
||||
create_movement_action ride_water_current_right, MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT
|
||||
create_movement_action walk_faster_down, MOVEMENT_ACTION_WALK_FASTER_DOWN
|
||||
create_movement_action walk_faster_up, MOVEMENT_ACTION_WALK_FASTER_UP
|
||||
create_movement_action walk_faster_left, MOVEMENT_ACTION_WALK_FASTER_LEFT
|
||||
create_movement_action walk_faster_right, MOVEMENT_ACTION_WALK_FASTER_RIGHT
|
||||
create_movement_action slide_down, MOVEMENT_ACTION_SLIDE_DOWN
|
||||
create_movement_action slide_up, MOVEMENT_ACTION_SLIDE_UP
|
||||
create_movement_action slide_left, MOVEMENT_ACTION_SLIDE_LEFT
|
||||
create_movement_action slide_right, MOVEMENT_ACTION_SLIDE_RIGHT
|
||||
create_movement_action player_run_down, MOVEMENT_ACTION_PLAYER_RUN_DOWN
|
||||
create_movement_action player_run_up, MOVEMENT_ACTION_PLAYER_RUN_UP
|
||||
create_movement_action player_run_left, MOVEMENT_ACTION_PLAYER_RUN_LEFT
|
||||
create_movement_action player_run_right, MOVEMENT_ACTION_PLAYER_RUN_RIGHT
|
||||
create_movement_action start_anim_in_direction, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION
|
||||
create_movement_action jump_special_down, MOVEMENT_ACTION_JUMP_SPECIAL_DOWN
|
||||
create_movement_action jump_special_up, MOVEMENT_ACTION_JUMP_SPECIAL_UP
|
||||
create_movement_action jump_special_left, MOVEMENT_ACTION_JUMP_SPECIAL_LEFT
|
||||
create_movement_action jump_special_right, MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT
|
||||
create_movement_action face_player, MOVEMENT_ACTION_FACE_PLAYER
|
||||
create_movement_action face_away_player, MOVEMENT_ACTION_FACE_AWAY_PLAYER
|
||||
create_movement_action lock_facing_direction, MOVEMENT_ACTION_LOCK_FACING_DIRECTION
|
||||
create_movement_action unlock_facing_direction, MOVEMENT_ACTION_UNLOCK_FACING_DIRECTION
|
||||
create_movement_action jump_down, MOVEMENT_ACTION_JUMP_DOWN
|
||||
create_movement_action jump_up, MOVEMENT_ACTION_JUMP_UP
|
||||
create_movement_action jump_left, MOVEMENT_ACTION_JUMP_LEFT
|
||||
create_movement_action jump_right, MOVEMENT_ACTION_JUMP_RIGHT
|
||||
create_movement_action jump_in_place_down, MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN
|
||||
create_movement_action jump_in_place_up, MOVEMENT_ACTION_JUMP_IN_PLACE_UP
|
||||
create_movement_action jump_in_place_left, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT
|
||||
create_movement_action jump_in_place_right, MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT
|
||||
create_movement_action jump_in_place_down_up, MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP
|
||||
create_movement_action jump_in_place_up_down, MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN
|
||||
create_movement_action jump_in_place_left_right, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT
|
||||
create_movement_action jump_in_place_right_left, MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT
|
||||
create_movement_action face_original_direction, MOVEMENT_ACTION_FACE_ORIGINAL_DIRECTION
|
||||
create_movement_action nurse_joy_bow, MOVEMENT_ACTION_NURSE_JOY_BOW_DOWN
|
||||
create_movement_action enable_jump_landing_ground_effect, MOVEMENT_ACTION_ENABLE_JUMP_LANDING_GROUND_EFFECT
|
||||
create_movement_action disable_jump_landing_ground_effect, MOVEMENT_ACTION_DISABLE_JUMP_LANDING_GROUND_EFFECT
|
||||
create_movement_action disable_anim, MOVEMENT_ACTION_DISABLE_ANIMATION
|
||||
create_movement_action restore_anim, MOVEMENT_ACTION_RESTORE_ANIMATION
|
||||
create_movement_action set_invisible, MOVEMENT_ACTION_SET_INVISIBLE
|
||||
create_movement_action set_visible, MOVEMENT_ACTION_SET_VISIBLE
|
||||
create_movement_action emote_exclamation_mark, MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK
|
||||
create_movement_action emote_question_mark, MOVEMENT_ACTION_EMOTE_QUESTION_MARK
|
||||
create_movement_action emote_heart, MOVEMENT_ACTION_EMOTE_HEART
|
||||
create_movement_action reveal_trainer, MOVEMENT_ACTION_REVEAL_TRAINER
|
||||
create_movement_action rock_smash_break, MOVEMENT_ACTION_ROCK_SMASH_BREAK
|
||||
create_movement_action cut_tree, MOVEMENT_ACTION_CUT_TREE
|
||||
create_movement_action set_fixed_priority, MOVEMENT_ACTION_SET_FIXED_PRIORITY
|
||||
create_movement_action clear_fixed_priority, MOVEMENT_ACTION_CLEAR_FIXED_PRIORITY
|
||||
create_movement_action init_affine_anim, MOVEMENT_ACTION_INIT_AFFINE_ANIM
|
||||
create_movement_action clear_affine_anim, MOVEMENT_ACTION_CLEAR_AFFINE_ANIM
|
||||
create_movement_action hide_reflection, MOVEMENT_ACTION_HIDE_REFLECTION
|
||||
create_movement_action show_reflection, MOVEMENT_ACTION_SHOW_REFLECTION
|
||||
create_movement_action walk_down_start_affine, MOVEMENT_ACTION_WALK_DOWN_START_AFFINE
|
||||
create_movement_action walk_down_affine, MOVEMENT_ACTION_WALK_DOWN_AFFINE
|
||||
create_movement_action acro_wheelie_face_down, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN
|
||||
create_movement_action acro_wheelie_face_up, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP
|
||||
create_movement_action acro_wheelie_face_left, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT
|
||||
create_movement_action acro_wheelie_face_right, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT
|
||||
create_movement_action acro_pop_wheelie_down, MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN
|
||||
create_movement_action acro_pop_wheelie_up, MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP
|
||||
create_movement_action acro_pop_wheelie_left, MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT
|
||||
create_movement_action acro_pop_wheelie_right, MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT
|
||||
create_movement_action acro_end_wheelie_face_down, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN
|
||||
create_movement_action acro_end_wheelie_face_up, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP
|
||||
create_movement_action acro_end_wheelie_face_left, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT
|
||||
create_movement_action acro_end_wheelie_face_right, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT
|
||||
create_movement_action acro_wheelie_hop_face_down, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN
|
||||
create_movement_action acro_wheelie_hop_face_up, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP
|
||||
create_movement_action acro_wheelie_hop_face_left, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT
|
||||
create_movement_action acro_wheelie_hop_face_right, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT
|
||||
create_movement_action acro_wheelie_hop_down, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN
|
||||
create_movement_action acro_wheelie_hop_up, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP
|
||||
create_movement_action acro_wheelie_hop_left, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT
|
||||
create_movement_action acro_wheelie_hop_right, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT
|
||||
create_movement_action acro_wheelie_jump_down, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN
|
||||
create_movement_action acro_wheelie_jump_up, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP
|
||||
create_movement_action acro_wheelie_jump_left, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT
|
||||
create_movement_action acro_wheelie_jump_right, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT
|
||||
create_movement_action acro_wheelie_in_place_down, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN
|
||||
create_movement_action acro_wheelie_in_place_up, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP
|
||||
create_movement_action acro_wheelie_in_place_left, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT
|
||||
create_movement_action acro_wheelie_in_place_right, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT
|
||||
create_movement_action acro_pop_wheelie_move_down, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN
|
||||
create_movement_action acro_pop_wheelie_move_up, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP
|
||||
create_movement_action acro_pop_wheelie_move_left, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT
|
||||
create_movement_action acro_pop_wheelie_move_right, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT
|
||||
create_movement_action acro_wheelie_move_down, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN
|
||||
create_movement_action acro_wheelie_move_up, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP
|
||||
create_movement_action acro_wheelie_move_left, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT
|
||||
create_movement_action acro_wheelie_move_right, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT
|
||||
create_movement_action acro_end_wheelie_move_down, MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN
|
||||
create_movement_action acro_end_wheelie_move_up, MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP
|
||||
create_movement_action acro_end_wheelie_move_left, MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT
|
||||
create_movement_action acro_end_wheelie_move_right, MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT
|
||||
create_movement_action walk_diag_northwest, MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_UP_LEFT
|
||||
create_movement_action walk_diag_northeast, MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_UP_RIGHT
|
||||
create_movement_action walk_diag_southwest, MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_DOWN_LEFT
|
||||
create_movement_action walk_diag_southeast, MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_DOWN_RIGHT
|
||||
create_movement_action walk_slow_diag_northwest, MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_UP_LEFT
|
||||
create_movement_action walk_slow_diag_northeast, MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_UP_RIGHT
|
||||
create_movement_action walk_slow_diag_southwest, MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_DOWN_LEFT
|
||||
create_movement_action walk_slow_diag_southeast, MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_DOWN_RIGHT
|
||||
create_movement_action store_lock_anim, MOVEMENT_ACTION_STORE_AND_LOCK_ANIM
|
||||
create_movement_action free_unlock_anim, MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM
|
||||
create_movement_action walk_left_affine, MOVEMENT_ACTION_WALK_LEFT_AFFINE
|
||||
create_movement_action walk_right_affine, MOVEMENT_ACTION_WALK_RIGHT_AFFINE
|
||||
create_movement_action levitate, MOVEMENT_ACTION_LEVITATE
|
||||
create_movement_action stop_levitate, MOVEMENT_ACTION_STOP_LEVITATE
|
||||
create_movement_action destroy_extra_task, MOVEMENT_ACTION_STOP_LEVITATE_AT_TOP
|
||||
create_movement_action figure_8, MOVEMENT_ACTION_FIGURE_8
|
||||
create_movement_action fly_up, MOVEMENT_ACTION_FLY_UP
|
||||
create_movement_action fly_down, MOVEMENT_ACTION_FLY_DOWN
|
||||
|
||||
enum_start 0x8C
|
||||
create_movement_action walk_diag_northwest
|
||||
create_movement_action walk_diag_northeast
|
||||
create_movement_action walk_diag_southwest
|
||||
create_movement_action walk_diag_southeast
|
||||
create_movement_action walk_slow_diag_northwest
|
||||
create_movement_action walk_slow_diag_northeast
|
||||
create_movement_action walk_slow_diag_southwest
|
||||
create_movement_action walk_slow_diag_southeast
|
||||
create_movement_action store_lock_anim
|
||||
create_movement_action free_unlock_anim
|
||||
create_movement_action walk_left_affine
|
||||
create_movement_action walk_right_affine
|
||||
create_movement_action levitate
|
||||
create_movement_action stop_levitate
|
||||
create_movement_action destroy_extra_task
|
||||
create_movement_action figure_8
|
||||
create_movement_action fly_up
|
||||
create_movement_action fly_down
|
||||
|
||||
enum_start 0xfe
|
||||
create_movement_action step_end
|
||||
create_movement_action step_end, MOVEMENT_ACTION_STEP_END
|
||||
+124
-124
@@ -13,8 +13,8 @@
|
||||
#include "dynamic_placeholder_text_util.h"
|
||||
#include "fonts.h"
|
||||
|
||||
static u16 RenderText(struct TextPrinter *textPrinter);
|
||||
static u32 RenderFont(struct TextPrinter *textPrinter);
|
||||
static u16 RenderText(struct TextPrinter *);
|
||||
static u32 RenderFont(struct TextPrinter *);
|
||||
static u16 FontFunc_Small(struct TextPrinter *);
|
||||
static u16 FontFunc_Normal(struct TextPrinter *);
|
||||
static u16 FontFunc_Short(struct TextPrinter *);
|
||||
@@ -23,32 +23,32 @@ static u16 FontFunc_ShortCopy2(struct TextPrinter *);
|
||||
static u16 FontFunc_ShortCopy3(struct TextPrinter *);
|
||||
static u16 FontFunc_Narrow(struct TextPrinter *);
|
||||
static u16 FontFunc_SmallNarrow(struct TextPrinter *);
|
||||
static void DecompressGlyph_Small(u16 glyphId, bool32 isJapanese);
|
||||
static void DecompressGlyph_Normal(u16 glyphId, bool32 isJapanese);
|
||||
static void DecompressGlyph_Short(u16 glyphId, bool32 isJapanese);
|
||||
static void DecompressGlyph_Narrow(u16 glyphId, bool32 isJapanese);
|
||||
static void DecompressGlyph_SmallNarrow(u16 glyphId, bool32 isJapanese);
|
||||
static void DecompressGlyph_Bold(u16 glyphId);
|
||||
static u32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese);
|
||||
static u32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese);
|
||||
static u32 GetGlyphWidth_Short(u16 glyphId, bool32 isJapanese);
|
||||
static u32 GetGlyphWidth_Narrow(u16 glyphId, bool32 isJapanese);
|
||||
static u32 GetGlyphWidth_SmallNarrow(u16 glyphId, bool32 isJapanese);
|
||||
static void DecompressGlyph_Small(u16, bool32);
|
||||
static void DecompressGlyph_Normal(u16, bool32);
|
||||
static void DecompressGlyph_Short(u16, bool32);
|
||||
static void DecompressGlyph_Narrow(u16, bool32);
|
||||
static void DecompressGlyph_SmallNarrow(u16, bool32);
|
||||
static void DecompressGlyph_Bold(u16);
|
||||
static u32 GetGlyphWidth_Small(u16, bool32);
|
||||
static u32 GetGlyphWidth_Normal(u16, bool32);
|
||||
static u32 GetGlyphWidth_Short(u16, bool32);
|
||||
static u32 GetGlyphWidth_Narrow(u16, bool32);
|
||||
static u32 GetGlyphWidth_SmallNarrow(u16, bool32);
|
||||
|
||||
EWRAM_DATA struct TextPrinter gTempTextPrinter = {0};
|
||||
EWRAM_DATA struct TextPrinter gTextPrinters[NUM_TEXT_PRINTERS] = {0};
|
||||
static EWRAM_DATA struct TextPrinter sTempTextPrinter = {0};
|
||||
static EWRAM_DATA struct TextPrinter sTextPrinters[NUM_TEXT_PRINTERS] = {0};
|
||||
|
||||
static u16 gFontHalfRowLookupTable[0x51];
|
||||
static u16 gLastTextBgColor;
|
||||
static u16 gLastTextFgColor;
|
||||
static u16 gLastTextShadowColor;
|
||||
static u16 sFontHalfRowLookupTable[0x51];
|
||||
static u16 sLastTextBgColor;
|
||||
static u16 sLastTextFgColor;
|
||||
static u16 sLastTextShadowColor;
|
||||
|
||||
const struct FontInfo *gFonts;
|
||||
bool8 gDisableTextPrinters;
|
||||
struct TextGlyph gCurGlyph;
|
||||
TextFlags gTextFlags;
|
||||
|
||||
const u8 gFontHalfRowOffsets[] =
|
||||
static const u8 sFontHalfRowOffsets[] =
|
||||
{
|
||||
0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
|
||||
0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,
|
||||
@@ -68,12 +68,16 @@ const u8 gFontHalfRowOffsets[] =
|
||||
0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00
|
||||
};
|
||||
|
||||
const u8 gDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow.4bpp");
|
||||
const u8 gDarkDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_RS.4bpp");
|
||||
const u8 gUnusedFRLGBlankedDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_blanked_down_arrow.4bpp");
|
||||
const u8 gUnusedFRLGDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_down_arrow.4bpp");
|
||||
const u8 gDownArrowYCoords[] = { 0, 1, 2, 1 };
|
||||
const u8 gWindowVerticalScrollSpeeds[] = { 1, 2, 4, 0x0 };
|
||||
static const u8 sDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow.4bpp");
|
||||
static const u8 sDarkDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_alt.4bpp");
|
||||
static const u8 sUnusedFRLGBlankedDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_blanked_down_arrow.4bpp");
|
||||
static const u8 sUnusedFRLGDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_down_arrow.4bpp");
|
||||
static const u8 sDownArrowYCoords[] = { 0, 1, 2, 1 };
|
||||
static const u8 sWindowVerticalScrollSpeeds[] = {
|
||||
[OPTIONS_TEXT_SPEED_SLOW] = 1,
|
||||
[OPTIONS_TEXT_SPEED_MID] = 2,
|
||||
[OPTIONS_TEXT_SPEED_FAST] = 4,
|
||||
};
|
||||
|
||||
static const struct GlyphWidthFunc sGlyphWidthFuncs[] =
|
||||
{
|
||||
@@ -88,24 +92,29 @@ static const struct GlyphWidthFunc sGlyphWidthFuncs[] =
|
||||
{ FONT_SMALL_NARROW, GetGlyphWidth_SmallNarrow }
|
||||
};
|
||||
|
||||
const struct KeypadIcon gKeypadIcons[] =
|
||||
struct
|
||||
{
|
||||
[CHAR_A_BUTTON] = { 0x0, 0x8, 0xC },
|
||||
[CHAR_B_BUTTON] = { 0x1, 0x8, 0xC },
|
||||
[CHAR_L_BUTTON] = { 0x2, 0x10, 0xC },
|
||||
[CHAR_R_BUTTON] = { 0x4, 0x10, 0xC },
|
||||
[CHAR_START_BUTTON] = { 0x6, 0x18, 0xC },
|
||||
[CHAR_SELECT_BUTTON] = { 0x9, 0x18, 0xC },
|
||||
[CHAR_DPAD_UP] = { 0xC, 0x8, 0xC },
|
||||
[CHAR_DPAD_DOWN] = { 0xD, 0x8, 0xC },
|
||||
[CHAR_DPAD_LEFT] = { 0xE, 0x8, 0xC },
|
||||
[CHAR_DPAD_RIGHT] = { 0xF, 0x8, 0xC },
|
||||
[CHAR_DPAD_UPDOWN] = { 0x20, 0x8, 0xC },
|
||||
[CHAR_DPAD_LEFTRIGHT] = { 0x21, 0x8, 0xC },
|
||||
[CHAR_DPAD_NONE] = { 0x22, 0x8, 0xC }
|
||||
u16 tileOffset;
|
||||
u8 width;
|
||||
u8 height;
|
||||
} static const sKeypadIcons[] =
|
||||
{
|
||||
[CHAR_A_BUTTON] = { 0x00, 8, 12 },
|
||||
[CHAR_B_BUTTON] = { 0x01, 8, 12 },
|
||||
[CHAR_L_BUTTON] = { 0x02, 16, 12 },
|
||||
[CHAR_R_BUTTON] = { 0x04, 16, 12 },
|
||||
[CHAR_START_BUTTON] = { 0x06, 24, 12 },
|
||||
[CHAR_SELECT_BUTTON] = { 0x09, 24, 12 },
|
||||
[CHAR_DPAD_UP] = { 0x0C, 8, 12 },
|
||||
[CHAR_DPAD_DOWN] = { 0x0D, 8, 12 },
|
||||
[CHAR_DPAD_LEFT] = { 0x0E, 8, 12 },
|
||||
[CHAR_DPAD_RIGHT] = { 0x0F, 8, 12 },
|
||||
[CHAR_DPAD_UPDOWN] = { 0x20, 8, 12 },
|
||||
[CHAR_DPAD_LEFTRIGHT] = { 0x21, 8, 12 },
|
||||
[CHAR_DPAD_NONE] = { 0x22, 8, 12 }
|
||||
};
|
||||
|
||||
const u8 gKeypadIconTiles[] = INCBIN_U8("graphics/fonts/keypad_icons.4bpp");
|
||||
static const u8 sKeypadIconTiles[] = INCBIN_U8("graphics/fonts/keypad_icons.4bpp");
|
||||
|
||||
static const struct FontInfo sFontInfos[] =
|
||||
{
|
||||
@@ -225,7 +234,7 @@ static const u8 sMenuCursorDimensions[][2] =
|
||||
[FONT_BOLD] = {}
|
||||
};
|
||||
|
||||
const u16 gFontBoldJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/bold.hwjpnfont");
|
||||
static const u16 sFontBoldJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/bold.hwjpnfont");
|
||||
|
||||
static void SetFontsPointer(const struct FontInfo *fonts)
|
||||
{
|
||||
@@ -236,7 +245,7 @@ void DeactivateAllTextPrinters(void)
|
||||
{
|
||||
int printer;
|
||||
for (printer = 0; printer < NUM_TEXT_PRINTERS; ++printer)
|
||||
gTextPrinters[printer].active = FALSE;
|
||||
sTextPrinters[printer].active = FALSE;
|
||||
}
|
||||
|
||||
u16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16))
|
||||
@@ -267,41 +276,41 @@ bool16 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u8 speed, voi
|
||||
if (!gFonts)
|
||||
return FALSE;
|
||||
|
||||
gTempTextPrinter.active = TRUE;
|
||||
gTempTextPrinter.state = RENDER_STATE_HANDLE_CHAR;
|
||||
gTempTextPrinter.textSpeed = speed;
|
||||
gTempTextPrinter.delayCounter = 0;
|
||||
gTempTextPrinter.scrollDistance = 0;
|
||||
sTempTextPrinter.active = TRUE;
|
||||
sTempTextPrinter.state = RENDER_STATE_HANDLE_CHAR;
|
||||
sTempTextPrinter.textSpeed = speed;
|
||||
sTempTextPrinter.delayCounter = 0;
|
||||
sTempTextPrinter.scrollDistance = 0;
|
||||
|
||||
for (i = 0; i < (int)ARRAY_COUNT(gTempTextPrinter.subStructFields); i++)
|
||||
gTempTextPrinter.subStructFields[i] = 0;
|
||||
for (i = 0; i < (int)ARRAY_COUNT(sTempTextPrinter.subStructFields); i++)
|
||||
sTempTextPrinter.subStructFields[i] = 0;
|
||||
|
||||
gTempTextPrinter.printerTemplate = *printerTemplate;
|
||||
gTempTextPrinter.callback = callback;
|
||||
gTempTextPrinter.minLetterSpacing = 0;
|
||||
gTempTextPrinter.japanese = 0;
|
||||
sTempTextPrinter.printerTemplate = *printerTemplate;
|
||||
sTempTextPrinter.callback = callback;
|
||||
sTempTextPrinter.minLetterSpacing = 0;
|
||||
sTempTextPrinter.japanese = 0;
|
||||
|
||||
GenerateFontHalfRowLookupTable(printerTemplate->fgColor, printerTemplate->bgColor, printerTemplate->shadowColor);
|
||||
if (speed != TEXT_SKIP_DRAW && speed != 0)
|
||||
{
|
||||
--gTempTextPrinter.textSpeed;
|
||||
gTextPrinters[printerTemplate->windowId] = gTempTextPrinter;
|
||||
--sTempTextPrinter.textSpeed;
|
||||
sTextPrinters[printerTemplate->windowId] = sTempTextPrinter;
|
||||
}
|
||||
else
|
||||
{
|
||||
gTempTextPrinter.textSpeed = 0;
|
||||
sTempTextPrinter.textSpeed = 0;
|
||||
|
||||
// Render all text (up to limit) at once
|
||||
for (j = 0; j < 0x400; ++j)
|
||||
{
|
||||
if (RenderFont(&gTempTextPrinter) == RENDER_FINISH)
|
||||
if (RenderFont(&sTempTextPrinter) == RENDER_FINISH)
|
||||
break;
|
||||
}
|
||||
|
||||
// All the text is rendered to the window but don't draw it yet.
|
||||
if (speed != TEXT_SKIP_DRAW)
|
||||
CopyWindowToVram(gTempTextPrinter.printerTemplate.windowId, COPYWIN_GFX);
|
||||
gTextPrinters[printerTemplate->windowId].active = FALSE;
|
||||
CopyWindowToVram(sTempTextPrinter.printerTemplate.windowId, COPYWIN_GFX);
|
||||
sTextPrinters[printerTemplate->windowId].active = FALSE;
|
||||
}
|
||||
gDisableTextPrinters = FALSE;
|
||||
return TRUE;
|
||||
@@ -315,19 +324,19 @@ void RunTextPrinters(void)
|
||||
{
|
||||
for (i = 0; i < NUM_TEXT_PRINTERS; ++i)
|
||||
{
|
||||
if (gTextPrinters[i].active)
|
||||
if (sTextPrinters[i].active)
|
||||
{
|
||||
u16 temp = RenderFont(&gTextPrinters[i]);
|
||||
u16 temp = RenderFont(&sTextPrinters[i]);
|
||||
switch (temp)
|
||||
{
|
||||
case RENDER_PRINT:
|
||||
CopyWindowToVram(gTextPrinters[i].printerTemplate.windowId, COPYWIN_GFX);
|
||||
CopyWindowToVram(sTextPrinters[i].printerTemplate.windowId, COPYWIN_GFX);
|
||||
case RENDER_UPDATE:
|
||||
if (gTextPrinters[i].callback != 0)
|
||||
gTextPrinters[i].callback(&gTextPrinters[i].printerTemplate, temp);
|
||||
if (sTextPrinters[i].callback != 0)
|
||||
sTextPrinters[i].callback(&sTextPrinters[i].printerTemplate, temp);
|
||||
break;
|
||||
case RENDER_FINISH:
|
||||
gTextPrinters[i].active = FALSE;
|
||||
sTextPrinters[i].active = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -337,7 +346,7 @@ void RunTextPrinters(void)
|
||||
|
||||
bool16 IsTextPrinterActive(u8 id)
|
||||
{
|
||||
return gTextPrinters[id].active;
|
||||
return sTextPrinters[id].active;
|
||||
}
|
||||
|
||||
static u32 RenderFont(struct TextPrinter *textPrinter)
|
||||
@@ -356,11 +365,11 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor)
|
||||
u32 fg12, bg12, shadow12;
|
||||
u32 temp;
|
||||
|
||||
u16 *current = gFontHalfRowLookupTable;
|
||||
u16 *current = sFontHalfRowLookupTable;
|
||||
|
||||
gLastTextBgColor = bgColor;
|
||||
gLastTextFgColor = fgColor;
|
||||
gLastTextShadowColor = shadowColor;
|
||||
sLastTextBgColor = bgColor;
|
||||
sLastTextFgColor = fgColor;
|
||||
sLastTextShadowColor = shadowColor;
|
||||
|
||||
bg12 = bgColor << 12;
|
||||
fg12 = fgColor << 12;
|
||||
@@ -504,9 +513,9 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor)
|
||||
|
||||
void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor)
|
||||
{
|
||||
*bgColor = gLastTextBgColor;
|
||||
*fgColor = gLastTextFgColor;
|
||||
*shadowColor = gLastTextShadowColor;
|
||||
*bgColor = sLastTextBgColor;
|
||||
*fgColor = sLastTextFgColor;
|
||||
*shadowColor = sLastTextShadowColor;
|
||||
}
|
||||
|
||||
void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor)
|
||||
@@ -521,40 +530,41 @@ void DecompressGlyphTile(const void *src_, void *dest_)
|
||||
u32 *dest = dest_;
|
||||
|
||||
temp = *(src++);
|
||||
*(dest)++ = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]);
|
||||
*(dest)++ = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
|
||||
|
||||
temp = *(src++);
|
||||
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]);
|
||||
*(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
|
||||
|
||||
temp = *(src++);
|
||||
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]);
|
||||
*(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
|
||||
|
||||
temp = *(src++);
|
||||
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]);
|
||||
*(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
|
||||
|
||||
temp = *(src++);
|
||||
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]);
|
||||
*(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
|
||||
|
||||
temp = *(src++);
|
||||
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]);
|
||||
*(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
|
||||
|
||||
temp = *(src++);
|
||||
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]);
|
||||
*(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
|
||||
|
||||
temp = *(src++);
|
||||
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]);
|
||||
*(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
|
||||
}
|
||||
|
||||
u8 GetLastTextColor(u8 colorType)
|
||||
// Unused
|
||||
static u8 GetLastTextColor(u8 colorType)
|
||||
{
|
||||
switch (colorType)
|
||||
{
|
||||
case 0:
|
||||
return gLastTextFgColor;
|
||||
return sLastTextFgColor;
|
||||
case 2:
|
||||
return gLastTextBgColor;
|
||||
return sLastTextBgColor;
|
||||
case 1:
|
||||
return gLastTextShadowColor;
|
||||
return sLastTextShadowColor;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -644,7 +654,7 @@ void ClearTextSpan(struct TextPrinter *textPrinter, u32 width)
|
||||
struct TextGlyph *glyph;
|
||||
u8* glyphHeight;
|
||||
|
||||
if (gLastTextBgColor != 0)
|
||||
if (sLastTextBgColor != TEXT_COLOR_TRANSPARENT)
|
||||
{
|
||||
window = &gWindows[textPrinter->printerTemplate.windowId];
|
||||
pixels_data.pixels = window->tileData;
|
||||
@@ -660,7 +670,7 @@ void ClearTextSpan(struct TextPrinter *textPrinter, u32 width)
|
||||
textPrinter->printerTemplate.currentY,
|
||||
width,
|
||||
*glyphHeight,
|
||||
gLastTextBgColor);
|
||||
sLastTextBgColor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -798,20 +808,20 @@ void TextPrinterDrawDownArrow(struct TextPrinter *textPrinter)
|
||||
|
||||
switch (gTextFlags.useAlternateDownArrow)
|
||||
{
|
||||
case FALSE:
|
||||
default:
|
||||
arrowTiles = gDownArrowTiles;
|
||||
break;
|
||||
case TRUE:
|
||||
arrowTiles = gDarkDownArrowTiles;
|
||||
break;
|
||||
case FALSE:
|
||||
default:
|
||||
arrowTiles = sDownArrowTiles;
|
||||
break;
|
||||
case TRUE:
|
||||
arrowTiles = sDarkDownArrowTiles;
|
||||
break;
|
||||
}
|
||||
|
||||
BlitBitmapRectToWindow(
|
||||
textPrinter->printerTemplate.windowId,
|
||||
arrowTiles,
|
||||
0,
|
||||
gDownArrowYCoords[subStruct->downArrowYPosIdx],
|
||||
sDownArrowYCoords[subStruct->downArrowYPosIdx],
|
||||
8,
|
||||
16,
|
||||
textPrinter->printerTemplate.currentX,
|
||||
@@ -905,26 +915,16 @@ void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *c
|
||||
{
|
||||
switch (gTextFlags.useAlternateDownArrow)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
arrowTiles = gDownArrowTiles;
|
||||
break;
|
||||
case 1:
|
||||
arrowTiles = gDarkDownArrowTiles;
|
||||
break;
|
||||
case FALSE:
|
||||
default:
|
||||
arrowTiles = sDownArrowTiles;
|
||||
break;
|
||||
case TRUE:
|
||||
arrowTiles = sDarkDownArrowTiles;
|
||||
break;
|
||||
}
|
||||
|
||||
BlitBitmapRectToWindow(
|
||||
windowId,
|
||||
arrowTiles,
|
||||
0,
|
||||
gDownArrowYCoords[*yCoordIndex & 3],
|
||||
0x8,
|
||||
0x10,
|
||||
x,
|
||||
y - 2,
|
||||
0x8,
|
||||
0x10);
|
||||
BlitBitmapRectToWindow(windowId, arrowTiles, 0, sDownArrowYCoords[*yCoordIndex & 3], 8, 16, x, y - 2, 8, 16);
|
||||
CopyWindowToVram(windowId, COPYWIN_GFX);
|
||||
*counter = 8;
|
||||
++*yCoordIndex;
|
||||
@@ -942,7 +942,7 @@ static u16 RenderText(struct TextPrinter *textPrinter)
|
||||
switch (textPrinter->state)
|
||||
{
|
||||
case RENDER_STATE_HANDLE_CHAR:
|
||||
if ((JOY_HELD(A_BUTTON | B_BUTTON)) && subStruct->hasPrintBeenSpedUp)
|
||||
if (JOY_HELD(A_BUTTON | B_BUTTON) && subStruct->hasPrintBeenSpedUp)
|
||||
textPrinter->delayCounter = 0;
|
||||
|
||||
if (textPrinter->delayCounter && textPrinter->textSpeed)
|
||||
@@ -1191,7 +1191,7 @@ static u16 RenderText(struct TextPrinter *textPrinter)
|
||||
if (textPrinter->scrollDistance)
|
||||
{
|
||||
int scrollSpeed = GetPlayerTextSpeed();
|
||||
int speed = gWindowVerticalScrollSpeeds[scrollSpeed];
|
||||
int speed = sWindowVerticalScrollSpeeds[scrollSpeed];
|
||||
if (textPrinter->scrollDistance < speed)
|
||||
{
|
||||
ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor));
|
||||
@@ -1612,31 +1612,31 @@ u8 DrawKeypadIcon(u8 windowId, u8 keypadIconId, u16 x, u16 y)
|
||||
{
|
||||
BlitBitmapRectToWindow(
|
||||
windowId,
|
||||
gKeypadIconTiles + (gKeypadIcons[keypadIconId].tileOffset * 0x20),
|
||||
sKeypadIconTiles + (sKeypadIcons[keypadIconId].tileOffset * 0x20),
|
||||
0,
|
||||
0,
|
||||
0x80,
|
||||
0x80,
|
||||
x,
|
||||
y,
|
||||
gKeypadIcons[keypadIconId].width,
|
||||
gKeypadIcons[keypadIconId].height);
|
||||
return gKeypadIcons[keypadIconId].width;
|
||||
sKeypadIcons[keypadIconId].width,
|
||||
sKeypadIcons[keypadIconId].height);
|
||||
return sKeypadIcons[keypadIconId].width;
|
||||
}
|
||||
|
||||
u8 GetKeypadIconTileOffset(u8 keypadIconId)
|
||||
{
|
||||
return gKeypadIcons[keypadIconId].tileOffset;
|
||||
return sKeypadIcons[keypadIconId].tileOffset;
|
||||
}
|
||||
|
||||
u8 GetKeypadIconWidth(u8 keypadIconId)
|
||||
{
|
||||
return gKeypadIcons[keypadIconId].width;
|
||||
return sKeypadIcons[keypadIconId].width;
|
||||
}
|
||||
|
||||
u8 GetKeypadIconHeight(u8 keypadIconId)
|
||||
{
|
||||
return gKeypadIcons[keypadIconId].height;
|
||||
return sKeypadIcons[keypadIconId].height;
|
||||
}
|
||||
|
||||
void SetDefaultFontsPointer(void)
|
||||
@@ -1898,7 +1898,7 @@ static void DecompressGlyph_Bold(u16 glyphId)
|
||||
{
|
||||
const u16* glyphs;
|
||||
|
||||
glyphs = gFontBoldJapaneseGlyphs + (0x100 * (glyphId >> 4)) + (0x8 * (glyphId & 0xF));
|
||||
glyphs = sFontBoldJapaneseGlyphs + (0x100 * (glyphId >> 4)) + (0x8 * (glyphId & 0xF));
|
||||
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
|
||||
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
|
||||
gCurGlyph.width = 8;
|
||||
|
||||
@@ -117,13 +117,6 @@ struct GlyphWidthFunc
|
||||
u32 (*func)(u16 glyphId, bool32 isJapanese);
|
||||
};
|
||||
|
||||
struct KeypadIcon
|
||||
{
|
||||
u16 tileOffset;
|
||||
u8 width;
|
||||
u8 height;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
bool8 canABSpeedUpPrint:1;
|
||||
bool8 useAlternateDownArrow:1;
|
||||
@@ -153,7 +146,6 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor);
|
||||
void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor);
|
||||
void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor);
|
||||
void DecompressGlyphTile(const void *src_, void *dest_);
|
||||
u8 GetLastTextColor(u8 colorType);
|
||||
void CopyGlyphToWindow(struct TextPrinter *x);
|
||||
void ClearTextSpan(struct TextPrinter *textPrinter, u32 width);
|
||||
u8 GetMenuCursorDimensionByFont(u8, u8);
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.
|
Before Width: | Height: | Size: 194 B |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,35 +0,0 @@
|
||||
JASC-PAL
|
||||
0100
|
||||
32
|
||||
0 197 0
|
||||
246 197 123
|
||||
255 255 255
|
||||
106 115 123
|
||||
0 0 0
|
||||
189 106 65
|
||||
49 65 74
|
||||
255 222 156
|
||||
180 131 82
|
||||
189 139 106
|
||||
197 197 197
|
||||
255 255 255
|
||||
0 0 0
|
||||
0 0 0
|
||||
0 0 0
|
||||
255 74 16
|
||||
0 197 0
|
||||
246 197 123
|
||||
255 255 255
|
||||
106 115 123
|
||||
0 0 0
|
||||
189 106 65
|
||||
49 65 74
|
||||
255 222 156
|
||||
180 131 82
|
||||
189 139 106
|
||||
197 197 197
|
||||
197 197 197
|
||||
0 0 0
|
||||
0 0 0
|
||||
0 0 0
|
||||
189 106 65
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -697,7 +697,7 @@ $(PKNAVGFXDIR)/header.4bpp: %.4bpp: %.png
|
||||
$(PKNAVGFXDIR)/device_outline.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -num_tiles 53
|
||||
|
||||
$(PKNAVGFXDIR)/ui_matchcall.4bpp: %.4bpp: %.png
|
||||
$(PKNAVGFXDIR)/match_call/ui.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -num_tiles 13
|
||||
|
||||
$(INTERFACEGFXDIR)/region_map.8bpp: %.8bpp: %.png
|
||||
|
||||
@@ -270,7 +270,9 @@
|
||||
#define FRIENDSHIP_EVENT_FAINT_FIELD_PSN 7
|
||||
#define FRIENDSHIP_EVENT_FAINT_LARGE 8 // If opponent was >= 30 levels higher. See AdjustFriendshipOnBattleFaint
|
||||
|
||||
#define MAX_FRIENDSHIP 0xFF
|
||||
#define MAX_FRIENDSHIP 255
|
||||
#define MAX_SHEEN 255
|
||||
#define MAX_CONDITION 255
|
||||
|
||||
#define MAX_PER_STAT_IVS 31
|
||||
#define MAX_IV_MASK 31
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
#define BSS_DATA __attribute__((section(".bss")))
|
||||
#define IWRAM_DATA __attribute__((section("iwram_data")))
|
||||
#define EWRAM_DATA __attribute__((section("ewram_data")))
|
||||
#define UNUSED __attribute__((unused))
|
||||
|
||||
@@ -482,6 +482,7 @@
|
||||
#define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32)
|
||||
#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND)
|
||||
#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV)
|
||||
#define REG_SIOMULTI(n) (*(vu16 *)(REG_ADDR_SIOMULTI0 + (n) * 2))
|
||||
#define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0)
|
||||
#define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1)
|
||||
#define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2)
|
||||
|
||||
+3
-3
@@ -4637,9 +4637,9 @@ extern const u32 gBattleAnimSpritePal_RedHeart[];
|
||||
extern const u32 gBattleAnimSpritePal_RedOrb[];
|
||||
extern const u32 gBattleAnimSpritePal_EyeSparkle[];
|
||||
extern const u32 gBattleAnimSpritePal_PinkHeart[];
|
||||
extern const u32 gBattleAnimBgImage_Attract;
|
||||
extern const u32 gBattleAnimBgPalette_Attract;
|
||||
extern const u32 gBattleAnimBgTilemap_Attract;
|
||||
extern const u32 gBattleAnimBgImage_Attract[];
|
||||
extern const u32 gBattleAnimBgPalette_Attract[];
|
||||
extern const u32 gBattleAnimBgTilemap_Attract[];
|
||||
extern const u32 gBattleAnimSpritePal_Angel[];
|
||||
extern const u32 gBattleAnimSpritePal_Devil[];
|
||||
extern const u32 gBattleAnimSpritePal_Swipe[];
|
||||
|
||||
+87
-41
@@ -7,14 +7,6 @@
|
||||
#include "pokemon.h"
|
||||
#include "constants/berry.h"
|
||||
|
||||
#define TAG_CONDITION_MON 100
|
||||
#define TAG_CONDITION_BALL 101
|
||||
#define TAG_CONDITION_CANCEL 102
|
||||
#define TAG_CONDITION_BALL_PLACEHOLDER 103
|
||||
#define TAG_CONDITION_SPARKLE 104
|
||||
|
||||
#define MAX_CONDITION_SPARKLES 10
|
||||
|
||||
// Window IDs for the Player PC Mailbox
|
||||
enum {
|
||||
MAILBOXWIN_TITLE,
|
||||
@@ -23,61 +15,115 @@ enum {
|
||||
MAILBOXWIN_COUNT
|
||||
};
|
||||
|
||||
struct UnknownSubStruct_81D1ED4
|
||||
{
|
||||
u16 unk0;
|
||||
u16 unk2;
|
||||
enum {
|
||||
TAG_CONDITION_MON = 100,
|
||||
TAG_CONDITION_BALL,
|
||||
TAG_CONDITION_CANCEL,
|
||||
TAG_CONDITION_BALL_PLACEHOLDER,
|
||||
TAG_CONDITION_SPARKLE,
|
||||
TAG_CONDITION_MON_MARKINGS,
|
||||
TAG_CONDITION_MARKINGS_MENU,
|
||||
TAG_CONDITION_MARKINGS_MENU_2, // Used implicitly by CreateMonMarkingsMenuSprites
|
||||
};
|
||||
|
||||
enum {
|
||||
CONDITION_ICON_SELECTED,
|
||||
CONDITION_ICON_UNSELECTED,
|
||||
};
|
||||
|
||||
#define MAX_CONDITION_SPARKLES 10
|
||||
|
||||
// The number of extra sparkles shown on a Pokémon's condition screen.
|
||||
// All Pokémon start with 1, so the max here is MAX_CONDITION_SPARKLES - 1
|
||||
#define GET_NUM_CONDITION_SPARKLES(sheen)((sheen) != MAX_SHEEN) ? (sheen) / ((u32)MAX_SHEEN / (MAX_CONDITION_SPARKLES - 1) + 1) : MAX_CONDITION_SPARKLES - 1;
|
||||
|
||||
#define CONDITION_GRAPH_TOP_Y 56
|
||||
#define CONDITION_GRAPH_BOTTOM_Y 121
|
||||
#define CONDITION_GRAPH_HEIGHT (CONDITION_GRAPH_BOTTOM_Y - CONDITION_GRAPH_TOP_Y + 1)
|
||||
#define CONDITION_GRAPH_CENTER_X 155
|
||||
#define CONDITION_GRAPH_CENTER_Y ((CONDITION_GRAPH_BOTTOM_Y + CONDITION_GRAPH_TOP_Y) / 2 + 3)
|
||||
#define CONDITION_GRAPH_UPDATE_STEPS 10
|
||||
#define CONDITION_GRAPH_LOAD_MAX 4
|
||||
|
||||
// Equivalent to flavor and contest values, but in a different order.
|
||||
enum {
|
||||
CONDITION_COOL,
|
||||
CONDITION_TOUGH,
|
||||
CONDITION_SMART,
|
||||
CONDITION_CUTE,
|
||||
CONDITION_BEAUTY,
|
||||
CONDITION_COUNT
|
||||
};
|
||||
|
||||
// Yet another order. This one is the same (by coincidence) as the contest categories
|
||||
enum {
|
||||
GRAPH_COOL,
|
||||
GRAPH_BEAUTY,
|
||||
GRAPH_CUTE,
|
||||
GRAPH_SMART,
|
||||
GRAPH_TOUGH,
|
||||
};
|
||||
|
||||
struct ConditionGraph
|
||||
{
|
||||
/*0x000*/ u8 stat[4][FLAVOR_COUNT];
|
||||
/*0x014*/ struct UnknownSubStruct_81D1ED4 unk14[4][FLAVOR_COUNT];
|
||||
/*0x064*/ struct UnknownSubStruct_81D1ED4 unk64[10][FLAVOR_COUNT];
|
||||
/*0x12C*/ struct UnknownSubStruct_81D1ED4 unk12C[FLAVOR_COUNT];
|
||||
/*0x140*/ u16 unk140[66][2];
|
||||
/*0x248*/ u16 unk248[66][2];
|
||||
/*0x350*/ u16 unk350;
|
||||
/*0x352*/ u16 unk352;
|
||||
/*0x354*/ u8 unk354;
|
||||
/*0x355*/ u8 state;
|
||||
/*0x000*/ u8 conditions[CONDITION_GRAPH_LOAD_MAX][CONDITION_COUNT];
|
||||
/*0x014*/ struct UCoords16 savedPositions[CONDITION_GRAPH_LOAD_MAX][CONDITION_COUNT];
|
||||
/*0x064*/ struct UCoords16 newPositions[CONDITION_GRAPH_UPDATE_STEPS][CONDITION_COUNT];
|
||||
/*0x12C*/ struct UCoords16 curPositions[CONDITION_COUNT];
|
||||
/*0x140*/ u16 scanlineRight[CONDITION_GRAPH_HEIGHT][2];
|
||||
/*0x248*/ u16 scanlineLeft[CONDITION_GRAPH_HEIGHT][2];
|
||||
/*0x350*/ u16 bottom;
|
||||
/*0x352*/ u16 updateCounter;
|
||||
/*0x354*/ bool8 needsDraw;
|
||||
/*0x355*/ u8 scanlineResetState;
|
||||
};
|
||||
|
||||
// Mailbox menu
|
||||
bool8 MailboxMenu_Alloc(u8 count);
|
||||
u8 MailboxMenu_AddWindow(u8 windowIdx);
|
||||
u8 MailboxMenu_CreateList(struct PlayerPCItemPageStruct *page);
|
||||
void MailboxMenu_AddScrollArrows(struct PlayerPCItemPageStruct *page);
|
||||
void MailboxMenu_Free(void);
|
||||
void MailboxMenu_RemoveWindow(u8 windowIdx);
|
||||
void InitConditionGraphData(struct ConditionGraph *graph);
|
||||
void sub_81D2108(struct ConditionGraph *graph);
|
||||
void SetConditionGraphIOWindows(u8 bg);
|
||||
void InitConditionGraphState(struct ConditionGraph *graph);
|
||||
void sub_81D2230(struct ConditionGraph *graph);
|
||||
bool8 SetupConditionGraphScanlineParams(struct ConditionGraph *graph);
|
||||
bool32 TransitionConditionGraph(struct ConditionGraph *graph);
|
||||
void sub_81D2754(u8 *arg0, struct UnknownSubStruct_81D1ED4 *arg1);
|
||||
void sub_81D1F84(struct ConditionGraph *graph, struct UnknownSubStruct_81D1ED4 *arg1, struct UnknownSubStruct_81D1ED4 *arg2);
|
||||
void MoveRelearnerPrintText(u8 *str);
|
||||
bool16 MoveRelearnerRunTextPrinters(void);
|
||||
void MoveRelearnerCreateYesNoMenu(void);
|
||||
u8 LoadMoveRelearnerMovesList(const struct ListMenuItem *items, u16 numChoices);
|
||||
void InitMoveRelearnerWindows(bool8 useContextWindow);
|
||||
s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst);
|
||||
|
||||
// Condition graph
|
||||
void ConditionGraph_Init(struct ConditionGraph *graph);
|
||||
void ConditionGraph_InitWindow(u8 bg);
|
||||
void ConditionGraph_InitResetScanline(struct ConditionGraph *graph);
|
||||
bool8 ConditionGraph_ResetScanline(struct ConditionGraph *graph);
|
||||
void ConditionGraph_Draw(struct ConditionGraph *graph);
|
||||
bool8 ConditionGraph_TryUpdate(struct ConditionGraph *graph);
|
||||
void ConditionGraph_Update(struct ConditionGraph *graph);
|
||||
void ConditionGraph_CalcPositions(u8 *conditions, struct UCoords16 *positions);
|
||||
void ConditionGraph_SetNewPositions(struct ConditionGraph *graph, struct UCoords16 *arg1, struct UCoords16 *arg2);
|
||||
|
||||
// Condition menu
|
||||
bool8 ConditionMenu_UpdateMonEnter(struct ConditionGraph *graph, s16 *x);
|
||||
bool8 ConditionMenu_UpdateMonExit(struct ConditionGraph *graph, s16 *x);
|
||||
bool8 MoveConditionMonOnscreen(s16 *x);
|
||||
bool8 MoveConditionMonOffscreen(s16 *x);
|
||||
void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel);
|
||||
void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel);
|
||||
void GetConditionMenuMonGfx(void *tilesDst, void *palDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel);
|
||||
bool8 MoveConditionMonOnscreen(s16 *x);
|
||||
bool8 MoveConditionMonOffscreen(s16 *x);
|
||||
bool8 TryUpdateConditionMonTransitionOn(struct ConditionGraph *graph, s16 *x);
|
||||
bool8 TryUpdateConditionMonTransitionOff(struct ConditionGraph *graph, s16 *x);
|
||||
void LoadConditionMonPicTemplate(struct SpriteSheet *sheet, struct SpriteTemplate *template, struct SpritePalette *pal);
|
||||
void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate * template, struct SpritePalette *pals);
|
||||
s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst);
|
||||
|
||||
// Condition sparkles
|
||||
void LoadConditionSparkle(struct SpriteSheet *sheet, struct SpritePalette *pal);
|
||||
void ResetConditionSparkleSprites(struct Sprite **sprites);
|
||||
void CreateConditionSparkleSprites(struct Sprite **sprites, u8 monSpriteId, u8 count);
|
||||
void DestroyConditionSparkleSprites(struct Sprite **sprites);
|
||||
void FreeConditionSparkles(struct Sprite **sprites);
|
||||
|
||||
// Move relearner
|
||||
void MoveRelearnerPrintText(u8 *str);
|
||||
bool16 MoveRelearnerRunTextPrinters(void);
|
||||
void MoveRelearnerCreateYesNoMenu(void);
|
||||
u8 LoadMoveRelearnerMovesList(const struct ListMenuItem *items, u16 numChoices);
|
||||
void InitMoveRelearnerWindows(bool8 useContextWindow);
|
||||
|
||||
// Level up window
|
||||
void DrawLevelUpWindowPg1(u16 windowId, u16 *statsBefore, u16 *statsAfter, u8 bgClr, u8 fgClr, u8 shadowClr);
|
||||
void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgClr, u8 fgClr, u8 shadowClr);
|
||||
void GetMonLevelUpWindowStats(struct Pokemon *mon, u16 *currStats);
|
||||
|
||||
+110
-93
@@ -7,47 +7,51 @@
|
||||
|
||||
typedef u32 (*LoopedTask)(s32 state);
|
||||
|
||||
struct PokenavMonList
|
||||
struct PokenavMonListItem
|
||||
{
|
||||
u8 boxId;
|
||||
u8 monId;
|
||||
u16 data;
|
||||
};
|
||||
|
||||
struct PokenavMatchCallEntries
|
||||
struct PokenavMatchCallEntry
|
||||
{
|
||||
bool8 isSpecialTrainer;
|
||||
u8 mapSec;
|
||||
u16 headerId;
|
||||
};
|
||||
|
||||
struct PokenavListTemplate
|
||||
struct PokenavListItem
|
||||
{
|
||||
union {
|
||||
struct PokenavMonList *monList;
|
||||
struct PokenavMatchCallEntries *matchCallEntries;
|
||||
} list;
|
||||
struct PokenavMonListItem mon;
|
||||
struct PokenavMatchCallEntry call;
|
||||
} item;
|
||||
};
|
||||
|
||||
typedef void (*PokenavListBufferItemFunc)(struct PokenavListItem *, u8 *);
|
||||
|
||||
struct PokenavListTemplate
|
||||
{
|
||||
struct PokenavListItem * list;
|
||||
u16 count;
|
||||
u16 unk6;
|
||||
u8 unk8;
|
||||
u16 startIndex;
|
||||
u8 itemSize;
|
||||
u8 item_X;
|
||||
u8 windowWidth;
|
||||
u8 listTop;
|
||||
u8 maxShowed;
|
||||
u8 fillValue;
|
||||
u8 fontId;
|
||||
union {
|
||||
void (*printMonFunc)(struct PokenavMonList *item, u8 *dest);
|
||||
void (*unk10_2)(struct PokenavMatchCallEntries *, u8 *a1);
|
||||
} listFunc;
|
||||
void (*unk14)(u16 a0, u32 a1, u32 a2);
|
||||
PokenavListBufferItemFunc bufferItemFunc;
|
||||
void (*iconDrawFunc)(u16 windowId, u32 listItemId, u32 baseTile);
|
||||
};
|
||||
|
||||
struct PokenavSub18
|
||||
struct PokenavMonList
|
||||
{
|
||||
u16 listCount;
|
||||
u16 currIndex;
|
||||
struct PokenavMonList monData[TOTAL_BOXES_COUNT * IN_BOX_COUNT + PARTY_SIZE];
|
||||
struct PokenavMonListItem monData[TOTAL_BOXES_COUNT * IN_BOX_COUNT + PARTY_SIZE];
|
||||
};
|
||||
|
||||
// Return values of LoopedTask functions.
|
||||
@@ -65,27 +69,26 @@ enum
|
||||
POKENAV_MODE_FORCE_CALL_EXIT, // Pokenav tutorial after calling Mr. Stone
|
||||
};
|
||||
|
||||
// TODO - refine these names
|
||||
enum Substructures
|
||||
enum
|
||||
{
|
||||
POKENAV_SUBSTRUCT_MAIN_MENU,
|
||||
POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER,
|
||||
POKENAV_SUBSTRUCT_MENU_ICONS,
|
||||
POKENAV_SUBSTRUCT_MENU_GFX,
|
||||
POKENAV_SUBSTRUCT_REGION_MAP_STATE,
|
||||
POKENAV_SUBSTRUCT_REGION_MAP_ZOOM,
|
||||
POKENAV_SUBSTRUCT_MATCH_CALL_MAIN,
|
||||
POKENAV_SUBSTRUCT_MATCH_CALL_OPEN,
|
||||
POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS,
|
||||
POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST,
|
||||
POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX,
|
||||
POKENAV_SUBSTRUCT_RIBBONS_MON_LIST,
|
||||
POKENAV_SUBSTRUCT_RIBBONS_MON_MENU,
|
||||
POKENAV_SUBSTRUCT_CONDITION_GRAPH,
|
||||
POKENAV_SUBSTRUCT_MON_MARK_MENU,
|
||||
POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU,
|
||||
POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX,
|
||||
POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST,
|
||||
POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU,
|
||||
POKENAV_SUBSTRUCT_15, //unused
|
||||
POKENAV_SUBSTRUCT_UNUSED,
|
||||
POKENAV_SUBSTRUCT_REGION_MAP,
|
||||
POKENAV_SUBSTRUCT_MATCH_CALL_LIST,
|
||||
POKENAV_SUBSTRUCT_LIST,
|
||||
POKENAV_SUBSTRUCT_MON_LIST,
|
||||
POKENAV_SUBSTRUCT_COUNT,
|
||||
};
|
||||
@@ -113,21 +116,21 @@ enum
|
||||
#define POKENAV_MENU_IDS_START 100000
|
||||
enum
|
||||
{
|
||||
POKENAV_MAIN_MENU = POKENAV_MENU_IDS_START,
|
||||
POKENAV_MAIN_MENU = POKENAV_MENU_IDS_START, // The main menu where the player selects Hoenn Map/Condition/Match Call/Ribbons
|
||||
POKENAV_MAIN_MENU_CURSOR_ON_MAP,
|
||||
POKENAV_CONDITION_MENU,
|
||||
POKENAV_CONDITION_SEARCH_MENU,
|
||||
POKENAV_CONDITION_MENU, // The first Condition screen where the player selects Party or Search
|
||||
POKENAV_CONDITION_SEARCH_MENU, // The Condition search menu where the player selects a search parameter
|
||||
POKENAV_MAIN_MENU_CURSOR_ON_MATCH_CALL,
|
||||
POKENAV_MAIN_MENU_CURSOR_ON_RIBBONS,
|
||||
POKENAV_REGION_MAP,
|
||||
POKENAV_CONDITION_PARTY,
|
||||
POKENAV_CONDITION_SEARCH_RESULTS,
|
||||
POKENAV_CONDITION_GRAPH_FROM_SEARCH, // opening condition graph from search list
|
||||
POKENAV_RETURN_CONDITION_SEARCH, //return to search list from condition graph
|
||||
POKENAV_CONDITION_GRAPH_PARTY, // The Condition graph screen when Party has been selected
|
||||
POKENAV_CONDITION_SEARCH_RESULTS, // The list of results from a Condition search
|
||||
POKENAV_CONDITION_GRAPH_SEARCH, // The Condition graph screen when a search result has been selected
|
||||
POKENAV_RETURN_CONDITION_SEARCH, // Exited the graph screen back to the list of Condition search results
|
||||
POKENAV_MATCH_CALL,
|
||||
POKENAV_RIBBONS_MON_LIST,
|
||||
POKENAV_RIBBONS_SUMMARY_SCREEN,
|
||||
POKENAV_RIBBONS_RETURN_TO_MON_LIST,
|
||||
POKENAV_RIBBONS_MON_LIST, // The list of Pokémon with ribbons
|
||||
POKENAV_RIBBONS_SUMMARY_SCREEN, // The ribbon summary screen shown when a Pokémon has been selected
|
||||
POKENAV_RIBBONS_RETURN_TO_MON_LIST, // Exited the summary screen back to the ribbon list
|
||||
};
|
||||
|
||||
enum
|
||||
@@ -245,15 +248,22 @@ enum RegionMapFuncIds
|
||||
POKENAV_MENU_FUNC_OPEN_FEATURE,
|
||||
};
|
||||
|
||||
enum PartyConditionFuncIds
|
||||
enum
|
||||
{
|
||||
PARTY_CONDITION_FUNC_NONE,
|
||||
PARTY_CONDITION_FUNC_SLIDE_MON_IN,
|
||||
PARTY_CONDITION_FUNC_RETURN,
|
||||
PARTY_CONDITION_FUNC_NO_TRANSITION,
|
||||
PARTY_CONDITION_FUNC_SLIDE_MON_OUT,
|
||||
PARTY_CONDITION_FUNC_ADD_MARKINGS,
|
||||
PARTY_CONDITION_FUNC_CLOSE_MARKINGS,
|
||||
CONDITION_FUNC_NONE,
|
||||
CONDITION_FUNC_SLIDE_MON_IN,
|
||||
CONDITION_FUNC_RETURN,
|
||||
CONDITION_FUNC_NO_TRANSITION,
|
||||
CONDITION_FUNC_SLIDE_MON_OUT,
|
||||
CONDITION_FUNC_ADD_MARKINGS,
|
||||
CONDITION_FUNC_CLOSE_MARKINGS,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
CONDITION_LOAD_MON_INFO,
|
||||
CONDITION_LOAD_GRAPH,
|
||||
CONDITION_LOAD_MON_PIC,
|
||||
};
|
||||
|
||||
#define POKENAV_MENU_FUNC_EXIT -1
|
||||
@@ -270,7 +280,7 @@ enum
|
||||
POKENAV_MC_FUNC_CANCEL,
|
||||
POKENAV_MC_FUNC_CALL_MSG,
|
||||
POKENAV_MC_FUNC_NEARBY_MSG,
|
||||
POKENAV_MC_FUNC_10,
|
||||
POKENAV_MC_FUNC_EXIT_CALL,
|
||||
POKENAV_MC_FUNC_SHOW_CHECK_PAGE,
|
||||
POKENAV_MC_FUNC_CHECK_PAGE_UP,
|
||||
POKENAV_MC_FUNC_CHECK_PAGE_DOWN,
|
||||
@@ -287,6 +297,14 @@ enum
|
||||
POKENAV_MAP_FUNC_EXIT,
|
||||
};
|
||||
|
||||
// Modes for PokenavFadeScreen
|
||||
enum {
|
||||
POKENAV_FADE_TO_BLACK,
|
||||
POKENAV_FADE_FROM_BLACK,
|
||||
POKENAV_FADE_TO_BLACK_ALL,
|
||||
POKENAV_FADE_FROM_BLACK_ALL,
|
||||
};
|
||||
|
||||
// pokenav.c
|
||||
void SetSelectedConditionSearch(u32);
|
||||
u32 GetSelectedConditionSearch(void);
|
||||
@@ -305,23 +323,23 @@ bool32 CanViewRibbonsMenu(void);
|
||||
void SetPokenavVBlankCallback(void);
|
||||
void SetVBlankCallback_(IntrCallback callback);
|
||||
|
||||
// pokenav_match_call_ui.c
|
||||
u32 GetSelectedPokenavListIndex(void);
|
||||
bool32 sub_81C8224(void);
|
||||
int MatchCall_MoveCursorUp(void);
|
||||
int MatchCall_MoveCursorDown(void);
|
||||
int MatchCall_PageDown(void);
|
||||
int MatchCall_PageUp(void);
|
||||
bool32 IsMonListLoopedTaskActive(void);
|
||||
void ToggleMatchCallVerticalArrows(bool32 shouldHide);
|
||||
void sub_81C8838(void);
|
||||
void sub_81C877C(void);
|
||||
bool32 IsMatchCallListTaskActive(void);
|
||||
void PrintCheckPageInfo(s16 a0);
|
||||
u32 GetMatchCallListTopIndex(void);
|
||||
void sub_81C87F0(void);
|
||||
bool32 sub_81C81D4(const struct BgTemplate *arg0, struct PokenavListTemplate *arg1, s32 arg2);
|
||||
void sub_81C8234(void);
|
||||
// pokenav_list.c
|
||||
bool32 CreatePokenavList(const struct BgTemplate *bgTemplate, struct PokenavListTemplate *listTemplate, s32 tileOffset);
|
||||
bool32 IsCreatePokenavListTaskActive(void);
|
||||
void DestroyPokenavList(void);
|
||||
u32 PokenavList_GetSelectedIndex(void);
|
||||
int PokenavList_MoveCursorUp(void);
|
||||
int PokenavList_MoveCursorDown(void);
|
||||
int PokenavList_PageDown(void);
|
||||
int PokenavList_PageUp(void);
|
||||
bool32 PokenavList_IsMoveWindowTaskActive(void);
|
||||
void PokenavList_ToggleVerticalArrows(bool32 shouldHide);
|
||||
void PokenavList_DrawCurrentItemIcon(void);
|
||||
void PokenavList_EraseListForCheckPage(void);
|
||||
bool32 PokenavList_IsTaskActive(void);
|
||||
void PrintCheckPageInfo(s16 delta);
|
||||
u32 PokenavList_GetTopIndex(void);
|
||||
void PokenavList_ReshowListFromCheckPage(void);
|
||||
|
||||
// pokenav_match_call_data.c
|
||||
bool32 MatchCall_HasCheckPage(u32 idx);
|
||||
@@ -352,9 +370,9 @@ void SlideMenuHeaderDown(void);
|
||||
bool32 MainMenuLoopedTaskIsBusy(void);
|
||||
void SetLeftHeaderSpritesInvisibility(void);
|
||||
void PokenavCopyPalette(const u16 *a0, const u16 *a1, int a2, int a3, int a4, u16 *palette);
|
||||
void sub_81C7B40(void);
|
||||
struct Sprite *PauseSpinningPokenavSprite(void);
|
||||
void ResumeSpinningPokenavSprite(void);
|
||||
void FadeToBlackExceptPrimary(void);
|
||||
struct Sprite *GetSpinningPokenavSprite(void);
|
||||
void HideSpinningPokenavSprite(void);
|
||||
void UpdateRegionMapRightHeaderTiles(u32 arg0);
|
||||
void HideMainOrSubMenuLeftHeader(u32 id, bool32 onRightSide);
|
||||
void SlideMenuHeaderUp(void);
|
||||
@@ -364,7 +382,7 @@ bool32 WaitForPokenavShutdownFade(void);
|
||||
void SetActiveMenuLoopTasks(void *func1, void *func2);
|
||||
void ShutdownPokenav(void);
|
||||
|
||||
// pokenav_menu_handler_1.c
|
||||
// pokenav_menu_handler.c
|
||||
bool32 PokenavCallback_Init_MainMenuCursorOnMap(void);
|
||||
bool32 PokenavCallback_Init_MainMenuCursorOnMatchCall(void);
|
||||
bool32 PokenavCallback_Init_MainMenuCursorOnRibbons(void);
|
||||
@@ -377,7 +395,7 @@ int GetPokenavCursorPos(void);
|
||||
int GetCurrentMenuItemId(void);
|
||||
u16 GetHelpBarTextId(void);
|
||||
|
||||
// pokenav_menu_handler_2.c
|
||||
// pokenav_menu_handler_gfx.c
|
||||
bool32 OpenPokenavMenuInitial(void);
|
||||
bool32 OpenPokenavMenuNotInitial(void);
|
||||
void CreateMenuHandlerLoopedTask(s32 ltIdx);
|
||||
@@ -385,29 +403,28 @@ bool32 IsMenuHandlerLoopedTaskActive(void);
|
||||
void FreeMenuHandlerSubstruct2(void);
|
||||
void ResetBldCnt_(void);
|
||||
|
||||
// pokenav_match_call_1.c
|
||||
// pokenav_match_call_list.c
|
||||
bool32 PokenavCallback_Init_MatchCall(void);
|
||||
u32 GetMatchCallCallback(void);
|
||||
void FreeMatchCallSubstruct1(void);
|
||||
int sub_81CAE28(void);
|
||||
int IsMatchCallListInitFinished(void);
|
||||
int GetNumberRegistered(void);
|
||||
int sub_81CAE48(void);
|
||||
struct PokenavMatchCallEntries *sub_81CAE94(void);
|
||||
struct PokenavMatchCallEntry *GetMatchCallList(void);
|
||||
u16 GetMatchCallMapSec(int);
|
||||
bool32 ShouldDrawRematchPokeballIcon(int index);
|
||||
void ClearRematchPokeballIcon(u16 windowId, u32 a1);
|
||||
int GetMatchCallTrainerPic(int index);
|
||||
const u8 *GetMatchCallFlavorText(int index, int textType);
|
||||
const u8 *GetMatchCallMessageText(int index, u8 *arg1);
|
||||
const u8 *GetMatchCallMessageText(int index, bool8 *newRematchRequest);
|
||||
u16 GetMatchCallOptionCursorPos(void);
|
||||
u16 GetMatchCallOptionId(int arg0);
|
||||
void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntries * arg0, u8 *str);
|
||||
void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntry * arg0, u8 *str);
|
||||
u8 GetMatchTableMapSectionId(int rematchIndex);
|
||||
int GetIndexDeltaOfNextCheckPageDown(int index);
|
||||
int GetIndexDeltaOfNextCheckPageUp(int index);
|
||||
bool32 IsRematchEntryRegistered(int index);
|
||||
|
||||
// pokenav_match_call_2.c
|
||||
// pokenav_match_call_gfx.c
|
||||
bool32 OpenMatchCall(void);
|
||||
void CreateMatchCallLoopedTask(s32 index);
|
||||
bool32 IsMatchCallLoopedTaskActive(void);
|
||||
@@ -422,33 +439,33 @@ bool32 IsRegionMapLoopedTaskActive(void);
|
||||
void FreeRegionMapSubstruct1(void);
|
||||
void FreeRegionMapSubstruct2(void);
|
||||
|
||||
// pokenav_conditions_1.c
|
||||
u32 PokenavCallback_Init_PartyCondition(void);
|
||||
u32 PokenavCallback_Init_ConditionGraphFromSearch(void);
|
||||
u32 GetPartyConditionCallback(void);
|
||||
void FreePartyConditionSubstruct1(void);
|
||||
bool32 LoadPartyConditionMenuGfx(void);
|
||||
// pokenav_conditions.c
|
||||
u32 PokenavCallback_Init_ConditionGraph_Party(void);
|
||||
u32 PokenavCallback_Init_ConditionGraph_Search(void);
|
||||
u32 GetConditionGraphMenuCallback(void);
|
||||
void FreeConditionGraphMenuSubstruct1(void);
|
||||
bool32 LoadConditionGraphMenuGfx(void);
|
||||
bool32 IsConditionMenuSearchMode(void);
|
||||
struct ConditionGraph *GetConditionGraphDataPtr(void);
|
||||
u16 GetConditionGraphCurrentMonIndex(void);
|
||||
struct ConditionGraph *GetConditionGraphPtr(void);
|
||||
u16 GetConditionGraphCurrentListIndex(void);
|
||||
u16 GetMonListCount(void);
|
||||
u8 GetMonSheen(void);
|
||||
bool32 SetConditionGraphData(u8 arg0);
|
||||
u8 GetNumConditionMonSparkles(void);
|
||||
bool32 LoadNextConditionMenuMonData(u8 mode);
|
||||
u8 TryGetMonMarkId(void);
|
||||
u8 *GetConditionMonNameBuffer(u8 id);
|
||||
u8 *GetConditionMonLocationBuffer(u8 id);
|
||||
u8 *GetConditionMonNameText(u8 id);
|
||||
u8 *GetConditionMonLocationText(u8 id);
|
||||
u16 GetConditionMonDataBuffer(void);
|
||||
void *GetConditionMonPicGfx(u8 id);
|
||||
void *GetConditionMonPal(u8 id);
|
||||
|
||||
// pokenav_conditions_2.c
|
||||
bool32 OpenPartyConditionMenu(void);
|
||||
void CreatePartyConditionLoopedTask(s32);
|
||||
u32 IsPartyConditionLoopedTaskActive(void);
|
||||
void FreePartyConditionSubstruct2(void);
|
||||
// pokenav_conditions_gfx.c
|
||||
bool32 OpenConditionGraphMenu(void);
|
||||
void CreateConditionGraphMenuLoopedTask(s32);
|
||||
u32 IsConditionGraphMenuLoopedTaskActive(void);
|
||||
void FreeConditionGraphMenuSubstruct2(void);
|
||||
u8 GetMonMarkingsData(void);
|
||||
|
||||
// pokenav_conditions_3.c
|
||||
// pokenav_conditions_search_results.c
|
||||
u32 PokenavCallback_Init_ConditionSearch(void);
|
||||
u32 PokenavCallback_Init_ReturnToMonSearchList(void);
|
||||
u32 GetConditionSearchResultsCallback(void);
|
||||
@@ -459,18 +476,18 @@ void CreateSearchResultsLoopedTask(s32);
|
||||
u32 IsSearchResultLoopedTaskActive(void);
|
||||
void FreeSearchResultSubstruct2(void);
|
||||
|
||||
// pokenav_ribbons_1.c
|
||||
// pokenav_ribbons_list.c
|
||||
u32 PokenavCallback_Init_MonRibbonList(void);
|
||||
u32 PokenavCallback_Init_RibbonsMonListFromSummary(void);
|
||||
u32 GetRibbonsMonListCallback(void);
|
||||
void FreeRibbonsMonList1(void);
|
||||
void FreeRibbonsMonList(void);
|
||||
bool32 OpenRibbonsMonList(void);
|
||||
bool32 OpenRibbonsMonListFromRibbonsSummary(void);
|
||||
void CreateRibbonsMonListLoopedTask(s32);
|
||||
u32 IsRibbonsMonListLoopedTaskActive(void);
|
||||
void FreeRibbonsMonList2(void);
|
||||
void FreeRibbonsMonMenu(void);
|
||||
|
||||
// pokenav_ribbons_2.c
|
||||
// pokenav_ribbons_summary.c
|
||||
u32 PokenavCallback_Init_RibbonsSummaryMenu(void);
|
||||
u32 GetRibbonsSummaryMenuCallback(void);
|
||||
void FreeRibbonsSummaryScreen1(void);
|
||||
|
||||
+2
-2
@@ -2978,8 +2978,8 @@ extern const u8 gText_FindToughPokemon[];
|
||||
extern const u8 gText_ReturnToConditionMenu[];
|
||||
extern const u8 gText_NoRibbonWinners[];
|
||||
|
||||
// Pokenav Ribbons
|
||||
extern const u8 gText_NumberF700[];
|
||||
// Pokenav
|
||||
extern const u8 gText_NumberIndex[];
|
||||
extern const u8 gText_RibbonsF700[];
|
||||
|
||||
// use_pokeblock
|
||||
|
||||
+19
-19
@@ -312,17 +312,17 @@ SECTIONS {
|
||||
src/battle_pyramid_bag.o(.text);
|
||||
src/pokenav.o(.text);
|
||||
src/pokenav_main_menu.o(.text);
|
||||
src/pokenav_match_call_ui.o(.text);
|
||||
src/pokenav_menu_handler_1.o(.text);
|
||||
src/pokenav_menu_handler_2.o(.text);
|
||||
src/pokenav_match_call_1.o(.text);
|
||||
src/pokenav_match_call_2.o(.text);
|
||||
src/pokenav_list.o(.text);
|
||||
src/pokenav_menu_handler.o(.text);
|
||||
src/pokenav_menu_handler_gfx.o(.text);
|
||||
src/pokenav_match_call_list.o(.text);
|
||||
src/pokenav_match_call_gfx.o(.text);
|
||||
src/pokenav_region_map.o(.text);
|
||||
src/pokenav_conditions_1.o(.text);
|
||||
src/pokenav_conditions_2.o(.text);
|
||||
src/pokenav_conditions_3.o(.text);
|
||||
src/pokenav_ribbons_1.o(.text);
|
||||
src/pokenav_ribbons_2.o(.text);
|
||||
src/pokenav_conditions.o(.text);
|
||||
src/pokenav_conditions_gfx.o(.text);
|
||||
src/pokenav_conditions_search_results.o(.text);
|
||||
src/pokenav_ribbons_list.o(.text);
|
||||
src/pokenav_ribbons_summary.o(.text);
|
||||
src/pokenav_match_call_data.o(.text);
|
||||
src/menu_specialized.o(.text);
|
||||
src/ereader_helpers.o(.text);
|
||||
@@ -669,16 +669,16 @@ SECTIONS {
|
||||
src/battle_pyramid_bag.o(.rodata);
|
||||
src/pokenav.o(.rodata);
|
||||
src/pokenav_main_menu.o(.rodata);
|
||||
src/pokenav_match_call_ui.o(.rodata);
|
||||
src/pokenav_menu_handler_1.o(.rodata);
|
||||
src/pokenav_menu_handler_2.o(.rodata);
|
||||
src/pokenav_match_call_1.o(.rodata);
|
||||
src/pokenav_match_call_2.o(.rodata);
|
||||
src/pokenav_list.o(.rodata);
|
||||
src/pokenav_menu_handler.o(.rodata);
|
||||
src/pokenav_menu_handler_gfx.o(.rodata);
|
||||
src/pokenav_match_call_list.o(.rodata);
|
||||
src/pokenav_match_call_gfx.o(.rodata);
|
||||
src/pokenav_region_map.o(.rodata);
|
||||
src/pokenav_conditions_2.o(.rodata);
|
||||
src/pokenav_conditions_3.o(.rodata);
|
||||
src/pokenav_ribbons_1.o(.rodata);
|
||||
src/pokenav_ribbons_2.o(.rodata);
|
||||
src/pokenav_conditions_gfx.o(.rodata);
|
||||
src/pokenav_conditions_search_results.o(.rodata);
|
||||
src/pokenav_ribbons_list.o(.rodata);
|
||||
src/pokenav_ribbons_summary.o(.rodata);
|
||||
src/pokenav_match_call_data.o(.rodata);
|
||||
src/menu_specialized.o(.rodata);
|
||||
src/ereader_helpers.o(.rodata);
|
||||
|
||||
@@ -2404,12 +2404,12 @@ void AnimTask_SketchDrawMon(u8 taskId)
|
||||
if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)
|
||||
{
|
||||
task->data[6] = gBattle_BG1_X;
|
||||
params.dmaDest = (u16 *)REG_ADDR_BG1HOFS;
|
||||
params.dmaDest = ®_BG1HOFS;
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[6] = gBattle_BG2_X;
|
||||
params.dmaDest = (u16 *)REG_ADDR_BG2HOFS;
|
||||
params.dmaDest = ®_BG2HOFS;
|
||||
}
|
||||
|
||||
for (i = task->data[0] - 0x40; i <= task->data[0]; i++)
|
||||
@@ -3259,9 +3259,9 @@ void AnimTask_HeartsBackground(u8 taskId)
|
||||
SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
|
||||
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
|
||||
GetBattleAnimBg1Data(&animBg);
|
||||
AnimLoadCompressedBgGfx(animBg.bgId, &gBattleAnimBgImage_Attract, animBg.tilesOffset);
|
||||
AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_Attract, FALSE);
|
||||
LoadCompressedPalette(&gBattleAnimBgPalette_Attract, animBg.paletteId * 16, 32);
|
||||
AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_Attract, animBg.tilesOffset);
|
||||
AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimBgTilemap_Attract, FALSE);
|
||||
LoadCompressedPalette(gBattleAnimBgPalette_Attract, animBg.paletteId * 16, 32);
|
||||
gTasks[taskId].func = AnimTask_HeartsBackground_Step;
|
||||
}
|
||||
|
||||
|
||||
@@ -653,9 +653,9 @@ static void AnimTask_SpiteTargetShadow_Step1(u8 taskId)
|
||||
startLine = 0;
|
||||
|
||||
if (position == 1)
|
||||
task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 4, 1);
|
||||
task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, SCANLINE_EFFECT_REG_BG1HOFS, 1);
|
||||
else
|
||||
task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 8, 1);
|
||||
task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, SCANLINE_EFFECT_REG_BG2HOFS, 1);
|
||||
|
||||
task->data[15]++;
|
||||
break;
|
||||
|
||||
@@ -960,7 +960,7 @@ static void AnimTask_SurfWaveScanlineEffect(u8 taskId)
|
||||
else
|
||||
gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2];
|
||||
|
||||
params.dmaDest = (vu16 *)REG_ADDR_BLDALPHA;
|
||||
params.dmaDest = ®_BLDALPHA;
|
||||
params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
|
||||
params.initState = 1;
|
||||
params.unused9 = 0;
|
||||
|
||||
+1
-1
@@ -870,7 +870,7 @@ static const struct WindowTemplate sInfoCardWindowTemplates[] =
|
||||
|
||||
static const struct ScanlineEffectParams sTourneyTreeScanlineEffectParams =
|
||||
{
|
||||
.dmaDest = (void *)REG_ADDR_BG3CNT,
|
||||
.dmaDest = ®_BG3CNT,
|
||||
.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT,
|
||||
.initState = 1,
|
||||
};
|
||||
|
||||
+2
-2
@@ -249,13 +249,13 @@ u8 gBattleControllerData[MAX_BATTLERS_COUNT]; // Used by the battle controllers
|
||||
|
||||
static const struct ScanlineEffectParams sIntroScanlineParams16Bit =
|
||||
{
|
||||
(void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_16BIT, 1
|
||||
®_BG3HOFS, SCANLINE_EFFECT_DMACNT_16BIT, 1
|
||||
};
|
||||
|
||||
// unused
|
||||
static const struct ScanlineEffectParams sIntroScanlineParams32Bit =
|
||||
{
|
||||
(void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_32BIT, 1
|
||||
®_BG3HOFS, SCANLINE_EFFECT_DMACNT_32BIT, 1
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnusedBattleInitSprite =
|
||||
|
||||
+5
-1
@@ -8,7 +8,11 @@
|
||||
// For printing braille messages, see ScrCmd_braillemessage
|
||||
|
||||
ALIGNED(4)
|
||||
static const u8 sScrollDistances[] = {1, 2, 4};
|
||||
static const u8 sScrollDistances[] = {
|
||||
[OPTIONS_TEXT_SPEED_SLOW] = 1,
|
||||
[OPTIONS_TEXT_SPEED_MID] = 2,
|
||||
[OPTIONS_TEXT_SPEED_FAST] = 4,
|
||||
};
|
||||
static const u16 sFont_Braille[] = INCBIN_U16("graphics/fonts/braille.fwjpnfont");
|
||||
|
||||
static void DecompressGlyph_Braille(u16);
|
||||
|
||||
@@ -55,7 +55,7 @@ const s32 gMaxFlashLevel = ARRAY_COUNT(sFlashLevelToRadius) - 1;
|
||||
|
||||
const struct ScanlineEffectParams sFlashEffectParams =
|
||||
{
|
||||
(void *)REG_ADDR_WIN0H,
|
||||
®_WIN0H,
|
||||
((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
|
||||
1
|
||||
};
|
||||
|
||||
+2
-2
@@ -1848,7 +1848,7 @@ static void Task_Scene3_StartGroudon(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].tState = 0;
|
||||
gTasks[taskId].func = Task_Scene3_Groudon;
|
||||
ScanlineEffect_InitWave(0, 160, 4, 4, 1, 4, 0);
|
||||
ScanlineEffect_InitWave(0, 160, 4, 4, 1, SCANLINE_EFFECT_REG_BG1HOFS, 0);
|
||||
}
|
||||
|
||||
#define tScreenX data[1]
|
||||
@@ -2058,7 +2058,7 @@ static void Task_Scene3_LoadKyogre(u8 taskId)
|
||||
gTasks[taskId].tDelay = 16;
|
||||
gTasks[taskId].tZoom = 256;
|
||||
PanFadeAndZoomScreen(gTasks[taskId].tScreenX, gTasks[taskId].tScreenY, gTasks[taskId].tZoom, 0);
|
||||
ScanlineEffect_InitWave(0, 0xA0, 4, 4, 1, 6, 0);
|
||||
ScanlineEffect_InitWave(0, 0xA0, 4, 4, 1, SCANLINE_EFFECT_REG_BG1VOFS, 0);
|
||||
}
|
||||
|
||||
static void Task_Scene3_Kyogre(u8 taskId)
|
||||
|
||||
+5
-5
@@ -31,7 +31,7 @@ void AGBPrintFlush1Block(void);
|
||||
void AGBPrintInit(void)
|
||||
{
|
||||
volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
|
||||
u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
|
||||
u16 *pWSCNT = ®_WAITCNT;
|
||||
u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
|
||||
u16 nOldWSCNT = *pWSCNT;
|
||||
*pWSCNT = WSCNT_DATA;
|
||||
@@ -57,7 +57,7 @@ static void AGBPutcInternal(const char cChr)
|
||||
|
||||
void AGBPutc(const char cChr)
|
||||
{
|
||||
u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
|
||||
u16 *pWSCNT = ®_WAITCNT;
|
||||
u16 nOldWSCNT = *pWSCNT;
|
||||
volatile struct AGBPrintStruct *pPrint;
|
||||
*pWSCNT = WSCNT_DATA;
|
||||
@@ -71,7 +71,7 @@ void AGBPutc(const char cChr)
|
||||
void AGBPrint(const char *pBuf)
|
||||
{
|
||||
volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
|
||||
u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
|
||||
u16 *pWSCNT = ®_WAITCNT;
|
||||
u16 nOldWSCNT = *pWSCNT;
|
||||
*pWSCNT = WSCNT_DATA;
|
||||
while (*pBuf)
|
||||
@@ -105,9 +105,9 @@ static void AGBPrintTransferDataInternal(u32 bAllData)
|
||||
pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
|
||||
pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
|
||||
lpfnFuncFlush = (LPFN_PRINT_FLUSH)AGB_PRINT_FLUSH_ADDR;
|
||||
pIME = (u16 *)REG_ADDR_IME;
|
||||
pIME = ®_IME;
|
||||
nIME = *pIME;
|
||||
pWSCNT = (u16 *)REG_ADDR_WAITCNT;
|
||||
pWSCNT = ®_WAITCNT;
|
||||
nOldWSCNT = *pWSCNT;
|
||||
*pIME = nIME & ~1;
|
||||
*pWSCNT = WSCNT_DATA;
|
||||
|
||||
+2
-2
@@ -336,8 +336,8 @@ static u16 handshake_wait(u16 slot)
|
||||
|
||||
static void STWI_set_timer_in_RAM(u8 count)
|
||||
{
|
||||
vu16* regTMCNTL = (vu16*)(REG_ADDR_TMCNT_L + gSTWIStatus->timerSelect * 4);
|
||||
vu16* regTMCNTH = (vu16*)(REG_ADDR_TMCNT_H + gSTWIStatus->timerSelect * 4);
|
||||
vu16* regTMCNTL = ®_TMCNT_L(gSTWIStatus->timerSelect);
|
||||
vu16* regTMCNTH = ®_TMCNT_H(gSTWIStatus->timerSelect);
|
||||
REG_IME = 0;
|
||||
switch (count)
|
||||
{
|
||||
|
||||
+7
-7
@@ -1186,10 +1186,10 @@ static void StartMatchCall(void)
|
||||
CreateTask(ExecuteMatchCall, 1);
|
||||
}
|
||||
|
||||
static const u16 sMatchCallWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call_window.gbapal");
|
||||
static const u8 sMatchCallWindow_Gfx[] = INCBIN_U8("graphics/pokenav/match_call_window.4bpp");
|
||||
static const u16 sPokenavIcon_Pal[] = INCBIN_U16("graphics/pokenav/icon.gbapal");
|
||||
static const u32 sPokenavIcon_Gfx[] = INCBIN_U32("graphics/pokenav/icon.4bpp.lz");
|
||||
static const u16 sMatchCallWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call/window.gbapal");
|
||||
static const u8 sMatchCallWindow_Gfx[] = INCBIN_U8("graphics/pokenav/match_call/window.4bpp");
|
||||
static const u16 sPokenavIcon_Pal[] = INCBIN_U16("graphics/pokenav/match_call/nav_icon.gbapal");
|
||||
static const u32 sPokenavIcon_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/nav_icon.4bpp.lz");
|
||||
|
||||
static const u8 sText_PokenavCallEllipsis[] = _("………………\p");
|
||||
|
||||
@@ -1498,7 +1498,7 @@ bool32 SelectMatchCallMessage(int trainerId, u8 *str)
|
||||
{
|
||||
u32 matchCallId;
|
||||
const struct MatchCallText *matchCallText;
|
||||
bool32 retVal = FALSE;
|
||||
bool32 newRematchRequest = FALSE;
|
||||
|
||||
matchCallId = GetTrainerMatchCallId(trainerId);
|
||||
sBattleFrontierStreakInfo.facilityId = 0;
|
||||
@@ -1516,7 +1516,7 @@ bool32 SelectMatchCallMessage(int trainerId, u8 *str)
|
||||
else if (ShouldTrainerRequestBattle(matchCallId))
|
||||
{
|
||||
matchCallText = GetDifferentRouteMatchCallText(matchCallId, str);
|
||||
retVal = TRUE;
|
||||
newRematchRequest = TRUE;
|
||||
UpdateRematchIfDefeated(matchCallId);
|
||||
}
|
||||
else if (Random() % 3)
|
||||
@@ -1531,7 +1531,7 @@ bool32 SelectMatchCallMessage(int trainerId, u8 *str)
|
||||
}
|
||||
|
||||
BuildMatchCallString(matchCallId, matchCallText, str);
|
||||
return retVal;
|
||||
return newRematchRequest;
|
||||
}
|
||||
|
||||
static int GetTrainerMatchCallId(int trainerId)
|
||||
|
||||
+276
-254
@@ -31,14 +31,14 @@ extern const struct CompressedSpriteSheet gMonFrontPicTable[];
|
||||
EWRAM_DATA static u8 sMailboxWindowIds[MAILBOXWIN_COUNT] = {0};
|
||||
EWRAM_DATA static struct ListMenuItem *sMailboxList = NULL;
|
||||
|
||||
static void MailboxMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);
|
||||
static void sub_81D24A4(struct ConditionGraph *a0);
|
||||
static void sub_81D2634(struct ConditionGraph *a0);
|
||||
static void MoveRelearnerCursorCallback(s32 itemIndex, bool8 onInit, struct ListMenu *list);
|
||||
static void nullsub_79(void);
|
||||
static void SetNextConditionSparkle(struct Sprite *sprite);
|
||||
static void SpriteCB_ConditionSparkle(struct Sprite *sprite);
|
||||
static void ShowAllConditionSparkles(struct Sprite *sprite);
|
||||
static void MailboxMenu_MoveCursorFunc(s32, bool8, struct ListMenu *);
|
||||
static void ConditionGraph_CalcRightHalf(struct ConditionGraph *);
|
||||
static void ConditionGraph_CalcLeftHalf(struct ConditionGraph *);
|
||||
static void MoveRelearnerCursorCallback(s32, bool8, struct ListMenu *);
|
||||
static void MoveRelearnerDummy(void);
|
||||
static void SetNextConditionSparkle(struct Sprite *);
|
||||
static void SpriteCB_ConditionSparkle(struct Sprite *);
|
||||
static void ShowAllConditionSparkles(struct Sprite *);
|
||||
|
||||
static const struct WindowTemplate sWindowTemplates_MailboxMenu[MAILBOXWIN_COUNT] =
|
||||
{
|
||||
@@ -80,46 +80,29 @@ static const u8 sEmptyItemName[] = _("");
|
||||
|
||||
static const struct ScanlineEffectParams sConditionGraphScanline =
|
||||
{
|
||||
.dmaDest = (void*)REG_ADDR_WIN0H,
|
||||
.dmaDest = ®_WIN0H,
|
||||
.dmaControl = SCANLINE_EFFECT_DMACNT_32BIT,
|
||||
.initState = 1,
|
||||
};
|
||||
|
||||
static const u8 sUnknown_08625410[] =
|
||||
static const u8 sConditionToLineLength[MAX_CONDITION + 1] =
|
||||
{
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9, 9,
|
||||
10, 10,
|
||||
0xB, 0xB,
|
||||
0xC, 0xC,
|
||||
0xD, 0xD,
|
||||
0xD, 0xD,
|
||||
0xE, 0xE, 0xE, 0xE,
|
||||
0xF, 0xF, 0xF, 0xF,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
|
||||
0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
|
||||
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
|
||||
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,
|
||||
0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
|
||||
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
|
||||
0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
|
||||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
||||
0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
|
||||
0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
||||
0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,
|
||||
0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
|
||||
0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D,
|
||||
0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
|
||||
0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21,
|
||||
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
|
||||
0x23
|
||||
4, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13,
|
||||
13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17,
|
||||
17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19,
|
||||
19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21,
|
||||
21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23,
|
||||
23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
||||
24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26,
|
||||
26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27,
|
||||
27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
|
||||
29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
|
||||
30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
|
||||
31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
|
||||
32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33,
|
||||
33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34,
|
||||
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35
|
||||
};
|
||||
|
||||
|
||||
@@ -207,6 +190,10 @@ static const struct ListMenuTemplate sMoveRelearnerMovesListTemplate =
|
||||
.cursorKind = 0
|
||||
};
|
||||
|
||||
//--------------
|
||||
// Mailbox menu
|
||||
//--------------
|
||||
|
||||
bool8 MailboxMenu_Alloc(u8 count)
|
||||
{
|
||||
u8 i;
|
||||
@@ -320,67 +307,83 @@ void MailboxMenu_Free(void)
|
||||
Free(sMailboxList);
|
||||
}
|
||||
|
||||
void InitConditionGraphData(struct ConditionGraph *graph)
|
||||
//---------------------------------------
|
||||
// Condition graph
|
||||
//
|
||||
// This is the graph in the Pokénav and
|
||||
// Pokéblock case that shows a Pokémon's
|
||||
// conditions (Beauty, Tough, etc.).
|
||||
// It works by using scanlines to
|
||||
// selectively reveal a bg that has been
|
||||
// filled with the graph color.
|
||||
//---------------------------------------
|
||||
|
||||
#define SHIFT_RIGHT_ADJUSTED(n, s)(((n) >> (s)) + (((n) >> ((s) - 1)) & 1))
|
||||
|
||||
void ConditionGraph_Init(struct ConditionGraph *graph)
|
||||
{
|
||||
u8 i, j;
|
||||
|
||||
for (j = 0; j < FLAVOR_COUNT; j++)
|
||||
for (j = 0; j < CONDITION_COUNT; j++)
|
||||
{
|
||||
for (i = 0; i < 10; i++)
|
||||
for (i = 0; i < CONDITION_GRAPH_UPDATE_STEPS; i++)
|
||||
{
|
||||
graph->unk64[i][j].unk0 = 0;
|
||||
graph->unk64[i][j].unk2 = 0;
|
||||
}
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
graph->stat[i][j] = 0;
|
||||
graph->unk14[i][j].unk0 = 155;
|
||||
graph->unk14[i][j].unk2 = 91;
|
||||
graph->newPositions[i][j].x = 0;
|
||||
graph->newPositions[i][j].y = 0;
|
||||
}
|
||||
|
||||
graph->unk12C[j].unk0 = 0;
|
||||
graph->unk12C[j].unk2 = 0;
|
||||
for (i = 0; i < CONDITION_GRAPH_LOAD_MAX; i++)
|
||||
{
|
||||
graph->conditions[i][j] = 0;
|
||||
graph->savedPositions[i][j].x = CONDITION_GRAPH_CENTER_X;
|
||||
graph->savedPositions[i][j].y = CONDITION_GRAPH_CENTER_Y;
|
||||
}
|
||||
|
||||
graph->curPositions[j].x = 0;
|
||||
graph->curPositions[j].y = 0;
|
||||
}
|
||||
|
||||
graph->unk354 = 0;
|
||||
graph->unk352 = 0;
|
||||
graph->needsDraw = FALSE;
|
||||
graph->updateCounter = 0;
|
||||
}
|
||||
|
||||
void sub_81D1F84(struct ConditionGraph *graph, struct UnknownSubStruct_81D1ED4 *arg1, struct UnknownSubStruct_81D1ED4 *arg2)
|
||||
// Fills the newPositions array with incremental positions between
|
||||
// old and new for the graph transition when switching between Pokémon.
|
||||
void ConditionGraph_SetNewPositions(struct ConditionGraph *graph, struct UCoords16 *old, struct UCoords16 *new)
|
||||
{
|
||||
u16 i, j;
|
||||
s32 r5, r6;
|
||||
s32 coord, increment;
|
||||
|
||||
for (i = 0; i < FLAVOR_COUNT; i++)
|
||||
for (i = 0; i < CONDITION_COUNT; i++)
|
||||
{
|
||||
r5 = arg1[i].unk0 << 8;
|
||||
r6 = ((arg2[i].unk0 - arg1[i].unk0) << 8) / 10;
|
||||
for (j = 0; j < 9; j++)
|
||||
coord = old[i].x << 8;
|
||||
increment = ((new[i].x - old[i].x) << 8) / CONDITION_GRAPH_UPDATE_STEPS;
|
||||
for (j = 0; j < CONDITION_GRAPH_UPDATE_STEPS - 1; j++)
|
||||
{
|
||||
graph->unk64[j][i].unk0 = (r5 >> 8) + ((r5 >> 7) & 1);
|
||||
r5 += r6;
|
||||
graph->newPositions[j][i].x = SHIFT_RIGHT_ADJUSTED(coord, 8);
|
||||
coord += increment;
|
||||
}
|
||||
graph->unk64[j][i].unk0 = arg2[i].unk0;
|
||||
graph->newPositions[j][i].x = new[i].x;
|
||||
|
||||
r5 = arg1[i].unk2 << 8;
|
||||
r6 = ((arg2[i].unk2 - arg1[i].unk2) << 8) / 10;
|
||||
for (j = 0; j < 9; j++)
|
||||
coord = old[i].y << 8;
|
||||
increment = ((new[i].y - old[i].y) << 8) / CONDITION_GRAPH_UPDATE_STEPS;
|
||||
for (j = 0; j < CONDITION_GRAPH_UPDATE_STEPS - 1; j++)
|
||||
{
|
||||
graph->unk64[j][i].unk2 = (r5 >> 8) + ((r5 >> 7) & 1);
|
||||
r5 += r6;
|
||||
graph->newPositions[j][i].y = SHIFT_RIGHT_ADJUSTED(coord, 8);
|
||||
coord += increment;
|
||||
}
|
||||
graph->unk64[j][i].unk2 = arg2[i].unk2;
|
||||
graph->newPositions[j][i].y = new[i].y;
|
||||
}
|
||||
|
||||
graph->unk352 = 0;
|
||||
graph->updateCounter = 0;
|
||||
}
|
||||
|
||||
bool32 TransitionConditionGraph(struct ConditionGraph *graph)
|
||||
bool8 ConditionGraph_TryUpdate(struct ConditionGraph *graph)
|
||||
{
|
||||
if (graph->unk352 < 10)
|
||||
if (graph->updateCounter < CONDITION_GRAPH_UPDATE_STEPS)
|
||||
{
|
||||
sub_81D2230(graph);
|
||||
return (++graph->unk352 != 10);
|
||||
ConditionGraph_Update(graph);
|
||||
return (++graph->updateCounter != CONDITION_GRAPH_UPDATE_STEPS);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -388,294 +391,316 @@ bool32 TransitionConditionGraph(struct ConditionGraph *graph)
|
||||
}
|
||||
}
|
||||
|
||||
void InitConditionGraphState(struct ConditionGraph *graph)
|
||||
void ConditionGraph_InitResetScanline(struct ConditionGraph *graph)
|
||||
{
|
||||
graph->state = 0;
|
||||
graph->scanlineResetState = 0;
|
||||
}
|
||||
|
||||
bool8 SetupConditionGraphScanlineParams(struct ConditionGraph *graph)
|
||||
bool8 ConditionGraph_ResetScanline(struct ConditionGraph *graph)
|
||||
{
|
||||
struct ScanlineEffectParams params;
|
||||
|
||||
switch (graph->state)
|
||||
switch (graph->scanlineResetState)
|
||||
{
|
||||
case 0:
|
||||
ScanlineEffect_Clear();
|
||||
graph->state++;
|
||||
graph->scanlineResetState++;
|
||||
return TRUE;
|
||||
case 1:
|
||||
params = sConditionGraphScanline;
|
||||
ScanlineEffect_SetParams(params);
|
||||
graph->state++;
|
||||
graph->scanlineResetState++;
|
||||
return FALSE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_81D2108(struct ConditionGraph *graph)
|
||||
void ConditionGraph_Draw(struct ConditionGraph *graph)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
if (graph->unk354 == 0)
|
||||
if (!graph->needsDraw)
|
||||
return;
|
||||
|
||||
sub_81D24A4(graph);
|
||||
sub_81D2634(graph);
|
||||
ConditionGraph_CalcRightHalf(graph);
|
||||
ConditionGraph_CalcLeftHalf(graph);
|
||||
|
||||
for (i = 0; i < 66; i++)
|
||||
for (i = 0; i < CONDITION_GRAPH_HEIGHT; i++)
|
||||
{
|
||||
gScanlineEffectRegBuffers[1][(i + 55) * 2] = gScanlineEffectRegBuffers[0][(i + 55) * 2] = (graph->unk140[i][0] << 8) | (graph->unk140[i][1]);
|
||||
gScanlineEffectRegBuffers[1][(i + 55) * 2 + 1] = gScanlineEffectRegBuffers[0][(i + 55) * 2 + 1] = (graph->unk248[i][0] << 8) | (graph->unk248[i][1]);
|
||||
// Draw right half
|
||||
gScanlineEffectRegBuffers[1][(i + CONDITION_GRAPH_TOP_Y - 1) * 2 + 0] = // double assignment
|
||||
gScanlineEffectRegBuffers[0][(i + CONDITION_GRAPH_TOP_Y - 1) * 2 + 0] = (graph->scanlineRight[i][0] << 8) | (graph->scanlineRight[i][1]);
|
||||
// Draw left half
|
||||
gScanlineEffectRegBuffers[1][(i + CONDITION_GRAPH_TOP_Y - 1) * 2 + 1] = // double assignment
|
||||
gScanlineEffectRegBuffers[0][(i + CONDITION_GRAPH_TOP_Y - 1) * 2 + 1] = (graph->scanlineLeft[i][0] << 8) | (graph->scanlineLeft[i][1]);
|
||||
}
|
||||
|
||||
graph->unk354 = 0;
|
||||
graph->needsDraw = FALSE;
|
||||
}
|
||||
|
||||
void SetConditionGraphIOWindows(u8 bg)
|
||||
void ConditionGraph_InitWindow(u8 bg)
|
||||
{
|
||||
u32 flags;
|
||||
|
||||
if (bg > 3)
|
||||
if (bg >= NUM_BACKGROUNDS)
|
||||
bg = 0;
|
||||
|
||||
// Unset the WINOUT flag for the bg.
|
||||
flags = (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ) & ~(1 << bg);
|
||||
|
||||
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE( 0, DISPLAY_WIDTH));
|
||||
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE( 0, 155));
|
||||
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(56, 121));
|
||||
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(56, 121));
|
||||
// Set limits for graph data
|
||||
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE( 0, DISPLAY_WIDTH)); // Right side horizontal
|
||||
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE( 0, CONDITION_GRAPH_CENTER_X)); // Left side horizontal
|
||||
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(CONDITION_GRAPH_TOP_Y, CONDITION_GRAPH_BOTTOM_Y)); // Right side vertical
|
||||
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(CONDITION_GRAPH_TOP_Y, CONDITION_GRAPH_BOTTOM_Y)); // Left side vertical
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, flags);
|
||||
}
|
||||
|
||||
void sub_81D2230(struct ConditionGraph *graph)
|
||||
void ConditionGraph_Update(struct ConditionGraph *graph)
|
||||
{
|
||||
u16 i;
|
||||
for (i = 0; i < FLAVOR_COUNT; i++)
|
||||
graph->unk12C[i] = graph->unk64[graph->unk352][i];
|
||||
for (i = 0; i < CONDITION_COUNT; i++)
|
||||
graph->curPositions[i] = graph->newPositions[graph->updateCounter][i];
|
||||
|
||||
graph->unk354 = 1;
|
||||
graph->needsDraw = TRUE;
|
||||
}
|
||||
|
||||
static void sub_81D2278(struct ConditionGraph *graph, u16 *arg1, struct UnknownSubStruct_81D1ED4 *arg2, struct UnknownSubStruct_81D1ED4 *arg3, u8 arg4, u16 *arg5)
|
||||
static void ConditionGraph_CalcLine(struct ConditionGraph *graph, u16 *scanline, struct UCoords16 *pos1, struct UCoords16 *pos2, bool8 dir, u16 *overflowScanline)
|
||||
{
|
||||
u16 i, r8, r10, r0, var_30;
|
||||
u16 i, height, top, bottom, x2;
|
||||
u16 *ptr;
|
||||
s32 r4, var_2C;
|
||||
s32 x, xIncrement = 0;
|
||||
|
||||
var_2C = 0;
|
||||
if (arg2->unk2 < arg3->unk2)
|
||||
if (pos1->y < pos2->y)
|
||||
{
|
||||
r10 = arg2->unk2;
|
||||
r0 = arg3->unk2;
|
||||
r4 = arg2->unk0 << 10;
|
||||
var_30 = arg3->unk0;
|
||||
r8 = r0 - r10;
|
||||
if (r8 != 0)
|
||||
var_2C = ((var_30 - arg2->unk0) << 10) / r8;
|
||||
top = pos1->y;
|
||||
bottom = pos2->y;
|
||||
x = pos1->x << 10;
|
||||
x2 = pos2->x;
|
||||
height = bottom - top;
|
||||
if (height != 0)
|
||||
xIncrement = ((x2 - pos1->x) << 10) / height;
|
||||
}
|
||||
else
|
||||
{
|
||||
r0 = arg2->unk2;
|
||||
r10 = arg3->unk2;
|
||||
r4 = arg3->unk0 << 10;
|
||||
var_30 = arg2->unk0;
|
||||
r8 = r0 - r10;
|
||||
if (r8 != 0)
|
||||
var_2C = ((var_30 - arg3->unk0) << 10) / r8;
|
||||
bottom = pos1->y;
|
||||
top = pos2->y;
|
||||
x = pos2->x << 10;
|
||||
x2 = pos1->x;
|
||||
height = bottom - top;
|
||||
if (height != 0)
|
||||
xIncrement = ((x2 - pos2->x) << 10) / height;
|
||||
}
|
||||
|
||||
r8++;
|
||||
if (arg5 == NULL)
|
||||
height++;
|
||||
if (overflowScanline == NULL)
|
||||
{
|
||||
arg1 += (r10 - 56) * 2;
|
||||
for (i = 0; i < r8; i++)
|
||||
scanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4;
|
||||
r4 += var_2C;
|
||||
arg1 += 2;
|
||||
scanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir;
|
||||
x += xIncrement;
|
||||
scanline += 2;
|
||||
}
|
||||
|
||||
ptr = arg1 - 2;
|
||||
ptr = scanline - 2;
|
||||
}
|
||||
else if (var_2C > 0)
|
||||
else if (xIncrement > 0)
|
||||
{
|
||||
arg5 += (r10 - 56) * 2;
|
||||
overflowScanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
|
||||
// Less readable than the other loops, but it has to be written this way to match.
|
||||
for (i = 0; i < r8; arg5[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4, r4 += var_2C, arg5 += 2, i++)
|
||||
for (i = 0; i < height; overflowScanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir, x += xIncrement, overflowScanline += 2, i++)
|
||||
{
|
||||
if (r4 >= (155 << 10))
|
||||
if (x >= (CONDITION_GRAPH_CENTER_X << 10))
|
||||
break;
|
||||
}
|
||||
|
||||
graph->unk350 = r10 + i;
|
||||
arg1 += (graph->unk350 - 56) * 2;
|
||||
for (; i < r8; i++)
|
||||
graph->bottom = top + i;
|
||||
scanline += (graph->bottom - CONDITION_GRAPH_TOP_Y) * 2;
|
||||
for (; i < height; i++)
|
||||
{
|
||||
arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4;
|
||||
r4 += var_2C;
|
||||
arg1 += 2;
|
||||
scanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir;
|
||||
x += xIncrement;
|
||||
scanline += 2;
|
||||
}
|
||||
|
||||
ptr = arg1 - 2;
|
||||
ptr = scanline - 2;
|
||||
}
|
||||
else if (var_2C < 0)
|
||||
else if (xIncrement < 0)
|
||||
{
|
||||
arg1 += (r10 - 56) * 2;
|
||||
for (i = 0; i < r8; i++)
|
||||
scanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4;
|
||||
if (r4 < (155 << 10))
|
||||
scanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir;
|
||||
if (x < (CONDITION_GRAPH_CENTER_X << 10))
|
||||
{
|
||||
arg1[arg4] = 155;
|
||||
scanline[dir] = CONDITION_GRAPH_CENTER_X;
|
||||
break;
|
||||
}
|
||||
r4 += var_2C;
|
||||
arg1 += 2;
|
||||
x += xIncrement;
|
||||
scanline += 2;
|
||||
}
|
||||
|
||||
graph->unk350 = r10 + i;
|
||||
arg5 += (graph->unk350 - 56) * 2;
|
||||
for (; i < r8; i++)
|
||||
graph->bottom = top + i;
|
||||
overflowScanline += (graph->bottom - CONDITION_GRAPH_TOP_Y) * 2;
|
||||
for (; i < height; i++)
|
||||
{
|
||||
arg5[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4;
|
||||
r4 += var_2C;
|
||||
arg5 += 2;
|
||||
overflowScanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir;
|
||||
x += xIncrement;
|
||||
overflowScanline += 2;
|
||||
}
|
||||
|
||||
ptr = arg5 - 2;
|
||||
ptr = overflowScanline - 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
graph->unk350 = r10;
|
||||
arg1 += (r10 - 56) * 2;
|
||||
arg5 += (r10 - 56) * 2;
|
||||
arg1[1] = arg2->unk0 + 1;
|
||||
arg5[0] = arg3->unk0;
|
||||
arg5[1] = 155;
|
||||
graph->bottom = top;
|
||||
scanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
|
||||
overflowScanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
|
||||
scanline[1] = pos1->x + 1;
|
||||
overflowScanline[0] = pos2->x;
|
||||
overflowScanline[1] = CONDITION_GRAPH_CENTER_X;
|
||||
return;
|
||||
}
|
||||
|
||||
ptr[arg4] = arg4 + var_30;
|
||||
ptr[dir] = dir + x2;
|
||||
}
|
||||
|
||||
static void sub_81D24A4(struct ConditionGraph *graph)
|
||||
static void ConditionGraph_CalcRightHalf(struct ConditionGraph *graph)
|
||||
{
|
||||
u16 i, r6, varMax;
|
||||
u16 i, y, bottom;
|
||||
|
||||
if (graph->unk12C[0].unk2 < graph->unk12C[1].unk2)
|
||||
// Calculate Cool -> Beauty line
|
||||
if (graph->curPositions[GRAPH_COOL].y < graph->curPositions[GRAPH_BEAUTY].y)
|
||||
{
|
||||
r6 = graph->unk12C[0].unk2;
|
||||
sub_81D2278(graph, graph->unk140[0], &graph->unk12C[0], &graph->unk12C[1], 1, NULL);
|
||||
y = graph->curPositions[GRAPH_COOL].y;
|
||||
ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_COOL], &graph->curPositions[GRAPH_BEAUTY], TRUE, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
r6 = graph->unk12C[1].unk2;
|
||||
sub_81D2278(graph, graph->unk140[0], &graph->unk12C[1], &graph->unk12C[0], 0, NULL);
|
||||
y = graph->curPositions[GRAPH_BEAUTY].y;
|
||||
ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_BEAUTY], &graph->curPositions[GRAPH_COOL], FALSE, NULL);
|
||||
}
|
||||
|
||||
sub_81D2278(graph, graph->unk140[0], &graph->unk12C[1], &graph->unk12C[2], 1, NULL);
|
||||
// Calculate Beauty -> Cute line
|
||||
// No need for conditional, positions on the Beauty line are always above the Cute line
|
||||
ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_BEAUTY], &graph->curPositions[GRAPH_CUTE], TRUE, NULL);
|
||||
|
||||
i = (graph->unk12C[2].unk2 <= graph->unk12C[3].unk2);
|
||||
sub_81D2278(graph, graph->unk140[0], &graph->unk12C[2], &graph->unk12C[3], i, graph->unk248[0]);
|
||||
for (i = 56; i < r6; i++)
|
||||
// Calculate Cute -> Tough line (includes left scanline because this crosses the halfway point)
|
||||
i = (graph->curPositions[GRAPH_CUTE].y <= graph->curPositions[GRAPH_SMART].y);
|
||||
ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_CUTE], &graph->curPositions[GRAPH_SMART], i, graph->scanlineLeft[0]);
|
||||
|
||||
// Clear down to new top
|
||||
for (i = CONDITION_GRAPH_TOP_Y; i < y; i++)
|
||||
{
|
||||
graph->unk140[i - 56][0] = 0;
|
||||
graph->unk140[i - 56][1] = 0;
|
||||
graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] = 0;
|
||||
graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][1] = 0;
|
||||
}
|
||||
|
||||
for (i = graph->unk12C[0].unk2; i <= graph->unk350; i++)
|
||||
graph->unk140[i - 56][0] = 155;
|
||||
for (i = graph->curPositions[GRAPH_COOL].y; i <= graph->bottom; i++)
|
||||
graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] = CONDITION_GRAPH_CENTER_X;
|
||||
|
||||
varMax = max(graph->unk350, graph->unk12C[2].unk2);
|
||||
for (i = varMax + 1; i < 122; i++)
|
||||
// Clear after new bottom
|
||||
bottom = max(graph->bottom, graph->curPositions[GRAPH_CUTE].y);
|
||||
for (i = bottom + 1; i <= CONDITION_GRAPH_BOTTOM_Y; i++)
|
||||
{
|
||||
graph->unk140[i - 56][0] = 0;
|
||||
graph->unk140[i - 56][1] = 0;
|
||||
graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] = 0;
|
||||
graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][1] = 0;
|
||||
}
|
||||
|
||||
for (i = 56; i < 122; i++)
|
||||
for (i = CONDITION_GRAPH_TOP_Y; i <= CONDITION_GRAPH_BOTTOM_Y; i++)
|
||||
{
|
||||
if (graph->unk140[i - 56][0] == 0 && graph->unk140[i - 56][1] != 0)
|
||||
graph->unk140[i - 56][0] = 155;
|
||||
if (graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] == 0
|
||||
&& graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][1] != 0)
|
||||
graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] = CONDITION_GRAPH_CENTER_X;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_81D2634(struct ConditionGraph *graph)
|
||||
static void ConditionGraph_CalcLeftHalf(struct ConditionGraph *graph)
|
||||
{
|
||||
s32 i, r6, varMax;
|
||||
s32 i, y, bottom;
|
||||
|
||||
if (graph->unk12C[0].unk2 < graph->unk12C[4].unk2)
|
||||
// Calculate Cool -> Tough line
|
||||
if (graph->curPositions[GRAPH_COOL].y < graph->curPositions[GRAPH_TOUGH].y)
|
||||
{
|
||||
r6 = graph->unk12C[0].unk2;
|
||||
sub_81D2278(graph, graph->unk248[0], &graph->unk12C[0], &graph->unk12C[4], 0, NULL);
|
||||
y = graph->curPositions[GRAPH_COOL].y;
|
||||
ConditionGraph_CalcLine(graph, graph->scanlineLeft[0], &graph->curPositions[GRAPH_COOL], &graph->curPositions[GRAPH_TOUGH], FALSE, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
r6 = graph->unk12C[4].unk2;
|
||||
sub_81D2278(graph, graph->unk248[0], &graph->unk12C[4], &graph->unk12C[0], 1, NULL);
|
||||
y = graph->curPositions[GRAPH_TOUGH].y;
|
||||
ConditionGraph_CalcLine(graph, graph->scanlineLeft[0], &graph->curPositions[GRAPH_TOUGH], &graph->curPositions[GRAPH_COOL], TRUE, NULL);
|
||||
}
|
||||
|
||||
sub_81D2278(graph, graph->unk248[0], &graph->unk12C[4], &graph->unk12C[3], 0, NULL);
|
||||
// Calculate Tough -> Smart line
|
||||
// No need for conditional, positions on the Tough line are always above the Smart line
|
||||
ConditionGraph_CalcLine(graph, graph->scanlineLeft[0], &graph->curPositions[GRAPH_TOUGH], &graph->curPositions[GRAPH_SMART], FALSE, NULL);
|
||||
|
||||
for (i = 56; i < r6; i++)
|
||||
// Clear down to new top
|
||||
for (i = CONDITION_GRAPH_TOP_Y; i < y; i++)
|
||||
{
|
||||
graph->unk140[i + 10][0] = 0;
|
||||
graph->unk140[i + 10][1] = 0;
|
||||
graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][0] = 0;
|
||||
graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][1] = 0;
|
||||
}
|
||||
|
||||
for (i = graph->unk12C[0].unk2; i <= graph->unk350; i++)
|
||||
graph->unk140[i + 10][1] = 155;
|
||||
for (i = graph->curPositions[GRAPH_COOL].y; i <= graph->bottom; i++)
|
||||
graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][1] = CONDITION_GRAPH_CENTER_X;
|
||||
|
||||
varMax = max(graph->unk350, graph->unk12C[3].unk2 + 1);
|
||||
for (i = varMax; i < 122; i++)
|
||||
// Clear after new bottom
|
||||
bottom = max(graph->bottom, graph->curPositions[GRAPH_SMART].y + 1);
|
||||
for (i = bottom; i <= CONDITION_GRAPH_BOTTOM_Y; i++)
|
||||
{
|
||||
graph->unk140[i + 10][0] = 0;
|
||||
graph->unk140[i + 10][1] = 0;
|
||||
graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][0] = 0;
|
||||
graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][1] = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < 66; i++)
|
||||
for (i = 0; i < CONDITION_GRAPH_HEIGHT; i++)
|
||||
{
|
||||
if (graph->unk248[i][0] >= graph->unk248[i][1])
|
||||
if (graph->scanlineLeft[i][0] >= graph->scanlineLeft[i][1])
|
||||
{
|
||||
graph->unk248[i][1] = 0;
|
||||
graph->unk248[i][0] = 0;
|
||||
graph->scanlineLeft[i][1] = 0;
|
||||
graph->scanlineLeft[i][0] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_81D2754(u8 *arg0, struct UnknownSubStruct_81D1ED4 *arg1)
|
||||
void ConditionGraph_CalcPositions(u8 *conditions, struct UCoords16 *positions)
|
||||
{
|
||||
u8 r2, r7;
|
||||
s8 r12;
|
||||
u8 lineLength, sinIdx;
|
||||
s8 posIdx;
|
||||
u16 i;
|
||||
|
||||
r2 = sUnknown_08625410[*(arg0++)];
|
||||
arg1->unk0 = 155;
|
||||
arg1->unk2 = 91 - r2;
|
||||
// Cool is straight up-and-down (not angled), so no need for Sin
|
||||
lineLength = sConditionToLineLength[*(conditions++)];
|
||||
positions[GRAPH_COOL].x = CONDITION_GRAPH_CENTER_X;
|
||||
positions[GRAPH_COOL].y = CONDITION_GRAPH_CENTER_Y - lineLength;
|
||||
|
||||
r7 = 64;
|
||||
r12 = 0;
|
||||
for (i = 1; i < 5; i++)
|
||||
sinIdx = 64;
|
||||
posIdx = GRAPH_COOL;
|
||||
for (i = 1; i < CONDITION_COUNT; i++)
|
||||
{
|
||||
r7 += 51;
|
||||
if (--r12 < 0)
|
||||
r12 = 4;
|
||||
sinIdx += 51;
|
||||
if (--posIdx < 0)
|
||||
posIdx = CONDITION_COUNT - 1;
|
||||
|
||||
if (r12 == 2)
|
||||
r7++;
|
||||
if (posIdx == GRAPH_CUTE)
|
||||
sinIdx++;
|
||||
|
||||
r2 = sUnknown_08625410[*(arg0++)];
|
||||
arg1[r12].unk0 = 155 + ((r2 * gSineTable[64 + r7]) >> 8);
|
||||
arg1[r12].unk2 = 91 - ((r2 * gSineTable[r7]) >> 8);
|
||||
lineLength = sConditionToLineLength[*(conditions++)];
|
||||
positions[posIdx].x = CONDITION_GRAPH_CENTER_X + ((lineLength * gSineTable[64 + sinIdx]) >> 8);
|
||||
positions[posIdx].y = CONDITION_GRAPH_CENTER_Y - ((lineLength * gSineTable[sinIdx]) >> 8);
|
||||
|
||||
if (r12 < 3 && (r2 != 32 || r12 != 2))
|
||||
arg1[r12].unk0 = 156 + ((r2 * gSineTable[64 + r7]) >> 8);
|
||||
if (posIdx <= GRAPH_CUTE && (lineLength != 32 || posIdx != GRAPH_CUTE))
|
||||
positions[posIdx].x++;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------
|
||||
// Move relearner
|
||||
//----------------
|
||||
|
||||
void InitMoveRelearnerWindows(bool8 useContextWindow)
|
||||
{
|
||||
u8 i;
|
||||
@@ -685,10 +710,8 @@ void InitMoveRelearnerWindows(bool8 useContextWindow)
|
||||
LoadUserWindowBorderGfx(0, 1, 0xE0);
|
||||
LoadPalette(gStandardMenuPalette, 0xF0, 0x20);
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
for (i = 0; i < ARRAY_COUNT(sMoveRelearnerWindowTemplates) - 1; i++)
|
||||
FillWindowPixelBuffer(i, PIXEL_FILL(1));
|
||||
}
|
||||
|
||||
if (!useContextWindow)
|
||||
{
|
||||
@@ -704,11 +727,11 @@ void InitMoveRelearnerWindows(bool8 useContextWindow)
|
||||
PutWindowTilemap(3);
|
||||
DrawStdFrameWithCustomTileAndPalette(2, 0, 1, 0xE);
|
||||
DrawStdFrameWithCustomTileAndPalette(3, 0, 1, 0xE);
|
||||
nullsub_79();
|
||||
MoveRelearnerDummy();
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
}
|
||||
|
||||
static void nullsub_79(void)
|
||||
static void MoveRelearnerDummy(void)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -720,13 +743,10 @@ u8 LoadMoveRelearnerMovesList(const struct ListMenuItem *items, u16 numChoices)
|
||||
gMultiuseListMenuTemplate.items = items;
|
||||
|
||||
if (numChoices < 6)
|
||||
{
|
||||
gMultiuseListMenuTemplate.maxShowed = numChoices;
|
||||
}
|
||||
else
|
||||
{
|
||||
gMultiuseListMenuTemplate.maxShowed = 6;
|
||||
}
|
||||
|
||||
return gMultiuseListMenuTemplate.maxShowed;
|
||||
}
|
||||
|
||||
@@ -734,7 +754,7 @@ static void MoveRelearnerLoadBattleMoveDescription(u32 chosenMove)
|
||||
{
|
||||
s32 x;
|
||||
const struct BattleMove *move;
|
||||
u8 buffer[0x20];
|
||||
u8 buffer[32];
|
||||
const u8 *str;
|
||||
|
||||
FillWindowPixelBuffer(0, PIXEL_FILL(1));
|
||||
@@ -856,6 +876,10 @@ void MoveRelearnerCreateYesNoMenu(void)
|
||||
CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, 1, 0xE, 0);
|
||||
}
|
||||
|
||||
//----------------
|
||||
// Condition menu
|
||||
//----------------
|
||||
|
||||
s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst)
|
||||
{
|
||||
s32 ret;
|
||||
@@ -1010,7 +1034,7 @@ void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId
|
||||
}
|
||||
}
|
||||
|
||||
void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel)
|
||||
void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *numSparkles, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
@@ -1019,25 +1043,23 @@ void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16
|
||||
|
||||
if (partyId != numMons)
|
||||
{
|
||||
graph->stat[id][0] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL);
|
||||
graph->stat[id][1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL);
|
||||
graph->stat[id][2] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL);
|
||||
graph->stat[id][3] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL);
|
||||
graph->stat[id][4] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL);
|
||||
graph->conditions[id][CONDITION_COOL] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL);
|
||||
graph->conditions[id][CONDITION_TOUGH] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL);
|
||||
graph->conditions[id][CONDITION_SMART] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL);
|
||||
graph->conditions[id][CONDITION_CUTE] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL);
|
||||
graph->conditions[id][CONDITION_BEAUTY] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL);
|
||||
|
||||
sheen[id] = (GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) != 0xFF)
|
||||
? GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) / 29u
|
||||
: 9;
|
||||
numSparkles[id] = GET_NUM_CONDITION_SPARKLES(GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL));
|
||||
|
||||
sub_81D2754(graph->stat[id], graph->unk14[id]);
|
||||
ConditionGraph_CalcPositions(graph->conditions[id], graph->savedPositions[id]);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < FLAVOR_COUNT; i++)
|
||||
for (i = 0; i < CONDITION_COUNT; i++)
|
||||
{
|
||||
graph->stat[id][i] = 0;
|
||||
graph->unk14[id][i].unk0 = 155;
|
||||
graph->unk14[id][i].unk2 = 91;
|
||||
graph->conditions[id][i] = 0;
|
||||
graph->savedPositions[id][i].x = CONDITION_GRAPH_CENTER_X;
|
||||
graph->savedPositions[id][i].y = CONDITION_GRAPH_CENTER_Y;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1076,17 +1098,17 @@ bool8 MoveConditionMonOffscreen(s16 *x)
|
||||
return (*x != -80);
|
||||
}
|
||||
|
||||
bool8 TryUpdateConditionMonTransitionOn(struct ConditionGraph *graph, s16 *x)
|
||||
bool8 ConditionMenu_UpdateMonEnter(struct ConditionGraph *graph, s16 *x)
|
||||
{
|
||||
bool8 graphUpdating = TransitionConditionGraph(graph);
|
||||
bool8 graphUpdating = ConditionGraph_TryUpdate(graph);
|
||||
bool8 monUpdating = MoveConditionMonOnscreen(x);
|
||||
|
||||
return (graphUpdating || monUpdating);
|
||||
}
|
||||
|
||||
bool8 TryUpdateConditionMonTransitionOff(struct ConditionGraph *graph, s16 *x)
|
||||
bool8 ConditionMenu_UpdateMonExit(struct ConditionGraph *graph, s16 *x)
|
||||
{
|
||||
bool8 graphUpdating = TransitionConditionGraph(graph);
|
||||
bool8 graphUpdating = ConditionGraph_TryUpdate(graph);
|
||||
bool8 monUpdating = MoveConditionMonOffscreen(x);
|
||||
|
||||
return (graphUpdating || monUpdating);
|
||||
@@ -1145,8 +1167,8 @@ static const union AnimCmd sAnim_ConditionSelectionIcon_Unselected[] =
|
||||
|
||||
static const union AnimCmd *const sAnims_ConditionSelectionIcon[] =
|
||||
{
|
||||
sAnim_ConditionSelectionIcon_Selected,
|
||||
sAnim_ConditionSelectionIcon_Unselected
|
||||
[CONDITION_ICON_SELECTED] = sAnim_ConditionSelectionIcon_Selected,
|
||||
[CONDITION_ICON_UNSELECTED] = sAnim_ConditionSelectionIcon_Unselected
|
||||
};
|
||||
|
||||
// Just loads the generic data, up to the caller to load the actual sheet/pal for the specific mon
|
||||
|
||||
+9
-9
@@ -90,7 +90,7 @@ output_burst:
|
||||
k = 0x0e;
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
if (*(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2) != 0xffff)
|
||||
if (REG_SIOMULTI(i) != 0xffff)
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -102,7 +102,7 @@ output_burst:
|
||||
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
j = REG_SIOMULTI(i);
|
||||
if (mp->client_bit & (1 << i))
|
||||
{
|
||||
if (j != ((MULTIBOOT_CLIENT_INFO << 8) | (1 << i)))
|
||||
@@ -141,7 +141,7 @@ output_burst:
|
||||
mp->probe_target_bit = 0;
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
j = REG_SIOMULTI(i);
|
||||
if ((j >> 8) == MULTIBOOT_CLIENT_INFO)
|
||||
{
|
||||
MultiBoot_required_data[i - 1] = j;
|
||||
@@ -166,7 +166,7 @@ output_burst:
|
||||
{
|
||||
if (mp->probe_target_bit & (1 << i))
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
j = REG_SIOMULTI(i);
|
||||
if (j != MultiBoot_required_data[i - 1])
|
||||
{
|
||||
mp->probe_target_bit ^= 1 << i;
|
||||
@@ -179,7 +179,7 @@ output_burst:
|
||||
k = 1;
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
j = REG_SIOMULTI(i);
|
||||
mp->client_data[i - 1] = j;
|
||||
if (mp->probe_target_bit & (1 << i))
|
||||
{
|
||||
@@ -214,7 +214,7 @@ output_burst:
|
||||
case 0xd1:
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
j = REG_SIOMULTI(i);
|
||||
if (mp->probe_target_bit & (1 << i))
|
||||
{
|
||||
if ((j >> 8) != MULTIBOOT_CLIENT_DLREADY)
|
||||
@@ -242,7 +242,7 @@ output_burst:
|
||||
{
|
||||
if (mp->probe_target_bit & (1 << i))
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
j = REG_SIOMULTI(i);
|
||||
if ((j >> 8) != (MULTIBOOT_MASTER_START_PROBE + 1 - (mp->probe_count >> 1))
|
||||
|| ((j & 0xff) != (1 << i)))
|
||||
{
|
||||
@@ -391,7 +391,7 @@ static int MultiBootHandShake(struct MultiBootParam *mp)
|
||||
default:
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
j = REG_SIOMULTI(i);
|
||||
if ((mp->client_bit & (1 << i))
|
||||
&& j != must_data)
|
||||
{
|
||||
@@ -413,7 +413,7 @@ static int MultiBootHandShake(struct MultiBootParam *mp)
|
||||
case 0xe8:
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
j = REG_SIOMULTI(i);
|
||||
if ((mp->client_bit & (1 << i)) && j != must_data)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
|
||||
+1
-1
@@ -308,7 +308,7 @@ static const struct BgTemplate sOverworldBgTemplates[] =
|
||||
|
||||
static const struct ScanlineEffectParams sFlashEffectParams =
|
||||
{
|
||||
(void *)REG_ADDR_WIN0H,
|
||||
®_WIN0H,
|
||||
((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
|
||||
1,
|
||||
0,
|
||||
|
||||
+20
-21
@@ -49,7 +49,6 @@ static void Task_RunLoopedTask(u8 taskId);
|
||||
static void Task_Pokenav(u8 taskId);
|
||||
static void CB2_InitPokenavForTutorial(void);
|
||||
|
||||
// TODO: Use MENU ids
|
||||
const struct PokenavCallbacks PokenavMenuCallbacks[15] =
|
||||
{
|
||||
[POKENAV_MAIN_MENU - POKENAV_MENU_IDS_START] =
|
||||
@@ -122,15 +121,15 @@ const struct PokenavCallbacks PokenavMenuCallbacks[15] =
|
||||
.free1 = FreeRegionMapSubstruct1,
|
||||
.free2 = FreeRegionMapSubstruct2,
|
||||
},
|
||||
[POKENAV_CONDITION_PARTY - POKENAV_MENU_IDS_START] =
|
||||
[POKENAV_CONDITION_GRAPH_PARTY - POKENAV_MENU_IDS_START] =
|
||||
{
|
||||
.init = PokenavCallback_Init_PartyCondition,
|
||||
.callback = GetPartyConditionCallback,
|
||||
.open = OpenPartyConditionMenu,
|
||||
.createLoopTask = CreatePartyConditionLoopedTask,
|
||||
.isLoopTaskActive = IsPartyConditionLoopedTaskActive,
|
||||
.free1 = FreePartyConditionSubstruct1,
|
||||
.free2 = FreePartyConditionSubstruct2,
|
||||
.init = PokenavCallback_Init_ConditionGraph_Party,
|
||||
.callback = GetConditionGraphMenuCallback,
|
||||
.open = OpenConditionGraphMenu,
|
||||
.createLoopTask = CreateConditionGraphMenuLoopedTask,
|
||||
.isLoopTaskActive = IsConditionGraphMenuLoopedTaskActive,
|
||||
.free1 = FreeConditionGraphMenuSubstruct1,
|
||||
.free2 = FreeConditionGraphMenuSubstruct2,
|
||||
},
|
||||
[POKENAV_CONDITION_SEARCH_RESULTS - POKENAV_MENU_IDS_START] =
|
||||
{
|
||||
@@ -142,15 +141,15 @@ const struct PokenavCallbacks PokenavMenuCallbacks[15] =
|
||||
.free1 = FreeSearchResultSubstruct1,
|
||||
.free2 = FreeSearchResultSubstruct2,
|
||||
},
|
||||
[POKENAV_CONDITION_GRAPH_FROM_SEARCH - POKENAV_MENU_IDS_START] =
|
||||
[POKENAV_CONDITION_GRAPH_SEARCH - POKENAV_MENU_IDS_START] =
|
||||
{
|
||||
.init = PokenavCallback_Init_ConditionGraphFromSearch,
|
||||
.callback = GetPartyConditionCallback,
|
||||
.open = OpenPartyConditionMenu,
|
||||
.createLoopTask = CreatePartyConditionLoopedTask,
|
||||
.isLoopTaskActive = IsPartyConditionLoopedTaskActive,
|
||||
.free1 = FreePartyConditionSubstruct1,
|
||||
.free2 = FreePartyConditionSubstruct2,
|
||||
.init = PokenavCallback_Init_ConditionGraph_Search,
|
||||
.callback = GetConditionGraphMenuCallback,
|
||||
.open = OpenConditionGraphMenu,
|
||||
.createLoopTask = CreateConditionGraphMenuLoopedTask,
|
||||
.isLoopTaskActive = IsConditionGraphMenuLoopedTaskActive,
|
||||
.free1 = FreeConditionGraphMenuSubstruct1,
|
||||
.free2 = FreeConditionGraphMenuSubstruct2,
|
||||
},
|
||||
[POKENAV_RETURN_CONDITION_SEARCH - POKENAV_MENU_IDS_START] =
|
||||
{
|
||||
@@ -179,8 +178,8 @@ const struct PokenavCallbacks PokenavMenuCallbacks[15] =
|
||||
.open = OpenRibbonsMonList,
|
||||
.createLoopTask = CreateRibbonsMonListLoopedTask,
|
||||
.isLoopTaskActive = IsRibbonsMonListLoopedTaskActive,
|
||||
.free1 = FreeRibbonsMonList1,
|
||||
.free2 = FreeRibbonsMonList2,
|
||||
.free1 = FreeRibbonsMonList,
|
||||
.free2 = FreeRibbonsMonMenu,
|
||||
},
|
||||
[POKENAV_RIBBONS_SUMMARY_SCREEN - POKENAV_MENU_IDS_START] =
|
||||
{
|
||||
@@ -199,8 +198,8 @@ const struct PokenavCallbacks PokenavMenuCallbacks[15] =
|
||||
.open = OpenRibbonsMonListFromRibbonsSummary,
|
||||
.createLoopTask = CreateRibbonsMonListLoopedTask,
|
||||
.isLoopTaskActive = IsRibbonsMonListLoopedTaskActive,
|
||||
.free1 = FreeRibbonsMonList1,
|
||||
.free2 = FreeRibbonsMonList2,
|
||||
.free1 = FreeRibbonsMonList,
|
||||
.free2 = FreeRibbonsMonMenu,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,630 @@
|
||||
#include "global.h"
|
||||
#include "data.h"
|
||||
#include "decompress.h"
|
||||
#include "main.h"
|
||||
#include "menu_specialized.h"
|
||||
#include "mon_markings.h"
|
||||
#include "pokenav.h"
|
||||
#include "pokemon.h"
|
||||
#include "pokemon_storage_system.h"
|
||||
#include "sound.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "text.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
#define CONDITION_MONS_LOADED 3
|
||||
|
||||
struct Pokenav_ConditionMenu
|
||||
{
|
||||
u32 monPal[CONDITION_MONS_LOADED][0x20];
|
||||
u8 fill[0x180];
|
||||
u32 monPicGfx[CONDITION_MONS_LOADED][MON_PIC_SIZE];
|
||||
bool8 inSearchMode;
|
||||
s16 toLoadListIndex;
|
||||
u32 (*callback)(struct Pokenav_ConditionMenu *);
|
||||
u8 fill2[0x18];
|
||||
u8 locationText[CONDITION_MONS_LOADED][24];
|
||||
u8 nameText[CONDITION_MONS_LOADED][64];
|
||||
struct ConditionGraph graph;
|
||||
u8 numSparkles[CONDITION_MONS_LOADED];
|
||||
u8 monMarks[CONDITION_MONS_LOADED];
|
||||
s8 loadId;
|
||||
s8 nextLoadIdDown;
|
||||
s8 nextLoadIdUp;
|
||||
s8 toLoadId;
|
||||
u8 state;
|
||||
};
|
||||
|
||||
static void InitPartyConditionListParameters(void);
|
||||
static void InitSearchResultsConditionList(void);
|
||||
static u32 HandleConditionMenuInput(struct Pokenav_ConditionMenu *);
|
||||
static u32 GetConditionReturnCallback(struct Pokenav_ConditionMenu *);
|
||||
static u32 OpenMarkingsMenu(struct Pokenav_ConditionMenu *);
|
||||
static u8 ConditionGraphHandleDpadInput(struct Pokenav_ConditionMenu *);
|
||||
static u8 SwitchConditionSummaryIndex(bool8);
|
||||
static void CopyMonNameGenderLocation(s16, u8);
|
||||
static void GetMonConditionGraphData(s16, u8);
|
||||
static void ConditionGraphDrawMonPic(s16, u8);
|
||||
|
||||
bool32 PokenavCallback_Init_ConditionGraph_Party(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU, sizeof(struct Pokenav_ConditionMenu));
|
||||
|
||||
if (menu == NULL)
|
||||
return FALSE;
|
||||
|
||||
ConditionGraph_Init(&menu->graph);
|
||||
InitPartyConditionListParameters();
|
||||
gKeyRepeatStartDelay = 20;
|
||||
menu->callback = HandleConditionMenuInput;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_ConditionGraph_Search(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU, sizeof(struct Pokenav_ConditionMenu));
|
||||
|
||||
if (menu == NULL)
|
||||
return FALSE;
|
||||
|
||||
ConditionGraph_Init(&menu->graph);
|
||||
InitSearchResultsConditionList();
|
||||
gKeyRepeatStartDelay = 20;
|
||||
menu->callback = HandleConditionMenuInput;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
u32 GetConditionGraphMenuCallback(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
|
||||
return menu->callback(menu);
|
||||
}
|
||||
|
||||
static u32 HandleConditionMenuInput(struct Pokenav_ConditionMenu *menu)
|
||||
{
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
u32 ret = ConditionGraphHandleDpadInput(menu);
|
||||
|
||||
if (ret == CONDITION_FUNC_NONE)
|
||||
{
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
menu->callback = GetConditionReturnCallback;
|
||||
ret = CONDITION_FUNC_RETURN;
|
||||
}
|
||||
else if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
if (!menu->inSearchMode)
|
||||
{
|
||||
// In Party mode, pressing A only applies to the Cancel button
|
||||
if (monListPtr->currIndex == monListPtr->listCount - 1)
|
||||
{
|
||||
// Cancel
|
||||
PlaySE(SE_SELECT);
|
||||
menu->callback = GetConditionReturnCallback;
|
||||
ret = CONDITION_FUNC_RETURN;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// In Search mode pressing A brings up the markings menu
|
||||
PlaySE(SE_SELECT);
|
||||
ret = CONDITION_FUNC_ADD_MARKINGS;
|
||||
menu->callback = OpenMarkingsMenu;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 OpenMarkingsMenu(struct Pokenav_ConditionMenu *menu)
|
||||
{
|
||||
struct PokenavMonList *monListPtr;
|
||||
u8 markings;
|
||||
u32 ret = CONDITION_FUNC_NONE, boxId, monId;
|
||||
|
||||
if (!HandleMonMarkingsMenuInput())
|
||||
{
|
||||
menu->monMarks[menu->loadId] = GetMonMarkingsData();
|
||||
monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
boxId = monListPtr->monData[monListPtr->currIndex].boxId;
|
||||
monId = monListPtr->monData[monListPtr->currIndex].monId;
|
||||
markings = menu->monMarks[menu->loadId];
|
||||
|
||||
if (boxId == TOTAL_BOXES_COUNT)
|
||||
SetMonData(&gPlayerParty[monId], MON_DATA_MARKINGS, &markings);
|
||||
else
|
||||
SetBoxMonDataAt(boxId, monId, MON_DATA_MARKINGS, &markings);
|
||||
|
||||
menu->callback = HandleConditionMenuInput;
|
||||
ret = CONDITION_FUNC_CLOSE_MARKINGS;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 GetConditionReturnCallback(struct Pokenav_ConditionMenu *menu)
|
||||
{
|
||||
if (!menu->inSearchMode)
|
||||
return POKENAV_CONDITION_MENU;
|
||||
else
|
||||
return POKENAV_RETURN_CONDITION_SEARCH;
|
||||
}
|
||||
|
||||
void FreeConditionGraphMenuSubstruct1(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
if (!menu->inSearchMode)
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
}
|
||||
|
||||
static u8 ConditionGraphHandleDpadInput(struct Pokenav_ConditionMenu *menu)
|
||||
{
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
u8 ret = CONDITION_FUNC_NONE;
|
||||
|
||||
if (JOY_HELD(DPAD_UP))
|
||||
{
|
||||
// Prevent input wrapping in search mode
|
||||
if (!menu->inSearchMode || monListPtr->currIndex != 0)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ret = SwitchConditionSummaryIndex(TRUE);
|
||||
}
|
||||
}
|
||||
else if (JOY_HELD(DPAD_DOWN))
|
||||
{
|
||||
// Prevent input wrapping in search mode
|
||||
if (!menu->inSearchMode || monListPtr->currIndex < monListPtr->listCount - 1)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ret = SwitchConditionSummaryIndex(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u8 SwitchConditionSummaryIndex(u8 moveUp)
|
||||
{
|
||||
u16 newLoadId;
|
||||
bool8 wasNotLastMon, isNotLastMon;
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
newLoadId = (moveUp) ? menu->nextLoadIdUp : menu->nextLoadIdDown;
|
||||
ConditionGraph_SetNewPositions(&menu->graph, menu->graph.savedPositions[menu->loadId], menu->graph.savedPositions[newLoadId]);
|
||||
wasNotLastMon = (monListPtr->currIndex != (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1));
|
||||
if (moveUp)
|
||||
{
|
||||
menu->nextLoadIdUp = menu->nextLoadIdDown;
|
||||
menu->nextLoadIdDown = menu->loadId;
|
||||
menu->loadId = newLoadId;
|
||||
menu->toLoadId = menu->nextLoadIdUp;
|
||||
|
||||
monListPtr->currIndex = (monListPtr->currIndex == 0) ? monListPtr->listCount - 1 : monListPtr->currIndex - 1;
|
||||
menu->toLoadListIndex = (monListPtr->currIndex != 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->nextLoadIdDown = menu->nextLoadIdUp;
|
||||
menu->nextLoadIdUp = menu->loadId;
|
||||
menu->loadId = newLoadId;
|
||||
menu->toLoadId = menu->nextLoadIdDown;
|
||||
|
||||
monListPtr->currIndex = (monListPtr->currIndex < monListPtr->listCount - 1) ? monListPtr->currIndex + 1 : 0;
|
||||
menu->toLoadListIndex = (monListPtr->currIndex < monListPtr->listCount - 1) ? monListPtr->currIndex + 1 : 0;
|
||||
}
|
||||
|
||||
isNotLastMon = (monListPtr->currIndex != (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1));
|
||||
|
||||
if (!wasNotLastMon)
|
||||
return CONDITION_FUNC_NO_TRANSITION;
|
||||
else if (!isNotLastMon)
|
||||
return CONDITION_FUNC_SLIDE_MON_OUT;
|
||||
else
|
||||
return CONDITION_FUNC_SLIDE_MON_IN;
|
||||
}
|
||||
|
||||
bool32 LoadConditionGraphMenuGfx(void)
|
||||
{
|
||||
s32 var;
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
switch (menu->state)
|
||||
{
|
||||
case 0:
|
||||
CopyMonNameGenderLocation(monListPtr->currIndex, 0);
|
||||
break;
|
||||
case 1:
|
||||
GetMonConditionGraphData(monListPtr->currIndex, 0);
|
||||
break;
|
||||
case 2:
|
||||
ConditionGraphDrawMonPic(monListPtr->currIndex, 0);
|
||||
break;
|
||||
case 3:
|
||||
if (monListPtr->listCount == 1)
|
||||
{
|
||||
menu->loadId = 0;
|
||||
menu->nextLoadIdDown = 0;
|
||||
menu->nextLoadIdUp = 0;
|
||||
menu->state = 0;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->loadId = 0;
|
||||
menu->nextLoadIdDown = 1;
|
||||
menu->nextLoadIdUp = 2;
|
||||
}
|
||||
break;
|
||||
// These were probably ternaries just like cases 7-9, but couldn't match it any other way.
|
||||
case 4:
|
||||
var = monListPtr->currIndex + 1;
|
||||
if (var >= monListPtr->listCount)
|
||||
var = 0;
|
||||
CopyMonNameGenderLocation(var, 1);
|
||||
break;
|
||||
case 5:
|
||||
var = monListPtr->currIndex + 1;
|
||||
if (var >= monListPtr->listCount)
|
||||
var = 0;
|
||||
GetMonConditionGraphData(var, 1);
|
||||
break;
|
||||
case 6:
|
||||
var = monListPtr->currIndex + 1;
|
||||
if (var >= monListPtr->listCount)
|
||||
var = 0;
|
||||
ConditionGraphDrawMonPic(var, 1);
|
||||
break;
|
||||
case 7:
|
||||
CopyMonNameGenderLocation((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
|
||||
break;
|
||||
case 8:
|
||||
GetMonConditionGraphData((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
|
||||
break;
|
||||
case 9:
|
||||
ConditionGraphDrawMonPic((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
|
||||
menu->state = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
menu->state++;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool32 LoadNextConditionMenuMonData(u8 mode)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case CONDITION_LOAD_MON_INFO:
|
||||
CopyMonNameGenderLocation(menu->toLoadListIndex, menu->toLoadId);
|
||||
break;
|
||||
case CONDITION_LOAD_GRAPH:
|
||||
GetMonConditionGraphData(menu->toLoadListIndex, menu->toLoadId);
|
||||
break;
|
||||
case CONDITION_LOAD_MON_PIC:
|
||||
ConditionGraphDrawMonPic(menu->toLoadListIndex, menu->toLoadId);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 *CopyStringLeftAlignedToConditionData(u8 *dst, const u8 *src, s16 n)
|
||||
{
|
||||
while (*src != EOS)
|
||||
*dst++ = *src++, n--;
|
||||
|
||||
while (n-- > 0)
|
||||
*dst++ = CHAR_SPACE;
|
||||
|
||||
*dst = EOS;
|
||||
return dst;
|
||||
}
|
||||
|
||||
static u8 *CopyConditionMonNameGender(u8 *str, u16 listId, bool8 arg3)
|
||||
{
|
||||
u16 boxId, monId, gender, species, level, lvlDigits;
|
||||
struct BoxPokemon *boxMon;
|
||||
u8 *txtPtr, *str_;
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
boxId = monListPtr->monData[listId].boxId;
|
||||
monId = monListPtr->monData[listId].monId;
|
||||
*(str++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
|
||||
*(str++) = TEXT_COLOR_BLUE;
|
||||
*(str++) = TEXT_COLOR_TRANSPARENT;
|
||||
*(str++) = TEXT_COLOR_LIGHT_BLUE;
|
||||
|
||||
if (GetBoxOrPartyMonData(boxId, monId, MON_DATA_IS_EGG, NULL))
|
||||
return StringCopyPadded(str, gText_EggNickname, CHAR_SPACE, 12);
|
||||
|
||||
GetBoxOrPartyMonData(boxId, monId, MON_DATA_NICKNAME, str);
|
||||
StringGetEnd10(str);
|
||||
species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES, NULL);
|
||||
if (boxId == TOTAL_BOXES_COUNT)
|
||||
{
|
||||
level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
|
||||
gender = GetMonGender(&gPlayerParty[monId]);
|
||||
}
|
||||
else
|
||||
{
|
||||
boxMon = GetBoxedMonPtr(boxId, monId);
|
||||
gender = GetBoxMonGender(boxMon);
|
||||
level = GetLevelFromBoxMonExp(boxMon);
|
||||
}
|
||||
|
||||
if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(str, gSpeciesNames[species]))
|
||||
gender = MON_GENDERLESS;
|
||||
|
||||
str_ = str; // For some reason, a variable is needed to match.
|
||||
while (*str_ != EOS)
|
||||
(str_++);
|
||||
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_SKIP;
|
||||
*(str_++) = 60;
|
||||
switch (gender)
|
||||
{
|
||||
default:
|
||||
*(str_++) = CHAR_SPACER; // Genderless
|
||||
break;
|
||||
case MON_MALE:
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_COLOR;
|
||||
*(str_++) = TEXT_COLOR_RED;
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_SHADOW;
|
||||
*(str_++) = TEXT_COLOR_LIGHT_RED;
|
||||
*(str_++) = CHAR_MALE;
|
||||
break;
|
||||
case MON_FEMALE:
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_COLOR;
|
||||
*(str_++) = TEXT_COLOR_GREEN;
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_SHADOW;
|
||||
*(str_++) = TEXT_COLOR_LIGHT_GREEN;
|
||||
*(str_++) = CHAR_FEMALE;
|
||||
break;
|
||||
}
|
||||
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
|
||||
*(str_++) = TEXT_COLOR_BLUE;
|
||||
*(str_++) = TEXT_COLOR_TRANSPARENT;
|
||||
*(str_++) = TEXT_COLOR_LIGHT_BLUE;
|
||||
*(str_++) = CHAR_SLASH;
|
||||
*(str_++) = CHAR_EXTRA_SYMBOL;
|
||||
*(str_++) = CHAR_LV_2;
|
||||
txtPtr = str_;
|
||||
str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||
lvlDigits = str_ - txtPtr;
|
||||
*(str_++) = CHAR_SPACE;
|
||||
if (!arg3)
|
||||
{
|
||||
lvlDigits = 3 - lvlDigits;
|
||||
while (lvlDigits-- != 0)
|
||||
*(str_++) = CHAR_SPACE;
|
||||
}
|
||||
|
||||
*str_ = EOS;
|
||||
return str_;
|
||||
}
|
||||
|
||||
static void CopyMonNameGenderLocation(s16 listId, u8 loadId)
|
||||
{
|
||||
u16 boxId, i;
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
if (listId != (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1))
|
||||
{
|
||||
CopyConditionMonNameGender(menu->nameText[loadId], listId, FALSE);
|
||||
boxId = monListPtr->monData[listId].boxId;
|
||||
menu->locationText[loadId][0] = EXT_CTRL_CODE_BEGIN;
|
||||
menu->locationText[loadId][1] = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
|
||||
menu->locationText[loadId][2] = TEXT_COLOR_BLUE;
|
||||
menu->locationText[loadId][3] = TEXT_COLOR_TRANSPARENT;
|
||||
menu->locationText[loadId][4] = TEXT_COLOR_LIGHT_BLUE;
|
||||
if (boxId == TOTAL_BOXES_COUNT)
|
||||
CopyStringLeftAlignedToConditionData(&menu->locationText[loadId][5], gText_InParty, BOX_NAME_LENGTH);
|
||||
else
|
||||
CopyStringLeftAlignedToConditionData(&menu->locationText[loadId][5], GetBoxNamePtr(boxId), BOX_NAME_LENGTH);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 12; i++)
|
||||
menu->nameText[loadId][i] = CHAR_SPACE;
|
||||
menu->nameText[loadId][i] = EOS;
|
||||
|
||||
for (i = 0; i < BOX_NAME_LENGTH; i++)
|
||||
menu->locationText[loadId][i] = CHAR_SPACE;
|
||||
menu->locationText[loadId][i] = EOS;
|
||||
}
|
||||
}
|
||||
|
||||
static void InitPartyConditionListParameters(void)
|
||||
{
|
||||
u16 i, count;
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
struct PokenavMonList *monListPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavMonList));
|
||||
|
||||
menu->inSearchMode = FALSE;
|
||||
for (i = 0, count = 0; i < CalculatePlayerPartyCount(); i++)
|
||||
{
|
||||
if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
|
||||
{
|
||||
monListPtr->monData[count].boxId = TOTAL_BOXES_COUNT;
|
||||
monListPtr->monData[count].monId = i;
|
||||
monListPtr->monData[count].data = 0;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
monListPtr->monData[count].boxId = 0;
|
||||
monListPtr->monData[count].monId = 0;
|
||||
monListPtr->monData[count].data = 0;
|
||||
monListPtr->currIndex = 0;
|
||||
monListPtr->listCount = count + 1;
|
||||
menu->state = 0;
|
||||
}
|
||||
|
||||
static void InitSearchResultsConditionList(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
menu->inSearchMode = TRUE;
|
||||
menu->state = 0;
|
||||
}
|
||||
|
||||
static void GetMonConditionGraphData(s16 listId, u8 loadId)
|
||||
{
|
||||
u16 boxId, monId, i;
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
if (listId != (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1))
|
||||
{
|
||||
boxId = monListPtr->monData[listId].boxId;
|
||||
monId = monListPtr->monData[listId].monId;
|
||||
menu->graph.conditions[loadId][CONDITION_COOL] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL);
|
||||
menu->graph.conditions[loadId][CONDITION_TOUGH] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL);
|
||||
menu->graph.conditions[loadId][CONDITION_SMART] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL);
|
||||
menu->graph.conditions[loadId][CONDITION_CUTE] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL);
|
||||
menu->graph.conditions[loadId][CONDITION_BEAUTY] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL);
|
||||
menu->numSparkles[loadId] = GET_NUM_CONDITION_SPARKLES(GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL));
|
||||
menu->monMarks[loadId] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_MARKINGS, NULL);
|
||||
ConditionGraph_CalcPositions(menu->graph.conditions[loadId], menu->graph.savedPositions[loadId]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Set empty graph point
|
||||
for (i = 0; i < CONDITION_COUNT; i++)
|
||||
{
|
||||
menu->graph.conditions[loadId][i] = 0;
|
||||
menu->graph.savedPositions[loadId][i].x = CONDITION_GRAPH_CENTER_X;
|
||||
menu->graph.savedPositions[loadId][i].y = CONDITION_GRAPH_CENTER_Y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void ConditionGraphDrawMonPic(s16 listId, u8 loadId)
|
||||
{
|
||||
u16 boxId, monId, species;
|
||||
u32 personality, tid;
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
if (listId == (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1))
|
||||
return;
|
||||
|
||||
boxId = monListPtr->monData[listId].boxId;
|
||||
monId = monListPtr->monData[listId].monId;
|
||||
species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES2, NULL);
|
||||
tid = GetBoxOrPartyMonData(boxId, monId, MON_DATA_OT_ID, NULL);
|
||||
personality = GetBoxOrPartyMonData(boxId, monId, MON_DATA_PERSONALITY, NULL);
|
||||
LoadSpecialPokePic(&gMonFrontPicTable[species], menu->monPicGfx[loadId], species, personality, TRUE);
|
||||
LZ77UnCompWram(GetMonSpritePalFromSpeciesAndPersonality(species, tid, personality), menu->monPal[loadId]);
|
||||
}
|
||||
|
||||
u16 GetMonListCount(void)
|
||||
{
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
return monListPtr->listCount;
|
||||
}
|
||||
|
||||
u16 GetConditionGraphCurrentListIndex(void)
|
||||
{
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
return monListPtr->currIndex;
|
||||
}
|
||||
|
||||
struct ConditionGraph *GetConditionGraphPtr(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
return &menu->graph;
|
||||
}
|
||||
|
||||
u8 GetConditionGraphMenuCurrentLoadIndex(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
return menu->loadId;
|
||||
}
|
||||
|
||||
u8 GetConditionGraphMenuToLoadListIndex(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
return menu->toLoadListIndex;
|
||||
}
|
||||
|
||||
void *GetConditionMonPicGfx(u8 loadId)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
return menu->monPicGfx[loadId];
|
||||
}
|
||||
|
||||
void *GetConditionMonPal(u8 loadId)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
return menu->monPal[loadId];
|
||||
}
|
||||
|
||||
u8 GetConditionGraphMenuToLoadId(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
return menu->toLoadId;
|
||||
}
|
||||
|
||||
u8 *GetConditionMonNameText(u8 loadId)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
return menu->nameText[loadId];
|
||||
}
|
||||
|
||||
u8 *GetConditionMonLocationText(u8 loadId)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
return menu->locationText[loadId];
|
||||
}
|
||||
|
||||
u16 GetConditionMonDataBuffer(void)
|
||||
{
|
||||
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
return monListPtr->monData[monListPtr->currIndex].data;
|
||||
}
|
||||
|
||||
bool32 IsConditionMenuSearchMode(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
if (menu->inSearchMode == TRUE)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Markings are only shown in search mode
|
||||
u8 TryGetMonMarkId(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
if (menu->inSearchMode == TRUE)
|
||||
return menu->monMarks[menu->loadId];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 GetNumConditionMonSparkles(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
|
||||
return menu->numSparkles[menu->loadId];
|
||||
}
|
||||
@@ -1,624 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "data.h"
|
||||
#include "decompress.h"
|
||||
#include "main.h"
|
||||
#include "menu_specialized.h"
|
||||
#include "mon_markings.h"
|
||||
#include "pokenav.h"
|
||||
#include "pokemon.h"
|
||||
#include "pokemon_storage_system.h"
|
||||
#include "sound.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "text.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct PokenavSub11
|
||||
{
|
||||
u32 monPal[3][0x20];
|
||||
u8 fill[0x180];
|
||||
u32 monPicGfx[3][MON_PIC_SIZE];
|
||||
u8 searchMode;
|
||||
s16 monIndex;
|
||||
u32 (*callback)(struct PokenavSub11 *);
|
||||
u8 fill2[0x6320 - 0x6308];
|
||||
u8 searchLocBuffer[3][24];
|
||||
u8 nameBuffer[3][64];
|
||||
struct ConditionGraph conditionData;
|
||||
u8 sheen[3];
|
||||
u8 monMarks[3];
|
||||
s8 mark;
|
||||
s8 unk6787;
|
||||
s8 unk6788;
|
||||
s8 unk6789;
|
||||
u8 state;
|
||||
};
|
||||
|
||||
void InitPartyConditionListParameters(void);
|
||||
void sub_81CD9F8(void);
|
||||
u32 HandlePartyConditionInput(struct PokenavSub11 *structPtr);
|
||||
u32 GetConditionReturnCallback(struct PokenavSub11 *structPtr);
|
||||
u32 ConditionMenu_OpenMarkingsMenu(struct PokenavSub11 *structPtr);
|
||||
u8 ConditionGraphHandleDpadInput(struct PokenavSub11 *structPtr);
|
||||
u8 SwitchConditionSummaryIndex(u8 moveUp);
|
||||
void CopyMonNameGenderLocation(s16 id, u8 arg1);
|
||||
void GetMonConditionGraphData(s16 id, u8 arg1);
|
||||
void ConditionGraphDrawMonPic(s16 id, u8 arg1);
|
||||
|
||||
// code
|
||||
bool32 PokenavCallback_Init_PartyCondition(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH, sizeof(struct PokenavSub11));
|
||||
|
||||
if (structPtr == NULL)
|
||||
return FALSE;
|
||||
|
||||
InitConditionGraphData(&structPtr->conditionData);
|
||||
InitPartyConditionListParameters();
|
||||
gKeyRepeatStartDelay = 20;
|
||||
structPtr->callback = HandlePartyConditionInput;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_ConditionGraphFromSearch(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH, sizeof(struct PokenavSub11));
|
||||
|
||||
if (structPtr == NULL)
|
||||
return FALSE;
|
||||
|
||||
InitConditionGraphData(&structPtr->conditionData);
|
||||
sub_81CD9F8();
|
||||
gKeyRepeatStartDelay = 20;
|
||||
structPtr->callback = HandlePartyConditionInput;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
u32 GetPartyConditionCallback(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
|
||||
return structPtr->callback(structPtr);
|
||||
}
|
||||
|
||||
u32 HandlePartyConditionInput(struct PokenavSub11 *structPtr)
|
||||
{
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
u32 ret = ConditionGraphHandleDpadInput(structPtr);
|
||||
|
||||
if (ret == PARTY_CONDITION_FUNC_NONE)
|
||||
{
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
structPtr->callback = GetConditionReturnCallback;
|
||||
ret = PARTY_CONDITION_FUNC_RETURN;
|
||||
}
|
||||
else if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
if (structPtr->searchMode == 0)
|
||||
{
|
||||
if (monListPtr->currIndex == monListPtr->listCount - 1)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
structPtr->callback = GetConditionReturnCallback;
|
||||
ret = PARTY_CONDITION_FUNC_RETURN;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ret = PARTY_CONDITION_FUNC_ADD_MARKINGS;
|
||||
structPtr->callback = ConditionMenu_OpenMarkingsMenu;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
u32 ConditionMenu_OpenMarkingsMenu(struct PokenavSub11 *structPtr)
|
||||
{
|
||||
struct PokenavSub18 *monListPtr;
|
||||
u8 markings;
|
||||
u32 ret = PARTY_CONDITION_FUNC_NONE, boxId, monId;
|
||||
|
||||
if (!HandleMonMarkingsMenuInput())
|
||||
{
|
||||
structPtr->monMarks[structPtr->mark] = GetMonMarkingsData();
|
||||
monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
boxId = monListPtr->monData[monListPtr->currIndex].boxId;
|
||||
monId = monListPtr->monData[monListPtr->currIndex].monId;
|
||||
markings = structPtr->monMarks[structPtr->mark];
|
||||
|
||||
if (boxId == TOTAL_BOXES_COUNT)
|
||||
SetMonData(&gPlayerParty[monId], MON_DATA_MARKINGS, &markings);
|
||||
else
|
||||
SetBoxMonDataAt(boxId, monId, MON_DATA_MARKINGS, &markings);
|
||||
|
||||
structPtr->callback = HandlePartyConditionInput;
|
||||
ret = PARTY_CONDITION_FUNC_CLOSE_MARKINGS;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
u32 GetConditionReturnCallback(struct PokenavSub11 *structPtr)
|
||||
{
|
||||
if (structPtr->searchMode == 0)
|
||||
return POKENAV_CONDITION_MENU;
|
||||
else
|
||||
return POKENAV_RETURN_CONDITION_SEARCH;
|
||||
}
|
||||
|
||||
void FreePartyConditionSubstruct1(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
if (structPtr->searchMode == 0)
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
}
|
||||
|
||||
u8 ConditionGraphHandleDpadInput(struct PokenavSub11 *structPtr)
|
||||
{
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
u8 ret = 0;
|
||||
|
||||
if (JOY_HELD(DPAD_UP))
|
||||
{
|
||||
if (structPtr->searchMode == 0 || monListPtr->currIndex != 0)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ret = SwitchConditionSummaryIndex(1);
|
||||
}
|
||||
}
|
||||
else if (JOY_HELD(DPAD_DOWN))
|
||||
{
|
||||
if (structPtr->searchMode == 0 || monListPtr->currIndex < monListPtr->listCount - 1)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ret = SwitchConditionSummaryIndex(0);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
u8 SwitchConditionSummaryIndex(u8 moveUp)
|
||||
{
|
||||
u16 r7;
|
||||
bool8 wasNotLastMon, isNotLastMon;
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
r7 = (moveUp) ? structPtr->unk6788 : structPtr->unk6787;
|
||||
sub_81D1F84(&structPtr->conditionData, structPtr->conditionData.unk14[structPtr->mark], structPtr->conditionData.unk14[r7]);
|
||||
wasNotLastMon = (monListPtr->currIndex != ((IsConditionMenuSearchMode() != 0) ? monListPtr->listCount : monListPtr->listCount - 1));
|
||||
if (moveUp)
|
||||
{
|
||||
structPtr->unk6788 = structPtr->unk6787;
|
||||
structPtr->unk6787 = structPtr->mark;
|
||||
structPtr->mark = r7;
|
||||
structPtr->unk6789 = structPtr->unk6788;
|
||||
|
||||
monListPtr->currIndex = (monListPtr->currIndex == 0) ? monListPtr->listCount - 1 : monListPtr->currIndex - 1;
|
||||
structPtr->monIndex = (monListPtr->currIndex != 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
structPtr->unk6787 = structPtr->unk6788;
|
||||
structPtr->unk6788 = structPtr->mark;
|
||||
structPtr->mark = r7;
|
||||
structPtr->unk6789 = structPtr->unk6787;
|
||||
|
||||
monListPtr->currIndex = (monListPtr->currIndex < monListPtr->listCount - 1) ? monListPtr->currIndex + 1 : 0;
|
||||
structPtr->monIndex = (monListPtr->currIndex < monListPtr->listCount - 1) ? monListPtr->currIndex + 1 : 0;
|
||||
}
|
||||
|
||||
isNotLastMon = (monListPtr->currIndex != ((IsConditionMenuSearchMode() != 0) ? monListPtr->listCount : monListPtr->listCount - 1));
|
||||
|
||||
if (!wasNotLastMon)
|
||||
return PARTY_CONDITION_FUNC_NO_TRANSITION;
|
||||
else if (!isNotLastMon)
|
||||
return PARTY_CONDITION_FUNC_SLIDE_MON_OUT;
|
||||
else
|
||||
return PARTY_CONDITION_FUNC_SLIDE_MON_IN;
|
||||
}
|
||||
|
||||
bool32 LoadPartyConditionMenuGfx(void)
|
||||
{
|
||||
s32 var;
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
switch (structPtr->state)
|
||||
{
|
||||
case 0:
|
||||
CopyMonNameGenderLocation(monListPtr->currIndex, 0);
|
||||
break;
|
||||
case 1:
|
||||
GetMonConditionGraphData(monListPtr->currIndex, 0);
|
||||
break;
|
||||
case 2:
|
||||
ConditionGraphDrawMonPic(monListPtr->currIndex, 0);
|
||||
break;
|
||||
case 3:
|
||||
if (monListPtr->listCount == 1)
|
||||
{
|
||||
structPtr->mark = 0;
|
||||
structPtr->unk6787 = 0;
|
||||
structPtr->unk6788 = 0;
|
||||
structPtr->state = 0;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
structPtr->mark = 0;
|
||||
structPtr->unk6787 = 1;
|
||||
structPtr->unk6788 = 2;
|
||||
}
|
||||
break;
|
||||
// These were probably ternaries just like cases 7-9, but couldn't match it any other way.
|
||||
case 4:
|
||||
var = monListPtr->currIndex + 1;
|
||||
if (var >= monListPtr->listCount)
|
||||
var = 0;
|
||||
CopyMonNameGenderLocation(var, 1);
|
||||
break;
|
||||
case 5:
|
||||
var = monListPtr->currIndex + 1;
|
||||
if (var >= monListPtr->listCount)
|
||||
var = 0;
|
||||
GetMonConditionGraphData(var, 1);
|
||||
break;
|
||||
case 6:
|
||||
var = monListPtr->currIndex + 1;
|
||||
if (var >= monListPtr->listCount)
|
||||
var = 0;
|
||||
ConditionGraphDrawMonPic(var, 1);
|
||||
break;
|
||||
case 7:
|
||||
CopyMonNameGenderLocation((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
|
||||
break;
|
||||
case 8:
|
||||
GetMonConditionGraphData((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
|
||||
break;
|
||||
case 9:
|
||||
ConditionGraphDrawMonPic((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
|
||||
structPtr->state = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
structPtr->state++;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool32 SetConditionGraphData(u8 mode)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
CopyMonNameGenderLocation(structPtr->monIndex, structPtr->unk6789);
|
||||
break;
|
||||
case 1:
|
||||
GetMonConditionGraphData(structPtr->monIndex, structPtr->unk6789);
|
||||
break;
|
||||
case 2:
|
||||
ConditionGraphDrawMonPic(structPtr->monIndex, structPtr->unk6789);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 *CopyStringLeftAlignedToConditionData(u8 *dst, const u8 *src, s16 n)
|
||||
{
|
||||
while (*src != EOS)
|
||||
*dst++ = *src++, n--;
|
||||
|
||||
while (n-- > 0)
|
||||
*dst++ = CHAR_SPACE;
|
||||
|
||||
*dst = EOS;
|
||||
return dst;
|
||||
}
|
||||
|
||||
u8 *CopyMonConditionNameGender(u8 *str, u16 id, bool8 arg3)
|
||||
{
|
||||
u16 boxId, monId, gender, species, level, lvlDigits;
|
||||
struct BoxPokemon *boxMon;
|
||||
u8 *txtPtr, *str_;
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
boxId = monListPtr->monData[id].boxId;
|
||||
monId = monListPtr->monData[id].monId;
|
||||
*(str++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
|
||||
*(str++) = TEXT_COLOR_BLUE;
|
||||
*(str++) = TEXT_COLOR_TRANSPARENT;
|
||||
*(str++) = TEXT_COLOR_LIGHT_BLUE;
|
||||
|
||||
if (GetBoxOrPartyMonData(boxId, monId, MON_DATA_IS_EGG, NULL))
|
||||
return StringCopyPadded(str, gText_EggNickname, CHAR_SPACE, 12);
|
||||
|
||||
GetBoxOrPartyMonData(boxId, monId, MON_DATA_NICKNAME, str);
|
||||
StringGetEnd10(str);
|
||||
species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES, NULL);
|
||||
if (boxId == TOTAL_BOXES_COUNT)
|
||||
{
|
||||
level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
|
||||
gender = GetMonGender(&gPlayerParty[monId]);
|
||||
}
|
||||
else
|
||||
{
|
||||
boxMon = GetBoxedMonPtr(boxId, monId);
|
||||
gender = GetBoxMonGender(boxMon);
|
||||
level = GetLevelFromBoxMonExp(boxMon);
|
||||
}
|
||||
|
||||
if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(str, gSpeciesNames[species]))
|
||||
gender = MON_GENDERLESS;
|
||||
|
||||
str_ = str; // For some reason, a variable is needed to match.
|
||||
while (*str_ != EOS)
|
||||
(str_++);
|
||||
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_SKIP;
|
||||
*(str_++) = 60;
|
||||
switch (gender)
|
||||
{
|
||||
default:
|
||||
*(str_++) = CHAR_SPACER; // Genderless
|
||||
break;
|
||||
case MON_MALE:
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_COLOR;
|
||||
*(str_++) = TEXT_COLOR_RED;
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_SHADOW;
|
||||
*(str_++) = TEXT_COLOR_LIGHT_RED;
|
||||
*(str_++) = CHAR_MALE;
|
||||
break;
|
||||
case MON_FEMALE:
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_COLOR;
|
||||
*(str_++) = TEXT_COLOR_GREEN;
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_SHADOW;
|
||||
*(str_++) = TEXT_COLOR_LIGHT_GREEN;
|
||||
*(str_++) = CHAR_FEMALE;
|
||||
break;
|
||||
}
|
||||
|
||||
*(str_++) = EXT_CTRL_CODE_BEGIN;
|
||||
*(str_++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
|
||||
*(str_++) = TEXT_COLOR_BLUE;
|
||||
*(str_++) = TEXT_COLOR_TRANSPARENT;
|
||||
*(str_++) = TEXT_COLOR_LIGHT_BLUE;
|
||||
*(str_++) = CHAR_SLASH;
|
||||
*(str_++) = CHAR_EXTRA_SYMBOL;
|
||||
*(str_++) = CHAR_LV_2;
|
||||
txtPtr = str_;
|
||||
str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||
lvlDigits = str_ - txtPtr;
|
||||
*(str_++) = CHAR_SPACE;
|
||||
if (!arg3)
|
||||
{
|
||||
lvlDigits = 3 - lvlDigits;
|
||||
while (lvlDigits-- != 0)
|
||||
*(str_++) = CHAR_SPACE;
|
||||
}
|
||||
|
||||
*str_ = EOS;
|
||||
return str_;
|
||||
}
|
||||
|
||||
void CopyMonNameGenderLocation(s16 id, u8 arg1)
|
||||
{
|
||||
u16 boxId, i;
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
if (id != (IsConditionMenuSearchMode() != 0 ? monListPtr->listCount : monListPtr->listCount - 1))
|
||||
{
|
||||
CopyMonConditionNameGender(structPtr->nameBuffer[arg1], id, FALSE);
|
||||
boxId = monListPtr->monData[id].boxId;
|
||||
structPtr->searchLocBuffer[arg1][0] = EXT_CTRL_CODE_BEGIN;
|
||||
structPtr->searchLocBuffer[arg1][1] = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
|
||||
structPtr->searchLocBuffer[arg1][2] = TEXT_COLOR_BLUE;
|
||||
structPtr->searchLocBuffer[arg1][3] = TEXT_COLOR_TRANSPARENT;
|
||||
structPtr->searchLocBuffer[arg1][4] = TEXT_COLOR_LIGHT_BLUE;
|
||||
if (boxId == TOTAL_BOXES_COUNT)
|
||||
CopyStringLeftAlignedToConditionData(&structPtr->searchLocBuffer[arg1][5], gText_InParty, 8);
|
||||
else
|
||||
CopyStringLeftAlignedToConditionData(&structPtr->searchLocBuffer[arg1][5], GetBoxNamePtr(boxId), BOX_NAME_LENGTH);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 12; i++)
|
||||
structPtr->nameBuffer[arg1][i] = CHAR_SPACE;
|
||||
structPtr->nameBuffer[arg1][i] = EOS;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
structPtr->searchLocBuffer[arg1][i] = CHAR_SPACE;
|
||||
structPtr->searchLocBuffer[arg1][i] = EOS;
|
||||
}
|
||||
}
|
||||
|
||||
void InitPartyConditionListParameters(void)
|
||||
{
|
||||
u16 i, count;
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
struct PokenavSub18 *monListPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavSub18));
|
||||
|
||||
structPtr->searchMode = 0;
|
||||
for (i = 0, count = 0; i < CalculatePlayerPartyCount(); i++)
|
||||
{
|
||||
if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
|
||||
{
|
||||
monListPtr->monData[count].boxId = TOTAL_BOXES_COUNT;
|
||||
monListPtr->monData[count].monId = i;
|
||||
monListPtr->monData[count].data = 0;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
monListPtr->monData[count].boxId = 0;
|
||||
monListPtr->monData[count].monId = 0;
|
||||
monListPtr->monData[count].data = 0;
|
||||
monListPtr->currIndex = 0;
|
||||
monListPtr->listCount = count + 1;
|
||||
structPtr->state = 0;
|
||||
}
|
||||
|
||||
void sub_81CD9F8(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
structPtr->searchMode = 1;
|
||||
structPtr->state = 0;
|
||||
}
|
||||
|
||||
void GetMonConditionGraphData(s16 id, u8 arg1)
|
||||
{
|
||||
u16 boxId, monId, i;
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
if (id != (IsConditionMenuSearchMode() != 0 ? monListPtr->listCount : monListPtr->listCount - 1))
|
||||
{
|
||||
boxId = monListPtr->monData[id].boxId;
|
||||
monId = monListPtr->monData[id].monId;
|
||||
structPtr->conditionData.stat[arg1][0] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL);
|
||||
structPtr->conditionData.stat[arg1][1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL);
|
||||
structPtr->conditionData.stat[arg1][2] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL);
|
||||
structPtr->conditionData.stat[arg1][3] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL);
|
||||
structPtr->conditionData.stat[arg1][4] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL);
|
||||
structPtr->sheen[arg1] = (GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) != 255)
|
||||
? GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) / 29u
|
||||
: 9;
|
||||
structPtr->monMarks[arg1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_MARKINGS, NULL);
|
||||
sub_81D2754(structPtr->conditionData.stat[arg1], structPtr->conditionData.unk14[arg1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < FLAVOR_COUNT; i++)
|
||||
{
|
||||
structPtr->conditionData.stat[arg1][i] = 0;
|
||||
structPtr->conditionData.unk14[arg1][i].unk0 = 155;
|
||||
structPtr->conditionData.unk14[arg1][i].unk2 = 91;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ConditionGraphDrawMonPic(s16 index, u8 arg1)
|
||||
{
|
||||
u16 boxId, monId, species;
|
||||
u32 personality, tid;
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
|
||||
if (index == (IsConditionMenuSearchMode() != 0 ? monListPtr->listCount : monListPtr->listCount - 1))
|
||||
return;
|
||||
|
||||
boxId = monListPtr->monData[index].boxId;
|
||||
monId = monListPtr->monData[index].monId;
|
||||
species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES2, NULL);
|
||||
tid = GetBoxOrPartyMonData(boxId, monId, MON_DATA_OT_ID, NULL);
|
||||
personality = GetBoxOrPartyMonData(boxId, monId, MON_DATA_PERSONALITY, NULL);
|
||||
LoadSpecialPokePic(&gMonFrontPicTable[species], structPtr->monPicGfx[arg1], species, personality, TRUE);
|
||||
LZ77UnCompWram(GetMonSpritePalFromSpeciesAndPersonality(species, tid, personality), structPtr->monPal[arg1]);
|
||||
}
|
||||
|
||||
u16 GetMonListCount(void)
|
||||
{
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
return monListPtr->listCount;
|
||||
}
|
||||
|
||||
u16 GetConditionGraphCurrentMonIndex(void)
|
||||
{
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
return monListPtr->currIndex;
|
||||
}
|
||||
|
||||
struct ConditionGraph *GetConditionGraphDataPtr(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
return &structPtr->conditionData;
|
||||
}
|
||||
|
||||
u8 GetMonMarkIndex(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
return structPtr->mark;
|
||||
}
|
||||
|
||||
u8 sub_81CDC9C(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
return structPtr->monIndex;
|
||||
}
|
||||
|
||||
void *GetConditionMonPicGfx(u8 id)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
return structPtr->monPicGfx[id];
|
||||
}
|
||||
|
||||
void *GetConditionMonPal(u8 id)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
return structPtr->monPal[id];
|
||||
}
|
||||
|
||||
u8 sub_81CDCEC(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
return structPtr->unk6789;
|
||||
}
|
||||
|
||||
u8 *GetConditionMonNameBuffer(u8 id)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
return structPtr->nameBuffer[id];
|
||||
}
|
||||
|
||||
u8 *GetConditionMonLocationBuffer(u8 id)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
return structPtr->searchLocBuffer[id];
|
||||
}
|
||||
|
||||
u16 GetConditionMonDataBuffer(void)
|
||||
{
|
||||
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
return monListPtr->monData[monListPtr->currIndex].data;
|
||||
}
|
||||
|
||||
bool32 IsConditionMenuSearchMode(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
if (structPtr->searchMode == 1)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 TryGetMonMarkId(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
if (structPtr->searchMode == 1)
|
||||
return structPtr->monMarks[structPtr->mark];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 GetMonSheen(void)
|
||||
{
|
||||
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
|
||||
return structPtr->sheen[structPtr->mark];
|
||||
}
|
||||
@@ -1,885 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "bg.h"
|
||||
#include "window.h"
|
||||
#include "pokenav.h"
|
||||
#include "decompress.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "graphics.h"
|
||||
#include "menu.h"
|
||||
#include "menu_specialized.h"
|
||||
#include "mon_markings.h"
|
||||
#include "palette.h"
|
||||
#include "pokenav.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "text.h"
|
||||
|
||||
u32 LoopedTask_TransitionMons(s32);
|
||||
u32 LoopedTask_ExitPartyConditionMenu(s32);
|
||||
u32 LoopedTask_MoveCursorNoTransition(s32);
|
||||
u32 LoopedTask_SlideMonOut(s32);
|
||||
u32 LoopedTask_OpenMonMarkingsWindow(s32);
|
||||
u32 LoopedTask_CloseMonMarkingsWindow(s32);
|
||||
|
||||
BSS_DATA u8 gUnknown_030012BC;
|
||||
|
||||
const u16 gConditionGraphData_Pal[] = INCBIN_U16("graphics/pokenav/condition/graph_data.gbapal");
|
||||
const u16 gConditionText_Pal[] = INCBIN_U16("graphics/pokenav/condition/text.gbapal");
|
||||
const u32 gUnknown_08623228[] = INCBIN_U32("graphics/pokenav/8623228.4bpp.lz");
|
||||
const u32 sConditionGraph_Tilemap[] = INCBIN_U32("graphics/pokenav/862323C.bin.lz");
|
||||
const u16 sConditionGraphMonMarkingsPal[] = INCBIN_U16("graphics/pokenav/8623338.gbapal");
|
||||
|
||||
const struct BgTemplate sPartyConditionBgTemplates[3] =
|
||||
{
|
||||
{
|
||||
.bg = 1,
|
||||
.charBaseIndex = 1,
|
||||
.mapBaseIndex = 0x1F,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0,
|
||||
.priority = 1,
|
||||
.baseTile = 0
|
||||
},
|
||||
{
|
||||
.bg = 2,
|
||||
.charBaseIndex = 3,
|
||||
.mapBaseIndex = 0x1D,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0,
|
||||
.priority = 2,
|
||||
.baseTile = 0
|
||||
},
|
||||
{
|
||||
.bg = 3,
|
||||
.charBaseIndex = 2,
|
||||
.mapBaseIndex = 0x1E,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0,
|
||||
.priority = 3,
|
||||
.baseTile = 0
|
||||
}
|
||||
};
|
||||
|
||||
const struct WindowTemplate sMonNameGenderWindowTemplate =
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 13,
|
||||
.tilemapTop = 1,
|
||||
.width = 13,
|
||||
.height = 4,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 2
|
||||
};
|
||||
|
||||
const struct WindowTemplate sConditionGraphListIdWindowTemplate =
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 6,
|
||||
.width = 7,
|
||||
.height = 2,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x36
|
||||
};
|
||||
|
||||
const struct WindowTemplate sUnusedWindowTemplate1 =
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 0x1C,
|
||||
.width = 5,
|
||||
.height = 2,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x44
|
||||
};
|
||||
|
||||
const struct WindowTemplate sUnusedWindowTemplate2 =
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 13,
|
||||
.tilemapTop = 0x1C,
|
||||
.width = 3,
|
||||
.height = 2,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x44
|
||||
};
|
||||
|
||||
const LoopedTask sPartyConditionLoopedTaskFuncs[] =
|
||||
{
|
||||
[PARTY_CONDITION_FUNC_NONE] = NULL,
|
||||
[PARTY_CONDITION_FUNC_SLIDE_MON_IN] = LoopedTask_TransitionMons,
|
||||
[PARTY_CONDITION_FUNC_RETURN] = LoopedTask_ExitPartyConditionMenu,
|
||||
[PARTY_CONDITION_FUNC_NO_TRANSITION] = LoopedTask_MoveCursorNoTransition,
|
||||
[PARTY_CONDITION_FUNC_SLIDE_MON_OUT] = LoopedTask_SlideMonOut,
|
||||
[PARTY_CONDITION_FUNC_ADD_MARKINGS] = LoopedTask_OpenMonMarkingsWindow,
|
||||
[PARTY_CONDITION_FUNC_CLOSE_MARKINGS] = LoopedTask_CloseMonMarkingsWindow
|
||||
};
|
||||
|
||||
struct Pokenav7Struct
|
||||
{
|
||||
u32 loopedTaskId;
|
||||
u8 tilemapBuffers[3][BG_SCREEN_SIZE];
|
||||
u8 filler[2];
|
||||
u8 partyPokeballSpriteIds[10];
|
||||
u32 (*callback)(void);
|
||||
s16 monTransitionX;
|
||||
u8 monPicSpriteId;
|
||||
u16 monPalIndex;
|
||||
u16 monGfxTileStart;
|
||||
void *unk181C;
|
||||
u8 nameGenderWindowId;
|
||||
u8 listIndexWindowId;
|
||||
u8 unusedWindowId1;
|
||||
u8 unusedWindowId2;
|
||||
struct MonMarkingsMenu monMarks;
|
||||
struct Sprite *monMarksSprite;
|
||||
struct Sprite *conditionSparkleSprites[MAX_CONDITION_SPARKLES];
|
||||
u8 windowModeState;
|
||||
u8 filler2[0x38ac - 0x2909];
|
||||
};
|
||||
|
||||
extern s8 GetMonMarkIndex(void); // This function's declaration here is s8 vs. u8 in pokenav_conditions_1.c
|
||||
|
||||
u32 LoopedTask_OpenPartyConditionGraph(s32 state);
|
||||
u32 GetPartyConditionLoopedTaskActive(void);
|
||||
void CreateConditionMonPic(u8 var);
|
||||
void CreateMonMarkingsOrPokeballIndicators(void);
|
||||
void CopyUnusedConditionWindowsToVram(void);
|
||||
bool32 UpdateConditionGraphWindows(u8 a0, u16 a1, bool8 a2);
|
||||
void sub_81CEE44(void);
|
||||
void DoConditionGraphTransition(void);
|
||||
void sub_81CEEC8(void);
|
||||
void sub_81CEE68(void);
|
||||
void ToggleBg2(bool8 showBg);
|
||||
|
||||
// code
|
||||
bool32 OpenPartyConditionMenu(void)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MON_MARK_MENU, sizeof(struct Pokenav7Struct));
|
||||
|
||||
if (structPtr == NULL)
|
||||
return FALSE;
|
||||
|
||||
structPtr->monPicSpriteId = SPRITE_NONE;
|
||||
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_OpenPartyConditionGraph, 1);
|
||||
structPtr->callback = GetPartyConditionLoopedTaskActive;
|
||||
structPtr->windowModeState = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CreatePartyConditionLoopedTask(s32 id)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
structPtr->loopedTaskId = CreateLoopedTask(sPartyConditionLoopedTaskFuncs[id], 1);
|
||||
structPtr->callback = GetPartyConditionLoopedTaskActive;
|
||||
}
|
||||
|
||||
u32 IsPartyConditionLoopedTaskActive(void)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
return structPtr->callback();
|
||||
}
|
||||
|
||||
u32 GetPartyConditionLoopedTaskActive(void)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
return IsLoopedTaskActive(structPtr->loopedTaskId);
|
||||
}
|
||||
|
||||
u32 LoopedTask_OpenPartyConditionGraph(s32 state)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
if (LoadPartyConditionMenuGfx() != TRUE)
|
||||
return LT_PAUSE;
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
InitBgTemplates(sPartyConditionBgTemplates, ARRAY_COUNT(sPartyConditionBgTemplates));
|
||||
ChangeBgX(1, 0, BG_COORD_SET);
|
||||
ChangeBgY(1, 0, BG_COORD_SET);
|
||||
ChangeBgX(2, 0, BG_COORD_SET);
|
||||
ChangeBgY(2, 0, BG_COORD_SET);
|
||||
ChangeBgX(3, 0, BG_COORD_SET);
|
||||
ChangeBgY(3, 0, BG_COORD_SET);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
|
||||
DecompressAndCopyTileDataToVram(3, gPokenavCondition_Gfx, 0, 0, 0);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 2:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
DecompressAndCopyTileDataToVram(2, gUnknown_08623228, 0, 0, 0);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
|
||||
LZ77UnCompVram(gPokenavCondition_Tilemap, structPtr->tilemapBuffers[0]);
|
||||
SetBgTilemapBuffer(3, structPtr->tilemapBuffers[0]);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
CopyToBgTilemapBufferRect(3, gPokenavOptions_Tilemap, 0, 5, 9, 4);
|
||||
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
CopyPaletteIntoBufferUnfaded(gPokenavCondition_Pal, 0x10, 0x20);
|
||||
CopyPaletteIntoBufferUnfaded(gConditionText_Pal, 0xF0, 0x20);
|
||||
structPtr->monTransitionX = -80;
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 4:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
|
||||
LZ77UnCompVram(sConditionGraph_Tilemap, structPtr->tilemapBuffers[2]);
|
||||
SetBgTilemapBuffer(2, structPtr->tilemapBuffers[2]);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
CopyPaletteIntoBufferUnfaded(gConditionGraphData_Pal, 0x30, 0x20);
|
||||
SetConditionGraphIOWindows(2);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 5:
|
||||
BgDmaFill(1, 0, 0, 1);
|
||||
BgDmaFill(1, 17, 1, 1);
|
||||
CpuFill32(0, structPtr->tilemapBuffers[1], BG_SCREEN_SIZE);
|
||||
SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 6:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
|
||||
structPtr->nameGenderWindowId = AddWindow(&sMonNameGenderWindowTemplate);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
structPtr->listIndexWindowId = AddWindow(&sConditionGraphListIdWindowTemplate);
|
||||
structPtr->unusedWindowId1 = AddWindow(&sUnusedWindowTemplate1);
|
||||
structPtr->unusedWindowId2 = AddWindow(&sUnusedWindowTemplate2);
|
||||
}
|
||||
DeactivateAllTextPrinters();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 7:
|
||||
CreateConditionMonPic(0);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 8:
|
||||
CreateMonMarkingsOrPokeballIndicators();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 9:
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
CopyUnusedConditionWindowsToVram();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 10:
|
||||
UpdateConditionGraphWindows(0, GetMonMarkIndex(), TRUE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 11:
|
||||
UpdateConditionGraphWindows(1, GetMonMarkIndex(), TRUE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 12:
|
||||
UpdateConditionGraphWindows(2, GetMonMarkIndex(), TRUE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 13:
|
||||
if (UpdateConditionGraphWindows(3, GetMonMarkIndex(), TRUE) != TRUE)
|
||||
return LT_PAUSE;
|
||||
PutWindowTilemap(structPtr->nameGenderWindowId);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
PutWindowTilemap(structPtr->listIndexWindowId);
|
||||
PutWindowTilemap(structPtr->unusedWindowId1);
|
||||
PutWindowTilemap(structPtr->unusedWindowId2);
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 14:
|
||||
ShowBg(1);
|
||||
HideBg(2);
|
||||
ShowBg(3);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 15:
|
||||
PokenavFadeScreen(1);
|
||||
if (!IsConditionMenuSearchMode())
|
||||
{
|
||||
LoadLeftHeaderGfxForIndex(POKENAV_GFX_PARTY_MENU);
|
||||
ShowLeftHeaderGfx(POKENAV_GFX_CONDITION_MENU, TRUE, 0);
|
||||
ShowLeftHeaderGfx(POKENAV_GFX_PARTY_MENU, TRUE, 0);
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 16:
|
||||
if (IsPaletteFadeActive())
|
||||
return LT_PAUSE;
|
||||
if (!IsConditionMenuSearchMode() && AreLeftHeaderSpritesMoving())
|
||||
return LT_PAUSE;
|
||||
SetVBlankCallback_(sub_81CEE44);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 17:
|
||||
DoConditionGraphTransition();
|
||||
InitConditionGraphState(GetConditionGraphDataPtr());
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 18:
|
||||
if (SetupConditionGraphScanlineParams(GetConditionGraphDataPtr()))
|
||||
return LT_PAUSE;
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 19:
|
||||
ToggleBg2(TRUE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 20:
|
||||
if (!TryUpdateConditionMonTransitionOn(GetConditionGraphDataPtr(), &structPtr->monTransitionX))
|
||||
{
|
||||
ResetConditionSparkleSprites(structPtr->conditionSparkleSprites);
|
||||
if (IsConditionMenuSearchMode() == TRUE || GetConditionGraphCurrentMonIndex() != GetMonListCount())
|
||||
CreateConditionSparkleSprites(structPtr->conditionSparkleSprites, structPtr->monPicSpriteId, GetMonSheen());
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
u32 LoopedTask_ExitPartyConditionMenu(s32 state)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
sub_81CEEC8();
|
||||
DestroyConditionSparkleSprites(structPtr->conditionSparkleSprites);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
if (TryUpdateConditionMonTransitionOff(GetConditionGraphDataPtr(), &structPtr->monTransitionX))
|
||||
return 2;
|
||||
ToggleBg2(FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
PokenavFadeScreen(0);
|
||||
if (!IsConditionMenuSearchMode())
|
||||
SlideMenuHeaderDown();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy())
|
||||
return LT_PAUSE;
|
||||
FreeConditionSparkles(structPtr->conditionSparkleSprites);
|
||||
HideBg(1);
|
||||
HideBg(2);
|
||||
HideBg(3);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
u32 LoopedTask_TransitionMons(s32 state)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
struct ConditionGraph *unkPtr = GetConditionGraphDataPtr();
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
SetConditionGraphData(0);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
SetConditionGraphData(1);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
SetConditionGraphData(2);
|
||||
DestroyConditionSparkleSprites(structPtr->conditionSparkleSprites);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 3:
|
||||
TransitionConditionGraph(unkPtr);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 4:
|
||||
if (!MoveConditionMonOffscreen(&structPtr->monTransitionX))
|
||||
{
|
||||
CreateConditionMonPic(GetMonMarkIndex());
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 5:
|
||||
UpdateConditionGraphWindows(0, GetMonMarkIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 6:
|
||||
UpdateConditionGraphWindows(1, GetMonMarkIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 7:
|
||||
UpdateConditionGraphWindows(2, GetMonMarkIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 8:
|
||||
if (UpdateConditionGraphWindows(3, GetMonMarkIndex(), FALSE) == TRUE)
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return LT_PAUSE;
|
||||
case 9:
|
||||
unkPtr = GetConditionGraphDataPtr();
|
||||
if (!TryUpdateConditionMonTransitionOn(unkPtr, &structPtr->monTransitionX))
|
||||
{
|
||||
ResetConditionSparkleSprites(structPtr->conditionSparkleSprites);
|
||||
if (IsConditionMenuSearchMode() != TRUE && GetConditionGraphCurrentMonIndex() == GetMonListCount())
|
||||
return LT_INC_AND_CONTINUE;
|
||||
|
||||
CreateConditionSparkleSprites(structPtr->conditionSparkleSprites, structPtr->monPicSpriteId, GetMonSheen());
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
u32 LoopedTask_MoveCursorNoTransition(s32 state)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
SetConditionGraphData(0);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
SetConditionGraphData(1);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
SetConditionGraphData(2);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 3:
|
||||
CreateConditionMonPic(GetMonMarkIndex());
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 4:
|
||||
UpdateConditionGraphWindows(0, GetMonMarkIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 5:
|
||||
UpdateConditionGraphWindows(1, GetMonMarkIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 6:
|
||||
UpdateConditionGraphWindows(2, GetMonMarkIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 7:
|
||||
if (UpdateConditionGraphWindows(3, GetMonMarkIndex(), FALSE) == TRUE)
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return LT_PAUSE;
|
||||
case 8:
|
||||
if (!TryUpdateConditionMonTransitionOn(GetConditionGraphDataPtr(), &structPtr->monTransitionX))
|
||||
{
|
||||
ResetConditionSparkleSprites(structPtr->conditionSparkleSprites);
|
||||
CreateConditionSparkleSprites(structPtr->conditionSparkleSprites, structPtr->monPicSpriteId, GetMonSheen());
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
u32 LoopedTask_SlideMonOut(s32 state)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
SetConditionGraphData(0);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
SetConditionGraphData(1);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
SetConditionGraphData(2);
|
||||
DestroyConditionSparkleSprites(structPtr->conditionSparkleSprites);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 3:
|
||||
if (!TryUpdateConditionMonTransitionOff(GetConditionGraphDataPtr(), &structPtr->monTransitionX))
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return LT_PAUSE;
|
||||
case 4:
|
||||
UpdateConditionGraphWindows(0, GetMonMarkIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 5:
|
||||
UpdateConditionGraphWindows(1, GetMonMarkIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 6:
|
||||
UpdateConditionGraphWindows(2, GetMonMarkIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 7:
|
||||
if (UpdateConditionGraphWindows(3, GetMonMarkIndex(), FALSE) == TRUE)
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return LT_PAUSE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
u32 LoopedTask_OpenMonMarkingsWindow(s32 state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
OpenMonMarkingsMenu(TryGetMonMarkId(), 176, 32);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
PrintHelpBarText(HELPBAR_CONDITION_MARKINGS);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
if (WaitForHelpBar() == TRUE)
|
||||
return LT_PAUSE;
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
u32 LoopedTask_CloseMonMarkingsWindow(s32 state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
FreeMonMarkingsMenu();
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
if (WaitForHelpBar() == TRUE)
|
||||
return LT_PAUSE;
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static u8 *UnusedPrintNumberString(u8 *dst, u16 num)
|
||||
{
|
||||
u8 *txtPtr = ConvertIntToDecimalStringN(dst, num, STR_CONV_MODE_RIGHT_ALIGN, 4);
|
||||
txtPtr = StringCopy(txtPtr, gText_Number2);
|
||||
|
||||
return txtPtr;
|
||||
}
|
||||
|
||||
bool32 UpdateConditionGraphWindows(u8 mode, u16 bufferIndex, bool8 winMode)
|
||||
{
|
||||
u8 text[32];
|
||||
const u8 *str;
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
FillWindowPixelBuffer(structPtr->nameGenderWindowId, 0);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
FillWindowPixelBuffer(structPtr->listIndexWindowId, 0);
|
||||
break;
|
||||
case 1:
|
||||
if (GetConditionGraphCurrentMonIndex() != GetMonListCount() - 1 || IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
str = GetConditionMonNameBuffer(bufferIndex);
|
||||
AddTextPrinterParameterized(structPtr->nameGenderWindowId, FONT_NORMAL, str, 0, 1, 0, NULL);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
str = GetConditionMonLocationBuffer(bufferIndex);
|
||||
AddTextPrinterParameterized(structPtr->nameGenderWindowId, FONT_NORMAL, str, 0, 17, 0, NULL);
|
||||
text[0] = EXT_CTRL_CODE_BEGIN;
|
||||
text[1] = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
|
||||
text[2] = TEXT_COLOR_BLUE;
|
||||
text[3] = TEXT_COLOR_TRANSPARENT;
|
||||
text[4] = TEXT_COLOR_LIGHT_BLUE;
|
||||
StringCopy(text + 5, gText_Number2);
|
||||
AddTextPrinterParameterized(structPtr->listIndexWindowId, FONT_NORMAL, text, 4, 1, 0, NULL);
|
||||
ConvertIntToDecimalStringN(text + 5, GetConditionMonDataBuffer(), STR_CONV_MODE_RIGHT_ALIGN, 4);
|
||||
AddTextPrinterParameterized(structPtr->listIndexWindowId, FONT_NORMAL, text, 28, 1, 0, NULL);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
switch (structPtr->windowModeState)
|
||||
{
|
||||
case 0:
|
||||
if (winMode)
|
||||
CopyWindowToVram(structPtr->nameGenderWindowId, COPYWIN_FULL);
|
||||
else
|
||||
CopyWindowToVram(structPtr->nameGenderWindowId, COPYWIN_GFX);
|
||||
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
structPtr->windowModeState++;
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
structPtr->windowModeState = 0;
|
||||
return TRUE;
|
||||
}
|
||||
case 1:
|
||||
if (winMode)
|
||||
CopyWindowToVram(structPtr->listIndexWindowId, COPYWIN_FULL);
|
||||
else
|
||||
CopyWindowToVram(structPtr->listIndexWindowId, COPYWIN_GFX);
|
||||
|
||||
structPtr->windowModeState = 0;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void CopyUnusedConditionWindowsToVram(void)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
CopyWindowToVram(structPtr->unusedWindowId1, COPYWIN_FULL);
|
||||
CopyWindowToVram(structPtr->unusedWindowId2, COPYWIN_FULL);
|
||||
}
|
||||
|
||||
void sub_81CE964(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0] == GetConditionGraphCurrentMonIndex())
|
||||
StartSpriteAnim(sprite, 0);
|
||||
else
|
||||
StartSpriteAnim(sprite, 1);
|
||||
}
|
||||
|
||||
void HighlightCurrentPartyIndexPokeball(struct Sprite *sprite)
|
||||
{
|
||||
if (GetConditionGraphCurrentMonIndex() == GetMonListCount() - 1)
|
||||
sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x65);
|
||||
else
|
||||
sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x66);
|
||||
}
|
||||
|
||||
void MonMarkingsCallback(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAnim(sprite, TryGetMonMarkId());
|
||||
}
|
||||
|
||||
void CreateMonMarkingsOrPokeballIndicators(void)
|
||||
{
|
||||
struct SpriteSheet sprSheets[4];
|
||||
struct SpriteTemplate sprTemplate;
|
||||
struct SpritePalette sprPals[3];
|
||||
struct SpriteSheet sprSheet;
|
||||
struct Sprite *sprite;
|
||||
u16 i, spriteId;
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
LoadConditionSelectionIcons(sprSheets, &sprTemplate, sprPals);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
structPtr->monMarks.baseTileTag = 0x6A;
|
||||
structPtr->monMarks.basePaletteTag = 0x6A;
|
||||
InitMonMarkingsMenu(&structPtr->monMarks);
|
||||
BufferMonMarkingsMenuTiles();
|
||||
sprite = CreateMonMarkingAllCombosSprite(0x69, 0x69, sConditionGraphMonMarkingsPal);
|
||||
sprite->oam.priority = 3;
|
||||
sprite->x = 192;
|
||||
sprite->y = 32;
|
||||
sprite->callback = MonMarkingsCallback;
|
||||
structPtr->monMarksSprite = sprite;
|
||||
PokenavFillPalette(IndexOfSpritePaletteTag(0x69), 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// party mode -> add pokeballs on right hand side
|
||||
LoadSpriteSheets(sprSheets);
|
||||
Pokenav_AllocAndLoadPalettes(sprPals);
|
||||
for (i = 0; i < GetMonListCount() - 1; i++)
|
||||
{
|
||||
spriteId = CreateSprite(&sprTemplate, 226, (i * 20) + 8, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
structPtr->partyPokeballSpriteIds[i] = spriteId;
|
||||
gSprites[spriteId].data[0] = i;
|
||||
gSprites[spriteId].callback = sub_81CE964;
|
||||
}
|
||||
else
|
||||
{
|
||||
structPtr->partyPokeballSpriteIds[i] = SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
sprTemplate.tileTag = 0x67;
|
||||
sprTemplate.callback = SpriteCallbackDummy;
|
||||
for (; i < 6; i++)
|
||||
{
|
||||
spriteId = CreateSprite(&sprTemplate, 230, (i * 20) + 8, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
structPtr->partyPokeballSpriteIds[i] = spriteId;
|
||||
gSprites[spriteId].oam.size = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
structPtr->partyPokeballSpriteIds[i] = SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
sprTemplate.tileTag = 0x66;
|
||||
sprTemplate.callback = HighlightCurrentPartyIndexPokeball;
|
||||
spriteId = CreateSprite(&sprTemplate, 222, (i * 20) + 8, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
structPtr->partyPokeballSpriteIds[i] = spriteId;
|
||||
gSprites[spriteId].oam.shape = SPRITE_SHAPE(32x16);
|
||||
gSprites[spriteId].oam.size = SPRITE_SIZE(32x16);
|
||||
}
|
||||
else
|
||||
{
|
||||
structPtr->partyPokeballSpriteIds[i] = SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
LoadConditionSparkle(&sprSheet, &sprPals[0]);
|
||||
LoadSpriteSheet(&sprSheet);
|
||||
sprPals[1].data = NULL;
|
||||
Pokenav_AllocAndLoadPalettes(sprPals);
|
||||
}
|
||||
|
||||
void sub_81CEBF4(struct Pokenav7Struct *structPtr)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
DestroySprite(structPtr->monMarksSprite);
|
||||
FreeSpriteTilesByTag(0x6A);
|
||||
FreeSpriteTilesByTag(0x69);
|
||||
FreeSpritePaletteByTag(0x6A);
|
||||
FreeSpritePaletteByTag(0x69);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 7; i++)
|
||||
DestroySprite(&gSprites[structPtr->partyPokeballSpriteIds[i]]);
|
||||
|
||||
FreeSpriteTilesByTag(0x65);
|
||||
FreeSpriteTilesByTag(0x66);
|
||||
FreeSpriteTilesByTag(0x67);
|
||||
FreeSpritePaletteByTag(0x65);
|
||||
FreeSpritePaletteByTag(0x66);
|
||||
}
|
||||
|
||||
if (structPtr->monPicSpriteId != SPRITE_NONE)
|
||||
{
|
||||
DestroySprite(&gSprites[structPtr->monPicSpriteId]);
|
||||
FreeSpriteTilesByTag(0x64);
|
||||
FreeSpritePaletteByTag(0x64);
|
||||
}
|
||||
}
|
||||
|
||||
void FreePartyConditionSubstruct2(void)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
RemoveWindow(structPtr->nameGenderWindowId);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
RemoveWindow(structPtr->listIndexWindowId);
|
||||
RemoveWindow(structPtr->unusedWindowId1);
|
||||
RemoveWindow(structPtr->unusedWindowId2);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetLeftHeaderSpritesInvisibility();
|
||||
}
|
||||
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);
|
||||
sub_81CEBF4(structPtr);
|
||||
sub_81CEE68();
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
}
|
||||
|
||||
void MonPicGfxSpriteCallback(struct Sprite *sprite)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
sprite->x = structPtr->monTransitionX + 38;
|
||||
}
|
||||
|
||||
void CreateConditionMonPic(u8 id)
|
||||
{
|
||||
struct SpriteTemplate sprTemplate;
|
||||
struct SpriteSheet sprSheet;
|
||||
struct SpritePalette sprPal;
|
||||
u8 spriteId;
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
if (structPtr->monPicSpriteId == SPRITE_NONE)
|
||||
{
|
||||
LoadConditionMonPicTemplate(&sprSheet, &sprTemplate, &sprPal);
|
||||
sprSheet.data = GetConditionMonPicGfx(id);
|
||||
sprPal.data = GetConditionMonPal(id);
|
||||
structPtr->monPalIndex = LoadSpritePalette(&sprPal);
|
||||
structPtr->monGfxTileStart = LoadSpriteSheet(&sprSheet);
|
||||
spriteId = CreateSprite(&sprTemplate, 38, 104, 0);
|
||||
structPtr->monPicSpriteId = spriteId;
|
||||
if (spriteId == MAX_SPRITES)
|
||||
{
|
||||
FreeSpriteTilesByTag(0x64);
|
||||
FreeSpritePaletteByTag(0x64);
|
||||
structPtr->monPicSpriteId = SPRITE_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
structPtr->monPicSpriteId = spriteId;
|
||||
gSprites[structPtr->monPicSpriteId].callback = MonPicGfxSpriteCallback;
|
||||
structPtr->unk181C = (void*)(VRAM) + 0x10000 + (structPtr->monGfxTileStart * 32);
|
||||
structPtr->monPalIndex = (structPtr->monPalIndex * 16) + 0x100;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DmaCopy16Defvars(3, GetConditionMonPicGfx(id), structPtr->unk181C, MON_PIC_SIZE);
|
||||
LoadPalette(GetConditionMonPal(id), structPtr->monPalIndex, 0x20);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_81CEE44(void)
|
||||
{
|
||||
struct ConditionGraph *unk = GetConditionGraphDataPtr();
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
sub_81D2108(unk);
|
||||
ScanlineEffect_InitHBlankDmaTransfer();
|
||||
}
|
||||
|
||||
void sub_81CEE68(void)
|
||||
{
|
||||
SetPokenavVBlankCallback();
|
||||
}
|
||||
|
||||
void ToggleBg2(bool8 showBg)
|
||||
{
|
||||
if (showBg)
|
||||
ShowBg(2);
|
||||
else
|
||||
HideBg(2);
|
||||
}
|
||||
|
||||
void DoConditionGraphTransition(void)
|
||||
{
|
||||
struct ConditionGraph *conditionPtr = GetConditionGraphDataPtr();
|
||||
u8 id = GetMonMarkIndex();
|
||||
|
||||
gUnknown_030012BC = id;
|
||||
sub_81D1F84(conditionPtr, conditionPtr->unk14[3], conditionPtr->unk14[id]);
|
||||
TransitionConditionGraph(conditionPtr);
|
||||
}
|
||||
|
||||
void sub_81CEEC8(void)
|
||||
{
|
||||
struct ConditionGraph *conditionPtr = GetConditionGraphDataPtr();
|
||||
|
||||
if (IsConditionMenuSearchMode() || GetConditionGraphCurrentMonIndex() != GetMonListCount() - 1)
|
||||
sub_81D1F84(conditionPtr, conditionPtr->unk14[GetMonMarkIndex()], conditionPtr->unk14[3]);
|
||||
}
|
||||
|
||||
u8 GetMonMarkingsData(void)
|
||||
{
|
||||
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
|
||||
|
||||
if (IsConditionMenuSearchMode() == 1)
|
||||
return structPtr->monMarks.markings;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,892 @@
|
||||
#include "global.h"
|
||||
#include "bg.h"
|
||||
#include "window.h"
|
||||
#include "pokenav.h"
|
||||
#include "decompress.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "graphics.h"
|
||||
#include "menu.h"
|
||||
#include "menu_specialized.h"
|
||||
#include "mon_markings.h"
|
||||
#include "palette.h"
|
||||
#include "pokenav.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "text.h"
|
||||
|
||||
static u32 LoopedTask_TransitionMons(s32);
|
||||
static u32 LoopedTask_ExitConditionGraphMenu(s32);
|
||||
static u32 LoopedTask_MoveCursorNoTransition(s32);
|
||||
static u32 LoopedTask_SlideMonOut(s32);
|
||||
static u32 LoopedTask_OpenMonMarkingsWindow(s32);
|
||||
static u32 LoopedTask_CloseMonMarkingsWindow(s32);
|
||||
|
||||
static u8 sInitialLoadId; // Never read
|
||||
|
||||
const u16 gConditionGraphData_Pal[] = INCBIN_U16("graphics/pokenav/condition/graph_data.gbapal");
|
||||
const u16 gConditionText_Pal[] = INCBIN_U16("graphics/pokenav/condition/text.gbapal");
|
||||
static const u32 sConditionGraphData_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph_data.4bpp.lz");
|
||||
static const u32 sConditionGraphData_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph_data.bin.lz");
|
||||
static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/pokenav/condition/mon_markings.gbapal");
|
||||
|
||||
static const struct BgTemplate sMenuBgTemplates[3] =
|
||||
{
|
||||
{
|
||||
.bg = 1,
|
||||
.charBaseIndex = 1,
|
||||
.mapBaseIndex = 0x1F,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0,
|
||||
.priority = 1,
|
||||
.baseTile = 0
|
||||
},
|
||||
{
|
||||
.bg = 2,
|
||||
.charBaseIndex = 3,
|
||||
.mapBaseIndex = 0x1D,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0,
|
||||
.priority = 2,
|
||||
.baseTile = 0
|
||||
},
|
||||
{
|
||||
.bg = 3,
|
||||
.charBaseIndex = 2,
|
||||
.mapBaseIndex = 0x1E,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0,
|
||||
.priority = 3,
|
||||
.baseTile = 0
|
||||
}
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sMonNameGenderWindowTemplate =
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 13,
|
||||
.tilemapTop = 1,
|
||||
.width = 13,
|
||||
.height = 4,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 2
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sListIndexWindowTemplate =
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 6,
|
||||
.width = 7,
|
||||
.height = 2,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x36
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sUnusedWindowTemplate1 =
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 0x1C,
|
||||
.width = 5,
|
||||
.height = 2,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x44
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sUnusedWindowTemplate2 =
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 13,
|
||||
.tilemapTop = 0x1C,
|
||||
.width = 3,
|
||||
.height = 2,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x44
|
||||
};
|
||||
|
||||
static const LoopedTask sLoopedTaskFuncs[] =
|
||||
{
|
||||
[CONDITION_FUNC_NONE] = NULL,
|
||||
[CONDITION_FUNC_SLIDE_MON_IN] = LoopedTask_TransitionMons,
|
||||
[CONDITION_FUNC_RETURN] = LoopedTask_ExitConditionGraphMenu,
|
||||
[CONDITION_FUNC_NO_TRANSITION] = LoopedTask_MoveCursorNoTransition,
|
||||
[CONDITION_FUNC_SLIDE_MON_OUT] = LoopedTask_SlideMonOut,
|
||||
[CONDITION_FUNC_ADD_MARKINGS] = LoopedTask_OpenMonMarkingsWindow,
|
||||
[CONDITION_FUNC_CLOSE_MARKINGS] = LoopedTask_CloseMonMarkingsWindow
|
||||
};
|
||||
|
||||
struct Pokenav_ConditionMenuGfx
|
||||
{
|
||||
u32 loopedTaskId;
|
||||
u8 tilemapBuffers[3][BG_SCREEN_SIZE];
|
||||
u8 filler[2];
|
||||
u8 partyPokeballSpriteIds[PARTY_SIZE + 1];
|
||||
u32 (*callback)(void);
|
||||
s16 monTransitionX;
|
||||
u8 monPicSpriteId;
|
||||
u16 monPalIndex;
|
||||
u16 monGfxTileStart;
|
||||
void *monGfxPtr;
|
||||
u8 nameGenderWindowId;
|
||||
u8 listIndexWindowId;
|
||||
u8 unusedWindowId1;
|
||||
u8 unusedWindowId2;
|
||||
struct MonMarkingsMenu marksMenu;
|
||||
struct Sprite *monMarksSprite;
|
||||
struct Sprite *conditionSparkleSprites[MAX_CONDITION_SPARKLES];
|
||||
u8 windowModeState;
|
||||
u8 filler2[0xFA3];
|
||||
};
|
||||
|
||||
extern s8 GetConditionGraphMenuCurrentLoadIndex(void); // This function's declaration here is s8 vs. u8 in pokenav_conditions.c
|
||||
|
||||
static u32 LoopedTask_OpenConditionGraphMenu(s32);
|
||||
static u32 GetConditionGraphMenuLoopedTaskActive(void);
|
||||
static void CreateConditionMonPic(u8);
|
||||
static void CreateMonMarkingsOrPokeballIndicators(void);
|
||||
static void CopyUnusedConditionWindowsToVram(void);
|
||||
static bool32 UpdateConditionGraphMenuWindows(u8, u16, bool8);
|
||||
static void VBlankCB_PokenavConditionGraph(void);
|
||||
static void DoConditionGraphEnterTransition(void);
|
||||
static void DoConditionGraphExitTransition(void);
|
||||
static void SetExitVBlank(void);
|
||||
static void ToggleGraphData(bool8);
|
||||
|
||||
bool32 OpenConditionGraphMenu(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX, sizeof(struct Pokenav_ConditionMenuGfx));
|
||||
|
||||
if (menu == NULL)
|
||||
return FALSE;
|
||||
|
||||
menu->monPicSpriteId = SPRITE_NONE;
|
||||
menu->loopedTaskId = CreateLoopedTask(LoopedTask_OpenConditionGraphMenu, 1);
|
||||
menu->callback = GetConditionGraphMenuLoopedTaskActive;
|
||||
menu->windowModeState = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CreateConditionGraphMenuLoopedTask(s32 id)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
menu->loopedTaskId = CreateLoopedTask(sLoopedTaskFuncs[id], 1);
|
||||
menu->callback = GetConditionGraphMenuLoopedTaskActive;
|
||||
}
|
||||
|
||||
u32 IsConditionGraphMenuLoopedTaskActive(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
return menu->callback();
|
||||
}
|
||||
|
||||
static u32 GetConditionGraphMenuLoopedTaskActive(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
return IsLoopedTaskActive(menu->loopedTaskId);
|
||||
}
|
||||
|
||||
static u32 LoopedTask_OpenConditionGraphMenu(s32 state)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
if (LoadConditionGraphMenuGfx() != TRUE)
|
||||
return LT_PAUSE;
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
InitBgTemplates(sMenuBgTemplates, ARRAY_COUNT(sMenuBgTemplates));
|
||||
ChangeBgX(1, 0, BG_COORD_SET);
|
||||
ChangeBgY(1, 0, BG_COORD_SET);
|
||||
ChangeBgX(2, 0, BG_COORD_SET);
|
||||
ChangeBgY(2, 0, BG_COORD_SET);
|
||||
ChangeBgX(3, 0, BG_COORD_SET);
|
||||
ChangeBgY(3, 0, BG_COORD_SET);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
|
||||
DecompressAndCopyTileDataToVram(3, gPokenavCondition_Gfx, 0, 0, 0);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 2:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
DecompressAndCopyTileDataToVram(2, sConditionGraphData_Gfx, 0, 0, 0);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
|
||||
LZ77UnCompVram(gPokenavCondition_Tilemap, menu->tilemapBuffers[0]);
|
||||
SetBgTilemapBuffer(3, menu->tilemapBuffers[0]);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
CopyToBgTilemapBufferRect(3, gPokenavOptions_Tilemap, 0, 5, 9, 4);
|
||||
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
CopyPaletteIntoBufferUnfaded(gPokenavCondition_Pal, 0x10, 0x20);
|
||||
CopyPaletteIntoBufferUnfaded(gConditionText_Pal, 0xF0, 0x20);
|
||||
menu->monTransitionX = -80;
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 4:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
|
||||
LZ77UnCompVram(sConditionGraphData_Tilemap, menu->tilemapBuffers[2]);
|
||||
SetBgTilemapBuffer(2, menu->tilemapBuffers[2]);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
CopyPaletteIntoBufferUnfaded(gConditionGraphData_Pal, 0x30, 0x20);
|
||||
ConditionGraph_InitWindow(2);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 5:
|
||||
BgDmaFill(1, 0, 0, 1);
|
||||
BgDmaFill(1, 17, 1, 1);
|
||||
CpuFill32(0, menu->tilemapBuffers[1], BG_SCREEN_SIZE);
|
||||
SetBgTilemapBuffer(1, menu->tilemapBuffers[1]);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 6:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
|
||||
menu->nameGenderWindowId = AddWindow(&sMonNameGenderWindowTemplate);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
menu->listIndexWindowId = AddWindow(&sListIndexWindowTemplate);
|
||||
menu->unusedWindowId1 = AddWindow(&sUnusedWindowTemplate1);
|
||||
menu->unusedWindowId2 = AddWindow(&sUnusedWindowTemplate2);
|
||||
}
|
||||
DeactivateAllTextPrinters();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 7:
|
||||
CreateConditionMonPic(0);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 8:
|
||||
CreateMonMarkingsOrPokeballIndicators();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 9:
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
CopyUnusedConditionWindowsToVram();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 10:
|
||||
UpdateConditionGraphMenuWindows(0, GetConditionGraphMenuCurrentLoadIndex(), TRUE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 11:
|
||||
UpdateConditionGraphMenuWindows(1, GetConditionGraphMenuCurrentLoadIndex(), TRUE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 12:
|
||||
UpdateConditionGraphMenuWindows(2, GetConditionGraphMenuCurrentLoadIndex(), TRUE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 13:
|
||||
if (UpdateConditionGraphMenuWindows(3, GetConditionGraphMenuCurrentLoadIndex(), TRUE) != TRUE)
|
||||
return LT_PAUSE;
|
||||
PutWindowTilemap(menu->nameGenderWindowId);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
PutWindowTilemap(menu->listIndexWindowId);
|
||||
PutWindowTilemap(menu->unusedWindowId1);
|
||||
PutWindowTilemap(menu->unusedWindowId2);
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 14:
|
||||
ShowBg(1);
|
||||
HideBg(2);
|
||||
ShowBg(3);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 15:
|
||||
PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
|
||||
if (!IsConditionMenuSearchMode())
|
||||
{
|
||||
LoadLeftHeaderGfxForIndex(POKENAV_GFX_PARTY_MENU);
|
||||
ShowLeftHeaderGfx(POKENAV_GFX_CONDITION_MENU, TRUE, 0);
|
||||
ShowLeftHeaderGfx(POKENAV_GFX_PARTY_MENU, TRUE, 0);
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 16:
|
||||
if (IsPaletteFadeActive())
|
||||
return LT_PAUSE;
|
||||
if (!IsConditionMenuSearchMode() && AreLeftHeaderSpritesMoving())
|
||||
return LT_PAUSE;
|
||||
SetVBlankCallback_(VBlankCB_PokenavConditionGraph);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 17:
|
||||
DoConditionGraphEnterTransition();
|
||||
ConditionGraph_InitResetScanline(GetConditionGraphPtr());
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 18:
|
||||
if (ConditionGraph_ResetScanline(GetConditionGraphPtr()))
|
||||
return LT_PAUSE;
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 19:
|
||||
ToggleGraphData(TRUE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 20:
|
||||
if (!ConditionMenu_UpdateMonEnter(GetConditionGraphPtr(), &menu->monTransitionX))
|
||||
{
|
||||
ResetConditionSparkleSprites(menu->conditionSparkleSprites);
|
||||
if (IsConditionMenuSearchMode() == TRUE || GetConditionGraphCurrentListIndex() != GetMonListCount())
|
||||
CreateConditionSparkleSprites(menu->conditionSparkleSprites, menu->monPicSpriteId, GetNumConditionMonSparkles());
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static u32 LoopedTask_ExitConditionGraphMenu(s32 state)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
DoConditionGraphExitTransition();
|
||||
DestroyConditionSparkleSprites(menu->conditionSparkleSprites);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
if (ConditionMenu_UpdateMonExit(GetConditionGraphPtr(), &menu->monTransitionX))
|
||||
return 2;
|
||||
ToggleGraphData(FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
|
||||
if (!IsConditionMenuSearchMode())
|
||||
SlideMenuHeaderDown();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy())
|
||||
return LT_PAUSE;
|
||||
FreeConditionSparkles(menu->conditionSparkleSprites);
|
||||
HideBg(1);
|
||||
HideBg(2);
|
||||
HideBg(3);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static u32 LoopedTask_TransitionMons(s32 state)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
struct ConditionGraph *graph = GetConditionGraphPtr();
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_INFO);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
LoadNextConditionMenuMonData(CONDITION_LOAD_GRAPH);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_PIC);
|
||||
DestroyConditionSparkleSprites(menu->conditionSparkleSprites);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 3:
|
||||
ConditionGraph_TryUpdate(graph);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 4:
|
||||
if (!MoveConditionMonOffscreen(&menu->monTransitionX))
|
||||
{
|
||||
CreateConditionMonPic(GetConditionGraphMenuCurrentLoadIndex());
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 5:
|
||||
UpdateConditionGraphMenuWindows(0, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 6:
|
||||
UpdateConditionGraphMenuWindows(1, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 7:
|
||||
UpdateConditionGraphMenuWindows(2, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 8:
|
||||
if (UpdateConditionGraphMenuWindows(3, GetConditionGraphMenuCurrentLoadIndex(), FALSE) == TRUE)
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return LT_PAUSE;
|
||||
case 9:
|
||||
graph = GetConditionGraphPtr();
|
||||
if (!ConditionMenu_UpdateMonEnter(graph, &menu->monTransitionX))
|
||||
{
|
||||
ResetConditionSparkleSprites(menu->conditionSparkleSprites);
|
||||
if (IsConditionMenuSearchMode() != TRUE && GetConditionGraphCurrentListIndex() == GetMonListCount())
|
||||
return LT_INC_AND_CONTINUE;
|
||||
|
||||
CreateConditionSparkleSprites(menu->conditionSparkleSprites, menu->monPicSpriteId, GetNumConditionMonSparkles());
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static u32 LoopedTask_MoveCursorNoTransition(s32 state)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_INFO);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
LoadNextConditionMenuMonData(CONDITION_LOAD_GRAPH);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_PIC);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 3:
|
||||
CreateConditionMonPic(GetConditionGraphMenuCurrentLoadIndex());
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 4:
|
||||
UpdateConditionGraphMenuWindows(0, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 5:
|
||||
UpdateConditionGraphMenuWindows(1, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 6:
|
||||
UpdateConditionGraphMenuWindows(2, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 7:
|
||||
if (UpdateConditionGraphMenuWindows(3, GetConditionGraphMenuCurrentLoadIndex(), FALSE) == TRUE)
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return LT_PAUSE;
|
||||
case 8:
|
||||
if (!ConditionMenu_UpdateMonEnter(GetConditionGraphPtr(), &menu->monTransitionX))
|
||||
{
|
||||
ResetConditionSparkleSprites(menu->conditionSparkleSprites);
|
||||
CreateConditionSparkleSprites(menu->conditionSparkleSprites, menu->monPicSpriteId, GetNumConditionMonSparkles());
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static u32 LoopedTask_SlideMonOut(s32 state)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_INFO);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
LoadNextConditionMenuMonData(CONDITION_LOAD_GRAPH);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_PIC);
|
||||
DestroyConditionSparkleSprites(menu->conditionSparkleSprites);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 3:
|
||||
if (!ConditionMenu_UpdateMonExit(GetConditionGraphPtr(), &menu->monTransitionX))
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return LT_PAUSE;
|
||||
case 4:
|
||||
UpdateConditionGraphMenuWindows(0, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 5:
|
||||
UpdateConditionGraphMenuWindows(1, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 6:
|
||||
UpdateConditionGraphMenuWindows(2, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 7:
|
||||
if (UpdateConditionGraphMenuWindows(3, GetConditionGraphMenuCurrentLoadIndex(), FALSE) == TRUE)
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return LT_PAUSE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static u32 LoopedTask_OpenMonMarkingsWindow(s32 state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
OpenMonMarkingsMenu(TryGetMonMarkId(), 176, 32);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
PrintHelpBarText(HELPBAR_CONDITION_MARKINGS);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
if (WaitForHelpBar() == TRUE)
|
||||
return LT_PAUSE;
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static u32 LoopedTask_CloseMonMarkingsWindow(s32 state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
FreeMonMarkingsMenu();
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 2:
|
||||
if (WaitForHelpBar() == TRUE)
|
||||
return LT_PAUSE;
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static u8 *UnusedPrintNumberString(u8 *dst, u16 num)
|
||||
{
|
||||
u8 *txtPtr = ConvertIntToDecimalStringN(dst, num, STR_CONV_MODE_RIGHT_ALIGN, 4);
|
||||
txtPtr = StringCopy(txtPtr, gText_Number2);
|
||||
|
||||
return txtPtr;
|
||||
}
|
||||
|
||||
static bool32 UpdateConditionGraphMenuWindows(u8 mode, u16 bufferIndex, bool8 winMode)
|
||||
{
|
||||
u8 text[32];
|
||||
const u8 *str;
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
FillWindowPixelBuffer(menu->nameGenderWindowId, 0);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
FillWindowPixelBuffer(menu->listIndexWindowId, 0);
|
||||
break;
|
||||
case 1:
|
||||
if (GetConditionGraphCurrentListIndex() != GetMonListCount() - 1 || IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
str = GetConditionMonNameText(bufferIndex);
|
||||
AddTextPrinterParameterized(menu->nameGenderWindowId, FONT_NORMAL, str, 0, 1, 0, NULL);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
str = GetConditionMonLocationText(bufferIndex);
|
||||
AddTextPrinterParameterized(menu->nameGenderWindowId, FONT_NORMAL, str, 0, 17, 0, NULL);
|
||||
text[0] = EXT_CTRL_CODE_BEGIN;
|
||||
text[1] = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
|
||||
text[2] = TEXT_COLOR_BLUE;
|
||||
text[3] = TEXT_COLOR_TRANSPARENT;
|
||||
text[4] = TEXT_COLOR_LIGHT_BLUE;
|
||||
StringCopy(&text[5], gText_Number2);
|
||||
AddTextPrinterParameterized(menu->listIndexWindowId, FONT_NORMAL, text, 4, 1, 0, NULL);
|
||||
ConvertIntToDecimalStringN(&text[5], GetConditionMonDataBuffer(), STR_CONV_MODE_RIGHT_ALIGN, 4);
|
||||
AddTextPrinterParameterized(menu->listIndexWindowId, FONT_NORMAL, text, 28, 1, 0, NULL);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
switch (menu->windowModeState)
|
||||
{
|
||||
case 0:
|
||||
if (winMode)
|
||||
CopyWindowToVram(menu->nameGenderWindowId, COPYWIN_FULL);
|
||||
else
|
||||
CopyWindowToVram(menu->nameGenderWindowId, COPYWIN_GFX);
|
||||
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
menu->windowModeState++;
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->windowModeState = 0;
|
||||
return TRUE;
|
||||
}
|
||||
case 1:
|
||||
if (winMode)
|
||||
CopyWindowToVram(menu->listIndexWindowId, COPYWIN_FULL);
|
||||
else
|
||||
CopyWindowToVram(menu->listIndexWindowId, COPYWIN_GFX);
|
||||
|
||||
menu->windowModeState = 0;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void CopyUnusedConditionWindowsToVram(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
CopyWindowToVram(menu->unusedWindowId1, COPYWIN_FULL);
|
||||
CopyWindowToVram(menu->unusedWindowId2, COPYWIN_FULL);
|
||||
}
|
||||
|
||||
static void SpriteCB_PartyPokeball(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0] == GetConditionGraphCurrentListIndex())
|
||||
StartSpriteAnim(sprite, CONDITION_ICON_SELECTED);
|
||||
else
|
||||
StartSpriteAnim(sprite, CONDITION_ICON_UNSELECTED);
|
||||
}
|
||||
|
||||
void HighlightCurrentPartyIndexPokeball(struct Sprite *sprite)
|
||||
{
|
||||
if (GetConditionGraphCurrentListIndex() == GetMonListCount() - 1)
|
||||
sprite->oam.paletteNum = IndexOfSpritePaletteTag(TAG_CONDITION_BALL);
|
||||
else
|
||||
sprite->oam.paletteNum = IndexOfSpritePaletteTag(TAG_CONDITION_CANCEL);
|
||||
}
|
||||
|
||||
void MonMarkingsCallback(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAnim(sprite, TryGetMonMarkId());
|
||||
}
|
||||
|
||||
static void CreateMonMarkingsOrPokeballIndicators(void)
|
||||
{
|
||||
struct SpriteSheet sprSheets[4];
|
||||
struct SpriteTemplate sprTemplate;
|
||||
struct SpritePalette sprPals[3];
|
||||
struct SpriteSheet sprSheet;
|
||||
struct Sprite *sprite;
|
||||
u16 i, spriteId;
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
LoadConditionSelectionIcons(sprSheets, &sprTemplate, sprPals);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
// Search Mode, load markings menu
|
||||
menu->marksMenu.baseTileTag = TAG_CONDITION_MARKINGS_MENU;
|
||||
menu->marksMenu.basePaletteTag = TAG_CONDITION_MARKINGS_MENU;
|
||||
InitMonMarkingsMenu(&menu->marksMenu);
|
||||
BufferMonMarkingsMenuTiles();
|
||||
sprite = CreateMonMarkingAllCombosSprite(TAG_CONDITION_MON_MARKINGS, TAG_CONDITION_MON_MARKINGS, sMonMarkings_Pal);
|
||||
sprite->oam.priority = 3;
|
||||
sprite->x = 192;
|
||||
sprite->y = 32;
|
||||
sprite->callback = MonMarkingsCallback;
|
||||
menu->monMarksSprite = sprite;
|
||||
PokenavFillPalette(IndexOfSpritePaletteTag(TAG_CONDITION_MON_MARKINGS), 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Party Mode, load Pokéball selection icons
|
||||
LoadSpriteSheets(sprSheets);
|
||||
Pokenav_AllocAndLoadPalettes(sprPals);
|
||||
|
||||
// Add icons for occupied slots
|
||||
for (i = 0; i < GetMonListCount() - 1; i++)
|
||||
{
|
||||
spriteId = CreateSprite(&sprTemplate, 226, (i * 20) + 8, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
menu->partyPokeballSpriteIds[i] = spriteId;
|
||||
gSprites[spriteId].data[0] = i;
|
||||
gSprites[spriteId].callback = SpriteCB_PartyPokeball;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->partyPokeballSpriteIds[i] = SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
// Add icons for empty slots
|
||||
sprTemplate.tileTag = TAG_CONDITION_BALL_PLACEHOLDER;
|
||||
sprTemplate.callback = SpriteCallbackDummy;
|
||||
for (; i < PARTY_SIZE; i++)
|
||||
{
|
||||
spriteId = CreateSprite(&sprTemplate, 230, (i * 20) + 8, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
menu->partyPokeballSpriteIds[i] = spriteId;
|
||||
gSprites[spriteId].oam.size = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->partyPokeballSpriteIds[i] = SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
// Add cancel icon
|
||||
sprTemplate.tileTag = TAG_CONDITION_CANCEL;
|
||||
sprTemplate.callback = HighlightCurrentPartyIndexPokeball;
|
||||
spriteId = CreateSprite(&sprTemplate, 222, (i * 20) + 8, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
menu->partyPokeballSpriteIds[i] = spriteId;
|
||||
gSprites[spriteId].oam.shape = SPRITE_SHAPE(32x16);
|
||||
gSprites[spriteId].oam.size = SPRITE_SIZE(32x16);
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->partyPokeballSpriteIds[i] = SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
LoadConditionSparkle(&sprSheet, &sprPals[0]);
|
||||
LoadSpriteSheet(&sprSheet);
|
||||
sprPals[1].data = NULL;
|
||||
Pokenav_AllocAndLoadPalettes(sprPals);
|
||||
}
|
||||
|
||||
static void FreeConditionMenuGfx(struct Pokenav_ConditionMenuGfx *menu)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
DestroySprite(menu->monMarksSprite);
|
||||
FreeSpriteTilesByTag(TAG_CONDITION_MARKINGS_MENU);
|
||||
FreeSpriteTilesByTag(TAG_CONDITION_MON_MARKINGS);
|
||||
FreeSpritePaletteByTag(TAG_CONDITION_MARKINGS_MENU);
|
||||
FreeSpritePaletteByTag(TAG_CONDITION_MON_MARKINGS);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < PARTY_SIZE + 1; i++)
|
||||
DestroySprite(&gSprites[menu->partyPokeballSpriteIds[i]]);
|
||||
|
||||
FreeSpriteTilesByTag(TAG_CONDITION_BALL);
|
||||
FreeSpriteTilesByTag(TAG_CONDITION_CANCEL);
|
||||
FreeSpriteTilesByTag(TAG_CONDITION_BALL_PLACEHOLDER);
|
||||
FreeSpritePaletteByTag(TAG_CONDITION_BALL);
|
||||
FreeSpritePaletteByTag(TAG_CONDITION_CANCEL);
|
||||
}
|
||||
|
||||
if (menu->monPicSpriteId != SPRITE_NONE)
|
||||
{
|
||||
DestroySprite(&gSprites[menu->monPicSpriteId]);
|
||||
FreeSpriteTilesByTag(TAG_CONDITION_MON);
|
||||
FreeSpritePaletteByTag(TAG_CONDITION_MON);
|
||||
}
|
||||
}
|
||||
|
||||
void FreeConditionGraphMenuSubstruct2(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
RemoveWindow(menu->nameGenderWindowId);
|
||||
if (IsConditionMenuSearchMode() == TRUE)
|
||||
{
|
||||
RemoveWindow(menu->listIndexWindowId);
|
||||
RemoveWindow(menu->unusedWindowId1);
|
||||
RemoveWindow(menu->unusedWindowId2);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetLeftHeaderSpritesInvisibility();
|
||||
}
|
||||
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);
|
||||
FreeConditionMenuGfx(menu);
|
||||
SetExitVBlank();
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
}
|
||||
|
||||
void MonPicGfxSpriteCallback(struct Sprite *sprite)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
sprite->x = menu->monTransitionX + 38;
|
||||
}
|
||||
|
||||
static void CreateConditionMonPic(u8 id)
|
||||
{
|
||||
struct SpriteTemplate sprTemplate;
|
||||
struct SpriteSheet sprSheet;
|
||||
struct SpritePalette sprPal;
|
||||
u8 spriteId;
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
if (menu->monPicSpriteId == SPRITE_NONE)
|
||||
{
|
||||
LoadConditionMonPicTemplate(&sprSheet, &sprTemplate, &sprPal);
|
||||
sprSheet.data = GetConditionMonPicGfx(id);
|
||||
sprPal.data = GetConditionMonPal(id);
|
||||
menu->monPalIndex = LoadSpritePalette(&sprPal);
|
||||
menu->monGfxTileStart = LoadSpriteSheet(&sprSheet);
|
||||
spriteId = CreateSprite(&sprTemplate, 38, 104, 0);
|
||||
menu->monPicSpriteId = spriteId;
|
||||
if (spriteId == MAX_SPRITES)
|
||||
{
|
||||
FreeSpriteTilesByTag(TAG_CONDITION_MON);
|
||||
FreeSpritePaletteByTag(TAG_CONDITION_MON);
|
||||
menu->monPicSpriteId = SPRITE_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->monPicSpriteId = spriteId;
|
||||
gSprites[menu->monPicSpriteId].callback = MonPicGfxSpriteCallback;
|
||||
menu->monGfxPtr = (void*)VRAM + BG_VRAM_SIZE + (menu->monGfxTileStart * 32);
|
||||
menu->monPalIndex = (menu->monPalIndex * 16) + 0x100;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DmaCopy16Defvars(3, GetConditionMonPicGfx(id), menu->monGfxPtr, MON_PIC_SIZE);
|
||||
LoadPalette(GetConditionMonPal(id), menu->monPalIndex, 0x20);
|
||||
}
|
||||
}
|
||||
|
||||
static void VBlankCB_PokenavConditionGraph(void)
|
||||
{
|
||||
struct ConditionGraph *graph = GetConditionGraphPtr();
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
ConditionGraph_Draw(graph);
|
||||
ScanlineEffect_InitHBlankDmaTransfer();
|
||||
}
|
||||
|
||||
static void SetExitVBlank(void)
|
||||
{
|
||||
SetPokenavVBlankCallback();
|
||||
}
|
||||
|
||||
static void ToggleGraphData(bool8 showBg)
|
||||
{
|
||||
if (showBg)
|
||||
ShowBg(2);
|
||||
else
|
||||
HideBg(2);
|
||||
}
|
||||
|
||||
static void DoConditionGraphEnterTransition(void)
|
||||
{
|
||||
struct ConditionGraph *graph = GetConditionGraphPtr();
|
||||
u8 id = GetConditionGraphMenuCurrentLoadIndex();
|
||||
|
||||
sInitialLoadId = id;
|
||||
ConditionGraph_SetNewPositions(graph, graph->savedPositions[CONDITION_GRAPH_LOAD_MAX - 1], graph->savedPositions[id]);
|
||||
ConditionGraph_TryUpdate(graph);
|
||||
}
|
||||
|
||||
// Transition the graph back to empty before exiting.
|
||||
// This is skipped if the player is in party mode and the cursor
|
||||
// is on Cancel, in which case the graph is already empty.
|
||||
static void DoConditionGraphExitTransition(void)
|
||||
{
|
||||
struct ConditionGraph *graph = GetConditionGraphPtr();
|
||||
|
||||
if (IsConditionMenuSearchMode() || GetConditionGraphCurrentListIndex() != GetMonListCount() - 1)
|
||||
ConditionGraph_SetNewPositions(graph, graph->savedPositions[GetConditionGraphMenuCurrentLoadIndex()], graph->savedPositions[CONDITION_GRAPH_LOAD_MAX - 1]);
|
||||
}
|
||||
|
||||
u8 GetMonMarkingsData(void)
|
||||
{
|
||||
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
|
||||
|
||||
if (IsConditionMenuSearchMode() == 1)
|
||||
return menu->marksMenu.markings;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
@@ -21,50 +21,50 @@ enum
|
||||
CONDITION_SEARCH_FUNC_SELECT_MON,
|
||||
};
|
||||
|
||||
struct PokenavSub7
|
||||
struct Pokenav_SearchResults
|
||||
{
|
||||
u32 (*callback)(struct PokenavSub7 *);
|
||||
u32 (*callback)(struct Pokenav_SearchResults *);
|
||||
u32 loopedTaskId;
|
||||
u8 fill1[4];
|
||||
s32 boxId;
|
||||
s32 monId;
|
||||
u32 conditionDataId;
|
||||
u32 returnFromGraph;
|
||||
u32 isPartyCondition;
|
||||
struct PokenavSub18 *monList;
|
||||
bool32 returnFromGraph;
|
||||
bool32 saveResultsList;
|
||||
struct PokenavMonList *monList;
|
||||
};
|
||||
|
||||
struct PokenavSub8
|
||||
struct Pokenav_SearchResultsGfx
|
||||
{
|
||||
bool32 (*callback)(void);
|
||||
u32 ltid; //looped task Id
|
||||
u32 loopedTaskId;
|
||||
u16 winid;
|
||||
bool32 fromGraph;
|
||||
u8 buff[BG_SCREEN_SIZE];
|
||||
}; // size: 0x810
|
||||
|
||||
static u32 HandleConditionSearchInput_WaitSetup(struct PokenavSub7 *structPtr);
|
||||
static u32 HandleConditionSearchInput(struct PokenavSub7 *structPtr);
|
||||
static u32 OpenConditionGraphFromSearchList(struct PokenavSub7 *structPtr);
|
||||
static u32 ReturnToConditionSearchList(struct PokenavSub7 *structPtr);
|
||||
static u32 GetConditionSearchLoopedTask(s32 state);
|
||||
static u32 BuildPartyMonSearchResults(s32 state);
|
||||
static u32 InitBoxMonSearchResults(s32 state);
|
||||
static u32 BuildBoxMonSearchResults(s32 state);
|
||||
static u32 sub_81CF278(s32 state);
|
||||
static u32 LoopedTask_MoveSearchListCursorUp(s32 state);
|
||||
static u32 LoopedTask_MoveSearchListCursorDown(s32 state);
|
||||
static u32 LoopedTask_MoveSearchListPageUp(s32 state);
|
||||
static u32 LoopedTask_MoveSearchListPageDown(s32 state);
|
||||
static u32 LoopedTask_ExitConditionSearchMenu(s32 state);
|
||||
static u32 LoopedTask_SelectSearchResult(s32 state);
|
||||
static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item);
|
||||
static u32 HandleConditionSearchInput_WaitSetup(struct Pokenav_SearchResults *);
|
||||
static u32 HandleConditionSearchInput(struct Pokenav_SearchResults *);
|
||||
static u32 OpenConditionGraphFromSearchList(struct Pokenav_SearchResults *);
|
||||
static u32 ReturnToConditionSearchList(struct Pokenav_SearchResults *);
|
||||
static u32 GetConditionSearchLoopedTask(s32);
|
||||
static u32 BuildPartyMonSearchResults(s32);
|
||||
static u32 InitBoxMonSearchResults(s32);
|
||||
static u32 BuildBoxMonSearchResults(s32);
|
||||
static u32 ConvertConditionsToListRanks(s32);
|
||||
static u32 LoopedTask_MoveSearchListCursorUp(s32);
|
||||
static u32 LoopedTask_MoveSearchListCursorDown(s32);
|
||||
static u32 LoopedTask_MoveSearchListPageUp(s32);
|
||||
static u32 LoopedTask_MoveSearchListPageDown(s32);
|
||||
static u32 LoopedTask_ExitConditionSearchMenu(s32);
|
||||
static u32 LoopedTask_SelectSearchResult(s32);
|
||||
static void InsertMonListItem(struct Pokenav_SearchResults *, struct PokenavMonListItem *);
|
||||
static bool32 GetSearchResultCurrentLoopedTaskActive(void);
|
||||
static u32 LoopedTask_OpenConditionSearchResults(s32 state);
|
||||
static void AddSearchResultListMenuWindow(struct PokenavSub8 *);
|
||||
static void PrintSearchResultListMenuItems(struct PokenavSub8 *);
|
||||
static void InitConditionSearchListMenuTemplate(void);
|
||||
static void PrintSearchMonListItem(struct PokenavMonList *, u8 *);
|
||||
static u32 LoopedTask_OpenConditionSearchResults(s32);
|
||||
static void AddSearchResultListMenuWindow(struct Pokenav_SearchResultsGfx *);
|
||||
static void PrintSearchResultListMenuItems(struct Pokenav_SearchResultsGfx *);
|
||||
static void CreateSearchResultsList(void);
|
||||
static void BufferSearchMonListItem(struct PokenavMonListItem *, u8 *);
|
||||
|
||||
static const u32 sSearchMonDataIds[] = {MON_DATA_COOL, MON_DATA_BEAUTY, MON_DATA_CUTE, MON_DATA_SMART, MON_DATA_TOUGH};
|
||||
|
||||
@@ -73,13 +73,13 @@ static const LoopedTask sConditionSearchLoopedTaskFuncs[] =
|
||||
BuildPartyMonSearchResults,
|
||||
InitBoxMonSearchResults,
|
||||
BuildBoxMonSearchResults,
|
||||
sub_81CF278
|
||||
ConvertConditionsToListRanks
|
||||
};
|
||||
|
||||
static const u16 sConditionSearchResultFramePal[] = INCBIN_U16("graphics/pokenav/condition_search2.gbapal");
|
||||
static const u32 sConditionSearchResultTiles[] = INCBIN_U32("graphics/pokenav/condition_search2.4bpp.lz");
|
||||
static const u32 sConditionSearchResultTilemap[] = INCBIN_U32("graphics/pokenav/condition_search2.bin.lz");
|
||||
static const u16 gUnknown_08623570[] = INCBIN_U16("graphics/pokenav/8623570.gbapal");
|
||||
static const u16 sConditionSearchResultFramePal[] = INCBIN_U16("graphics/pokenav/condition/search_results.gbapal");
|
||||
static const u32 sConditionSearchResultTiles[] = INCBIN_U32("graphics/pokenav/condition/search_results.4bpp.lz");
|
||||
static const u32 sConditionSearchResultTilemap[] = INCBIN_U32("graphics/pokenav/condition/search_results.bin.lz");
|
||||
static const u16 sListBg_Pal[] = INCBIN_U16("graphics/pokenav/condition/search_results_list.gbapal");
|
||||
|
||||
static const struct BgTemplate sConditionSearchResultBgTemplates[] =
|
||||
{
|
||||
@@ -130,57 +130,57 @@ static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}");
|
||||
|
||||
bool32 PokenavCallback_Init_ConditionSearch(void)
|
||||
{
|
||||
struct PokenavSub7 *structPtr = AllocSubstruct(7, sizeof(struct PokenavSub7));
|
||||
if (structPtr == NULL)
|
||||
struct Pokenav_SearchResults *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS, sizeof(struct Pokenav_SearchResults));
|
||||
if (menu == NULL)
|
||||
return FALSE;
|
||||
|
||||
structPtr->monList = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavSub18));
|
||||
if (structPtr->monList == NULL)
|
||||
menu->monList = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavMonList));
|
||||
if (menu->monList == NULL)
|
||||
return FALSE;
|
||||
|
||||
structPtr->callback = HandleConditionSearchInput_WaitSetup;
|
||||
structPtr->loopedTaskId = CreateLoopedTask(GetConditionSearchLoopedTask, 1);
|
||||
structPtr->returnFromGraph = 0;
|
||||
structPtr->conditionDataId = sSearchMonDataIds[GetSelectedConditionSearch()];
|
||||
menu->callback = HandleConditionSearchInput_WaitSetup;
|
||||
menu->loopedTaskId = CreateLoopedTask(GetConditionSearchLoopedTask, 1);
|
||||
menu->returnFromGraph = FALSE;
|
||||
menu->conditionDataId = sSearchMonDataIds[GetSelectedConditionSearch()];
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// return to search results from condition graph
|
||||
bool32 PokenavCallback_Init_ReturnToMonSearchList(void)
|
||||
{
|
||||
struct PokenavSub7 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS, sizeof(struct PokenavSub7));
|
||||
if (structPtr == NULL)
|
||||
struct Pokenav_SearchResults *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS, sizeof(struct Pokenav_SearchResults));
|
||||
if (menu == NULL)
|
||||
return FALSE;
|
||||
|
||||
structPtr->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
structPtr->callback = HandleConditionSearchInput;
|
||||
structPtr->returnFromGraph = 1;
|
||||
structPtr->conditionDataId = sSearchMonDataIds[GetSelectedConditionSearch()];
|
||||
menu->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
menu->callback = HandleConditionSearchInput;
|
||||
menu->returnFromGraph = TRUE;
|
||||
menu->conditionDataId = sSearchMonDataIds[GetSelectedConditionSearch()];
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
u32 GetConditionSearchResultsCallback(void)
|
||||
{
|
||||
struct PokenavSub7 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return structPtr->callback(structPtr);
|
||||
struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return menu->callback(menu);
|
||||
}
|
||||
|
||||
void FreeSearchResultSubstruct1(void)
|
||||
{
|
||||
struct PokenavSub7 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
if (structPtr->isPartyCondition == 0)
|
||||
struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
if (!menu->saveResultsList)
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
}
|
||||
|
||||
static bool32 HandleConditionSearchInput_WaitSetup(struct PokenavSub7 *structPtr)
|
||||
static bool32 HandleConditionSearchInput_WaitSetup(struct Pokenav_SearchResults *menu)
|
||||
{
|
||||
if (!IsLoopedTaskActive(structPtr->loopedTaskId))
|
||||
structPtr->callback = HandleConditionSearchInput;
|
||||
if (!IsLoopedTaskActive(menu->loopedTaskId))
|
||||
menu->callback = HandleConditionSearchInput;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static u32 HandleConditionSearchInput(struct PokenavSub7 *structPtr)
|
||||
static u32 HandleConditionSearchInput(struct Pokenav_SearchResults *menu)
|
||||
{
|
||||
if (JOY_REPEAT(DPAD_UP))
|
||||
return CONDITION_SEARCH_FUNC_MOVE_UP;
|
||||
@@ -192,60 +192,63 @@ static u32 HandleConditionSearchInput(struct PokenavSub7 *structPtr)
|
||||
return CONDITION_SEARCH_FUNC_PAGE_DOWN;
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
structPtr->isPartyCondition = 0;
|
||||
structPtr->callback = ReturnToConditionSearchList;
|
||||
// Exiting back to main search menu
|
||||
menu->saveResultsList = FALSE;
|
||||
menu->callback = ReturnToConditionSearchList;
|
||||
return CONDITION_SEARCH_FUNC_EXIT;
|
||||
}
|
||||
else if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
structPtr->monList->currIndex = GetSelectedPokenavListIndex();
|
||||
structPtr->isPartyCondition = 1;
|
||||
structPtr->callback = OpenConditionGraphFromSearchList;
|
||||
// Entering graph menu
|
||||
menu->monList->currIndex = PokenavList_GetSelectedIndex();
|
||||
menu->saveResultsList = TRUE;
|
||||
menu->callback = OpenConditionGraphFromSearchList;
|
||||
return CONDITION_SEARCH_FUNC_SELECT_MON;
|
||||
}
|
||||
else
|
||||
return CONDITION_SEARCH_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 ReturnToConditionSearchList(struct PokenavSub7 *structPtr)
|
||||
static u32 ReturnToConditionSearchList(struct Pokenav_SearchResults *menu)
|
||||
{
|
||||
return POKENAV_CONDITION_SEARCH_MENU;
|
||||
}
|
||||
|
||||
static u32 OpenConditionGraphFromSearchList(struct PokenavSub7 *structPtr)
|
||||
static u32 OpenConditionGraphFromSearchList(struct Pokenav_SearchResults *menu)
|
||||
{
|
||||
return POKENAV_CONDITION_GRAPH_FROM_SEARCH;
|
||||
return POKENAV_CONDITION_GRAPH_SEARCH;
|
||||
}
|
||||
|
||||
static u32 sub_81CF0C0(void)
|
||||
static u32 GetReturningFromGraph(void)
|
||||
{
|
||||
struct PokenavSub7 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return structPtr->returnFromGraph;
|
||||
struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return menu->returnFromGraph;
|
||||
}
|
||||
|
||||
static struct PokenavMonList * GetSearchResultsMonDataList(void)
|
||||
static struct PokenavMonListItem * GetSearchResultsMonDataList(void)
|
||||
{
|
||||
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return ptr->monList->monData;
|
||||
struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return menu->monList->monData;
|
||||
}
|
||||
|
||||
static u16 GetSearchResultsMonListCount(void)
|
||||
{
|
||||
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return ptr->monList->listCount;
|
||||
struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return menu->monList->listCount;
|
||||
}
|
||||
|
||||
static s32 GetSearchResultsSelectedMonData(void)
|
||||
// data below has been set by ConvertConditionsToListRanks
|
||||
static s32 GetSearchResultsSelectedMonRank(void)
|
||||
{
|
||||
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
s32 i = GetSelectedPokenavListIndex();
|
||||
return ptr->monList->monData[i].data;
|
||||
struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
s32 i = PokenavList_GetSelectedIndex();
|
||||
return menu->monList->monData[i].data;
|
||||
}
|
||||
|
||||
static u16 sub_81CF10C(void)
|
||||
static u16 GetSearchResultsCurrentListIndex(void)
|
||||
{
|
||||
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return ptr->monList->currIndex;
|
||||
struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
return menu->monList->currIndex;
|
||||
}
|
||||
|
||||
static u32 GetConditionSearchLoopedTask(s32 state)
|
||||
@@ -256,12 +259,12 @@ static u32 GetConditionSearchLoopedTask(s32 state)
|
||||
static u32 BuildPartyMonSearchResults(s32 state)
|
||||
{
|
||||
s32 i;
|
||||
struct PokenavMonList item;
|
||||
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
struct PokenavMonListItem item;
|
||||
struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
|
||||
ptr->monList->listCount = 0;
|
||||
ptr->monList->currIndex = 0;
|
||||
item.boxId = 14;
|
||||
menu->monList->listCount = 0;
|
||||
menu->monList->currIndex = 0;
|
||||
item.boxId = TOTAL_BOXES_COUNT;
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
struct Pokemon * pokemon = &gPlayerParty[i];
|
||||
@@ -270,8 +273,8 @@ static u32 BuildPartyMonSearchResults(s32 state)
|
||||
if (!GetMonData(pokemon, MON_DATA_SANITY_IS_EGG))
|
||||
{
|
||||
item.monId = i;
|
||||
item.data = GetMonData(pokemon, ptr->conditionDataId);
|
||||
sub_81CF2C4(ptr, &item);
|
||||
item.data = GetMonData(pokemon, menu->conditionDataId);
|
||||
InsertMonListItem(menu, &item);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,19 +283,19 @@ static u32 BuildPartyMonSearchResults(s32 state)
|
||||
|
||||
static u32 InitBoxMonSearchResults(s32 state)
|
||||
{
|
||||
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
ptr->monId = 0;
|
||||
ptr->boxId = 0;
|
||||
struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
menu->monId = 0;
|
||||
menu->boxId = 0;
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
|
||||
static u32 BuildBoxMonSearchResults(s32 state)
|
||||
{
|
||||
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
s32 boxId = ptr->boxId;
|
||||
s32 monId = ptr->monId;
|
||||
struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
s32 boxId = menu->boxId;
|
||||
s32 monId = menu->monId;
|
||||
s32 boxCount = 0;
|
||||
struct PokenavMonList item;
|
||||
struct PokenavMonListItem item;
|
||||
|
||||
while (boxId < TOTAL_BOXES_COUNT)
|
||||
{
|
||||
@@ -302,15 +305,15 @@ static u32 BuildBoxMonSearchResults(s32 state)
|
||||
{
|
||||
item.boxId = boxId;
|
||||
item.monId = monId;
|
||||
item.data = GetBoxMonDataAt(boxId, monId, ptr->conditionDataId);
|
||||
sub_81CF2C4(ptr, &item);
|
||||
item.data = GetBoxMonDataAt(boxId, monId, menu->conditionDataId);
|
||||
InsertMonListItem(menu, &item);
|
||||
}
|
||||
boxCount++;
|
||||
monId++;
|
||||
if (boxCount > 14)
|
||||
if (boxCount > TOTAL_BOXES_COUNT)
|
||||
{
|
||||
ptr->boxId = boxId;
|
||||
ptr->monId = monId;
|
||||
menu->boxId = boxId;
|
||||
menu->monId = monId;
|
||||
return LT_CONTINUE;
|
||||
}
|
||||
}
|
||||
@@ -321,107 +324,111 @@ static u32 BuildBoxMonSearchResults(s32 state)
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
|
||||
static u32 sub_81CF278(s32 state)
|
||||
// Data below is initially set by BuildPartyMonSearchResults / BuildBoxMonSearchResults, and
|
||||
// is the Pokémon's condition value for the condition they are sorted by.
|
||||
// The condition value in data is then overwritten with their ranking.
|
||||
static u32 ConvertConditionsToListRanks(s32 state)
|
||||
{
|
||||
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
s32 r6 = ptr->monList->listCount;
|
||||
s32 r4 = ptr->monList->monData[0].data;
|
||||
struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
|
||||
s32 listCount = menu->monList->listCount;
|
||||
s32 prevCondition = menu->monList->monData[0].data;
|
||||
s32 i;
|
||||
ptr->monList->monData[0].data = 1;
|
||||
for (i = 1; i < r6; i++)
|
||||
menu->monList->monData[0].data = 1;
|
||||
for (i = 1; i < listCount; i++)
|
||||
{
|
||||
if (ptr->monList->monData[i].data == r4)
|
||||
if (menu->monList->monData[i].data == prevCondition)
|
||||
{
|
||||
ptr->monList->monData[i].data = ptr->monList->monData[i - 1].data;
|
||||
// Same condition value as prev, share rank
|
||||
menu->monList->monData[i].data = menu->monList->monData[i - 1].data;
|
||||
}
|
||||
else
|
||||
{
|
||||
r4 = ptr->monList->monData[i].data;
|
||||
ptr->monList->monData[i].data = i + 1;
|
||||
prevCondition = menu->monList->monData[i].data;
|
||||
menu->monList->monData[i].data = i + 1;
|
||||
}
|
||||
}
|
||||
ptr->returnFromGraph = 1;
|
||||
menu->returnFromGraph = TRUE;
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item)
|
||||
static void InsertMonListItem(struct Pokenav_SearchResults *menu, struct PokenavMonListItem *item)
|
||||
{
|
||||
u32 left = 0;
|
||||
u32 right = structPtr->monList->listCount;
|
||||
u32 right = menu->monList->listCount;
|
||||
u32 insertionIdx = left + (right - left) / 2;
|
||||
|
||||
while (right != insertionIdx)
|
||||
{
|
||||
if (item->data > structPtr->monList->monData[insertionIdx].data)
|
||||
if (item->data > menu->monList->monData[insertionIdx].data)
|
||||
right = insertionIdx;
|
||||
else
|
||||
left = insertionIdx + 1;
|
||||
insertionIdx = left + (right - left) / 2;
|
||||
}
|
||||
for (right = structPtr->monList->listCount; right > insertionIdx; right--)
|
||||
structPtr->monList->monData[right] = structPtr->monList->monData[right - 1];
|
||||
structPtr->monList->monData[insertionIdx] = *item;
|
||||
structPtr->monList->listCount++;
|
||||
for (right = menu->monList->listCount; right > insertionIdx; right--)
|
||||
menu->monList->monData[right] = menu->monList->monData[right - 1];
|
||||
menu->monList->monData[insertionIdx] = *item;
|
||||
menu->monList->listCount++;
|
||||
}
|
||||
|
||||
bool32 OpenConditionSearchResults(void)
|
||||
{
|
||||
struct PokenavSub8 *searchList = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST, sizeof(struct PokenavSub8));
|
||||
if (searchList == NULL)
|
||||
struct Pokenav_SearchResultsGfx *gfx = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX, sizeof(struct Pokenav_SearchResultsGfx));
|
||||
if (gfx == NULL)
|
||||
return FALSE;
|
||||
searchList->ltid = CreateLoopedTask(LoopedTask_OpenConditionSearchResults, 1);
|
||||
searchList->callback = GetSearchResultCurrentLoopedTaskActive;
|
||||
searchList->fromGraph = FALSE;
|
||||
gfx->loopedTaskId = CreateLoopedTask(LoopedTask_OpenConditionSearchResults, 1);
|
||||
gfx->callback = GetSearchResultCurrentLoopedTaskActive;
|
||||
gfx->fromGraph = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 OpenConditionSearchListFromGraph(void)
|
||||
{
|
||||
struct PokenavSub8 *searchList = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST, sizeof(struct PokenavSub8));
|
||||
if (searchList == NULL)
|
||||
struct Pokenav_SearchResultsGfx *gfx = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX, sizeof(struct Pokenav_SearchResultsGfx));
|
||||
if (gfx == NULL)
|
||||
return FALSE;
|
||||
searchList->ltid = CreateLoopedTask(LoopedTask_OpenConditionSearchResults, 1);
|
||||
searchList->callback = GetSearchResultCurrentLoopedTaskActive;
|
||||
searchList->fromGraph = TRUE;
|
||||
gfx->loopedTaskId = CreateLoopedTask(LoopedTask_OpenConditionSearchResults, 1);
|
||||
gfx->callback = GetSearchResultCurrentLoopedTaskActive;
|
||||
gfx->fromGraph = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CreateSearchResultsLoopedTask(s32 idx)
|
||||
{
|
||||
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
searchList->ltid = CreateLoopedTask(sSearchResultLoopTaskFuncs[idx], 1);
|
||||
searchList->callback = GetSearchResultCurrentLoopedTaskActive;
|
||||
struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
gfx->loopedTaskId = CreateLoopedTask(sSearchResultLoopTaskFuncs[idx], 1);
|
||||
gfx->callback = GetSearchResultCurrentLoopedTaskActive;
|
||||
}
|
||||
|
||||
bool32 IsSearchResultLoopedTaskActive(void)
|
||||
{
|
||||
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
return searchList->callback();
|
||||
struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
return gfx->callback();
|
||||
}
|
||||
|
||||
bool32 GetSearchResultCurrentLoopedTaskActive(void)
|
||||
{
|
||||
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
return IsLoopedTaskActive(searchList->ltid);
|
||||
struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
return IsLoopedTaskActive(gfx->loopedTaskId);
|
||||
}
|
||||
|
||||
void FreeSearchResultSubstruct2(void)
|
||||
{
|
||||
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
sub_81C8234();
|
||||
RemoveWindow(searchList->winid);
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
DestroyPokenavList();
|
||||
RemoveWindow(gfx->winid);
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
}
|
||||
|
||||
static u32 LoopedTask_OpenConditionSearchResults(s32 state)
|
||||
{
|
||||
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
InitBgTemplates(sConditionSearchResultBgTemplates, ARRAY_COUNT(sConditionSearchResultBgTemplates));
|
||||
DecompressAndCopyTileDataToVram(1, sConditionSearchResultTiles, 0, 0, 0);
|
||||
SetBgTilemapBuffer(1, searchList->buff);
|
||||
SetBgTilemapBuffer(1, gfx->buff);
|
||||
CopyToBgTilemapBuffer(1, sConditionSearchResultTilemap, 0, 0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyPaletteIntoBufferUnfaded(sConditionSearchResultFramePal, 0x10, 0x20);
|
||||
@@ -430,19 +437,19 @@ static u32 LoopedTask_OpenConditionSearchResults(s32 state)
|
||||
case 1:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
if (!sub_81CF0C0())
|
||||
if (!GetReturningFromGraph())
|
||||
return LT_PAUSE;
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 2:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
CopyPaletteIntoBufferUnfaded(gUnknown_08623570, 0x20, 32);
|
||||
InitConditionSearchListMenuTemplate();
|
||||
CopyPaletteIntoBufferUnfaded(sListBg_Pal, 0x20, 32);
|
||||
CreateSearchResultsList();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (sub_81C8224())
|
||||
if (IsCreatePokenavListTaskActive())
|
||||
return LT_PAUSE;
|
||||
AddSearchResultListMenuWindow(searchList);
|
||||
AddSearchResultListMenuWindow(gfx);
|
||||
PrintHelpBarText(HELPBAR_CONDITION_MON_LIST);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 4:
|
||||
@@ -453,14 +460,14 @@ static u32 LoopedTask_OpenConditionSearchResults(s32 state)
|
||||
ShowBg(1);
|
||||
ShowBg(2);
|
||||
HideBg(3);
|
||||
if (!searchList->fromGraph)
|
||||
if (!gfx->fromGraph)
|
||||
{
|
||||
u8 searchGfxId = GetSelectedConditionSearch() + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
|
||||
LoadLeftHeaderGfxForIndex(searchGfxId);
|
||||
ShowLeftHeaderGfx(searchGfxId, 1, 0);
|
||||
ShowLeftHeaderGfx(POKENAV_GFX_CONDITION_MENU, 1, 0);
|
||||
}
|
||||
PokenavFadeScreen(1);
|
||||
PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 5:
|
||||
if (IsPaletteFadeActive())
|
||||
@@ -474,11 +481,11 @@ static u32 LoopedTask_OpenConditionSearchResults(s32 state)
|
||||
|
||||
static u32 LoopedTask_MoveSearchListCursorUp(s32 state)
|
||||
{
|
||||
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
switch (MatchCall_MoveCursorUp())
|
||||
switch (PokenavList_MoveCursorUp())
|
||||
{
|
||||
case 0:
|
||||
return LT_FINISH;
|
||||
@@ -491,11 +498,11 @@ static u32 LoopedTask_MoveSearchListCursorUp(s32 state)
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsMonListLoopedTaskActive())
|
||||
if (PokenavList_IsMoveWindowTaskActive())
|
||||
return LT_PAUSE;
|
||||
// fallthrough
|
||||
case 2:
|
||||
PrintSearchResultListMenuItems(searchList);
|
||||
PrintSearchResultListMenuItems(gfx);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
@@ -507,11 +514,11 @@ static u32 LoopedTask_MoveSearchListCursorUp(s32 state)
|
||||
|
||||
static u32 LoopedTask_MoveSearchListCursorDown(s32 state)
|
||||
{
|
||||
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
switch (MatchCall_MoveCursorDown())
|
||||
switch (PokenavList_MoveCursorDown())
|
||||
{
|
||||
case 0:
|
||||
return LT_FINISH;
|
||||
@@ -524,11 +531,11 @@ static u32 LoopedTask_MoveSearchListCursorDown(s32 state)
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsMonListLoopedTaskActive())
|
||||
if (PokenavList_IsMoveWindowTaskActive())
|
||||
return LT_PAUSE;
|
||||
// fallthrough
|
||||
case 2:
|
||||
PrintSearchResultListMenuItems(searchList);
|
||||
PrintSearchResultListMenuItems(gfx);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
@@ -540,11 +547,11 @@ static u32 LoopedTask_MoveSearchListCursorDown(s32 state)
|
||||
|
||||
static u32 LoopedTask_MoveSearchListPageUp(s32 state)
|
||||
{
|
||||
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
switch (MatchCall_PageUp())
|
||||
switch (PokenavList_PageUp())
|
||||
{
|
||||
case 0:
|
||||
return LT_FINISH;
|
||||
@@ -557,11 +564,11 @@ static u32 LoopedTask_MoveSearchListPageUp(s32 state)
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsMonListLoopedTaskActive())
|
||||
if (PokenavList_IsMoveWindowTaskActive())
|
||||
return LT_PAUSE;
|
||||
// fallthrough
|
||||
case 2:
|
||||
PrintSearchResultListMenuItems(searchList);
|
||||
PrintSearchResultListMenuItems(gfx);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
@@ -573,11 +580,11 @@ static u32 LoopedTask_MoveSearchListPageUp(s32 state)
|
||||
|
||||
static u32 LoopedTask_MoveSearchListPageDown(s32 state)
|
||||
{
|
||||
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST);
|
||||
struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
switch (MatchCall_PageDown())
|
||||
switch (PokenavList_PageDown())
|
||||
{
|
||||
case 0:
|
||||
return LT_FINISH;
|
||||
@@ -590,11 +597,11 @@ static u32 LoopedTask_MoveSearchListPageDown(s32 state)
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsMonListLoopedTaskActive())
|
||||
if (PokenavList_IsMoveWindowTaskActive())
|
||||
return LT_PAUSE;
|
||||
// fallthrough
|
||||
case 2:
|
||||
PrintSearchResultListMenuItems(searchList);
|
||||
PrintSearchResultListMenuItems(gfx);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
@@ -610,7 +617,7 @@ static u32 LoopedTask_ExitConditionSearchMenu(s32 state)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
PokenavFadeScreen(0);
|
||||
PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
|
||||
SlideMenuHeaderDown();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
@@ -630,7 +637,7 @@ static u32 LoopedTask_SelectSearchResult(s32 state)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
PokenavFadeScreen(0);
|
||||
PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsPaletteFadeActive())
|
||||
@@ -640,47 +647,47 @@ static u32 LoopedTask_SelectSearchResult(s32 state)
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static void AddSearchResultListMenuWindow(struct PokenavSub8 *searchList)
|
||||
static void AddSearchResultListMenuWindow(struct Pokenav_SearchResultsGfx *gfx)
|
||||
{
|
||||
searchList->winid = AddWindow(&sSearchResultListMenuWindowTemplate);
|
||||
PutWindowTilemap(searchList->winid);
|
||||
CopyWindowToVram(searchList->winid, COPYWIN_MAP);
|
||||
PrintSearchResultListMenuItems(searchList);
|
||||
gfx->winid = AddWindow(&sSearchResultListMenuWindowTemplate);
|
||||
PutWindowTilemap(gfx->winid);
|
||||
CopyWindowToVram(gfx->winid, COPYWIN_MAP);
|
||||
PrintSearchResultListMenuItems(gfx);
|
||||
}
|
||||
|
||||
static void PrintSearchResultListMenuItems(struct PokenavSub8 *searchList)
|
||||
static void PrintSearchResultListMenuItems(struct Pokenav_SearchResultsGfx *gfx)
|
||||
{
|
||||
s32 r7 = GetSearchResultsSelectedMonData();
|
||||
s32 rank = GetSearchResultsSelectedMonRank();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
*gStringVar1 = EOS;
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar2, gText_NumberF700);
|
||||
AddTextPrinterParameterized(searchList->winid, FONT_NORMAL, gStringVar2, 4, 1, TEXT_SKIP_DRAW, NULL);
|
||||
ConvertIntToDecimalStringN(gStringVar1, r7, STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
AddTextPrinterParameterized(searchList->winid, FONT_NORMAL, gStringVar1, 34, 1, TEXT_SKIP_DRAW, NULL);
|
||||
CopyWindowToVram(searchList->winid, COPYWIN_GFX);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar2, gText_NumberIndex);
|
||||
AddTextPrinterParameterized(gfx->winid, FONT_NORMAL, gStringVar2, 4, 1, TEXT_SKIP_DRAW, NULL);
|
||||
ConvertIntToDecimalStringN(gStringVar1, rank, STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
AddTextPrinterParameterized(gfx->winid, FONT_NORMAL, gStringVar1, 34, 1, TEXT_SKIP_DRAW, NULL);
|
||||
CopyWindowToVram(gfx->winid, COPYWIN_GFX);
|
||||
}
|
||||
|
||||
static void InitConditionSearchListMenuTemplate(void)
|
||||
static void CreateSearchResultsList(void)
|
||||
{
|
||||
struct PokenavListTemplate template;
|
||||
|
||||
template.list.monList = GetSearchResultsMonDataList();
|
||||
template.list = (struct PokenavListItem *)GetSearchResultsMonDataList();
|
||||
template.count = GetSearchResultsMonListCount();
|
||||
template.unk8 = 4;
|
||||
template.unk6 = sub_81CF10C();
|
||||
template.itemSize = sizeof(struct PokenavListItem);
|
||||
template.startIndex = GetSearchResultsCurrentListIndex();
|
||||
template.item_X = 13;
|
||||
template.windowWidth = 17;
|
||||
template.listTop = 1;
|
||||
template.maxShowed = 8;
|
||||
template.fillValue = 2;
|
||||
template.fontId = FONT_NORMAL;
|
||||
template.listFunc.printMonFunc = PrintSearchMonListItem;
|
||||
template.unk14 = NULL;
|
||||
sub_81C81D4(&sConditionSearchResultBgTemplates[1], &template, 0);
|
||||
template.bufferItemFunc = (PokenavListBufferItemFunc)BufferSearchMonListItem;
|
||||
template.iconDrawFunc = NULL;
|
||||
CreatePokenavList(&sConditionSearchResultBgTemplates[1], &template, 0);
|
||||
}
|
||||
|
||||
static void PrintSearchMonListItem(struct PokenavMonList * item, u8 * dest)
|
||||
static void BufferSearchMonListItem(struct PokenavMonListItem * item, u8 * dest)
|
||||
{
|
||||
u8 gender;
|
||||
u8 level;
|
||||
+1011
File diff suppressed because it is too large.
Load diff
+148
-145
@@ -13,7 +13,7 @@
|
||||
#include "menu.h"
|
||||
#include "dma3.h"
|
||||
|
||||
struct PokenavMainMenuResources
|
||||
struct Pokenav_MainMenu
|
||||
{
|
||||
void (*loopTask)(u32);
|
||||
u32 (*isLoopTaskActiveFunc)(void);
|
||||
@@ -24,7 +24,7 @@ struct PokenavMainMenuResources
|
||||
struct Sprite *spinningPokenav;
|
||||
struct Sprite *leftHeaderSprites[2];
|
||||
struct Sprite *submenuLeftHeaderSprites[2];
|
||||
u8 tilemapBuffer[0x800];
|
||||
u8 tilemapBuffer[BG_SCREEN_SIZE];
|
||||
};
|
||||
|
||||
// This struct uses a 32bit tag, and doesn't have a size field.
|
||||
@@ -36,26 +36,26 @@ struct CompressedSpriteSheetNoSize
|
||||
};
|
||||
|
||||
static void CleanupPokenavMainMenuResources(void);
|
||||
static void LoadLeftHeaderGfxForSubMenu(u32 arg0);
|
||||
static void LoadLeftHeaderGfxForMenu(u32 index);
|
||||
static void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide);
|
||||
static void HideLeftHeaderSprites(bool32 isOnRightSide);
|
||||
static void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide);
|
||||
static void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide);
|
||||
static void MoveLeftHeader(struct Sprite *sprite, s32 startX, s32 endX, s32 duration);
|
||||
static void SpriteCB_MoveLeftHeader(struct Sprite *sprite);
|
||||
static void LoadLeftHeaderGfxForSubMenu(u32);
|
||||
static void LoadLeftHeaderGfxForMenu(u32);
|
||||
static void HideLeftHeaderSubmenuSprites(bool32);
|
||||
static void HideLeftHeaderSprites(bool32);
|
||||
static void ShowLeftHeaderSprites(u32, bool32);
|
||||
static void ShowLeftHeaderSubmenuSprites(u32, bool32);
|
||||
static void MoveLeftHeader(struct Sprite *, s32, s32, s32);
|
||||
static void SpriteCB_MoveLeftHeader(struct Sprite *);
|
||||
static void InitPokenavMainMenuResources(void);
|
||||
static void InitHoennMapHeaderSprites(void);
|
||||
static void CreateLeftHeaderSprites(void);
|
||||
static void InitHelpBar(void);
|
||||
static u32 LoopedTask_SlideMenuHeaderUp(s32 a0);
|
||||
static u32 LoopedTask_SlideMenuHeaderDown(s32 a0);
|
||||
static void DrawHelpBar(u32 windowId);
|
||||
static void SpriteCB_SpinningPokenav(struct Sprite* sprite);
|
||||
static u32 LoopedTask_InitPokenavMenu(s32 a0);
|
||||
static u32 LoopedTask_SlideMenuHeaderUp(s32);
|
||||
static u32 LoopedTask_SlideMenuHeaderDown(s32);
|
||||
static void DrawHelpBar(u32);
|
||||
static void SpriteCB_SpinningPokenav(struct Sprite*);
|
||||
static u32 LoopedTask_InitPokenavMenu(s32);
|
||||
|
||||
const u16 gSpinningPokenavPaletteData[] = INCBIN_U16("graphics/pokenav/icon2.gbapal");
|
||||
const u32 gSpinningPokenavGfx[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz");
|
||||
const u32 gUnused_SpinningPokenavGfx2[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz");
|
||||
static const u16 sSpinningPokenav_Pal[] = INCBIN_U16("graphics/pokenav/nav_icon.gbapal");
|
||||
static const u32 sSpinningPokenav_Gfx[] = INCBIN_U32("graphics/pokenav/nav_icon.4bpp.lz");
|
||||
static const u32 sBlueLightCopy[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz"); // Unused copy of sMatchCallBlueLightTiles
|
||||
|
||||
const struct BgTemplate gPokenavMainMenuBgTemplates[] =
|
||||
{
|
||||
@@ -108,7 +108,7 @@ static const u8 sHelpBarTextColors[3] =
|
||||
static const struct CompressedSpriteSheet gSpinningPokenavSpriteSheet[] =
|
||||
{
|
||||
{
|
||||
.data = gSpinningPokenavGfx,
|
||||
.data = sSpinningPokenav_Gfx,
|
||||
.size = 0x1000,
|
||||
.tag = 0,
|
||||
}
|
||||
@@ -117,20 +117,20 @@ static const struct CompressedSpriteSheet gSpinningPokenavSpriteSheet[] =
|
||||
static const struct SpritePalette gSpinningNavgearPalettes[] =
|
||||
{
|
||||
{
|
||||
.data = gSpinningPokenavPaletteData,
|
||||
.data = sSpinningPokenav_Pal,
|
||||
.tag = 0,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct CompressedSpriteSheet sPokenavHoennMapLeftHeaderSpriteSheet =
|
||||
static const struct CompressedSpriteSheet sMenuLeftHeaderSpriteSheet =
|
||||
{
|
||||
.data = gPokenavLeftHeaderHoennMap_Gfx,
|
||||
.data = gPokenavLeftHeaderHoennMap_Gfx, // Hoenn map is the first of the headers listed
|
||||
.size = 0xC00,
|
||||
.tag = 2
|
||||
};
|
||||
|
||||
static const struct CompressedSpriteSheet sPokenavMenuLeftHeaderSpriteSheets[] =
|
||||
static const struct CompressedSpriteSheet sMenuLeftHeaderSpriteSheets[] =
|
||||
{
|
||||
[POKENAV_GFX_MAIN_MENU] = {
|
||||
.data = gPokenavLeftHeaderMainMenu_Gfx,
|
||||
@@ -239,7 +239,7 @@ static const struct SpriteTemplate sSpinningPokenavSpriteTemplate =
|
||||
.callback = SpriteCB_SpinningPokenav
|
||||
};
|
||||
|
||||
static const struct OamData sPokenavLeftHeaderHoennMapSpriteOam =
|
||||
static const struct OamData sOamData_LeftHeader =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = ST_OAM_AFFINE_OFF,
|
||||
@@ -253,7 +253,7 @@ static const struct OamData sPokenavLeftHeaderHoennMapSpriteOam =
|
||||
.paletteNum = 0,
|
||||
};
|
||||
|
||||
static const struct OamData sUnknown_0861FB24 =
|
||||
static const struct OamData sOamData_SubmenuLeftHeader =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = ST_OAM_AFFINE_OFF,
|
||||
@@ -268,22 +268,22 @@ static const struct OamData sUnknown_0861FB24 =
|
||||
.paletteNum = 0,
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sPokenavLeftHeaderHoennMapSpriteTemplate =
|
||||
static const struct SpriteTemplate sLeftHeaderSpriteTemplate =
|
||||
{
|
||||
.tileTag = 2,
|
||||
.paletteTag = 1,
|
||||
.oam = &sPokenavLeftHeaderHoennMapSpriteOam,
|
||||
.oam = &sOamData_LeftHeader,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sUnknown_0861FB44 =
|
||||
static const struct SpriteTemplate sSubmenuLeftHeaderSpriteTemplate =
|
||||
{
|
||||
.tileTag = 2,
|
||||
.paletteTag = 2,
|
||||
.oam = &sUnknown_0861FB24,
|
||||
.oam = &sOamData_SubmenuLeftHeader,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
@@ -292,22 +292,22 @@ static const struct SpriteTemplate sUnknown_0861FB44 =
|
||||
|
||||
bool32 InitPokenavMainMenu(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr;
|
||||
struct Pokenav_MainMenu *menu;
|
||||
|
||||
structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU, sizeof(struct PokenavMainMenuResources));
|
||||
if (structPtr == NULL)
|
||||
menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU, sizeof(struct Pokenav_MainMenu));
|
||||
if (menu == NULL)
|
||||
return FALSE;
|
||||
|
||||
ResetSpriteData();
|
||||
FreeAllSpritePalettes();
|
||||
structPtr->currentTaskId = CreateLoopedTask(LoopedTask_InitPokenavMenu, 1);
|
||||
menu->currentTaskId = CreateLoopedTask(LoopedTask_InitPokenavMenu, 1);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
u32 PokenavMainMenuLoopedTaskIsActive(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
return IsLoopedTaskActive(structPtr->currentTaskId);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
return IsLoopedTaskActive(menu->currentTaskId);
|
||||
}
|
||||
|
||||
void ShutdownPokenav(void)
|
||||
@@ -330,11 +330,11 @@ bool32 WaitForPokenavShutdownFade(void)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static u32 LoopedTask_InitPokenavMenu(s32 a0)
|
||||
static u32 LoopedTask_InitPokenavMenu(s32 state)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr;
|
||||
struct Pokenav_MainMenu *menu;
|
||||
|
||||
switch (a0)
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
|
||||
@@ -345,9 +345,9 @@ static u32 LoopedTask_InitPokenavMenu(s32 a0)
|
||||
ResetTempTileDataBuffers();
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
DecompressAndCopyTileDataToVram(0, &gPokenavHeader_Gfx, 0, 0, 0);
|
||||
SetBgTilemapBuffer(0, structPtr->tilemapBuffer);
|
||||
SetBgTilemapBuffer(0, menu->tilemapBuffer);
|
||||
CopyToBgTilemapBuffer(0, &gPokenavHeader_Tilemap, 0, 0);
|
||||
CopyPaletteIntoBufferUnfaded(gPokenavHeader_Pal, 0, 0x20);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
@@ -363,7 +363,7 @@ static u32 LoopedTask_InitPokenavMenu(s32 a0)
|
||||
return LT_PAUSE;
|
||||
|
||||
InitPokenavMainMenuResources();
|
||||
InitHoennMapHeaderSprites();
|
||||
CreateLeftHeaderSprites();
|
||||
ShowBg(0);
|
||||
return LT_FINISH;
|
||||
default:
|
||||
@@ -373,46 +373,46 @@ static u32 LoopedTask_InitPokenavMenu(s32 a0)
|
||||
|
||||
void SetActiveMenuLoopTasks(void *createLoopTask, void *isLoopTaskActive) // Fix types later.
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
structPtr->loopTask = createLoopTask;
|
||||
structPtr->isLoopTaskActiveFunc = isLoopTaskActive;
|
||||
structPtr->unused = 0;
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
menu->loopTask = createLoopTask;
|
||||
menu->isLoopTaskActiveFunc = isLoopTaskActive;
|
||||
menu->unused = 0;
|
||||
}
|
||||
|
||||
void RunMainMenuLoopedTask(u32 a0)
|
||||
void RunMainMenuLoopedTask(u32 state)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
structPtr->unused = 0;
|
||||
structPtr->loopTask(a0);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
menu->unused = 0;
|
||||
menu->loopTask(state);
|
||||
}
|
||||
|
||||
u32 IsActiveMenuLoopTaskActive(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
return structPtr->isLoopTaskActiveFunc();
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
return menu->isLoopTaskActiveFunc();
|
||||
}
|
||||
|
||||
void SlideMenuHeaderUp(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
structPtr->currentTaskId = CreateLoopedTask(LoopedTask_SlideMenuHeaderUp, 4);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
menu->currentTaskId = CreateLoopedTask(LoopedTask_SlideMenuHeaderUp, 4);
|
||||
}
|
||||
|
||||
void SlideMenuHeaderDown(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
structPtr->currentTaskId = CreateLoopedTask(LoopedTask_SlideMenuHeaderDown, 4);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
menu->currentTaskId = CreateLoopedTask(LoopedTask_SlideMenuHeaderDown, 4);
|
||||
}
|
||||
|
||||
bool32 MainMenuLoopedTaskIsBusy(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
return IsLoopedTaskActive(structPtr->currentTaskId);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
return IsLoopedTaskActive(menu->currentTaskId);
|
||||
}
|
||||
|
||||
static u32 LoopedTask_SlideMenuHeaderUp(s32 a0)
|
||||
static u32 LoopedTask_SlideMenuHeaderUp(s32 state)
|
||||
{
|
||||
switch (a0)
|
||||
switch (state)
|
||||
{
|
||||
default:
|
||||
return LT_FINISH;
|
||||
@@ -431,7 +431,7 @@ static u32 LoopedTask_SlideMenuHeaderUp(s32 a0)
|
||||
}
|
||||
}
|
||||
|
||||
static u32 LoopedTask_SlideMenuHeaderDown(s32 a0)
|
||||
static u32 LoopedTask_SlideMenuHeaderDown(s32 state)
|
||||
{
|
||||
if (ChangeBgY(0, 384, BG_COORD_SUB) <= 0)
|
||||
{
|
||||
@@ -473,7 +473,6 @@ void PokenavFillPalette(u32 palIndex, u16 fillValue)
|
||||
|
||||
void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a4, u16 *palette)
|
||||
{
|
||||
|
||||
if (a4 == 0)
|
||||
{
|
||||
CpuCopy16(src, palette, size * 2);
|
||||
@@ -496,11 +495,11 @@ void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a
|
||||
g1 = ((((GET_G(*dest) << 8) - (g << 8)) / a3) * a4) >> 8;
|
||||
b1 = ((((GET_B(*dest) << 8) - (b << 8)) / a3) * a4) >> 8;
|
||||
|
||||
r = (r + r1) & 0x1F; //_RGB(r + r1, g + g1, b + b1); doesn't match; I have to assign the value of ((r + r1) & 0x1F) to r
|
||||
g = (g + g1) & 0x1F; //See above
|
||||
b = (b + b1) & 0x1F; //See above
|
||||
r = (r + r1) & 0x1F; //_RGB(r + r1, g + g1, b + b1); doesn't match
|
||||
g = (g + g1) & 0x1F;
|
||||
b = (b + b1) & 0x1F;
|
||||
|
||||
*palette = RGB2(r, g, b); //See above comment
|
||||
*palette = RGB2(r, g, b);
|
||||
|
||||
src++, dest++;
|
||||
palette++;
|
||||
@@ -510,20 +509,20 @@ void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a
|
||||
|
||||
void PokenavFadeScreen(s32 fadeType)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
switch (fadeType)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(structPtr->palettes, -2, 0, 16, RGB_BLACK);
|
||||
case POKENAV_FADE_TO_BLACK:
|
||||
BeginNormalPaletteFade(menu->palettes, -2, 0, 16, RGB_BLACK);
|
||||
break;
|
||||
case 1:
|
||||
BeginNormalPaletteFade(structPtr->palettes, -2, 16, 0, RGB_BLACK);
|
||||
case POKENAV_FADE_FROM_BLACK:
|
||||
BeginNormalPaletteFade(menu->palettes, -2, 16, 0, RGB_BLACK);
|
||||
break;
|
||||
case 2:
|
||||
case POKENAV_FADE_TO_BLACK_ALL:
|
||||
BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);
|
||||
break;
|
||||
case 3:
|
||||
case POKENAV_FADE_FROM_BLACK_ALL:
|
||||
BeginNormalPaletteFade(PALETTES_ALL, -2, 16, 0, RGB_BLACK);
|
||||
break;
|
||||
}
|
||||
@@ -534,9 +533,10 @@ bool32 IsPaletteFadeActive(void)
|
||||
return gPaletteFade.active;
|
||||
}
|
||||
|
||||
void sub_81C7B40(void)
|
||||
// Excludes the first obj and bg palettes
|
||||
void FadeToBlackExceptPrimary(void)
|
||||
{
|
||||
BlendPalettes(PALETTES_ALL & ~(0x10000 | 0x1), 16, RGB_BLACK);
|
||||
BlendPalettes(PALETTES_ALL & ~(1 << 16 | 1), 16, RGB_BLACK);
|
||||
}
|
||||
|
||||
void InitBgTemplates(const struct BgTemplate *templates, int count)
|
||||
@@ -549,21 +549,21 @@ void InitBgTemplates(const struct BgTemplate *templates, int count)
|
||||
|
||||
static void InitHelpBar(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
InitWindows(&sHelpBarWindowTemplate[0]);
|
||||
structPtr->helpBarWindowId = 0;
|
||||
DrawHelpBar(structPtr->helpBarWindowId);
|
||||
PutWindowTilemap(structPtr->helpBarWindowId);
|
||||
CopyWindowToVram(structPtr->helpBarWindowId, COPYWIN_FULL);
|
||||
menu->helpBarWindowId = 0;
|
||||
DrawHelpBar(menu->helpBarWindowId);
|
||||
PutWindowTilemap(menu->helpBarWindowId);
|
||||
CopyWindowToVram(menu->helpBarWindowId, COPYWIN_FULL);
|
||||
}
|
||||
|
||||
void PrintHelpBarText(u32 textId)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
DrawHelpBar(structPtr->helpBarWindowId);
|
||||
AddTextPrinterParameterized3(structPtr->helpBarWindowId, FONT_NORMAL, 0, 1, sHelpBarTextColors, 0, sHelpBarTexts[textId]);
|
||||
DrawHelpBar(menu->helpBarWindowId);
|
||||
AddTextPrinterParameterized3(menu->helpBarWindowId, FONT_NORMAL, 0, 1, sHelpBarTextColors, 0, sHelpBarTexts[textId]);
|
||||
}
|
||||
|
||||
bool32 WaitForHelpBar(void)
|
||||
@@ -581,22 +581,22 @@ static void InitPokenavMainMenuResources(void)
|
||||
{
|
||||
s32 i;
|
||||
u8 spriteId;
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(gSpinningPokenavSpriteSheet); i++)
|
||||
LoadCompressedSpriteSheet(&gSpinningPokenavSpriteSheet[i]);
|
||||
|
||||
Pokenav_AllocAndLoadPalettes(gSpinningNavgearPalettes);
|
||||
structPtr->palettes = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0));
|
||||
menu->palettes = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0));
|
||||
spriteId = CreateSprite(&sSpinningPokenavSpriteTemplate, 220, 12, 0);
|
||||
structPtr->spinningPokenav = &gSprites[spriteId];
|
||||
menu->spinningPokenav = &gSprites[spriteId];
|
||||
}
|
||||
|
||||
static void CleanupPokenavMainMenuResources(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
DestroySprite(structPtr->spinningPokenav);
|
||||
DestroySprite(menu->spinningPokenav);
|
||||
FreeSpriteTilesByTag(0);
|
||||
FreeSpritePaletteByTag(0);
|
||||
}
|
||||
@@ -607,47 +607,50 @@ static void SpriteCB_SpinningPokenav(struct Sprite *sprite)
|
||||
sprite->y2 = (GetBgY(0) / 256u) * -1;
|
||||
}
|
||||
|
||||
struct Sprite *PauseSpinningPokenavSprite(void)
|
||||
struct Sprite *GetSpinningPokenavSprite(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
structPtr->spinningPokenav->callback = SpriteCallbackDummy;
|
||||
return structPtr->spinningPokenav;
|
||||
menu->spinningPokenav->callback = SpriteCallbackDummy;
|
||||
return menu->spinningPokenav;
|
||||
}
|
||||
|
||||
void ResumeSpinningPokenavSprite(void)
|
||||
void HideSpinningPokenavSprite(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
structPtr->spinningPokenav->x = 220;
|
||||
structPtr->spinningPokenav->y = 12;
|
||||
structPtr->spinningPokenav->callback = SpriteCB_SpinningPokenav;
|
||||
structPtr->spinningPokenav->invisible = FALSE;
|
||||
structPtr->spinningPokenav->oam.priority = 0;
|
||||
structPtr->spinningPokenav->subpriority = 0;
|
||||
// Move sprite so it's no longer visible
|
||||
menu->spinningPokenav->x = 220;
|
||||
menu->spinningPokenav->y = 12;
|
||||
menu->spinningPokenav->callback = SpriteCB_SpinningPokenav;
|
||||
menu->spinningPokenav->invisible = FALSE;
|
||||
menu->spinningPokenav->oam.priority = 0;
|
||||
menu->spinningPokenav->subpriority = 0;
|
||||
}
|
||||
|
||||
static void InitHoennMapHeaderSprites(void)
|
||||
static void CreateLeftHeaderSprites(void)
|
||||
{
|
||||
s32 i, spriteId;
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
LoadCompressedSpriteSheet(&sPokenavHoennMapLeftHeaderSpriteSheet);
|
||||
LoadCompressedSpriteSheet(&sMenuLeftHeaderSpriteSheet);
|
||||
AllocSpritePalette(1);
|
||||
AllocSpritePalette(2);
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(menu->leftHeaderSprites); i++)
|
||||
{
|
||||
spriteId = CreateSprite(&sPokenavLeftHeaderHoennMapSpriteTemplate, 0, 0, 1);
|
||||
structPtr->leftHeaderSprites[i] = &gSprites[spriteId];
|
||||
structPtr->leftHeaderSprites[i]->invisible = TRUE;
|
||||
structPtr->leftHeaderSprites[i]->x2 = i * 64;
|
||||
// Create main left header
|
||||
spriteId = CreateSprite(&sLeftHeaderSpriteTemplate, 0, 0, 1);
|
||||
menu->leftHeaderSprites[i] = &gSprites[spriteId];
|
||||
menu->leftHeaderSprites[i]->invisible = TRUE;
|
||||
menu->leftHeaderSprites[i]->x2 = i * 64;
|
||||
|
||||
spriteId = CreateSprite(&sUnknown_0861FB44, 0, 0, 2);
|
||||
structPtr->submenuLeftHeaderSprites[i] = &gSprites[spriteId];
|
||||
structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE;
|
||||
structPtr->submenuLeftHeaderSprites[i]->x2 = i * 32;
|
||||
structPtr->submenuLeftHeaderSprites[i]->y2 = 18;
|
||||
structPtr->submenuLeftHeaderSprites[i]->oam.tileNum += (i * 8) + 64;
|
||||
// Create submenu left header
|
||||
spriteId = CreateSprite(&sSubmenuLeftHeaderSpriteTemplate, 0, 0, 2);
|
||||
menu->submenuLeftHeaderSprites[i] = &gSprites[spriteId];
|
||||
menu->submenuLeftHeaderSprites[i]->invisible = TRUE;
|
||||
menu->submenuLeftHeaderSprites[i]->x2 = i * 32;
|
||||
menu->submenuLeftHeaderSprites[i]->y2 = 18;
|
||||
menu->submenuLeftHeaderSprites[i]->oam.tileNum += (i * 8) + 64;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -661,34 +664,34 @@ void LoadLeftHeaderGfxForIndex(u32 menuGfxId)
|
||||
|
||||
void UpdateRegionMapRightHeaderTiles(u32 menuGfxId)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
if (menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_OUT)
|
||||
structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32;
|
||||
menu->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32;
|
||||
else
|
||||
structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64;
|
||||
menu->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64;
|
||||
}
|
||||
|
||||
static void LoadLeftHeaderGfxForMenu(u32 menuGfxId)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr;
|
||||
struct Pokenav_MainMenu *menu;
|
||||
u32 size, tag;
|
||||
|
||||
if (menuGfxId >= POKENAV_GFX_SUBMENUS_START)
|
||||
return;
|
||||
|
||||
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
tag = sPokenavMenuLeftHeaderSpriteSheets[menuGfxId].tag;
|
||||
size = GetDecompressedDataSize(sPokenavMenuLeftHeaderSpriteSheets[menuGfxId].data);
|
||||
menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
tag = sMenuLeftHeaderSpriteSheets[menuGfxId].tag;
|
||||
size = GetDecompressedDataSize(sMenuLeftHeaderSpriteSheets[menuGfxId].data);
|
||||
LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(1) * 16) + 0x100, 0x20);
|
||||
LZ77UnCompWram(sPokenavMenuLeftHeaderSpriteSheets[menuGfxId].data, gDecompressionBuffer);
|
||||
LZ77UnCompWram(sMenuLeftHeaderSpriteSheets[menuGfxId].data, gDecompressionBuffer);
|
||||
RequestDma3Copy(gDecompressionBuffer, (void *)OBJ_VRAM0 + (GetSpriteTileStartByTag(2) * 32), size, 1);
|
||||
structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sPokenavMenuLeftHeaderSpriteSheets[menuGfxId].size;
|
||||
menu->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sMenuLeftHeaderSpriteSheets[menuGfxId].size;
|
||||
|
||||
if (menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_OUT || menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_IN)
|
||||
structPtr->leftHeaderSprites[1]->x2 = 56;
|
||||
menu->leftHeaderSprites[1]->x2 = 56;
|
||||
else
|
||||
structPtr->leftHeaderSprites[1]->x2 = 64;
|
||||
menu->leftHeaderSprites[1]->x2 = 64;
|
||||
}
|
||||
|
||||
static void LoadLeftHeaderGfxForSubMenu(u32 menuGfxId)
|
||||
@@ -731,20 +734,20 @@ void HideMainOrSubMenuLeftHeader(u32 id, bool32 onRightSide)
|
||||
void SetLeftHeaderSpritesInvisibility(void)
|
||||
{
|
||||
s32 i;
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(menu->leftHeaderSprites); i++)
|
||||
{
|
||||
structPtr->leftHeaderSprites[i]->invisible = TRUE;
|
||||
structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE;
|
||||
menu->leftHeaderSprites[i]->invisible = TRUE;
|
||||
menu->submenuLeftHeaderSprites[i]->invisible = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool32 AreLeftHeaderSpritesMoving(void)
|
||||
{
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
if (structPtr->leftHeaderSprites[0]->callback == SpriteCallbackDummy && structPtr->submenuLeftHeaderSprites[0]->callback == SpriteCallbackDummy)
|
||||
if (menu->leftHeaderSprites[0]->callback == SpriteCallbackDummy && menu->submenuLeftHeaderSprites[0]->callback == SpriteCallbackDummy)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
@@ -753,66 +756,66 @@ bool32 AreLeftHeaderSpritesMoving(void)
|
||||
static void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide)
|
||||
{
|
||||
s32 start, end, i;
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
if (!isOnRightSide)
|
||||
start = -96, end = 32;
|
||||
else
|
||||
start = 256, end = 160;
|
||||
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(menu->leftHeaderSprites); i++)
|
||||
{
|
||||
structPtr->leftHeaderSprites[i]->y = startY;
|
||||
MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12);
|
||||
menu->leftHeaderSprites[i]->y = startY;
|
||||
MoveLeftHeader(menu->leftHeaderSprites[i], start, end, 12);
|
||||
}
|
||||
}
|
||||
|
||||
static void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide)
|
||||
{
|
||||
s32 start, end, i;
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
if (!isOnRightSide)
|
||||
start = -96, end = 16;
|
||||
else
|
||||
start = 256, end = 192;
|
||||
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++)
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(menu->submenuLeftHeaderSprites); i++)
|
||||
{
|
||||
structPtr->submenuLeftHeaderSprites[i]->y = startY;
|
||||
MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12);
|
||||
menu->submenuLeftHeaderSprites[i]->y = startY;
|
||||
MoveLeftHeader(menu->submenuLeftHeaderSprites[i], start, end, 12);
|
||||
}
|
||||
}
|
||||
|
||||
static void HideLeftHeaderSprites(bool32 isOnRightSide)
|
||||
{
|
||||
s32 start, end, i;
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
if (!isOnRightSide)
|
||||
start = 32, end = -96;
|
||||
else
|
||||
start = 192, end = 256;
|
||||
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(menu->leftHeaderSprites); i++)
|
||||
{
|
||||
MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12);
|
||||
MoveLeftHeader(menu->leftHeaderSprites[i], start, end, 12);
|
||||
}
|
||||
}
|
||||
|
||||
static void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide)
|
||||
{
|
||||
s32 start, end, i;
|
||||
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
|
||||
|
||||
if (!isOnRightSide)
|
||||
start = 16, end = -96;
|
||||
else
|
||||
start = 192, end = 256;
|
||||
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++)
|
||||
for (i = 0; i < (s32)ARRAY_COUNT(menu->submenuLeftHeaderSprites); i++)
|
||||
{
|
||||
MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12);
|
||||
MoveLeftHeader(menu->submenuLeftHeaderSprites[i], start, end, 12);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
Executable
+1301
File diff suppressed because it is too large.
Load diff
@@ -14,27 +14,27 @@
|
||||
#include "strings.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct Pokenav3Struct
|
||||
struct Pokenav_MatchCallMenu
|
||||
{
|
||||
u16 optionCursorPos;
|
||||
u16 maxOptionId;
|
||||
const u8 *matchCallOptions;
|
||||
u16 headerId;
|
||||
u16 numRegistered;
|
||||
u16 unkC;
|
||||
u32 unk10;
|
||||
u32 unk14;
|
||||
u32 (*callback)(struct Pokenav3Struct*);
|
||||
struct PokenavMatchCallEntries matchCallEntries[MAX_REMATCH_ENTRIES - 1];
|
||||
u16 numSpecialTrainers;
|
||||
bool32 initFinished;
|
||||
u32 loopedTaskId;
|
||||
u32 (*callback)(struct Pokenav_MatchCallMenu*);
|
||||
struct PokenavMatchCallEntry matchCallEntries[MAX_REMATCH_ENTRIES - 1];
|
||||
};
|
||||
|
||||
static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *);
|
||||
static u32 GetExitMatchCallMenuId(struct Pokenav3Struct *);
|
||||
static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *);
|
||||
static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *);
|
||||
static u32 CB2_HandleCallInput(struct Pokenav3Struct *);
|
||||
static u32 sub_81CAD20(s32);
|
||||
static bool32 sub_81CB1D0(void);
|
||||
static u32 CB2_HandleMatchCallInput(struct Pokenav_MatchCallMenu *);
|
||||
static u32 GetExitMatchCallMenuId(struct Pokenav_MatchCallMenu *);
|
||||
static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav_MatchCallMenu *);
|
||||
static u32 CB2_HandleCheckPageInput(struct Pokenav_MatchCallMenu *);
|
||||
static u32 CB2_HandleCallExitInput(struct Pokenav_MatchCallMenu *);
|
||||
static u32 LoopedTask_BuildMatchCallList(s32);
|
||||
static bool32 ShouldDoNearbyMessage(void);
|
||||
|
||||
#include "data/text/match_call_messages.h"
|
||||
|
||||
@@ -53,20 +53,20 @@ static const u8 sMatchCallOptionsHasCheckPage[] =
|
||||
|
||||
bool32 PokenavCallback_Init_MatchCall(void)
|
||||
{
|
||||
struct Pokenav3Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN, sizeof(struct Pokenav3Struct));
|
||||
struct Pokenav_MatchCallMenu *state = AllocSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN, sizeof(struct Pokenav_MatchCallMenu));
|
||||
if (!state)
|
||||
return FALSE;
|
||||
|
||||
state->callback = CB2_HandleMatchCallInput;
|
||||
state->headerId = 0;
|
||||
state->unk10 = 0;
|
||||
state->unk14 = CreateLoopedTask(sub_81CAD20, 1);
|
||||
state->initFinished = FALSE;
|
||||
state->loopedTaskId = CreateLoopedTask(LoopedTask_BuildMatchCallList, 1);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
u32 GetMatchCallCallback(void)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->callback(state);
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ void FreeMatchCallSubstruct1(void)
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
}
|
||||
|
||||
static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *state)
|
||||
static u32 CB2_HandleMatchCallInput(struct Pokenav_MatchCallMenu *state)
|
||||
{
|
||||
int selection;
|
||||
|
||||
@@ -92,7 +92,7 @@ static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *state)
|
||||
{
|
||||
state->callback = CB2_HandleMatchCallOptionsInput;
|
||||
state->optionCursorPos = 0;
|
||||
selection = GetSelectedPokenavListIndex();
|
||||
selection = PokenavList_GetSelectedIndex();
|
||||
|
||||
if (!state->matchCallEntries[selection].isSpecialTrainer || MatchCall_HasCheckPage(state->matchCallEntries[selection].headerId))
|
||||
{
|
||||
@@ -125,20 +125,20 @@ static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *state)
|
||||
return POKENAV_MC_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 GetExitMatchCallMenuId(struct Pokenav3Struct *state)
|
||||
static u32 GetExitMatchCallMenuId(struct Pokenav_MatchCallMenu *state)
|
||||
{
|
||||
return POKENAV_MAIN_MENU_CURSOR_ON_MATCH_CALL;
|
||||
}
|
||||
|
||||
static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *state)
|
||||
static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav_MatchCallMenu *state)
|
||||
{
|
||||
if ((JOY_NEW(DPAD_UP)) && state->optionCursorPos)
|
||||
if (JOY_NEW(DPAD_UP) && state->optionCursorPos)
|
||||
{
|
||||
state->optionCursorPos--;
|
||||
return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR;
|
||||
}
|
||||
|
||||
if ((JOY_NEW(DPAD_DOWN)) && state->optionCursorPos < state->maxOptionId)
|
||||
if (JOY_NEW(DPAD_DOWN) && state->optionCursorPos < state->maxOptionId)
|
||||
{
|
||||
state->optionCursorPos++;
|
||||
return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR;
|
||||
@@ -155,8 +155,8 @@ static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *state)
|
||||
if (GetPokenavMode() == POKENAV_MODE_FORCE_CALL_READY)
|
||||
SetPokenavMode(POKENAV_MODE_FORCE_CALL_EXIT);
|
||||
|
||||
state->callback = CB2_HandleCallInput;
|
||||
if (sub_81CB1D0())
|
||||
state->callback = CB2_HandleCallExitInput;
|
||||
if (ShouldDoNearbyMessage())
|
||||
return POKENAV_MC_FUNC_NEARBY_MSG;
|
||||
|
||||
return POKENAV_MC_FUNC_CALL_MSG;
|
||||
@@ -175,7 +175,7 @@ static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *state)
|
||||
return POKENAV_MC_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *state)
|
||||
static u32 CB2_HandleCheckPageInput(struct Pokenav_MatchCallMenu *state)
|
||||
{
|
||||
if (JOY_REPEAT(DPAD_UP))
|
||||
return POKENAV_MC_FUNC_CHECK_PAGE_UP;
|
||||
@@ -191,21 +191,21 @@ static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *state)
|
||||
return POKENAV_MC_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 CB2_HandleCallInput(struct Pokenav3Struct *state)
|
||||
static u32 CB2_HandleCallExitInput(struct Pokenav_MatchCallMenu *state)
|
||||
{
|
||||
if (JOY_NEW(A_BUTTON | B_BUTTON))
|
||||
{
|
||||
state->callback = CB2_HandleMatchCallInput;
|
||||
return POKENAV_MC_FUNC_10;
|
||||
return POKENAV_MC_FUNC_EXIT_CALL;
|
||||
}
|
||||
|
||||
return POKENAV_MC_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 sub_81CAD20(s32 taskState)
|
||||
static u32 LoopedTask_BuildMatchCallList(s32 taskState)
|
||||
{
|
||||
int i, j;
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
switch (taskState)
|
||||
{
|
||||
case 0:
|
||||
@@ -213,6 +213,7 @@ static u32 sub_81CAD20(s32 taskState)
|
||||
state->numRegistered = 0;
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 1:
|
||||
// Load special trainers (e.g. Rival, gym leaders)
|
||||
for (i = 0, j = state->headerId; i < 30; i++, j++)
|
||||
{
|
||||
if (MatchCall_GetEnabled(j))
|
||||
@@ -225,7 +226,7 @@ static u32 sub_81CAD20(s32 taskState)
|
||||
|
||||
if (++state->headerId >= MC_HEADER_COUNT)
|
||||
{
|
||||
state->unkC = state->headerId;
|
||||
state->numSpecialTrainers = state->headerId;
|
||||
state->headerId = 0;
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
@@ -233,6 +234,7 @@ static u32 sub_81CAD20(s32 taskState)
|
||||
|
||||
return LT_CONTINUE;
|
||||
case 2:
|
||||
// Load normal trainers
|
||||
for (i = 0, j = state->headerId; i < 30; i++, j++)
|
||||
{
|
||||
if (!MatchCall_HasRematchId(state->headerId) && IsRematchEntryRegistered(state->headerId))
|
||||
@@ -249,7 +251,7 @@ static u32 sub_81CAD20(s32 taskState)
|
||||
|
||||
return LT_CONTINUE;
|
||||
case 3:
|
||||
state->unk10 = 1;
|
||||
state->initFinished = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -264,55 +266,58 @@ bool32 IsRematchEntryRegistered(int rematchIndex)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int sub_81CAE28(void)
|
||||
int IsMatchCallListInitFinished(void)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->unk10;
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->initFinished;
|
||||
}
|
||||
|
||||
int GetNumberRegistered(void)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->numRegistered;
|
||||
}
|
||||
|
||||
int sub_81CAE48(void)
|
||||
// Unused
|
||||
static int GetNumSpecialTrainers(void)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->unkC;
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->numSpecialTrainers;
|
||||
}
|
||||
|
||||
int unref_sub_81CAE58(void)
|
||||
// Unused
|
||||
static int GetNumNormalTrainers(void)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->numRegistered - state->unkC;
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->numRegistered - state->numSpecialTrainers;
|
||||
}
|
||||
|
||||
int unref_sub_81CAE6C(int arg0)
|
||||
// Unused
|
||||
static int GetNormalTrainerHeaderId(int index)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
arg0 += state->unkC;
|
||||
if (arg0 >= state->numRegistered)
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
index += state->numSpecialTrainers;
|
||||
if (index >= state->numRegistered)
|
||||
return REMATCH_TABLE_ENTRIES;
|
||||
|
||||
return state->matchCallEntries[arg0].headerId;
|
||||
return state->matchCallEntries[index].headerId;
|
||||
}
|
||||
|
||||
struct PokenavMatchCallEntries *sub_81CAE94(void)
|
||||
struct PokenavMatchCallEntry *GetMatchCallList(void)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->matchCallEntries;
|
||||
}
|
||||
|
||||
u16 GetMatchCallMapSec(int index)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->matchCallEntries[index].mapSec;
|
||||
}
|
||||
|
||||
bool32 ShouldDrawRematchPokeballIcon(int index)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
if (!state->matchCallEntries[index].isSpecialTrainer)
|
||||
index = state->matchCallEntries[index].headerId;
|
||||
else
|
||||
@@ -327,7 +332,7 @@ bool32 ShouldDrawRematchPokeballIcon(int index)
|
||||
int GetMatchCallTrainerPic(int index)
|
||||
{
|
||||
int headerId;
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
if (!state->matchCallEntries[index].isSpecialTrainer)
|
||||
{
|
||||
index = GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId);
|
||||
@@ -346,15 +351,15 @@ int GetMatchCallTrainerPic(int index)
|
||||
return gFacilityClassToPicIndex[index];
|
||||
}
|
||||
|
||||
const u8 *GetMatchCallMessageText(int index, u8 *arg1)
|
||||
const u8 *GetMatchCallMessageText(int index, bool8 *newRematchRequest)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
*arg1 = 0;
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
*newRematchRequest = FALSE;
|
||||
if (!Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType))
|
||||
return gText_CallCantBeMadeHere;
|
||||
|
||||
if (!state->matchCallEntries[index].isSpecialTrainer)
|
||||
*arg1 = SelectMatchCallMessage(GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId), gStringVar4);
|
||||
*newRematchRequest = SelectMatchCallMessage(GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId), gStringVar4);
|
||||
else
|
||||
MatchCall_GetMessage(state->matchCallEntries[index].headerId, gStringVar4);
|
||||
|
||||
@@ -364,7 +369,7 @@ const u8 *GetMatchCallMessageText(int index, u8 *arg1)
|
||||
const u8 *GetMatchCallFlavorText(int index, int checkPageEntry)
|
||||
{
|
||||
int rematchId;
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
if (state->matchCallEntries[index].isSpecialTrainer)
|
||||
{
|
||||
rematchId = MatchCall_GetRematchTableIdx(state->matchCallEntries[index].headerId);
|
||||
@@ -381,20 +386,20 @@ const u8 *GetMatchCallFlavorText(int index, int checkPageEntry)
|
||||
|
||||
u16 GetMatchCallOptionCursorPos(void)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
return state->optionCursorPos;
|
||||
}
|
||||
|
||||
u16 GetMatchCallOptionId(int optionId)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
if (state->maxOptionId < optionId)
|
||||
return MATCH_CALL_OPTION_COUNT;
|
||||
|
||||
return state->matchCallOptions[optionId];
|
||||
}
|
||||
|
||||
void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntries *matchCallEntry, u8 *str)
|
||||
void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntry *matchCallEntry, u8 *str)
|
||||
{
|
||||
const u8 *trainerName;
|
||||
const u8 *className;
|
||||
@@ -431,7 +436,7 @@ u8 GetMatchTableMapSectionId(int rematchIndex)
|
||||
|
||||
int GetIndexDeltaOfNextCheckPageDown(int index)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
int count = 1;
|
||||
while (++index < state->numRegistered)
|
||||
{
|
||||
@@ -448,7 +453,7 @@ int GetIndexDeltaOfNextCheckPageDown(int index)
|
||||
|
||||
int GetIndexDeltaOfNextCheckPageUp(int index)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
int count = -1;
|
||||
while (--index >= 0)
|
||||
{
|
||||
@@ -463,7 +468,8 @@ int GetIndexDeltaOfNextCheckPageUp(int index)
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool32 unref_sub_81CB16C(void)
|
||||
// Unused
|
||||
static bool32 HasRematchEntry(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -486,10 +492,10 @@ bool32 unref_sub_81CB16C(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 sub_81CB1D0(void)
|
||||
static bool32 ShouldDoNearbyMessage(void)
|
||||
{
|
||||
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
int selection = GetSelectedPokenavListIndex();
|
||||
struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
|
||||
int selection = PokenavList_GetSelectedIndex();
|
||||
if (!state->matchCallEntries[selection].isSpecialTrainer)
|
||||
{
|
||||
if (GetMatchCallMapSec(selection) == gMapHeader.regionMapSectionId)
|
||||
@@ -1,997 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "pokenav.h"
|
||||
#include "window.h"
|
||||
#include "strings.h"
|
||||
#include "text.h"
|
||||
#include "bg.h"
|
||||
#include "menu.h"
|
||||
#include "decompress.h"
|
||||
#include "international_string_util.h"
|
||||
|
||||
// TODO: This UI isnt just for match call, seems to be the general pokenav list UI
|
||||
|
||||
struct PokenavListMenuWindow {
|
||||
u8 bg;
|
||||
u8 unk1;
|
||||
u8 unk2;
|
||||
u8 unk3;
|
||||
u8 unk4;
|
||||
u8 fontId;
|
||||
u16 unk6;
|
||||
u16 windowId;
|
||||
u16 unkA;
|
||||
u16 unkC;
|
||||
u16 unkE;
|
||||
};
|
||||
|
||||
struct MatchCallWindowState {
|
||||
// The index of the element at the top of the window.
|
||||
u16 windowTopIndex;
|
||||
u16 listLength;
|
||||
u16 unk4;
|
||||
// The index of the cursor, relative to the top of the window.
|
||||
u16 selectedIndexOffset;
|
||||
u16 visibleEntries;
|
||||
u16 unkA;
|
||||
u32 unkC;
|
||||
void * unk10;
|
||||
};
|
||||
|
||||
struct PokenavSub17Substruct
|
||||
{
|
||||
struct PokenavListMenuWindow listWindow;
|
||||
u32 unk10;
|
||||
u32 unk14;
|
||||
u32 unk18;
|
||||
void * unk1C;
|
||||
s32 unk20;
|
||||
s32 unk24;
|
||||
u32 loopedTaskId;
|
||||
s32 unk2C;
|
||||
u32 unk30;
|
||||
void (*unk34)(struct PokenavMatchCallEntries *, u8*);
|
||||
void (*unk38)(u16, u32, u32);
|
||||
struct Sprite *rightArrow;
|
||||
struct Sprite *upArrow;
|
||||
struct Sprite *downArrow;
|
||||
u8 unkTextBuffer[0x40];
|
||||
};
|
||||
|
||||
// Generally at index 0x11 (17)
|
||||
struct PokenavSub17
|
||||
{
|
||||
struct PokenavSub17Substruct list;
|
||||
u8 tilemapBuffer[0x800];
|
||||
struct MatchCallWindowState unk888;
|
||||
s32 unk89C;
|
||||
u32 loopedTaskId;
|
||||
};
|
||||
|
||||
void sub_81C82E4(struct PokenavSub17 *matchCall);
|
||||
bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *a0, const struct BgTemplate *a1, struct PokenavListTemplate *a2, s32 a3);
|
||||
void InitMatchCallWindowState(struct MatchCallWindowState *a0, struct PokenavListTemplate *a1);
|
||||
void SpriteCB_MatchCallUpArrow(struct Sprite *sprite);
|
||||
void SpriteCB_MatchCallDownArrow(struct Sprite *sprite);
|
||||
void SpriteCB_MatchCallRightArrow(struct Sprite *sprite);
|
||||
void ToggleMatchCallArrows(struct PokenavSub17Substruct *a0, u32 a1);
|
||||
void DestroyMatchCallListArrows(struct PokenavSub17Substruct *a0);
|
||||
void CreateMatchCallArrowSprites(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
|
||||
void sub_81C8ED0(void);
|
||||
static void PrintMatchCallFlavorText(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1, u32 a2);
|
||||
void PrintMatchCallFieldNames(struct PokenavSub17Substruct *a0, u32 a1);
|
||||
void sub_81C8D4C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
|
||||
void sub_81C8CB4(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
|
||||
void sub_81C8B70(struct PokenavListMenuWindow *a0, s32 a1, s32 a2);
|
||||
void sub_81C8568(s32 a0, struct PokenavSub17Substruct *a1);
|
||||
void sub_81C83AC(void * a0, u32 a1, u32 a2, u32 a3, u32 a4, struct PokenavSub17Substruct *a5);
|
||||
void sub_81C837C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
|
||||
void sub_81C835C(struct PokenavListMenuWindow *a0);
|
||||
u32 LoopedTask_sub_81C8254(s32 state);
|
||||
bool32 sub_81C83E0(void);
|
||||
u32 LoopedTask_sub_81C83F0(s32 state);
|
||||
u32 LoopedTask_sub_81C85A0(s32 state);
|
||||
u32 LoopedTask_sub_81C8870(s32 state);
|
||||
u32 LoopedTask_sub_81C8A28(s32 state);
|
||||
u32 LoopedTask_PrintCheckPageInfo(s32 state);
|
||||
|
||||
static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/arrows_matchcall.gbapal");
|
||||
static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/arrows_matchcall.4bpp.lz");
|
||||
|
||||
EWRAM_DATA u32 gUnknown_0203CF44 = 0;
|
||||
|
||||
bool32 sub_81C81D4(const struct BgTemplate *arg0, struct PokenavListTemplate *arg1, s32 arg2)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_LIST, sizeof(struct PokenavSub17));
|
||||
if (structPtr == NULL)
|
||||
return FALSE;
|
||||
|
||||
InitMatchCallWindowState(&structPtr->unk888, arg1);
|
||||
if (!CopyPokenavListMenuTemplate(&structPtr->list, arg0, arg1, arg2))
|
||||
return FALSE;
|
||||
|
||||
CreateLoopedTask(LoopedTask_sub_81C8254, 6);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 sub_81C8224(void)
|
||||
{
|
||||
return FuncIsActiveLoopedTask(LoopedTask_sub_81C8254);
|
||||
}
|
||||
|
||||
void sub_81C8234(void)
|
||||
{
|
||||
struct PokenavSub17 *structPtr;
|
||||
|
||||
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
DestroyMatchCallListArrows(&structPtr->list);
|
||||
RemoveWindow(structPtr->list.listWindow.windowId);
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
}
|
||||
|
||||
u32 LoopedTask_sub_81C8254(s32 state)
|
||||
{
|
||||
struct PokenavSub17 *structPtr;
|
||||
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
return LT_PAUSE;
|
||||
|
||||
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
sub_81C82E4(structPtr);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
sub_81C835C(&structPtr->list.listWindow);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 2:
|
||||
sub_81C837C(&structPtr->unk888, &structPtr->list);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (sub_81C83E0())
|
||||
{
|
||||
return LT_PAUSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_81C8ED0();
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
case 4:
|
||||
CreateMatchCallArrowSprites(&structPtr->unk888, &structPtr->list);
|
||||
return LT_FINISH;
|
||||
default:
|
||||
return LT_FINISH;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_81C82E4(struct PokenavSub17 *matchCall)
|
||||
{
|
||||
u16 tileNum = (matchCall->list.listWindow.unk1 << 12) | matchCall->list.listWindow.unk6;
|
||||
BgDmaFill(matchCall->list.listWindow.bg, PIXEL_FILL(1), matchCall->list.listWindow.unk6, 1);
|
||||
BgDmaFill(matchCall->list.listWindow.bg, PIXEL_FILL(4), matchCall->list.listWindow.unk6 + 1, 1);
|
||||
SetBgTilemapBuffer(matchCall->list.listWindow.bg, matchCall->tilemapBuffer);
|
||||
FillBgTilemapBufferRect_Palette0(matchCall->list.listWindow.bg, tileNum, 0, 0, 32, 32);
|
||||
ChangeBgY(matchCall->list.listWindow.bg, 0, BG_COORD_SET);
|
||||
ChangeBgX(matchCall->list.listWindow.bg, 0, BG_COORD_SET);
|
||||
ChangeBgY(matchCall->list.listWindow.bg, matchCall->list.listWindow.unk3 << 11, BG_COORD_SUB);
|
||||
CopyBgTilemapBufferToVram(matchCall->list.listWindow.bg);
|
||||
}
|
||||
|
||||
void sub_81C835C(struct PokenavListMenuWindow *listWindow)
|
||||
{
|
||||
FillWindowPixelBuffer(listWindow->windowId, PIXEL_FILL(1));
|
||||
PutWindowTilemap(listWindow->windowId);
|
||||
CopyWindowToVram(listWindow->windowId, COPYWIN_MAP);
|
||||
}
|
||||
|
||||
void sub_81C837C(struct MatchCallWindowState *state, struct PokenavSub17Substruct *a1)
|
||||
{
|
||||
s32 arg2 = state->listLength - state->windowTopIndex;
|
||||
if (arg2 > state->visibleEntries)
|
||||
arg2 = state->visibleEntries;
|
||||
|
||||
sub_81C83AC(state->unk10, state->windowTopIndex, arg2, state->unkC, 0, a1);
|
||||
}
|
||||
|
||||
void sub_81C83AC(void * a0, u32 a1, u32 a2, u32 a3, u32 a4, struct PokenavSub17Substruct *list)
|
||||
{
|
||||
if (a2 == 0)
|
||||
return;
|
||||
|
||||
list->unk1C = a0 + a1 * a3;
|
||||
list->unk18 = a3;
|
||||
list->listWindow.unkC = 0;
|
||||
list->listWindow.unkE = a2;
|
||||
list->unk14 = a1;
|
||||
list->unk10 = a4;
|
||||
CreateLoopedTask(LoopedTask_sub_81C83F0, 5);
|
||||
}
|
||||
|
||||
bool32 sub_81C83E0(void)
|
||||
{
|
||||
return FuncIsActiveLoopedTask(LoopedTask_sub_81C83F0);
|
||||
}
|
||||
|
||||
u32 LoopedTask_sub_81C83F0(s32 state)
|
||||
{
|
||||
u32 v1;
|
||||
struct PokenavSub17Substruct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
v1 = (structPtr->listWindow.unkA + structPtr->listWindow.unkC + structPtr->unk10) & 0xF;
|
||||
structPtr->unk34(structPtr->unk1C, structPtr->unkTextBuffer);
|
||||
if (structPtr->unk38 != NULL)
|
||||
structPtr->unk38(structPtr->listWindow.windowId, structPtr->unk14, v1);
|
||||
|
||||
AddTextPrinterParameterized(structPtr->listWindow.windowId, structPtr->listWindow.fontId, structPtr->unkTextBuffer, 8, (v1 << 4) + 1, 255, NULL);
|
||||
if (++structPtr->listWindow.unkC >= structPtr->listWindow.unkE)
|
||||
{
|
||||
if (structPtr->unk38 != NULL)
|
||||
CopyWindowToVram(structPtr->listWindow.windowId, COPYWIN_FULL);
|
||||
else
|
||||
CopyWindowToVram(structPtr->listWindow.windowId, COPYWIN_GFX);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
structPtr->unk1C += structPtr->unk18;
|
||||
structPtr->unk14++;
|
||||
return LT_CONTINUE;
|
||||
}
|
||||
case 1:
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
return LT_PAUSE;
|
||||
return LT_FINISH;
|
||||
}
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
bool32 ShouldShowUpArrow(void)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
|
||||
return (structPtr->unk888.windowTopIndex != 0);
|
||||
}
|
||||
|
||||
bool32 ShouldShowDownArrow(void)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
struct MatchCallWindowState *subPtr = &structPtr->unk888;
|
||||
|
||||
return (subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength);
|
||||
}
|
||||
|
||||
void MatchCall_MoveWindow(s32 a0, bool32 a1)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
struct MatchCallWindowState *subPtr = &structPtr->unk888;
|
||||
|
||||
if (a0 < 0)
|
||||
{
|
||||
if (subPtr->windowTopIndex + a0 < 0)
|
||||
a0 = -1 * subPtr->windowTopIndex;
|
||||
if (a1)
|
||||
sub_81C83AC(subPtr->unk10, subPtr->windowTopIndex + a0, a0 * -1, subPtr->unkC, a0, &structPtr->list);
|
||||
}
|
||||
else if (a1)
|
||||
{
|
||||
s32 temp = gUnknown_0203CF44 = subPtr->windowTopIndex + subPtr->visibleEntries;
|
||||
if (temp + a0 >= subPtr->listLength)
|
||||
a0 = subPtr->listLength - temp;
|
||||
|
||||
sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, a0, subPtr->unkC, subPtr->visibleEntries, &structPtr->list);
|
||||
}
|
||||
|
||||
sub_81C8568(a0, &structPtr->list);
|
||||
subPtr->windowTopIndex += a0;
|
||||
}
|
||||
|
||||
void sub_81C8568(s32 a0, struct PokenavSub17Substruct *list)
|
||||
{
|
||||
list->unk20 = GetBgY(list->listWindow.bg);
|
||||
list->unk24 = list->unk20 + (a0 << 12);
|
||||
if (a0 > 0)
|
||||
list->unk30 = BG_COORD_ADD;
|
||||
else
|
||||
list->unk30 = BG_COORD_SUB;
|
||||
list->unk2C = a0;
|
||||
list->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C85A0, 6);
|
||||
}
|
||||
|
||||
u32 LoopedTask_sub_81C85A0(s32 state)
|
||||
{
|
||||
s32 y, v1;
|
||||
bool32 flag;
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
struct PokenavSub17Substruct *subPtr = &structPtr->list;
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
if (!sub_81C83E0())
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return LT_PAUSE;
|
||||
case 1:
|
||||
flag = FALSE;
|
||||
y = GetBgY(subPtr->listWindow.bg);
|
||||
v1 = ChangeBgY(subPtr->listWindow.bg, 0x1000, subPtr->unk30);
|
||||
if (subPtr->unk30 == BG_COORD_SUB)
|
||||
{
|
||||
if ((y > subPtr->unk24 || y <= subPtr->unk20) && v1 <= subPtr->unk24)
|
||||
flag = TRUE;
|
||||
}
|
||||
else // BG_COORD_ADD
|
||||
{
|
||||
if ((y < subPtr->unk24 || y >= subPtr->unk20) && v1 >= subPtr->unk24)
|
||||
flag = TRUE;
|
||||
}
|
||||
|
||||
if (flag)
|
||||
{
|
||||
subPtr->listWindow.unkA = (subPtr->listWindow.unkA + subPtr->unk2C) & 0xF;
|
||||
ChangeBgY(subPtr->listWindow.bg, subPtr->unk24, BG_COORD_SET);
|
||||
return LT_FINISH;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
}
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
bool32 IsMonListLoopedTaskActive(void)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
return IsLoopedTaskActive(structPtr->list.loopedTaskId);
|
||||
}
|
||||
|
||||
struct MatchCallWindowState *GetMatchCallWindowStruct(void)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
return &structPtr->unk888;
|
||||
}
|
||||
|
||||
int MatchCall_MoveCursorUp(void)
|
||||
{
|
||||
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
|
||||
|
||||
if (structPtr->selectedIndexOffset != 0)
|
||||
{
|
||||
structPtr->selectedIndexOffset--;
|
||||
return 1;
|
||||
}
|
||||
if (ShouldShowUpArrow())
|
||||
{
|
||||
MatchCall_MoveWindow(-1, TRUE);
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MatchCall_MoveCursorDown(void)
|
||||
{
|
||||
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
|
||||
|
||||
if (structPtr->windowTopIndex + structPtr->selectedIndexOffset >= structPtr->listLength - 1)
|
||||
return 0;
|
||||
if (structPtr->selectedIndexOffset < structPtr->visibleEntries - 1)
|
||||
{
|
||||
structPtr->selectedIndexOffset++;
|
||||
return 1;
|
||||
}
|
||||
if (ShouldShowDownArrow())
|
||||
{
|
||||
MatchCall_MoveWindow(1, TRUE);
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MatchCall_PageUp(void)
|
||||
{
|
||||
s32 scroll;
|
||||
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
|
||||
|
||||
if (ShouldShowUpArrow())
|
||||
{
|
||||
if (structPtr->windowTopIndex >= structPtr->visibleEntries)
|
||||
scroll = structPtr->visibleEntries;
|
||||
else
|
||||
scroll = structPtr->windowTopIndex;
|
||||
MatchCall_MoveWindow(scroll * -1, TRUE);
|
||||
return 2;
|
||||
}
|
||||
else if (structPtr->selectedIndexOffset != 0)
|
||||
{
|
||||
structPtr->selectedIndexOffset = 0;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MatchCall_PageDown(void)
|
||||
{
|
||||
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
|
||||
|
||||
if (ShouldShowDownArrow())
|
||||
{
|
||||
s32 windowBottomIndex = structPtr->windowTopIndex + structPtr->visibleEntries;
|
||||
s32 scroll = structPtr->unk4 - structPtr->windowTopIndex;
|
||||
|
||||
if (windowBottomIndex <= structPtr->unk4)
|
||||
scroll = structPtr->visibleEntries;
|
||||
MatchCall_MoveWindow(scroll, TRUE);
|
||||
return 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
s32 cursor, lastVisibleIndex;
|
||||
if (structPtr->listLength >= structPtr->visibleEntries)
|
||||
{
|
||||
cursor = structPtr->selectedIndexOffset;
|
||||
lastVisibleIndex = structPtr->visibleEntries;
|
||||
}
|
||||
else
|
||||
{
|
||||
cursor = structPtr->selectedIndexOffset;
|
||||
lastVisibleIndex = structPtr->listLength;
|
||||
}
|
||||
lastVisibleIndex -= 1;
|
||||
if (cursor >= lastVisibleIndex)
|
||||
return 0;
|
||||
|
||||
structPtr->selectedIndexOffset = lastVisibleIndex;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
u32 GetSelectedPokenavListIndex(void)
|
||||
{
|
||||
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
|
||||
|
||||
return structPtr->windowTopIndex + structPtr->selectedIndexOffset;
|
||||
}
|
||||
|
||||
u32 GetMatchCallListTopIndex(void)
|
||||
{
|
||||
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
|
||||
|
||||
return structPtr->windowTopIndex;
|
||||
}
|
||||
|
||||
void sub_81C877C(void)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
structPtr->unk89C = 0;
|
||||
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C8870, 6);
|
||||
}
|
||||
|
||||
void PrintCheckPageInfo(s16 a0)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
structPtr->unk888.windowTopIndex += a0;
|
||||
structPtr->unk89C = 0;
|
||||
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_PrintCheckPageInfo, 6);
|
||||
}
|
||||
|
||||
void sub_81C87F0(void)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
structPtr->unk89C = 0;
|
||||
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C8A28, 6);
|
||||
}
|
||||
|
||||
bool32 IsMatchCallListTaskActive(void)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
return IsLoopedTaskActive(structPtr->loopedTaskId);
|
||||
}
|
||||
|
||||
void sub_81C8838(void)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
struct MatchCallWindowState *subPtr = &structPtr->unk888;
|
||||
structPtr->list.unk38(structPtr->list.listWindow.windowId, subPtr->windowTopIndex + subPtr->selectedIndexOffset, (structPtr->list.listWindow.unkA + subPtr->selectedIndexOffset) & 0xF);
|
||||
CopyWindowToVram(structPtr->list.listWindow.windowId, COPYWIN_MAP);
|
||||
}
|
||||
|
||||
// TODO:
|
||||
u32 LoopedTask_sub_81C8870(s32 state)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
ToggleMatchCallArrows(&structPtr->list, 1);
|
||||
// fall-through
|
||||
case 1:
|
||||
if (structPtr->unk89C != structPtr->unk888.selectedIndexOffset)
|
||||
sub_81C8B70(&structPtr->list.listWindow, structPtr->unk89C, 1);
|
||||
|
||||
structPtr->unk89C++;
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 2:
|
||||
if (!IsDma3ManagerBusyWithBgCopy())
|
||||
{
|
||||
if (structPtr->unk89C != structPtr->unk888.visibleEntries)
|
||||
return 6;
|
||||
if (structPtr->unk888.selectedIndexOffset != 0)
|
||||
sub_81C8B70(&structPtr->list.listWindow, structPtr->unk89C, structPtr->unk888.selectedIndexOffset);
|
||||
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 3:
|
||||
if (!IsDma3ManagerBusyWithBgCopy())
|
||||
{
|
||||
if (structPtr->unk888.selectedIndexOffset != 0)
|
||||
{
|
||||
MatchCall_MoveWindow(structPtr->unk888.selectedIndexOffset, FALSE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
return LT_FINISH;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 4:
|
||||
if (IsMonListLoopedTaskActive())
|
||||
return LT_PAUSE;
|
||||
|
||||
structPtr->unk888.selectedIndexOffset = 0;
|
||||
return LT_FINISH;
|
||||
}
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
u32 LoopedTask_PrintCheckPageInfo(s32 state)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
return LT_PAUSE;
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
sub_81C8CB4(&structPtr->unk888, &structPtr->list);
|
||||
break;
|
||||
case 1:
|
||||
PrintMatchCallFieldNames(&structPtr->list, 0);
|
||||
break;
|
||||
case 2:
|
||||
PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_STRATEGY);
|
||||
break;
|
||||
case 3:
|
||||
PrintMatchCallFieldNames(&structPtr->list, 1);
|
||||
break;
|
||||
case 4:
|
||||
PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_POKEMON);
|
||||
break;
|
||||
case 5:
|
||||
PrintMatchCallFieldNames(&structPtr->list, 2);
|
||||
break;
|
||||
case 6:
|
||||
PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_INTRO_1);
|
||||
break;
|
||||
case 7:
|
||||
PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_INTRO_2);
|
||||
break;
|
||||
default:
|
||||
return LT_FINISH;
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
|
||||
u32 LoopedTask_sub_81C8A28(s32 state)
|
||||
{
|
||||
struct PokenavSub17 *structPtr;
|
||||
struct MatchCallWindowState *subPtr888;
|
||||
struct PokenavSub17Substruct *subPtr0;
|
||||
s32 r5, *ptr;
|
||||
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
return LT_PAUSE;
|
||||
|
||||
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
subPtr888 = &structPtr->unk888;
|
||||
subPtr0 = &structPtr->list;
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
sub_81C8D4C(subPtr888, subPtr0);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
ptr = &structPtr->unk89C;
|
||||
if (++(*ptr) < structPtr->unk888.visibleEntries)
|
||||
{
|
||||
sub_81C8B70(&subPtr0->listWindow, *ptr, 1);
|
||||
return LT_PAUSE;
|
||||
}
|
||||
|
||||
*ptr = 0;
|
||||
if (subPtr888->listLength <= subPtr888->visibleEntries)
|
||||
{
|
||||
if (subPtr888->windowTopIndex != 0)
|
||||
{
|
||||
s32 r4 = subPtr888->windowTopIndex;
|
||||
r5 = -r4;
|
||||
sub_81C8B70(&subPtr0->listWindow, r5, r4);
|
||||
subPtr888->selectedIndexOffset = r4;
|
||||
*ptr = r5;
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (subPtr888->windowTopIndex + subPtr888->visibleEntries > subPtr888->listLength)
|
||||
{
|
||||
s32 r4 = subPtr888->windowTopIndex + subPtr888->visibleEntries - subPtr888->listLength;
|
||||
r5 = -r4;
|
||||
sub_81C8B70(&subPtr0->listWindow, r5, r4);
|
||||
subPtr888->selectedIndexOffset = r4;
|
||||
*ptr = r5;
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
}
|
||||
return 9;
|
||||
case 2:
|
||||
MatchCall_MoveWindow(structPtr->unk89C, FALSE);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (!IsMonListLoopedTaskActive())
|
||||
{
|
||||
structPtr->unk89C = 0;
|
||||
return 1;
|
||||
}
|
||||
return 2;
|
||||
case 4:
|
||||
sub_81C83AC(subPtr888->unk10, subPtr888->windowTopIndex + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->list);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 5:
|
||||
if (sub_81C83E0())
|
||||
return LT_PAUSE;
|
||||
if (++structPtr->unk89C >= subPtr888->listLength || structPtr->unk89C >= subPtr888->visibleEntries)
|
||||
return LT_INC_AND_CONTINUE;
|
||||
return 9;
|
||||
case 6:
|
||||
ToggleMatchCallArrows(subPtr0, 0);
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
void sub_81C8B70(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2)
|
||||
{
|
||||
u8 *v1 = (u8*)GetWindowAttribute(listWindow->windowId, WINDOW_TILE_DATA);
|
||||
u32 v2 = listWindow->unk4 * 64;
|
||||
|
||||
a1 = (listWindow->unkA + a1) & 0xF;
|
||||
if (a1 + a2 <= 16)
|
||||
{
|
||||
CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, a2 * v2);
|
||||
CopyWindowToVram(listWindow->windowId, COPYWIN_GFX);
|
||||
}
|
||||
else
|
||||
{
|
||||
u32 v3 = 16 - a1;
|
||||
u32 v4 = a2 - v3;
|
||||
|
||||
CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, v3 * v2);
|
||||
CpuFastFill8(PIXEL_FILL(1), v1, v4 * v2);
|
||||
CopyWindowToVram(listWindow->windowId, COPYWIN_GFX);
|
||||
}
|
||||
|
||||
for (a2--; a2 != -1; a1 = (a1 + 1) & 0xF, a2--)
|
||||
ClearRematchPokeballIcon(listWindow->windowId, a1);
|
||||
|
||||
CopyWindowToVram(listWindow->windowId, COPYWIN_MAP);
|
||||
}
|
||||
|
||||
void sub_81C8C64(struct PokenavListMenuWindow *listWindow, u32 a1)
|
||||
{
|
||||
u16 var;
|
||||
u16 *v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(listWindow->windowId, WINDOW_BG));
|
||||
v1 += ((listWindow->unkA << 6) + listWindow->unk2) - 1;
|
||||
|
||||
if (a1 != 0)
|
||||
var = (listWindow->unk1 << 12) | (listWindow->unk6 + 1);
|
||||
else
|
||||
var = (listWindow->unk1 << 12) | (listWindow->unk6);
|
||||
|
||||
v1[0] = var;
|
||||
v1[0x20] = var;
|
||||
}
|
||||
|
||||
void sub_81C8CB4(struct MatchCallWindowState *state, struct PokenavSub17Substruct *list)
|
||||
{
|
||||
u8 colors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_RED};
|
||||
|
||||
list->unk34(state->unk10 + state->unkC * state->windowTopIndex, list->unkTextBuffer);
|
||||
list->unk38(list->listWindow.windowId, state->windowTopIndex, list->listWindow.unkA);
|
||||
FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(4), 0, list->listWindow.unkA * 16, list->listWindow.unk4 * 8, 16);
|
||||
AddTextPrinterParameterized3(list->listWindow.windowId, list->listWindow.fontId, 8, (list->listWindow.unkA * 16) + 1, colors, TEXT_SKIP_DRAW, list->unkTextBuffer);
|
||||
sub_81C8C64(&list->listWindow, 1);
|
||||
CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_FULL, 0, list->listWindow.unkA * 2, list->listWindow.unk4, 2);
|
||||
}
|
||||
|
||||
void sub_81C8D4C(struct MatchCallWindowState *state, struct PokenavSub17Substruct *list)
|
||||
{
|
||||
list->unk34(state->unk10 + state->unkC * state->windowTopIndex, list->unkTextBuffer);
|
||||
FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, list->listWindow.unkA * 16, list->listWindow.unk4 * 8, 16);
|
||||
AddTextPrinterParameterized(list->listWindow.windowId, list->listWindow.fontId, list->unkTextBuffer, 8, list->listWindow.unkA * 16 + 1, TEXT_SKIP_DRAW, NULL);
|
||||
sub_81C8C64(&list->listWindow, 0);
|
||||
CopyWindowToVram(list->listWindow.windowId, COPYWIN_FULL);
|
||||
}
|
||||
|
||||
void PrintMatchCallFieldNames(struct PokenavSub17Substruct *list, u32 fieldId)
|
||||
{
|
||||
const u8 *fieldNames[] = {gText_PokenavMatchCall_Strategy, gText_PokenavMatchCall_TrainerPokemon, gText_PokenavMatchCall_SelfIntroduction};
|
||||
u8 colors[3] = {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED};
|
||||
u32 top = (list->listWindow.unkA + 1 + (fieldId * 2)) & 0xF;
|
||||
|
||||
FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, top << 4, list->listWindow.unk4, 16);
|
||||
AddTextPrinterParameterized3(list->listWindow.windowId, FONT_NARROW, 2, (top << 4) + 1, colors, TEXT_SKIP_DRAW, fieldNames[fieldId]);
|
||||
CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, top << 1, list->listWindow.unk4, 2);
|
||||
}
|
||||
|
||||
static void PrintMatchCallFlavorText(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *list, u32 checkPageEntry)
|
||||
{
|
||||
// lines 1, 3, and 5 are the field names printed by PrintMatchCallFieldNames
|
||||
static const u8 lineOffsets[CHECK_PAGE_ENTRY_COUNT] =
|
||||
{
|
||||
[CHECK_PAGE_STRATEGY] = 2,
|
||||
[CHECK_PAGE_POKEMON] = 4,
|
||||
[CHECK_PAGE_INTRO_1] = 6,
|
||||
[CHECK_PAGE_INTRO_2] = 7
|
||||
};
|
||||
|
||||
u32 r6 = (list->listWindow.unkA + lineOffsets[checkPageEntry]) & 0xF;
|
||||
const u8 *str = GetMatchCallFlavorText(a0->windowTopIndex, checkPageEntry);
|
||||
|
||||
if (str != NULL)
|
||||
{
|
||||
FillWindowTilesByRow(list->listWindow.windowId, 1, r6 * 2, list->listWindow.unk4 - 1, 2);
|
||||
AddTextPrinterParameterized(list->listWindow.windowId, FONT_NARROW, str, 2, (r6 << 4) + 1, TEXT_SKIP_DRAW, NULL);
|
||||
CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, r6 * 2, list->listWindow.unk4, 2);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheets[] =
|
||||
{
|
||||
{
|
||||
.data = sMatchcallArrowSpriteSheetData,
|
||||
.size = 192,
|
||||
.tag = 0xA
|
||||
}
|
||||
};
|
||||
|
||||
static const struct SpritePalette sMatchcallArrowPalettes[] =
|
||||
{
|
||||
{
|
||||
.data = sMatchcallArrowPaletteData,
|
||||
.tag = 0x14
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct OamData sMatchCallRightArrowSpriteOam =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = ST_OAM_AFFINE_OFF,
|
||||
.objMode = ST_OAM_OBJ_NORMAL,
|
||||
.bpp = ST_OAM_4BPP,
|
||||
.shape = SPRITE_SHAPE(8x16),
|
||||
.x = 0,
|
||||
.size = SPRITE_SIZE(8x16),
|
||||
.tileNum = 0,
|
||||
.priority = 2,
|
||||
.paletteNum = 0
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sMatchCallRightArrowSprite =
|
||||
{
|
||||
.tileTag = 0xA,
|
||||
.paletteTag = 0x14,
|
||||
.oam = &sMatchCallRightArrowSpriteOam,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCB_MatchCallRightArrow
|
||||
};
|
||||
|
||||
static const struct OamData sMatchCallUpDownArrowSpriteOam =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = ST_OAM_AFFINE_OFF,
|
||||
.objMode = ST_OAM_OBJ_NORMAL,
|
||||
.bpp = ST_OAM_4BPP,
|
||||
.shape = SPRITE_SHAPE(16x8),
|
||||
.x = 0,
|
||||
.size = SPRITE_SIZE(16x8),
|
||||
.tileNum = 0,
|
||||
.priority = 2,
|
||||
.paletteNum = 0
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sMatchCallUpDownArrowSprite =
|
||||
{
|
||||
.tileTag = 0xA,
|
||||
.paletteTag = 0x14,
|
||||
.oam = &sMatchCallUpDownArrowSpriteOam,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
|
||||
void sub_81C8ED0(void)
|
||||
{
|
||||
u32 i;
|
||||
const struct CompressedSpriteSheet *ptr;
|
||||
|
||||
for (i = 0, ptr = sMatchcallArrowSpriteSheets; i < ARRAY_COUNT(sMatchcallArrowSpriteSheets); ptr++, i++)
|
||||
LoadCompressedSpriteSheet(ptr);
|
||||
|
||||
Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalettes);
|
||||
}
|
||||
|
||||
void CreateMatchCallArrowSprites(struct MatchCallWindowState *windowState, struct PokenavSub17Substruct *list)
|
||||
{
|
||||
u32 spriteId;
|
||||
s16 x;
|
||||
|
||||
spriteId = CreateSprite(&sMatchCallRightArrowSprite, list->listWindow.unk2 * 8 + 3, (list->listWindow.unk3 + 1) * 8, 7);
|
||||
list->rightArrow = &gSprites[spriteId];
|
||||
|
||||
x = list->listWindow.unk2 * 8 + (list->listWindow.unk4 - 1) * 4;
|
||||
spriteId = CreateSprite(&sMatchCallUpDownArrowSprite, x, list->listWindow.unk3 * 8 + windowState->visibleEntries * 16, 7);
|
||||
list->downArrow = &gSprites[spriteId];
|
||||
list->downArrow->oam.tileNum += 2;
|
||||
list->downArrow->callback = SpriteCB_MatchCallDownArrow;
|
||||
|
||||
spriteId = CreateSprite(&sMatchCallUpDownArrowSprite, x, list->listWindow.unk3 * 8, 7);
|
||||
list->upArrow = &gSprites[spriteId];
|
||||
list->upArrow->oam.tileNum += 4;
|
||||
list->upArrow->callback = SpriteCB_MatchCallUpArrow;
|
||||
}
|
||||
|
||||
void DestroyMatchCallListArrows(struct PokenavSub17Substruct *list)
|
||||
{
|
||||
DestroySprite(list->rightArrow);
|
||||
DestroySprite(list->upArrow);
|
||||
DestroySprite(list->downArrow);
|
||||
FreeSpriteTilesByTag(0xA);
|
||||
FreeSpritePaletteByTag(0x14);
|
||||
}
|
||||
|
||||
void ToggleMatchCallArrows(struct PokenavSub17Substruct *list, bool32 shouldHide)
|
||||
{
|
||||
if (shouldHide)
|
||||
{
|
||||
list->rightArrow->callback = SpriteCallbackDummy;
|
||||
list->upArrow->callback = SpriteCallbackDummy;
|
||||
list->downArrow->callback = SpriteCallbackDummy;
|
||||
}
|
||||
else
|
||||
{
|
||||
list->rightArrow->callback = SpriteCB_MatchCallRightArrow;
|
||||
list->upArrow->callback = SpriteCB_MatchCallUpArrow;
|
||||
list->downArrow->callback = SpriteCB_MatchCallDownArrow;
|
||||
}
|
||||
list->rightArrow->invisible = shouldHide;
|
||||
list->upArrow->invisible = shouldHide;
|
||||
list->downArrow->invisible = shouldHide;
|
||||
}
|
||||
|
||||
void SpriteCB_MatchCallRightArrow(struct Sprite *sprite)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
sprite->y2 = structPtr->unk888.selectedIndexOffset << 4;
|
||||
}
|
||||
|
||||
void SpriteCB_MatchCallDownArrow(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[7] == 0 && ShouldShowDownArrow())
|
||||
sprite->invisible = FALSE;
|
||||
else
|
||||
sprite->invisible = TRUE;
|
||||
|
||||
if (++sprite->data[0] > 3)
|
||||
{
|
||||
s16 offset;
|
||||
|
||||
sprite->data[0] = 0;
|
||||
offset = (sprite->data[1] + 1) & 7;
|
||||
sprite->data[1] = offset;
|
||||
sprite->y2 = offset;
|
||||
}
|
||||
}
|
||||
|
||||
void SpriteCB_MatchCallUpArrow(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[7] == 0 && ShouldShowUpArrow())
|
||||
sprite->invisible = FALSE;
|
||||
else
|
||||
sprite->invisible = TRUE;
|
||||
|
||||
if (++sprite->data[0] > 3)
|
||||
{
|
||||
s16 offset;
|
||||
|
||||
sprite->data[0] = 0;
|
||||
offset = (sprite->data[1] + 1) & 7;
|
||||
sprite->data[1] = offset;
|
||||
sprite->y2 = -1 * offset;
|
||||
}
|
||||
}
|
||||
|
||||
void ToggleMatchCallVerticalArrows(bool32 shouldHide)
|
||||
{
|
||||
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
|
||||
structPtr->list.upArrow->data[7] = shouldHide;
|
||||
structPtr->list.downArrow->data[7] = shouldHide;
|
||||
}
|
||||
|
||||
void InitMatchCallWindowState(struct MatchCallWindowState *dst, struct PokenavListTemplate *template)
|
||||
{
|
||||
dst->unk10 = template->list.matchCallEntries;
|
||||
dst->windowTopIndex = template->unk6;
|
||||
dst->listLength = template->count;
|
||||
dst->unkC = template->unk8;
|
||||
dst->visibleEntries = template->maxShowed;
|
||||
if (dst->visibleEntries >= dst->listLength)
|
||||
{
|
||||
dst->windowTopIndex = 0;
|
||||
dst->unk4 = 0;
|
||||
dst->selectedIndexOffset = template->unk6;
|
||||
}
|
||||
else
|
||||
{
|
||||
dst->unk4 = dst->listLength - dst->visibleEntries;
|
||||
if (dst->windowTopIndex + dst->visibleEntries > dst->listLength)
|
||||
{
|
||||
dst->selectedIndexOffset = dst->windowTopIndex + dst->visibleEntries - dst->listLength;
|
||||
dst->windowTopIndex = template->unk6 - dst->selectedIndexOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
dst->selectedIndexOffset = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, const struct BgTemplate *bgTemplate, struct PokenavListTemplate *template, s32 a3)
|
||||
{
|
||||
struct WindowTemplate window;
|
||||
|
||||
dest->listWindow.bg = bgTemplate->bg;
|
||||
dest->listWindow.unk6 = a3;
|
||||
dest->unk34 = template->listFunc.unk10_2;
|
||||
dest->unk38 = template->unk14;
|
||||
dest->listWindow.unk1 = template->fillValue;
|
||||
dest->listWindow.unk2 = template->item_X;
|
||||
dest->listWindow.unk3 = template->listTop;
|
||||
dest->listWindow.unk4 = template->windowWidth;
|
||||
dest->listWindow.fontId = template->fontId;
|
||||
|
||||
window.bg = bgTemplate->bg;
|
||||
window.tilemapLeft = template->item_X;
|
||||
window.tilemapTop = 0;
|
||||
window.width = template->windowWidth;
|
||||
window.height = 32;
|
||||
window.paletteNum = template->fillValue;
|
||||
window.baseBlock = a3 + 2;
|
||||
|
||||
dest->listWindow.windowId = AddWindow(&window);
|
||||
if (dest->listWindow.windowId == WINDOW_NONE)
|
||||
return FALSE;
|
||||
|
||||
dest->listWindow.unkA = 0;
|
||||
dest->rightArrow = NULL;
|
||||
dest->upArrow = NULL;
|
||||
dest->downArrow = NULL;
|
||||
return 1;
|
||||
}
|
||||
@@ -0,0 +1,513 @@
|
||||
#include "global.h"
|
||||
#include "pokenav.h"
|
||||
#include "event_data.h"
|
||||
#include "main.h"
|
||||
#include "sound.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct Pokenav_Menu
|
||||
{
|
||||
u16 menuType;
|
||||
s16 cursorPos;
|
||||
u16 currMenuItem;
|
||||
u16 helpBarIndex;
|
||||
u32 menuId;
|
||||
u32 (*callback)(struct Pokenav_Menu*);
|
||||
};
|
||||
|
||||
static bool32 UpdateMenuCursorPos(struct Pokenav_Menu *);
|
||||
static void ReturnToConditionMenu(struct Pokenav_Menu *);
|
||||
static void ReturnToMainMenu(struct Pokenav_Menu *);
|
||||
static u32 GetMenuId(struct Pokenav_Menu *);
|
||||
static void SetMenuIdAndCB(struct Pokenav_Menu *, u32);
|
||||
static u32 CB2_ReturnToConditionMenu(struct Pokenav_Menu *);
|
||||
static u32 CB2_ReturnToMainMenu(struct Pokenav_Menu *);
|
||||
static u32 HandleConditionSearchMenuInput(struct Pokenav_Menu *);
|
||||
static u32 HandleConditionMenuInput(struct Pokenav_Menu *);
|
||||
static u32 HandleCantOpenRibbonsInput(struct Pokenav_Menu *);
|
||||
static u32 HandleMainMenuInputEndTutorial(struct Pokenav_Menu *);
|
||||
static u32 HandleMainMenuInputTutorial(struct Pokenav_Menu *);
|
||||
static u32 HandleMainMenuInput(struct Pokenav_Menu *);
|
||||
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav_Menu*);
|
||||
static void SetMenuInputHandler(struct Pokenav_Menu *);
|
||||
|
||||
// Number of entries - 1 for that menu type
|
||||
static const u8 sLastCursorPositions[] =
|
||||
{
|
||||
[POKENAV_MENU_TYPE_DEFAULT] = 2,
|
||||
[POKENAV_MENU_TYPE_UNLOCK_MC] = 3,
|
||||
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = 4,
|
||||
[POKENAV_MENU_TYPE_CONDITION] = 2,
|
||||
[POKENAV_MENU_TYPE_CONDITION_SEARCH] = 5
|
||||
};
|
||||
|
||||
static const u8 sMenuItems[][MAX_POKENAV_MENUITEMS] =
|
||||
{
|
||||
[POKENAV_MENU_TYPE_DEFAULT] =
|
||||
{
|
||||
POKENAV_MENUITEM_MAP,
|
||||
POKENAV_MENUITEM_CONDITION,
|
||||
[2 ... MAX_POKENAV_MENUITEMS - 1] = POKENAV_MENUITEM_SWITCH_OFF
|
||||
},
|
||||
[POKENAV_MENU_TYPE_UNLOCK_MC] =
|
||||
{
|
||||
POKENAV_MENUITEM_MAP,
|
||||
POKENAV_MENUITEM_CONDITION,
|
||||
POKENAV_MENUITEM_MATCH_CALL,
|
||||
[3 ... MAX_POKENAV_MENUITEMS - 1] = POKENAV_MENUITEM_SWITCH_OFF
|
||||
},
|
||||
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] =
|
||||
{
|
||||
POKENAV_MENUITEM_MAP,
|
||||
POKENAV_MENUITEM_CONDITION,
|
||||
POKENAV_MENUITEM_MATCH_CALL,
|
||||
POKENAV_MENUITEM_RIBBONS,
|
||||
[4 ... MAX_POKENAV_MENUITEMS - 1] = POKENAV_MENUITEM_SWITCH_OFF
|
||||
},
|
||||
[POKENAV_MENU_TYPE_CONDITION] =
|
||||
{
|
||||
POKENAV_MENUITEM_CONDITION_PARTY,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH,
|
||||
POKENAV_MENUITEM_CONDITION_CANCEL,
|
||||
[3 ... MAX_POKENAV_MENUITEMS - 1] = POKENAV_MENUITEM_SWITCH_OFF
|
||||
},
|
||||
[POKENAV_MENU_TYPE_CONDITION_SEARCH] =
|
||||
{
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_COOL,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_CUTE,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_SMART,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL
|
||||
},
|
||||
};
|
||||
|
||||
static u8 GetPokenavMainMenuType(void)
|
||||
{
|
||||
u8 menuType = POKENAV_MENU_TYPE_DEFAULT;
|
||||
|
||||
if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV))
|
||||
{
|
||||
menuType = POKENAV_MENU_TYPE_UNLOCK_MC;
|
||||
|
||||
if (FlagGet(FLAG_SYS_RIBBON_GET))
|
||||
menuType = POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS;
|
||||
}
|
||||
|
||||
return menuType;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_MainMenuCursorOnMap(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
|
||||
if (!menu)
|
||||
return FALSE;
|
||||
|
||||
menu->menuType = GetPokenavMainMenuType();
|
||||
menu->cursorPos = POKENAV_MENUITEM_MAP;
|
||||
menu->currMenuItem = POKENAV_MENUITEM_MAP;
|
||||
menu->helpBarIndex = HELPBAR_NONE;
|
||||
SetMenuInputHandler(menu);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_MainMenuCursorOnMatchCall(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
|
||||
if (!menu)
|
||||
return FALSE;
|
||||
|
||||
menu->menuType = GetPokenavMainMenuType();
|
||||
menu->cursorPos = POKENAV_MENUITEM_MATCH_CALL;
|
||||
menu->currMenuItem = POKENAV_MENUITEM_MATCH_CALL;
|
||||
menu->helpBarIndex = HELPBAR_NONE;
|
||||
SetMenuInputHandler(menu);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_MainMenuCursorOnRibbons(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
|
||||
if (!menu)
|
||||
return FALSE;
|
||||
|
||||
menu->menuType = GetPokenavMainMenuType();
|
||||
menu->cursorPos = POKENAV_MENUITEM_RIBBONS;
|
||||
menu->currMenuItem = POKENAV_MENUITEM_RIBBONS;
|
||||
SetMenuInputHandler(menu);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_ConditionMenu(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
|
||||
if (!menu)
|
||||
return FALSE;
|
||||
|
||||
menu->menuType = POKENAV_MENU_TYPE_CONDITION;
|
||||
menu->cursorPos = 0; //party
|
||||
menu->currMenuItem = POKENAV_MENUITEM_CONDITION_PARTY;
|
||||
menu->helpBarIndex = HELPBAR_NONE;
|
||||
SetMenuInputHandler(menu);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_ConditionSearchMenu(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
|
||||
if (!menu)
|
||||
return FALSE;
|
||||
|
||||
menu->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
|
||||
menu->cursorPos = GetSelectedConditionSearch();
|
||||
menu->currMenuItem = menu->cursorPos + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
|
||||
menu->helpBarIndex = HELPBAR_NONE;
|
||||
SetMenuInputHandler(menu);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void SetMenuInputHandler(struct Pokenav_Menu *menu)
|
||||
{
|
||||
switch (menu->menuType)
|
||||
{
|
||||
case POKENAV_MENU_TYPE_DEFAULT:
|
||||
SetPokenavMode(POKENAV_MODE_NORMAL);
|
||||
// fallthrough
|
||||
case POKENAV_MENU_TYPE_UNLOCK_MC:
|
||||
case POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS:
|
||||
menu->callback = GetMainMenuInputHandler();
|
||||
break;
|
||||
case POKENAV_MENU_TYPE_CONDITION:
|
||||
menu->callback = HandleConditionMenuInput;
|
||||
break;
|
||||
case POKENAV_MENU_TYPE_CONDITION_SEARCH:
|
||||
menu->callback = HandleConditionSearchMenuInput;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav_Menu*)
|
||||
{
|
||||
switch (GetPokenavMode())
|
||||
{
|
||||
default:
|
||||
case POKENAV_MODE_NORMAL:
|
||||
return HandleMainMenuInput;
|
||||
case POKENAV_MODE_FORCE_CALL_READY:
|
||||
return HandleMainMenuInputTutorial;
|
||||
case POKENAV_MODE_FORCE_CALL_EXIT:
|
||||
return HandleMainMenuInputEndTutorial;
|
||||
}
|
||||
}
|
||||
|
||||
u32 GetMenuHandlerCallback(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return menu->callback(menu);
|
||||
}
|
||||
|
||||
void FreeMenuHandlerSubstruct1(void)
|
||||
{
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
}
|
||||
|
||||
static u32 HandleMainMenuInput(struct Pokenav_Menu *menu)
|
||||
{
|
||||
if (UpdateMenuCursorPos(menu))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
switch (sMenuItems[menu->menuType][menu->cursorPos])
|
||||
{
|
||||
case POKENAV_MENUITEM_MAP:
|
||||
menu->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT;
|
||||
SetMenuIdAndCB(menu, POKENAV_REGION_MAP);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
case POKENAV_MENUITEM_CONDITION:
|
||||
menu->menuType = POKENAV_MENU_TYPE_CONDITION;
|
||||
menu->cursorPos = 0;
|
||||
menu->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][0];
|
||||
menu->callback = HandleConditionMenuInput;
|
||||
return POKENAV_MENU_FUNC_OPEN_CONDITION;
|
||||
case POKENAV_MENUITEM_MATCH_CALL:
|
||||
menu->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
|
||||
SetMenuIdAndCB(menu, POKENAV_MATCH_CALL);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
case POKENAV_MENUITEM_RIBBONS:
|
||||
if (CanViewRibbonsMenu())
|
||||
{
|
||||
menu->helpBarIndex = HELPBAR_RIBBONS_MON_LIST;
|
||||
SetMenuIdAndCB(menu, POKENAV_RIBBONS_MON_LIST);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->callback = HandleCantOpenRibbonsInput;
|
||||
return POKENAV_MENU_FUNC_NO_RIBBON_WINNERS;
|
||||
}
|
||||
case POKENAV_MENUITEM_SWITCH_OFF:
|
||||
return POKENAV_MENU_FUNC_EXIT;
|
||||
}
|
||||
}
|
||||
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
return POKENAV_MENU_FUNC_EXIT;
|
||||
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
// Force the player to select Match Call during the call Mr. Stone pokenav tutorial
|
||||
static u32 HandleMainMenuInputTutorial(struct Pokenav_Menu *menu)
|
||||
{
|
||||
if (UpdateMenuCursorPos(menu))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
if (sMenuItems[menu->menuType][menu->cursorPos] == POKENAV_MENUITEM_MATCH_CALL)
|
||||
{
|
||||
menu->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
|
||||
SetMenuIdAndCB(menu, POKENAV_MATCH_CALL);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_FAILURE);
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
PlaySE(SE_FAILURE);
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
// After calling Mr. Stone during the pokenav tutorial, force player to exit or use Match Call again
|
||||
static u32 HandleMainMenuInputEndTutorial(struct Pokenav_Menu *menu)
|
||||
{
|
||||
if (UpdateMenuCursorPos(menu))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
u32 menuItem = sMenuItems[menu->menuType][menu->cursorPos];
|
||||
if (menuItem != POKENAV_MENUITEM_MATCH_CALL && menuItem != POKENAV_MENUITEM_SWITCH_OFF)
|
||||
{
|
||||
PlaySE(SE_FAILURE);
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
else if (menuItem == POKENAV_MENUITEM_MATCH_CALL)
|
||||
{
|
||||
menu->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
|
||||
SetMenuIdAndCB(menu, POKENAV_MATCH_CALL);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
// Handles input after selecting Ribbons when there are no ribbon winners left
|
||||
// Selecting it again just reprints the Ribbon description to replace the "No Ribbon winners" message
|
||||
static u32 HandleCantOpenRibbonsInput(struct Pokenav_Menu *menu)
|
||||
{
|
||||
if (UpdateMenuCursorPos(menu))
|
||||
{
|
||||
menu->callback = GetMainMenuInputHandler();
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
}
|
||||
|
||||
if (JOY_NEW(A_BUTTON | B_BUTTON))
|
||||
{
|
||||
menu->callback = GetMainMenuInputHandler();
|
||||
return POKENAV_MENU_FUNC_RESHOW_DESCRIPTION;
|
||||
}
|
||||
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 HandleConditionMenuInput(struct Pokenav_Menu *menu)
|
||||
{
|
||||
if (UpdateMenuCursorPos(menu))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
switch (sMenuItems[menu->menuType][menu->cursorPos])
|
||||
{
|
||||
case POKENAV_MENUITEM_CONDITION_SEARCH:
|
||||
menu->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
|
||||
menu->cursorPos = 0;
|
||||
menu->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION_SEARCH][0];
|
||||
menu->callback = HandleConditionSearchMenuInput;
|
||||
return POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH;
|
||||
case POKENAV_MENUITEM_CONDITION_PARTY:
|
||||
menu->helpBarIndex = 0;
|
||||
SetMenuIdAndCB(menu, POKENAV_CONDITION_GRAPH_PARTY);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
case POKENAV_MENUITEM_CONDITION_CANCEL:
|
||||
PlaySE(SE_SELECT);
|
||||
ReturnToMainMenu(menu);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
|
||||
}
|
||||
}
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
if (menu->cursorPos != sLastCursorPositions[menu->menuType])
|
||||
{
|
||||
menu->cursorPos = sLastCursorPositions[menu->menuType];
|
||||
menu->callback = CB2_ReturnToMainMenu;
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ReturnToMainMenu(menu);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
|
||||
}
|
||||
}
|
||||
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 HandleConditionSearchMenuInput(struct Pokenav_Menu *menu)
|
||||
{
|
||||
if (UpdateMenuCursorPos(menu))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
u8 menuItem = sMenuItems[menu->menuType][menu->cursorPos];
|
||||
if (menuItem != POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL)
|
||||
{
|
||||
SetSelectedConditionSearch(menuItem - POKENAV_MENUITEM_CONDITION_SEARCH_COOL);
|
||||
SetMenuIdAndCB(menu, POKENAV_CONDITION_SEARCH_RESULTS);
|
||||
menu->helpBarIndex = HELPBAR_CONDITION_MON_LIST;
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ReturnToConditionMenu(menu);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
|
||||
}
|
||||
}
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
if (menu->cursorPos != sLastCursorPositions[menu->menuType])
|
||||
{
|
||||
menu->cursorPos = sLastCursorPositions[menu->menuType];
|
||||
menu->callback = CB2_ReturnToConditionMenu;
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ReturnToConditionMenu(menu);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
|
||||
}
|
||||
}
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 CB2_ReturnToMainMenu(struct Pokenav_Menu *menu)
|
||||
{
|
||||
ReturnToMainMenu(menu);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
|
||||
}
|
||||
|
||||
static u32 CB2_ReturnToConditionMenu(struct Pokenav_Menu *menu)
|
||||
{
|
||||
ReturnToConditionMenu(menu);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
|
||||
}
|
||||
|
||||
static void SetMenuIdAndCB(struct Pokenav_Menu *menu, u32 menuId)
|
||||
{
|
||||
menu->menuId = menuId;
|
||||
menu->callback = GetMenuId;
|
||||
}
|
||||
|
||||
static u32 GetMenuId(struct Pokenav_Menu *menu)
|
||||
{
|
||||
return menu->menuId;
|
||||
}
|
||||
|
||||
static void ReturnToMainMenu(struct Pokenav_Menu *menu)
|
||||
{
|
||||
menu->menuType = GetPokenavMainMenuType();
|
||||
menu->cursorPos = 1;
|
||||
menu->currMenuItem = sMenuItems[menu->menuType][menu->cursorPos];
|
||||
menu->callback = HandleMainMenuInput;
|
||||
}
|
||||
|
||||
static void ReturnToConditionMenu(struct Pokenav_Menu *menu)
|
||||
{
|
||||
menu->menuType = POKENAV_MENU_TYPE_CONDITION;
|
||||
menu->cursorPos = 1;
|
||||
menu->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][1];
|
||||
menu->callback = HandleConditionMenuInput;
|
||||
}
|
||||
|
||||
static bool32 UpdateMenuCursorPos(struct Pokenav_Menu *menu)
|
||||
{
|
||||
if (JOY_NEW(DPAD_UP))
|
||||
{
|
||||
if (--menu->cursorPos < 0)
|
||||
menu->cursorPos = sLastCursorPositions[menu->menuType];
|
||||
|
||||
menu->currMenuItem = sMenuItems[menu->menuType][menu->cursorPos];
|
||||
return TRUE;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_DOWN))
|
||||
{
|
||||
menu->cursorPos++;
|
||||
if (menu->cursorPos > sLastCursorPositions[menu->menuType])
|
||||
menu->cursorPos = 0;
|
||||
|
||||
menu->currMenuItem = sMenuItems[menu->menuType][menu->cursorPos];
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
int GetPokenavMenuType(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return menu->menuType;
|
||||
}
|
||||
|
||||
// Position of cursor relative to number of current menu options
|
||||
int GetPokenavCursorPos(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return menu->cursorPos;
|
||||
}
|
||||
|
||||
// ID of menu item the cursor is currently on
|
||||
int GetCurrentMenuItemId(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return menu->currMenuItem;
|
||||
}
|
||||
|
||||
u16 GetHelpBarTextId(void)
|
||||
{
|
||||
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return menu->helpBarIndex;
|
||||
}
|
||||
@@ -1,513 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "pokenav.h"
|
||||
#include "event_data.h"
|
||||
#include "main.h"
|
||||
#include "sound.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct Pokenav1Struct
|
||||
{
|
||||
u16 menuType;
|
||||
s16 cursorPos;
|
||||
u16 currMenuItem;
|
||||
u16 helpBarIndex;
|
||||
u32 menuId;
|
||||
u32 (*callback)(struct Pokenav1Struct*);
|
||||
};
|
||||
|
||||
static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state);
|
||||
static void ReturnToConditionMenu(struct Pokenav1Struct *state);
|
||||
static void ReturnToMainMenu(struct Pokenav1Struct *state);
|
||||
static u32 GetMenuId(struct Pokenav1Struct *state);
|
||||
static void SetMenuIdAndCB(struct Pokenav1Struct *state, u32 a1);
|
||||
static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state);
|
||||
static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state);
|
||||
static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state);
|
||||
static u32 HandleConditionMenuInput(struct Pokenav1Struct *state);
|
||||
static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state);
|
||||
static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state);
|
||||
static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state);
|
||||
static u32 HandleMainMenuInput(struct Pokenav1Struct *state);
|
||||
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*);
|
||||
static void SetMenuInputHandler(struct Pokenav1Struct *state);
|
||||
|
||||
// Number of entries - 1 for that menu type
|
||||
static const u8 sLastCursorPositions[] =
|
||||
{
|
||||
[POKENAV_MENU_TYPE_DEFAULT] = 2,
|
||||
[POKENAV_MENU_TYPE_UNLOCK_MC] = 3,
|
||||
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = 4,
|
||||
[POKENAV_MENU_TYPE_CONDITION] = 2,
|
||||
[POKENAV_MENU_TYPE_CONDITION_SEARCH] = 5
|
||||
};
|
||||
|
||||
static const u8 sMenuItems[][6] =
|
||||
{
|
||||
[POKENAV_MENU_TYPE_DEFAULT] =
|
||||
{
|
||||
POKENAV_MENUITEM_MAP,
|
||||
POKENAV_MENUITEM_CONDITION,
|
||||
[2 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
|
||||
},
|
||||
[POKENAV_MENU_TYPE_UNLOCK_MC] =
|
||||
{
|
||||
POKENAV_MENUITEM_MAP,
|
||||
POKENAV_MENUITEM_CONDITION,
|
||||
POKENAV_MENUITEM_MATCH_CALL,
|
||||
[3 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
|
||||
},
|
||||
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] =
|
||||
{
|
||||
POKENAV_MENUITEM_MAP,
|
||||
POKENAV_MENUITEM_CONDITION,
|
||||
POKENAV_MENUITEM_MATCH_CALL,
|
||||
POKENAV_MENUITEM_RIBBONS,
|
||||
[4 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
|
||||
},
|
||||
[POKENAV_MENU_TYPE_CONDITION] =
|
||||
{
|
||||
POKENAV_MENUITEM_CONDITION_PARTY,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH,
|
||||
POKENAV_MENUITEM_CONDITION_CANCEL,
|
||||
[3 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
|
||||
},
|
||||
[POKENAV_MENU_TYPE_CONDITION_SEARCH] =
|
||||
{
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_COOL,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_CUTE,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_SMART,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH,
|
||||
POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL
|
||||
},
|
||||
};
|
||||
|
||||
static u8 GetPokenavMainMenuType(void)
|
||||
{
|
||||
u8 menuType = POKENAV_MENU_TYPE_DEFAULT;
|
||||
|
||||
if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV))
|
||||
{
|
||||
menuType = POKENAV_MENU_TYPE_UNLOCK_MC;
|
||||
|
||||
if (FlagGet(FLAG_SYS_RIBBON_GET))
|
||||
menuType = POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS;
|
||||
}
|
||||
|
||||
return menuType;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_MainMenuCursorOnMap(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
|
||||
if (!state)
|
||||
return FALSE;
|
||||
|
||||
state->menuType = GetPokenavMainMenuType();
|
||||
state->cursorPos = POKENAV_MENUITEM_MAP;
|
||||
state->currMenuItem = POKENAV_MENUITEM_MAP;
|
||||
state->helpBarIndex = HELPBAR_NONE;
|
||||
SetMenuInputHandler(state);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_MainMenuCursorOnMatchCall(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
|
||||
if (!state)
|
||||
return FALSE;
|
||||
|
||||
state->menuType = GetPokenavMainMenuType();
|
||||
state->cursorPos = POKENAV_MENUITEM_MATCH_CALL;
|
||||
state->currMenuItem = POKENAV_MENUITEM_MATCH_CALL;
|
||||
state->helpBarIndex = HELPBAR_NONE;
|
||||
SetMenuInputHandler(state);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_MainMenuCursorOnRibbons(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
|
||||
if (!state)
|
||||
return FALSE;
|
||||
|
||||
state->menuType = GetPokenavMainMenuType();
|
||||
state->cursorPos = POKENAV_MENUITEM_RIBBONS;
|
||||
state->currMenuItem = POKENAV_MENUITEM_RIBBONS;
|
||||
SetMenuInputHandler(state);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_ConditionMenu(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
|
||||
if (!state)
|
||||
return FALSE;
|
||||
|
||||
state->menuType = POKENAV_MENU_TYPE_CONDITION;
|
||||
state->cursorPos = 0; //party
|
||||
state->currMenuItem = POKENAV_MENUITEM_CONDITION_PARTY;
|
||||
state->helpBarIndex = HELPBAR_NONE;
|
||||
SetMenuInputHandler(state);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_ConditionSearchMenu(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
|
||||
if (!state)
|
||||
return FALSE;
|
||||
|
||||
state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
|
||||
state->cursorPos = GetSelectedConditionSearch();
|
||||
state->currMenuItem = state->cursorPos + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
|
||||
state->helpBarIndex = HELPBAR_NONE;
|
||||
SetMenuInputHandler(state);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void SetMenuInputHandler(struct Pokenav1Struct *state)
|
||||
{
|
||||
switch (state->menuType)
|
||||
{
|
||||
case POKENAV_MENU_TYPE_DEFAULT:
|
||||
SetPokenavMode(POKENAV_MODE_NORMAL);
|
||||
// fallthrough
|
||||
case POKENAV_MENU_TYPE_UNLOCK_MC:
|
||||
case POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS:
|
||||
state->callback = GetMainMenuInputHandler();
|
||||
break;
|
||||
case POKENAV_MENU_TYPE_CONDITION:
|
||||
state->callback = HandleConditionMenuInput;
|
||||
break;
|
||||
case POKENAV_MENU_TYPE_CONDITION_SEARCH:
|
||||
state->callback = HandleConditionSearchMenuInput;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*)
|
||||
{
|
||||
switch (GetPokenavMode())
|
||||
{
|
||||
default:
|
||||
case POKENAV_MODE_NORMAL:
|
||||
return HandleMainMenuInput;
|
||||
case POKENAV_MODE_FORCE_CALL_READY:
|
||||
return HandleMainMenuInputTutorial;
|
||||
case POKENAV_MODE_FORCE_CALL_EXIT:
|
||||
return HandleMainMenuInputEndTutorial;
|
||||
}
|
||||
}
|
||||
|
||||
u32 GetMenuHandlerCallback(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return state->callback(state);
|
||||
}
|
||||
|
||||
void FreeMenuHandlerSubstruct1(void)
|
||||
{
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
}
|
||||
|
||||
static u32 HandleMainMenuInput(struct Pokenav1Struct *state)
|
||||
{
|
||||
if (UpdateMenuCursorPos(state))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
switch (sMenuItems[state->menuType][state->cursorPos])
|
||||
{
|
||||
case POKENAV_MENUITEM_MAP:
|
||||
state->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT;
|
||||
SetMenuIdAndCB(state, POKENAV_REGION_MAP);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
case POKENAV_MENUITEM_CONDITION:
|
||||
state->menuType = POKENAV_MENU_TYPE_CONDITION;
|
||||
state->cursorPos = 0;
|
||||
state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][0];
|
||||
state->callback = HandleConditionMenuInput;
|
||||
return POKENAV_MENU_FUNC_OPEN_CONDITION;
|
||||
case POKENAV_MENUITEM_MATCH_CALL:
|
||||
state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
|
||||
SetMenuIdAndCB(state, POKENAV_MATCH_CALL);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
case POKENAV_MENUITEM_RIBBONS:
|
||||
if (CanViewRibbonsMenu())
|
||||
{
|
||||
state->helpBarIndex = HELPBAR_RIBBONS_MON_LIST;
|
||||
SetMenuIdAndCB(state, POKENAV_RIBBONS_MON_LIST);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
state->callback = HandleCantOpenRibbonsInput;
|
||||
return POKENAV_MENU_FUNC_NO_RIBBON_WINNERS;
|
||||
}
|
||||
case POKENAV_MENUITEM_SWITCH_OFF:
|
||||
return POKENAV_MENU_FUNC_EXIT;
|
||||
}
|
||||
}
|
||||
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
return POKENAV_MENU_FUNC_EXIT;
|
||||
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
// Force the player to select Match Call during the call Mr. Stone pokenav tutorial
|
||||
static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state)
|
||||
{
|
||||
if (UpdateMenuCursorPos(state))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
if (sMenuItems[state->menuType][state->cursorPos] == POKENAV_MENUITEM_MATCH_CALL)
|
||||
{
|
||||
state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
|
||||
SetMenuIdAndCB(state, POKENAV_MATCH_CALL);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_FAILURE);
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
PlaySE(SE_FAILURE);
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
// After calling Mr. Stone during the pokenav tutorial, force player to exit or use Match Call again
|
||||
static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state)
|
||||
{
|
||||
if (UpdateMenuCursorPos(state))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
u32 menuItem = sMenuItems[state->menuType][state->cursorPos];
|
||||
if (menuItem != POKENAV_MENUITEM_MATCH_CALL && menuItem != POKENAV_MENUITEM_SWITCH_OFF)
|
||||
{
|
||||
PlaySE(SE_FAILURE);
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
else if (menuItem == POKENAV_MENUITEM_MATCH_CALL)
|
||||
{
|
||||
state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
|
||||
SetMenuIdAndCB(state, POKENAV_MATCH_CALL);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
// Handles input after selecting Ribbons when there are no ribbon winners left
|
||||
// Selecting it again just reprints the Ribbon description to replace the "No Ribbon winners" message
|
||||
static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state)
|
||||
{
|
||||
if (UpdateMenuCursorPos(state))
|
||||
{
|
||||
state->callback = GetMainMenuInputHandler();
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
}
|
||||
|
||||
if (JOY_NEW(A_BUTTON | B_BUTTON))
|
||||
{
|
||||
state->callback = GetMainMenuInputHandler();
|
||||
return POKENAV_MENU_FUNC_RESHOW_DESCRIPTION;
|
||||
}
|
||||
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 HandleConditionMenuInput(struct Pokenav1Struct *state)
|
||||
{
|
||||
if (UpdateMenuCursorPos(state))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
switch (sMenuItems[state->menuType][state->cursorPos])
|
||||
{
|
||||
case POKENAV_MENUITEM_CONDITION_SEARCH:
|
||||
state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
|
||||
state->cursorPos = 0;
|
||||
state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION_SEARCH][0];
|
||||
state->callback = HandleConditionSearchMenuInput;
|
||||
return POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH;
|
||||
case POKENAV_MENUITEM_CONDITION_PARTY:
|
||||
state->helpBarIndex = 0;
|
||||
SetMenuIdAndCB(state, POKENAV_CONDITION_PARTY);
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
case POKENAV_MENUITEM_CONDITION_CANCEL:
|
||||
PlaySE(SE_SELECT);
|
||||
ReturnToMainMenu(state);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
|
||||
}
|
||||
}
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
if (state->cursorPos != sLastCursorPositions[state->menuType])
|
||||
{
|
||||
state->cursorPos = sLastCursorPositions[state->menuType];
|
||||
state->callback = CB2_ReturnToMainMenu;
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ReturnToMainMenu(state);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
|
||||
}
|
||||
}
|
||||
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state)
|
||||
{
|
||||
if (UpdateMenuCursorPos(state))
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
u8 menuItem = sMenuItems[state->menuType][state->cursorPos];
|
||||
if (menuItem != POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL)
|
||||
{
|
||||
SetSelectedConditionSearch(menuItem - POKENAV_MENUITEM_CONDITION_SEARCH_COOL);
|
||||
SetMenuIdAndCB(state, POKENAV_CONDITION_SEARCH_RESULTS);
|
||||
state->helpBarIndex = HELPBAR_CONDITION_MON_LIST;
|
||||
return POKENAV_MENU_FUNC_OPEN_FEATURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ReturnToConditionMenu(state);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
|
||||
}
|
||||
}
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
if (state->cursorPos != sLastCursorPositions[state->menuType])
|
||||
{
|
||||
state->cursorPos = sLastCursorPositions[state->menuType];
|
||||
state->callback = CB2_ReturnToConditionMenu;
|
||||
return POKENAV_MENU_FUNC_MOVE_CURSOR;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
ReturnToConditionMenu(state);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
|
||||
}
|
||||
}
|
||||
return POKENAV_MENU_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state)
|
||||
{
|
||||
ReturnToMainMenu(state);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
|
||||
}
|
||||
|
||||
static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state)
|
||||
{
|
||||
ReturnToConditionMenu(state);
|
||||
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
|
||||
}
|
||||
|
||||
static void SetMenuIdAndCB(struct Pokenav1Struct *state, u32 menuId)
|
||||
{
|
||||
state->menuId = menuId;
|
||||
state->callback = GetMenuId;
|
||||
}
|
||||
|
||||
static u32 GetMenuId(struct Pokenav1Struct *state)
|
||||
{
|
||||
return state->menuId;
|
||||
}
|
||||
|
||||
static void ReturnToMainMenu(struct Pokenav1Struct *state)
|
||||
{
|
||||
state->menuType = GetPokenavMainMenuType();
|
||||
state->cursorPos = 1;
|
||||
state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
|
||||
state->callback = HandleMainMenuInput;
|
||||
}
|
||||
|
||||
static void ReturnToConditionMenu(struct Pokenav1Struct *state)
|
||||
{
|
||||
state->menuType = POKENAV_MENU_TYPE_CONDITION;
|
||||
state->cursorPos = 1;
|
||||
state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][1];
|
||||
state->callback = HandleConditionMenuInput;
|
||||
}
|
||||
|
||||
static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state)
|
||||
{
|
||||
if (JOY_NEW(DPAD_UP))
|
||||
{
|
||||
if (--state->cursorPos < 0)
|
||||
state->cursorPos = sLastCursorPositions[state->menuType];
|
||||
|
||||
state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
|
||||
return TRUE;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_DOWN))
|
||||
{
|
||||
state->cursorPos++;
|
||||
if (state->cursorPos > sLastCursorPositions[state->menuType])
|
||||
state->cursorPos = 0;
|
||||
|
||||
state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
int GetPokenavMenuType(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return state->menuType;
|
||||
}
|
||||
|
||||
// Position of cursor relative to number of current menu options
|
||||
int GetPokenavCursorPos(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return state->cursorPos;
|
||||
}
|
||||
|
||||
// ID of menu item the cursor is currently on
|
||||
int GetCurrentMenuItemId(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return state->currMenuItem;
|
||||
}
|
||||
|
||||
u16 GetHelpBarTextId(void)
|
||||
{
|
||||
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
|
||||
return state->helpBarIndex;
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
+50
-47
@@ -17,22 +17,25 @@
|
||||
#include "constants/songs.h"
|
||||
#include "constants/region_map_sections.h"
|
||||
|
||||
#define GFXTAG_CITY_ZOOM 6
|
||||
#define PALTAG_CITY_ZOOM 11
|
||||
|
||||
#define NUM_CITY_MAPS 22
|
||||
|
||||
struct Pokenav5Struct
|
||||
struct Pokenav_RegionMapMenu
|
||||
{
|
||||
u8 filler0[0xC];
|
||||
u8 unused[12];
|
||||
bool32 zoomDisabled;
|
||||
u32 (*callback)(struct Pokenav5Struct *);
|
||||
u32 (*callback)(struct Pokenav_RegionMapMenu *);
|
||||
};
|
||||
|
||||
struct Pokenav5Struct_2
|
||||
struct Pokenav_RegionMapGfx
|
||||
{
|
||||
bool32 (*isTaskActiveCB)(void);
|
||||
u32 loopTaskId;
|
||||
u16 infoWindowId;
|
||||
struct Sprite *cityZoomTextSprites[3];
|
||||
u8 tilemapBuffer[0x800];
|
||||
u8 tilemapBuffer[BG_SCREEN_SIZE];
|
||||
u8 cityZoomPics[NUM_CITY_MAPS][200];
|
||||
};
|
||||
|
||||
@@ -43,9 +46,9 @@ struct CityMapEntry
|
||||
const u32 *tilemap;
|
||||
};
|
||||
|
||||
static u32 HandleRegionMapInput(struct Pokenav5Struct *);
|
||||
static u32 HandleRegionMapInputZoomDisabled(struct Pokenav5Struct *);
|
||||
static u32 GetExitRegionMapMenuId(struct Pokenav5Struct *);
|
||||
static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *);
|
||||
static u32 HandleRegionMapInputZoomDisabled(struct Pokenav_RegionMapMenu *);
|
||||
static u32 GetExitRegionMapMenuId(struct Pokenav_RegionMapMenu *);
|
||||
static u32 LoopedTask_OpenRegionMap(s32);
|
||||
static u32 LoopedTask_DecompressCityMaps(s32);
|
||||
static bool32 GetCurrentLoopedTaskActive(void);
|
||||
@@ -53,15 +56,15 @@ static void FreeCityZoomViewGfx(void);
|
||||
static void LoadCityZoomViewGfx(void);
|
||||
static void DecompressCityMaps(void);
|
||||
static bool32 IsDecompressCityMapsActive(void);
|
||||
static void LoadPokenavRegionMapGfx(struct Pokenav5Struct_2 *);
|
||||
static void LoadPokenavRegionMapGfx(struct Pokenav_RegionMapGfx *);
|
||||
static bool32 TryFreeTempTileDataBuffers(void);
|
||||
static void UpdateMapSecInfoWindow(struct Pokenav5Struct_2 *);
|
||||
static bool32 IsDma3ManagerBusyWithBgCopy_(struct Pokenav5Struct_2 *);
|
||||
static void UpdateMapSecInfoWindow(struct Pokenav_RegionMapGfx *);
|
||||
static bool32 IsDma3ManagerBusyWithBgCopy_(struct Pokenav_RegionMapGfx *);
|
||||
static void ChangeBgYForZoom(bool32);
|
||||
static bool32 IsChangeBgYForZoomActive(void);
|
||||
static void CreateCityZoomTextSprites(void);
|
||||
static void DrawCityMap(struct Pokenav5Struct_2 *, int, int);
|
||||
static void PrintLandmarkNames(struct Pokenav5Struct_2 *, int, int);
|
||||
static void DrawCityMap(struct Pokenav_RegionMapGfx *, int, int);
|
||||
static void PrintLandmarkNames(struct Pokenav_RegionMapGfx *, int, int);
|
||||
static void SetCityZoomTextInvisibility(bool32);
|
||||
static void Task_ChangeBgYForZoom(u8 taskId);
|
||||
static void UpdateCityZoomTextPosition(void);
|
||||
@@ -74,7 +77,7 @@ static u32 LoopedTask_ExitRegionMap(s32);
|
||||
extern const u16 gRegionMapCityZoomTiles_Pal[];
|
||||
extern const u32 gRegionMapCityZoomText_Gfx[];
|
||||
|
||||
static const u16 sMapSecInfoWindow_Pal[] = INCBIN_U16("graphics/pokenav/region_map_info_window.gbapal");
|
||||
static const u16 sMapSecInfoWindow_Pal[] = INCBIN_U16("graphics/pokenav/region_map/info_window.gbapal");
|
||||
static const u32 sRegionMapCityZoomTiles_Gfx[] = INCBIN_U32("graphics/pokenav/zoom_tiles.4bpp.lz");
|
||||
|
||||
#include "data/region_map/city_map_tilemaps.h"
|
||||
@@ -121,12 +124,12 @@ static const LoopedTask sRegionMapLoopTaskFuncs[] =
|
||||
|
||||
static const struct CompressedSpriteSheet sCityZoomTextSpriteSheet[1] =
|
||||
{
|
||||
{gRegionMapCityZoomText_Gfx, 0x800, 6}
|
||||
{gRegionMapCityZoomText_Gfx, 0x800, GFXTAG_CITY_ZOOM}
|
||||
};
|
||||
|
||||
static const struct SpritePalette sCityZoomTilesSpritePalette[] =
|
||||
{
|
||||
{gRegionMapCityZoomTiles_Pal, 11},
|
||||
{gRegionMapCityZoomTiles_Pal, PALTAG_CITY_ZOOM},
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -159,8 +162,8 @@ const struct OamData sCityZoomTextSprite_OamData =
|
||||
|
||||
static const struct SpriteTemplate sCityZoomTextSpriteTemplate =
|
||||
{
|
||||
.tileTag = 6,
|
||||
.paletteTag = 11,
|
||||
.tileTag = GFXTAG_CITY_ZOOM,
|
||||
.paletteTag = PALTAG_CITY_ZOOM,
|
||||
.oam = &sCityZoomTextSprite_OamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
@@ -170,7 +173,7 @@ static const struct SpriteTemplate sCityZoomTextSpriteTemplate =
|
||||
|
||||
u32 PokenavCallback_Init_RegionMap(void)
|
||||
{
|
||||
struct Pokenav5Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_REGION_MAP_STATE, sizeof(struct Pokenav5Struct));
|
||||
struct Pokenav_RegionMapMenu *state = AllocSubstruct(POKENAV_SUBSTRUCT_REGION_MAP_STATE, sizeof(struct Pokenav_RegionMapMenu));
|
||||
if (!state)
|
||||
return FALSE;
|
||||
|
||||
@@ -195,11 +198,11 @@ void FreeRegionMapSubstruct1(void)
|
||||
|
||||
u32 GetRegionMapCallback(void)
|
||||
{
|
||||
struct Pokenav5Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_STATE);
|
||||
struct Pokenav_RegionMapMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_STATE);
|
||||
return state->callback(state);
|
||||
}
|
||||
|
||||
static u32 HandleRegionMapInput(struct Pokenav5Struct *state)
|
||||
static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state)
|
||||
{
|
||||
switch (DoRegionMapInputCallback())
|
||||
{
|
||||
@@ -217,7 +220,7 @@ static u32 HandleRegionMapInput(struct Pokenav5Struct *state)
|
||||
return POKENAV_MAP_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 HandleRegionMapInputZoomDisabled(struct Pokenav5Struct *state)
|
||||
static u32 HandleRegionMapInputZoomDisabled(struct Pokenav_RegionMapMenu *state)
|
||||
{
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
@@ -228,20 +231,20 @@ static u32 HandleRegionMapInputZoomDisabled(struct Pokenav5Struct *state)
|
||||
return POKENAV_MAP_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 GetExitRegionMapMenuId(struct Pokenav5Struct *state)
|
||||
static u32 GetExitRegionMapMenuId(struct Pokenav_RegionMapMenu *state)
|
||||
{
|
||||
return POKENAV_MAIN_MENU_CURSOR_ON_MAP;
|
||||
}
|
||||
|
||||
bool32 GetZoomDisabled(void)
|
||||
{
|
||||
struct Pokenav5Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_STATE);
|
||||
struct Pokenav_RegionMapMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_STATE);
|
||||
return state->zoomDisabled;
|
||||
}
|
||||
|
||||
bool32 OpenPokenavRegionMap(void)
|
||||
{
|
||||
struct Pokenav5Struct_2 *state = AllocSubstruct(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM, sizeof(struct Pokenav5Struct_2));
|
||||
struct Pokenav_RegionMapGfx *state = AllocSubstruct(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM, sizeof(struct Pokenav_RegionMapGfx));
|
||||
if (!state)
|
||||
return FALSE;
|
||||
|
||||
@@ -252,20 +255,20 @@ bool32 OpenPokenavRegionMap(void)
|
||||
|
||||
void CreateRegionMapLoopedTask(s32 index)
|
||||
{
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
state->loopTaskId = CreateLoopedTask(sRegionMapLoopTaskFuncs[index], 1);
|
||||
state->isTaskActiveCB = GetCurrentLoopedTaskActive;
|
||||
}
|
||||
|
||||
bool32 IsRegionMapLoopedTaskActive(void)
|
||||
{
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
return state->isTaskActiveCB();
|
||||
}
|
||||
|
||||
void FreeRegionMapSubstruct2(void)
|
||||
{
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
FreeRegionMapIconResources();
|
||||
FreeCityZoomViewGfx();
|
||||
RemoveWindow(state->infoWindowId);
|
||||
@@ -285,7 +288,7 @@ static void VBlankCB_RegionMap(void)
|
||||
|
||||
static bool32 GetCurrentLoopedTaskActive(void)
|
||||
{
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
return IsLoopedTaskActive(state->loopTaskId);
|
||||
}
|
||||
|
||||
@@ -301,7 +304,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
|
||||
{
|
||||
int menuGfxId;
|
||||
struct RegionMap *regionMap;
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
switch (taskState)
|
||||
{
|
||||
case 0:
|
||||
@@ -346,7 +349,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
|
||||
return LT_PAUSE;
|
||||
|
||||
UpdateMapSecInfoWindow(state);
|
||||
sub_81C7B40();
|
||||
FadeToBlackExceptPrimary();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 5:
|
||||
if (IsDma3ManagerBusyWithBgCopy_(state))
|
||||
@@ -364,7 +367,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
|
||||
|
||||
LoadLeftHeaderGfxForIndex(menuGfxId);
|
||||
ShowLeftHeaderGfx(menuGfxId, 1, 1);
|
||||
PokenavFadeScreen(1);
|
||||
PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 7:
|
||||
if (IsPaletteFadeActive() || AreLeftHeaderSpritesMoving())
|
||||
@@ -377,7 +380,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
|
||||
|
||||
static u32 LoopedTask_UpdateInfoAfterCursorMove(s32 taskState)
|
||||
{
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
switch (taskState)
|
||||
{
|
||||
case 0:
|
||||
@@ -420,7 +423,7 @@ static u32 LoopedTask_RegionMapZoomOut(s32 taskState)
|
||||
|
||||
static u32 LoopedTask_RegionMapZoomIn(s32 taskState)
|
||||
{
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
switch (taskState)
|
||||
{
|
||||
case 0:
|
||||
@@ -457,7 +460,7 @@ static u32 LoopedTask_ExitRegionMap(s32 taskState)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
PokenavFadeScreen(0);
|
||||
PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsPaletteFadeActive())
|
||||
@@ -492,14 +495,14 @@ static void LoadCityZoomViewGfx(void)
|
||||
static void FreeCityZoomViewGfx(void)
|
||||
{
|
||||
int i;
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
FreeSpriteTilesByTag(6);
|
||||
FreeSpritePaletteByTag(11);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
FreeSpriteTilesByTag(GFXTAG_CITY_ZOOM);
|
||||
FreeSpritePaletteByTag(PALTAG_CITY_ZOOM);
|
||||
for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++)
|
||||
DestroySprite(state->cityZoomTextSprites[i]);
|
||||
}
|
||||
|
||||
static void LoadPokenavRegionMapGfx(struct Pokenav5Struct_2 *state)
|
||||
static void LoadPokenavRegionMapGfx(struct Pokenav_RegionMapGfx *state)
|
||||
{
|
||||
BgDmaFill(1, PIXEL_FILL(0), 0x40, 1);
|
||||
BgDmaFill(1, PIXEL_FILL(1), 0x41, 1);
|
||||
@@ -527,7 +530,7 @@ static bool32 TryFreeTempTileDataBuffers(void)
|
||||
return FreeTempTileDataBuffersIfPossible();
|
||||
}
|
||||
|
||||
static void UpdateMapSecInfoWindow(struct Pokenav5Struct_2 *state)
|
||||
static void UpdateMapSecInfoWindow(struct Pokenav_RegionMapGfx *state)
|
||||
{
|
||||
struct RegionMap *regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP);
|
||||
switch (regionMap->mapSecType)
|
||||
@@ -565,7 +568,7 @@ static void UpdateMapSecInfoWindow(struct Pokenav5Struct_2 *state)
|
||||
}
|
||||
}
|
||||
|
||||
static bool32 IsDma3ManagerBusyWithBgCopy_(struct Pokenav5Struct_2 *state)
|
||||
static bool32 IsDma3ManagerBusyWithBgCopy_(struct Pokenav_RegionMapGfx *state)
|
||||
{
|
||||
return IsDma3ManagerBusyWithBgCopy();
|
||||
}
|
||||
@@ -621,7 +624,7 @@ static bool32 IsDecompressCityMapsActive(void)
|
||||
|
||||
static u32 LoopedTask_DecompressCityMaps(s32 taskState)
|
||||
{
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
if (taskState < NUM_CITY_MAPS)
|
||||
{
|
||||
LZ77UnCompWram(sPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]);
|
||||
@@ -631,7 +634,7 @@ static u32 LoopedTask_DecompressCityMaps(s32 taskState)
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static void DrawCityMap(struct Pokenav5Struct_2 *state, int mapSecId, int pos)
|
||||
static void DrawCityMap(struct Pokenav_RegionMapGfx *state, int mapSecId, int pos)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < NUM_CITY_MAPS && (sPokenavCityMaps[i].mapSecId != mapSecId || sPokenavCityMaps[i].index != pos); i++)
|
||||
@@ -644,7 +647,7 @@ static void DrawCityMap(struct Pokenav5Struct_2 *state, int mapSecId, int pos)
|
||||
CopyToBgTilemapBufferRect(1, state->cityZoomPics[i], 18, 6, 10, 10);
|
||||
}
|
||||
|
||||
static void PrintLandmarkNames(struct Pokenav5Struct_2 *state, int mapSecId, int pos)
|
||||
static void PrintLandmarkNames(struct Pokenav_RegionMapGfx *state, int mapSecId, int pos)
|
||||
{
|
||||
int i = 0;
|
||||
while (1)
|
||||
@@ -664,7 +667,7 @@ static void CreateCityZoomTextSprites(void)
|
||||
int i;
|
||||
int y;
|
||||
struct Sprite *sprite;
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
|
||||
// When not zoomed in the text is still created but its pushed off screen
|
||||
if (!IsRegionMapZoomed())
|
||||
@@ -724,7 +727,7 @@ static void SpriteCB_CityZoomText(struct Sprite *sprite)
|
||||
static void UpdateCityZoomTextPosition(void)
|
||||
{
|
||||
int i;
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
int y = 132 - (GetBgY(1) >> 8);
|
||||
for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++)
|
||||
state->cityZoomTextSprites[i]->y = y;
|
||||
@@ -733,7 +736,7 @@ static void UpdateCityZoomTextPosition(void)
|
||||
static void SetCityZoomTextInvisibility(bool32 invisible)
|
||||
{
|
||||
int i;
|
||||
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
|
||||
for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++)
|
||||
state->cityZoomTextSprites[i]->invisible = invisible;
|
||||
}
|
||||
@@ -20,49 +20,49 @@ enum
|
||||
};
|
||||
|
||||
|
||||
struct PokenavSub9
|
||||
struct Pokenav_RibbonsMonList
|
||||
{
|
||||
u32 (*callback)(struct PokenavSub9*);
|
||||
u32 (*callback)(struct Pokenav_RibbonsMonList*);
|
||||
u32 loopedTaskId;
|
||||
u16 winid;
|
||||
s32 boxId;
|
||||
s32 monId;
|
||||
u32 changeBgs;
|
||||
u32 saveMonList;
|
||||
struct PokenavSub18 *monList;
|
||||
struct PokenavMonList *monList;
|
||||
};
|
||||
|
||||
struct PokenavSub10
|
||||
struct Pokenav_RibbonsMonMenu
|
||||
{
|
||||
bool32 (*callback)(void);
|
||||
u32 ltid;
|
||||
u32 loopedTaskId;
|
||||
u16 winid;
|
||||
bool32 fromSummary;
|
||||
u8 buff[BG_SCREEN_SIZE];
|
||||
};
|
||||
|
||||
static u32 HandleRibbonsMonListInput_WaitListInit(struct PokenavSub9 *structPtr);
|
||||
static u32 HandleRibbonsMonListInput(struct PokenavSub9 *structPtr);
|
||||
static u32 RibbonsMonMenu_ReturnToMainMenu(struct PokenavSub9 *structPtr);
|
||||
static u32 RibbonsMonMenu_ToSummaryScreen(struct PokenavSub9 *structPtr);
|
||||
static u32 BuildPartyMonRibbonList(s32 state);
|
||||
static u32 InitBoxMonRibbonList(s32 state);
|
||||
static u32 BuildBoxMonRibbonList(s32 state);
|
||||
static u32 GetMonRibbonListLoopTaskFunc(s32 state);
|
||||
static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item);
|
||||
static u32 LoopedTask_OpenRibbonsMonList(s32 state);
|
||||
static u32 HandleRibbonsMonListInput_WaitListInit(struct Pokenav_RibbonsMonList *);
|
||||
static u32 HandleRibbonsMonListInput(struct Pokenav_RibbonsMonList *);
|
||||
static u32 RibbonsMonMenu_ReturnToMainMenu(struct Pokenav_RibbonsMonList *);
|
||||
static u32 RibbonsMonMenu_ToSummaryScreen(struct Pokenav_RibbonsMonList *);
|
||||
static u32 BuildPartyMonRibbonList(s32);
|
||||
static u32 InitBoxMonRibbonList(s32);
|
||||
static u32 BuildBoxMonRibbonList(s32);
|
||||
static u32 GetMonRibbonListLoopTaskFunc(s32);
|
||||
static void InsertMonListItem(struct Pokenav_RibbonsMonList *, struct PokenavMonListItem *);
|
||||
static u32 LoopedTask_OpenRibbonsMonList(s32);
|
||||
static bool32 GetRibbonsMonCurrentLoopedTaskActive(void);
|
||||
static u32 LoopedTask_RibbonsListMoveCursorUp(s32 state);
|
||||
static u32 LoopedTask_RibbonsListMoveCursorDown(s32 state);
|
||||
static u32 LoopedTask_RibbonsListMovePageUp(s32 state);
|
||||
static u32 LoopedTask_RibbonsListMovePageDown(s32 state);
|
||||
static u32 LoopedTask_RibbonsListReturnToMainMenu(s32 state);
|
||||
static u32 LoopedTask_RibbonsListOpenSummary(s32 state);
|
||||
static void sub_81D02B0(s32 windowId, s32 val1, s32 val2);
|
||||
static void AddRibbonsMonListWindow(struct PokenavSub10 *ptr);
|
||||
static void sub_81D0288(struct PokenavSub10 *ptr);
|
||||
static void InitMonRibbonPokenavListMenuTemplate(void);
|
||||
static void BufferRibbonMonInfoText(struct PokenavMonList *, u8 *);
|
||||
static u32 LoopedTask_RibbonsListMoveCursorUp(s32);
|
||||
static u32 LoopedTask_RibbonsListMoveCursorDown(s32);
|
||||
static u32 LoopedTask_RibbonsListMovePageUp(s32);
|
||||
static u32 LoopedTask_RibbonsListMovePageDown(s32);
|
||||
static u32 LoopedTask_RibbonsListReturnToMainMenu(s32);
|
||||
static u32 LoopedTask_RibbonsListOpenSummary(s32);
|
||||
static void DrawListIndexNumber(s32, s32, s32);
|
||||
static void AddRibbonsMonListWindow(struct Pokenav_RibbonsMonMenu *);
|
||||
static void UpdateIndexNumberDisplay(struct Pokenav_RibbonsMonMenu *);
|
||||
static void CreateRibbonMonsList(void);
|
||||
static void BufferRibbonMonInfoText(struct PokenavListItem *, u8 *);
|
||||
|
||||
static const LoopedTask sMonRibbonListLoopTaskFuncs[] =
|
||||
{
|
||||
@@ -125,54 +125,54 @@ static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}");
|
||||
|
||||
bool32 PokenavCallback_Init_MonRibbonList(void)
|
||||
{
|
||||
struct PokenavSub9 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST, sizeof(struct PokenavSub9));
|
||||
if (structPtr == NULL)
|
||||
struct Pokenav_RibbonsMonList *list = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST, sizeof(struct Pokenav_RibbonsMonList));
|
||||
if (list == NULL)
|
||||
return FALSE;
|
||||
|
||||
structPtr->monList = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavSub18));
|
||||
if (structPtr->monList == NULL)
|
||||
list->monList = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavMonList));
|
||||
if (list->monList == NULL)
|
||||
return FALSE;
|
||||
|
||||
structPtr->callback = HandleRibbonsMonListInput_WaitListInit;
|
||||
structPtr->loopedTaskId = CreateLoopedTask(GetMonRibbonListLoopTaskFunc, 1);
|
||||
structPtr->changeBgs = 0;
|
||||
list->callback = HandleRibbonsMonListInput_WaitListInit;
|
||||
list->loopedTaskId = CreateLoopedTask(GetMonRibbonListLoopTaskFunc, 1);
|
||||
list->changeBgs = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PokenavCallback_Init_RibbonsMonListFromSummary(void)
|
||||
{
|
||||
struct PokenavSub9 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST, sizeof(struct PokenavSub9));
|
||||
if (structPtr == NULL)
|
||||
struct Pokenav_RibbonsMonList *list = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST, sizeof(struct Pokenav_RibbonsMonList));
|
||||
if (list == NULL)
|
||||
return FALSE;
|
||||
|
||||
structPtr->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
structPtr->callback = HandleRibbonsMonListInput;
|
||||
structPtr->changeBgs = 1;
|
||||
list->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
list->callback = HandleRibbonsMonListInput;
|
||||
list->changeBgs = 1;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
u32 GetRibbonsMonListCallback(void)
|
||||
{
|
||||
struct PokenavSub9 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return structPtr->callback(structPtr);
|
||||
struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return list->callback(list);
|
||||
}
|
||||
|
||||
void FreeRibbonsMonList1(void)
|
||||
void FreeRibbonsMonList(void)
|
||||
{
|
||||
struct PokenavSub9 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
if (!structPtr->saveMonList)
|
||||
struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
if (!list->saveMonList)
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
}
|
||||
|
||||
static u32 HandleRibbonsMonListInput_WaitListInit(struct PokenavSub9 *structPtr)
|
||||
static u32 HandleRibbonsMonListInput_WaitListInit(struct Pokenav_RibbonsMonList *list)
|
||||
{
|
||||
if (!IsLoopedTaskActive(structPtr->loopedTaskId))
|
||||
structPtr->callback = HandleRibbonsMonListInput;
|
||||
if (!IsLoopedTaskActive(list->loopedTaskId))
|
||||
list->callback = HandleRibbonsMonListInput;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 HandleRibbonsMonListInput(struct PokenavSub9 *structPtr)
|
||||
static u32 HandleRibbonsMonListInput(struct Pokenav_RibbonsMonList *list)
|
||||
{
|
||||
if (JOY_REPEAT(DPAD_UP))
|
||||
return RIBBONS_MON_LIST_FUNC_MOVE_UP;
|
||||
@@ -184,60 +184,60 @@ static u32 HandleRibbonsMonListInput(struct PokenavSub9 *structPtr)
|
||||
return RIBBONS_MON_LIST_FUNC_PAGE_DOWN;
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
structPtr->saveMonList = 0;
|
||||
structPtr->callback = RibbonsMonMenu_ReturnToMainMenu;
|
||||
list->saveMonList = 0;
|
||||
list->callback = RibbonsMonMenu_ReturnToMainMenu;
|
||||
return RIBBONS_MON_LIST_FUNC_EXIT;
|
||||
}
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
structPtr->monList->currIndex = GetSelectedPokenavListIndex();
|
||||
structPtr->saveMonList = 1;
|
||||
structPtr->callback = RibbonsMonMenu_ToSummaryScreen;
|
||||
list->monList->currIndex = PokenavList_GetSelectedIndex();
|
||||
list->saveMonList = 1;
|
||||
list->callback = RibbonsMonMenu_ToSummaryScreen;
|
||||
return RIBBONS_MON_LIST_FUNC_OPEN_RIBBONS_SUMMARY;
|
||||
}
|
||||
return RIBBONS_MON_LIST_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 RibbonsMonMenu_ReturnToMainMenu(struct PokenavSub9 *structPtr)
|
||||
static u32 RibbonsMonMenu_ReturnToMainMenu(struct Pokenav_RibbonsMonList *list)
|
||||
{
|
||||
return POKENAV_MAIN_MENU_CURSOR_ON_RIBBONS;
|
||||
}
|
||||
|
||||
static u32 RibbonsMonMenu_ToSummaryScreen(struct PokenavSub9 *structPtr)
|
||||
static u32 RibbonsMonMenu_ToSummaryScreen(struct Pokenav_RibbonsMonList *list)
|
||||
{
|
||||
return POKENAV_RIBBONS_SUMMARY_SCREEN;
|
||||
}
|
||||
|
||||
static u32 UpdateMonListBgs(void)
|
||||
{
|
||||
struct PokenavSub9 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return structPtr->changeBgs;
|
||||
struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return list->changeBgs;
|
||||
}
|
||||
|
||||
static struct PokenavMonList *GetMonRibbonMonListData(void)
|
||||
static struct PokenavMonListItem *GetMonRibbonMonListData(void)
|
||||
{
|
||||
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return ptr->monList->monData;
|
||||
struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return list->monList->monData;
|
||||
}
|
||||
|
||||
static s32 GetRibbonsMonListCount(void)
|
||||
{
|
||||
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return ptr->monList->listCount;
|
||||
struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return list->monList->listCount;
|
||||
}
|
||||
|
||||
//unused
|
||||
static s32 GetMonRibbonSelectedMonData(void)
|
||||
{
|
||||
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
s32 idx = GetSelectedPokenavListIndex();
|
||||
return ptr->monList->monData[idx].data;
|
||||
struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
s32 idx = PokenavList_GetSelectedIndex();
|
||||
return list->monList->monData[idx].data;
|
||||
}
|
||||
|
||||
static s32 GetRibbonListMenuCurrIndex(void)
|
||||
{
|
||||
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return ptr->monList->currIndex;
|
||||
struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
return list->monList->currIndex;
|
||||
}
|
||||
|
||||
static u32 GetMonRibbonListLoopTaskFunc(s32 state)
|
||||
@@ -248,11 +248,11 @@ static u32 GetMonRibbonListLoopTaskFunc(s32 state)
|
||||
static u32 BuildPartyMonRibbonList(s32 state)
|
||||
{
|
||||
s32 i;
|
||||
struct PokenavMonList item;
|
||||
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
struct PokenavMonListItem item;
|
||||
struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
|
||||
ptr->monList->listCount = 0;
|
||||
ptr->monList->currIndex = 0;
|
||||
list->monList->listCount = 0;
|
||||
list->monList->currIndex = 0;
|
||||
item.boxId = TOTAL_BOXES_COUNT;
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
@@ -266,7 +266,7 @@ static u32 BuildPartyMonRibbonList(s32 state)
|
||||
{
|
||||
item.monId = i;
|
||||
item.data = ribbonCount;
|
||||
sub_81CFCEC(ptr, &item);
|
||||
InsertMonListItem(list, &item);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -276,19 +276,19 @@ static u32 BuildPartyMonRibbonList(s32 state)
|
||||
|
||||
static u32 InitBoxMonRibbonList(s32 state)
|
||||
{
|
||||
struct PokenavSub9 *ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
ptr->monId = 0;
|
||||
ptr->boxId = 0;
|
||||
struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
list->monId = 0;
|
||||
list->boxId = 0;
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
|
||||
static u32 BuildBoxMonRibbonList(s32 state)
|
||||
{
|
||||
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
s32 boxId = ptr->boxId;
|
||||
s32 monId = ptr->monId;
|
||||
struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
|
||||
s32 boxId = list->boxId;
|
||||
s32 monId = list->monId;
|
||||
s32 boxCount = 0;
|
||||
struct PokenavMonList item;
|
||||
struct PokenavMonListItem item;
|
||||
|
||||
while (boxId < TOTAL_BOXES_COUNT)
|
||||
{
|
||||
@@ -302,15 +302,15 @@ static u32 BuildBoxMonRibbonList(s32 state)
|
||||
item.boxId = boxId;
|
||||
item.monId = monId;
|
||||
item.data = ribbonCount;
|
||||
sub_81CFCEC(ptr, &item);
|
||||
InsertMonListItem(list, &item);
|
||||
}
|
||||
}
|
||||
boxCount++;
|
||||
monId++;
|
||||
if (boxCount > TOTAL_BOXES_COUNT)
|
||||
{
|
||||
ptr->boxId = boxId;
|
||||
ptr->monId = monId;
|
||||
list->boxId = boxId;
|
||||
list->monId = monId;
|
||||
return LT_CONTINUE;
|
||||
}
|
||||
}
|
||||
@@ -318,28 +318,28 @@ static u32 BuildBoxMonRibbonList(s32 state)
|
||||
boxId++;
|
||||
}
|
||||
|
||||
ptr->changeBgs = 1;
|
||||
list->changeBgs = 1;
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item)
|
||||
static void InsertMonListItem(struct Pokenav_RibbonsMonList *list, struct PokenavMonListItem *item)
|
||||
{
|
||||
u32 left = 0;
|
||||
u32 right = structPtr->monList->listCount;
|
||||
u32 right = list->monList->listCount;
|
||||
u32 insertionIdx = left + (right - left) / 2;
|
||||
|
||||
while (right != insertionIdx)
|
||||
{
|
||||
if (item->data > structPtr->monList->monData[insertionIdx].data)
|
||||
if (item->data > list->monList->monData[insertionIdx].data)
|
||||
right = insertionIdx;
|
||||
else
|
||||
left = insertionIdx + 1;
|
||||
insertionIdx = left + (right - left) / 2;
|
||||
}
|
||||
for (right = structPtr->monList->listCount; right > insertionIdx; right--)
|
||||
structPtr->monList->monData[right] = structPtr->monList->monData[right - 1];
|
||||
structPtr->monList->monData[insertionIdx] = *item;
|
||||
structPtr->monList->listCount++;
|
||||
for (right = list->monList->listCount; right > insertionIdx; right--)
|
||||
list->monList->monData[right] = list->monList->monData[right - 1];
|
||||
list->monList->monData[insertionIdx] = *item;
|
||||
list->monList->listCount++;
|
||||
}
|
||||
|
||||
// Unused
|
||||
@@ -374,62 +374,62 @@ static bool32 PlayerHasRibbonsMon(void)
|
||||
|
||||
bool32 OpenRibbonsMonList(void)
|
||||
{
|
||||
struct PokenavSub10 *ptr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU, sizeof(struct PokenavSub10));
|
||||
if (ptr == NULL)
|
||||
struct Pokenav_RibbonsMonMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU, sizeof(struct Pokenav_RibbonsMonMenu));
|
||||
if (menu == NULL)
|
||||
return FALSE;
|
||||
ptr->ltid = CreateLoopedTask(LoopedTask_OpenRibbonsMonList, 1);
|
||||
ptr->callback = GetRibbonsMonCurrentLoopedTaskActive;
|
||||
ptr->fromSummary = FALSE;
|
||||
menu->loopedTaskId = CreateLoopedTask(LoopedTask_OpenRibbonsMonList, 1);
|
||||
menu->callback = GetRibbonsMonCurrentLoopedTaskActive;
|
||||
menu->fromSummary = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 OpenRibbonsMonListFromRibbonsSummary(void)
|
||||
{
|
||||
struct PokenavSub10 *monMenu = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU, sizeof(struct PokenavSub10));
|
||||
if (monMenu == NULL)
|
||||
struct Pokenav_RibbonsMonMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU, sizeof(struct Pokenav_RibbonsMonMenu));
|
||||
if (menu == NULL)
|
||||
return FALSE;
|
||||
monMenu->ltid = CreateLoopedTask(LoopedTask_OpenRibbonsMonList, 1);
|
||||
monMenu->callback = GetRibbonsMonCurrentLoopedTaskActive;
|
||||
monMenu->fromSummary = TRUE;
|
||||
menu->loopedTaskId = CreateLoopedTask(LoopedTask_OpenRibbonsMonList, 1);
|
||||
menu->callback = GetRibbonsMonCurrentLoopedTaskActive;
|
||||
menu->fromSummary = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CreateRibbonsMonListLoopedTask(s32 idx)
|
||||
{
|
||||
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
monMenu->ltid = CreateLoopedTask(sRibbonsMonMenuLoopTaskFuncs[idx], 1);
|
||||
monMenu->callback = GetRibbonsMonCurrentLoopedTaskActive;
|
||||
struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
menu->loopedTaskId = CreateLoopedTask(sRibbonsMonMenuLoopTaskFuncs[idx], 1);
|
||||
menu->callback = GetRibbonsMonCurrentLoopedTaskActive;
|
||||
}
|
||||
|
||||
bool32 IsRibbonsMonListLoopedTaskActive(void)
|
||||
{
|
||||
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
return monMenu->callback();
|
||||
struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
return menu->callback();
|
||||
}
|
||||
|
||||
bool32 GetRibbonsMonCurrentLoopedTaskActive(void)
|
||||
{
|
||||
struct PokenavSub10 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
return IsLoopedTaskActive(ptr->ltid);
|
||||
struct Pokenav_RibbonsMonMenu * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
return IsLoopedTaskActive(menu->loopedTaskId);
|
||||
}
|
||||
|
||||
void FreeRibbonsMonList2(void)
|
||||
void FreeRibbonsMonMenu(void)
|
||||
{
|
||||
struct PokenavSub10 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
sub_81C8234();
|
||||
RemoveWindow(ptr->winid);
|
||||
struct Pokenav_RibbonsMonMenu * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
DestroyPokenavList();
|
||||
RemoveWindow(menu->winid);
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
}
|
||||
|
||||
static u32 LoopedTask_OpenRibbonsMonList(s32 state)
|
||||
{
|
||||
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
InitBgTemplates(sMonRibbonListBgTemplates, ARRAY_COUNT(sMonRibbonListBgTemplates));
|
||||
DecompressAndCopyTileDataToVram(1, sMonRibbonListFrameTiles, 0, 0, 0);
|
||||
SetBgTilemapBuffer(1, monMenu->buff);
|
||||
SetBgTilemapBuffer(1, menu->buff);
|
||||
CopyToBgTilemapBuffer(1, sMonRibbonListFrameTilemap, 0, 0);
|
||||
CopyPaletteIntoBufferUnfaded(sMonRibbonListFramePal, 0x10, 0x20);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
@@ -447,12 +447,12 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state)
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return LT_PAUSE;
|
||||
CopyPaletteIntoBufferUnfaded(sMonRibbonListUi_Pal, 0x20, 0x20);
|
||||
InitMonRibbonPokenavListMenuTemplate();
|
||||
CreateRibbonMonsList();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (sub_81C8224())
|
||||
if (IsCreatePokenavListTaskActive())
|
||||
return LT_PAUSE;
|
||||
AddRibbonsMonListWindow(monMenu);
|
||||
AddRibbonsMonListWindow(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 4:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
@@ -460,8 +460,8 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state)
|
||||
ShowBg(2);
|
||||
HideBg(3);
|
||||
PrintHelpBarText(HELPBAR_RIBBONS_MON_LIST);
|
||||
PokenavFadeScreen(1);
|
||||
if (!monMenu->fromSummary)
|
||||
PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
|
||||
if (!menu->fromSummary)
|
||||
{
|
||||
LoadLeftHeaderGfxForIndex(POKENAV_GFX_RIBBONS_MENU);
|
||||
ShowLeftHeaderGfx(POKENAV_GFX_RIBBONS_MENU, 1, 0);
|
||||
@@ -479,11 +479,11 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state)
|
||||
|
||||
static u32 LoopedTask_RibbonsListMoveCursorUp(s32 state)
|
||||
{
|
||||
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
switch (MatchCall_MoveCursorUp())
|
||||
switch (PokenavList_MoveCursorUp())
|
||||
{
|
||||
case 0:
|
||||
return LT_FINISH;
|
||||
@@ -496,11 +496,11 @@ static u32 LoopedTask_RibbonsListMoveCursorUp(s32 state)
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsMonListLoopedTaskActive())
|
||||
if (PokenavList_IsMoveWindowTaskActive())
|
||||
return LT_PAUSE;
|
||||
// fallthrough
|
||||
case 2:
|
||||
sub_81D0288(monMenu);
|
||||
UpdateIndexNumberDisplay(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
@@ -512,11 +512,11 @@ static u32 LoopedTask_RibbonsListMoveCursorUp(s32 state)
|
||||
|
||||
static u32 LoopedTask_RibbonsListMoveCursorDown(s32 state)
|
||||
{
|
||||
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
switch (MatchCall_MoveCursorDown())
|
||||
switch (PokenavList_MoveCursorDown())
|
||||
{
|
||||
case 0:
|
||||
return LT_FINISH;
|
||||
@@ -529,11 +529,11 @@ static u32 LoopedTask_RibbonsListMoveCursorDown(s32 state)
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsMonListLoopedTaskActive())
|
||||
if (PokenavList_IsMoveWindowTaskActive())
|
||||
return LT_PAUSE;
|
||||
// fallthrough
|
||||
case 2:
|
||||
sub_81D0288(monMenu);
|
||||
UpdateIndexNumberDisplay(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
@@ -545,11 +545,11 @@ static u32 LoopedTask_RibbonsListMoveCursorDown(s32 state)
|
||||
|
||||
static u32 LoopedTask_RibbonsListMovePageUp(s32 state)
|
||||
{
|
||||
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
switch (MatchCall_PageUp())
|
||||
switch (PokenavList_PageUp())
|
||||
{
|
||||
case 0:
|
||||
return LT_FINISH;
|
||||
@@ -562,11 +562,11 @@ static u32 LoopedTask_RibbonsListMovePageUp(s32 state)
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsMonListLoopedTaskActive())
|
||||
if (PokenavList_IsMoveWindowTaskActive())
|
||||
return LT_PAUSE;
|
||||
// fallthrough
|
||||
case 2:
|
||||
sub_81D0288(monMenu);
|
||||
UpdateIndexNumberDisplay(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
@@ -578,11 +578,11 @@ static u32 LoopedTask_RibbonsListMovePageUp(s32 state)
|
||||
|
||||
static u32 LoopedTask_RibbonsListMovePageDown(s32 state)
|
||||
{
|
||||
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
switch (MatchCall_PageDown())
|
||||
switch (PokenavList_PageDown())
|
||||
{
|
||||
case 0:
|
||||
return LT_FINISH;
|
||||
@@ -595,11 +595,11 @@ static u32 LoopedTask_RibbonsListMovePageDown(s32 state)
|
||||
}
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsMonListLoopedTaskActive())
|
||||
if (PokenavList_IsMoveWindowTaskActive())
|
||||
return LT_PAUSE;
|
||||
// fallthrough
|
||||
case 2:
|
||||
sub_81D0288(monMenu);
|
||||
UpdateIndexNumberDisplay(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 3:
|
||||
if (IsDma3ManagerBusyWithBgCopy())
|
||||
@@ -615,7 +615,7 @@ static u32 LoopedTask_RibbonsListReturnToMainMenu(s32 state)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
PokenavFadeScreen(0);
|
||||
PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
|
||||
SlideMenuHeaderDown();
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
@@ -635,7 +635,7 @@ static u32 LoopedTask_RibbonsListOpenSummary(s32 state)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
PokenavFadeScreen(0);
|
||||
PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsPaletteFadeActive())
|
||||
@@ -645,64 +645,64 @@ static u32 LoopedTask_RibbonsListOpenSummary(s32 state)
|
||||
return LT_FINISH;
|
||||
}
|
||||
|
||||
static void AddRibbonsMonListWindow(struct PokenavSub10 *monMenu)
|
||||
static void AddRibbonsMonListWindow(struct Pokenav_RibbonsMonMenu *menu)
|
||||
{
|
||||
s32 r2;
|
||||
monMenu->winid = AddWindow(&sRibbonsMonListWindowTemplate);
|
||||
PutWindowTilemap(monMenu->winid);
|
||||
r2 = GetRibbonsMonListCount();
|
||||
sub_81D02B0(monMenu->winid, 0, r2);
|
||||
CopyWindowToVram(monMenu->winid, COPYWIN_MAP);
|
||||
sub_81D0288(monMenu);
|
||||
s32 listCount;
|
||||
menu->winid = AddWindow(&sRibbonsMonListWindowTemplate);
|
||||
PutWindowTilemap(menu->winid);
|
||||
listCount = GetRibbonsMonListCount();
|
||||
DrawListIndexNumber(menu->winid, 0, listCount);
|
||||
CopyWindowToVram(menu->winid, COPYWIN_MAP);
|
||||
UpdateIndexNumberDisplay(menu);
|
||||
}
|
||||
|
||||
static void sub_81D0288(struct PokenavSub10 *monMenu)
|
||||
static void UpdateIndexNumberDisplay(struct Pokenav_RibbonsMonMenu *menu)
|
||||
{
|
||||
s32 r4 = GetSelectedPokenavListIndex();
|
||||
s32 r2 = GetRibbonsMonListCount();
|
||||
sub_81D02B0(monMenu->winid, r4 + 1, r2);
|
||||
CopyWindowToVram(monMenu->winid, COPYWIN_GFX);
|
||||
s32 listIndex = PokenavList_GetSelectedIndex();
|
||||
s32 listCount = GetRibbonsMonListCount();
|
||||
DrawListIndexNumber(menu->winid, listIndex + 1, listCount);
|
||||
CopyWindowToVram(menu->winid, COPYWIN_GFX);
|
||||
}
|
||||
|
||||
static void sub_81D02B0(s32 windowId, s32 val1, s32 val2)
|
||||
static void DrawListIndexNumber(s32 windowId, s32 index, s32 max)
|
||||
{
|
||||
u8 strbuf[16];
|
||||
u32 x;
|
||||
|
||||
u8 * ptr = strbuf;
|
||||
ptr = ConvertIntToDecimalStringN(ptr, val1, STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
ptr = ConvertIntToDecimalStringN(ptr, index, STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
*ptr++ = CHAR_SLASH;
|
||||
ConvertIntToDecimalStringN(ptr, val2, STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
ConvertIntToDecimalStringN(ptr, max, STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
x = GetStringCenterAlignXOffset(FONT_NORMAL, strbuf, 56);
|
||||
AddTextPrinterParameterized(windowId, FONT_NORMAL, strbuf, x, 1, TEXT_SKIP_DRAW, NULL);
|
||||
}
|
||||
|
||||
static void InitMonRibbonPokenavListMenuTemplate(void)
|
||||
static void CreateRibbonMonsList(void)
|
||||
{
|
||||
struct PokenavListTemplate template;
|
||||
template.list.monList = GetMonRibbonMonListData();
|
||||
template.list = (struct PokenavListItem *)GetMonRibbonMonListData();
|
||||
template.count = GetRibbonsMonListCount();
|
||||
template.unk8 = 4;
|
||||
template.unk6 = GetRibbonListMenuCurrIndex();
|
||||
template.itemSize = sizeof(struct PokenavListItem);
|
||||
template.startIndex = GetRibbonListMenuCurrIndex();
|
||||
template.item_X = 13;
|
||||
template.windowWidth = 17;
|
||||
template.listTop = 1;
|
||||
template.maxShowed = 8;
|
||||
template.fillValue = 2;
|
||||
template.fontId = FONT_NORMAL;
|
||||
template.listFunc.printMonFunc = BufferRibbonMonInfoText;
|
||||
template.unk14 = NULL;
|
||||
sub_81C81D4(&sMonRibbonListBgTemplates[1], &template, 0);
|
||||
template.bufferItemFunc = BufferRibbonMonInfoText;
|
||||
template.iconDrawFunc = NULL;
|
||||
CreatePokenavList(&sMonRibbonListBgTemplates[1], &template, 0);
|
||||
}
|
||||
|
||||
// Buffers the "Nickname gender/level" text for the ribbon mon list
|
||||
static void BufferRibbonMonInfoText(struct PokenavMonList * item0, u8 * dest)
|
||||
static void BufferRibbonMonInfoText(struct PokenavListItem * listItem, u8 * dest)
|
||||
{
|
||||
u8 gender;
|
||||
u8 level;
|
||||
u8 * s;
|
||||
const u8 * genderStr;
|
||||
struct PokenavMonList * item = item0;
|
||||
struct PokenavMonListItem * item = (struct PokenavMonListItem *)listItem;
|
||||
|
||||
// Mon is in party
|
||||
if (item->boxId == TOTAL_BOXES_COUNT)
|
||||
@@ -39,10 +39,10 @@ enum
|
||||
#define MON_SPRITE_X_OFF -32
|
||||
#define MON_SPRITE_Y 104
|
||||
|
||||
struct PokenavSub13
|
||||
struct Pokenav_RibbonsSummaryList
|
||||
{
|
||||
u8 unused1[8];
|
||||
struct PokenavSub18 *monList;
|
||||
struct PokenavMonList *monList;
|
||||
u16 selectedPos;
|
||||
u16 normalRibbonLastRowStart;
|
||||
u16 numNormalRibbons;
|
||||
@@ -50,10 +50,10 @@ struct PokenavSub13
|
||||
u32 ribbonIds[FIRST_GIFT_RIBBON];
|
||||
u32 giftRibbonIds[NUM_GIFT_RIBBONS];
|
||||
u32 unused2;
|
||||
u32 (*callback)(struct PokenavSub13 *);
|
||||
u32 (*callback)(struct Pokenav_RibbonsSummaryList *);
|
||||
};
|
||||
|
||||
struct PokenavSub14
|
||||
struct Pokenav_RibbonsSummaryMenu
|
||||
{
|
||||
u32 (*callback)(void);
|
||||
u32 loopedTaskId;
|
||||
@@ -71,31 +71,31 @@ struct PokenavSub14
|
||||
static u32 sRibbonDraw_Total;
|
||||
static u32 sRibbonDraw_Current;
|
||||
|
||||
static void PrintCurrentMonRibbonCount(struct PokenavSub14 *);
|
||||
static void PrintRibbbonsSummaryMonInfo(struct PokenavSub14 *);
|
||||
static void PrintRibbonsMonListIndex(struct PokenavSub14 *);
|
||||
static void ZoomOutSelectedRibbon(struct PokenavSub14 *);
|
||||
static void UpdateAndZoomInSelectedRibbon(struct PokenavSub14 *);
|
||||
static void PrintRibbonNameAndDescription(struct PokenavSub14 *);
|
||||
static void ResetSpritesAndDrawMonFrontPic(struct PokenavSub14 *);
|
||||
static void AddRibbonListIndexWindow(struct PokenavSub14 *);
|
||||
static void DestroyRibbonsMonFrontPic(struct PokenavSub14 *);
|
||||
static void SlideMonSpriteOff(struct PokenavSub14 *);
|
||||
static void SlideMonSpriteOn(struct PokenavSub14 *);
|
||||
static void AddRibbonCountWindow(struct PokenavSub14 *);
|
||||
static void CreateBigRibbonSprite(struct PokenavSub14 *);
|
||||
static void AddRibbonSummaryMonNameWindow(struct PokenavSub14 *);
|
||||
static void DrawAllRibbonsSmall(struct PokenavSub14 *);
|
||||
static bool32 IsRibbonAnimating(struct PokenavSub14 *);
|
||||
static bool32 IsMonSpriteAnimating(struct PokenavSub14 *);
|
||||
static void GetMonRibbons(struct PokenavSub13 *);
|
||||
static u32 HandleExpandedRibbonInput(struct PokenavSub13 *);
|
||||
static u32 RibbonsSummaryHandleInput(struct PokenavSub13 *);
|
||||
static u32 ReturnToRibbonsListFromSummary(struct PokenavSub13 *);
|
||||
static bool32 TrySelectRibbonUp(struct PokenavSub13 *);
|
||||
static bool32 TrySelectRibbonRight(struct PokenavSub13 *);
|
||||
static bool32 TrySelectRibbonLeft(struct PokenavSub13 *);
|
||||
static bool32 TrySelectRibbonDown(struct PokenavSub13 *);
|
||||
static void PrintCurrentMonRibbonCount(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void PrintRibbbonsSummaryMonInfo(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void PrintRibbonsMonListIndex(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void ZoomOutSelectedRibbon(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void UpdateAndZoomInSelectedRibbon(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void PrintRibbonNameAndDescription(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void ResetSpritesAndDrawMonFrontPic(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void AddRibbonListIndexWindow(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void DestroyRibbonsMonFrontPic(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void SlideMonSpriteOff(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void SlideMonSpriteOn(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void AddRibbonCountWindow(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void CreateBigRibbonSprite(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void AddRibbonSummaryMonNameWindow(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void DrawAllRibbonsSmall(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static bool32 IsRibbonAnimating(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static bool32 IsMonSpriteAnimating(struct Pokenav_RibbonsSummaryMenu *);
|
||||
static void GetMonRibbons(struct Pokenav_RibbonsSummaryList *);
|
||||
static u32 HandleExpandedRibbonInput(struct Pokenav_RibbonsSummaryList *);
|
||||
static u32 RibbonsSummaryHandleInput(struct Pokenav_RibbonsSummaryList *);
|
||||
static u32 ReturnToRibbonsListFromSummary(struct Pokenav_RibbonsSummaryList *);
|
||||
static bool32 TrySelectRibbonUp(struct Pokenav_RibbonsSummaryList *);
|
||||
static bool32 TrySelectRibbonRight(struct Pokenav_RibbonsSummaryList *);
|
||||
static bool32 TrySelectRibbonLeft(struct Pokenav_RibbonsSummaryList *);
|
||||
static bool32 TrySelectRibbonDown(struct Pokenav_RibbonsSummaryList *);
|
||||
static bool32 GetCurrentLoopedTaskActive(void);
|
||||
static u32 GetRibbonsSummaryCurrentIndex(void);
|
||||
static u32 GetRibbonsSummaryMonListCount(void);
|
||||
@@ -186,16 +186,16 @@ static const LoopedTask sRibbonsSummaryMenuLoopTaskFuncs[] =
|
||||
|
||||
bool32 PokenavCallback_Init_RibbonsSummaryMenu(void)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST, sizeof(struct PokenavSub13));
|
||||
if (structPtr == NULL)
|
||||
struct Pokenav_RibbonsSummaryList *list = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST, sizeof(struct Pokenav_RibbonsSummaryList));
|
||||
if (list == NULL)
|
||||
return FALSE;
|
||||
|
||||
structPtr->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
if (structPtr->monList == NULL)
|
||||
list->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
|
||||
if (list->monList == NULL)
|
||||
return FALSE;
|
||||
|
||||
GetMonRibbons(structPtr);
|
||||
structPtr->callback = RibbonsSummaryHandleInput;
|
||||
GetMonRibbons(list);
|
||||
list->callback = RibbonsSummaryHandleInput;
|
||||
gKeyRepeatContinueDelay = 3;
|
||||
gKeyRepeatStartDelay = 10;
|
||||
return TRUE;
|
||||
@@ -203,8 +203,8 @@ bool32 PokenavCallback_Init_RibbonsSummaryMenu(void)
|
||||
|
||||
u32 GetRibbonsSummaryMenuCallback(void)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
return structPtr->callback(structPtr);
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
return list->callback(list);
|
||||
}
|
||||
|
||||
void FreeRibbonsSummaryScreen1(void)
|
||||
@@ -213,150 +213,150 @@ void FreeRibbonsSummaryScreen1(void)
|
||||
}
|
||||
|
||||
// Handles input when a specific ribbon is not currently selected
|
||||
static u32 RibbonsSummaryHandleInput(struct PokenavSub13 *structPtr)
|
||||
static u32 RibbonsSummaryHandleInput(struct Pokenav_RibbonsSummaryList *list)
|
||||
{
|
||||
// Handle Up/Down movement to select a new Pokémon to show ribbons for
|
||||
if (JOY_REPEAT(DPAD_UP) && structPtr->monList->currIndex != 0)
|
||||
if (JOY_REPEAT(DPAD_UP) && list->monList->currIndex != 0)
|
||||
{
|
||||
structPtr->monList->currIndex--;
|
||||
structPtr->selectedPos = 0;
|
||||
GetMonRibbons(structPtr);
|
||||
list->monList->currIndex--;
|
||||
list->selectedPos = 0;
|
||||
GetMonRibbons(list);
|
||||
return RIBBONS_SUMMARY_FUNC_SWITCH_MONS;
|
||||
}
|
||||
if (JOY_REPEAT(DPAD_DOWN) && structPtr->monList->currIndex < structPtr->monList->listCount - 1)
|
||||
if (JOY_REPEAT(DPAD_DOWN) && list->monList->currIndex < list->monList->listCount - 1)
|
||||
{
|
||||
structPtr->monList->currIndex++;
|
||||
structPtr->selectedPos = 0;
|
||||
GetMonRibbons(structPtr);
|
||||
list->monList->currIndex++;
|
||||
list->selectedPos = 0;
|
||||
GetMonRibbons(list);
|
||||
return RIBBONS_SUMMARY_FUNC_SWITCH_MONS;
|
||||
}
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
// Enter ribbon selection
|
||||
structPtr->callback = HandleExpandedRibbonInput;
|
||||
list->callback = HandleExpandedRibbonInput;
|
||||
return RIBBONS_SUMMARY_FUNC_SELECT_RIBBON;
|
||||
}
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
// Exit ribbon summary menu
|
||||
structPtr->callback = ReturnToRibbonsListFromSummary;
|
||||
list->callback = ReturnToRibbonsListFromSummary;
|
||||
return RIBBONS_SUMMARY_FUNC_EXIT;
|
||||
}
|
||||
return RIBBONS_SUMMARY_FUNC_NONE;
|
||||
}
|
||||
|
||||
// Handles input when a ribbon is selected
|
||||
static u32 HandleExpandedRibbonInput(struct PokenavSub13 *structPtr)
|
||||
static u32 HandleExpandedRibbonInput(struct Pokenav_RibbonsSummaryList *list)
|
||||
{
|
||||
// Handle movement while a ribbon is selected
|
||||
if (JOY_REPEAT(DPAD_UP) && TrySelectRibbonUp(structPtr))
|
||||
if (JOY_REPEAT(DPAD_UP) && TrySelectRibbonUp(list))
|
||||
return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE;
|
||||
if (JOY_REPEAT(DPAD_DOWN) && TrySelectRibbonDown(structPtr))
|
||||
if (JOY_REPEAT(DPAD_DOWN) && TrySelectRibbonDown(list))
|
||||
return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE;
|
||||
if (JOY_REPEAT(DPAD_LEFT) && TrySelectRibbonLeft(structPtr))
|
||||
if (JOY_REPEAT(DPAD_LEFT) && TrySelectRibbonLeft(list))
|
||||
return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE;
|
||||
if (JOY_REPEAT(DPAD_RIGHT) && TrySelectRibbonRight(structPtr))
|
||||
if (JOY_REPEAT(DPAD_RIGHT) && TrySelectRibbonRight(list))
|
||||
return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE;
|
||||
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
// Exit ribbon selection
|
||||
structPtr->callback = RibbonsSummaryHandleInput;
|
||||
list->callback = RibbonsSummaryHandleInput;
|
||||
return RIBBONS_SUMMARY_FUNC_EXPANDED_CANCEL;
|
||||
}
|
||||
return RIBBONS_SUMMARY_FUNC_NONE;
|
||||
}
|
||||
|
||||
static u32 ReturnToRibbonsListFromSummary(struct PokenavSub13 *structPtr)
|
||||
static u32 ReturnToRibbonsListFromSummary(struct Pokenav_RibbonsSummaryList *list)
|
||||
{
|
||||
return POKENAV_RIBBONS_RETURN_TO_MON_LIST;
|
||||
}
|
||||
|
||||
static bool32 TrySelectRibbonUp(struct PokenavSub13 *structPtr)
|
||||
static bool32 TrySelectRibbonUp(struct Pokenav_RibbonsSummaryList *list)
|
||||
{
|
||||
if (structPtr->selectedPos < FIRST_GIFT_RIBBON)
|
||||
if (list->selectedPos < FIRST_GIFT_RIBBON)
|
||||
{
|
||||
// In normal ribbons, try to move up a row
|
||||
if (structPtr->selectedPos < RIBBONS_PER_ROW)
|
||||
if (list->selectedPos < RIBBONS_PER_ROW)
|
||||
return FALSE;
|
||||
|
||||
structPtr->selectedPos -= RIBBONS_PER_ROW;
|
||||
list->selectedPos -= RIBBONS_PER_ROW;
|
||||
return TRUE;
|
||||
}
|
||||
if (structPtr->numNormalRibbons != 0)
|
||||
if (list->numNormalRibbons != 0)
|
||||
{
|
||||
// In gift ribbons, try to move up into normal ribbons
|
||||
// If there's > 1 row of gift ribbons (not normally possible)
|
||||
// it's impossible to move up between them
|
||||
u32 ribbonPos = structPtr->selectedPos - GIFT_RIBBON_START_POS;
|
||||
structPtr->selectedPos = ribbonPos + structPtr->normalRibbonLastRowStart;
|
||||
if (structPtr->selectedPos >= structPtr->numNormalRibbons)
|
||||
structPtr->selectedPos = structPtr->numNormalRibbons - 1;
|
||||
u32 ribbonPos = list->selectedPos - GIFT_RIBBON_START_POS;
|
||||
list->selectedPos = ribbonPos + list->normalRibbonLastRowStart;
|
||||
if (list->selectedPos >= list->numNormalRibbons)
|
||||
list->selectedPos = list->numNormalRibbons - 1;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 TrySelectRibbonDown(struct PokenavSub13 *structPtr)
|
||||
static bool32 TrySelectRibbonDown(struct Pokenav_RibbonsSummaryList *list)
|
||||
{
|
||||
if (structPtr->selectedPos >= FIRST_GIFT_RIBBON)
|
||||
if (list->selectedPos >= FIRST_GIFT_RIBBON)
|
||||
return FALSE;
|
||||
if (structPtr->selectedPos < structPtr->normalRibbonLastRowStart)
|
||||
if (list->selectedPos < list->normalRibbonLastRowStart)
|
||||
{
|
||||
// Not in last row of normal ribbons, advance to next row
|
||||
structPtr->selectedPos += RIBBONS_PER_ROW;
|
||||
if (structPtr->selectedPos >= structPtr->numNormalRibbons)
|
||||
structPtr->selectedPos = structPtr->numNormalRibbons - 1;
|
||||
list->selectedPos += RIBBONS_PER_ROW;
|
||||
if (list->selectedPos >= list->numNormalRibbons)
|
||||
list->selectedPos = list->numNormalRibbons - 1;
|
||||
return TRUE;
|
||||
}
|
||||
if (structPtr->numGiftRibbons != 0)
|
||||
if (list->numGiftRibbons != 0)
|
||||
{
|
||||
// In/beyond last of row of normal ribbons and gift ribbons present, move down to gift ribbon row
|
||||
int ribbonPos = structPtr->selectedPos - structPtr->normalRibbonLastRowStart;
|
||||
if (ribbonPos >= structPtr->numGiftRibbons)
|
||||
ribbonPos = structPtr->numGiftRibbons - 1;
|
||||
int ribbonPos = list->selectedPos - list->normalRibbonLastRowStart;
|
||||
if (ribbonPos >= list->numGiftRibbons)
|
||||
ribbonPos = list->numGiftRibbons - 1;
|
||||
|
||||
structPtr->selectedPos = ribbonPos + GIFT_RIBBON_START_POS;
|
||||
list->selectedPos = ribbonPos + GIFT_RIBBON_START_POS;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 TrySelectRibbonLeft(struct PokenavSub13 *structPtr)
|
||||
static bool32 TrySelectRibbonLeft(struct Pokenav_RibbonsSummaryList *list)
|
||||
{
|
||||
u16 column = structPtr->selectedPos % RIBBONS_PER_ROW;
|
||||
u16 column = list->selectedPos % RIBBONS_PER_ROW;
|
||||
if (column != 0)
|
||||
{
|
||||
structPtr->selectedPos--;
|
||||
list->selectedPos--;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 TrySelectRibbonRight(struct PokenavSub13 *structPtr)
|
||||
static bool32 TrySelectRibbonRight(struct Pokenav_RibbonsSummaryList *list)
|
||||
{
|
||||
int column = structPtr->selectedPos % RIBBONS_PER_ROW;
|
||||
int column = list->selectedPos % RIBBONS_PER_ROW;
|
||||
|
||||
if (column >= RIBBONS_PER_ROW - 1)
|
||||
return FALSE;
|
||||
|
||||
if (structPtr->selectedPos < GIFT_RIBBON_START_POS)
|
||||
if (list->selectedPos < GIFT_RIBBON_START_POS)
|
||||
{
|
||||
// Move right in normal ribbon row
|
||||
if (structPtr->selectedPos < structPtr->numNormalRibbons - 1)
|
||||
if (list->selectedPos < list->numNormalRibbons - 1)
|
||||
{
|
||||
structPtr->selectedPos++;
|
||||
list->selectedPos++;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Move right in gift ribbon row
|
||||
if (column < structPtr->numGiftRibbons - 1)
|
||||
if (column < list->numGiftRibbons - 1)
|
||||
{
|
||||
structPtr->selectedPos++;
|
||||
list->selectedPos++;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
@@ -365,21 +365,21 @@ static bool32 TrySelectRibbonRight(struct PokenavSub13 *structPtr)
|
||||
|
||||
static u32 GetRibbonsSummaryCurrentIndex(void)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
return structPtr->monList->currIndex;
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
return list->monList->currIndex;
|
||||
}
|
||||
|
||||
static u32 GetRibbonsSummaryMonListCount(void)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
return structPtr->monList->listCount;
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
return list->monList->listCount;
|
||||
}
|
||||
|
||||
static void GetMonNicknameLevelGender(u8 *nick, u8 *level, u8 *gender)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
struct PokenavSub18 *mons = structPtr->monList;
|
||||
struct PokenavMonList *monInfo = &mons->monData[mons->currIndex];
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
struct PokenavMonList *mons = list->monList;
|
||||
struct PokenavMonListItem *monInfo = &mons->monData[mons->currIndex];
|
||||
|
||||
if (monInfo->boxId == TOTAL_BOXES_COUNT)
|
||||
{
|
||||
@@ -402,9 +402,9 @@ static void GetMonNicknameLevelGender(u8 *nick, u8 *level, u8 *gender)
|
||||
|
||||
static void GetMonSpeciesPersonalityOtId(u16 *species, u32 *personality, u32 *otId)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
struct PokenavSub18 *mons = structPtr->monList;
|
||||
struct PokenavMonList *monInfo = &mons->monData[mons->currIndex];
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
struct PokenavMonList *mons = list->monList;
|
||||
struct PokenavMonListItem *monInfo = &mons->monData[mons->currIndex];
|
||||
|
||||
if (monInfo->boxId == TOTAL_BOXES_COUNT)
|
||||
{
|
||||
@@ -426,9 +426,9 @@ static void GetMonSpeciesPersonalityOtId(u16 *species, u32 *personality, u32 *ot
|
||||
|
||||
static u32 GetCurrMonRibbonCount(void)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
struct PokenavSub18 *mons = structPtr->monList;
|
||||
struct PokenavMonList *monInfo = &mons->monData[mons->currIndex];
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
struct PokenavMonList *mons = list->monList;
|
||||
struct PokenavMonListItem *monInfo = &mons->monData[mons->currIndex];
|
||||
|
||||
if (monInfo->boxId == TOTAL_BOXES_COUNT)
|
||||
return GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBON_COUNT);
|
||||
@@ -436,20 +436,20 @@ static u32 GetCurrMonRibbonCount(void)
|
||||
return GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBON_COUNT);
|
||||
}
|
||||
|
||||
static void GetMonRibbons(struct PokenavSub13 *structPtr)
|
||||
static void GetMonRibbons(struct Pokenav_RibbonsSummaryList *list)
|
||||
{
|
||||
u32 ribbonFlags;
|
||||
s32 i, j;
|
||||
struct PokenavSub18 *mons = structPtr->monList;
|
||||
struct PokenavMonList *monInfo = &mons->monData[mons->currIndex];
|
||||
struct PokenavMonList *mons = list->monList;
|
||||
struct PokenavMonListItem *monInfo = &mons->monData[mons->currIndex];
|
||||
|
||||
if (monInfo->boxId == TOTAL_BOXES_COUNT)
|
||||
ribbonFlags = GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBONS);
|
||||
else
|
||||
ribbonFlags = GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBONS);
|
||||
|
||||
structPtr->numNormalRibbons = 0;
|
||||
structPtr->numGiftRibbons = 0;
|
||||
list->numNormalRibbons = 0;
|
||||
list->numGiftRibbons = 0;
|
||||
for (i = 0; i < ARRAY_COUNT(sRibbonData); i++)
|
||||
{
|
||||
// For all non-contest ribbons, numRibbons will be 1 if they have it, 0 if they don't
|
||||
@@ -458,119 +458,119 @@ static void GetMonRibbons(struct PokenavSub13 *structPtr)
|
||||
if (!sRibbonData[i].isGiftRibbon)
|
||||
{
|
||||
for (j = 0; j < numRibbons; j++)
|
||||
structPtr->ribbonIds[structPtr->numNormalRibbons++] = sRibbonData[i].ribbonId + j;
|
||||
list->ribbonIds[list->numNormalRibbons++] = sRibbonData[i].ribbonId + j;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (j = 0; j < numRibbons; j++)
|
||||
structPtr->giftRibbonIds[structPtr->numGiftRibbons++] = sRibbonData[i].ribbonId + j;
|
||||
list->giftRibbonIds[list->numGiftRibbons++] = sRibbonData[i].ribbonId + j;
|
||||
}
|
||||
ribbonFlags >>= sRibbonData[i].numBits;
|
||||
}
|
||||
|
||||
if (structPtr->numNormalRibbons != 0)
|
||||
if (list->numNormalRibbons != 0)
|
||||
{
|
||||
structPtr->normalRibbonLastRowStart = ((structPtr->numNormalRibbons - 1) / RIBBONS_PER_ROW) * RIBBONS_PER_ROW;
|
||||
structPtr->selectedPos = 0;
|
||||
list->normalRibbonLastRowStart = ((list->numNormalRibbons - 1) / RIBBONS_PER_ROW) * RIBBONS_PER_ROW;
|
||||
list->selectedPos = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// There are no normal ribbons, move cursor to first gift ribbon
|
||||
structPtr->normalRibbonLastRowStart = 0;
|
||||
structPtr->selectedPos = GIFT_RIBBON_START_POS;
|
||||
list->normalRibbonLastRowStart = 0;
|
||||
list->selectedPos = GIFT_RIBBON_START_POS;
|
||||
}
|
||||
}
|
||||
|
||||
static u32 *GetNormalRibbonIds(u32 *size)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
*size = structPtr->numNormalRibbons;
|
||||
return structPtr->ribbonIds;
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
*size = list->numNormalRibbons;
|
||||
return list->ribbonIds;
|
||||
}
|
||||
|
||||
static u32 *GetGiftRibbonIds(u32 *size)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
*size = structPtr->numGiftRibbons;
|
||||
return structPtr->giftRibbonIds;
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
*size = list->numGiftRibbons;
|
||||
return list->giftRibbonIds;
|
||||
}
|
||||
|
||||
static u16 GetSelectedPosition(void)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
return structPtr->selectedPos;
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
return list->selectedPos;
|
||||
}
|
||||
|
||||
static u32 GetRibbonId(void)
|
||||
{
|
||||
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
int ribbonPos = structPtr->selectedPos;
|
||||
struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
|
||||
int ribbonPos = list->selectedPos;
|
||||
if (ribbonPos < FIRST_GIFT_RIBBON)
|
||||
return structPtr->ribbonIds[ribbonPos];
|
||||
return list->ribbonIds[ribbonPos];
|
||||
else
|
||||
return structPtr->giftRibbonIds[ribbonPos - GIFT_RIBBON_START_POS];
|
||||
return list->giftRibbonIds[ribbonPos - GIFT_RIBBON_START_POS];
|
||||
}
|
||||
|
||||
bool32 OpenRibbonsSummaryMenu(void)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU, sizeof(struct PokenavSub14));
|
||||
if (structPtr == NULL)
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU, sizeof(struct Pokenav_RibbonsSummaryMenu));
|
||||
if (menu == NULL)
|
||||
return FALSE;
|
||||
|
||||
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_OpenRibbonsSummaryMenu, 1);
|
||||
structPtr->callback = GetCurrentLoopedTaskActive;
|
||||
menu->loopedTaskId = CreateLoopedTask(LoopedTask_OpenRibbonsSummaryMenu, 1);
|
||||
menu->callback = GetCurrentLoopedTaskActive;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CreateRibbonsSummaryLoopedTask(s32 id)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
structPtr->loopedTaskId = CreateLoopedTask(sRibbonsSummaryMenuLoopTaskFuncs[id], 1);
|
||||
structPtr->callback = GetCurrentLoopedTaskActive;
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
menu->loopedTaskId = CreateLoopedTask(sRibbonsSummaryMenuLoopTaskFuncs[id], 1);
|
||||
menu->callback = GetCurrentLoopedTaskActive;
|
||||
}
|
||||
|
||||
u32 IsRibbonsSummaryLoopedTaskActive(void)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
return structPtr->callback();
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
return menu->callback();
|
||||
}
|
||||
|
||||
void FreeRibbonsSummaryScreen2(void)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
RemoveWindow(structPtr->ribbonCountWindowId);
|
||||
RemoveWindow(structPtr->nameWindowId);
|
||||
RemoveWindow(structPtr->listIdxWindowId);
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
RemoveWindow(menu->ribbonCountWindowId);
|
||||
RemoveWindow(menu->nameWindowId);
|
||||
RemoveWindow(menu->listIdxWindowId);
|
||||
#ifndef BUGFIX
|
||||
RemoveWindow(structPtr->unusedWindowId); // Removing window, but window id is never set
|
||||
RemoveWindow(menu->unusedWindowId); // Removing window, but window id is never set
|
||||
#endif
|
||||
DestroyRibbonsMonFrontPic(structPtr);
|
||||
DestroyRibbonsMonFrontPic(menu);
|
||||
FreeSpriteTilesByTag(GFXTAG_RIBBON_ICONS_BIG);
|
||||
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_1);
|
||||
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_2);
|
||||
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_3);
|
||||
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_4);
|
||||
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_5);
|
||||
FreeSpriteOamMatrix(structPtr->bigRibbonSprite);
|
||||
DestroySprite(structPtr->bigRibbonSprite);
|
||||
FreeSpriteOamMatrix(menu->bigRibbonSprite);
|
||||
DestroySprite(menu->bigRibbonSprite);
|
||||
FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
}
|
||||
|
||||
static bool32 GetCurrentLoopedTaskActive(void)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
return IsLoopedTaskActive(structPtr->loopedTaskId);
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
return IsLoopedTaskActive(menu->loopedTaskId);
|
||||
}
|
||||
|
||||
static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
InitBgTemplates(sBgTemplates, ARRAY_COUNT(sBgTemplates));
|
||||
DecompressAndCopyTileDataToVram(2, gPokenavRibbonsSummaryBg_Gfx, 0, 0, 0);
|
||||
SetBgTilemapBuffer(2, structPtr->tilemapBuffers[0]);
|
||||
SetBgTilemapBuffer(2, menu->tilemapBuffers[0]);
|
||||
CopyToBgTilemapBuffer(2, gPokenavRibbonsSummaryBg_Tilemap, 0, 0);
|
||||
CopyPaletteIntoBufferUnfaded(gPokenavRibbonsSummaryBg_Pal, 0x10, 0x20);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
@@ -580,7 +580,7 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
|
||||
{
|
||||
BgDmaFill(1, 0, 0, 1);
|
||||
DecompressAndCopyTileDataToVram(1, sRibbonIconsSmall_Gfx, 0, 1, 0);
|
||||
SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]);
|
||||
SetBgTilemapBuffer(1, menu->tilemapBuffers[1]);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20);
|
||||
CopyPaletteIntoBufferUnfaded(sRibbonIcons1_Pal, 0x20, 0xA0);
|
||||
CopyPaletteIntoBufferUnfaded(sMonInfo_Pal, 0xA0, 0x20);
|
||||
@@ -591,21 +591,21 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
|
||||
case 2:
|
||||
if (!FreeTempTileDataBuffersIfPossible())
|
||||
{
|
||||
AddRibbonCountWindow(structPtr);
|
||||
AddRibbonCountWindow(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 3:
|
||||
if (!FreeTempTileDataBuffersIfPossible())
|
||||
{
|
||||
AddRibbonSummaryMonNameWindow(structPtr);
|
||||
AddRibbonSummaryMonNameWindow(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 4:
|
||||
if (!FreeTempTileDataBuffersIfPossible())
|
||||
{
|
||||
AddRibbonListIndexWindow(structPtr);
|
||||
AddRibbonListIndexWindow(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
@@ -619,18 +619,18 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
|
||||
case 6:
|
||||
if (!IsDma3ManagerBusyWithBgCopy())
|
||||
{
|
||||
ResetSpritesAndDrawMonFrontPic(structPtr);
|
||||
ResetSpritesAndDrawMonFrontPic(menu);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 7:
|
||||
DrawAllRibbonsSmall(structPtr);
|
||||
DrawAllRibbonsSmall(menu);
|
||||
PrintHelpBarText(HELPBAR_RIBBONS_LIST);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 8:
|
||||
if (!IsDma3ManagerBusyWithBgCopy())
|
||||
{
|
||||
CreateBigRibbonSprite(structPtr);
|
||||
CreateBigRibbonSprite(menu);
|
||||
ChangeBgX(1, 0, BG_COORD_SET);
|
||||
ChangeBgY(1, 0, BG_COORD_SET);
|
||||
ChangeBgX(2, 0, BG_COORD_SET);
|
||||
@@ -638,7 +638,7 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
|
||||
ShowBg(1);
|
||||
ShowBg(2);
|
||||
HideBg(3);
|
||||
PokenavFadeScreen(1);
|
||||
PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
@@ -655,7 +655,7 @@ static u32 LoopedTask_ExitRibbonsSummaryMenu(s32 state)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
PokenavFadeScreen(0);
|
||||
PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (IsPaletteFadeActive())
|
||||
@@ -667,38 +667,38 @@ static u32 LoopedTask_ExitRibbonsSummaryMenu(s32 state)
|
||||
|
||||
static u32 LoopedTask_SwitchRibbonsSummaryMon(s32 state)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
SlideMonSpriteOff(structPtr);
|
||||
SlideMonSpriteOff(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (!IsMonSpriteAnimating(structPtr))
|
||||
if (!IsMonSpriteAnimating(menu))
|
||||
{
|
||||
PrintRibbbonsSummaryMonInfo(structPtr);
|
||||
PrintRibbbonsSummaryMonInfo(menu);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 2:
|
||||
DrawAllRibbonsSmall(structPtr);
|
||||
DrawAllRibbonsSmall(menu);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 3:
|
||||
PrintRibbonsMonListIndex(structPtr);
|
||||
PrintRibbonsMonListIndex(menu);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 4:
|
||||
PrintCurrentMonRibbonCount(structPtr);
|
||||
PrintCurrentMonRibbonCount(menu);
|
||||
return LT_INC_AND_CONTINUE;
|
||||
case 5:
|
||||
if (!IsDma3ManagerBusyWithBgCopy())
|
||||
{
|
||||
SlideMonSpriteOn(structPtr);
|
||||
SlideMonSpriteOn(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 6:
|
||||
if (IsMonSpriteAnimating(structPtr))
|
||||
if (IsMonSpriteAnimating(menu))
|
||||
return LT_PAUSE;
|
||||
}
|
||||
return LT_FINISH;
|
||||
@@ -706,17 +706,17 @@ static u32 LoopedTask_SwitchRibbonsSummaryMon(s32 state)
|
||||
|
||||
static u32 LoopedTask_ExpandSelectedRibbon(s32 state)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
UpdateAndZoomInSelectedRibbon(structPtr);
|
||||
UpdateAndZoomInSelectedRibbon(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (!IsRibbonAnimating(structPtr))
|
||||
if (!IsRibbonAnimating(menu))
|
||||
{
|
||||
PrintRibbonNameAndDescription(structPtr);
|
||||
PrintRibbonNameAndDescription(menu);
|
||||
PrintHelpBarText(HELPBAR_RIBBONS_CHECK);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
@@ -730,24 +730,24 @@ static u32 LoopedTask_ExpandSelectedRibbon(s32 state)
|
||||
|
||||
static u32 LoopedTask_MoveRibbonsCursorExpanded(s32 state)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
ZoomOutSelectedRibbon(structPtr);
|
||||
ZoomOutSelectedRibbon(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (!IsRibbonAnimating(structPtr))
|
||||
if (!IsRibbonAnimating(menu))
|
||||
{
|
||||
UpdateAndZoomInSelectedRibbon(structPtr);
|
||||
UpdateAndZoomInSelectedRibbon(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
case 2:
|
||||
if (!IsRibbonAnimating(structPtr))
|
||||
if (!IsRibbonAnimating(menu))
|
||||
{
|
||||
PrintRibbonNameAndDescription(structPtr);
|
||||
PrintRibbonNameAndDescription(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
return LT_PAUSE;
|
||||
@@ -760,17 +760,17 @@ static u32 LoopedTask_MoveRibbonsCursorExpanded(s32 state)
|
||||
|
||||
static u32 LoopedTask_ShrinkExpandedRibbon(s32 state)
|
||||
{
|
||||
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
ZoomOutSelectedRibbon(structPtr);
|
||||
ZoomOutSelectedRibbon(menu);
|
||||
return LT_INC_AND_PAUSE;
|
||||
case 1:
|
||||
if (!IsRibbonAnimating(structPtr))
|
||||
if (!IsRibbonAnimating(menu))
|
||||
{
|
||||
PrintCurrentMonRibbonCount(structPtr);
|
||||
PrintCurrentMonRibbonCount(menu);
|
||||
PrintHelpBarText(HELPBAR_RIBBONS_LIST);
|
||||
return LT_INC_AND_PAUSE;
|
||||
}
|
||||
@@ -793,14 +793,14 @@ static const struct WindowTemplate sRibbonCountWindowTemplate =
|
||||
.baseBlock = 0x14,
|
||||
};
|
||||
|
||||
static void AddRibbonCountWindow(struct PokenavSub14 *structPtr)
|
||||
static void AddRibbonCountWindow(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
structPtr->ribbonCountWindowId = AddWindow(&sRibbonCountWindowTemplate);
|
||||
PutWindowTilemap(structPtr->ribbonCountWindowId);
|
||||
PrintCurrentMonRibbonCount(structPtr);
|
||||
menu->ribbonCountWindowId = AddWindow(&sRibbonCountWindowTemplate);
|
||||
PutWindowTilemap(menu->ribbonCountWindowId);
|
||||
PrintCurrentMonRibbonCount(menu);
|
||||
}
|
||||
|
||||
static void PrintCurrentMonRibbonCount(struct PokenavSub14 *structPtr)
|
||||
static void PrintCurrentMonRibbonCount(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY};
|
||||
|
||||
@@ -808,23 +808,23 @@ static void PrintCurrentMonRibbonCount(struct PokenavSub14 *structPtr)
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_RibbonsF700);
|
||||
FillWindowPixelBuffer(structPtr->ribbonCountWindowId, PIXEL_FILL(4));
|
||||
AddTextPrinterParameterized3(structPtr->ribbonCountWindowId, FONT_NORMAL, 0, 1, color, TEXT_SKIP_DRAW, gStringVar4);
|
||||
CopyWindowToVram(structPtr->ribbonCountWindowId, COPYWIN_GFX);
|
||||
FillWindowPixelBuffer(menu->ribbonCountWindowId, PIXEL_FILL(4));
|
||||
AddTextPrinterParameterized3(menu->ribbonCountWindowId, FONT_NORMAL, 0, 1, color, TEXT_SKIP_DRAW, gStringVar4);
|
||||
CopyWindowToVram(menu->ribbonCountWindowId, COPYWIN_GFX);
|
||||
}
|
||||
|
||||
static void PrintRibbonNameAndDescription(struct PokenavSub14 *structPtr)
|
||||
static void PrintRibbonNameAndDescription(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
s32 i;
|
||||
u32 ribbonId = GetRibbonId();
|
||||
u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY};
|
||||
|
||||
FillWindowPixelBuffer(structPtr->ribbonCountWindowId, PIXEL_FILL(4));
|
||||
FillWindowPixelBuffer(menu->ribbonCountWindowId, PIXEL_FILL(4));
|
||||
if (ribbonId < FIRST_GIFT_RIBBON)
|
||||
{
|
||||
// Print normal ribbon name/description
|
||||
for (i = 0; i < 2; i++)
|
||||
AddTextPrinterParameterized3(structPtr->ribbonCountWindowId, FONT_NORMAL, 0, (i * 16) + 1, color, TEXT_SKIP_DRAW, gRibbonDescriptionPointers[ribbonId][i]);
|
||||
AddTextPrinterParameterized3(menu->ribbonCountWindowId, FONT_NORMAL, 0, (i * 16) + 1, color, TEXT_SKIP_DRAW, gRibbonDescriptionPointers[ribbonId][i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -840,10 +840,10 @@ static void PrintRibbonNameAndDescription(struct PokenavSub14 *structPtr)
|
||||
// Print gift ribbon name/description
|
||||
ribbonId--;
|
||||
for (i = 0; i < 2; i++)
|
||||
AddTextPrinterParameterized3(structPtr->ribbonCountWindowId, FONT_NORMAL, 0, (i * 16) + 1, color, TEXT_SKIP_DRAW, gGiftRibbonDescriptionPointers[ribbonId][i]);
|
||||
AddTextPrinterParameterized3(menu->ribbonCountWindowId, FONT_NORMAL, 0, (i * 16) + 1, color, TEXT_SKIP_DRAW, gGiftRibbonDescriptionPointers[ribbonId][i]);
|
||||
}
|
||||
|
||||
CopyWindowToVram(structPtr->ribbonCountWindowId, COPYWIN_GFX);
|
||||
CopyWindowToVram(menu->ribbonCountWindowId, COPYWIN_GFX);
|
||||
}
|
||||
|
||||
static const struct WindowTemplate sRibbonSummaryMonNameWindowTemplate =
|
||||
@@ -857,23 +857,23 @@ static const struct WindowTemplate sRibbonSummaryMonNameWindowTemplate =
|
||||
.baseBlock = 0x54,
|
||||
};
|
||||
|
||||
static void AddRibbonSummaryMonNameWindow(struct PokenavSub14 *structPtr)
|
||||
static void AddRibbonSummaryMonNameWindow(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
structPtr->nameWindowId = AddWindow(&sRibbonSummaryMonNameWindowTemplate);
|
||||
PutWindowTilemap(structPtr->nameWindowId);
|
||||
PrintRibbbonsSummaryMonInfo(structPtr);
|
||||
menu->nameWindowId = AddWindow(&sRibbonSummaryMonNameWindowTemplate);
|
||||
PutWindowTilemap(menu->nameWindowId);
|
||||
PrintRibbbonsSummaryMonInfo(menu);
|
||||
}
|
||||
|
||||
static const u8 sMaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}");
|
||||
static const u8 sFemaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}");
|
||||
static const u8 sGenderlessIconString[] = _("{UNK_SPACER}");
|
||||
|
||||
static void PrintRibbbonsSummaryMonInfo(struct PokenavSub14 *structPtr)
|
||||
static void PrintRibbbonsSummaryMonInfo(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
const u8 *genderTxt;
|
||||
u8 *txtPtr;
|
||||
u8 level, gender;
|
||||
u16 windowId = structPtr->nameWindowId;
|
||||
u16 windowId = menu->nameWindowId;
|
||||
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
|
||||
GetMonNicknameLevelGender(gStringVar3, &level, &gender);
|
||||
@@ -914,15 +914,15 @@ static const struct WindowTemplate sRibbonMonListIndexWindowTemplate[] =
|
||||
{},
|
||||
};
|
||||
|
||||
static void AddRibbonListIndexWindow(struct PokenavSub14 *structPtr)
|
||||
static void AddRibbonListIndexWindow(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
structPtr->listIdxWindowId = AddWindow(sRibbonMonListIndexWindowTemplate);
|
||||
FillWindowPixelBuffer(structPtr->listIdxWindowId, PIXEL_FILL(1));
|
||||
PutWindowTilemap(structPtr->listIdxWindowId);
|
||||
PrintRibbonsMonListIndex(structPtr);
|
||||
menu->listIdxWindowId = AddWindow(sRibbonMonListIndexWindowTemplate);
|
||||
FillWindowPixelBuffer(menu->listIdxWindowId, PIXEL_FILL(1));
|
||||
PutWindowTilemap(menu->listIdxWindowId);
|
||||
PrintRibbonsMonListIndex(menu);
|
||||
}
|
||||
|
||||
static void PrintRibbonsMonListIndex(struct PokenavSub14 *structPtr)
|
||||
static void PrintRibbonsMonListIndex(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
s32 x;
|
||||
u8 *txtPtr;
|
||||
@@ -933,24 +933,24 @@ static void PrintRibbonsMonListIndex(struct PokenavSub14 *structPtr)
|
||||
*(txtPtr++) = CHAR_SLASH;
|
||||
ConvertIntToDecimalStringN(txtPtr, count, STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
x = GetStringCenterAlignXOffset(FONT_NORMAL, gStringVar1, 56);
|
||||
AddTextPrinterParameterized(structPtr->listIdxWindowId, FONT_NORMAL, gStringVar1, x, 1, TEXT_SKIP_DRAW, NULL);
|
||||
CopyWindowToVram(structPtr->listIdxWindowId, COPYWIN_GFX);
|
||||
AddTextPrinterParameterized(menu->listIdxWindowId, FONT_NORMAL, gStringVar1, x, 1, TEXT_SKIP_DRAW, NULL);
|
||||
CopyWindowToVram(menu->listIdxWindowId, COPYWIN_GFX);
|
||||
}
|
||||
|
||||
static void ResetSpritesAndDrawMonFrontPic(struct PokenavSub14 *structPtr)
|
||||
static void ResetSpritesAndDrawMonFrontPic(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
u16 species;
|
||||
u32 personality, otId;
|
||||
|
||||
GetMonSpeciesPersonalityOtId(&species, &personality, &otId);
|
||||
ResetAllPicSprites();
|
||||
structPtr->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_ON, MON_SPRITE_Y);
|
||||
menu->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_ON, MON_SPRITE_Y);
|
||||
PokenavFillPalette(15, 0);
|
||||
}
|
||||
|
||||
static void DestroyRibbonsMonFrontPic(struct PokenavSub14 *structPtr)
|
||||
static void DestroyRibbonsMonFrontPic(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
FreeAndDestroyMonPicSprite(structPtr->monSpriteId);
|
||||
FreeAndDestroyMonPicSprite(menu->monSpriteId);
|
||||
}
|
||||
|
||||
// x and y arguments are ignored
|
||||
@@ -967,25 +967,25 @@ static u16 DrawRibbonsMonFrontPic(s32 x, s32 y)
|
||||
return spriteId;
|
||||
}
|
||||
|
||||
static void SlideMonSpriteOff(struct PokenavSub14 *structPtr)
|
||||
static void SlideMonSpriteOff(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
StartMonSpriteSlide(&gSprites[structPtr->monSpriteId], MON_SPRITE_X_ON, MON_SPRITE_X_OFF, 6);
|
||||
StartMonSpriteSlide(&gSprites[menu->monSpriteId], MON_SPRITE_X_ON, MON_SPRITE_X_OFF, 6);
|
||||
}
|
||||
|
||||
static void SlideMonSpriteOn(struct PokenavSub14 *structPtr)
|
||||
static void SlideMonSpriteOn(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
// Switch to new mon sprite
|
||||
FreeAndDestroyMonPicSprite(structPtr->monSpriteId);
|
||||
structPtr->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_OFF, MON_SPRITE_Y);
|
||||
FreeAndDestroyMonPicSprite(menu->monSpriteId);
|
||||
menu->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_OFF, MON_SPRITE_Y);
|
||||
|
||||
// Slide on
|
||||
StartMonSpriteSlide(&gSprites[structPtr->monSpriteId], MON_SPRITE_X_OFF, MON_SPRITE_X_ON, 6);
|
||||
StartMonSpriteSlide(&gSprites[menu->monSpriteId], MON_SPRITE_X_OFF, MON_SPRITE_X_ON, 6);
|
||||
}
|
||||
|
||||
// Is Pokémon summary sprite still sliding off/on
|
||||
static bool32 IsMonSpriteAnimating(struct PokenavSub14 *structPtr)
|
||||
static bool32 IsMonSpriteAnimating(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
return (gSprites[structPtr->monSpriteId].callback != SpriteCallbackDummy);
|
||||
return (gSprites[menu->monSpriteId].callback != SpriteCallbackDummy);
|
||||
}
|
||||
|
||||
#define sCurrX data[0]
|
||||
@@ -1030,7 +1030,7 @@ static void SpriteCB_MonSpriteSlide(struct Sprite *sprite)
|
||||
#undef sTime
|
||||
#undef sDestX
|
||||
|
||||
static void DrawAllRibbonsSmall(struct PokenavSub14 *structPtr)
|
||||
static void DrawAllRibbonsSmall(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
u32 *ribbonIds;
|
||||
|
||||
@@ -1211,7 +1211,7 @@ static const struct SpriteTemplate sSpriteTemplate_RibbonIconBig =
|
||||
};
|
||||
|
||||
// Create dummy sprite to be used for the zoomed in version of the selected ribbon
|
||||
static void CreateBigRibbonSprite(struct PokenavSub14 *structPtr)
|
||||
static void CreateBigRibbonSprite(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
u8 spriteId;
|
||||
|
||||
@@ -1219,45 +1219,45 @@ static void CreateBigRibbonSprite(struct PokenavSub14 *structPtr)
|
||||
Pokenav_AllocAndLoadPalettes(sSpritePalettes_RibbonIcons);
|
||||
|
||||
spriteId = CreateSprite(&sSpriteTemplate_RibbonIconBig, 0, 0, 0);
|
||||
structPtr->bigRibbonSprite = &gSprites[spriteId];
|
||||
structPtr->bigRibbonSprite->invisible = TRUE;
|
||||
menu->bigRibbonSprite = &gSprites[spriteId];
|
||||
menu->bigRibbonSprite->invisible = TRUE;
|
||||
}
|
||||
|
||||
#define sInvisibleWhenDone data[0]
|
||||
|
||||
static void UpdateAndZoomInSelectedRibbon(struct PokenavSub14 *structPtr)
|
||||
static void UpdateAndZoomInSelectedRibbon(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
u32 ribbonId;
|
||||
s32 position = GetSelectedPosition();
|
||||
s32 x = (position % RIBBONS_PER_ROW) * 16 + 96;
|
||||
s32 y = (position / RIBBONS_PER_ROW) * 16 + 40;
|
||||
|
||||
structPtr->bigRibbonSprite->x = x;
|
||||
structPtr->bigRibbonSprite->y = y;
|
||||
menu->bigRibbonSprite->x = x;
|
||||
menu->bigRibbonSprite->y = y;
|
||||
|
||||
// Set new selected ribbon's gfx data
|
||||
ribbonId = GetRibbonId();
|
||||
structPtr->bigRibbonSprite->oam.tileNum = (sRibbonGfxData[ribbonId].tileNumOffset * 16) + GetSpriteTileStartByTag(GFXTAG_RIBBON_ICONS_BIG);
|
||||
structPtr->bigRibbonSprite->oam.paletteNum = IndexOfSpritePaletteTag(sRibbonGfxData[ribbonId].palNumOffset + PALTAG_RIBBON_ICONS_1);
|
||||
menu->bigRibbonSprite->oam.tileNum = (sRibbonGfxData[ribbonId].tileNumOffset * 16) + GetSpriteTileStartByTag(GFXTAG_RIBBON_ICONS_BIG);
|
||||
menu->bigRibbonSprite->oam.paletteNum = IndexOfSpritePaletteTag(sRibbonGfxData[ribbonId].palNumOffset + PALTAG_RIBBON_ICONS_1);
|
||||
|
||||
// Start zoom in animation
|
||||
StartSpriteAffineAnim(structPtr->bigRibbonSprite, RIBBONANIM_ZOOM_IN);
|
||||
structPtr->bigRibbonSprite->invisible = FALSE;
|
||||
structPtr->bigRibbonSprite->sInvisibleWhenDone = FALSE;
|
||||
structPtr->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation;
|
||||
StartSpriteAffineAnim(menu->bigRibbonSprite, RIBBONANIM_ZOOM_IN);
|
||||
menu->bigRibbonSprite->invisible = FALSE;
|
||||
menu->bigRibbonSprite->sInvisibleWhenDone = FALSE;
|
||||
menu->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation;
|
||||
}
|
||||
|
||||
// Start animation to zoom out of selected ribbon
|
||||
static void ZoomOutSelectedRibbon(struct PokenavSub14 *structPtr)
|
||||
static void ZoomOutSelectedRibbon(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
structPtr->bigRibbonSprite->sInvisibleWhenDone = TRUE;
|
||||
StartSpriteAffineAnim(structPtr->bigRibbonSprite, RIBBONANIM_ZOOM_OUT);
|
||||
structPtr->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation;
|
||||
menu->bigRibbonSprite->sInvisibleWhenDone = TRUE;
|
||||
StartSpriteAffineAnim(menu->bigRibbonSprite, RIBBONANIM_ZOOM_OUT);
|
||||
menu->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation;
|
||||
}
|
||||
|
||||
static bool32 IsRibbonAnimating(struct PokenavSub14 *structPtr)
|
||||
static bool32 IsRibbonAnimating(struct Pokenav_RibbonsSummaryMenu *menu)
|
||||
{
|
||||
return (structPtr->bigRibbonSprite->callback != SpriteCallbackDummy);
|
||||
return (menu->bigRibbonSprite->callback != SpriteCallbackDummy);
|
||||
}
|
||||
|
||||
static void SpriteCB_WaitForRibbonAnimation(struct Sprite *sprite)
|
||||
@@ -490,7 +490,7 @@ static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_KyogreDorsalFin =
|
||||
|
||||
static const struct ScanlineEffectParams sScanlineParams_DuoFight_Clouds =
|
||||
{
|
||||
.dmaDest = (vu16 *)REG_ADDR_BG1HOFS,
|
||||
.dmaDest = ®_BG1HOFS,
|
||||
.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT,
|
||||
.initState = 1
|
||||
};
|
||||
|
||||
+14
-19
@@ -115,19 +115,18 @@ static void CB_FadeInFlyMap(void);
|
||||
static void CB_HandleFlyMapInput(void);
|
||||
static void CB_ExitFlyMap(void);
|
||||
|
||||
// .rodata
|
||||
|
||||
static const u16 sRegionMapCursorPal[] = INCBIN_U16("graphics/pokenav/cursor.gbapal");
|
||||
static const u32 sRegionMapCursorSmallGfxLZ[] = INCBIN_U32("graphics/pokenav/cursor_small.4bpp.lz");
|
||||
static const u32 sRegionMapCursorLargeGfxLZ[] = INCBIN_U32("graphics/pokenav/cursor_large.4bpp.lz");
|
||||
// NOTE: Some of the below graphics are not in graphics/pokenav/region_map
|
||||
// because porymap expects them to be in their current location.
|
||||
static const u16 sRegionMapCursorPal[] = INCBIN_U16("graphics/pokenav/region_map/cursor.gbapal");
|
||||
static const u32 sRegionMapCursorSmallGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_small.4bpp.lz");
|
||||
static const u32 sRegionMapCursorLargeGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_large.4bpp.lz");
|
||||
static const u16 sRegionMapBg_Pal[] = INCBIN_U16("graphics/pokenav/region_map.gbapal");
|
||||
static const u32 sRegionMapBg_GfxLZ[] = INCBIN_U32("graphics/pokenav/region_map.8bpp.lz");
|
||||
static const u32 sRegionMapBg_TilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map_map.bin.lz");
|
||||
static const u16 sRegionMapPlayerIcon_BrendanPal[] = INCBIN_U16("graphics/pokenav/brendan_icon.gbapal");
|
||||
static const u8 sRegionMapPlayerIcon_BrendanGfx[] = INCBIN_U8("graphics/pokenav/brendan_icon.4bpp");
|
||||
static const u16 sRegionMapPlayerIcon_MayPal[] = INCBIN_U16("graphics/pokenav/may_icon.gbapal");
|
||||
static const u8 sRegionMapPlayerIcon_MayGfx[] = INCBIN_U8("graphics/pokenav/may_icon.4bpp");
|
||||
|
||||
static const u16 sRegionMapPlayerIcon_BrendanPal[] = INCBIN_U16("graphics/pokenav/region_map/brendan_icon.gbapal");
|
||||
static const u8 sRegionMapPlayerIcon_BrendanGfx[] = INCBIN_U8("graphics/pokenav/region_map/brendan_icon.4bpp");
|
||||
static const u16 sRegionMapPlayerIcon_MayPal[] = INCBIN_U16("graphics/pokenav/region_map/may_icon.gbapal");
|
||||
static const u8 sRegionMapPlayerIcon_MayGfx[] = INCBIN_U8("graphics/pokenav/region_map/may_icon.4bpp");
|
||||
static const u8 sRegionMap_MapSectionLayout[] = INCBIN_U8("graphics/pokenav/region_map_section_layout.bin");
|
||||
|
||||
#include "data/region_map/region_map_entries.h"
|
||||
@@ -282,15 +281,11 @@ static const u8 sMapSecIdsOffMap[] =
|
||||
MAPSEC_NAVEL_ROCK
|
||||
};
|
||||
|
||||
static const u16 sRegionMapFramePal[] = INCBIN_U16("graphics/pokenav/map_frame.gbapal");
|
||||
|
||||
static const u32 sRegionMapFrameGfxLZ[] = INCBIN_U32("graphics/pokenav/map_frame.4bpp.lz");
|
||||
|
||||
static const u32 sRegionMapFrameTilemapLZ[] = INCBIN_U32("graphics/pokenav/map_frame.bin.lz");
|
||||
|
||||
static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/fly_target_icons.gbapal");
|
||||
|
||||
static const u32 sFlyTargetIcons_Gfx[] = INCBIN_U32("graphics/pokenav/fly_target_icons.4bpp.lz");
|
||||
static const u16 sRegionMapFramePal[] = INCBIN_U16("graphics/pokenav/region_map/frame.gbapal");
|
||||
static const u32 sRegionMapFrameGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.4bpp.lz");
|
||||
static const u32 sRegionMapFrameTilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.bin.lz");
|
||||
static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/region_map/fly_target_icons.gbapal");
|
||||
static const u32 sFlyTargetIcons_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/fly_target_icons.4bpp.lz");
|
||||
|
||||
static const u8 sMapHealLocations[][3] =
|
||||
{
|
||||
|
||||
+1
-1
@@ -990,7 +990,7 @@ const u8 gText_Unknown[] = _("UNKNOWN");
|
||||
const u8 gText_Call[] = _("CALL");
|
||||
const u8 gText_Check[] = _("CHECK");
|
||||
const u8 gText_Cancel6[] = _("CANCEL");
|
||||
const u8 gText_NumberF700[] = _("No. {DYNAMIC 0}");
|
||||
const u8 gText_NumberIndex[] = _("No. {DYNAMIC 0}");
|
||||
const u8 gText_RibbonsF700[] = _("RIBBONS {DYNAMIC 0}");
|
||||
const u8 gText_PokemonMaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused
|
||||
const u8 gText_PokemonFemaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused
|
||||
|
||||
+92
-98
@@ -57,14 +57,14 @@ struct UsePokeblockSession
|
||||
u8 mainState;
|
||||
u8 unused1;
|
||||
u8 timer;
|
||||
u8 statId;
|
||||
u8 condition;
|
||||
u8 numEnhancements;
|
||||
u8 unused2;
|
||||
bool8 monInTopHalf;
|
||||
u8 conditionsBeforeBlock[FLAVOR_COUNT];
|
||||
u8 conditionsAfterBlock[FLAVOR_COUNT];
|
||||
u8 enhancements[FLAVOR_COUNT];
|
||||
s16 pokeblockStatBoosts[FLAVOR_COUNT];
|
||||
u8 conditionsBeforeBlock[CONDITION_COUNT];
|
||||
u8 conditionsAfterBlock[CONDITION_COUNT];
|
||||
u8 enhancements[CONDITION_COUNT];
|
||||
s16 pokeblockStatBoosts[CONDITION_COUNT];
|
||||
u8 numSelections; // num in party + 1 (for Cancel)
|
||||
u8 curSelection;
|
||||
bool8 (*loadNewSelection)(void);
|
||||
@@ -73,7 +73,7 @@ struct UsePokeblockSession
|
||||
u8 natureText[34];
|
||||
};
|
||||
|
||||
// This struct is identical to PokenavMonList, the struct used for managing lists of pokemon in the pokenav
|
||||
// This struct is identical to PokenavMonListItem, the struct used for managing lists of pokemon in the pokenav
|
||||
// Given that this screen is essentially duplicated in the poknav, this struct was probably the same one with
|
||||
// a more general name/purpose
|
||||
// TODO: Once the pokenav conditions screens are documented, resolve the above
|
||||
@@ -142,7 +142,7 @@ static void LoadAndCreateUpDownSprites(void);
|
||||
static void CalculateNumAdditionalSparkles(u8);
|
||||
static void PrintFirstEnhancement(void);
|
||||
static bool8 TryPrintNextEnhancement(void);
|
||||
static void BufferEnhancedStatText(u8 *, u8, s16);
|
||||
static void BufferEnhancedText(u8 *, u8, s16);
|
||||
static void PrintMenuWindowText(const u8 *);
|
||||
static void CalculatePokeblockEffectiveness(struct Pokeblock *, struct Pokemon *);
|
||||
static void SpriteCB_UpDown(struct Sprite *);
|
||||
@@ -178,22 +178,22 @@ static const u32 sGraphData_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_scree
|
||||
|
||||
// The condition/flavors aren't listed in their normal order in this file, they're listed as shown on the graph going counter-clockwise
|
||||
// Normally they would go Cool/Spicy, Beauty/Dry, Cute/Sweet, Smart/Bitter, Tough/Sour (also graph order, but clockwise)
|
||||
static const u32 sMonDataConditions[FLAVOR_COUNT] =
|
||||
static const u32 sConditionToMonData[CONDITION_COUNT] =
|
||||
{
|
||||
MON_DATA_COOL,
|
||||
MON_DATA_TOUGH,
|
||||
MON_DATA_SMART,
|
||||
MON_DATA_CUTE,
|
||||
MON_DATA_BEAUTY
|
||||
[CONDITION_COOL] = MON_DATA_COOL,
|
||||
[CONDITION_TOUGH] = MON_DATA_TOUGH,
|
||||
[CONDITION_SMART] = MON_DATA_SMART,
|
||||
[CONDITION_CUTE] = MON_DATA_CUTE,
|
||||
[CONDITION_BEAUTY] = MON_DATA_BEAUTY
|
||||
};
|
||||
|
||||
static const u8 sFlavors[FLAVOR_COUNT] =
|
||||
static const u8 sConditionToFlavor[CONDITION_COUNT] =
|
||||
{
|
||||
FLAVOR_SPICY,
|
||||
FLAVOR_SOUR,
|
||||
FLAVOR_BITTER,
|
||||
FLAVOR_SWEET,
|
||||
FLAVOR_DRY
|
||||
[CONDITION_COOL] = FLAVOR_SPICY,
|
||||
[CONDITION_TOUGH] = FLAVOR_SOUR,
|
||||
[CONDITION_SMART] = FLAVOR_BITTER,
|
||||
[CONDITION_CUTE] = FLAVOR_SWEET,
|
||||
[CONDITION_BEAUTY] = FLAVOR_DRY
|
||||
};
|
||||
|
||||
static const u8 sNatureTextColors[] =
|
||||
@@ -286,13 +286,13 @@ static const struct WindowTemplate sUsePokeblockYesNoWinTemplate =
|
||||
.baseBlock = 0x83
|
||||
};
|
||||
|
||||
static const u8 *const sContestStatNames[] =
|
||||
static const u8 *const sConditionNames[CONDITION_COUNT] =
|
||||
{
|
||||
gText_Coolness,
|
||||
gText_Toughness,
|
||||
gText_Smartness,
|
||||
gText_Cuteness,
|
||||
gText_Beauty3
|
||||
[CONDITION_COOL] = gText_Coolness,
|
||||
[CONDITION_TOUGH] = gText_Toughness,
|
||||
[CONDITION_SMART] = gText_Smartness,
|
||||
[CONDITION_CUTE] = gText_Cuteness,
|
||||
[CONDITION_BEAUTY] = gText_Beauty3
|
||||
};
|
||||
|
||||
static const struct SpriteSheet sSpriteSheet_UpDown =
|
||||
@@ -305,13 +305,13 @@ static const struct SpritePalette sSpritePalette_UpDown =
|
||||
gUsePokeblockUpDown_Pal, TAG_UP_DOWN
|
||||
};
|
||||
|
||||
static const s16 sUpDownCoordsOnGraph[FLAVOR_COUNT][2] =
|
||||
static const s16 sUpDownCoordsOnGraph[CONDITION_COUNT][2] =
|
||||
{
|
||||
{156, 36},
|
||||
{117, 59},
|
||||
{117, 118},
|
||||
{197, 118},
|
||||
{197, 59}
|
||||
[CONDITION_COOL] = {156, 36},
|
||||
[CONDITION_TOUGH] = {117, 59},
|
||||
[CONDITION_SMART] = {117, 118},
|
||||
[CONDITION_CUTE] = {197, 118},
|
||||
[CONDITION_BEAUTY] = {197, 59}
|
||||
};
|
||||
|
||||
static const struct OamData sOam_UpDown =
|
||||
@@ -471,7 +471,7 @@ static void VBlankCB_UsePokeblockMenu(void)
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
sub_81D2108(&sMenu->graph);
|
||||
ConditionGraph_Draw(&sMenu->graph);
|
||||
ScanlineEffect_InitHBlankDmaTransfer();
|
||||
}
|
||||
|
||||
@@ -487,7 +487,7 @@ static void LoadUsePokeblockMenu(void)
|
||||
{
|
||||
case 0:
|
||||
sMenu->curMonSpriteId = SPRITE_NONE;
|
||||
InitConditionGraphData(&sMenu->graph);
|
||||
ConditionGraph_Init(&sMenu->graph);
|
||||
sInfo->mainState++;
|
||||
break;
|
||||
case 1:
|
||||
@@ -537,19 +537,19 @@ static void LoadUsePokeblockMenu(void)
|
||||
sInfo->mainState++;
|
||||
break;
|
||||
case 11:
|
||||
sub_81D2754(sMenu->graph.stat[0], sMenu->graph.unk14[0]);
|
||||
InitConditionGraphState(&sMenu->graph);
|
||||
ConditionGraph_CalcPositions(sMenu->graph.conditions[0], sMenu->graph.savedPositions[0]);
|
||||
ConditionGraph_InitResetScanline(&sMenu->graph);
|
||||
sInfo->mainState++;
|
||||
break;
|
||||
case 12:
|
||||
if (!SetupConditionGraphScanlineParams(&sMenu->graph))
|
||||
if (!ConditionGraph_ResetScanline(&sMenu->graph))
|
||||
{
|
||||
sub_81D1F84(&sMenu->graph, sMenu->graph.unk14[0], sMenu->graph.unk14[0]);
|
||||
ConditionGraph_SetNewPositions(&sMenu->graph, sMenu->graph.savedPositions[0], sMenu->graph.savedPositions[0]);
|
||||
sInfo->mainState++;
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
sub_81D2230(&sMenu->graph);
|
||||
ConditionGraph_Update(&sMenu->graph);
|
||||
sInfo->mainState++;
|
||||
break;
|
||||
case 14:
|
||||
@@ -767,8 +767,6 @@ static void ShowUsePokeblockMenuForResults(void)
|
||||
|
||||
static void ShowPokeblockResults(void)
|
||||
{
|
||||
u8 var;
|
||||
|
||||
switch (sInfo->mainState)
|
||||
{
|
||||
case 0:
|
||||
@@ -783,14 +781,13 @@ static void ShowPokeblockResults(void)
|
||||
break;
|
||||
case 2:
|
||||
CalculateConditionEnhancements();
|
||||
sub_81D2754(sInfo->conditionsAfterBlock, sMenu->graph.unk14[3]);
|
||||
sub_81D1F84(&sMenu->graph, sMenu->graph.unk14[sMenu->curLoadId], sMenu->graph.unk14[3]);
|
||||
ConditionGraph_CalcPositions(sInfo->conditionsAfterBlock, sMenu->graph.savedPositions[CONDITION_GRAPH_LOAD_MAX - 1]);
|
||||
ConditionGraph_SetNewPositions(&sMenu->graph, sMenu->graph.savedPositions[sMenu->curLoadId], sMenu->graph.savedPositions[CONDITION_GRAPH_LOAD_MAX - 1]);
|
||||
LoadAndCreateUpDownSprites();
|
||||
sInfo->mainState++;
|
||||
break;
|
||||
case 3:
|
||||
var = TransitionConditionGraph(&sMenu->graph);
|
||||
if (!var)
|
||||
if (!ConditionGraph_TryUpdate(&sMenu->graph))
|
||||
{
|
||||
CalculateNumAdditionalSparkles(GetPartyIdFromSelectionId(sMenu->info.curSelection));
|
||||
if (sMenu->info.curSelection != sMenu->info.numSelections - 1)
|
||||
@@ -906,16 +903,16 @@ static void PrintFirstEnhancement(void)
|
||||
DrawTextBorderOuter(WIN_TEXT, 151, 14);
|
||||
FillWindowPixelBuffer(WIN_TEXT, 17);
|
||||
|
||||
for (sInfo->statId = 0; sInfo->statId < FLAVOR_COUNT; sInfo->statId++)
|
||||
for (sInfo->condition = 0; sInfo->condition < CONDITION_COUNT; sInfo->condition++)
|
||||
{
|
||||
if (sInfo->enhancements[sInfo->statId] != 0)
|
||||
if (sInfo->enhancements[sInfo->condition] != 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (sInfo->statId < FLAVOR_COUNT)
|
||||
BufferEnhancedStatText(gStringVar4, sInfo->statId, sInfo->enhancements[sInfo->statId]);
|
||||
if (sInfo->condition < CONDITION_COUNT)
|
||||
BufferEnhancedText(gStringVar4, sInfo->condition, sInfo->enhancements[sInfo->condition]);
|
||||
else
|
||||
BufferEnhancedStatText(gStringVar4, sInfo->statId, 0);
|
||||
BufferEnhancedText(gStringVar4, sInfo->condition, 0);
|
||||
|
||||
PrintMenuWindowText(gStringVar4);
|
||||
PutWindowTilemap(WIN_TEXT);
|
||||
@@ -928,20 +925,20 @@ static bool8 TryPrintNextEnhancement(void)
|
||||
|
||||
while (1)
|
||||
{
|
||||
sInfo->statId++;
|
||||
if (sInfo->statId < FLAVOR_COUNT)
|
||||
sInfo->condition++;
|
||||
if (sInfo->condition < CONDITION_COUNT)
|
||||
{
|
||||
if (sInfo->enhancements[sInfo->statId] != 0)
|
||||
if (sInfo->enhancements[sInfo->condition] != 0)
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
sInfo->statId = FLAVOR_COUNT;
|
||||
sInfo->condition = CONDITION_COUNT;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
BufferEnhancedStatText(gStringVar4, sInfo->statId, sInfo->enhancements[sInfo->statId]);
|
||||
BufferEnhancedText(gStringVar4, sInfo->condition, sInfo->enhancements[sInfo->condition]);
|
||||
PrintMenuWindowText(gStringVar4);
|
||||
CopyWindowToVram(WIN_TEXT, COPYWIN_GFX);
|
||||
|
||||
@@ -969,7 +966,7 @@ static void PrintMenuWindowText(const u8 *message)
|
||||
AddTextPrinterParameterized(WIN_TEXT, FONT_NORMAL, gStringVar4, 0, 1, 0, NULL);
|
||||
}
|
||||
|
||||
static void BufferEnhancedStatText(u8 *dest, u8 statId, s16 enhancement)
|
||||
static void BufferEnhancedText(u8 *dest, u8 condition, s16 enhancement)
|
||||
{
|
||||
switch (enhancement)
|
||||
{
|
||||
@@ -979,7 +976,7 @@ static void BufferEnhancedStatText(u8 *dest, u8 statId, s16 enhancement)
|
||||
case -32768 ... -1: // if < 0
|
||||
if (enhancement)
|
||||
dest[(u16)enhancement] += 0; // something you can't imagine
|
||||
StringCopy(dest, sContestStatNames[statId]);
|
||||
StringCopy(dest, sConditionNames[condition]);
|
||||
StringAppend(dest, gText_WasEnhanced);
|
||||
break;
|
||||
case 0:
|
||||
@@ -992,36 +989,36 @@ static void GetMonConditions(struct Pokemon *mon, u8 *data)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < FLAVOR_COUNT; i++)
|
||||
data[i] = GetMonData(mon, sMonDataConditions[i]);
|
||||
for (i = 0; i < CONDITION_COUNT; i++)
|
||||
data[i] = GetMonData(mon, sConditionToMonData[i]);
|
||||
}
|
||||
|
||||
static void AddPokeblockToConditions(struct Pokeblock *pokeblock, struct Pokemon *mon)
|
||||
{
|
||||
u16 i;
|
||||
s16 cstat;
|
||||
s16 stat;
|
||||
u8 data;
|
||||
|
||||
if (GetMonData(mon, MON_DATA_SHEEN) != 255)
|
||||
if (GetMonData(mon, MON_DATA_SHEEN) != MAX_SHEEN)
|
||||
{
|
||||
CalculatePokeblockEffectiveness(pokeblock, mon);
|
||||
for (i = 0; i < FLAVOR_COUNT; i++)
|
||||
for (i = 0; i < CONDITION_COUNT; i++)
|
||||
{
|
||||
data = GetMonData(mon, sMonDataConditions[i]);
|
||||
cstat = data + sInfo->pokeblockStatBoosts[i];
|
||||
if (cstat < 0)
|
||||
cstat = 0;
|
||||
if (cstat > 255)
|
||||
cstat = 255;
|
||||
data = cstat;
|
||||
SetMonData(mon, sMonDataConditions[i], &data);
|
||||
data = GetMonData(mon, sConditionToMonData[i]);
|
||||
stat = data + sInfo->pokeblockStatBoosts[i];
|
||||
if (stat < 0)
|
||||
stat = 0;
|
||||
if (stat > MAX_CONDITION)
|
||||
stat = MAX_CONDITION;
|
||||
data = stat;
|
||||
SetMonData(mon, sConditionToMonData[i], &data);
|
||||
}
|
||||
|
||||
cstat = (u8)(GetMonData(mon, MON_DATA_SHEEN)) + pokeblock->feel;
|
||||
if (cstat > 255)
|
||||
cstat = 255;
|
||||
stat = (u8)(GetMonData(mon, MON_DATA_SHEEN)) + pokeblock->feel;
|
||||
if (stat > MAX_SHEEN)
|
||||
stat = MAX_SHEEN;
|
||||
|
||||
data = cstat;
|
||||
data = stat;
|
||||
SetMonData(mon, MON_DATA_SHEEN, &data);
|
||||
}
|
||||
}
|
||||
@@ -1035,19 +1032,19 @@ static void CalculateConditionEnhancements(void)
|
||||
GetMonConditions(mon, sInfo->conditionsBeforeBlock);
|
||||
AddPokeblockToConditions(sInfo->pokeblock, mon);
|
||||
GetMonConditions(mon, sInfo->conditionsAfterBlock);
|
||||
for (i = 0; i < FLAVOR_COUNT; i++)
|
||||
for (i = 0; i < CONDITION_COUNT; i++)
|
||||
sInfo->enhancements[i] = sInfo->conditionsAfterBlock[i] - sInfo->conditionsBeforeBlock[i];
|
||||
}
|
||||
|
||||
static void CalculatePokeblockEffectiveness(struct Pokeblock *pokeblock, struct Pokemon *mon)
|
||||
{
|
||||
s8 i, direction, taste;
|
||||
s8 i, direction, flavor;
|
||||
|
||||
sInfo->pokeblockStatBoosts[0] = pokeblock->spicy;
|
||||
sInfo->pokeblockStatBoosts[1] = pokeblock->sour;
|
||||
sInfo->pokeblockStatBoosts[2] = pokeblock->bitter;
|
||||
sInfo->pokeblockStatBoosts[3] = pokeblock->sweet;
|
||||
sInfo->pokeblockStatBoosts[4] = pokeblock->dry;
|
||||
sInfo->pokeblockStatBoosts[CONDITION_COOL] = pokeblock->spicy;
|
||||
sInfo->pokeblockStatBoosts[CONDITION_TOUGH] = pokeblock->sour;
|
||||
sInfo->pokeblockStatBoosts[CONDITION_SMART] = pokeblock->bitter;
|
||||
sInfo->pokeblockStatBoosts[CONDITION_CUTE] = pokeblock->sweet;
|
||||
sInfo->pokeblockStatBoosts[CONDITION_BEAUTY] = pokeblock->dry;
|
||||
|
||||
if (gPokeblockGain > 0)
|
||||
direction = 1;
|
||||
@@ -1056,7 +1053,7 @@ static void CalculatePokeblockEffectiveness(struct Pokeblock *pokeblock, struct
|
||||
else
|
||||
return;
|
||||
|
||||
for (i = 0; i < FLAVOR_COUNT; i++)
|
||||
for (i = 0; i < CONDITION_COUNT; i++)
|
||||
{
|
||||
s16 amount = sInfo->pokeblockStatBoosts[i];
|
||||
s8 boost = amount / 10;
|
||||
@@ -1064,9 +1061,9 @@ static void CalculatePokeblockEffectiveness(struct Pokeblock *pokeblock, struct
|
||||
if (amount % 10 >= 5) // round to the nearest
|
||||
boost++;
|
||||
|
||||
taste = GetMonFlavorRelation(mon, sFlavors[i]);
|
||||
if (taste == direction)
|
||||
sInfo->pokeblockStatBoosts[i] += boost * taste;
|
||||
flavor = GetMonFlavorRelation(mon, sConditionToFlavor[i]);
|
||||
if (flavor == direction)
|
||||
sInfo->pokeblockStatBoosts[i] += boost * flavor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1075,7 +1072,7 @@ static bool8 IsSheenMaxed(void)
|
||||
if (GetBoxOrPartyMonData(sMenu->party[sMenu->info.curSelection].boxId,
|
||||
sMenu->party[sMenu->info.curSelection].monId,
|
||||
MON_DATA_SHEEN,
|
||||
NULL) == 255)
|
||||
NULL) == MAX_SHEEN)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
@@ -1125,7 +1122,7 @@ static void LoadAndCreateUpDownSprites(void)
|
||||
LoadSpritePalette(&sSpritePalette_UpDown);
|
||||
sInfo->numEnhancements = 0;
|
||||
|
||||
for (i = 0; i < FLAVOR_COUNT; i++)
|
||||
for (i = 0; i < CONDITION_COUNT; i++)
|
||||
{
|
||||
if (sInfo->enhancements[i] != 0)
|
||||
{
|
||||
@@ -1368,7 +1365,7 @@ static bool8 LoadUsePokeblockMenuGfx(void)
|
||||
LoadBgTilemap(2, sMenu->tilemapBuffer, 1280, 0);
|
||||
LoadPalette(gConditionGraphData_Pal, 48, 32);
|
||||
LoadPalette(gConditionText_Pal, 240, 32);
|
||||
SetConditionGraphIOWindows(2);
|
||||
ConditionGraph_InitWindow(2);
|
||||
break;
|
||||
default:
|
||||
sMenu->info.helperState = 0;
|
||||
@@ -1419,7 +1416,7 @@ static void UpdateSelection(bool8 up)
|
||||
else
|
||||
newLoadId = sMenu->nextLoadId;
|
||||
|
||||
sub_81D1F84(&sMenu->graph, sMenu->graph.unk14[sMenu->curLoadId], sMenu->graph.unk14[newLoadId]);
|
||||
ConditionGraph_SetNewPositions(&sMenu->graph, sMenu->graph.savedPositions[sMenu->curLoadId], sMenu->graph.savedPositions[newLoadId]);
|
||||
|
||||
if (sMenu->info.curSelection == sMenu->info.numSelections - 1)
|
||||
startedOnMon = FALSE; // moving off of Cancel
|
||||
@@ -1487,7 +1484,7 @@ static bool8 LoadNewSelection_CancelToMon(void)
|
||||
sMenu->info.helperState++;
|
||||
break;
|
||||
case 2:
|
||||
if (!TryUpdateConditionMonTransitionOn(&sMenu->graph, &sMenu->curMonXOffset))
|
||||
if (!ConditionMenu_UpdateMonEnter(&sMenu->graph, &sMenu->curMonXOffset))
|
||||
{
|
||||
// Load the new adjacent pokemon (not the one being shown)
|
||||
LoadMonInfo(sMenu->toLoadSelection, sMenu->toLoadId);
|
||||
@@ -1514,7 +1511,7 @@ static bool8 LoadNewSelection_MonToCancel(void)
|
||||
switch (sMenu->info.helperState)
|
||||
{
|
||||
case 0:
|
||||
if (!TryUpdateConditionMonTransitionOff(&sMenu->graph, &sMenu->curMonXOffset))
|
||||
if (!ConditionMenu_UpdateMonExit(&sMenu->graph, &sMenu->curMonXOffset))
|
||||
sMenu->info.helperState++;
|
||||
break;
|
||||
case 1:
|
||||
@@ -1538,7 +1535,7 @@ static bool8 LoadNewSelection_MonToMon(void)
|
||||
switch (sMenu->info.helperState)
|
||||
{
|
||||
case 0:
|
||||
TransitionConditionGraph(&sMenu->graph);
|
||||
ConditionGraph_TryUpdate(&sMenu->graph);
|
||||
if (!MoveConditionMonOffscreen(&sMenu->curMonXOffset))
|
||||
{
|
||||
UpdateMonPic(sMenu->curLoadId);
|
||||
@@ -1550,7 +1547,7 @@ static bool8 LoadNewSelection_MonToMon(void)
|
||||
sMenu->info.helperState++;
|
||||
break;
|
||||
case 2:
|
||||
if (!TryUpdateConditionMonTransitionOn(&sMenu->graph, &sMenu->curMonXOffset))
|
||||
if (!ConditionMenu_UpdateMonEnter(&sMenu->graph, &sMenu->curMonXOffset))
|
||||
{
|
||||
// Load the new adjacent pokemon (not the one being shown)
|
||||
LoadMonInfo(sMenu->toLoadSelection, sMenu->toLoadId);
|
||||
@@ -1580,9 +1577,9 @@ static void SpriteCB_MonPic(struct Sprite *sprite)
|
||||
static void SpriteCB_SelectionIconPokeball(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0] == sMenu->info.curSelection)
|
||||
StartSpriteAnim(sprite, 0);
|
||||
StartSpriteAnim(sprite, CONDITION_ICON_SELECTED);
|
||||
else
|
||||
StartSpriteAnim(sprite, 1);
|
||||
StartSpriteAnim(sprite, CONDITION_ICON_UNSELECTED);
|
||||
}
|
||||
|
||||
static void SpriteCB_SelectionIconCancel(struct Sprite *sprite)
|
||||
@@ -1599,10 +1596,7 @@ static void SpriteCB_SelectionIconCancel(struct Sprite *sprite)
|
||||
static void CalculateNumAdditionalSparkles(u8 monIndex)
|
||||
{
|
||||
u8 sheen = GetMonData(&gPlayerParty[monIndex], MON_DATA_SHEEN);
|
||||
|
||||
sMenu->numSparkles[sMenu->curLoadId] = (sheen != 255)
|
||||
? sheen / (255 / (MAX_CONDITION_SPARKLES - 1) + 1)
|
||||
: MAX_CONDITION_SPARKLES - 1;
|
||||
sMenu->numSparkles[sMenu->curLoadId] = GET_NUM_CONDITION_SPARKLES(sheen);
|
||||
}
|
||||
|
||||
static void LoadConditionGfx(void)
|
||||
|
||||
+2
-2
@@ -50,8 +50,8 @@
|
||||
.include "src/multiboot.o"
|
||||
.include "src/mirage_tower.o"
|
||||
.include "src/berry_fix_program.o"
|
||||
.include "src/pokenav_conditions_2.o"
|
||||
.include "src/pokenav_ribbons_2.o"
|
||||
.include "src/pokenav_conditions_gfx.o"
|
||||
.include "src/pokenav_ribbons_summary.o"
|
||||
.include "src/ereader_helpers.o"
|
||||
.include "src/faraway_island.o"
|
||||
.include "src/m4a_1.o"
|
||||
|
||||
+1
-1
@@ -143,7 +143,7 @@
|
||||
.include "src/pokedex_area_region_map.o"
|
||||
.include "src/battle_pyramid_bag.o"
|
||||
.include "src/pokenav.o"
|
||||
.include "src/pokenav_match_call_ui.o"
|
||||
.include "src/pokenav_list.o"
|
||||
.include "src/menu_specialized.o"
|
||||
.include "src/faraway_island.o"
|
||||
.include "src/trainer_hill.o"
|
||||
|
||||
Reference in new issue
Block a user